From 7e0551fc4515211577a0a4fee2e647ae2d176ea5 Mon Sep 17 00:00:00 2001 From: Jean-Michel Vedrine Date: Sat, 7 Feb 2015 17:40:12 +0100 Subject: [PATCH] MDL-48880 mod_lesson: clean lesson_branch when a page is deleted --- .../moodle2/restore_lesson_stepslib.php | 19 ++++++++++++++++- mod/lesson/db/upgrade.php | 21 +++++++++++++++++++ mod/lesson/locallib.php | 2 ++ mod/lesson/version.php | 2 +- 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/mod/lesson/backup/moodle2/restore_lesson_stepslib.php b/mod/lesson/backup/moodle2/restore_lesson_stepslib.php index e96f24395e2..8edd1ff26a7 100644 --- a/mod/lesson/backup/moodle2/restore_lesson_stepslib.php +++ b/mod/lesson/backup/moodle2/restore_lesson_stepslib.php @@ -255,7 +255,7 @@ class restore_lesson_activity_structure_step extends restore_activity_structure_ } $rs->close(); - // Replay the upgrade step 2015022700 + // Replay the upgrade step 2015030301 // to clean lesson answers that should be plain text. // 1 = LESSON_PAGE_SHORTANSWER, 8 = LESSON_PAGE_NUMERICAL, 20 = LESSON_PAGE_BRANCHTABLE. @@ -275,6 +275,23 @@ class restore_lesson_activity_structure_step extends restore_activity_structure_ } $badanswers->close(); + // Replay the upgrade step 2015032700. + // Delete any orphaned lesson_branch record. + if ($DB->get_dbfamily() === 'mysql') { + $sql = "DELETE {lesson_branch} + FROM {lesson_branch} + LEFT JOIN {lesson_pages} + ON {lesson_branch}.pageid = {lesson_pages}.id + WHERE {lesson_pages}.id IS NULL"; + } else { + $sql = "DELETE FROM {lesson_branch} + WHERE NOT EXISTS ( + SELECT 'x' FROM {lesson_pages} + WHERE {lesson_branch}.pageid = {lesson_pages}.id)"; + } + + $DB->execute($sql); + // Re-map the dependency and activitylink information // If a depency or activitylink has no mapping in the backup data then it could either be a duplication of a // lesson, or a backup/restore of a single lesson. We have no way to determine which and whether this is the diff --git a/mod/lesson/db/upgrade.php b/mod/lesson/db/upgrade.php index 9f9376e846b..ac37e12f09e 100644 --- a/mod/lesson/db/upgrade.php +++ b/mod/lesson/db/upgrade.php @@ -232,5 +232,26 @@ function xmldb_lesson_upgrade($oldversion) { upgrade_mod_savepoint(true, 2015031500, 'lesson'); } + if ($oldversion < 2015032700) { + // Delete any orphaned lesson_branch record. + if ($DB->get_dbfamily() === 'mysql') { + $sql = "DELETE {lesson_branch} + FROM {lesson_branch} + LEFT JOIN {lesson_pages} + ON {lesson_branch}.pageid = {lesson_pages}.id + WHERE {lesson_pages}.id IS NULL"; + } else { + $sql = "DELETE FROM {lesson_branch} + WHERE NOT EXISTS ( + SELECT 'x' FROM {lesson_pages} + WHERE {lesson_branch}.pageid = {lesson_pages}.id)"; + } + + $DB->execute($sql); + + // Lesson savepoint reached. + upgrade_mod_savepoint(true, 2015032700, 'lesson'); + } + return true; } diff --git a/mod/lesson/locallib.php b/mod/lesson/locallib.php index f6783457a32..3525e103001 100644 --- a/mod/lesson/locallib.php +++ b/mod/lesson/locallib.php @@ -2033,6 +2033,8 @@ abstract class lesson_page extends lesson_base { // Then delete all the associated records... $DB->delete_records("lesson_attempts", array("pageid" => $this->properties->id)); + + $DB->delete_records("lesson_branch", array("pageid" => $this->properties->id)); // ...now delete the answers... $DB->delete_records("lesson_answers", array("pageid" => $this->properties->id)); // ..and the page itself diff --git a/mod/lesson/version.php b/mod/lesson/version.php index 1bd6fe51c49..ae457699415 100644 --- a/mod/lesson/version.php +++ b/mod/lesson/version.php @@ -24,7 +24,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2015032401; // The current module version (Date: YYYYMMDDXX) +$plugin->version = 2015032700; // The current module version (Date: YYYYMMDDXX) $plugin->requires = 2014110400; // Requires this Moodle version $plugin->component = 'mod_lesson'; // Full name of the plugin (used for diagnostics) $plugin->cron = 0;