Permalink
Browse files

MDL-27368 Clean up invalid course completion records

 keep oldest timestamps from all records
  • Loading branch information...
1 parent 4631e39 commit d2e3a1b4f9c1f568a23d972402f4c5747b5f73cb @danmarsden danmarsden committed Mar 19, 2012
Showing with 38 additions and 1 deletion.
  1. +37 −0 lib/db/upgrade.php
  2. +1 −1 version.php
View
@@ -648,5 +648,42 @@ function xmldb_main_upgrade($oldversion) {
upgrade_main_savepoint(true, 2012052100.00);
}
+ if ($oldversion < 2012052500.01) { // 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);
+ }
return true;
}
View
@@ -30,7 +30,7 @@
defined('MOODLE_INTERNAL') || die();
-$version = 2012052500.00; // YYYYMMDD = weekly release date of this DEV branch
+$version = 2012052500.01; // YYYYMMDD = weekly release date of this DEV branch
// RR = release increments - 00 in DEV branches
// .XX = incremental changes

0 comments on commit d2e3a1b

Please sign in to comment.