mod-scorm MDL-25792 Fixed database discrepancies between a fresh install and an upgra...
authorSam Hemelryk <sam@moodle.com>
Tue, 4 Jan 2011 04:07:02 +0000 (12:07 +0800)
committerSam Hemelryk <sam@moodle.com>
Fri, 14 Jan 2011 03:01:30 +0000 (11:01 +0800)
mod/scorm/db/upgrade.php
mod/scorm/version.php [changed mode: 0755->0644]

index 7665300..e68ec41 100644 (file)
 // Please do not forget to use upgrade_set_timeout()
 // before any action that may take longer time to finish.
 
+/**
+ * @global moodle_database $DB
+ * @param int $oldversion
+ * @return bool
+ */
 function xmldb_scorm_upgrade($oldversion) {
     global $CFG, $DB;
 
@@ -220,23 +225,23 @@ function xmldb_scorm_upgrade($oldversion) {
 
     /// Define new fields forcecompleted, forcenewattempt, displayattemptstatus, and displaycoursestructure to be added to scorm
         $table = new xmldb_table('scorm');
-        $field = new xmldb_field('forcecompleted', XMLDB_TYPE_INTEGER, '1', null, null, null, '0', 'maxattempt');
+        $field = new xmldb_field('forcecompleted', XMLDB_TYPE_INTEGER, 10, null, XMLDB_NOTNULL, null, 1, 'maxattempt');
         if (!$dbman->field_exists($table,$field)) {
             $dbman->add_field($table, $field);
         }
-        $field = new xmldb_field('forcenewattempt', XMLDB_TYPE_INTEGER, '1', null, null, null, '0', 'forcecompleted');
+        $field = new xmldb_field('forcenewattempt', XMLDB_TYPE_INTEGER, 1, null, XMLDB_NOTNULL, null, 0, 'forcecompleted');
         if (!$dbman->field_exists($table,$field)) {
             $dbman->add_field($table, $field);
         }
-        $field = new xmldb_field('lastattemptlock', XMLDB_TYPE_INTEGER, '1', null, null, null, '0', 'forcenewattempt');
+        $field = new xmldb_field('lastattemptlock', XMLDB_TYPE_INTEGER, 1, null, XMLDB_NOTNULL, null, 0, 'forcenewattempt');
         if (!$dbman->field_exists($table,$field)) {
             $dbman->add_field($table, $field);
         }
-        $field = new xmldb_field('displayattemptstatus', XMLDB_TYPE_INTEGER, '1', null, null, null, '1', 'lastattemptlock');
+        $field = new xmldb_field('displayattemptstatus', XMLDB_TYPE_INTEGER, 1, null, XMLDB_NOTNULL, null, 1, 'lastattemptlock');
         if (!$dbman->field_exists($table,$field)) {
             $dbman->add_field($table, $field);
         }
-        $field = new xmldb_field('displaycoursestructure', XMLDB_TYPE_INTEGER, '1', null, null, null, '1', 'displayattemptstatus');
+        $field = new xmldb_field('displaycoursestructure', XMLDB_TYPE_INTEGER, 1, null, XMLDB_NOTNULL, null, 1, 'displayattemptstatus');
         if (!$dbman->field_exists($table,$field)) {
             $dbman->add_field($table, $field);
         }
@@ -472,6 +477,60 @@ function xmldb_scorm_upgrade($oldversion) {
         /// scorm savepoint reached
         upgrade_mod_savepoint(true, 2010092400, 'scorm');
     }
+    
+    if ($oldversion < 2010122300) {
+        // Fix scorm in the post table after upgrade from 1.9
+        $table = new xmldb_table('scorm');
+        $columns = $DB->get_columns('scorm');
+
+        if (array_key_exists('forcecompleted', $columns) && empty($columns['forcecompleted']->not_null)) {
+            // forcecompleted should be bigint(10) NOT NULL DEFAULT '1'
+            // Fixed in earlier upgrade code
+            $field = new xmldb_field('forcecompleted', XMLDB_TYPE_INTEGER, 10, null, XMLDB_NOTNULL, null, 1, 'maxattempt');
+            if ($dbman->field_exists($table, $field)) {
+                $dbman->change_field_precision($table, $field);
+            }
+        }
+
+        if (array_key_exists('forcenewattempt', $columns) && empty($columns['forcenewattempt']->not_null)) {
+            // forcenewattempt should be NOT NULL
+            // Fixed in earlier upgrade code
+            $field = new xmldb_field('forcenewattempt', XMLDB_TYPE_INTEGER, 1, null, XMLDB_NOTNULL, null, 0, 'forcecompleted');
+            if ($dbman->field_exists($table, $field)) {
+                $dbman->change_field_notnull($table, $field);
+            }
+        }
+
+        if (array_key_exists('lastattemptlock', $columns) && empty($columns['lastattemptlock']->not_null)) {
+            // lastattemptlock should be NOT NULL
+            // Fixed in earlier upgrade code
+            $field = new xmldb_field('lastattemptlock', XMLDB_TYPE_INTEGER, 1, null, XMLDB_NOTNULL, null, 0, 'forcenewattempt');
+            if ($dbman->field_exists($table, $field)) {
+                $dbman->change_field_notnull($table, $field);
+            }
+        }
+
+        if (array_key_exists('displayattemptstatus', $columns) && empty($columns['displayattemptstatus']->not_null)) {
+            // displayattemptstatus should be NOT NULL
+            // Fixed in earlier upgrade code
+            $field = new xmldb_field('displayattemptstatus', XMLDB_TYPE_INTEGER, 1, null, XMLDB_NOTNULL, null, 1, 'lastattemptlock');
+            if ($dbman->field_exists($table, $field)) {
+                $dbman->change_field_notnull($table, $field);
+            }
+        }
+
+        if (array_key_exists('displaycoursestructure', $columns) && empty($columns['displaycoursestructure']->not_null)) {
+            // displaycoursestructure should be NOT NULL
+            // Fixed in earlier upgrade code
+            $field = new xmldb_field('displaycoursestructure', XMLDB_TYPE_INTEGER, 1, null, XMLDB_NOTNULL, null, 1, 'displayattemptstatus');
+            if ($dbman->field_exists($table, $field)) {
+                $dbman->change_field_notnull($table, $field);
+            }
+        }
+
+        upgrade_mod_savepoint(true, 2010122300, 'scorm');
+    }
+    
     return true;
 }
 
old mode 100755 (executable)
new mode 100644 (file)
index 43fcfe2..9627651
@@ -6,7 +6,7 @@
 /////////////////////////////////////////////////////////////////////////////////
 
 
-$module->version  = 2010092400;   // The (date) version of this module
+$module->version  = 2010122300;   // The (date) version of this module
 $module->requires = 2010080300;   // The version of Moodle that is required
 $module->cron     = 300;            // How often should cron check this module (seconds)?