From 14d48464f095e6721fa80c1c7e9f19d7239fe3f3 Mon Sep 17 00:00:00 2001 From: ray176 Date: Mon, 12 Aug 2013 01:00:10 +0200 Subject: [PATCH] Fixes versionable database objects --- .../data/VersionableDatabaseObject.class.php | 4 +-- .../builder/VersionCacheBuilder.class.php | 8 ++--- .../editor/MySQLDatabaseEditor.class.php | 8 +++-- .../PackageInstallationDispatcher.class.php | 34 +++++++++++++------ 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/wcfsetup/install/files/lib/data/VersionableDatabaseObject.class.php b/wcfsetup/install/files/lib/data/VersionableDatabaseObject.class.php index b4f2bb5329..41905c8042 100644 --- a/wcfsetup/install/files/lib/data/VersionableDatabaseObject.class.php +++ b/wcfsetup/install/files/lib/data/VersionableDatabaseObject.class.php @@ -25,7 +25,7 @@ abstract class VersionableDatabaseObject extends DatabaseObject { * * @return string */ - protected static function getDatabaseVersionTableName() { + public static function getDatabaseVersionTableName() { return static::getDatabaseTableName().'_version'; } @@ -34,7 +34,7 @@ abstract class VersionableDatabaseObject extends DatabaseObject { * * @return string */ - protected static function getDatabaseVersionTableIndexName() { + public static function getDatabaseVersionTableIndexName() { return 'version'.ucfirst(static::getDatabaseIndexTableName()); } diff --git a/wcfsetup/install/files/lib/system/cache/builder/VersionCacheBuilder.class.php b/wcfsetup/install/files/lib/system/cache/builder/VersionCacheBuilder.class.php index 7147e767f2..fcebb9dc3d 100644 --- a/wcfsetup/install/files/lib/system/cache/builder/VersionCacheBuilder.class.php +++ b/wcfsetup/install/files/lib/system/cache/builder/VersionCacheBuilder.class.php @@ -27,17 +27,15 @@ class VersionCacheBuilder extends AbstractCacheBuilder { ); foreach ($objectTypes as $objectTypeID => $objectType) { - $processorObject = $objectType->getProcessor(); - $sql = "SELECT * - FROM ".$processorObject::getDatabaseVersionTableName(); + FROM ". call_user_func(array($objectType->className, 'getDatabaseVersionTableName')); $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array()); while ($row = $statement->fetchArray()) { $object = new $objectType->className(null, $row); - $data['versions'][$objectTypeID][$object->{$processorObject::getDatabaseIndexName()}] = $object; - $data['versionIDs'][$objectTypeID][$object->{$processorObject::getDatabaseIndexName()}][] = $object->{$processorObject::getDatabaseVersionTableIndexName()}; + $data['versions'][$objectTypeID][$object->{call_user_func(array($objectType->className, 'getDatabaseIndexName'))}] = $object; + $data['versionIDs'][$objectTypeID][$object->{call_user_func(array($objectType->className, 'getDatabaseIndexName'))}][] = $object->{call_user_func(array($objectType->className, 'getDatabaseVersionTableIndexName'))}; } } diff --git a/wcfsetup/install/files/lib/system/database/editor/MySQLDatabaseEditor.class.php b/wcfsetup/install/files/lib/system/database/editor/MySQLDatabaseEditor.class.php index e52a2c4860..7b5306ed93 100644 --- a/wcfsetup/install/files/lib/system/database/editor/MySQLDatabaseEditor.class.php +++ b/wcfsetup/install/files/lib/system/database/editor/MySQLDatabaseEditor.class.php @@ -33,16 +33,20 @@ class MySQLDatabaseEditor extends DatabaseEditor { */ public function getColumns($tableName) { $columns = array(); + $regex = new Regex('([a-z]+)\(([0-9]+)\)', Regex::CASE_INSENSITIVE); + $sql = "SHOW COLUMNS FROM ".$tableName; $statement = $this->dbObj->prepareStatement($sql); $statement->execute(); while ($row = $statement->fetchArray()) { - $typeMatches = Regex::compile('([a-z]+)\(([0-9]+)\)', Regex::CASE_INSENSITIVE)->match($row['Type']); + $regex->match($row['Type']); + $typeMatches = $regex->getMatches(); + if(empty($typeMatches)) continue; $columns[] = array('name' => $row['Field'], 'data' => array( 'type' => $typeMatches[1], 'length' => $typeMatches[2], - 'notNull' => (($row['Null'] == 'YES') ? true : false), + 'notNull' => (($row['Null'] == 'YES') ? false : true), 'key' => (($row['Key'] == 'PRI') ? 'PRIMARY' : (($row['Key'] == 'UNI') ? 'UNIQUE' : '')), 'default' => $row['Default'], 'autoIncrement' => ($row['Extra'] == 'auto_increment' ? true : false) diff --git a/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php b/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php index d4726a2b88..7e8587cba8 100644 --- a/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php +++ b/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php @@ -11,6 +11,7 @@ use wcf\data\package\installation\queue\PackageInstallationQueueEditor; use wcf\data\package\Package; use wcf\data\package\PackageEditor; use wcf\system\application\ApplicationHandler; +use wcf\data\object\type\ObjectTypeCache; use wcf\system\cache\builder\TemplateListenerCacheBuilder; use wcf\system\cache\builder\TemplateListenerCodeCacheBuilder; use wcf\system\cache\CacheHandler; @@ -32,7 +33,6 @@ use wcf\system\request\RouteHandler; use wcf\system\setup\Installer; use wcf\system\style\StyleHandler; use wcf\system\user\storage\UserStorageHandler; -use wcf\system\version\VersionHandler; use wcf\system\WCF; use wcf\util\FileUtil; use wcf\util\HeaderUtil; @@ -1024,7 +1024,7 @@ class PackageInstallationDispatcher { * Restructure version tables. */ protected function restructureVersionTables() { - $objectTypes = VersionHandler::getInstance()->getObjectTypes(); + $objectTypes = ObjectTypeCache::getInstance()->getObjectTypes('com.woltlab.wcf.versionableObject'); if (empty($objectTypes)) { return; @@ -1032,28 +1032,40 @@ class PackageInstallationDispatcher { // base structure of version tables $versionTableBaseColumns = array(); - $versionTableBaseColumns[] = array('name' => 'versionID', 'data' => array('type' => 'INT', 'key' => 'PRIMARY', 'autoIncrement' => 'AUTO_INCREMENT')); - $versionTableBaseColumns[] = array('name' => 'versionUserID', 'data' => array('type' => 'INT')); + $versionTableBaseColumns[] = array('name' => 'versionID', 'data' => array('type' => 'INT', 'length' => 10, 'key' => 'PRIMARY', 'autoIncrement' => 'AUTO_INCREMENT')); + $versionTableBaseColumns[] = array('name' => 'versionUserID', 'data' => array('type' => 'INT', 'length' => 10)); $versionTableBaseColumns[] = array('name' => 'versionUsername', 'data' => array('type' => 'VARCHAR', 'length' => 255)); - $versionTableBaseColumns[] = array('name' => 'versionTime', 'data' => array('type' => 'INT')); + $versionTableBaseColumns[] = array('name' => 'versionTime', 'data' => array('type' => 'INT', 'length' => 10)); foreach ($objectTypes as $objectType) { // get structure of base table - $baseTableColumns = WCF::getDB()->getEditor()->getColumns($objectType::getDatabaseTableName()); + $baseTableColumns = WCF::getDB()->getEditor()->getColumns(call_user_func(array($objectType->className, 'getDatabaseTableName'))); + + // remove primary key from base table columns + foreach($baseTableColumns as $key => $column) { + if($column['data']['key'] == 'PRIMARY') { + $baseTableColumns[$key]['data']['key'] = ''; + } + $baseTableColumns[$key]['data']['autoIncrement'] = false; + } + // get structure of version table - $versionTableColumns = WCF::getDB()->getEditor()->getColumns($objectType::getDatabaseVersionTableName()); + $versionTableColumns = array(); + try { + $versionTableColumns = WCF::getDB()->getEditor()->getColumns(call_user_func(array($objectType->className, 'getDatabaseVersionTableName'))); + } + catch (\Exception $e) { } if (empty($versionTableColumns)) { $columns = array_merge($versionTableBaseColumns, $baseTableColumns); - - WCF::getDB()->getEditor()->createTable($objectType::getDatabaseVersionTableName(), $columns); + WCF::getDB()->getEditor()->createTable(call_user_func(array($objectType->className, 'getDatabaseVersionTableName')), $columns); } else { // check garbage columns in versioned table foreach ($versionTableColumns as $columnData) { if (!array_search($columnData['name'], $baseTableColumns, true)) { // delete column - WCF::getDB()->getEditor()->dropColumn($objectType::getDatabaseVersionTableName(), $columnData['name']); + WCF::getDB()->getEditor()->dropColumn(call_user_func(array($objectType->className, 'getDatabaseVersionTableName')), $columnData['name']); } } @@ -1061,7 +1073,7 @@ class PackageInstallationDispatcher { foreach ($baseTableColumns as $columnData) { if (!array_search($columnData['name'], $versionTableColumns, true)) { // add colum - WCF::getDB()->getEditor()->addColumn($objectType::getDatabaseVersionTableName(), $columnData['name'], $columnData['data']); + WCF::getDB()->getEditor()->addColumn(call_user_func(array($objectType->className, 'getDatabaseVersionTableName')), $columnData['name'], $columnData['data']); } } } -- 2.20.1