MDL-65313 core: Fix orphaned favourites cleanup
authorJun Pataleta <jun@moodle.com>
Mon, 6 May 2019 08:46:06 +0000 (16:46 +0800)
committerAdrian Greeve <abgreeve@gmail.com>
Tue, 7 May 2019 08:24:38 +0000 (16:24 +0800)
lib/db/upgrade.php

index b3e24ea..814486c 100644 (file)
@@ -3303,16 +3303,22 @@ function xmldb_main_upgrade($oldversion) {
 
     if ($oldversion < 2019050300.01) {
         // Delete all stale favourite records which were left behind when a course was deleted.
-        $select = 'id IN (
-            SELECT fav.id as id
-              FROM {favourite} fav
-         LEFT JOIN {context} ctx ON (ctx.id = fav.contextid)
-             WHERE fav.component = :component
-               AND fav.itemtype = :itemtype
-               AND ctx.id IS NULL
-               )';
         $params = ['component' => 'core_message', 'itemtype' => 'message_conversations'];
-        $DB->delete_records_select('favourite', $select, $params);
+        $sql = "SELECT fav.id as id
+                  FROM {favourite} fav
+             LEFT JOIN {context} ctx ON (ctx.id = fav.contextid)
+                 WHERE fav.component = :component
+                       AND fav.itemtype = :itemtype
+                       AND ctx.id IS NULL";
+
+        if ($records = $DB->get_fieldset_sql($sql, $params)) {
+            // Just for safety, delete by chunks.
+            $chunks = array_chunk($records, 1000);
+            foreach ($chunks as $chunk) {
+                list($insql, $inparams) = $DB->get_in_or_equal($chunk);
+                $DB->delete_records_select('favourite', "id $insql", $inparams);
+            }
+        }
 
         upgrade_main_savepoint(true, 2019050300.01);
     }