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.

This commit is contained in:
jamiesensei 2008-01-18 14:49:59 +00:00
parent 406af084a3
commit ede67707a6
2 changed files with 66 additions and 40 deletions

View File

@ -30,47 +30,28 @@
// 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);
$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, 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);
// 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.
$parentcontexts = get_parent_contexts($coursecontext);
@ -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){

View File

@ -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;
$status = execute_sql("DELETE FROM {$CFG->prefix}backup_ids
WHERE backup_code = '$backup_unique_code' AND table_name = '$tablename'",false);
// 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 = 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;