From ede67707a6c05228a327003867a0d588ab6d2199 Mon Sep 17 00:00:00 2001 From: jamiesensei Date: Fri, 18 Jan 2008 14:49:59 +0000 Subject: [PATCH] MDL-13034 fixes "insertion of question / category ids at the CONTEXT_MODULE level does not respect whether the instance of the module has been selected for backup" and cleans up code a little. --- mod/quiz/backuplib.php | 52 +++++++++++---------------------------- question/backuplib.php | 56 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 67 insertions(+), 41 deletions(-) diff --git a/mod/quiz/backuplib.php b/mod/quiz/backuplib.php index fe289d3393..526847ec44 100644 --- a/mod/quiz/backuplib.php +++ b/mod/quiz/backuplib.php @@ -30,46 +30,27 @@ // the data about student interaction with the questions. The functions to do // that are included with the following library require_once("$CFG->dirroot/question/backuplib.php"); - + /* - * Insert necessary category ids to backup_ids table. Called during backup_check.html + * Insert necessary category ids to backup_ids table. Called during backup_check.html. + * This backs up ids for quiz module. It backs up : + * all categories and questions in course + * all categories and questions in contexts of quiz module instances which have been selected for backup + * all categories and questions in contexts above course level that are used by quizzes that have been selected for backup */ function insert_category_and_question_ids($course, $backup_unique_code, $instances = null) { global $CFG; - + $status = true; + // Create missing categories and reasign orphaned questions. fix_orphaned_questions($course); - // First, all categories from this course's context. + $coursecontext = get_context_instance(CONTEXT_COURSE, $course); - $status = execute_sql("INSERT INTO {$CFG->prefix}backup_ids - (backup_code, table_name, old_id, info) - SELECT '$backup_unique_code', 'question_categories', qc.id, '' - FROM {$CFG->prefix}question_categories qc - WHERE qc.contextid = {$coursecontext->id}", false); - - - // then, all categories from this course's modules' contexts. - // using 'dummykeyname' in sql because otherwise get_records_sql_menu returns an error - // if two key names are the same. - $cmcontexts = get_records_sql_menu("SELECT c.id, c.id AS dummykeyname FROM {$CFG->prefix}modules m, - {$CFG->prefix}course_modules cm, - {$CFG->prefix}context c - WHERE m.name = 'quiz' AND m.id = cm.module AND cm.id = c.instanceid - AND c.contextlevel = ".CONTEXT_MODULE." AND cm.course = $course"); - if ($cmcontexts){ - $status = $status && execute_sql("INSERT INTO {$CFG->prefix}backup_ids - (backup_code, table_name, old_id, info) - SELECT '$backup_unique_code', 'question_categories', qc.id, '' - FROM {$CFG->prefix}question_categories qc - WHERE qc.contextid IN (".join(array_keys($cmcontexts), ', ').")", false); - } - //put the ids of the questions from all these categories into the db. - $status = $status && execute_sql("INSERT INTO {$CFG->prefix}backup_ids - (backup_code, table_name, old_id, info) - SELECT '$backup_unique_code', 'question', q.id, '' - FROM {$CFG->prefix}question q, {$CFG->prefix}backup_ids bk - WHERE q.category = bk.old_id AND bk.table_name = 'question_categories' AND - bk.backup_code = '$backup_unique_code'", false); + $status = $status && question_insert_c_and_q_ids_for_course($coursecontext, $backup_unique_code); + + // then, all categories and questions from this course's modules' contexts. + $status = $status && question_insert_c_and_q_ids_for_module($backup_unique_code, $course, 'quiz', $instances); + // Then categories from parent contexts used by the quizzes we are backing up. //TODO this will need generalising when we have modules other than quiz using shared questions above course level. @@ -176,7 +157,7 @@ } return $status; } - + /** * Helper function adding the id of all the subcategories of a category to an array. */ @@ -517,9 +498,6 @@ ////Return an array of info (name,value) /// $instances is an array with key = instanceid, value = object (name,id,userdata) function quiz_check_backup_mods($course,$user_data= false,$backup_unique_code,$instances=null) { - //Deletes data from mdl_backup_ids (categories section) - delete_ids ($backup_unique_code, 'question_categories'); - delete_ids ($backup_unique_code, 'question'); //this function selects all the questions / categories to be backed up. insert_category_and_question_ids($course, $backup_unique_code, $instances); if ($course != SITEID){ diff --git a/question/backuplib.php b/question/backuplib.php index a6fb5655b4..c56214375d 100644 --- a/question/backuplib.php +++ b/question/backuplib.php @@ -423,14 +423,62 @@ WHERE backup_code = '$backup_unique_code' AND table_name = 'question'"); } + + //Function for inserting question and category ids into db that are all called from + // quiz_check_backup_mods during execution of backup_check.html - //Delete category ids from backup_ids table - function delete_ids ($backup_unique_code, $tablename) { + + function question_insert_c_and_q_ids_for_course($coursecontext, $backup_unique_code){ + global $CFG; + // First, all categories from this course's context. + $status = execute_sql("INSERT INTO {$CFG->prefix}backup_ids + (backup_code, table_name, old_id, info) + SELECT '$backup_unique_code', 'question_categories', qc.id, 'course' + FROM {$CFG->prefix}question_categories qc + WHERE qc.contextid = {$coursecontext->id}", false); + $status = $status && question_insert_q_ids($backup_unique_code, 'course'); + return $status; + } + /* + * Insert all question ids for categories whose ids have already been inserted in the backup_ids table + * Insert code to identify categories to later insert all question ids later eg. course, quiz or other module name. + */ + function question_insert_q_ids($backup_unique_code, $info){ + global $CFG; + //put the ids of the questions from all these categories into the db. + $status = execute_sql("INSERT INTO {$CFG->prefix}backup_ids + (backup_code, table_name, old_id, info) + SELECT '$backup_unique_code', 'question', q.id, '' + FROM {$CFG->prefix}question q, {$CFG->prefix}backup_ids bk + WHERE q.category = bk.old_id AND bk.table_name = 'question_categories' + AND bk.info = '$info' + AND bk.backup_code = '$backup_unique_code'", false); + return $status; + } + + function question_insert_c_and_q_ids_for_module($backup_unique_code, $course, $modulename, $instances){ global $CFG; - $status = execute_sql("DELETE FROM {$CFG->prefix}backup_ids - WHERE backup_code = '$backup_unique_code' AND table_name = '$tablename'",false); + $status = true; + // using 'dummykeyname' in sql because otherwise get_records_sql_menu returns an error + // if two key names are the same. + $cmcontexts = get_records_sql_menu("SELECT c.id, c.id AS dummykeyname FROM {$CFG->prefix}modules m, + {$CFG->prefix}course_modules cm, + {$CFG->prefix}context c + WHERE m.name = 'quiz' AND m.id = cm.module AND cm.id = c.instanceid + AND c.contextlevel = ".CONTEXT_MODULE." AND cm.course = $course + AND cm.instance IN (".implode(',',array_keys($instances)).")"); + + if ($cmcontexts){ + $status = $status && execute_sql("INSERT INTO {$CFG->prefix}backup_ids + (backup_code, table_name, old_id, info) + SELECT '$backup_unique_code', 'question_categories', qc.id, '$modulename' + FROM {$CFG->prefix}question_categories qc + WHERE qc.contextid IN (".join(array_keys($cmcontexts), ', ').")", false); + } + $status = $status && question_insert_q_ids($backup_unique_code, $modulename); return $status; } + function question_insert_site_file_names($course, $backup_unique_code){ global $QTYPES, $CFG; $status = true; -- 2.39.5