openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
action/LoginAction.class.php | 38++++++++++++++++++++++++++++++--------
db/DbUpdate.class.php | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
db/DbVersion.class.php | 321+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
db/db.class.php | 56++++++++++++++++++++++++++++++++++++++++++++++++++++----
db/update/DBVersion000001.class.php | 343+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
db/update/DBVersion000002.class.php | 26++++++++++++++++++++++++++
db/update/DBVersion000003.class.php | 17+++++++++++++++++
functions/db.inc.php | 8+++-----
model/User.class.php | 19+------------------
util/Sql.class.php | 2+-
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.