function xmldb_feedback_upgrade($oldversion) { global $CFG, $DB; require_once $CFG->dirroot . '/mod/feedback/db/upgradelib.php'; $dbman = $DB->get_manager(); // Loads ddl manager and xmldb classes. // Moodle v2.8.0 release upgrade line. // Put any upgrade step following this. // Moodle v2.9.0 release upgrade line. // Put any upgrade step following this. // Moodle v3.0.0 release upgrade line. // Put any upgrade step following this. if ($oldversion < 2016031600) { // Remove labels from all 'captcha' and 'label' items. $DB->execute('UPDATE {feedback_item} SET label = ? WHERE typ = ? OR typ = ?', array('', 'captcha', 'label')); // Data savepoint reached. upgrade_mod_savepoint(true, 2016031600, 'feedback'); } if ($oldversion < 2016040100) { // In order to keep the previous "Analysis" results unchanged, // set all multiple-answer multiplechoice questions as "Do not analyse empty submits"="Yes" // because prior to this date this setting did not work. $sql = "UPDATE {feedback_item} SET options = " . $DB->sql_concat('?', 'options') . " WHERE typ = ? AND presentation LIKE ? AND options NOT LIKE ?"; $params = array('i', 'multichoice', 'c%', '%i%'); $DB->execute($sql, $params); // Feedback savepoint reached. upgrade_mod_savepoint(true, 2016040100, 'feedback'); } if ($oldversion < 2016051103) { // Define index completed_item (unique) to be added to feedback_value. $table = new xmldb_table('feedback_value'); $index = new xmldb_index('completed_item', XMLDB_INDEX_UNIQUE, array('completed', 'item', 'course_id')); // Conditionally launch add index completed_item. if (!$dbman->index_exists($table, $index)) { mod_feedback_upgrade_delete_duplicate_values(); $dbman->add_index($table, $index); } // Feedback savepoint reached. upgrade_mod_savepoint(true, 2016051103, 'feedback'); } if ($oldversion < 2016051104) { // Define index completed_item (unique) to be added to feedback_valuetmp. $table = new xmldb_table('feedback_valuetmp'); $index = new xmldb_index('completed_item', XMLDB_INDEX_UNIQUE, array('completed', 'item', 'course_id')); // Conditionally launch add index completed_item. if (!$dbman->index_exists($table, $index)) { mod_feedback_upgrade_delete_duplicate_values(true); $dbman->add_index($table, $index); } // Feedback savepoint reached. upgrade_mod_savepoint(true, 2016051104, 'feedback'); } if ($oldversion < 2016051105) { // Define field courseid to be added to feedback_completed. $table = new xmldb_table('feedback_completed'); $field = new xmldb_field('courseid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'anonymous_response'); // Conditionally launch add field courseid. if (!$dbman->field_exists($table, $field)) { $dbman->add_field($table, $field); // Run upgrade script to fill the new field courseid with the data from feedback_value table. mod_feedback_upgrade_courseid(false); } // Define field courseid to be added to feedback_completedtmp. $table = new xmldb_table('feedback_completedtmp'); $field = new xmldb_field('courseid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'anonymous_response'); // Conditionally launch add field courseid. if (!$dbman->field_exists($table, $field)) { $dbman->add_field($table, $field); // Run upgrade script to fill the new field courseid with the data from feedback_valuetmp table. mod_feedback_upgrade_courseid(true); } // Define table feedback_tracking to be dropped. $table = new xmldb_table('feedback_tracking'); // Conditionally launch drop table for feedback_tracking. if ($dbman->table_exists($table)) { $dbman->drop_table($table); } // Feedback savepoint reached. upgrade_mod_savepoint(true, 2016051105, 'feedback'); } // Moodle v3.1.0 release upgrade line. // Put any upgrade step following this. return true; }
public function test_upgrade_remove_duplicates_tmp() { global $DB; // Remove the index that was added in the upgrade.php AFTER running mod_feedback_upgrade_delete_duplicate_values(). $dbman = $DB->get_manager(); $table = new xmldb_table('feedback_valuetmp'); $index = new xmldb_index('completed_item', XMLDB_INDEX_UNIQUE, array('completed', 'item', 'course_id')); $dbman->drop_index($table, $index); // Insert duplicated values. $completed1 = $DB->insert_record('feedback_completedtmp', ['feedback' => $this->feedback->id, 'userid' => $this->user->id]); $DB->insert_record('feedback_valuetmp', ['completed' => $completed1, 'course_id' => $this->course1->id, 'item' => 1, 'value' => 1]); $DB->insert_record('feedback_valuetmp', ['completed' => $completed1, 'course_id' => $this->course1->id, 'item' => 1, 'value' => 2]); // This is a duplicate with another value. $DB->insert_record('feedback_valuetmp', ['completed' => $completed1, 'course_id' => $this->course1->id, 'item' => 3, 'value' => 1]); $DB->insert_record('feedback_valuetmp', ['completed' => $completed1, 'course_id' => $this->course2->id, 'item' => 3, 'value' => 2]); // This is not a duplicate because course id is different. $this->assertCount(1, $DB->get_records('feedback_completedtmp')); $this->assertEquals(4, $DB->count_records('feedback_valuetmp')); mod_feedback_upgrade_delete_duplicate_values(); // Running script for non-temp tables. $this->assertCount(1, $DB->get_records('feedback_completedtmp')); $this->assertEquals(4, $DB->count_records('feedback_valuetmp')); // Nothing changed. mod_feedback_upgrade_delete_duplicate_values(true); $this->assertCount(1, $DB->get_records('feedback_completedtmp')); // Number of records is the same. $this->assertEquals(3, $DB->count_records('feedback_valuetmp')); // Duplicate was deleted. $this->assertEquals(1, $DB->get_field('feedback_valuetmp', 'value', ['item' => 1])); $dbman->add_index($table, $index); }