From a461d36010afd3e56f44a72bd0eca7f77e8af8e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Monlla=C3=B3?= Date: Mon, 11 Nov 2019 10:24:46 +0800 Subject: [PATCH] MDL-67187 analytics: Fix broken text comparison --- lib/db/upgrade.php | 3 +-- lib/db/upgradelib.php | 11 ++++++++++ lib/tests/upgradelib_test.php | 41 +++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index aeddaad3e36..857689dd979 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -3756,8 +3756,7 @@ function xmldb_main_upgrade($oldversion) { if ($oldversion < 2019103000.13) { - $DB->execute("UPDATE {analytics_models} set contextids = null - WHERE contextids = :zero or contextids = :null", ['zero' => '0', 'null' => 'null']); + upgrade_analytics_fix_contextids_defaults(); // Main savepoint reached. upgrade_main_savepoint(true, 2019103000.13); diff --git a/lib/db/upgradelib.php b/lib/db/upgradelib.php index 802417a2334..89417ae9f22 100644 --- a/lib/db/upgradelib.php +++ b/lib/db/upgradelib.php @@ -653,3 +653,14 @@ function upgrade_convert_hub_config_site_param_names(stdClass $hubconfig, string return (object) $converted; } + +/** + * Fix the incorrect default values inserted into analytics contextids field. + */ +function upgrade_analytics_fix_contextids_defaults() { + global $DB; + + $select = $DB->sql_compare_text('contextids') . ' = :zero OR ' . $DB->sql_compare_text('contextids') . ' = :null'; + $params = ['zero' => '0', 'null' => 'null']; + $DB->execute("UPDATE {analytics_models} set contextids = null WHERE " . $select, $params); +} diff --git a/lib/tests/upgradelib_test.php b/lib/tests/upgradelib_test.php index 54e4b4dedb4..3aa0ecc4e99 100644 --- a/lib/tests/upgradelib_test.php +++ b/lib/tests/upgradelib_test.php @@ -1172,4 +1172,45 @@ class core_upgradelib_testcase extends advanced_testcase { // Eventual custom values not following the expected hub-specific naming format, are kept. $this->assertSame($converted->custom, 'Do not touch this'); } + + /** + * Test the functionality of the {@link upgrade_analytics_fix_contextids_defaults} function. + */ + public function test_upgrade_analytics_fix_contextids_defaults() { + global $DB, $USER; + + $this->resetAfterTest(); + + $model = (object)[ + 'name' => 'asd', + 'target' => 'ou', + 'indicators' => '[]', + 'version' => '1', + 'timecreated' => time(), + 'timemodified' => time(), + 'usermodified' => $USER->id, + 'contextids' => '' + ]; + $DB->insert_record('analytics_models', $model); + + $model->contextids = null; + $DB->insert_record('analytics_models', $model); + + unset($model->contextids); + $DB->insert_record('analytics_models', $model); + + $model->contextids = '0'; + $DB->insert_record('analytics_models', $model); + + $model->contextids = 'null'; + $DB->insert_record('analytics_models', $model); + + $select = $DB->sql_compare_text('contextids') . ' = :zero OR ' . $DB->sql_compare_text('contextids') . ' = :null'; + $params = ['zero' => '0', 'null' => 'null']; + $this->assertEquals(2, $DB->count_records_select('analytics_models', $select, $params)); + + upgrade_analytics_fix_contextids_defaults(); + + $this->assertEquals(0, $DB->count_records_select('analytics_models', $select, $params)); + } }