MDL-61899 tool_dataprivacy: Fetch context ids to update then update
authorJun Pataleta <jun@moodle.com>
Tue, 10 Apr 2018 04:12:37 +0000 (12:12 +0800)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 18 Apr 2018 16:15:19 +0000 (18:15 +0200)
Fetch the context ids to be updated first before performing the update
to the contextlist_context table to avoid using subquery that causes
cross DB compatibility issues.

admin/tool/dataprivacy/classes/api.php

index 4d2f8e9..b3e61a5 100644 (file)
@@ -819,10 +819,25 @@ class api {
                      JOIN {" . contextlist_context::TABLE . "} ctx ON cl.id = ctx.contextlistid
                     WHERE rcl.requestid = ?";
 
-        $update = "UPDATE {" . contextlist_context::TABLE . "}
-                      SET status = ?
-                    WHERE id IN ({$select})";
-        $DB->execute($update, [$status, $requestid]);
+        // Fetch records IDs to be updated and update by chunks, if applicable (limit of 1000 records per update).
+        $limit = 1000;
+        $idstoupdate = $DB->get_fieldset_sql($select, [$requestid]);
+        $count = count($idstoupdate);
+        $idchunks = $idstoupdate;
+        if ($count > $limit) {
+            $idchunks = array_chunk($idstoupdate, $limit);
+        }
+        $transaction = $DB->start_delegated_transaction();
+        $initialparams = [$status];
+        foreach ($idchunks as $chunk) {
+            list($insql, $inparams) = $DB->get_in_or_equal($chunk);
+            $update = "UPDATE {" . contextlist_context::TABLE . "}
+                          SET status = ?
+                        WHERE id $insql";
+            $params = array_merge($initialparams, $inparams);
+            $DB->execute($update, $params);
+        }
+        $transaction->allow_commit();
     }
 
     /**