/**
  * 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();
 }