43e8d70a8f770c9f496ef3e0f089da9dee16a8f5
[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 /**
24  * @param int $oldversion
25  * @return bool 
26  */
27 function xmldb_quiz_upgrade($oldversion) {
28     global $CFG, $DB;
30     $dbman = $DB->get_manager();
32 //===== 1.9.0 upgrade line ======//
34     if ($oldversion < 2008062000) {
36     /// Define table quiz_report to be created
37         $table = new xmldb_table('quiz_report');
39     /// Adding fields to table quiz_report
40         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
41         $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, null, null, null);
42         $table->add_field('displayorder', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
44     /// Adding keys to table quiz_report
45         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
47     /// Conditionally launch create table for quiz_report
48         if (!$dbman->table_exists($table)) {
49             $dbman->create_table($table);
50         }
52         upgrade_mod_savepoint(true, 2008062000, 'quiz');
53     }
55     if ($oldversion < 2008062001) {
56         $reporttoinsert = new stdClass();
57         $reporttoinsert->name = 'overview';
58         $reporttoinsert->displayorder = 10000;
59         $DB->insert_record('quiz_report', $reporttoinsert);
61         $reporttoinsert = new stdClass();
62         $reporttoinsert->name = 'responses';
63         $reporttoinsert->displayorder = 9000;
64         $DB->insert_record('quiz_report', $reporttoinsert);
66         $reporttoinsert = new stdClass();
67         $reporttoinsert->name = 'regrade';
68         $reporttoinsert->displayorder = 7000;
69         $DB->insert_record('quiz_report', $reporttoinsert);
71         $reporttoinsert = new stdClass();
72         $reporttoinsert->name = 'grading';
73         $reporttoinsert->displayorder = 6000;
74         $DB->insert_record('quiz_report', $reporttoinsert);
76         upgrade_mod_savepoint(true, 2008062001, 'quiz');
77     }
79     if ($oldversion < 2008072402) {
81     /// Define field lastcron to be added to quiz_report
82         $table = new xmldb_table('quiz_report');
83         $field = new xmldb_field('lastcron', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'displayorder');
85     /// Conditionally launch add field lastcron
86         if (!$dbman->field_exists($table, $field)) {
87             $dbman->add_field($table, $field);
88         }
90     /// Define field cron to be added to quiz_report
91         $field = new xmldb_field('cron', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'lastcron');
93     /// Conditionally launch add field cron
94         if (!$dbman->field_exists($table, $field)) {
95             $dbman->add_field($table, $field);
96         }
98     /// quiz savepoint reached
99         upgrade_mod_savepoint(true, 2008072402, 'quiz');
100     }
102     if ($oldversion < 2008072900) {
103     /// Delete the regrade report - it is now part of the overview report.
104         $DB->delete_records('quiz_report', array('name' => 'regrade'));
106     /// quiz savepoint reached
107         upgrade_mod_savepoint(true, 2008072900, 'quiz');
108     }
110     if ($oldversion < 2008081500) {
111     /// Define table quiz_question_versions to be dropped
112         $table = new xmldb_table('quiz_question_versions');
114     /// Launch drop table for quiz_question_versions
115         $dbman->drop_table($table);
117     /// quiz savepoint reached
118         upgrade_mod_savepoint(true, 2008081500, 'quiz');
119     }
121     /// Changing the type of all the columns that store grades to be NUMBER(10, 5) or similar.
122     if ($oldversion < 2008081501) {
123         $table = new xmldb_table('quiz');
124         $field = new xmldb_field('sumgrades', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, '0', 'questions');
125         $dbman->change_field_type($table, $field);
126         upgrade_mod_savepoint(true, 2008081501, 'quiz');
127     }
129     if ($oldversion < 2008081502) {
130         $table = new xmldb_table('quiz');
131         $field = new xmldb_field('grade', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, '0', 'sumgrades');
132         $dbman->change_field_type($table, $field);
133         upgrade_mod_savepoint(true, 2008081502, 'quiz');
134     }
136     if ($oldversion < 2008081503) {
137         $table = new xmldb_table('quiz_attempts');
138         $field = new xmldb_field('sumgrades', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, '0', 'attempt');
139         $dbman->change_field_type($table, $field);
140         upgrade_mod_savepoint(true, 2008081503, 'quiz');
141     }
143     if ($oldversion < 2008081504) {
144         $table = new xmldb_table('quiz_feedback');
145         $field = new xmldb_field('mingrade', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, '0', 'feedbacktext');
146         $dbman->change_field_type($table, $field);
147         upgrade_mod_savepoint(true, 2008081504, 'quiz');
148     }
150     if ($oldversion < 2008081505) {
151         $table = new xmldb_table('quiz_feedback');
152         $field = new xmldb_field('maxgrade', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, '0', 'mingrade');
153         $dbman->change_field_type($table, $field);
154         upgrade_mod_savepoint(true, 2008081505, 'quiz');
155     }
157     if ($oldversion < 2008081506) {
158         $table = new xmldb_table('quiz_grades');
159         $field = new xmldb_field('grade', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, '0', 'userid');
160         $dbman->change_field_type($table, $field);
161         upgrade_mod_savepoint(true, 2008081506, 'quiz');
162     }
164     if ($oldversion < 2008081507) {
165         $table = new xmldb_table('quiz_question_instances');
166         $field = new xmldb_field('grade', XMLDB_TYPE_NUMBER, '12, 7', null, XMLDB_NOTNULL, null, '0', 'question');
167         $dbman->change_field_type($table, $field);
168         upgrade_mod_savepoint(true, 2008081507, 'quiz');
169     }
171     /// Move all of the quiz config settings from $CFG to the config_plugins table.
172     if ($oldversion < 2008082200) {
173         foreach (get_object_vars($CFG) as $name => $value) {
174             if (strpos($name, 'quiz_') === 0) {
175                 $shortname = substr($name, 5);
176                 if ($shortname == 'fix_adaptive') {
177                     // Special case - remove old inconsistency.
178                     $shortname == 'fix_optionflags';
179                 }
180                 set_config($shortname, $value, 'quiz');
181                 unset_config($name);
182             }
183         }
184         upgrade_mod_savepoint(true, 2008082200, 'quiz');
185     }
187     /// Now that the quiz is no longer responsible for creating all the question
188     /// bank tables, and some of the tables are now the responsibility of the
189     /// datasetdependent question type, which did not have a version.php file before,
190     /// we need to say that these tables are already installed, otherwise XMLDB
191     /// will try to create them again and give an error.
192     if ($oldversion < 2008082600) {
193         // Since MDL-16505 was fixed, and we eliminated the datasetdependent
194         // question type, this is now a no-op.
195         upgrade_mod_savepoint(true, 2008082600, 'quiz');
196     }
198     if ($oldversion < 2008112101) {
200     /// Define field lastcron to be added to quiz_report
201         $table = new xmldb_table('quiz_report');
202         $field = new xmldb_field('capability', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'cron');
204     /// Conditionally launch add field lastcron
205         if (!$dbman->field_exists($table, $field)) {
206             $dbman->add_field($table, $field);
207         }
209     /// quiz savepoint reached
210         upgrade_mod_savepoint(true, 2008112101, 'quiz');
211     }
213     if ($oldversion < 2009010700) {
215     /// Define field showuserpicture to be added to quiz
216         $table = new xmldb_table('quiz');
217         $field = new xmldb_field('showuserpicture', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, '0', 'delay2');
219     /// Conditionally launch add field showuserpicture
220         if (!$dbman->field_exists($table, $field)) {
221             $dbman->add_field($table, $field);
222         }
224     /// quiz savepoint reached
225         upgrade_mod_savepoint(true, 2009010700, 'quiz');
226     }
228     if ($oldversion < 2009030900) {
229     /// If there are no quiz settings set to advanced yet, the set up the default
230     /// advanced fields from Moodle 2.0.
231         $quizconfig = get_config('quiz');
232         $arealreadyadvanced = false;
233         foreach (array($quizconfig) as $name => $value) {
234             if (strpos($name, 'fix_') === 0 && !empty($value)) {
235                 $arealreadyadvanced = true;
236                 break;
237             }
238         }
240         if (!$arealreadyadvanced) {
241             set_config('fix_penaltyscheme', 1, 'quiz');
242             set_config('fix_attemptonlast', 1, 'quiz');
243             set_config('fix_questiondecimalpoints', 1, 'quiz');
244             set_config('fix_password', 1, 'quiz');
245             set_config('fix_subnet', 1, 'quiz');
246             set_config('fix_delay1', 1, 'quiz');
247             set_config('fix_delay2', 1, 'quiz');
248             set_config('fix_popup', 1, 'quiz');
249         }
251     /// quiz savepoint reached
252         upgrade_mod_savepoint(true, 2009030900, 'quiz');
253     }
255     if ($oldversion < 2009031000) {
256     /// Add new questiondecimaldigits setting, separate form the overall decimaldigits one.
257         $table = new xmldb_table('quiz');
258         $field = new xmldb_field('questiondecimalpoints', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, '-2', 'decimalpoints');
259         if (!$dbman->field_exists($table, $field)) {
260             $dbman->add_field($table, $field);
261         }
263     /// quiz savepoint reached
264         upgrade_mod_savepoint(true, 2009031000, 'quiz');
265     }
267     if ($oldversion < 2009031001) {
268     /// Convert quiz.timelimit from minutes to seconds.
269         $DB->execute('UPDATE {quiz} SET timelimit = timelimit * 60');
270         $default = get_config('quiz', 'timelimit');
271         set_config('timelimit', 60 * $default, 'quiz');
273     /// quiz savepoint reached
274         upgrade_mod_savepoint(true, 2009031001, 'quiz');
275     }
277     if ($oldversion < 2009042000) {
279     /// Define field introformat to be added to quiz
280         $table = new xmldb_table('quiz');
281         $field = new xmldb_field('introformat', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'intro');
283         if (!$dbman->field_exists($table, $field)) {
284             $dbman->add_field($table, $field);
285         }
287         // conditionally migrate to html format in intro
288         if ($CFG->texteditors !== 'textarea') {
289             $rs = $DB->get_recordset('quiz', array('introformat' => FORMAT_MOODLE), '', 'id,intro,introformat');
290             foreach ($rs as $q) {
291                 $q->intro       = text_to_html($q->intro, false, false, true);
292                 $q->introformat = FORMAT_HTML;
293                 $DB->update_record('quiz', $q);
294                 upgrade_set_timeout();
295             }
296             $rs->close();
297         }
299     /// quiz savepoint reached
300         upgrade_mod_savepoint(true, 2009042000, 'quiz');
301     }
303     if ($oldversion < 2010030501) {
304     /// Define table quiz_overrides to be created
305         $table = new xmldb_table('quiz_overrides');
307     /// Adding fields to table quiz_overrides
308         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
309         $table->add_field('quiz', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
310         $table->add_field('groupid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
311         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
312         $table->add_field('timeopen', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
313         $table->add_field('timeclose', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
314         $table->add_field('timelimit', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
315         $table->add_field('attempts', XMLDB_TYPE_INTEGER, '6', XMLDB_UNSIGNED, null, null, null);
316         $table->add_field('password', XMLDB_TYPE_CHAR, '255', null, null, null, null);
318     /// Adding keys to table quiz_overrides
319         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
320         $table->add_key('quiz', XMLDB_KEY_FOREIGN, array('quiz'), 'quiz', array('id'));
321         $table->add_key('groupid', XMLDB_KEY_FOREIGN, array('groupid'), 'groups', array('id'));
322         $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
324     /// Conditionally launch create table for quiz_overrides
325         if (!$dbman->table_exists($table)) {
326             $dbman->create_table($table);
327         }
329     /// quiz savepoint reached
330         upgrade_mod_savepoint(true, 2010030501, 'quiz');
331     }
333     if ($oldversion < 2010051800) {
335         // Define field showblocks to be added to quiz
336         $table = new xmldb_table('quiz');
337         $field = new xmldb_field('showblocks', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, '0', 'showuserpicture');
339         // Conditionally launch add field showblocks
340         if (!$dbman->field_exists($table, $field)) {
341             $dbman->add_field($table, $field);
342         }
344         // quiz savepoint reached
345         upgrade_mod_savepoint(true, 2010051800, 'quiz');
346     }
348     if ($oldversion < 2010080600) {
350         // Define field feedbacktextformat to be added to quiz_feedback
351         $table = new xmldb_table('quiz_feedback');
352         $field = new xmldb_field('feedbacktextformat', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0', 'feedbacktext');
354         // Conditionally launch add field feedbacktextformat
355         if (!$dbman->field_exists($table, $field)) {
356             $dbman->add_field($table, $field);
357         }
359         // This column defaults to FORMAT_MOODLE, which is correct.
361         // quiz savepoint reached
362         upgrade_mod_savepoint(true, 2010080600, 'quiz');
363     }
365     if ($oldversion < 2010102000) {
367         // Define field showblocks to be added to quiz
368         // Repeat this step, because the column was missing from install.xml for a time.
369         $table = new xmldb_table('quiz');
370         $field = new xmldb_field('showblocks', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, '0', 'showuserpicture');
372         // Conditionally launch add field showblocks
373         if (!$dbman->field_exists($table, $field)) {
374             $dbman->add_field($table, $field);
375         }
377         // quiz savepoint reached
378         upgrade_mod_savepoint(true, 2010102000, 'quiz');
379     }
381     if ($oldversion < 2011011400) {
382         // Fix quiz in the post table after upgrade from 1.9
383         $table = new xmldb_table('quiz');
384         $columns = $DB->get_columns('quiz');
386         if (array_key_exists('questiondecimalpoints', $columns) && $columns['questiondecimalpoints']->default_value != '-2') {
387             // questiondecimalpoints should be default -2
388             // Fixed in earlier upgrade code
389             $field = new xmldb_field('questiondecimalpoints', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, -2, 'decimalpoints');
390             if ($dbman->field_exists($table, $field)) {
391                 $dbman->change_field_default($table, $field);
392             }
393         }
395         if (array_key_exists('sumgrades', $columns) && empty($columns['sumgrades']->not_null)) {
396             // sumgrades should be NOT NULL DEFAULT '0.0000000',
397             // Fixed in earlier upgrade code
398             $field = new xmldb_field('sumgrades', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, '0', 'questions');
399             if ($dbman->field_exists($table, $field)) {
400                 $dbman->change_field_default($table, $field);
401             }
402         }
404         if (array_key_exists('grade', $columns) && empty($columns['grade']->not_null)) {
405             // grade should be NOT NULL DEFAULT '0.0000000',
406             // Fixed in earlier upgrade code
407             $field = new xmldb_field('grade', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, '0', 'sumgrades');
408             if ($dbman->field_exists($table, $field)) {
409                 $dbman->change_field_default($table, $field);
410             }
411         }
413         upgrade_mod_savepoint(true, 2011011400, 'quiz');
414     }
416     if ($oldversion < 2011011401) {
417         // Fix quiz_attempts in the post table after upgrade from 1.9
418         $table = new xmldb_table('quiz_attempts');
419         $columns = $DB->get_columns('quiz_attempts');
421         if (array_key_exists('sumgrades', $columns) && empty($columns['sumgrades']->not_null)) {
422             // sumgrades should be NOT NULL DEFAULT '0.0000000',
423             // Fixed in earlier upgrade code
424             $field = new xmldb_field('sumgrades', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, '0', 'attempt');
425             if ($dbman->field_exists($table, $field)) {
426                 $dbman->change_field_default($table, $field);
427             }
428         }
430         upgrade_mod_savepoint(true, 2011011401, 'quiz');
431     }
433     if ($oldversion < 2011011402) {
434         // Fix quiz_feedback in the post table after upgrade from 1.9
435         $table = new xmldb_table('quiz_feedback');
436         $columns = $DB->get_columns('quiz_feedback');
438         if (array_key_exists('mingrade', $columns) && empty($columns['mingrade']->not_null)) {
439             // mingrade should be NOT NULL DEFAULT '0.0000000',
440             // Fixed in earlier upgrade code
441             $field = new xmldb_field('mingrade', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, '0', 'feedbacktextformat');
442             if ($dbman->field_exists($table, $field)) {
443                 $dbman->change_field_default($table, $field);
444             }
445         }
447         if (array_key_exists('maxgrade', $columns) && empty($columns['maxgrade']->not_null)) {
448             // maxgrade should be NOT NULL DEFAULT '0.0000000',
449             // Fixed in earlier upgrade code
450             $field = new xmldb_field('maxgrade', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, '0', 'mingrade');
451             if ($dbman->field_exists($table, $field)) {
452                 $dbman->change_field_default($table, $field);
453             }
454         }
456         upgrade_mod_savepoint(true, 2011011402, 'quiz');
457     }
459     if ($oldversion < 2011011403) {
460         // Fix quiz_grades in the post table after upgrade from 1.9
461         $table = new xmldb_table('quiz_grades');
462         $columns = $DB->get_columns('quiz_grades');
464         if (array_key_exists('grade', $columns) && empty($columns['grade']->not_null)) {
465             // grade should be NOT NULL DEFAULT '0.0000000',
466             // Fixed in earlier upgrade code
467             $field = new xmldb_field('grade', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, '0', 'userid');
468             if ($dbman->field_exists($table, $field)) {
469                 $dbman->change_field_default($table, $field);
470             }
471         }
473         upgrade_mod_savepoint(true, 2011011403, 'quiz');
474     }
476     if ($oldversion < 2011011404) {
477         // Fix quiz_question_instances in the post table after upgrade from 1.9
478         $table = new xmldb_table('quiz_question_instances');
479         $columns = $DB->get_columns('quiz_question_instances');
481         if (array_key_exists('grade', $columns) && empty($columns['grade']->not_null)) {
482             // grade should be NOT NULL DEFAULT '0.0000000',
483             // Fixed in earlier upgrade code
484             $field = new xmldb_field('grade', XMLDB_TYPE_NUMBER, '12, 7', null, XMLDB_NOTNULL, null, '0', 'question');
485             if ($dbman->field_exists($table, $field)) {
486                 $dbman->change_field_default($table, $field);
487             }
488         }
490         upgrade_mod_savepoint(true, 2011011404, 'quiz');
491     }
493     return true;