MDL-25791 PULL-125 reverting commits that create null problems during upgrade
[moodle.git] / mod / quiz / db / upgrade.php
1 <?php
3 // This file keeps track of upgrades to
4 // the quiz module
5 //
6 // Sometimes, changes between versions involve
7 // alterations to database structures and other
8 // major things that may break installations.
9 //
10 // The upgrade function in this file will attempt
11 // to perform all the necessary actions to upgrade
12 // your older installation to the current version.
13 //
14 // If there's something it cannot do itself, it
15 // will tell you what you need to do.
16 //
17 // The commands in here will all be database-neutral,
18 // using the methods of database_manager class
19 //
20 // Please do not forget to use upgrade_set_timeout()
21 // before any action that may take longer time to finish.
23 function xmldb_quiz_upgrade($oldversion) {
24     global $CFG, $DB;
26     $dbman = $DB->get_manager();
28 //===== 1.9.0 upgrade line ======//
30     if ($oldversion < 2008062000) {
32     /// Define table quiz_report to be created
33         $table = new xmldb_table('quiz_report');
35     /// Adding fields to table quiz_report
36         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
37         $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, null, null, null);
38         $table->add_field('displayorder', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
40     /// Adding keys to table quiz_report
41         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
43     /// Conditionally launch create table for quiz_report
44         if (!$dbman->table_exists($table)) {
45             $dbman->create_table($table);
46         }
48         upgrade_mod_savepoint(true, 2008062000, 'quiz');
49     }
51     if ($oldversion < 2008062001) {
52         $reporttoinsert = new stdClass();
53         $reporttoinsert->name = 'overview';
54         $reporttoinsert->displayorder = 10000;
55         $DB->insert_record('quiz_report', $reporttoinsert);
57         $reporttoinsert = new stdClass();
58         $reporttoinsert->name = 'responses';
59         $reporttoinsert->displayorder = 9000;
60         $DB->insert_record('quiz_report', $reporttoinsert);
62         $reporttoinsert = new stdClass();
63         $reporttoinsert->name = 'regrade';
64         $reporttoinsert->displayorder = 7000;
65         $DB->insert_record('quiz_report', $reporttoinsert);
67         $reporttoinsert = new stdClass();
68         $reporttoinsert->name = 'grading';
69         $reporttoinsert->displayorder = 6000;
70         $DB->insert_record('quiz_report', $reporttoinsert);
72         upgrade_mod_savepoint(true, 2008062001, 'quiz');
73     }
75     if ($oldversion < 2008072402) {
77     /// Define field lastcron to be added to quiz_report
78         $table = new xmldb_table('quiz_report');
79         $field = new xmldb_field('lastcron', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'displayorder');
81     /// Conditionally launch add field lastcron
82         if (!$dbman->field_exists($table, $field)) {
83             $dbman->add_field($table, $field);
84         }
86     /// Define field cron to be added to quiz_report
87         $field = new xmldb_field('cron', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'lastcron');
89     /// Conditionally launch add field cron
90         if (!$dbman->field_exists($table, $field)) {
91             $dbman->add_field($table, $field);
92         }
94     /// quiz savepoint reached
95         upgrade_mod_savepoint(true, 2008072402, 'quiz');
96     }
98     if ($oldversion < 2008072900) {
99     /// Delete the regrade report - it is now part of the overview report.
100         $DB->delete_records('quiz_report', array('name' => 'regrade'));
102     /// quiz savepoint reached
103         upgrade_mod_savepoint(true, 2008072900, 'quiz');
104     }
106     if ($oldversion < 2008081500) {
107     /// Define table quiz_question_versions to be dropped
108         $table = new xmldb_table('quiz_question_versions');
110     /// Launch drop table for quiz_question_versions
111         $dbman->drop_table($table);
113     /// quiz savepoint reached
114         upgrade_mod_savepoint(true, 2008081500, 'quiz');
115     }
117     /// Changing the type of all the columns that store grades to be NUMBER(10, 5) or similar.
118     if ($oldversion < 2008081501) {
119         $table = new xmldb_table('quiz');
120         $field = new xmldb_field('sumgrades', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null, 'questions');
121         $dbman->change_field_type($table, $field);
122         upgrade_mod_savepoint(true, 2008081501, 'quiz');
123     }
125     if ($oldversion < 2008081502) {
126         $table = new xmldb_table('quiz');
127         $field = new xmldb_field('grade', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null, 'sumgrades');
128         $dbman->change_field_type($table, $field);
129         upgrade_mod_savepoint(true, 2008081502, 'quiz');
130     }
132     if ($oldversion < 2008081503) {
133         $table = new xmldb_table('quiz_attempts');
134         $field = new xmldb_field('sumgrades', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null, 'attempt');
135         $dbman->change_field_type($table, $field);
136         upgrade_mod_savepoint(true, 2008081503, 'quiz');
137     }
139     if ($oldversion < 2008081504) {
140         $table = new xmldb_table('quiz_feedback');
141         $field = new xmldb_field('mingrade', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null, 'feedbacktext');
142         $dbman->change_field_type($table, $field);
143         upgrade_mod_savepoint(true, 2008081504, 'quiz');
144     }
146     if ($oldversion < 2008081505) {
147         $table = new xmldb_table('quiz_feedback');
148         $field = new xmldb_field('maxgrade', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null, 'mingrade');
149         $dbman->change_field_type($table, $field);
150         upgrade_mod_savepoint(true, 2008081505, 'quiz');
151     }
153     if ($oldversion < 2008081506) {
154         $table = new xmldb_table('quiz_grades');
155         $field = new xmldb_field('grade', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null, 'userid');
156         $dbman->change_field_type($table, $field);
157         upgrade_mod_savepoint(true, 2008081506, 'quiz');
158     }
160     if ($oldversion < 2008081507) {
161         $table = new xmldb_table('quiz_question_instances');
162         $field = new xmldb_field('grade', XMLDB_TYPE_NUMBER, '12, 7', null, null, null, null, 'question');
163         $dbman->change_field_type($table, $field);
164         upgrade_mod_savepoint(true, 2008081507, 'quiz');
165     }
167     /// Move all of the quiz config settings from $CFG to the config_plugins table.
168     if ($oldversion < 2008082200) {
169         foreach (get_object_vars($CFG) as $name => $value) {
170             if (strpos($name, 'quiz_') === 0) {
171                 $shortname = substr($name, 5);
172                 if ($shortname == 'fix_adaptive') {
173                     // Special case - remove old inconsistency.
174                     $shortname == 'fix_optionflags';
175                 }
176                 set_config($shortname, $value, 'quiz');
177                 unset_config($name);
178             }
179         }
180         upgrade_mod_savepoint(true, 2008082200, 'quiz');
181     }
183     /// Now that the quiz is no longer responsible for creating all the question
184     /// bank tables, and some of the tables are now the responsibility of the
185     /// datasetdependent question type, which did not have a version.php file before,
186     /// we need to say that these tables are already installed, otherwise XMLDB
187     /// will try to create them again and give an error.
188     if ($oldversion < 2008082600) {
189         // Since MDL-16505 was fixed, and we eliminated the datasetdependent
190         // question type, this is now a no-op.
191         upgrade_mod_savepoint(true, 2008082600, 'quiz');
192     }
194     if ($oldversion < 2008112101) {
196     /// Define field lastcron to be added to quiz_report
197         $table = new xmldb_table('quiz_report');
198         $field = new xmldb_field('capability', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'cron');
200     /// Conditionally launch add field lastcron
201         if (!$dbman->field_exists($table, $field)) {
202             $dbman->add_field($table, $field);
203         }
205     /// quiz savepoint reached
206         upgrade_mod_savepoint(true, 2008112101, 'quiz');
207     }
209     if ($oldversion < 2009010700) {
211     /// Define field showuserpicture to be added to quiz
212         $table = new xmldb_table('quiz');
213         $field = new xmldb_field('showuserpicture', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, '0', 'delay2');
215     /// Conditionally launch add field showuserpicture
216         if (!$dbman->field_exists($table, $field)) {
217             $dbman->add_field($table, $field);
218         }
220     /// quiz savepoint reached
221         upgrade_mod_savepoint(true, 2009010700, 'quiz');
222     }
224     if ($oldversion < 2009030900) {
225     /// If there are no quiz settings set to advanced yet, the set up the default
226     /// advanced fields from Moodle 2.0.
227         $quizconfig = get_config('quiz');
228         $arealreadyadvanced = false;
229         foreach (array($quizconfig) as $name => $value) {
230             if (strpos($name, 'fix_') === 0 && !empty($value)) {
231                 $arealreadyadvanced = true;
232                 break;
233             }
234         }
236         if (!$arealreadyadvanced) {
237             set_config('fix_penaltyscheme', 1, 'quiz');
238             set_config('fix_attemptonlast', 1, 'quiz');
239             set_config('fix_questiondecimalpoints', 1, 'quiz');
240             set_config('fix_password', 1, 'quiz');
241             set_config('fix_subnet', 1, 'quiz');
242             set_config('fix_delay1', 1, 'quiz');
243             set_config('fix_delay2', 1, 'quiz');
244             set_config('fix_popup', 1, 'quiz');
245         }
247     /// quiz savepoint reached
248         upgrade_mod_savepoint(true, 2009030900, 'quiz');
249     }
251     if ($oldversion < 2009031000) {
252     /// Add new questiondecimaldigits setting, separate form the overall decimaldigits one.
253         $table = new xmldb_table('quiz');
254         $field = new xmldb_field('questiondecimalpoints', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, '2', 'decimalpoints');
255         if (!$dbman->field_exists($table, $field)) {
256             $dbman->add_field($table, $field);
257         }
259     /// quiz savepoint reached
260         upgrade_mod_savepoint(true, 2009031000, 'quiz');
261     }
263     if ($oldversion < 2009031001) {
264     /// Convert quiz.timelimit from minutes to seconds.
265         $DB->execute('UPDATE {quiz} SET timelimit = timelimit * 60');
266         $default = get_config('quiz', 'timelimit');
267         set_config('timelimit', 60 * $default, 'quiz');
269     /// quiz savepoint reached
270         upgrade_mod_savepoint(true, 2009031001, 'quiz');
271     }
273     if ($oldversion < 2009042000) {
275     /// Define field introformat to be added to quiz
276         $table = new xmldb_table('quiz');
277         $field = new xmldb_field('introformat', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'intro');
279         if (!$dbman->field_exists($table, $field)) {
280             $dbman->add_field($table, $field);
281         }
283         // conditionally migrate to html format in intro
284         if ($CFG->texteditors !== 'textarea') {
285             $rs = $DB->get_recordset('quiz', array('introformat' => FORMAT_MOODLE), '', 'id,intro,introformat');
286             foreach ($rs as $q) {
287                 $q->intro       = text_to_html($q->intro, false, false, true);
288                 $q->introformat = FORMAT_HTML;
289                 $DB->update_record('quiz', $q);
290                 upgrade_set_timeout();
291             }
292             $rs->close();
293         }
295     /// quiz savepoint reached
296         upgrade_mod_savepoint(true, 2009042000, 'quiz');
297     }
299     if ($oldversion < 2010030501) {
300     /// Define table quiz_overrides to be created
301         $table = new xmldb_table('quiz_overrides');
303     /// Adding fields to table quiz_overrides
304         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
305         $table->add_field('quiz', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
306         $table->add_field('groupid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
307         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
308         $table->add_field('timeopen', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
309         $table->add_field('timeclose', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
310         $table->add_field('timelimit', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
311         $table->add_field('attempts', XMLDB_TYPE_INTEGER, '6', XMLDB_UNSIGNED, null, null, null);
312         $table->add_field('password', XMLDB_TYPE_CHAR, '255', null, null, null, null);
314     /// Adding keys to table quiz_overrides
315         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
316         $table->add_key('quiz', XMLDB_KEY_FOREIGN, array('quiz'), 'quiz', array('id'));
317         $table->add_key('groupid', XMLDB_KEY_FOREIGN, array('groupid'), 'groups', array('id'));
318         $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
320     /// Conditionally launch create table for quiz_overrides
321         if (!$dbman->table_exists($table)) {
322             $dbman->create_table($table);
323         }
325     /// quiz savepoint reached
326         upgrade_mod_savepoint(true, 2010030501, 'quiz');
327     }
329     if ($oldversion < 2010051800) {
331         // Define field showblocks to be added to quiz
332         $table = new xmldb_table('quiz');
333         $field = new xmldb_field('showblocks', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, '0', 'showuserpicture');
335         // Conditionally launch add field showblocks
336         if (!$dbman->field_exists($table, $field)) {
337             $dbman->add_field($table, $field);
338         }
340         // quiz savepoint reached
341         upgrade_mod_savepoint(true, 2010051800, 'quiz');
342     }
344     if ($oldversion < 2010080600) {
346         // Define field feedbacktextformat to be added to quiz_feedback
347         $table = new xmldb_table('quiz_feedback');
348         $field = new xmldb_field('feedbacktextformat', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0', 'feedbacktext');
350         // Conditionally launch add field feedbacktextformat
351         if (!$dbman->field_exists($table, $field)) {
352             $dbman->add_field($table, $field);
353         }
355         // This column defaults to FORMAT_MOODLE, which is correct.
357         // quiz savepoint reached
358         upgrade_mod_savepoint(true, 2010080600, 'quiz');
359     }
361     if ($oldversion < 2010102000) {
363         // Define field showblocks to be added to quiz
364         // Repeat this step, because the column was missing from install.xml for a time.
365         $table = new xmldb_table('quiz');
366         $field = new xmldb_field('showblocks', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, '0', 'showuserpicture');
368         // Conditionally launch add field showblocks
369         if (!$dbman->field_exists($table, $field)) {
370             $dbman->add_field($table, $field);
371         }
373         // quiz savepoint reached
374         upgrade_mod_savepoint(true, 2010102000, 'quiz');
375     }
377     return true;