]> git.mjollnir.org Git - moodle.git/commitdiff
Fixes bug MDL-8294 "During upgrade group IDs aren't maintained..."
authornfreear <nfreear>
Mon, 29 Jan 2007 15:02:50 +0000 (15:02 +0000)
committernfreear <nfreear>
Mon, 29 Jan 2007 15:02:50 +0000 (15:02 +0000)
group/db/dbbasicgrouplib.php
group/db/upgrade.php
group/version.php
lang/en_utf8/group.php

index 87a6b44d8688d4f7901abad6ac596daadf68f981..67dc17ac71b318814c70ca818e73eda2ba69aeb4 100644 (file)
@@ -278,7 +278,7 @@ function groups_db_create_group($courseid, $groupsettings=false, $copytime=false
             $record2 = new Object();
                $record2->courseid = $courseid;
                $record2->groupid = $groupid;
-           if ($copytime) {
+            if ($copytime) {
                 $record2->timeadded = $record->timemodified;
             } else {
                 $record2->timeadded = $now;
@@ -292,6 +292,38 @@ function groups_db_create_group($courseid, $groupsettings=false, $copytime=false
     return $groupid;
 }
 
+/** 
+ * Upgrades a group for a specified course. To preserve the group ID we do a raw insert.
+ * @param int $courseid The course to create the group for
+ * @return int The id of the group created or false if the insert failed.
+ */
+function groups_db_upgrade_group($courseid, $group) {
+    global $CFG;
+    // Check we have a valid course id
+    if (!$courseid || !$group || !isset($group->id)) {
+        return false; 
+    }
+
+    $r = addslashes_object($group);
+    $sql = "INSERT INTO {$CFG->prefix}groups
+        (id,name,description, enrolmentkey,lang,theme,picture,hidepicture, timecreated,timemodified)
+        VALUES ('$r->id','$r->name','$r->description', '$r->enrolmentkey','$r->lang',
+        '$r->theme','$r->picture','$r->hidepicture', '$r->timecreated','$r->timemodified')";
+
+    if ($result = execute_sql($sql)) {
+        $record2 = new Object();
+        $record2->courseid = $courseid;
+        $record2->groupid = $group->id;
+        $record2->timeadded = $group->timemodified;
+
+        $groupadded = insert_record('groups_courses_groups', $record2);
+        if (! $groupadded) {
+            $groupid = false;
+        }
+    }
+    return $group->id;
+}
+
 
 /**
  * Adds a specified user to a group
index 30bf84092dfdfc2c716837f9ff440e90fa751810..94f3f73f4dbee8f824748b6deec3b50ef011df01 100644 (file)
@@ -26,8 +26,8 @@ function upgrade_group_db($continueto) {
     $group_version = '';  // Get code versions
     require_once ("$CFG->dirroot/group/version.php");
 
-    if (empty($CFG->group_version)) {  // New groups have never been installed...
-        $status = false;
+    if (empty($CFG->group_version)) {  // New 1.8 groups have never been installed...
+        $status = true;
 
         $strdatabaseupgrades = get_string('databaseupgrades');
         print_header($strdatabaseupgrades, $strdatabaseupgrades, $strdatabaseupgrades, '', 
@@ -39,25 +39,25 @@ function upgrade_group_db($continueto) {
 
         //TODO: for testing, revert to 'old' groups.
         if (! get_config('group_version')) {
-            $status = revert_group_db();
+            $status = $status && groups_revert_db();
         }
 
         //... But Moodle is already installed.
         if (table_exists($t_groups = new XMLDBTable('groups'))) {
-            $status = rename_table($t_groups, 'groups_temp');
-            $status = rename_table(new XMLDBTable('groups_members'), 'groups_members_temp');
+            $status = $status && rename_table($t_groups, 'groups_temp');
+            $status = $status && rename_table(new XMLDBTable('groups_members'), 'groups_members_temp');
         }
 
     /// Both old .sql files and new install.xml are supported
     /// but we prioritize install.xml (XMLDB) if present
 
         if (file_exists($CFG->dirroot . '/group/db/install.xml')) {
-            $status = install_from_xmldb_file($CFG->dirroot . '/group/db/install.xml'); //New method
+            $status = $status && install_from_xmldb_file($CFG->dirroot . '/group/db/install.xml'); //New method
         } else if (file_exists($CFG->dirroot . '/group/db/' . $CFG->dbtype . '.sql')) {
-            $status = modify_database($CFG->dirroot . '/group/db/' . $CFG->dbtype . '.sql'); //Old method
+            $status = $status && modify_database($CFG->dirroot . '/group/db/' . $CFG->dbtype . '.sql'); //Old method
         }
 
-        $status = transfer_group_db();
+        $status = $status && groups_transfer_db();
 
         $db->debug = false;
     
@@ -146,13 +146,15 @@ function upgrade_group_db($continueto) {
     }
 }
 
-
-function transfer_group_db() {
+/**
+ * Transfer data from old 1.7 to new 1.8 groups tables.
+ */
+function groups_transfer_db() {
     $status = true;
     
     if (table_exists($t_groups = new XMLDBTable('groups_temp'))) {
-        $status = (bool)$groups_r = get_records('groups_temp');
-        $status = (bool)$members_r= get_records('groups_members_temp');
+        $status = $status &&(bool)$groups_r = get_records('groups_temp');
+        $status = $status &&(bool)$members_r= get_records('groups_members_temp');
 
         if (! $groups_r) {
             return $status;
@@ -164,48 +166,128 @@ function transfer_group_db() {
             $group->enrolmentkey = $group->password;
             ///unset($group->password);
             ///unset($group->courseid);
-            $status = (bool)$newgroupid = groups_create_group($group->courseid, $group);
-            debugging('Create group status: '.$status); //TODO: ?
+            $status = $status &&(bool)$newgroupid = groups_db_upgrade_group($group->courseid, $group);
             if ($members_r) {
                 foreach ($members_r as $member) {
                     if ($member->groupid == $group->id) {
-                        $status = (bool)$memberid = groups_add_member($newgroupid, $member->userid);
+                        $status = $status &&(bool)$memberid = groups_add_member($newgroupid, $member->userid);
                     }
                 }
             }
-            debugging('Add member status: '.$status);
         }
-        ///$status = drop_table($t_groups);
-        ///$status = drop_table(new XMLDBTable('groups_members_temp'));
+        ///$status = $status && drop_table($t_groups);
+        ///$status = $status && drop_table(new XMLDBTable('groups_members_temp'));
+    } else {
+        return false;
     }
     return $status;
 }
 
 
+function groups_drop_keys_indexes_db() {
+    $result = true;
+    /// Define index groupid-courseid (unique) to be added to groups_members
+        $table = new XMLDBTable('groups_members');
+        $index = new XMLDBIndex('groupid-courseid');
+        $index->setAttributes(XMLDB_INDEX_UNIQUE, array('groupid', 'userid'));
+
+    /// Launch add index groupid-courseid
+        $result = $result && drop_index($table, $index);
+
+    /// Define key courseid (foreign) to be added to groups_courses_groups
+        $table = new XMLDBTable('groups_courses_groups');
+        $key = new XMLDBKey('courseid');
+        $key->setAttributes(XMLDB_KEY_FOREIGN, array('courseid'), 'course', array('id'));
+
+    /// Launch add key courseid
+        $result = $result && drop_key($table, $key);
+
+    /// Define key groupid (foreign) to be added to groups_courses_groups
+        $key = new XMLDBKey('groupid');
+        $key->setAttributes(XMLDB_KEY_FOREIGN, array('groupid'), 'groups', array('id'));
+
+    /// Launch add key groupid
+        $result = $result && drop_key($table, $key);
+
+    /// Define index courseid-groupid (unique) to be added to groups_courses_groups
+        $index = new XMLDBIndex('courseid-groupid');
+        $index->setAttributes(XMLDB_INDEX_UNIQUE, array('courseid', 'groupid'));
+
+    /// Launch add index courseid-groupid
+        $result = $result && drop_index($table, $index);
+
+    /// Define key courseid (foreign) to be added to groups_courses_groupings
+        $table = new XMLDBTable('groups_courses_groupings');
+        $key = new XMLDBKey('courseid');
+        $key->setAttributes(XMLDB_KEY_FOREIGN, array('courseid'), 'course', array('id'));
+
+    /// Launch add key courseid
+        $result = $result && drop_key($table, $key);
+
+    /// Define key groupingid (foreign) to be added to groups_courses_groupings
+        $key = new XMLDBKey('groupingid');
+        $key->setAttributes(XMLDB_KEY_FOREIGN, array('groupingid'), 'groups_groupings', array('id'));
+
+    /// Launch add key groupingid
+        $result = $result && drop_key($table, $key);
+
+    /// Define index courseid-groupingid (unique) to be added to groups_courses_groupings
+        $index = new XMLDBIndex('courseid-groupingid');
+        $index->setAttributes(XMLDB_INDEX_UNIQUE, array('courseid', 'groupingid'));
+
+    /// Launch add index courseid-groupingid
+        $result = $result && drop_index($table, $index);
+
+    /// Define key groupingid (foreign) to be added to groups_groupings_groups
+        $table = new XMLDBTable('groups_groupings_groups');
+        $key = new XMLDBKey('groupingid');
+        $key->setAttributes(XMLDB_KEY_FOREIGN, array('groupingid'), 'groups_groupings', array('id'));
+
+    /// Launch add key groupingid
+        $result = $result && drop_key($table, $key);
+
+    /// Define key groupid (foreign) to be added to groups_groupings_groups
+        $key = new XMLDBKey('groupid');
+        $key->setAttributes(XMLDB_KEY_FOREIGN, array('groupid'), 'groups', array('id'));
+
+    /// Launch add key groupid
+        $result = $result && drop_key($table, $key);
+
+    /// Define index groupingid-groupid (unique) to be added to groups_groupings_groups
+        $index = new XMLDBIndex('groupingid-groupid');
+        $index->setAttributes(XMLDB_INDEX_UNIQUE, array('groupingid', 'groupid'));
+
+    /// Launch add index groupingid-groupid
+        $result = $result && drop_index($table, $index);
+
+    return $result;
+}
+
 /**
- * For testing, it's useful to be able to revert to 'old' groups.
+ * Drop 'new' 1.8 groups tables for 200701240 upgrade below.
+ * (Also, for testing it's useful to be able to revert to 'old' groups.)
  */
-function revert_group_db() {
-    $status = false;
-    //$status = (bool)$rs = delete_records('config', 'name', 'group_version');
-    if (!get_config('group_version') && table_exists(new XMLDBTable('groups_groupings'))) { //debugging()
-        $status = drop_table(new XMLDBTable('groups'));
-        $status = drop_table(new XMLDBTable('groups_members'));
-        $status = drop_table(new XMLDBTable('groups_groupings'));
-        $status = drop_table(new XMLDBTable('groups_courses_groups'));
-        $status = drop_table(new XMLDBTable('groups_courses_groupings'));
-        $status = drop_table(new XMLDBTable('groups_groupings_groups'));
-
-        $status = rename_table(new XMLDBTable('groups_temp'), 'groups');
-        $status = rename_table(new XMLDBTable('groups_members_temp'), 'groups_members');
+function groups_revert_db($renametemp=true) {
+    $status = true;
+    ///$status = (bool)$rs = delete_records('config', 'name', 'group_version');
+    if (table_exists(new XMLDBTable('groups_groupings'))) {
+
+        $tables = array('', '_members', '_groupings', '_courses_groups', '_courses_groupings', '_groupings_groups');
+        foreach ($tables as $t_name) {
+            $status = $status && drop_table(new XMLDBTable('groups'.$t_name));
+        }
+
+        if ($renametemp) {
+            $status = $status && rename_table(new XMLDBTable('groups_temp'), 'groups');
+            $status = $status && rename_table(new XMLDBTable('groups_members_temp'), 'groups_members');
+        }
     }
     return $status;
 }
 
 
 function xmldb_group_upgrade($oldversion=0) {
-
-    //global $CFG, $THEME, $db;
+    global $CFG; //, $THEME, $db;
 
     $result = true;
 
@@ -323,6 +405,30 @@ function xmldb_group_upgrade($oldversion=0) {
         $result = $result && add_index($table, $index);
     }
 
+    if ($result && $oldversion < 2007012400) {
+        if( table_exists(new XMLDBTable('groups_temp'))
+            && file_exists($CFG->dirroot.'/group/db/install.xml') ) {
+
+            $groupupgrade = optional_param('confirmgroupupgrade', 0, PARAM_BOOL);
+            if (empty($groupupgrade)) {
+                notice_yesno(get_string('upgradeconfirm', 'group'), 'index.php?confirmgroupupgrade=yes', 'index.php');
+                //$feedback = false;
+                print_footer();
+                exit;
+            } //ELSE
+            /// Need to drop foreign keys/indexes added in last upgrade, drop 'new' tables, then start again!!
+            $result = $result && groups_drop_keys_indexes_db();
+            $result = $result && groups_revert_db($renametemp=false);
+            $result = $result && install_from_xmldb_file($CFG->dirroot.'/group/db/install.xml');
+            $result = $result && groups_transfer_db();
+
+            ///$result = $result && groups_rename_db2($suffix='_temp_18');
+        }
+        else {
+            error('Upgrade 2007012400 of groups failed! (Could not update version in config table)');
+        }
+    }
+
     return $result;
 }
 
index 0a0650fc9c143e019755e7c63e09d0051c924814..1f4cb5094c51717b56bce47dfd1803bf2eb38686 100644 (file)
@@ -5,7 +5,7 @@
 //  This fragment is called by /admin/index.php
 ////////////////////////////////////////////////////////////////////////////////
 
-$group_version  = 2007012200;
+$group_version  = 2007012400;
 //$module->requires = 2006120400;  // Requires this Moodle version
 
 ?>
index 985ca20037cc4874c8451aa6d2ea6cec50000ada..22f3816412b762e6a3e5693eb12099fba0911e18 100644 (file)
@@ -19,6 +19,8 @@ $string['errorinvalidgroup'] = 'Error, invalid group $a';
 $string['erroreditgrouping'] = 'Error creating/updating grouping $a';
 $string['erroreditgroup'] = 'Error creating/updating group $a';
 
+$string['upgradeconfirm'] = 'Sorry, groups tables created in Moodle 1.8 dev have to be deleted for this upgrade. Do you want to continue?';
+
 $string['groupings'] = 'Groupings';
 $string['grouping'] = 'Grouping';
 $string['groups'] = 'Groups';