commit b5947c31d260c51a906c4084d72ee6bd7fa4803f
parent 208e80e6e845e14c5ec3294648592b13525564d1
Author: Jan Dankert <devnull@localhost>
Date: Sat, 29 Aug 2015 02:51:10 +0200
Neu: Datenbank-Update automatisch bei Login.
Diffstat:
10 files changed, 914 insertions(+), 36 deletions(-)
diff --git a/action/LoginAction.class.php b/action/LoginAction.class.php
@@ -29,7 +29,13 @@ class LoginAction extends Action
{
public $security = SECURITY_GUEST;
- function setDb( $dbid )
+
+ /**
+ * Eine Datenbankverbindugn wird aufgebaut und initalisiert.
+ *
+ * @param $dbid Datenbank-Id
+ */
+ private function setDb( $dbid )
{
global $conf;
@@ -38,18 +44,19 @@ class LoginAction extends Action
$db = db_connection();
if ( is_object($db) )
- {
$db->rollback();
- }
$db = new DB( $conf['database'][$dbid] );
$db->id = $dbid;
- $db->start();
+ $db->start(); // Transaktion starten.
Session::setDatabase( $db );
}
+ /**
+ * Prueft, ob der Parameter 'dbid' übergeben wurde.
+ */
function checkForDb()
{
global $conf;
@@ -150,7 +157,6 @@ class LoginAction extends Action
// Das neue Kennwort ist gesetzt, die Anmeldung ist also doch noch gelungen.
$ok = true;
$mustChangePassword = false;
- $mustChangePassword = false;
}
}
@@ -800,14 +806,30 @@ class LoginAction extends Action
/**
- * Login.
+ * Login.
+ * Zuerst wird die Datenbankverbindung aufgebaut und falls notwendig, aktualisiert.
*/
function loginPost()
{
global $conf;
- $this->checkForDb();
- Session::setUser('');
+ if ( $this->hasRequestVar('dbid'))
+ {
+ $dbid = $this->getRequestVar('dbid');
+
+ $db = new DB( $conf['database'][$dbid],true );
+ $db->id = $dbid;
+
+ // Datenbank aktualisieren, sofern notwendig.
+ require_once( OR_DBCLASSES_DIR.'DbUpdate.class.'.PHP_EXT );
+ $updater = new DbUpdate();
+ $updater->update( $db );
+ unset($db);
+ }
+
+ $this->checkForDb();
+
+ Session::setUser(''); // Altes Login entfernen.
if ( $conf['login']['nologin'] )
Http::notAuthorized('login disabled');
diff --git a/db/DbUpdate.class.php b/db/DbUpdate.class.php
@@ -0,0 +1,119 @@
+<?php
+
+define('OR_DB_SUPPORTED_VERSION',3);
+
+class DbUpdate
+{
+ function update( $db )
+ {
+ $version = $this->getDbVersion($db);
+
+ if ( $version == OR_DB_SUPPORTED_VERSION )
+ // Cool, der aktuelle DB-Stand passt zu dieser Version. Das ist auch der Normalfall. Weiter so.
+ return;
+
+ if ( $version > OR_DB_SUPPORTED_VERSION )
+ // Oh oh, in der Datenbank ist eine neue Version, also wir unterstüzten.
+ Http::serverError('Actual DB version is not supported.',"DB-Version is $version, but this is OpenRat ".OR_VERSION." which only supports version ".OR_DB_SUPPORTED_VERSION );
+
+ require(OR_DBCLASSES_DIR.'DbVersion.class.php');
+
+ for( $installVersion = $version + 1; $installVersion <= OR_DB_SUPPORTED_VERSION; $installVersion++ )
+ {
+ if ( $installVersion > 2 )
+ {
+ $sql = new Sql('INSERT INTO {t_version} (id,version,status) VALUES( {version},{version},0 )',$db->id);
+ $sql->setInt('version', $installVersion);
+ $db->query( $sql );
+ $db->commit();
+ }
+
+ $updaterClassName = 'DBVersion'.str_pad($installVersion, 6, '0', STR_PAD_LEFT);
+ require(OR_DBCLASSES_DIR.'update/'.$updaterClassName.'.class.php');
+
+ $updater = new $updaterClassName( $db );
+
+ $updater->update();
+
+ if ( $installVersion > 2 )
+ {
+ $sql = new Sql('UPDATE {t_version} SET status=1,installed={time} WHERE version={version}',$db->id);
+ $sql->setInt('version', $installVersion);
+ $sql->setInt('time' , time() );
+ $db->query( $sql );
+ $db->commit();
+ }
+ }
+
+ $this->afterUpdate( $db );
+ }
+
+
+ /**
+ * Initialisieren der frisch aktualisierten Datenbank.
+ *
+ * @param DB $db
+ */
+ private function afterUpdate( $db )
+ {
+ // Benutzer zählen.
+ $sql = new Sql('SELECT COUNT(*) From {t_user}',$db->id);
+ $countUsers = $db->getOne( $sql );
+
+ // Wenn noch kein Benutzer vorhanden, dann einen anlegen.
+ if ( $countUsers == 0 )
+ {
+ $sql = new Sql("INSERT INTO {t_user} (id,name,password,ldap_dn,fullname,tel,mail,descr,style,is_admin) VALUES(1,'admin','admin','','Administrator','','','Account for administration tasks.','default',1)",$db->id);
+ $db->query( $sql );
+ $db->commit();
+ }
+ }
+
+
+
+ private function getDbVersion( $db )
+ {
+ $sql = new Sql('SELECT 1 FROM {t_version}',$db->id);
+ $versionTableExists = $db->testQuery( $sql );
+
+ if ( $versionTableExists )
+ {
+ // Prüfen, ob die vorherigen Updates fehlerfrei sind.
+ $sql = new Sql(<<<SQL
+ SELECT COUNT(*) FROM {t_version} WHERE STATUS=0
+SQL
+ ,$db->id);
+ $countErrors = $db->getOne($sql);
+ if ( $countErrors > 0 )
+ Http::serverError('Database error','there are dirty versions (means: versions with status 0), see table VERSION for details.');
+
+ // Aktuelle Version ermitteln.
+ $sql = new Sql(<<<SQL
+ SELECT MAX(version) FROM {t_version}
+SQL
+ ,$db->id);
+ $version = $db->getOne($sql);
+
+ if ( is_numeric($version) )
+ return $version; // Aktuelle Version.s
+ else
+ // Tabelle 'version' ist noch leer.
+ // Tabelle 'version' wurde in Version 2 angelegt.
+ return 2;
+ }
+ else
+ {
+ $sql = new Sql('SELECT 1 FROM {t_project}',$db->id);
+ $projectTableExists = $db->testQuery( $sql );
+
+ if ( $projectTableExists )
+ // Entspricht dem Stand vor Einführung der automatischen Migration.
+ return 1;
+ else
+ // Es gibt gar keine Tabellen, es muss also alles neu angelegt werden.
+ return 0;
+ }
+ }
+}
+
+?>+
\ No newline at end of file
diff --git a/db/DbVersion.class.php b/db/DbVersion.class.php
@@ -0,0 +1,320 @@
+<?php
+
+abstract class DbVersion
+{
+ private $db;
+ private $tablePrefix;
+ private $tableSuffix;
+ private $dbmsType;
+
+ function DbVersion( $db )
+ {
+ $this->db = $db;
+
+ switch( $db->conf['type'] )
+ {
+ case 'mysql':
+ case 'mysqli':
+ $this->dbmsType = 'mysql';
+ break;
+ case 'postgresql':
+ $this->dbmsType = 'postgresql';
+ break;
+ case 'sqlite':
+ case 'sqlite3':
+ $this->dbmsType = 'sqlite';
+ break;
+ case 'pdo':
+ $dsnParts = explode(':',$db->conf['dsn']);
+ switch( $dsnParts[0] )
+ {
+ case 'mysql':
+ $this->dbmsType = 'mysql';
+ break;
+ case 'pgsql':
+ $this->dbmsType = 'postgresql';
+ break;
+ case 'sqlite':
+ $this->dbmsType = 'sqlite';
+ break;
+ default:
+ Http::serverError('Datebase Configuration Error','Unknown DBMS in PDO-DSN: '.$dsnParts[0]);
+ }
+ break;
+ default:
+ Http::serverError('Datebase Configuration Error','Unknown DBMS type: '.$db->conf['type'] );
+ }
+
+ $this->tablePrefix = $db->conf['prefix'];
+ $this->tableSuffix = $db->conf['suffix'];
+ }
+
+ // Muss überschrieben werden!
+ abstract function update();
+
+
+
+
+
+
+
+
+ private function getTableName( $name )
+ {
+ return $this->tablePrefix.$name.$this->tableSuffix;
+ }
+
+
+ /*
+ * Erzeugt eine neue, leere Tabelle.
+ # Creating a new table
+ # param 1: table name
+ */
+
+ function addTable( $tableName )
+ {
+ $tableName = $this->getTableName($tableName);
+
+ $ddl = new Sql('CREATE TABLE '.$tableName.'(id INTEGER)'.($this->dbmsType=='mysql'?' ENGINE=InnoDB':'').';');
+ // TYPE = InnoDB was deprecated in MySQL 5.0 and was removed in My SQL 5.1 and later versions.
+
+ $this->db->query( $ddl );
+ }
+
+
+ # Creating a new column
+ # param 1: column name
+ # param 2: type (available are: INT,VARCHAR,TEXT,BLOB)
+ # param 3: size (number value)
+ # param 4: default (number value)
+ # param 5: nullable (available are: J,N)
+ function addColumn($tableName,$columnName,$type,$size,$default,$nullable)
+ {
+ if ( $columnName == 'id') return;
+
+ $table = $this->getTableName($tableName);
+
+ $type = strtoupper($type);
+ switch( $type )
+ {
+ case 'INT':
+ switch( $this->dbmsType )
+ {
+ case 'mysql':
+ if ( $size == 1 )
+ $dbmsInternalType = 'TINYINT';
+ else
+ $dbmsInternalType = 'INT';
+ break;
+
+ case 'oracle':
+ $dbmsInternalType = 'NUMBER';
+ break;
+
+ default:
+ $dbmsInternalType = 'INTEGER';
+
+ }
+ break;
+
+ case 'VARCHAR':
+ switch( $this->dbmsType )
+ {
+ default:
+ $dbmsInternalType = 'VARCHAR';
+
+ }
+ break;
+
+ case 'TEXT':
+ switch( $this->dbmsType )
+ {
+ case 'mysql':
+ $dbmsInternalType = 'MEDIUMTEXT';
+ break;
+
+ case 'oracle':
+ $dbmsInternalType = 'CLOB';
+ break;
+
+ default:
+ $dbmsInternalType = 'TEXT';
+
+ }
+ break;
+
+ case 'BLOB':
+ switch( $this->dbmsType )
+ {
+ case 'mysql':
+ $dbmsInternalType = 'MEDIUMBLOB';
+ break;
+
+ case 'oracle':
+ $dbmsInternalType = 'CLOB';
+ break;
+
+ case 'postgresql':
+ $dbmsInternalType = 'TEXT';
+ break;
+
+ case 'sqlite':
+ $dbmsInternalType = 'TEXT';
+ break;
+
+ default:
+ $dbmsInternalType = 'BLOB';
+
+ }
+ break;
+ default:
+ Http::serverError('Datebase Configuration Error','Unknown Column type: '.$type );
+ }
+
+ if ( $this->dbmsType == 'oracle')
+ {
+ // TEXT-columns should be nullable in Oracle, because empty strings are treated as NULL
+ if ( $type=='VARCHAR' || $type=='TEXT')
+ $nullable = true;
+
+ }
+
+ $ddl = new Sql('ALTER TABLE '.$table.
+ ' ADD COLUMN '.$columnName.' '.$dbmsInternalType.($size!=null?'('.$size.')':'').
+ ($default!=null?' DEFAULT '.(is_string($default)?"'":'').$default.(is_string($default)?"'":''):'').
+ ' '.($nullable?'NULL':'NOT NULL').';'
+ );
+ $this->db->query( $ddl );
+
+ }
+
+
+
+ function addPrimaryKey( $tableName,$columnNames)
+ {
+ $table = $this->getTableName($tableName);
+
+ if ( !is_array($columnNames) )
+ $columnNames = explode(',',$columnNames);
+
+ $ddl = new Sql('ALTER TABLE '.$table.' ADD PRIMARY KEY ('.implode(',',$columnNames).');');
+ $this->db->query( $ddl );
+
+ }
+
+
+
+ # Creating a unique key
+ # param 1: name of index column. Seperate multiple columns with ','
+ function addIndex($tableName,$columnNames,$unique=false)
+ {
+ $table = $this->getTableName($tableName);
+
+ if ( !is_array($columnNames) )
+ $columnNames = explode(',',$columnNames);
+
+ $indexName = $this->tablePrefix.'uidx_'.$tableName.'_'.implode('_',$columnNames).$this->tableSuffix;
+
+// if [ "$type" == "oracle" ]; then
+// cnt=$(($cnt+1))
+// echo "CREATE UNIQUE INDEX ${prefix}uidx_${cnt}" >> $outfile
+// else
+
+ $ddl = new Sql('CREATE '.($unique?'UNIQUE ':'').'INDEX '.$indexName.' ON '.$table.' ('.implode(',',$columnNames).');');
+ $this->db->query( $ddl );
+ }
+
+
+ # Creating a unique key
+ # param 1: name of index column. Seperate multiple columns with ','
+ function addUniqueIndex($tableName,$columnNames)
+ {
+ $this->addIndex( $tableName,$columnNames,true );
+ }
+
+
+ # Creating a foreign key
+ # param 1: column name
+ # param 2: target table name
+ # param 3: target column name
+ function addConstraint($tableName,$columnName,$targetTableName,$targetColumnName)
+ {
+ $table = $this->getTableName($tableName);
+ $targetTable = $this->getTableName($targetTableName);
+
+ $constraintName = $this->tablePrefix.'fk_'.$tableName.$this->tableSuffix.'_'.$columnName;
+
+ //
+// if [ "$type" == "oracle" ]; then
+// cnt=$(($cnt+1))
+// echo " ,CONSTRAINT ${prefix}fk_${cnt}" >> $outfile
+// else
+// echo " ,CONSTRAINT ${prefix}fk_${table}${suffix}_$1" >> $outfile
+// fi
+ // Oracle doesn't support "ON DELETE RESTRICT"-Statements, but its the default.
+
+ $ddl = new Sql('ALTER TABLE '.$table.' ADD CONSTRAINT '.$constraintName.' FOREIGN KEY ('.$columnName.') REFERENCES '.$targetTable.' ('.$targetColumnName.') ON DELETE RESTRICT ON UPDATE RESTRICT;');
+ $this->db->query( $ddl );
+
+ }
+
+
+
+ function dropTable( $tableName)
+ {
+ $table = $this->getTableName($tableName);
+
+ $ddl = new Sql('DROP TABLE '.$table.';' );
+ $this->db->query( $ddl );
+
+ }
+
+ function dropColumn( $tableName,$columnName )
+ {
+ $table = $this->getTableName($tableName);
+
+ $ddl = new Sql('ALTER TABLE '.$table.' DROP COLUMN '.$columnName.';');
+ $this->db->query( $ddl );
+
+ }
+
+ function dropIndex( $indexName,$unique=false)
+ {
+ $ddl = new Sql('DROP'.($unique?' UNIQUE':'').' INDEX '.$indexName.';' );
+ $this->db->query( $ddl );
+
+ }
+
+ function dropUniqueIndex( $indexName)
+ {
+ $this->dropIndex( $indexName,true );
+ }
+
+ function dropPrimaryKey( $tableName,$columnNames )
+ {
+ $table = $this->getTableName($tableName);
+
+ if ( !is_array($columnNames) )
+ $columnNames = explode(',',$columnNames);
+
+ $ddl = new Sql('ALTER TABLE '.$table.' DROP PRIMARY KEY('.implode(',',$columnNames).')');
+ $this->db->query( $ddl );
+ }
+
+
+ function dropConstraint( $constraintName)
+ {
+ $ddl = new Sql('DROP CONSTRAINT '.$constraintName.';' );
+ $this->db->query( $ddl );
+
+ }
+
+
+ function getDb()
+ {
+ return $this->db;
+ }
+
+}
+
+?>+
\ No newline at end of file
diff --git a/db/db.class.php b/db/db.class.php
@@ -84,11 +84,36 @@ class DB
* @param Array Konfiguration der Verbindung
* @return Status 'true' wenn Verbindung erfolgreich aufgebaut.
*/
- public function DB( $conf )
- {
- $this->available = false;
- $this->conf = $conf;
+ public function DB( $conf,$admin=false )
+ {
+ $defaultConf = array( 'prefix' => '',
+ 'suffix' => '',
+ 'enabled' => true,
+ 'comment' => '',
+ 'type' => 'mysqli',
+ 'user' => '',
+ 'password' => '',
+ 'host' => '',
+ 'database' => '',
+ 'base64' => false,
+ 'persistent' => true,
+ 'charset' => 'UTF-8',
+ 'connection_sql' => '',
+ 'cmd' => '',
+ 'prepare' => true,
+ 'transaction' => true,
+ 'update' => array()
+ );
+ $this->available = false;
+ $this->conf = $conf + $defaultConf;
+
+ if ( $admin )
+ {
+ // Bevorzugung der Unter-Konfiguration 'update'
+ if ( isset($this->conf['update']) )
+ $this->conf = $this->conf['update'] + $this->conf; // linksstehender Operator hat Priorität!
+ }
$this->connect();
return $this->available;
@@ -134,6 +159,11 @@ class DB
// Client instanziieren
$this->client = & new $classname;
+
+ // Schauen, ob der Treiber Prepared Statements beherscht.
+ if ( ! method_exists($this->client,'clear')) {
+ $this->conf['prepare'] = false;
+ }
$ok = $this->client->connect( $this->conf );
@@ -425,6 +455,24 @@ class DB
}
}
+
+ /**
+ * Führt eine Query aus und gibt nur zurück, ob diese funktioniert.
+ *
+ * @param unknown_type $query
+ * @return boolean
+ */
+ public function testQuery( $query )
+ {
+ if ( !is_object($query) )
+ die('SQL-Query must be an object');
+
+ $result = $this->client->query($query->raw);
+
+ return $result !== FALSE;
+ }
+
+
/**
* Setzt eine Transaktion zurueck.
* Falls der Schalter 'transaction' nicht gesetzt ist, passiert nichts.
diff --git a/db/update/DBVersion000001.class.php b/db/update/DBVersion000001.class.php
@@ -0,0 +1,342 @@
+<?php
+
+
+/**
+ * Baseline database structure.
+ *
+ * @author dankert
+ *
+ */
+class DBVersion000001 extends DbVersion
+{
+ public function update()
+ {
+ $not_nullable = false;
+ $nullable = true;
+
+ $this->addTable('project');
+
+ $this->addColumn('project','id' ,'INT' ,null,null,$not_nullable);
+ $this->addColumn('project','name' ,'VARCHAR', 128,null,$not_nullable);
+ $this->addColumn('project','target_dir' ,'VARCHAR', 255,null,$not_nullable);
+ $this->addColumn('project','ftp_url' ,'VARCHAR', 255,null,$not_nullable);
+ $this->addColumn('project','ftp_passive' ,'INT' ,null,null,$not_nullable);
+ $this->addColumn('project','cmd_after_publish' ,'VARCHAR', 255,null,$not_nullable);
+ $this->addColumn('project','content_negotiation','INT' , 1, 0,$not_nullable);
+ $this->addColumn('project','cut_index' ,'INT' , 1, 0,$not_nullable);
+
+ $this->addPrimaryKey('project','id');
+ $this->addIndex('project','name');
+
+ /*
+ *
+ $this->addColumn('id','INT',null,null,$not_nullable);
+ $this->addColumn('name','VARCHAR',128,null,$not_nullable);
+ $this->addColumn('target_dir','VARCHAR',255,null,$not_nullable);
+ $this->addColumn('ftp_url','VARCHAR',255,null,$not_nullable);
+ $this->addColumn('ftp_passive','INT',1,0,$not_nullable);
+ $this->addColumn('cmd_after_publish','VARCHAR',255,null,$not_nullable);
+ $this->addColumn('content_negotiation','INT',1,0,$not_nullable);
+ $this->addColumn('cut_$this->addIndex('','INT');',1,0,$not_nullable);
+ $this->addPrimaryKey('','id');
+ close_table
+ unique_$this->addIndex('','name');
+ */
+
+
+
+
+ $this->addTable('user');
+ $this->addColumn('user','id','INT',null,null,$not_nullable);
+ $this->addColumn('user','name','VARCHAR',128,null,$not_nullable);
+ $this->addColumn('user','password','VARCHAR',50,null,$not_nullable);
+ $this->addColumn('user','ldap_dn','VARCHAR',255,null,$not_nullable);
+ $this->addColumn('user','fullname','VARCHAR',128,null,$not_nullable);
+ $this->addColumn('user','tel','VARCHAR',128,null,$not_nullable);
+ $this->addColumn('user','mail','VARCHAR',255,null,$not_nullable);
+ $this->addColumn('user','descr','VARCHAR',255,null,$not_nullable);
+ $this->addColumn('user','style','VARCHAR',64,null,$not_nullable);
+ $this->addColumn('user','is_admin','INT',1,0,$not_nullable);
+ $this->addPrimaryKey('user','id');
+ $this->addUniqueIndex('user','name');
+
+ $this->addTable('group');
+ $this->addColumn('group','id','INT',null,null,$not_nullable);
+ $this->addColumn('group','name','VARCHAR',100,null,$not_nullable);
+ $this->addPrimaryKey('group','id');
+ $this->addUniqueIndex('group','name');
+
+ $this->addTable('object');
+ $this->addColumn('object','id','INT',null,null,$not_nullable);
+ $this->addColumn('object','parentid','INT',null,null,$nullable);
+ $this->addColumn('object','projectid','INT',0,0,$not_nullable);
+ $this->addColumn('object','filename','VARCHAR',255,null,$not_nullable);
+ $this->addColumn('object','orderid','INT',0,null,$not_nullable);
+ $this->addColumn('object','create_date','INT',0,null,$not_nullable);
+ $this->addColumn('object','create_userid','INT',0,null,$nullable);
+ $this->addColumn('object','lastchange_date','INT',0,null,$not_nullable);
+ $this->addColumn('object','lastchange_userid','INT',0,null,$nullable);
+ $this->addColumn('object','is_folder','INT',1,null,$not_nullable);
+ $this->addColumn('object','is_file','INT',1,null,$not_nullable);
+ $this->addColumn('object','is_page','INT',1,null,$not_nullable);
+ $this->addColumn('object','is_link','INT',1,null,$not_nullable);
+ $this->addPrimaryKey('object','id');
+ $this->addConstraint('object','projectid','project','id');
+ $this->addConstraint('object','lastchange_userid','user','id');
+ $this->addConstraint('object','create_userid','user','id');
+
+ $this->addIndex('object','parentid');
+ $this->addIndex('object','projectid');
+ $this->addIndex('object','is_folder');
+ $this->addIndex('object','is_file');
+ $this->addIndex('object','is_page');
+ $this->addIndex('object','is_link');
+ $this->addIndex('object','orderid');
+ $this->addIndex('object','create_userid');
+ $this->addIndex('object','lastchange_userid');
+ $this->addUniqueIndex('object','parentid,filename');
+
+
+
+
+ $this->addTable('template');
+ $this->addColumn('template','id','INT',null,null,$not_nullable);
+ $this->addColumn('template','projectid','INT',null,null,$not_nullable);
+ $this->addColumn('template','name','VARCHAR',50,null,$not_nullable);
+ $this->addPrimaryKey('template','id');
+ $this->addConstraint('template','projectid','project','id');
+
+ $this->addIndex('template','projectid');
+ $this->addIndex('template','name');
+ $this->addUniqueIndex('template','projectid,name');
+
+
+
+ $this->addTable('language');
+ $this->addColumn('language','id','INT',null,null,$not_nullable);
+ $this->addColumn('language','projectid','INT',0,null,$not_nullable);
+ $this->addColumn('language','isocode','VARCHAR',10,null,$not_nullable);
+ $this->addColumn('language','name','VARCHAR',50,null,$not_nullable);
+ $this->addColumn('language','is_default','INT',1,0,$not_nullable);
+ $this->addPrimaryKey('language','id');
+ $this->addConstraint('language','projectid','project','id');
+ $this->addUniqueIndex('language','projectid,isocode');
+
+
+
+
+ $this->addTable('page');
+ $this->addColumn('page','id','INT',null,null,$not_nullable);
+ $this->addColumn('page','objectid','INT',0,null,$not_nullable);
+ $this->addColumn('page','templateid','INT',0,null,$not_nullable);
+ $this->addPrimaryKey('page','id');
+ $this->addConstraint('page','templateid','template','id');
+ $this->addConstraint('page','objectid','object','id');
+
+ $this->addUniqueIndex('page','objectid');
+ $this->addIndex('page','templateid');
+
+
+
+
+ $this->addTable('projectmodel');
+ $this->addColumn('projectmodel','id','INT',null,null,$not_nullable);
+ $this->addColumn('projectmodel','projectid','INT',0,null,$not_nullable);
+ $this->addColumn('projectmodel','name','VARCHAR',50,null,$not_nullable);
+ $this->addColumn('projectmodel','extension','VARCHAR',10,null,$nullable);
+ $this->addColumn('projectmodel','is_default','INT',1,0,$not_nullable);
+ $this->addPrimaryKey('projectmodel','id');
+ $this->addConstraint('projectmodel','projectid','project','id');
+
+ $this->addIndex('projectmodel','projectid');
+ $this->addUniqueIndex('projectmodel','projectid,name');
+
+
+ $this->addTable('element');
+ $this->addColumn('element','id','INT',null,null,$not_nullable);
+ $this->addColumn('element','templateid','INT',0,0,$not_nullable);
+ $this->addColumn('element','name','VARCHAR',50,null,$not_nullable);
+ $this->addColumn('element','descr','VARCHAR',255,null,$not_nullable);
+ $this->addColumn('element','type','VARCHAR',20,null,$not_nullable);
+ $this->addColumn('element','subtype','VARCHAR',20,null,$nullable);
+ $this->addColumn('element','with_icon','INT',1,0,$not_nullable);
+ $this->addColumn('element','dateformat','VARCHAR',100,null,$nullable);
+ $this->addColumn('element','wiki','INT',1,0,$nullable);
+ $this->addColumn('element','html','INT',1,0,$nullable);
+ $this->addColumn('element','all_languages','INT',1,0,$not_nullable);
+ $this->addColumn('element','writable','INT',1,0,$not_nullable);
+ $this->addColumn('element','decimals','INT',0,null,$nullable);
+ $this->addColumn('element','dec_point','VARCHAR',5,null,$nullable);
+ $this->addColumn('element','thousand_sep','VARCHAR',1,null,$nullable);
+ $this->addColumn('element','code','TEXT',null,null,$nullable);
+ $this->addColumn('element','default_text','TEXT',null,null,$nullable);
+ $this->addColumn('element','folderobjectid','INT',null,null,$nullable);
+ $this->addColumn('element','default_objectid','INT',null,null,$nullable);
+ $this->addPrimaryKey('element','id');
+ $this->addConstraint('element','default_objectid','object','id');
+ $this->addConstraint('element','folderobjectid','object','id');
+ $this->addConstraint('element','templateid','template','id');
+
+ $this->addIndex('element','templateid');
+ $this->addIndex('element','name');
+ $this->addUniqueIndex('element','templateid,name');
+
+
+
+
+ $this->addTable('file');
+ $this->addColumn('file','id','INT',null,null,$not_nullable);
+ $this->addColumn('file','objectid','INT',0,null,$not_nullable);
+ $this->addColumn('file','extension','VARCHAR',10,null,$not_nullable);
+ $this->addColumn('file','size','INT',0,null,$not_nullable);
+ $this->addColumn('file','value','BLOB',null,null,$not_nullable);
+ $this->addPrimaryKey('file','id');
+ $this->addConstraint('file','objectid','object','id');
+
+ $this->addUniqueIndex('file','objectid');
+
+
+
+ $this->addTable('folder');
+ $this->addColumn('folder','id','INT',null,null,$not_nullable);
+ $this->addColumn('folder','objectid','INT',0,null,$not_nullable);
+ $this->addPrimaryKey('folder','id');
+ $this->addConstraint('folder','objectid','object','id');
+
+ $this->addUniqueIndex('folder','objectid');
+
+
+
+
+
+ $this->addTable('link');
+ $this->addColumn('link','id','INT',null,null,$not_nullable);
+ $this->addColumn('link','objectid','INT',0,null,$not_nullable);
+ $this->addColumn('link','link_objectid','INT',null,null,$nullable);
+ $this->addColumn('link','url','VARCHAR',255,null,$nullable);
+ $this->addPrimaryKey('link','id');
+ $this->addConstraint('link','objectid','object','id');
+ $this->addConstraint('link','link_objectid','object','id');
+
+ $this->addUniqueIndex('link','objectid');
+ $this->addIndex('link','link_objectid');
+
+
+
+
+
+ $this->addTable('name');
+ $this->addColumn('name','id','INT',null,null,$not_nullable);
+ $this->addColumn('name','objectid','INT',0,null,$not_nullable);
+ $this->addColumn('name','name','VARCHAR',255,null,$not_nullable);
+ $this->addColumn('name','descr','VARCHAR',255,null,$not_nullable);
+ $this->addColumn('name','languageid','INT',0,null,$not_nullable);
+ $this->addPrimaryKey('name','id');
+ $this->addConstraint('name','objectid','object','id');
+ $this->addConstraint('name','languageid','language','id');
+
+ $this->addIndex('name','objectid');
+ $this->addIndex('name','languageid');
+ $this->addUniqueIndex('name','objectid,languageid');
+
+
+
+
+
+ $this->addTable('templatemodel');
+ $this->addColumn('templatemodel','id','INT',null,null,$not_nullable);
+ $this->addColumn('templatemodel','templateid','INT',0,null,$not_nullable);
+ $this->addColumn('templatemodel','projectmodelid','INT',0,null,$not_nullable);
+ $this->addColumn('templatemodel','extension','VARCHAR',10,null,$nullable);
+ $this->addColumn('templatemodel','text','TEXT',null,null,$not_nullable);
+ $this->addPrimaryKey('templatemodel','id');
+ $this->addConstraint('templatemodel','templateid','template','id');
+ $this->addConstraint('templatemodel','projectmodelid','projectmodel','id');
+
+ $this->addIndex('templatemodel','templateid');
+ $this->addUniqueIndex('templatemodel','templateid,extension');
+ $this->addUniqueIndex('templatemodel','templateid,projectmodelid');
+
+
+
+
+
+ $this->addTable('usergroup');
+ $this->addColumn('usergroup','id','INT',null,null,$not_nullable);
+ $this->addColumn('usergroup','userid','INT',null,null,$not_nullable);
+ $this->addColumn('usergroup','groupid','INT',null,null,$not_nullable);
+ $this->addPrimaryKey('usergroup','id');
+ $this->addConstraint('usergroup','groupid','group','id');
+ $this->addConstraint('usergroup','userid','user','id');
+
+ $this->addIndex('usergroup','groupid');
+ $this->addIndex('usergroup','userid');
+ $this->addUniqueIndex('usergroup','userid,groupid');
+
+
+
+
+ $this->addTable('value');
+ $this->addColumn('value','id','INT',null,null,$not_nullable);
+ $this->addColumn('value','pageid','INT',0,null,$not_nullable);
+ $this->addColumn('value','languageid','INT',null,null,$not_nullable);
+ $this->addColumn('value','elementid','INT',0,null,$not_nullable);
+ $this->addColumn('value','linkobjectid','INT',null,null,$nullable);
+ $this->addColumn('value','text','TEXT',null,null,$nullable);
+ $this->addColumn('value','number','INT',null,null,$nullable);
+ $this->addColumn('value','date','INT',null,null,$nullable);
+ $this->addColumn('value','active','INT',0,null,$not_nullable);
+ $this->addColumn('value','publish','INT',null,null,$not_nullable);
+ $this->addColumn('value','lastchange_date','INT',0,null,$not_nullable);
+ $this->addColumn('value','lastchange_userid','INT',null,null,$nullable);
+ $this->addPrimaryKey('value','id');
+ $this->addConstraint('value','pageid','page','id');
+ $this->addConstraint('value','elementid','element','id');
+ $this->addConstraint('value','languageid','language','id');
+ $this->addConstraint('value','lastchange_userid','user','id');
+ $this->addConstraint('value','linkobjectid','object','id');
+
+ $this->addIndex('value','pageid');
+ $this->addIndex('value','languageid');
+ $this->addIndex('value','elementid');
+ $this->addIndex('value','active');
+ $this->addIndex('value','lastchange_date');
+ $this->addIndex('value','publish');
+
+
+
+
+
+ $this->addTable('acl');
+ $this->addColumn('acl','id','INT',null,null,$not_nullable);
+ $this->addColumn('acl','userid','INT',null,null,$nullable);
+ $this->addColumn('acl','groupid','INT',null,null,$nullable);
+ $this->addColumn('acl','objectid','INT',null,null,$not_nullable);
+ $this->addColumn('acl','languageid','INT',0,null,$nullable);
+ $this->addColumn('acl','is_write','INT',1,0,$not_nullable);
+ $this->addColumn('acl','is_prop','INT',1,0,$not_nullable);
+ $this->addColumn('acl','is_create_folder','INT',1,0,$not_nullable);
+ $this->addColumn('acl','is_create_file','INT',1,0,$not_nullable);
+ $this->addColumn('acl','is_create_link','INT',1,0,$not_nullable);
+ $this->addColumn('acl','is_create_page','INT',1,0,$not_nullable);
+ $this->addColumn('acl','is_delete','INT',1,0,$not_nullable);
+ $this->addColumn('acl','is_release','INT',1,0,$not_nullable);
+ $this->addColumn('acl','is_publish','INT',1,0,$not_nullable);
+ $this->addColumn('acl','is_grant','INT',1,0,$not_nullable);
+ $this->addColumn('acl','is_transmit','INT',1,0,$not_nullable);
+ $this->addPrimaryKey('acl','id');
+ $this->addConstraint('acl','groupid','group','id');
+ $this->addConstraint('acl','userid','user','id');
+ $this->addConstraint('acl','objectid','object','id');
+ $this->addConstraint('acl','languageid','language','id');
+
+ $this->addIndex('acl','userid');
+ $this->addIndex('acl','groupid');
+ $this->addIndex('acl','languageid');
+ $this->addIndex('acl','objectid');
+ $this->addIndex('acl','is_transmit');
+
+ }
+}
+
+?>+
\ No newline at end of file
diff --git a/db/update/DBVersion000002.class.php b/db/update/DBVersion000002.class.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * new table: version.
+ *
+ * @author dankert
+ *
+ */
+class DBVersion000002 extends DbVersion
+{
+ public function update()
+ {
+ $this->addTable('version');
+
+ $this->addColumn('version','version' ,'INT',null,null,false);
+ $this->addColumn('version','status' ,'INT',null,null,false);
+ $this->addColumn('version','installed','INT',null,null,false);
+
+ $this->addPrimaryKey ('version','id' );
+ $this->addIndex ('version','status' );
+ $this->addUniqueIndex('version','version' );
+ }
+}
+
+?>+
\ No newline at end of file
diff --git a/db/update/DBVersion000003.class.php b/db/update/DBVersion000003.class.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * Dummy version.
+ * @author dankert
+ *
+ */
+class DBVersion000003 extends DbVersion
+{
+ public function update()
+ {
+ // Dummy version.
+ }
+}
+
+?>+
\ No newline at end of file
diff --git a/functions/db.inc.php b/functions/db.inc.php
@@ -39,10 +39,7 @@ function table_names( $dbid )
if ( is_object( $db ) )
{
$conf_db_prefix = $db->conf['prefix'];
- if ( isset($db->conf['suffix']))
- $conf_db_suffix = $db->conf['suffix'];
- else
- $conf_db_suffix = '';
+ $conf_db_suffix = $db->conf['suffix'];
}
else
{
@@ -73,7 +70,8 @@ function table_names( $dbid )
'acl',
'object',
'name',
- 'link'
+ 'link',
+ 'version'
) as $tname )
$t['t_'.$tname] = $conf_db_prefix.$tname.$conf_db_suffix;
diff --git a/model/User.class.php b/model/User.class.php
@@ -537,24 +537,7 @@ SQL
}
- /**
- * Ueberpruefen des Kennwortes.
- *
- * Es wird festgestellt, ob das Kennwort dem des Benutzers entspricht.
- * Es wird dabei nur gegen die interne Datenbank geprüft. Weitere
- * Loginmodule werden nicht aufgerufen!
- */
- function checkPassword( $password )
- {
- global $conf;
-
- $auth = new InternalAuth();
- $ok = $auth->login($this->name, $password);
-
- return $ok;
- }
-
-
+
/**
* Setzt ein neues Kennwort f�r diesen Benutzer.
*
diff --git a/util/Sql.class.php b/util/Sql.class.php
@@ -181,7 +181,7 @@ class Sql
* @param dieIfUnknown wenn <code>true</code> und Parameter unbekannt, dann Abbruch.
* @access private
*/
- function setParam( $name,$value,$dieIfUnknown=true)
+ private function setParam( $name,$value,$dieIfUnknown=true)
{
// Nett gemeint, f�hrt aber aktuell zu Fehlern, weil an vielen Stellen zu viele Parameter gef�llt werden.