BUGFIX In Versioned->augmentDatabase(), only create AuthorID, PublisherID and WasPublished columns on the root table, to avoid redundant information on sub tables. Limit writing in Versioned->augmentWrite() accordingly. This caused problems with the publication status not being reflected in the "Versions" report as the "WasPublished" attribute on the subtable was set to 0, while the root table was 1. (from r78358)

git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@81469 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
Sam Minnee 2009-07-09 06:00:07 +00:00
parent 51e6ce6727
commit 3614e7b1ee

View File

@ -194,6 +194,8 @@ class Versioned extends DataObjectDecorator {
function augmentDatabase() {
$classTable = $this->owner->class;
$isRootClass = ($this->owner->class == ClassInfo::baseDataClass($this->owner->class));
// Build a list of suffixes whose tables need versioning
$allSuffixes = array();
@ -218,9 +220,6 @@ class Versioned extends DataObjectDecorator {
if(($fields = $this->owner->databaseFields())) {
$indexes = $this->owner->databaseIndexes();
if($this->owner->parentClass() == "DataObject") {
$rootTable = true;
}
if ($suffix && ($ext = $this->owner->extInstance($allSuffixes[$suffix]))) {
if (!$ext->isVersionedTable($table)) continue;
$ext->setOwner($this->owner);
@ -235,18 +234,11 @@ class Versioned extends DataObjectDecorator {
// Extra tables for _Live, etc.
if($stage != $this->defaultStage) {
DB::requireTable("{$table}_$stage", $fields, $indexes, false);
/*
if(!DB::query("SELECT * FROM {$table}_$stage")->value()) {
$fieldList = implode(", ",array_keys($fields));
DB::query("INSERT INTO \"{$table}_$stage\" (ID,$fieldList)
SELECT ID,$fieldList FROM \"$table\"");
}
*/
}
// Version fields on each root table (including Stage)
/*
if(isset($rootTable)) {
if($isRootClass) {
$stageTable = ($stage == $this->defaultStage) ? $table : "{$table}_$stage";
$parts=Array('datatype'=>'int', 'precision'=>11, 'null'=>'not null', 'default'=>(int)0);
$values=Array('type'=>'int', 'parts'=>$parts);
@ -255,27 +247,38 @@ class Versioned extends DataObjectDecorator {
*/
}
// Create table for all versions
$versionFields = array_merge(
self::$db_for_versions_table,
(array)$fields
);
if($isRootClass) {
// Create table for all versions
$versionFields = array_merge(
self::$db_for_versions_table,
(array)$fields
);
$versionIndexes = array_merge(
self::$indexes_for_versions_table,
(array)$indexes
);
$versionIndexes = array_merge(
self::$indexes_for_versions_table,
(array)$indexes
);
} else {
// Create fields for any tables of subclasses
$versionFields = array_merge(
array(
"RecordID" => "Int",
"Version" => "Int",
),
(array)$fields
);
DB::requireTable("{$table}_versions", $versionFields, $versionIndexes);
/*
if(!DB::query("SELECT * FROM {$table}_versions")->value()) {
$fieldList = implode(", ",array_keys($fields));
DB::query("INSERT INTO \"{$table}_versions\" ($fieldList, RecordID, Version)
SELECT $fieldList, ID AS RecordID, 1 AS Version FROM \"$table\"");
$versionIndexes = array_merge(
array(
'RecordID_Version' => '(RecordID, Version)',
'RecordID' => true,
'Version' => true,
),
(array)$indexes
);
}
*/
DB::requireTable("{$table}_versions", $versionFields, $versionIndexes);
} else {
DB::dontRequireTable("{$table}_versions");
foreach($this->stages as $stage) {
@ -293,14 +296,16 @@ class Versioned extends DataObjectDecorator {
$tables = array_keys($manipulation);
$version_table = array();
foreach($tables as $table) {
$baseDataClass = ClassInfo::baseDataClass($table);
$isRootClass = ($this->owner->class == ClassInfo::baseDataClass($this->owner->class));
// Make sure that the augmented write is being applied to a table that can be versioned
if( !$this->canBeVersioned($table) ) {
// Debug::message( "$table doesn't exist or has no database fields" );
unset($manipulation[$table]);
continue;
}
$id = $manipulation[$table]['id'] ? $manipulation[$table]['id'] : $manipulation[$table]['fields']['ID'];//echo 'id' .$id.' from '.$manipulation[$table]['id'].' and '.$manipulation[$table]['fields']['ID']."\n\n<br><br>";
$id = $manipulation[$table]['id'] ? $manipulation[$table]['id'] : $manipulation[$table]['fields']['ID'];;
if(!$id) user_error("Couldn't find ID in " . var_export($manipulation[$table], true), E_USER_ERROR);
$rid = isset($manipulation[$table]['RecordID']) ? $manipulation[$table]['RecordID'] : $id;
@ -314,9 +319,8 @@ class Versioned extends DataObjectDecorator {
$manipulation[$table]['fields']['Version'] = $this->migratingVersion;
}
// If we haven't got a version #, then we're creating a new version. Otherwise, we're just
// copying a version to another table
// If we haven't got a version #, then we're creating a new version.
// Otherwise, we're just copying a version to another table
if(!isset($manipulation[$table]['fields']['Version'])) {
// Add any extra, unchanged fields to the version record.
$data = DB::query("SELECT * FROM \"$table\" WHERE \"ID\" = $id")->record();
@ -331,10 +335,16 @@ class Versioned extends DataObjectDecorator {
// Create a new version #
if (isset($version_table[$table])) $nextVersion = $version_table[$table];
else unset($nextVersion);
if($rid && !isset($nextVersion)) $nextVersion = DB::query("SELECT MAX(\"Version\") + 1 FROM \"{$table}_versions\" WHERE \"RecordID\" = $rid")->value();
if($rid && !isset($nextVersion)) $nextVersion = DB::query("SELECT MAX(\"Version\") + 1 FROM \"{$baseDataClass}_versions\" WHERE \"RecordID\" = $rid")->value();
$newManipulation['fields']['Version'] = $nextVersion ? $nextVersion : 1;
$newManipulation['fields']['AuthorID'] = Member::currentUserID() ? Member::currentUserID() : 0;
if($isRootClass) {
$userID = (Member::currentUser()) ? Member::currentUser()->ID : 0;
$newManipulation['fields']['AuthorID'] = $userID;
}
$manipulation["{$table}_versions"] = $newManipulation;