<?php
namespace wcf\system\package;
+use wcf\system\cache\builder\TemplateListenerCodeCacheBuilder;
+
+use wcf\system\cache\builder\TemplateListenerCacheBuilder;
+
use wcf\data\application\Application;
use wcf\data\application\ApplicationEditor;
use wcf\data\language\category\LanguageCategory;
use wcf\system\database\statement\PreparedStatement;
use wcf\system\database\util\PreparedStatementConditionBuilder;
use wcf\system\exception\SystemException;
-use wcf\system\form\container;
-use wcf\system\form\element;
+use wcf\system\form\container\GroupFormElementContainer;
+use wcf\system\form\container\MultipleSelectionFormElementContainer;
+use wcf\system\form\element\MultipleSelectionFormElement;
+use wcf\system\form\element\TextInputFormElement;
use wcf\system\form\FormDocument;
-use wcf\system\form;
use wcf\system\language\LanguageFactory;
+use wcf\system\package\plugin\IPackageInstallationPlugin;
+use wcf\system\package\plugin\ObjectTypePackageInstallationPlugin;
+use wcf\system\package\plugin\SQLPackageInstallationPlugin;
use wcf\system\request\LinkHandler;
use wcf\system\request\RouteHandler;
+use wcf\system\setup\Installer;
use wcf\system\style\StyleHandler;
+use wcf\system\version\VersionHandler;
use wcf\system\WCF;
use wcf\util\FileUtil;
use wcf\util\HeaderUtil;
* PackageInstallationDispatcher handles the whole installation process.
*
* @author Alexander Ebert
- * @copyright 2001-2012 WoltLab GmbH
+ * @copyright 2001-2013 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @package com.woltlab.wcf
* @subpackage system.package
*/
const CONFIG_FILE = 'config.inc.php';
+ /**
+ * holds state of structuring version tables
+ * @var boolean
+ */
+ protected $requireRestructureVersionTables = false;
+
/**
* Creates a new instance of PackageInstallationDispatcher.
*
// remove all cache files after WCFSetup
if (!PACKAGE_ID) {
- CacheHandler::getInstance()->clear(WCF_DIR.'cache/', 'cache.*.php');
+ CacheHandler::getInstance()->flushAll();
}
// rebuild application paths
}
// remove template listener cache
- CacheHandler::getInstance()->clear(WCF_DIR.'cache/templateListener/', '*.php');
+ TemplateListenerCacheBuilder::getInstance()->reset();
+ TemplateListenerCodeCacheBuilder::getInstance()->reset();
// reset language cache
LanguageFactory::getInstance()->clearCache();
// reset stylesheets
StyleHandler::resetStylesheets();
- }
+ }
+
+ if ($this->requireRestructureVersionTables) {
+ $this->restructureVersionTables();
+ }
return $step;
}
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);
}
// get language list
$languageList = new LanguageList();
- $languageList->sqlLimit = 0;
$languageList->readObjects();
// workaround for WCFSetup
$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}();
$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();
}
* @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);
}
/**
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'));
$packageDir->setValue($defaultPath);
$container->appendChild($packageDir);
- $document = new form\FormDocument('packageDir');
+ $document = new FormDocument('packageDir');
$document->appendContainer($container);
PackageInstallationFormManager::registerForm($this->queue, $document);
*/
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']);
$container->appendChild($optionalPackage);
}
- $document = new form\FormDocument('optionalPackages');
+ $document = new FormDocument('optionalPackages');
$document->appendContainer($container);
PackageInstallationFormManager::registerForm($this->queue, $document);
LanguageEditor::deleteLanguageFiles();
// reset all caches
- CacheHandler::getInstance()->clear(WCF_DIR.'cache/', '*');
+ CacheHandler::getInstance()->flushAll();
}
/**
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']);
+ }
+ }
+ }
+ }
+ }
}