From fb0814ac14759774ba025051b05f07ba9875ccd8 Mon Sep 17 00:00:00 2001 From: Dan Marsden Date: Mon, 26 Mar 2012 11:20:34 +1300 Subject: [PATCH] MDL-27368 Clean up invalid course completion records keep oldest timestamps from all records --- lib/db/upgrade.php | 38 ++++++++++++++++++++++++++++++++++++++ version.php | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index 2b7b6503464..774fe5abdec 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -6782,5 +6782,43 @@ FROM upgrade_main_savepoint(true, 2011070105.08); } + if ($oldversion < 2011070106.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,2011070106.03); + } + return true; } diff --git a/version.php b/version.php index 32be518e8fa..820fc9597a0 100644 --- a/version.php +++ b/version.php @@ -30,7 +30,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2011070106.02; // 20110701 = branching date YYYYMMDD - do not modify! +$version = 2011070106.03; // 20110701 = branching date YYYYMMDD - do not modify! // RR = release increments - 00 in DEV branches // .XX = incremental changes