Skip to content

Commit

Permalink
MDL-29332 question: calculated variables may differ in case only
Browse files Browse the repository at this point in the history
  • Loading branch information
marinaglancy committed Sep 13, 2016
1 parent b022c2c commit bc48deb
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 15 deletions.
5 changes: 1 addition & 4 deletions lib/db/install.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<XMLDB PATH="lib/db" VERSION="20150922" COMMENT="XMLDB file for core Moodle tables"
<XMLDB PATH="lib/db" VERSION="20160804" COMMENT="XMLDB file for core Moodle tables"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../lib/xmldb/xmldb.xsd"
>
Expand Down Expand Up @@ -1352,9 +1352,6 @@
<KEY NAME="primary" TYPE="primary" FIELDS="id"/>
<KEY NAME="attemptstepid" TYPE="foreign" FIELDS="attemptstepid" REFTABLE="question_attempt_steps" REFFIELDS="id"/>
</KEYS>
<INDEXES>
<INDEX NAME="attemptstepid-name" UNIQUE="true" FIELDS="attemptstepid, name"/>
</INDEXES>
</TABLE>
<TABLE NAME="question_statistics" COMMENT="Statistics for individual questions used in an activity.">
<FIELDS>
Expand Down
15 changes: 15 additions & 0 deletions lib/db/upgrade.php
Expand Up @@ -4700,5 +4700,20 @@ function xmldb_main_upgrade($oldversion) {
upgrade_main_savepoint(true, 2015111605.07);
}

if ($oldversion < 2015111606.01) {

// Define index attemptstepid-name (unique) to be dropped from question_attempt_step_data.
$table = new xmldb_table('question_attempt_step_data');
$index = new xmldb_index('attemptstepid-name', XMLDB_INDEX_UNIQUE, array('attemptstepid', 'name'));

// Conditionally launch drop index attemptstepid-name.
if ($dbman->index_exists($table, $index)) {
$dbman->drop_index($table, $index);
}

// Main savepoint reached.
upgrade_main_savepoint(true, 2015111606.01);
}

return true;
}
15 changes: 12 additions & 3 deletions question/engine/datalib.php
Expand Up @@ -287,10 +287,19 @@ public function insert_question_attempt_metadata(question_attempt $qa, array $na
*/
public function update_question_attempt_metadata(question_attempt $qa, array $names) {
global $DB;
list($condition, $params) = $DB->get_in_or_equal($names);
$params[] = $qa->get_step(0)->get_id();
if (!$names) {
return [];
}
// Use case-sensitive LIKE instead of get_in_or_equal.
// Some databases may use case-insensitive collation, we don't want to delete 'X' instead of 'x'.
$sqls = [];
$params = [$qa->get_step(0)->get_id()];
foreach ($names as $name) {
$sqls[] = $DB->sql_like('name', '?', true);
$params[] = $DB->sql_like_escape($name);
}
$DB->delete_records_select('question_attempt_step_data',
'name ' . $condition . ' AND attemptstepid = ?', $params);
'attemptstepid = ? AND (' . join(' OR ', $sqls) . ')', $params);
return $this->insert_question_attempt_metadata($qa, $names);
}

Expand Down
15 changes: 8 additions & 7 deletions question/type/calculated/questiontype.php
Expand Up @@ -281,9 +281,9 @@ public function import_datasets($question) {
if ($sharedatasetdefs = $DB->get_records_select(
'question_dataset_definitions',
"type = '1'
AND name = ?
AND " . $DB->sql_like('name', '?') . "
AND category = ?
ORDER BY id DESC ", array($dataset->name, $question->category)
ORDER BY id DESC ", array($DB->sql_like_escape($dataset->name), $question->category)
)) { // So there is at least one.
$sharedatasetdef = array_shift($sharedatasetdefs);
if ($sharedatasetdef->options == $datasetdef->options) {// Identical so use it.
Expand Down Expand Up @@ -1400,9 +1400,9 @@ public function save_as_new_dataset_definitions($form, $initialid) {
// can manage to automatically take care of
// some possible realtime concurrence.
if ($olderdatasetdefs = $DB->get_records_select('question_dataset_definitions',
"type = ? AND name = ? AND category = ? AND id < ?
"type = ? AND " . $DB->sql_like('name', '?') . " AND category = ? AND id < ?
ORDER BY id DESC",
array($datasetdef->type, $datasetdef->name,
array($datasetdef->type, $DB->sql_like_escape($datasetdef->name),
$datasetdef->category, $datasetdef->id))) {

while ($olderdatasetdef = array_shift($olderdatasetdefs)) {
Expand Down Expand Up @@ -1484,8 +1484,9 @@ public function dataset_options_from_database($form, $name, $prefix = '',
// Construct question local options.
$sql = "SELECT a.*
FROM {question_dataset_definitions} a, {question_datasets} b
WHERE a.id = b.datasetdefinition AND a.type = '1' AND b.question = ? AND a.name = ?";
$currentdatasetdef = $DB->get_record_sql($sql, array($form->id, $name));
WHERE a.id = b.datasetdefinition AND a.type = '1' AND b.question = ? AND ".
$DB->sql_like('a.name', '?');
$currentdatasetdef = $DB->get_record_sql($sql, array($form->id, $DB->sql_like_escape($name)));
if (!$currentdatasetdef) {
$currentdatasetdef = new stdClass();
$currentdatasetdef->type = '0';
Expand All @@ -1506,7 +1507,7 @@ public function dataset_options_from_database($form, $name, $prefix = '',
WHERE a.id = b.datasetdefinition
AND a.type = '1'
AND a.category = ?
AND a.name = ?", array($form->category, $name));
AND " . $DB->sql_like('a.name', '?'), array($form->category, $DB->sql_like_escape($name)));
$type = 1;
$key = "{$type}-{$form->category}-{$name}";
if (!empty($categorydatasetdefs)) {
Expand Down
2 changes: 1 addition & 1 deletion version.php
Expand Up @@ -29,7 +29,7 @@

defined('MOODLE_INTERNAL') || die();

$version = 2015111606.00; // 20151116 = branching date YYYYMMDD - do not modify!
$version = 2015111606.01; // 20151116 = branching date YYYYMMDD - do not modify!
// RR = release increments - 00 in DEV branches.
// .XX = incremental changes.

Expand Down

0 comments on commit bc48deb

Please sign in to comment.