MDL-29350 Prevent duplication of groupings when copying activities
authorHenning Bostelmann <henning.bostelmann@york.ac.uk>
Tue, 13 Sep 2011 00:11:19 +0000 (01:11 +0100)
committerAndrew Robert Nicols <andrew.nicols@luns.net.uk>
Tue, 15 Nov 2011 11:12:40 +0000 (11:12 +0000)
This patch also includes a database upgrade to correct data produced as a
result of this bug.

backup/moodle2/restore_stepslib.php
lib/db/upgrade.php
version.php

index 3044c7f..c9705a9 100644 (file)
@@ -802,7 +802,14 @@ class restore_groups_structure_step extends restore_structure_step {
 
         $data->groupingid = $this->get_new_parentid('grouping'); // Use new parentid
         $data->groupid    = $this->get_mappingid('group', $data->groupid); // Get from mappings
-        $DB->insert_record('groupings_groups', $data);  // No need to set this mapping (no child info nor files)
+
+        $params = array();
+        $params['groupingid'] = $data->groupingid;
+        $params['groupid']    = $data->groupid;
+
+        if (!$DB->record_exists('groupings_groups', $params)) {
+            $DB->insert_record('groupings_groups', $data);  // No need to set this mapping (no child info nor files)
+        }
     }
 
     protected function after_execute() {
index 83adec7..097cfb1 100644 (file)
@@ -6916,6 +6916,21 @@ FROM
         upgrade_main_savepoint(true, 2011110200.02);
     }
 
+    if ($oldversion < 2011111500.01) {
+        // Remove duplicate entries from groupings_groups table
+        $sql = 'SELECT MIN(id) AS firstid, groupingid, groupid FROM {groupings_groups} '.
+               'GROUP BY groupingid, groupid HAVING COUNT(id)>1';
+        $badrecs = $DB->get_records_sql($sql);
+        foreach ($badrecs as $badrec) {
+            $where = 'groupingid = ? and groupid = ? and id > ?';
+            $params = array($badrec->groupingid, $badrec->groupid, $badrec->firstid);
+            $DB->delete_records_select('groupings_groups', $where, $params);
+        }
+
+        // Main savepoint reached
+        upgrade_main_savepoint(true, 2011111500.01);
+    }
+
     return true;
 }
 
index eb0a329..19816d1 100644 (file)
@@ -30,7 +30,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 
-$version  = 2011111500.00;              // YYYYMMDD      = weekly release date of this DEV branch
+$version  = 2011111500.01;              // YYYYMMDD      = weekly release date of this DEV branch
                                         //         RR    = release increments - 00 in DEV branches
                                         //           .XX = incremental changes