/** * Returns all versions of this database object. * * @return array<\wcf\data\VersionableDatabaseObject> */ public function getVersions() { $objectType = VersionHandler::getInstance()->getObjectTypeByName($this->versionableObjectTypeName); if ($objectType === null) { throw new SystemException("Unknown versionable object type with name '" . $this->versionableObjectTypeName . "'"); } return VersionHandler::getInstance()->getVersions($objectType->objectTypeID, $this->getObjectID()); }
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']); } } } } }
/** * Restores a revision. */ public function restoreRevision() { if (empty($this->objects)) { $this->readObjects(); } // currently we only support restoring one version foreach ($this->objects as $object) { $objectType = VersionHandler::getInstance()->getObjectTypeByName($object->versionableObjectTypeName); $restoreObject = VersionHandler::getInstance()->getVersionByID($objectType->objectTypeID, $this->parameters['restoreObjectID']); $this->parameters['data'] = $restoreObject->getData(); } $this->update(); }