MDL-49247 question restore: avoid unique key errors from old bad data

Several tables have had unique keys added to enforce a constraint that
should always have been there. It is possible for old sites to have
data that violate the constraints, and sometimes people want to backup
data from those old sites, and restore them into a new Moodle.
Therefore, we need to guard agains the unique key violation errors.
This commit is contained in:
Tim Hunt 2015-02-19 21:46:56 +00:00
parent 95751e81ac
commit 8def548b8d
4 changed files with 28 additions and 14 deletions

View file

@ -104,8 +104,13 @@ class restore_qtype_match_plugin extends restore_qtype_plugin {
// Adjust some columns. // Adjust some columns.
$data->questionid = $newquestionid; $data->questionid = $newquestionid;
$newitemid = $DB->insert_record('qtype_match_options', $data);
$this->set_mapping('qtype_match_options', $oldid, $newitemid); // It is possible for old backup files to contain unique key violations.
// We need to check to avoid that.
if (!$DB->record_exists('qtype_match_options', array('questionid' => $data->questionid))) {
$newitemid = $DB->insert_record('qtype_match_options', $data);
$this->set_mapping('qtype_match_options', $oldid, $newitemid);
}
} }
} }

View file

@ -70,12 +70,14 @@ class restore_qtype_multichoice_plugin extends restore_qtype_plugin {
// If the question has been created by restore, we need to create its // If the question has been created by restore, we need to create its
// qtype_multichoice_options too. // qtype_multichoice_options too.
if ($questioncreated) { if ($questioncreated) {
// Adjust some columns.
$data->questionid = $newquestionid; $data->questionid = $newquestionid;
// Insert record.
$newitemid = $DB->insert_record('qtype_multichoice_options', $data); // It is possible for old backup files to contain unique key violations.
// Create mapping (needed for decoding links). // We need to check to avoid that.
$this->set_mapping('qtype_multichoice_options', $oldid, $newitemid); if (!$DB->record_exists('qtype_multichoice_options', array('questionid' => $data->questionid))) {
$newitemid = $DB->insert_record('qtype_multichoice_options', $data);
$this->set_mapping('qtype_multichoice_options', $oldid, $newitemid);
}
} }
} }

View file

@ -86,12 +86,14 @@ class restore_qtype_randomsamatch_plugin extends restore_qtype_plugin {
if (!isset($data->shownumcorrect)) { if (!isset($data->shownumcorrect)) {
$data->shownumcorrect = 0; $data->shownumcorrect = 0;
} }
// Adjust some columns.
$data->questionid = $newquestionid; $data->questionid = $newquestionid;
// Insert record.
$newitemid = $DB->insert_record('qtype_randomsamatch_options', $data); // It is possible for old backup files to contain unique key violations.
// Create mapping. // We need to check to avoid that.
$this->set_mapping('qtype_randomsamatch_options', $oldid, $newitemid); if (!$DB->record_exists('qtype_randomsamatch_options', array('questionid' => $data->questionid))) {
$newitemid = $DB->insert_record('qtype_randomsamatch_options', $data);
$this->set_mapping('qtype_randomsamatch_options', $oldid, $newitemid);
}
} }
} }

View file

@ -71,8 +71,13 @@ class restore_qtype_shortanswer_plugin extends restore_qtype_plugin {
// qtype_shortanswer_options too, if they are defined (the gui should ensure this). // qtype_shortanswer_options too, if they are defined (the gui should ensure this).
if ($questioncreated) { if ($questioncreated) {
$data->questionid = $newquestionid; $data->questionid = $newquestionid;
$newitemid = $DB->insert_record('qtype_shortanswer_options', $data);
$this->set_mapping('qtype_shortanswer_options', $oldid, $newitemid); // It is possible for old backup files to contain unique key violations.
// We need to check to avoid that.
if (!$DB->record_exists('qtype_shortanswer_options', array('questionid' => $data->questionid))) {
$newitemid = $DB->insert_record('qtype_shortanswer_options', $data);
$this->set_mapping('qtype_shortanswer_options', $oldid, $newitemid);
}
} }
} }
} }