public function addVersionTable()
{
$table = $this->getTable();
$database = $table->getDatabase();
$this->versionTableName = isset($this->parameters['version_table']) ? $this->parameters['version_table'] : null;
if (!$this->versionTableName) {
if ($database->getTablePrefix() && ($start = strlen($database->getTablePrefix()))) {
$this->versionTableName = substr($table->getName() . '_version', $start);
} else {
$this->versionTableName = $table->getName() . '_version';
}
}
$this->versionTablePhpName = $table->getPhpName() . 'Version';
if (!$database->hasTable($this->versionTableName)) {
// create the version table
$versionTable = $database->addTable(array('name' => $this->versionTableName, 'phpName' => $this->versionTablePhpName, 'package' => $table->getPackage(), 'schema' => $table->getSchema(), 'namespace' => $table->getNamespace() ? '\\' . $table->getNamespace() : null));
$versionTable->isVersionTable = true;
$versionTable->addColumn(array('name' => $this->prefix . 'rev', 'type' => 'INTEGER', 'primaryKey' => 'true', 'autoIncrement' => 'true'));
// copy all the columns
foreach ($table->getColumns() as $column) {
$columnInVersionTable = clone $column;
$columnInVersionTable->clearInheritanceList();
if ($columnInVersionTable->hasReferrers()) {
$columnInVersionTable->clearReferrers();
}
if ($columnInVersionTable->isAutoincrement()) {
$columnInVersionTable->setAutoIncrement(false);
}
$versionTable->addColumn($columnInVersionTable);
}
/*
// create the foreign key
$fk = new ForeignKey();
$fk->setForeignTableCommonName($table->getCommonName());
$fk->setForeignSchemaName($table->getSchema());
$fk->setOnDelete('CASCADE');
$fk->setOnUpdate(null);
$tablePKs = $table->getPrimaryKey();
foreach ($versionTable->getPrimaryKey() as $key => $column) {
$fk->addReference($column, $tablePKs[$key]);
}
$versionTable->addForeignKey($fk);
*/
$this->versionTable = $versionTable;
// every behavior adding a table should re-execute database behaviors
// see bug 2188 http://www.propelorm.org/changeset/2188
foreach ($database->getBehaviors() as $behavior) {
$behavior->modifyDatabase();
}
} else {
$this->versionTable = $database->getTable($this->versionTableName);
}
}