From 07c21e28805236807387b984e988f62043728620 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Tue, 9 Jun 2015 13:50:09 +1200 Subject: [PATCH] BUG Fix deletion of orphaned versioned records when a parent _versions table has been deleted --- model/Versioned.php | 52 ++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/model/Versioned.php b/model/Versioned.php index aa854d79f..0060ba21d 100644 --- a/model/Versioned.php +++ b/model/Versioned.php @@ -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) + ); } } }