mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
BUG Fix deletion of orphaned versioned records when a parent _versions table has been deleted
This commit is contained in:
parent
54f4ef0e9f
commit
07c21e2880
@ -486,34 +486,34 @@ class Versioned extends DataExtension implements TemplateGlobalProvider {
|
||||
if(!$isRootClass && ($versionedTables = ClassInfo::dataClassesFor($table))) {
|
||||
|
||||
foreach($versionedTables as $child) {
|
||||
if($table == $child) break; // only need subclasses
|
||||
|
||||
$count = DB::query("
|
||||
SELECT COUNT(*) FROM \"{$table}_versions\"
|
||||
LEFT JOIN \"{$child}_versions\"
|
||||
ON \"{$child}_versions\".\"RecordID\" = \"{$table}_versions\".\"RecordID\"
|
||||
AND \"{$child}_versions\".\"Version\" = \"{$table}_versions\".\"Version\"
|
||||
WHERE \"{$child}_versions\".\"ID\" IS NULL
|
||||
")->value();
|
||||
if($table === $child) break; // only need subclasses
|
||||
|
||||
// Select all orphaned version records
|
||||
$orphanedQuery = SQLSelect::create()
|
||||
->selectField("\"{$table}_versions\".\"ID\"")
|
||||
->setFrom("\"{$table}_versions\"");
|
||||
|
||||
// If we have a parent table limit orphaned records
|
||||
// to only those that exist in this
|
||||
if(DB::get_schema()->hasTable("{$child}_versions")) {
|
||||
$orphanedQuery
|
||||
->addLeftJoin(
|
||||
"{$child}_versions",
|
||||
"\"{$child}_versions\".\"RecordID\" = \"{$table}_versions\".\"RecordID\"
|
||||
AND \"{$child}_versions\".\"Version\" = \"{$table}_versions\".\"Version\""
|
||||
)
|
||||
->addWhere("\"{$child}_versions\".\"ID\" IS NULL");
|
||||
}
|
||||
|
||||
$count = $orphanedQuery->count();
|
||||
if($count > 0) {
|
||||
DB::alteration_message("Removing orphaned versioned records", "deleted");
|
||||
|
||||
$affectedIDs = DB::query("
|
||||
SELECT \"{$table}_versions\".\"ID\" FROM \"{$table}_versions\"
|
||||
LEFT JOIN \"{$child}_versions\"
|
||||
ON \"{$child}_versions\".\"RecordID\" = \"{$table}_versions\".\"RecordID\"
|
||||
AND \"{$child}_versions\".\"Version\" = \"{$table}_versions\".\"Version\"
|
||||
WHERE \"{$child}_versions\".\"ID\" IS NULL
|
||||
")->column();
|
||||
|
||||
if(is_array($affectedIDs)) {
|
||||
foreach($affectedIDs as $key => $value) {
|
||||
DB::prepared_query(
|
||||
"DELETE FROM \"{$table}_versions\" WHERE \"ID\" = ?",
|
||||
array($value)
|
||||
);
|
||||
}
|
||||
DB::alteration_message("Removing {$count} orphaned versioned records", "deleted");
|
||||
$ids = $orphanedQuery->execute()->column();
|
||||
foreach($ids as $id) {
|
||||
DB::prepared_query(
|
||||
"DELETE FROM \"{$table}_versions\" WHERE \"ID\" = ?",
|
||||
array($id)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user