X-Git-Url: https://git.stricted.de/?a=blobdiff_plain;f=wcfsetup%2Finstall%2Ffiles%2Flib%2Fsystem%2Fpackage%2FPackageInstallationDispatcher.class.php;h=aab03e29ba889f1e09bf8526a351dc3183c7c46a;hb=b401cd0d4ae6946e4fd14daacd65ec559e010081;hp=b221662b13dfd7d34c6e83156e4b7f1cbe52aaa8;hpb=66046110d3c65ffeee81e3c3287f3e797d7689c8;p=GitHub%2FWoltLab%2FWCF.git diff --git a/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php b/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php index b221662b13..aab03e29ba 100644 --- a/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php +++ b/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php @@ -1,6 +1,8 @@ * @package com.woltlab.wcf * @subpackage system.package @@ -76,6 +85,12 @@ class PackageInstallationDispatcher { */ const CONFIG_FILE = 'config.inc.php'; + /** + * holds state of structuring version tables + * @var boolean + */ + protected $requireRestructureVersionTables = false; + /** * Creates a new instance of PackageInstallationDispatcher. * @@ -143,7 +158,7 @@ class PackageInstallationDispatcher { // remove all cache files after WCFSetup if (!PACKAGE_ID) { - CacheHandler::getInstance()->clear(WCF_DIR.'cache/', 'cache.*.php'); + CacheHandler::getInstance()->flushAll(); } // rebuild application paths @@ -152,7 +167,8 @@ class PackageInstallationDispatcher { } // remove template listener cache - CacheHandler::getInstance()->clear(WCF_DIR.'cache/templateListener/', '*.php'); + TemplateListenerCacheBuilder::getInstance()->reset(); + TemplateListenerCodeCacheBuilder::getInstance()->reset(); // reset language cache LanguageFactory::getInstance()->clearCache(); @@ -160,7 +176,11 @@ class PackageInstallationDispatcher { // reset stylesheets StyleHandler::resetStylesheets(); - } + } + + if ($this->requireRestructureVersionTables) { + $this->restructureVersionTables(); + } return $step; } @@ -279,9 +299,6 @@ class PackageInstallationDispatcher { } } - // build requirement map - Package::rebuildPackageRequirementMap($package->packageID); - // reload queue $this->queue = new PackageInstallationQueue($this->queue->queueID); $this->package = null; @@ -304,7 +321,7 @@ class PackageInstallationDispatcher { if ($this->getPackage()->isApplication && $this->getPackage()->package != 'com.woltlab.wcf' && $this->getAction() == 'install') { if (empty($this->getPackage()->packageDir)) { $document = $this->promptPackageDir(); - if ($document !== null && $document instanceof form\FormDocument) { + if ($document !== null && $document instanceof FormDocument) { $installationStep->setDocument($document); } @@ -331,7 +348,6 @@ class PackageInstallationDispatcher { // get language list $languageList = new LanguageList(); - $languageList->sqlLimit = 0; $languageList->readObjects(); // workaround for WCFSetup @@ -440,10 +456,14 @@ class PackageInstallationDispatcher { $plugin = new $className($this, $nodeData); - if (!($plugin instanceof \wcf\system\package\plugin\IPackageInstallationPlugin)) { + if (!($plugin instanceof IPackageInstallationPlugin)) { throw new SystemException("'".$className."' does not implement 'wcf\system\package\plugin\IPackageInstallationPlugin'"); } + if ($plugin instanceof SQLPackageInstallationPlugin || $plugin instanceof ObjectTypePackageInstallationPlugin) { + $this->requireRestructureVersionTables = true; + } + // execute PIP try { $document = $plugin->{$this->action}(); @@ -460,12 +480,18 @@ class PackageInstallationDispatcher { return $step; } - // @todo: comment + /** + * Displays a list to select optional packages or installs selection. + * + * @param string $currentNode + * @param array $nodeData + * @return wcf\system\package\PackageInstallationStep + */ protected function selectOptionalPackages($currentNode, array $nodeData) { $installationStep = new PackageInstallationStep(); $document = $this->promptOptionalPackages($nodeData); - if ($document !== null && $document instanceof form\FormDocument) { + if ($document !== null && $document instanceof FormDocument) { $installationStep->setDocument($document); $installationStep->setSplitNode(); } @@ -510,7 +536,7 @@ class PackageInstallationDispatcher { } /** - * Extracts files from .tar (or .tar.gz) archive and installs them + * Extracts files from .tar(.gz) archive and installs them * * @param string $targetDir * @param string $sourceArchive @@ -518,7 +544,7 @@ class PackageInstallationDispatcher { * @return wcf\system\setup\Installer */ public function extractFiles($targetDir, $sourceArchive, $fileHandler = null) { - return new \wcf\system\setup\Installer($targetDir, $sourceArchive, $fileHandler); + return new Installer($targetDir, $sourceArchive, $fileHandler); } /** @@ -542,8 +568,8 @@ class PackageInstallationDispatcher { protected function promptPackageDir() { if (!PackageInstallationFormManager::findForm($this->queue, 'packageDir')) { - $container = new container\GroupFormElementContainer(); - $packageDir = new element\TextInputFormElement($container); + $container = new GroupFormElementContainer(); + $packageDir = new TextInputFormElement($container); $packageDir->setName('packageDir'); $packageDir->setLabel(WCF::getLanguage()->get('wcf.acp.package.packageDir.input')); @@ -552,7 +578,7 @@ class PackageInstallationDispatcher { $packageDir->setValue($defaultPath); $container->appendChild($packageDir); - $document = new form\FormDocument('packageDir'); + $document = new FormDocument('packageDir'); $document->appendContainer($container); PackageInstallationFormManager::registerForm($this->queue, $document); @@ -603,14 +629,18 @@ class PackageInstallationDispatcher { } } - // @todo: comment + /** + * Prompts a selection of optional packages. + * + * @return mixed + */ protected function promptOptionalPackages(array $packages) { if (!PackageInstallationFormManager::findForm($this->queue, 'optionalPackages')) { - $container = new container\MultipleSelectionFormElementContainer(); + $container = new MultipleSelectionFormElementContainer(); $container->setName('optionalPackages'); foreach ($packages as $package) { - $optionalPackage = new element\MultipleSelectionFormElement($container); + $optionalPackage = new MultipleSelectionFormElement($container); $optionalPackage->setName('optionalPackages'); $optionalPackage->setLabel($package['packageName']); $optionalPackage->setValue($package['package']); @@ -618,7 +648,7 @@ class PackageInstallationDispatcher { $container->appendChild($optionalPackage); } - $document = new form\FormDocument('optionalPackages'); + $document = new FormDocument('optionalPackages'); $document->appendContainer($container); PackageInstallationFormManager::registerForm($this->queue, $document); @@ -733,7 +763,7 @@ class PackageInstallationDispatcher { LanguageEditor::deleteLanguageFiles(); // reset all caches - CacheHandler::getInstance()->clear(WCF_DIR.'cache/', '*'); + CacheHandler::getInstance()->flushAll(); } /** @@ -931,4 +961,52 @@ class PackageInstallationDispatcher { break; } } + + /* + * Restructure version tables. + */ + protected function restructureVersionTables() { + $objectTypes = VersionHandler::getInstance()->getObjectTypes(); + + if (empty($objectTypes)) { + return; + } + + // 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' => 'versionUsername', 'data' => array('type' => 'VARCHAR', 'length' => 255)); + $versionTableBaseColumns[] = array('name' => 'versionTime', 'data' => array('type' => 'INT')); + + foreach ($objectTypes as $objectTypeID => $objectType) { + // get structure of base table + $baseTableColumns = WCF::getDB()->getEditor()->getColumns($objectType::getDatabaseTableName()); + // get structure of version table + $versionTableColumns = WCF::getDB()->getEditor()->getColumns($objectType::getDatabaseVersionTableName()); + + if (empty($versionTableColumns)) { + $columns = array_merge($versionTableBaseColumns, $baseTableColumns); + + WCF::getDB()->getEditor()->createTable($objectType::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']); + } + } + + // check new columns for versioned table + foreach ($baseTableColumns as $columnData) { + if (!array_search($columnData['name'], $versionTableColumns, true)) { + // add colum + WCF::getDB()->getEditor()->addColumn($objectType::getDatabaseVersionTableName(), $columnData['name'], $columnData['data']); + } + } + } + } + } }