Merge branch 'master_MDL-27368' of git://github.com/danmarsden/moodle
authorDan Poltawski <dan@moodle.com>
Mon, 28 May 2012 06:32:16 +0000 (14:32 +0800)
committerDan Poltawski <dan@moodle.com>
Mon, 28 May 2012 06:32:16 +0000 (14:32 +0800)
Conflicts:
version.php
    lib/db/upgrade.php

1  2 
lib/db/upgrade.php
version.php

@@@ -648,5 -648,42 +648,42 @@@ function xmldb_main_upgrade($oldversion
          upgrade_main_savepoint(true, 2012052100.00);
      }
  
 -    if ($oldversion < 2012052500.01) { // fix invalid course_completion_records MDL-27368
++    if ($oldversion < 2012052500.03) { // fix invalid course_completion_records MDL-27368
+         //first get all instances of duplicate records
+         $sql = 'SELECT userid, course FROM {course_completions} WHERE (deleted IS NULL OR deleted <> 1) GROUP BY userid, course HAVING (count(id) > 1)';
+         $duplicates = $DB->get_recordset_sql($sql, array());
+         foreach ($duplicates as $duplicate) {
+             $pointer = 0;
+             //now get all the records for this user/course
+             $sql = 'userid = ? AND course = ? AND (deleted IS NULL OR deleted <> 1)';
+             $completions = $DB->get_records_select('course_completions', $sql,
+                 array($duplicate->userid, $duplicate->course), 'timecompleted DESC, timestarted DESC');
+             $needsupdate = false;
+             $origcompletion = null;
+             foreach ($completions as $completion) {
+                 $pointer++;
+                 if ($pointer === 1) { //keep 1st record but delete all others.
+                     $origcompletion = $completion;
+                 } else {
+                     //we need to keep the "oldest" of all these fields as the valid completion record.
+                     $fieldstocheck = array('timecompleted', 'timestarted', 'timeenrolled');
+                     foreach ($fieldstocheck as $f) {
+                         if ($origcompletion->$f > $completion->$f) {
+                             $origcompletion->$f = $completion->$f;
+                             $needsupdate = true;
+                         }
+                     }
+                     $DB->delete_records('course_completions', array('id'=>$completion->id));
+                 }
+             }
+             if ($needsupdate) {
+                 $DB->update_record('course_completions', $origcompletion);
+             }
+         }
+         // Main savepoint reached
 -        upgrade_main_savepoint(true, 2012052500.01);
++        upgrade_main_savepoint(true, 2012052500.03);
+     }
      return true;
  }
diff --cc version.php
@@@ -30,7 -30,7 +30,7 @@@
  defined('MOODLE_INTERNAL') || die();
  
  
- $version  = 2012052500.02;              // YYYYMMDD      = weekly release date of this DEV branch
 -$version  = 2012052500.01;              // YYYYMMDD      = weekly release date of this DEV branch
++$version  = 2012052500.03;              // YYYYMMDD      = weekly release date of this DEV branch
                                          //         RR    = release increments - 00 in DEV branches
                                          //           .XX = incremental changes