1e475ec1c1d1c7d43612776aa6ab54a958571e03
[moodle.git] / lib / db / upgrade.php
1 <?PHP
3 // This file keeps track of upgrades to Moodle.
4 //
5 // Sometimes, changes between versions involve
6 // alterations to database structures and other
7 // major things that may break installations.
8 //
9 // The upgrade function in this file will attempt
10 // to perform all the necessary actions to upgrade
11 // your older installtion to the current version.
12 //
13 // If there's something it cannot do itself, it
14 // will tell you what you need to do.
15 //
16 // The commands in here will all be database-neutral,
17 // using the methods of database_manager class
18 //
19 // Please do not forget to use upgrade_set_timeout()
20 // before any action that may take longer time to finish.
22 /**
23  *
24  * @global stdClass $CFG
25  * @global stdClass $USER
26  * @global moodle_database $DB
27  * @global core_renderer $OUTPUT
28  * @param int $oldversion
29  * @return bool
30  */
31 function xmldb_main_upgrade($oldversion) {
32     global $CFG, $USER, $DB, $OUTPUT;
34     require_once($CFG->libdir.'/db/upgradelib.php'); // Core Upgrade-related functions
36     $result = true;
38     $dbman = $DB->get_manager(); // loads ddl manager and xmldb classes
40     ////////////////////////////////////////
41     ///upgrade supported only from 1.9.x ///
42     ////////////////////////////////////////
44     if ($result && $oldversion < 2008030600) {
45         //NOTE: this table was added much later, that is why this step is repeated later in this file
47     /// Define table upgrade_log to be created
48         $table = new xmldb_table('upgrade_log');
50     /// Adding fields to table upgrade_log
51         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
52         $table->add_field('type', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
53         $table->add_field('plugin', XMLDB_TYPE_CHAR, '100', null, null, null, null);
54         $table->add_field('version', XMLDB_TYPE_CHAR, '100', null, null, null, null);
55         $table->add_field('info', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
56         $table->add_field('details', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
57         $table->add_field('backtrace', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
58         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
59         $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
61     /// Adding keys to table upgrade_log
62         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
63         $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
65     /// Adding indexes to table upgrade_log
66         $table->add_index('timemodified', XMLDB_INDEX_NOTUNIQUE, array('timemodified'));
67         $table->add_index('type-timemodified', XMLDB_INDEX_NOTUNIQUE, array('type', 'timemodified'));
69     /// Create table for upgrade_log
70         $dbman->create_table($table);
72     /// Main savepoint reached
73         upgrade_main_savepoint($result, 2008030600);
74     }
76     if ($result && $oldversion < 2008030601) {
77         @unlink($CFG->dataroot.'/cache/languages');
79         // rename old lang directory so that the new and old langs do not mix
80         if (rename("$CFG->dataroot/lang", "$CFG->dataroot/oldlang")) {
81             $oldlang = "$CFG->dataroot/oldlang";
82         } else {
83             $oldlang = "$CFG->dataroot/lang";
84         }
85         // TODO: fetch previously installed languages ("*_utf8") found in $oldlang from moodle.org
86         upgrade_set_timeout(60*20); // this may take a while
89         // TODO: add some info file to $oldlang describing what to do with "$oldlang/*_utf8_local" dirs
92         // Main savepoint reached
93         upgrade_main_savepoint($result, 2008030601);
94     }
96     if ($result && $oldversion < 2008030700) {
97         upgrade_set_timeout(60*20); // this may take a while
99     /// Define index contextid-lowerboundary (not unique) to be dropped form grade_letters
100         $table = new xmldb_table('grade_letters');
101         $index = new xmldb_index('contextid-lowerboundary', XMLDB_INDEX_NOTUNIQUE, array('contextid', 'lowerboundary'));
103     /// Launch drop index contextid-lowerboundary
104         if ($dbman->index_exists($table, $index)) {
105             $dbman->drop_index($table, $index);
106         }
108     /// Define index contextid-lowerboundary-letter (unique) to be added to grade_letters
109         $table = new xmldb_table('grade_letters');
110         $index = new xmldb_index('contextid-lowerboundary-letter', XMLDB_INDEX_UNIQUE, array('contextid', 'lowerboundary', 'letter'));
112     /// Launch add index contextid-lowerboundary-letter
113         $dbman->add_index($table, $index);
115     /// Main savepoint reached
116         upgrade_main_savepoint($result, 2008030700);
117     }
119     if ($result && $oldversion < 2008050100) {
120         // Update courses that used weekscss to weeks
121         $DB->set_field('course', 'format', 'weeks', array('format' => 'weekscss'));
122         upgrade_main_savepoint($result, 2008050100);
123     }
125     if ($result && $oldversion < 2008050200) {
126         // remove unused config options
127         unset_config('statsrolesupgraded');
128         upgrade_main_savepoint($result, 2008050200);
129     }
131     if ($result && $oldversion < 2008050700) {
132         upgrade_set_timeout(60*20); // this may take a while
134     /// Fix minor problem caused by MDL-5482.
135         require_once($CFG->dirroot . '/question/upgrade.php');
136         question_fix_random_question_parents();
137         upgrade_main_savepoint($result, 2008050700);
138     }
140     if ($result && $oldversion < 2008051201) {
141         echo $OUTPUT->notification('Increasing size of user idnumber field, this may take a while...', 'notifysuccess');
142         upgrade_set_timeout(60*20); // this may take a while
144     /// Under MySQL and Postgres... detect old NULL contents and change them by correct empty string. MDL-14859
145         $dbfamily = $DB->get_dbfamily();
146         if ($dbfamily === 'mysql' || $dbfamily === 'postgres') {
147             $DB->execute("UPDATE {user} SET idnumber = '' WHERE idnumber IS NULL");
148         }
150     /// Define index idnumber (not unique) to be dropped form user
151         $table = new xmldb_table('user');
152         $index = new xmldb_index('idnumber', XMLDB_INDEX_NOTUNIQUE, array('idnumber'));
154     /// Launch drop index idnumber
155         if ($dbman->index_exists($table, $index)) {
156             $dbman->drop_index($table, $index);
157         }
159     /// Changing precision of field idnumber on table user to (255)
160         $table = new xmldb_table('user');
161         $field = new xmldb_field('idnumber', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'password');
163     /// Launch change of precision for field idnumber
164         $dbman->change_field_precision($table, $field);
166     /// Launch add index idnumber again
167         $index = new xmldb_index('idnumber', XMLDB_INDEX_NOTUNIQUE, array('idnumber'));
168         $dbman->add_index($table, $index);
170     /// Main savepoint reached
171         upgrade_main_savepoint($result, 2008051201);
172     }
174     if ($result && $oldversion < 2008051202) {
175         $log_action = new object();
176         $log_action->module = 'course';
177         $log_action->action = 'unenrol';
178         $log_action->mtable = 'course';
179         $log_action->field  = 'fullname';
180         if (!$DB->record_exists('log_display', array('action'=>'unenrol', 'module'=>'course'))) {
181             $DB->insert_record('log_display', $log_action);
182         }
183         upgrade_main_savepoint($result, 2008051202);
184     }
186     if ($result && $oldversion < 2008051203) {
187         $table = new xmldb_table('mnet_enrol_course');
188         $field = new xmldb_field('sortorder', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, 0);
189         $dbman->change_field_precision($table, $field);
190         upgrade_main_savepoint($result, 2008051203);
191     }
193     if ($result && $oldversion < 2008063001) {
194         upgrade_set_timeout(60*20); // this may take a while
196         // table to be modified
197         $table = new xmldb_table('tag_instance');
198         // add field
199         $field = new xmldb_field('tiuserid');
200         if (!$dbman->field_exists($table, $field)) {
201             $field->set_attributes(XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, 0, 'itemid');
202             $dbman->add_field($table, $field);
203         }
204         // modify index
205         $index = new xmldb_index('itemtype-itemid-tagid');
206         $index->set_attributes(XMLDB_INDEX_UNIQUE, array('itemtype', 'itemid', 'tagid'));
207         if ($dbman->index_exists($table, $index)) {
208             $dbman->drop_index($table, $index);
209         }
210         $index = new xmldb_index('itemtype-itemid-tagid-tiuserid');
211         $index->set_attributes(XMLDB_INDEX_UNIQUE, array('itemtype', 'itemid', 'tagid', 'tiuserid'));
212         if (!$dbman->index_exists($table, $index)) {
213             $dbman->add_index($table, $index);
214         }
216         /// Main savepoint reached
217         upgrade_main_savepoint($result, 2008063001);
218     }
220     if ($result && $oldversion < 2008070300) {
221         $DB->delete_records_select('role_names', $DB->sql_isempty('role_names', 'name', false, false));
222         upgrade_main_savepoint($result, 2008070300);
223     }
225     if ($result && $oldversion < 2008070701) {
227     /// Define table portfolio_instance to be created
228         $table = new xmldb_table('portfolio_instance');
230     /// Adding fields to table portfolio_instance
231         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
232         $table->add_field('plugin', XMLDB_TYPE_CHAR, '50', null, XMLDB_NOTNULL, null, null);
233         $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
234         $table->add_field('visible', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '1');
236     /// Adding keys to table portfolio_instance
237         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
239     /// Conditionally launch create table for portfolio_instance
240         if (!$dbman->table_exists($table)) {
241             $dbman->create_table($table);
242         }
243   /// Define table portfolio_instance_config to be created
244         $table = new xmldb_table('portfolio_instance_config');
246     /// Adding fields to table portfolio_instance_config
247         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
248         $table->add_field('instance', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
249         $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
250         $table->add_field('value', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
252     /// Adding keys to table portfolio_instance_config
253         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
254         $table->add_key('instance', XMLDB_KEY_FOREIGN, array('instance'), 'portfolio_instance', array('id'));
256     /// Adding indexes to table portfolio_instance_config
257         $table->add_index('name', XMLDB_INDEX_NOTUNIQUE, array('name'));
259     /// Conditionally launch create table for portfolio_instance_config
260         if (!$dbman->table_exists($table)) {
261             $dbman->create_table($table);
262         }
264    /// Define table portfolio_instance_user to be created
265         $table = new xmldb_table('portfolio_instance_user');
267     /// Adding fields to table portfolio_instance_user
268         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null);
269         $table->add_field('instance', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
270         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
271         $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
272         $table->add_field('value', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
274     /// Adding keys to table portfolio_instance_user
275         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
276         $table->add_key('instancefk', XMLDB_KEY_FOREIGN, array('instance'), 'portfolio_instance', array('id'));
277         $table->add_key('userfk', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
279     /// Conditionally launch create table for portfolio_instance_user
280         if (!$dbman->table_exists($table)) {
281             $dbman->create_table($table);
282         }
284     /// Main savepoint reached
285         upgrade_main_savepoint($result, 2008070701);
286     }
288     if ($result && $oldversion < 2008072400) {
289     /// Create the database tables for message_processors
290         $table = new xmldb_table('message_processors');
291         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
292         $table->add_field('name', XMLDB_TYPE_CHAR, '166', null, XMLDB_NOTNULL, null, null);
293         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
294         $dbman->create_table($table);
296     /// delete old and create new fields
297         $table = new xmldb_table('message');
298         $field = new xmldb_field('messagetype');
299         $dbman->drop_field($table, $field);
301     /// fields to rename
302         $field = new xmldb_field('message');
303         $field->set_attributes(XMLDB_TYPE_TEXT, 'small', null, null, null, null, null);
304         $dbman->rename_field($table, $field, 'fullmessage');
305         $field = new xmldb_field('format');
306         $field->set_attributes(XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, null, null, '0', null);
307         $dbman->rename_field($table, $field, 'fullmessageformat');
309     /// new message fields
310         $field = new xmldb_field('subject');
311         $field->set_attributes(XMLDB_TYPE_TEXT, 'small', null, null, null, null, null);
312         $dbman->add_field($table, $field);
313         $field = new xmldb_field('fullmessagehtml');
314         $field->set_attributes(XMLDB_TYPE_TEXT, 'medium', null, null, null, null, null);
315         $dbman->add_field($table, $field);
316         $field = new xmldb_field('smallmessage');
317         $field->set_attributes(XMLDB_TYPE_TEXT, 'small', null, null, null, null, null);
318         $dbman->add_field($table, $field);
321         $table = new xmldb_table('message_read');
322         $field = new xmldb_field('messagetype');
323         $dbman->drop_field($table, $field);
324         $field = new xmldb_field('mailed');
325         $dbman->drop_field($table, $field);
327     /// fields to rename
328         $field = new xmldb_field('message');
329         $field->set_attributes(XMLDB_TYPE_TEXT, 'small', null, null, null, null, null);
330         $dbman->rename_field($table, $field, 'fullmessage');
331         $field = new xmldb_field('format');
332         $field->set_attributes(XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, null, null, '0', null);
333         $dbman->rename_field($table, $field, 'fullmessageformat');
336     /// new message fields
337         $field = new xmldb_field('subject');
338         $field->set_attributes(XMLDB_TYPE_TEXT, 'small', null, null, null, null, null);
339         $dbman->add_field($table, $field);
340         $field = new xmldb_field('fullmessagehtml');
341         $field->set_attributes(XMLDB_TYPE_TEXT, 'medium', null, null, null, null, null);
342         $dbman->add_field($table, $field);
343         $field = new xmldb_field('smallmessage');
344         $field->set_attributes(XMLDB_TYPE_TEXT, 'small', null, null, null, null, null);
345         $dbman->add_field($table, $field);
347     /// new table
348         $table = new xmldb_table('message_working');
349         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
350         $table->add_field('unreadmessageid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
351         $table->add_field('processorid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
352         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
353         $dbman->create_table($table);
356         upgrade_main_savepoint($result, 2008072400);
357     }
359     if ($result && $oldversion < 2008072800) {
361     /// Define field enablecompletion to be added to course
362         $table = new xmldb_table('course');
363         $field = new xmldb_field('enablecompletion');
364         $field->set_attributes(XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'defaultrole');
366     /// Launch add field enablecompletion
367         if (!$dbman->field_exists($table,$field)) {
368             $dbman->add_field($table, $field);
369         }
371     /// Define field completion to be added to course_modules
372         $table = new xmldb_table('course_modules');
373         $field = new xmldb_field('completion');
374         $field->set_attributes(XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'groupmembersonly');
376     /// Launch add field completion
377         if (!$dbman->field_exists($table,$field)) {
378             $dbman->add_field($table, $field);
379         }
381     /// Define field completiongradeitemnumber to be added to course_modules
382         $field = new xmldb_field('completiongradeitemnumber');
383         $field->set_attributes(XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null, 'completion');
385     /// Launch add field completiongradeitemnumber
386         if (!$dbman->field_exists($table,$field)) {
387             $dbman->add_field($table, $field);
388         }
390     /// Define field completionview to be added to course_modules
391         $field = new xmldb_field('completionview');
392         $field->set_attributes(XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'completiongradeitemnumber');
394     /// Launch add field completionview
395         if (!$dbman->field_exists($table,$field)) {
396             $dbman->add_field($table, $field);
397         }
399     /// Define field completionexpected to be added to course_modules
400         $field = new xmldb_field('completionexpected');
401         $field->set_attributes(XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'completionview');
403     /// Launch add field completionexpected
404         if (!$dbman->field_exists($table,$field)) {
405             $dbman->add_field($table, $field);
406         }
408    /// Define table course_modules_completion to be created
409         $table = new xmldb_table('course_modules_completion');
410         if (!$dbman->table_exists($table)) {
412         /// Adding fields to table course_modules_completion
413             $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
414             $table->add_field('coursemoduleid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
415             $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
416             $table->add_field('completionstate', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
417             $table->add_field('viewed', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, null, null, null);
418             $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
420         /// Adding keys to table course_modules_completion
421             $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
423         /// Adding indexes to table course_modules_completion
424             $table->add_index('coursemoduleid', XMLDB_INDEX_NOTUNIQUE, array('coursemoduleid'));
425             $table->add_index('userid', XMLDB_INDEX_NOTUNIQUE, array('userid'));
427         /// Launch create table for course_modules_completion
428             $dbman->create_table($table);
429         }
431         /// Main savepoint reached
432         upgrade_main_savepoint($result, 2008072800);
433     }
435     if ($result && $oldversion < 2008073000) {
437     /// Define table portfolio_log to be created
438         $table = new xmldb_table('portfolio_log');
440     /// Adding fields to table portfolio_log
441         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
442         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
443         $table->add_field('time', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
444         $table->add_field('portfolio', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
445         $table->add_field('caller_class', XMLDB_TYPE_CHAR, '150', null, XMLDB_NOTNULL, null, null);
446         $table->add_field('caller_file', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
447         $table->add_field('caller_sha1', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
449     /// Adding keys to table portfolio_log
450         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
451         $table->add_key('userfk', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
452         $table->add_key('portfoliofk', XMLDB_KEY_FOREIGN, array('portfolio'), 'portfolio_instance', array('id'));
454     /// Conditionally launch create table for portfolio_log
455         if (!$dbman->table_exists($table)) {
456             $dbman->create_table($table);
457         }
459     /// Main savepoint reached
460         upgrade_main_savepoint($result, 2008073000);
461     }
463     if ($result && $oldversion < 2008073104) {
464     /// Drop old table that might exist for some people
465         $table = new xmldb_table('message_providers');
466         if ($dbman->table_exists($table)) {
467             $dbman->drop_table($table);
468         }
470     /// Define table message_providers to be created
471         $table = new xmldb_table('message_providers');
473     /// Adding fields to table message_providers
474         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
475         $table->add_field('name', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null);
476         $table->add_field('component', XMLDB_TYPE_CHAR, '200', null, XMLDB_NOTNULL, null, null);
477         $table->add_field('capability', XMLDB_TYPE_CHAR, '255', null, null, null, null);
479     /// Adding keys to table message_providers
480         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
482     /// Adding indexes to table message_providers
483         $table->add_index('componentname', XMLDB_INDEX_UNIQUE, array('component', 'name'));
485     /// Create table for message_providers
486         $dbman->create_table($table);
488         upgrade_main_savepoint($result, 2008073104);
489     }
491     if ($result && $oldversion < 2008073111) {
492     /// Define table files to be created
493         $table = new xmldb_table('files');
495     /// Adding fields to table files
496         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
497         $table->add_field('contenthash', XMLDB_TYPE_CHAR, '40', null, XMLDB_NOTNULL, null, null);
498         $table->add_field('pathnamehash', XMLDB_TYPE_CHAR, '40', null, XMLDB_NOTNULL, null, null);
499         $table->add_field('contextid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
500         $table->add_field('filearea', XMLDB_TYPE_CHAR, '50', null, XMLDB_NOTNULL, null, null);
501         $table->add_field('itemid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
502         $table->add_field('filepath', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
503         $table->add_field('filename', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
504         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
505         $table->add_field('filesize', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
506         $table->add_field('mimetype', XMLDB_TYPE_CHAR, '100', null, null, null, null);
507         $table->add_field('status', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
508         $table->add_field('source', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
509         $table->add_field('author', XMLDB_TYPE_CHAR, '255', null, null, null, null);
510         $table->add_field('license', XMLDB_TYPE_CHAR, '255', null, null, null, null);
511         $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
512         $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
514     /// Adding keys to table files
515         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
516         $table->add_key('contextid', XMLDB_KEY_FOREIGN, array('contextid'), 'context', array('id'));
517         $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
519     /// Adding indexes to table files
520         $table->add_index('filearea-contextid-itemid', XMLDB_INDEX_NOTUNIQUE, array('filearea', 'contextid', 'itemid'));
521         $table->add_index('contenthash', XMLDB_INDEX_NOTUNIQUE, array('contenthash'));
522         $table->add_index('pathnamehash', XMLDB_INDEX_UNIQUE, array('pathnamehash'));
524     /// Conditionally launch create table for files
525         $dbman->create_table($table);
527     /// Main savepoint reached
528         upgrade_main_savepoint($result, 2008073111);
529     }
531     if ($result && $oldversion < 2008073113) {
532     /// move all course, backup and other files to new filepool based storage
533         upgrade_migrate_files_courses();
534     /// Main savepoint reached
535         upgrade_main_savepoint($result, 2008073113);
536     }
538     if ($result && $oldversion < 2008073114) {
539     /// move all course, backup and other files to new filepool based storage
540         upgrade_migrate_files_blog();
541     /// Main savepoint reached
542         upgrade_main_savepoint($result, 2008073114);
543     }
545     if ($result && $oldversion < 2008080400) {
546         // Add field ssl_jump_url to mnet application, and populate existing default applications
547         $table = new xmldb_table('mnet_application');
548         $field = new xmldb_field('sso_jump_url');
549         if (!$dbman->field_exists($table, $field)) {
550             $field->set_attributes(XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
551             $dbman->add_field($table, $field);
552             $DB->set_field('mnet_application', 'sso_jump_url', '/auth/mnet/jump.php', array('name' => 'moodle'));
553             $DB->set_field('mnet_application', 'sso_jump_url', '/auth/xmlrpc/jump.php', array('name' => 'mahara'));
554         }
556         /// Main savepoint reached
557         upgrade_main_savepoint($result, 2008080400);
558     }
560     if ($result && $oldversion < 2008080500) {
562    /// Define table portfolio_tempdata to be created
563         $table = new xmldb_table('portfolio_tempdata');
565     /// Adding fields to table portfolio_tempdata
566         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
567         $table->add_field('data', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
569     /// Adding keys to table portfolio_tempdata
570         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
572     /// Conditionally launch create table for portfolio_tempdata
573         if (!$dbman->table_exists($table)) {
574             $dbman->create_table($table);
575         }
577     /// Main savepoint reached
578         upgrade_main_savepoint($result, 2008080500);
579     }
581     if ($result && $oldversion < 2008080600) {
583         $DB->delete_records('portfolio_tempdata'); // there shouldnt' be any, and it will cause problems with this upgrade.
584     /// Define field expirytime to be added to portfolio_tempdata
585         $table = new xmldb_table('portfolio_tempdata');
586         $field = new xmldb_field('expirytime', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, 'data');
588     /// Conditionally launch add field expirytime
589         if (!$dbman->field_exists($table, $field)) {
590             $dbman->add_field($table, $field);
591         }
593     /// Main savepoint reached
594         upgrade_main_savepoint($result, 2008080600);
595     }
597     if ($result && $oldversion < 2008081500) {
598     /// Changing the type of all the columns that the question bank uses to store grades to be NUMBER(12, 7).
599         $table = new xmldb_table('question');
600         $field = new xmldb_field('defaultgrade', XMLDB_TYPE_NUMBER, '12, 7', null, null, null, null, 'generalfeedback');
601         $dbman->change_field_type($table, $field);
602         upgrade_main_savepoint($result, 2008081500);
603     }
605     if ($result && $oldversion < 2008081501) {
606         $table = new xmldb_table('question');
607         $field = new xmldb_field('penalty', XMLDB_TYPE_NUMBER, '12, 7', null, null, null, null, 'defaultgrade');
608         $dbman->change_field_type($table, $field);
609         upgrade_main_savepoint($result, 2008081501);
610     }
612     if ($result && $oldversion < 2008081502) {
613         $table = new xmldb_table('question_answers');
614         $field = new xmldb_field('fraction', XMLDB_TYPE_NUMBER, '12, 7', null, null, null, null, 'answer');
615         $dbman->change_field_type($table, $field);
616         upgrade_main_savepoint($result, 2008081502);
617     }
619     if ($result && $oldversion < 2008081503) {
620         $table = new xmldb_table('question_sessions');
621         $field = new xmldb_field('sumpenalty', XMLDB_TYPE_NUMBER, '12, 7', null, null, null, null, 'newgraded');
622         $dbman->change_field_type($table, $field);
623         upgrade_main_savepoint($result, 2008081503);
624     }
626     if ($result && $oldversion < 2008081504) {
627         $table = new xmldb_table('question_states');
628         $field = new xmldb_field('grade', XMLDB_TYPE_NUMBER, '12, 7', null, null, null, null, 'event');
629         $dbman->change_field_type($table, $field);
630         upgrade_main_savepoint($result, 2008081504);
631     }
633     if ($result && $oldversion < 2008081505) {
634         $table = new xmldb_table('question_states');
635         $field = new xmldb_field('raw_grade', XMLDB_TYPE_NUMBER, '12, 7', null, null, null, null, 'grade');
636         $dbman->change_field_type($table, $field);
637         upgrade_main_savepoint($result, 2008081505);
638     }
640     if ($result && $oldversion < 2008081506) {
641         $table = new xmldb_table('question_states');
642         $field = new xmldb_field('penalty', XMLDB_TYPE_NUMBER, '12, 7', null, null, null, null, 'raw_grade');
643         $dbman->change_field_type($table, $field);
644         upgrade_main_savepoint($result, 2008081506);
645     }
647     if ($result && $oldversion < 2008081600) {
649     /// all 1.9 sites and fresh installs must already be unicode, not needed anymore
650         unset_config('unicodedb');
652     /// Main savepoint reached
653         upgrade_main_savepoint($result, 2008081600);
654     }
656     if ($result && $oldversion < 2008081900) {
657     /// Define field userid to be added to portfolio_tempdata
658         $table = new xmldb_table('portfolio_tempdata');
659         $field = new xmldb_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null, 'expirytime');
661     /// Conditionally launch add field userid
662         if (!$dbman->field_exists($table, $field)) {
663             $dbman->add_field($table, $field);
664         }
665         $DB->set_field('portfolio_tempdata', 'userid', 0);
666     /// now change it to be notnull
668     /// Changing nullability of field userid on table portfolio_tempdata to not null
669         $field = new xmldb_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, 'expirytime');
671     /// Launch change of nullability for field userid
672         $dbman->change_field_notnull($table, $field);
674     /// Define key userfk (foreign) to be added to portfolio_tempdata
675         $table = new xmldb_table('portfolio_tempdata');
676         $key = new xmldb_key('userfk', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
678     /// Launch add key userfk
679         $dbman->add_key($table, $key);
681         upgrade_main_savepoint($result, 2008081900);
682     }
683     if ($result && $oldversion < 2008082602) {
685     /// Define table repository to be dropped
686         $table = new xmldb_table('repository');
688     /// Conditionally launch drop table for repository
689         if ($dbman->table_exists($table)) {
690             $dbman->drop_table($table);
691         }
693     /// Define table repository to be created
694         $table = new xmldb_table('repository');
696     /// Adding fields to table repository
697         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
698         $table->add_field('type', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
699         $table->add_field('visible', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, null, null, '1');
700         $table->add_field('sortorder', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
702     /// Adding keys to table repository
703         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
705     /// Conditionally launch create table for repository
706         if (!$dbman->table_exists($table)) {
707             $dbman->create_table($table);
708         }
709     /// Define table repository_instances to be created
710         $table = new xmldb_table('repository_instances');
712     /// Adding fields to table repository_instances
713         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
714         $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
715         $table->add_field('typeid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
716         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
717         $table->add_field('contextid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
718         $table->add_field('username', XMLDB_TYPE_CHAR, '255', null, null, null, null);
719         $table->add_field('password', XMLDB_TYPE_CHAR, '255', null, null, null, null);
720         $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
721         $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
723     /// Adding keys to table repository_instances
724         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
726     /// Conditionally launch create table for repository_instances
727         if (!$dbman->table_exists($table)) {
728             $dbman->create_table($table);
729         }
731     /// Define table repository_instance_config to be created
732         $table = new xmldb_table('repository_instance_config');
734     /// Adding fields to table repository_instance_config
735         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
736         $table->add_field('instanceid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
737         $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
738         $table->add_field('value', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
740     /// Adding keys to table repository_instance_config
741         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
743     /// Conditionally launch create table for repository_instance_config
744         if (!$dbman->table_exists($table)) {
745             $dbman->create_table($table);
746         }
748     /// Main savepoint reached
749         upgrade_main_savepoint($result, 2008082602);
750     }
752     if ($result && $oldversion < 2008082700) {
753     /// Add a new column to the question sessions table to record whether a
754     /// question has been flagged.
756     /// Define field flagged to be added to question_sessions
757         $table = new xmldb_table('question_sessions');
758         $field = new xmldb_field('flagged', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0', 'manualcomment');
760     /// Conditionally launch add field flagged
761         if (!$dbman->field_exists($table, $field)) {
762             $dbman->add_field($table, $field);
763         }
765     /// Main savepoint reached
766         upgrade_main_savepoint($result, 2008082700);
767     }
769     if ($result && $oldversion < 2008082900) {
771     /// Changing precision of field parent_type on table mnet_rpc to (20)
772         $table = new xmldb_table('mnet_rpc');
773         $field = new xmldb_field('parent_type', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null, 'xmlrpc_path');
775     /// Launch change of precision for field parent_type
776         $dbman->change_field_precision($table, $field);
778     /// Main savepoint reached
779         upgrade_main_savepoint($result, 2008082900);
780     }
782     if ($result && $oldversion < 2008090108) {
783         $repo = new object();
784         $repo->type      = 'upload';
785         $repo->visible   = 1;
786         $repo->sortorder = 1;
787         if (!$DB->record_exists('repository', array('type'=>'upload'))) {
788             $typeid = $DB->insert_record('repository', $repo);
789         }else{
790             $record = $DB->get_record('repository', array('type'=>'upload'));
791             $typeid = $record->id;
792         }
793         if (!$DB->record_exists('repository_instances', array('typeid'=>$typeid))) {
794             $instance = new object();
795             $instance->name      = get_string('repositoryname', 'repository_upload');
796             $instance->typeid    = $typeid;
797             $instance->userid    = 0;
798             $instance->contextid = SITEID;
799             $instance->timecreated  = time();
800             $instance->timemodified = time();
801             $DB->insert_record('repository_instances', $instance);
802         }
803         $repo->type      = 'local';
804         $repo->visible   = 1;
805         $repo->sortorder = 1;
806         if (!$DB->record_exists('repository', array('type'=>'local'))) {
807             $typeid = $DB->insert_record('repository', $repo);
808         }else{
809             $record = $DB->get_record('repository', array('type'=>'local'));
810             $typeid = $record->id;
811         }
812         if (!$DB->record_exists('repository_instances', array('typeid'=>$typeid))) {
813             $instance = new object();
814             $instance->name      = get_string('repositoryname', 'repository_local');
815             $instance->typeid    = $typeid;
816             $instance->userid    = 0;
817             $instance->contextid = SITEID;
818             $instance->timecreated  = time();
819             $instance->timemodified = time();
820             $DB->insert_record('repository_instances', $instance);
821         }
823         upgrade_main_savepoint($result, 2008090108);
824     }
826     // MDL-16411 Move all plugintype_pluginname_version values from config to config_plugins.
827     if ($result && $oldversion < 2008091000) {
828         foreach (get_object_vars($CFG) as $name => $value) {
829             if (substr($name, strlen($name) - 8) !== '_version') {
830                 continue;
831             }
832             $pluginname = substr($name, 0, strlen($name) - 8);
833             if (!strpos($pluginname, '_')) {
834                 // Skip things like backup_version that don't contain an extra _
835                 continue;
836             }
837             if ($pluginname == 'enrol_ldap_version') {
838                 // Special case - this is something different from a plugin version number.
839                 continue;
840             }
841             if (!preg_match('/^\d{10}$/', $value)) {
842                 // Extra safety check, skip anything that does not look like a Moodle
843                 // version number (10 digits).
844                 continue;
845             }
846             set_config('version', $value, $pluginname);
847             unset_config($name);
848         }
849         upgrade_main_savepoint($result, 2008091000);
850     }
852     //Add a readonly field to the repository_instances table
853     //in order to support instance created automatically by a repository plugin
854      if ($result && $oldversion < 2008091611) {
856     /// Define field readonly to be added to repository_instances
857         $table = new xmldb_table('repository_instances');
858         $field = new xmldb_field('readonly', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'timemodified');
860     /// Conditionally launch add field readonly
861         if (!$dbman->field_exists($table, $field)) {
862             $dbman->add_field($table, $field);
863         }
865     /// Main savepoint reached
866         upgrade_main_savepoint($result, 2008091611);
867     }
869     if ($result && $oldversion < 2008092300) {
870         unset_config('editorspelling');
871         unset_config('editordictionary');
872     /// Main savepoint reached
873         upgrade_main_savepoint($result, 2008092300);
874     }
876     if ($result && $oldversion < 2008101300) {
878         if (!get_config(NULL, 'statsruntimedays')) {
879             set_config('statsruntimedays', '31');
880         }
882     /// Main savepoint reached
883         upgrade_main_savepoint($result, 2008101300);
884     }
886     /// New table for storing which roles can be assigned in which contexts.
887     if ($result && $oldversion < 2008110601) {
889     /// Define table role_context_levels to be created
890         $table = new xmldb_table('role_context_levels');
892     /// Adding fields to table role_context_levels
893         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
894         $table->add_field('roleid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
895         $table->add_field('contextlevel', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
897     /// Adding keys to table role_context_levels
898         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
899         $table->add_key('contextlevel-roleid', XMLDB_KEY_UNIQUE, array('contextlevel', 'roleid'));
900         $table->add_key('roleid', XMLDB_KEY_FOREIGN, array('roleid'), 'role', array('id'));
902     /// Conditionally launch create table for role_context_levels
903         if (!$dbman->table_exists($table)) {
904             $dbman->create_table($table);
905         }
907     /// Main savepoint reached
908         upgrade_main_savepoint($result, 2008110601);
909     }
911     /// Now populate the role_context_levels table with the defaults that match
912     /// moodle_install_roles, and any other combinations that exist in this system.
913     if ($result && $oldversion < 2008110602) {
914         $roleids = $DB->get_records_menu('role', array(), '', 'shortname,id');
916     /// Defaults, should match moodle_install_roles.
917         $rolecontextlevels = array();
918         if (isset($roleids['coursecreator'])) {
919             $rolecontextlevels[$roleids['coursecreator']] = get_default_contextlevels('coursecreator');
920         }
921         if (isset($roleids['editingteacher'])) {
922             $rolecontextlevels[$roleids['editingteacher']] = get_default_contextlevels('editingteacher');
923         }
924         if (isset($roleids['teacher'])) {
925             $rolecontextlevels[$roleids['teacher']] = get_default_contextlevels('teacher');
926         }
927         if (isset($roleids['student'])) {
928             $rolecontextlevels[$roleids['student']] = get_default_contextlevels('student');
929         }
930         if (isset($roleids['guest'])) {
931             $rolecontextlevels[$roleids['guest']] = get_default_contextlevels('guest');
932         }
933         if (isset($roleids['user'])) {
934             $rolecontextlevels[$roleids['user']] = get_default_contextlevels('user');
935         }
937     /// See what other role assignments are in this database, extend the allowed
938     /// lists to allow them too.
939         $existingrolecontextlevels = $DB->get_recordset_sql('SELECT DISTINCT ra.roleid, con.contextlevel FROM
940                 {role_assignments} ra JOIN {context} con ON ra.contextid = con.id');
941         foreach ($existingrolecontextlevels as $rcl) {
942             if (!isset($rolecontextlevels[$rcl->roleid])) {
943                 $rolecontextlevels[$rcl->roleid] = array($rcl->contextlevel);
944             } else if (!in_array($rcl->contextlevel, $rolecontextlevels[$rcl->roleid])) {
945                 $rolecontextlevels[$rcl->roleid][] = $rcl->contextlevel;
946             }
947         }
949     /// Put the data into the database.
950         foreach ($rolecontextlevels as $roleid => $contextlevels) {
951             set_role_contextlevels($roleid, $contextlevels);
952         }
954     /// Main savepoint reached
955         upgrade_main_savepoint($result, 2008110602);
956     }
958     /// Drop the deprecated teacher, teachers, student and students columns from the course table.
959     if ($result && $oldversion < 2008111200) {
960         $table = new xmldb_table('course');
962     /// Conditionally launch drop field teacher
963         $field = new xmldb_field('teacher');
964         if ($dbman->field_exists($table, $field)) {
965             $dbman->drop_field($table, $field);
966         }
968     /// Conditionally launch drop field teacher
969         $field = new xmldb_field('teachers');
970         if ($dbman->field_exists($table, $field)) {
971             $dbman->drop_field($table, $field);
972         }
974     /// Conditionally launch drop field teacher
975         $field = new xmldb_field('student');
976         if ($dbman->field_exists($table, $field)) {
977             $dbman->drop_field($table, $field);
978         }
980     /// Conditionally launch drop field teacher
981         $field = new xmldb_field('students');
982         if ($dbman->field_exists($table, $field)) {
983             $dbman->drop_field($table, $field);
984         }
986     /// Main savepoint reached
987         upgrade_main_savepoint($result, 2008111200);
988     }
990 /// Add a unique index to the role.name column.
991     if ($result && $oldversion < 2008111800) {
993     /// Define index name (unique) to be added to role
994         $table = new xmldb_table('role');
995         $index = new xmldb_index('name', XMLDB_INDEX_UNIQUE, array('name'));
997     /// Conditionally launch add index name
998         if (!$dbman->index_exists($table, $index)) {
999             $dbman->add_index($table, $index);
1000         }
1002     /// Main savepoint reached
1003         upgrade_main_savepoint($result, 2008111800);
1004     }
1006 /// Add a unique index to the role.shortname column.
1007     if ($result && $oldversion < 2008111801) {
1009     /// Define index shortname (unique) to be added to role
1010         $table = new xmldb_table('role');
1011         $index = new xmldb_index('shortname', XMLDB_INDEX_UNIQUE, array('shortname'));
1013     /// Conditionally launch add index shortname
1014         if (!$dbman->index_exists($table, $index)) {
1015             $dbman->add_index($table, $index);
1016         }
1018     /// Main savepoint reached
1019         upgrade_main_savepoint($result, 2008111801);
1020     }
1022     if ($result && $oldversion < 2008120700) {
1024     /// Changing precision of field shortname on table course_request to (100)
1025         $table = new xmldb_table('course_request');
1026         $field = new xmldb_field('shortname', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null, 'fullname');
1028     /// Before changing the field, drop dependent indexes
1029     /// Define index shortname (not unique) to be dropped form course_request
1030         $index = new xmldb_index('shortname', XMLDB_INDEX_NOTUNIQUE, array('shortname'));
1031     /// Conditionally launch drop index shortname
1032         if ($dbman->index_exists($table, $index)) {
1033             $dbman->drop_index($table, $index);
1034         }
1036     /// Launch change of precision for field shortname
1037         $dbman->change_field_precision($table, $field);
1039     /// After changing the field, recreate dependent indexes
1040     /// Define index shortname (not unique) to be added to course_request
1041         $index = new xmldb_index('shortname', XMLDB_INDEX_NOTUNIQUE, array('shortname'));
1042     /// Conditionally launch add index shortname
1043         if (!$dbman->index_exists($table, $index)) {
1044             $dbman->add_index($table, $index);
1045         }
1047     /// Main savepoint reached
1048         upgrade_main_savepoint($result, 2008120700);
1049     }
1051     if ($result && $oldversion < 2008120801) {
1053     /// Changing precision of field shortname on table mnet_enrol_course to (100)
1054         $table = new xmldb_table('mnet_enrol_course');
1055         $field = new xmldb_field('shortname', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null, 'fullname');
1057     /// Launch change of precision for field shortname
1058         $dbman->change_field_precision($table, $field);
1060     /// Main savepoint reached
1061         upgrade_main_savepoint($result, 2008120801);
1062     }
1064     if ($result && $oldversion < 2008121701) {
1066     /// Define field availablefrom to be added to course_modules
1067         $table = new xmldb_table('course_modules');
1068         $field = new xmldb_field('availablefrom', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'completionexpected');
1070     /// Conditionally launch add field availablefrom
1071         if (!$dbman->field_exists($table, $field)) {
1072             $dbman->add_field($table, $field);
1073         }
1075     /// Define field availableuntil to be added to course_modules
1076         $field = new xmldb_field('availableuntil', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'availablefrom');
1078     /// Conditionally launch add field availableuntil
1079         if (!$dbman->field_exists($table, $field)) {
1080             $dbman->add_field($table, $field);
1081         }
1083     /// Define field showavailability to be added to course_modules
1084         $field = new xmldb_field('showavailability', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'availableuntil');
1086     /// Conditionally launch add field showavailability
1087         if (!$dbman->field_exists($table, $field)) {
1088             $dbman->add_field($table, $field);
1089         }
1091     /// Define table course_modules_availability to be created
1092         $table = new xmldb_table('course_modules_availability');
1094     /// Adding fields to table course_modules_availability
1095         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
1096         $table->add_field('coursemoduleid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1097         $table->add_field('sourcecmid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
1098         $table->add_field('requiredcompletion', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, null, null, null);
1099         $table->add_field('gradeitemid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
1100         $table->add_field('grademin', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null);
1101         $table->add_field('grademax', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null);
1103     /// Adding keys to table course_modules_availability
1104         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
1105         $table->add_key('coursemoduleid', XMLDB_KEY_FOREIGN, array('coursemoduleid'), 'course_modules', array('id'));
1106         $table->add_key('sourcecmid', XMLDB_KEY_FOREIGN, array('sourcecmid'), 'course_modules', array('id'));
1107         $table->add_key('gradeitemid', XMLDB_KEY_FOREIGN, array('gradeitemid'), 'grade_items', array('id'));
1109     /// Conditionally launch create table for course_modules_availability
1110         if (!$dbman->table_exists($table)) {
1111             $dbman->create_table($table);
1112         }
1114     /// Changes to modinfo mean we need to rebuild course cache
1115         require_once($CFG->dirroot . '/course/lib.php');
1116         rebuild_course_cache(0, true);
1118     /// For developer upgrades, turn on the conditional activities and completion
1119     /// features automatically (to gain more testing)
1120 //TODO: remove before 2.0 final!
1121         if (debugging('', DEBUG_DEVELOPER)) {
1122             set_config('enableavailability', 1);
1123             set_config('enablecompletion', 1);
1124         }
1126     /// Main savepoint reached
1127         upgrade_main_savepoint($result, 2008121701);
1128     }
1130     if ($result && $oldversion < 2009010500) {
1131     /// clean up config table a bit
1132         unset_config('session_error_counter');
1134     /// Main savepoint reached
1135         upgrade_main_savepoint($result, 2009010500);
1136     }
1138     if ($result && $oldversion < 2009010600) {
1140     /// Define field originalquestion to be dropped from question_states
1141         $table = new xmldb_table('question_states');
1142         $field = new xmldb_field('originalquestion');
1144     /// Conditionally launch drop field originalquestion
1145         if ($dbman->field_exists($table, $field)) {
1146             $dbman->drop_field($table, $field);
1147         }
1149     /// Main savepoint reached
1150         upgrade_main_savepoint($result, 2009010600);
1151     }
1153     if ($result && $oldversion < 2009010601) {
1155     /// Changing precision of field ip on table log to (45)
1156         $table = new xmldb_table('log');
1157         $field = new xmldb_field('ip', XMLDB_TYPE_CHAR, '45', null, XMLDB_NOTNULL, null, null, 'userid');
1159     /// Launch change of precision for field ip
1160         $dbman->change_field_precision($table, $field);
1162     /// Main savepoint reached
1163         upgrade_main_savepoint($result, 2009010601);
1164     }
1166     if ($result && $oldversion < 2009010602) {
1168     /// Changing precision of field lastip on table user to (45)
1169         $table = new xmldb_table('user');
1170         $field = new xmldb_field('lastip', XMLDB_TYPE_CHAR, '45', null, XMLDB_NOTNULL, null, null, 'currentlogin');
1172     /// Launch change of precision for field lastip
1173         $dbman->change_field_precision($table, $field);
1175     /// Main savepoint reached
1176         upgrade_main_savepoint($result, 2009010602);
1177     }
1179     if ($result && $oldversion < 2009010603) {
1181     /// Changing precision of field ip_address on table mnet_host to (45)
1182         $table = new xmldb_table('mnet_host');
1183         $field = new xmldb_field('ip_address', XMLDB_TYPE_CHAR, '45', null, XMLDB_NOTNULL, null, null, 'wwwroot');
1185     /// Launch change of precision for field ip_address
1186         $dbman->change_field_precision($table, $field);
1188     /// Main savepoint reached
1189         upgrade_main_savepoint($result, 2009010603);
1190     }
1192     if ($result && $oldversion < 2009010604) {
1194     /// Changing precision of field ip on table mnet_log to (45)
1195         $table = new xmldb_table('mnet_log');
1196         $field = new xmldb_field('ip', XMLDB_TYPE_CHAR, '45', null, XMLDB_NOTNULL, null, null, 'userid');
1198     /// Launch change of precision for field ip
1199         $dbman->change_field_precision($table, $field);
1201     /// Main savepoint reached
1202         upgrade_main_savepoint($result, 2009010604);
1203     }
1205     if ($result && $oldversion < 2009011000) {
1207     /// Changing nullability of field configdata on table block_instance to null
1208         $table = new xmldb_table('block_instance');
1209         $field = new xmldb_field('configdata');
1210         $field->set_attributes(XMLDB_TYPE_TEXT, 'small', null, null, null, null, 'visible');
1212     /// Launch change of nullability for field configdata
1213         $dbman->change_field_notnull($table, $field);
1215     /// Main savepoint reached
1216         upgrade_main_savepoint($result, 2009011000);
1217     }
1219     if ($result && $oldversion < 2009011100) {
1220     /// Remove unused settings
1221         unset_config('zip');
1222         unset_config('unzip');
1223         unset_config('adminblocks_initialised');
1225     /// Main savepoint reached
1226         upgrade_main_savepoint($result, 2009011100);
1227     }
1229     if ($result && $oldversion < 2009011101) {
1230     /// Migrate backup settings to core plugin config table
1231         $configs = $DB->get_records('backup_config');
1232         foreach ($configs as $config) {
1233             set_config($config->name, $config->value, 'backup');
1234         }
1236     /// Define table to be dropped
1237         $table = new xmldb_table('backup_config');
1239     /// Launch drop table for old backup config
1240         $dbman->drop_table($table);
1242     /// Main savepoint reached
1243         upgrade_main_savepoint($result, 2009011101);
1244     }
1246     if ($result && $oldversion < 2009011303) {
1248     /// Define table config_log to be created
1249         $table = new xmldb_table('config_log');
1251     /// Adding fields to table config_log
1252         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
1253         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1254         $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1255         $table->add_field('plugin', XMLDB_TYPE_CHAR, '100', null, null, null, null);
1256         $table->add_field('name', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null);
1257         $table->add_field('value', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
1258         $table->add_field('oldvalue', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
1260     /// Adding keys to table config_log
1261         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
1262         $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
1264     /// Adding indexes to table config_log
1265         $table->add_index('timemodified', XMLDB_INDEX_NOTUNIQUE, array('timemodified'));
1267     /// Launch create table for config_log
1268         $dbman->create_table($table);
1270     /// Main savepoint reached
1271         upgrade_main_savepoint($result, 2009011303);
1272     }
1274     if ($result && $oldversion < 2009011900) {
1276     /// Define table sessions2 to be dropped
1277         $table = new xmldb_table('sessions2');
1279     /// Conditionally launch drop table for sessions
1280         if ($dbman->table_exists($table)) {
1281             $dbman->drop_table($table);
1282         }
1284     /// Define table sessions to be dropped
1285         $table = new xmldb_table('sessions');
1287     /// Conditionally launch drop table for sessions
1288         if ($dbman->table_exists($table)) {
1289             $dbman->drop_table($table);
1290         }
1292     /// Define table sessions to be created
1293         $table = new xmldb_table('sessions');
1295     /// Adding fields to table sessions
1296         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
1297         $table->add_field('state', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
1298         $table->add_field('sid', XMLDB_TYPE_CHAR, '128', null, XMLDB_NOTNULL, null, null);
1299         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1300         $table->add_field('sessdata', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
1301         $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1302         $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1303         $table->add_field('firstip', XMLDB_TYPE_CHAR, '45', null, null, null, null);
1304         $table->add_field('lastip', XMLDB_TYPE_CHAR, '45', null, null, null, null);
1306     /// Adding keys to table sessions
1307         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
1308         $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
1310     /// Adding indexes to table sessions
1311         $table->add_index('state', XMLDB_INDEX_NOTUNIQUE, array('state'));
1312         $table->add_index('sid', XMLDB_INDEX_UNIQUE, array('sid'));
1313         $table->add_index('timecreated', XMLDB_INDEX_NOTUNIQUE, array('timecreated'));
1314         $table->add_index('timemodified', XMLDB_INDEX_NOTUNIQUE, array('timemodified'));
1316     /// Launch create table for sessions
1317         $dbman->create_table($table);
1319     /// Main savepoint reached
1320         upgrade_main_savepoint($result, 2009011900);
1321     }
1323     if ($result && $oldversion < 2009012901) {
1324         // NOTE: this table may already exist, see beginning of this file ;-)
1326     /// Define table upgrade_log to be created
1327         $table = new xmldb_table('upgrade_log');
1329     /// Adding fields to table upgrade_log
1330         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
1331         $table->add_field('type', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
1332         $table->add_field('plugin', XMLDB_TYPE_CHAR, '100', null, null, null, null);
1333         $table->add_field('version', XMLDB_TYPE_CHAR, '100', null, null, null, null);
1334         $table->add_field('info', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
1335         $table->add_field('details', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
1336         $table->add_field('backtrace', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
1337         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1338         $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1340     /// Adding keys to table upgrade_log
1341         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
1342         $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
1344     /// Adding indexes to table upgrade_log
1345         $table->add_index('timemodified', XMLDB_INDEX_NOTUNIQUE, array('timemodified'));
1346         $table->add_index('type-timemodified', XMLDB_INDEX_NOTUNIQUE, array('type', 'timemodified'));
1348     /// Conditionally launch create table for upgrade_log
1349         if (!$dbman->table_exists($table)) {
1350             $dbman->create_table($table);
1351         }
1353     /// Main savepoint reached
1354         upgrade_main_savepoint($result, 2009012901);
1355     }
1357     if ($result && $oldversion < 2009021800) {
1358         // Converting format of grade conditions, if any exist, to percentages.
1359         $DB->execute("
1360 UPDATE {course_modules_availability} SET grademin=(
1361     SELECT 100.0*({course_modules_availability}.grademin-gi.grademin)
1362         /(gi.grademax-gi.grademin)
1363     FROM {grade_items} gi
1364     WHERE gi.id={course_modules_availability}.gradeitemid)
1365 WHERE gradeitemid IS NOT NULL AND grademin IS NOT NULL");
1366         $DB->execute("
1367 UPDATE {course_modules_availability} SET grademax=(
1368     SELECT 100.0*({course_modules_availability}.grademax-gi.grademin)
1369         /(gi.grademax-gi.grademin)
1370     FROM {grade_items} gi
1371     WHERE gi.id={course_modules_availability}.gradeitemid)
1372 WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
1374     /// Main savepoint reached
1375         upgrade_main_savepoint($result, 2009021800);
1376     }
1377     if ($result && $oldversion < 2009021801) {
1378     /// Define field backuptype to be added to backup_log
1379         $table = new xmldb_table('backup_log');
1380         $field = new xmldb_field('backuptype', XMLDB_TYPE_CHAR, '50', null, XMLDB_NOTNULL, null, null, 'info');
1381     /// Conditionally Launch add field backuptype and set all old records as 'scheduledbackup' records.
1382         if (!$dbman->field_exists($table, $field)) {
1383             $dbman->add_field($table, $field);
1384             $DB->execute("UPDATE {backup_log} SET backuptype='scheduledbackup'");
1385         }
1387     /// Main savepoint reached
1388         upgrade_main_savepoint($result, 2009021801);
1389     }
1390     /// Add default sort order for question types.
1391     if ($result && $oldversion < 2009030300) {
1392         set_config('multichoice_sortorder', 1, 'question');
1393         set_config('truefalse_sortorder', 2, 'question');
1394         set_config('shortanswer_sortorder', 3, 'question');
1395         set_config('numerical_sortorder', 4, 'question');
1396         set_config('calculated_sortorder', 5, 'question');
1397         set_config('essay_sortorder', 6, 'question');
1398         set_config('match_sortorder', 7, 'question');
1399         set_config('randomsamatch_sortorder', 8, 'question');
1400         set_config('multianswer_sortorder', 9, 'question');
1401         set_config('description_sortorder', 10, 'question');
1402         set_config('random_sortorder', 11, 'question');
1403         set_config('missingtype_sortorder', 12, 'question');
1405         upgrade_main_savepoint($result, 2009030300);
1406     }
1407     if ($result && $oldversion < 2009030501) {
1408     /// setup default repository plugins
1409         require_once($CFG->dirroot . '/repository/lib.php');
1410         repository_setup_default_plugins();
1411     /// Main savepoint reached
1412         upgrade_main_savepoint($result, 2009030501);
1413     }
1415     /// MDL-18132 replace the use a new Role allow switch settings page, instead of
1416     /// $CFG->allowuserswitchrolestheycantassign
1417     if ($result && $oldversion < 2009032000) {
1418     /// First create the new table.
1419             $table = new xmldb_table('role_allow_switch');
1421     /// Adding fields to table role_allow_switch
1422         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
1423         $table->add_field('roleid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1424         $table->add_field('allowswitch', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1426     /// Adding keys to table role_allow_switch
1427         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
1428         $table->add_key('roleid', XMLDB_KEY_FOREIGN, array('roleid'), 'role', array('id'));
1429         $table->add_key('allowswitch', XMLDB_KEY_FOREIGN, array('allowswitch'), 'role', array('id'));
1431     /// Adding indexes to table role_allow_switch
1432         $table->add_index('roleid-allowoverride', XMLDB_INDEX_UNIQUE, array('roleid', 'allowswitch'));
1434     /// Conditionally launch create table for role_allow_switch
1435         if (!$dbman->table_exists($table)) {
1436             $dbman->create_table($table);
1437         }
1439     /// Main savepoint reached
1440         upgrade_main_savepoint($result, 2009032000);
1441     }
1443     if ($result && $oldversion < 2009032001) {
1444     /// Copy from role_allow_assign into the new table.
1445         $DB->execute('INSERT INTO {role_allow_switch} (roleid, allowswitch)
1446                 SELECT roleid, allowassign FROM {role_allow_assign}');
1448     /// Unset the config variable used in 1.9.
1449         unset_config('allowuserswitchrolestheycantassign');
1451     /// Main savepoint reached
1452         upgrade_main_savepoint($result, 2009032001);
1453     }
1455     if ($result && $oldversion < 2009033100) {
1456         require_once("$CFG->dirroot/filter/tex/lib.php");
1457         filter_tex_updatedcallback(null);
1458     /// Main savepoint reached
1459         upgrade_main_savepoint($result, 2009033100);
1460     }
1462     if ($result && $oldversion < 2009040300) {
1464     /// Define table filter_active to be created
1465         $table = new xmldb_table('filter_active');
1467     /// Adding fields to table filter_active
1468         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
1469         $table->add_field('filter', XMLDB_TYPE_CHAR, '32', null, XMLDB_NOTNULL, null, null);
1470         $table->add_field('contextid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1471         $table->add_field('active', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, null);
1472         $table->add_field('sortorder', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
1474     /// Adding keys to table filter_active
1475         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
1476         $table->add_key('contextid', XMLDB_KEY_FOREIGN, array('contextid'), 'context', array('id'));
1478     /// Adding indexes to table filter_active
1479         $table->add_index('contextid-filter', XMLDB_INDEX_UNIQUE, array('contextid', 'filter'));
1481     /// Conditionally launch create table for filter_active
1482         if (!$dbman->table_exists($table)) {
1483             $dbman->create_table($table);
1484         }
1486     /// Main savepoint reached
1487         upgrade_main_savepoint($result, 2009040300);
1488     }
1490     if ($result && $oldversion < 2009040301) {
1492     /// Define table filter_config to be created
1493         $table = new xmldb_table('filter_config');
1495     /// Adding fields to table filter_config
1496         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
1497         $table->add_field('filter', XMLDB_TYPE_CHAR, '32', null, XMLDB_NOTNULL, null, null);
1498         $table->add_field('contextid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1499         $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
1500         $table->add_field('value', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
1502     /// Adding keys to table filter_config
1503         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
1504         $table->add_key('contextid', XMLDB_KEY_FOREIGN, array('contextid'), 'context', array('id'));
1506     /// Adding indexes to table filter_config
1507         $table->add_index('contextid-filter-name', XMLDB_INDEX_UNIQUE, array('contextid', 'filter', 'name'));
1509     /// Conditionally launch create table for filter_config
1510         if (!$dbman->table_exists($table)) {
1511             $dbman->create_table($table);
1512         }
1514     /// Main savepoint reached
1515         upgrade_main_savepoint($result, 2009040301);
1516     }
1518     if ($result && $oldversion < 2009040302) {
1519     /// Transfer current settings from $CFG->textfilters
1520         $disabledfilters = filter_get_all_installed();
1521         if (empty($CFG->textfilters)) {
1522             $activefilters = array();
1523         } else {
1524             $activefilters = explode(',', $CFG->textfilters);
1525         }
1526         $syscontext = get_context_instance(CONTEXT_SYSTEM);
1527         $sortorder = 1;
1528         foreach ($activefilters as $filter) {
1529             filter_set_global_state($filter, TEXTFILTER_ON, $sortorder);
1530             $sortorder += 1;
1531             unset($disabledfilters[$filter]);
1532         }
1533         foreach ($disabledfilters as $filter => $notused) {
1534             filter_set_global_state($filter, TEXTFILTER_DISABLED, $sortorder);
1535             $sortorder += 1;
1536         }
1538     /// Main savepoint reached
1539         upgrade_main_savepoint($result, 2009040302);
1540     }
1542     if ($result && $oldversion < 2009040600) {
1543     /// Ensure that $CFG->stringfilters is set.
1544         if (empty($CFG->stringfilters)) {
1545             if (!empty($CFG->filterall)) {
1546                 set_config('stringfilters', $CFG->textfilters);
1547             } else {
1548                 set_config('stringfilters', '');
1549             }
1550         }
1552         set_config('filterall', !empty($CFG->stringfilters));
1553         unset_config('textfilters');
1555     /// Main savepoint reached
1556         upgrade_main_savepoint($result, 2009040600);
1557     }
1559     if ($result && $oldversion < 2009041700) {
1560     /// To ensure the UI remains consistent with no behaviour change, any
1561     /// 'until' date in an activity condition should have 1 second subtracted
1562     /// (to go from 0:00 on the following day to 23:59 on the previous one).
1563         $DB->execute('UPDATE {course_modules} SET availableuntil = availableuntil - 1 WHERE availableuntil <> 0');
1564         require_once($CFG->dirroot . '/course/lib.php');
1565         rebuild_course_cache(0, true);
1567     /// Main savepoint reached
1568         upgrade_main_savepoint($result, 2009041700);
1569     }
1571     if ($result && $oldversion < 2009042600) {
1572     /// Deleting orphaned messages from deleted users.
1573         require_once($CFG->dirroot.'/message/lib.php');
1574     /// Detect deleted users with messages sent(useridfrom) and not read
1575         if ($deletedusers = $DB->get_records_sql('SELECT DISTINCT u.id
1576                                                     FROM {user} u
1577                                                     JOIN {message} m ON m.useridfrom = u.id
1578                                                    WHERE u.deleted = ?', array(1))) {
1579             foreach ($deletedusers as $deleteduser) {
1580                 message_move_userfrom_unread2read($deleteduser->id); // move messages
1581             }
1582         }
1583     /// Main savepoint reached
1584         upgrade_main_savepoint($result, 2009042600);
1585     }
1587     /// Dropping all enums/check contraints from core. MDL-18577
1588     if ($result && $oldversion < 2009042700) {
1590     /// Changing list of values (enum) of field stattype on table stats_daily to none
1591         $table = new xmldb_table('stats_daily');
1592         $field = new xmldb_field('stattype', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, 'activity', 'roleid');
1594     /// Launch change of list of values for field stattype
1595         $dbman->drop_enum_from_field($table, $field);
1597     /// Changing list of values (enum) of field stattype on table stats_weekly to none
1598         $table = new xmldb_table('stats_weekly');
1599         $field = new xmldb_field('stattype', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, 'activity', 'roleid');
1601     /// Launch change of list of values for field stattype
1602         $dbman->drop_enum_from_field($table, $field);
1604     /// Changing list of values (enum) of field stattype on table stats_monthly to none
1605         $table = new xmldb_table('stats_monthly');
1606         $field = new xmldb_field('stattype', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, 'activity', 'roleid');
1608     /// Launch change of list of values for field stattype
1609         $dbman->drop_enum_from_field($table, $field);
1611     /// Changing list of values (enum) of field publishstate on table post to none
1612         $table = new xmldb_table('post');
1613         $field = new xmldb_field('publishstate', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, 'draft', 'attachment');
1615     /// Launch change of list of values for field publishstate
1616         $dbman->drop_enum_from_field($table, $field);
1618     /// Main savepoint reached
1619         upgrade_main_savepoint($result, 2009042700);
1620     }
1622     if ($result && $oldversion < 2009043000) {
1623         unset_config('grade_report_showgroups');
1624         upgrade_main_savepoint($result, 2009043000);
1625     }
1627     if ($result && $oldversion < 2009050600) {
1628     /// Site front page blocks need to be moved due to page name change.
1629         $DB->set_field('block_instance', 'pagetype', 'site-index', array('pagetype' => 'course-view', 'pageid' => SITEID));
1631     /// Main savepoint reached
1632         upgrade_main_savepoint($result, 2009050600);
1633     }
1635     if ($result && $oldversion < 2009050601) {
1637     /// Define table block_instance to be renamed to block_instances
1638         $table = new xmldb_table('block_instance');
1640     /// Launch rename table for block_instance
1641         $dbman->rename_table($table, 'block_instances');
1643     /// Main savepoint reached
1644         upgrade_main_savepoint($result, 2009050601);
1645     }
1647     if ($result && $oldversion < 2009050602) {
1649     /// Define table block_instance to be renamed to block_instance_old
1650         $table = new xmldb_table('block_pinned');
1652     /// Launch rename table for block_instance
1653         $dbman->rename_table($table, 'block_pinned_old');
1655     /// Main savepoint reached
1656         upgrade_main_savepoint($result, 2009050602);
1657     }
1659     if ($result && $oldversion < 2009050603) {
1661     /// Define table block_instance_old to be created
1662         $table = new xmldb_table('block_instance_old');
1664     /// Adding fields to table block_instance_old
1665         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
1666         $table->add_field('oldid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1667         $table->add_field('blockid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
1668         $table->add_field('pageid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
1669         $table->add_field('pagetype', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null);
1670         $table->add_field('position', XMLDB_TYPE_CHAR, '10', null, XMLDB_NOTNULL, null, null);
1671         $table->add_field('weight', XMLDB_TYPE_INTEGER, '3', null, XMLDB_NOTNULL, null, '0');
1672         $table->add_field('visible', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0');
1673         $table->add_field('configdata', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
1675     /// Adding keys to table block_instance_old
1676         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
1677         $table->add_key('blockid', XMLDB_KEY_FOREIGN, array('blockid'), 'block', array('id'));
1679     /// Adding indexes to table block_instance_old
1680         $table->add_index('pageid', XMLDB_INDEX_NOTUNIQUE, array('pageid'));
1681         $table->add_index('pagetype', XMLDB_INDEX_NOTUNIQUE, array('pagetype'));
1683     /// Conditionally launch create table for block_instance_old
1684         if (!$dbman->table_exists($table)) {
1685             $dbman->create_table($table);
1686         }
1688     /// Main savepoint reached
1689         upgrade_main_savepoint($result, 2009050603);
1690     }
1692     if ($result && $oldversion < 2009050604) {
1693     /// Copy current blocks data from block_instances to block_instance_old
1694         $DB->execute('INSERT INTO {block_instance_old} (oldid, blockid, pageid, pagetype, position, weight, visible, configdata)
1695             SELECT id, blockid, pageid, pagetype, position, weight, visible, configdata FROM {block_instances} ORDER BY id');
1697         upgrade_main_savepoint($result, 2009050604);
1698     }
1700     if ($result && $oldversion < 2009050605) {
1702     /// Define field multiple to be dropped from block
1703         $table = new xmldb_table('block');
1704         $field = new xmldb_field('multiple');
1706     /// Conditionally launch drop field multiple
1707         if ($dbman->field_exists($table, $field)) {
1708             $dbman->drop_field($table, $field);
1709         }
1711     /// Main savepoint reached
1712         upgrade_main_savepoint($result, 2009050605);
1713     }
1715     if ($result && $oldversion < 2009050606) {
1716         $table = new xmldb_table('block_instances');
1718     /// Rename field weight on table block_instances to defaultweight
1719         $field = new xmldb_field('weight', XMLDB_TYPE_INTEGER, '3', null, XMLDB_NOTNULL, null, '0', 'position');
1720         $dbman->rename_field($table, $field, 'defaultweight');
1722     /// Rename field position on table block_instances to defaultregion
1723         $field = new xmldb_field('position', XMLDB_TYPE_CHAR, '10', null, XMLDB_NOTNULL, null, null, 'pagetype');
1724         $dbman->rename_field($table, $field, 'defaultregion');
1726         /// Main savepoint reached
1727         upgrade_main_savepoint($result, 2009050606);
1728     }
1730     if ($result && $oldversion < 2009050607) {
1731     /// Changing precision of field defaultregion on table block_instances to (16)
1732         $table = new xmldb_table('block_instances');
1733         $field = new xmldb_field('defaultregion', XMLDB_TYPE_CHAR, '16', null, XMLDB_NOTNULL, null, null, 'pagetype');
1735     /// Launch change of precision for field defaultregion
1736         $dbman->change_field_precision($table, $field);
1738     /// Main savepoint reached
1739         upgrade_main_savepoint($result, 2009050607);
1740     }
1742     if ($result && $oldversion < 2009050608) {
1743     /// Change regions to the new notation
1744         $DB->set_field('block_instances', 'defaultregion', 'side-pre', array('defaultregion' => 'l'));
1745         $DB->set_field('block_instances', 'defaultregion', 'side-post', array('defaultregion' => 'r'));
1746         $DB->set_field('block_instances', 'defaultregion', 'course-view-top', array('defaultregion' => 'c'));
1747         // This third one is a custom value from contrib/patches/center_blocks_position_patch and the
1748         // flex page course format. Hopefully this new value is an adequate alternative.
1750     /// Main savepoint reached
1751         upgrade_main_savepoint($result, 2009050608);
1752     }
1754     if ($result && $oldversion < 2009050609) {
1756     /// Define key blockname (unique) to be added to block
1757         $table = new xmldb_table('block');
1758         $key = new xmldb_key('blockname', XMLDB_KEY_UNIQUE, array('name'));
1760     /// Launch add key blockname
1761         $dbman->add_key($table, $key);
1763     /// Main savepoint reached
1764         upgrade_main_savepoint($result, 2009050609);
1765     }
1767     if ($result && $oldversion < 2009050610) {
1768         $table = new xmldb_table('block_instances');
1770     /// Define field blockname to be added to block_instances
1771         $field = new xmldb_field('blockname', XMLDB_TYPE_CHAR, '40', null, null, null, null, 'blockid');
1772         if (!$dbman->field_exists($table, $field)) {
1773             $dbman->add_field($table, $field);
1774         }
1776     /// Define field contextid to be added to block_instances
1777         $field = new xmldb_field('contextid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null, 'blockname');
1778         if (!$dbman->field_exists($table, $field)) {
1779             $dbman->add_field($table, $field);
1780         }
1782     /// Define field showinsubcontexts to be added to block_instances
1783         $field = new xmldb_field('showinsubcontexts', XMLDB_TYPE_INTEGER, '4', null, null, null, null, 'contextid');
1784         if (!$dbman->field_exists($table, $field)) {
1785             $dbman->add_field($table, $field);
1786         }
1788     /// Define field subpagepattern to be added to block_instances
1789         $field = new xmldb_field('subpagepattern', XMLDB_TYPE_CHAR, '16', null, null, null, null, 'pagetype');
1790         if (!$dbman->field_exists($table, $field)) {
1791             $dbman->add_field($table, $field);
1792         }
1794     /// Main savepoint reached
1795         upgrade_main_savepoint($result, 2009050610);
1796     }
1798     if ($result && $oldversion < 2009050611) {
1799         $table = new xmldb_table('block_instances');
1801     /// Fill in blockname from blockid
1802         $DB->execute("UPDATE {block_instances} SET blockname = (SELECT name FROM {block} WHERE id = blockid)");
1804     /// Set showinsubcontexts = 0 for all rows.
1805         $DB->execute("UPDATE {block_instances} SET showinsubcontexts = 0");
1807     /// Main savepoint reached
1808         upgrade_main_savepoint($result, 2009050611);
1809     }
1811     if ($result && $oldversion < 2009050612) {
1813     /// Rename field pagetype on table block_instances to pagetypepattern
1814         $table = new xmldb_table('block_instances');
1815         $field = new xmldb_field('pagetype', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null, 'pageid');
1817     /// Launch rename field pagetype
1818         $dbman->rename_field($table, $field, 'pagetypepattern');
1820     /// Main savepoint reached
1821         upgrade_main_savepoint($result, 2009050612);
1822     }
1824     if ($result && $oldversion < 2009050613) {
1825     /// fill in contextid and subpage, and update pagetypepattern from pagetype and pageid
1827     /// site-index
1828         $frontpagecontext = get_context_instance(CONTEXT_COURSE, SITEID);
1829         $DB->execute("UPDATE {block_instances} SET contextid = " . $frontpagecontext->id . ",
1830                                                    pagetypepattern = 'site-index',
1831                                                    subpagepattern = NULL
1832                       WHERE pagetypepattern = 'site-index'");
1834     /// course-view
1835         $DB->execute("UPDATE {block_instances} SET
1836                         contextid = (
1837                             SELECT {context}.id
1838                             FROM {context}
1839                             JOIN {course} ON instanceid = {course}.id AND contextlevel = " . CONTEXT_COURSE . "
1840                             WHERE {course}.id = pageid
1841                         ),
1842                        pagetypepattern = 'course-view-*',
1843                        subpagepattern = NULL
1844                       WHERE pagetypepattern = 'course-view'");
1846     /// admin
1847         $syscontext = get_context_instance(CONTEXT_SYSTEM);
1848         $DB->execute("UPDATE {block_instances} SET
1849                         contextid = " . $syscontext->id . ",
1850                         pagetypepattern = 'admin-*',
1851                         subpagepattern = NULL
1852                       WHERE pagetypepattern = 'admin'");
1854     /// my-index
1855         $DB->execute("UPDATE {block_instances} SET
1856                         contextid = (
1857                             SELECT {context}.id
1858                             FROM {context}
1859                             JOIN {user} ON instanceid = {user}.id AND contextlevel = " . CONTEXT_USER . "
1860                             WHERE {user}.id = pageid
1861                         ),
1862                         pagetypepattern = 'my-index',
1863                         subpagepattern = NULL
1864                       WHERE pagetypepattern = 'my-index'");
1866     /// tag-index
1867         $DB->execute("UPDATE {block_instances} SET
1868                         contextid = " . $syscontext->id . ",
1869                         pagetypepattern = 'tag-index',
1870                         subpagepattern = pageid
1871                       WHERE pagetypepattern = 'tag-index'");
1873     /// blog-view
1874         $DB->execute("UPDATE {block_instances} SET
1875                         contextid = (
1876                             SELECT {context}.id
1877                             FROM {context}
1878                             JOIN {user} ON instanceid = {user}.id AND contextlevel = " . CONTEXT_USER . "
1879                             WHERE {user}.id = pageid
1880                         ),
1881                         pagetypepattern = 'blog-index',
1882                         subpagepattern = NULL
1883                       WHERE pagetypepattern = 'blog-view'");
1885     /// mod-xxx-view
1886         $moduleswithblocks = array('chat', 'data', 'lesson', 'quiz', 'dimdim', 'game', 'wiki', 'oublog');
1887         foreach ($moduleswithblocks as $modname) {
1888             if (!$dbman->table_exists($modname)) {
1889                 continue;
1890             }
1891             $DB->execute("UPDATE {block_instances} SET
1892                             contextid = (
1893                                 SELECT {context}.id
1894                                 FROM {context}
1895                                 JOIN {course_modules} ON instanceid = {course_modules}.id AND contextlevel = " . CONTEXT_MODULE . "
1896                                 JOIN {modules} ON {modules}.id = {course_modules}.module AND {modules}.name = '$modname'
1897                                 JOIN {{$modname}} ON {course_modules}.instance = {{$modname}}.id
1898                                 WHERE {{$modname}}.id = pageid
1899                             ),
1900                             pagetypepattern = 'blog-index',
1901                             subpagepattern = NULL
1902                           WHERE pagetypepattern = 'blog-view'");
1903         }
1905     /// Main savepoint reached
1906         upgrade_main_savepoint($result, 2009050613);
1907     }
1909     if ($result && $oldversion < 2009050614) {
1910     /// fill in any missing contextids with a dummy value, so we can add the not-null constraint.
1911         $DB->execute("UPDATE {block_instances} SET contextid = 0 WHERE contextid IS NULL");
1913     /// Main savepoint reached
1914         upgrade_main_savepoint($result, 2009050614);
1915     }
1917     if ($result && $oldversion < 2009050615) {
1918         $table = new xmldb_table('block_instances');
1920     /// Changing nullability of field blockname on table block_instances to not null
1921         $field = new xmldb_field('blockname', XMLDB_TYPE_CHAR, '40', null, XMLDB_NOTNULL, null, null, 'id');
1922         $dbman->change_field_notnull($table, $field);
1924     /// Changing nullability of field contextid on table block_instances to not null
1925         $field = new xmldb_field('contextid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, 'blockname');
1926         $dbman->change_field_notnull($table, $field);
1928     /// Changing nullability of field showinsubcontexts on table block_instances to not null
1929         $field = new xmldb_field('showinsubcontexts', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, null, 'contextid');
1930         $dbman->change_field_notnull($table, $field);
1932     /// Main savepoint reached
1933         upgrade_main_savepoint($result, 2009050615);
1934     }
1936     if ($result && $oldversion < 2009050616) {
1937     /// Add exiting sticky blocks.
1938         $blocks = $DB->get_records('block');
1939         $syscontext = get_context_instance(CONTEXT_SYSTEM);
1940         $newregions = array(
1941             'l' => 'side-pre',
1942             'r' => 'side-post',
1943             'c' => 'course-view-top',
1944         );
1945         $stickyblocks = $DB->get_recordset('block_pinned_old');
1946         foreach ($stickyblocks as $stickyblock) {
1947             $newblock = new object();
1948             $newblock->blockname = $blocks[$stickyblock->blockid]->name;
1949             $newblock->contextid = $syscontext->id;
1950             $newblock->showinsubcontexts = 1;
1951             switch ($stickyblock->pagetype) {
1952                 case 'course-view':
1953                     $newblock->pagetypepattern = 'course-view-*';
1954                     break;
1955                 default:
1956                     $newblock->pagetypepattern = $stickyblock->pagetype;
1957             }
1958             $newblock->defaultregion = $newregions[$stickyblock->position];
1959             $newblock->defaultweight = $stickyblock->weight;
1960             $newblock->configdata = $stickyblock->configdata;
1961             $newblock->visible = 1;
1962             $DB->insert_record('block_instances', $newblock);
1963         }
1965     /// Main savepoint reached
1966         upgrade_main_savepoint($result, 2009050616);
1967     }
1969     if ($result && $oldversion < 2009050617) {
1971     /// Define table block_positions to be created
1972         $table = new xmldb_table('block_positions');
1974     /// Adding fields to table block_positions
1975         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
1976         $table->add_field('blockinstanceid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
1977         $table->add_field('contextid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
1978         $table->add_field('pagetype', XMLDB_TYPE_CHAR, '64', null, XMLDB_NOTNULL, null, null);
1979         $table->add_field('subpage', XMLDB_TYPE_CHAR, '16', null, XMLDB_NOTNULL, null, null);
1980         $table->add_field('visible', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, '1');
1981         $table->add_field('region', XMLDB_TYPE_CHAR, '16', null, XMLDB_NOTNULL, null, null);
1982         $table->add_field('weight', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
1984     /// Adding keys to table block_positions
1985         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
1986         $table->add_key('blockinstanceid', XMLDB_KEY_FOREIGN, array('blockinstanceid'), 'block_instances', array('id'));
1987         $table->add_key('contextid', XMLDB_KEY_FOREIGN, array('contextid'), 'context', array('id'));
1989     /// Adding indexes to table block_positions
1990         $table->add_index('blockinstanceid-contextid-pagetype-subpage', XMLDB_INDEX_UNIQUE, array('blockinstanceid', 'contextid', 'pagetype', 'subpage'));
1992     /// Conditionally launch create table for block_positions
1993         if (!$dbman->table_exists($table)) {
1994             $dbman->create_table($table);
1995         }
1997     /// Main savepoint reached
1998         upgrade_main_savepoint($result, 2009050617);
1999     }
2001     if ($result && $oldversion < 2009050618) {
2002     /// And block instances with visible = 0, copy that information to block_positions
2003         $DB->execute("INSERT INTO {block_positions} (blockinstanceid, contextid, pagetype, subpage, visible, region, weight)
2004                 SELECT id, contextid,
2005                 CASE WHEN pagetypepattern = 'course-view-*' THEN
2006                         (SELECT " . $DB->sql_concat("'course-view-'", 'format') . "
2007                         FROM {course}
2008                         JOIN {context} ON {course}.id = {context}.instanceid
2009                         WHERE {context}.id = contextid)
2010                     ELSE pagetypepattern END,
2011                 CASE WHEN subpagepattern IS NULL THEN ''
2012                     ELSE subpagepattern END,
2013                 0, defaultregion, defaultweight
2014                 FROM {block_instances} WHERE visible = 0 AND pagetypepattern <> 'admin-*'");
2016     /// Main savepoint reached
2017         upgrade_main_savepoint($result, 2009050618);
2018     }
2020     if ($result && $oldversion < 2009050619) {
2021         $table = new xmldb_table('block_instances');
2023     /// Define field blockid to be dropped from block_instances
2024         $field = new xmldb_field('blockid');
2025         if ($dbman->field_exists($table, $field)) {
2026         /// Before dropping the field, drop dependent indexes
2027             $index = new xmldb_index('blockid', XMLDB_INDEX_NOTUNIQUE, array('blockid'));
2028             if ($dbman->index_exists($table, $index)) {
2029             /// Launch drop index blockid
2030                 $dbman->drop_index($table, $index);
2031             }
2032             $dbman->drop_field($table, $field);
2033         }
2035     /// Define field pageid to be dropped from block_instances
2036         $field = new xmldb_field('pageid');
2037         if ($dbman->field_exists($table, $field)) {
2038         /// Before dropping the field, drop dependent indexes
2039             $index = new xmldb_index('pageid', XMLDB_INDEX_NOTUNIQUE, array('pageid'));
2040             if ($dbman->index_exists($table, $index)) {
2041             /// Launch drop index pageid
2042                 $dbman->drop_index($table, $index);
2043             }
2044             $dbman->drop_field($table, $field);
2045         }
2047     /// Define field visible to be dropped from block_instances
2048         $field = new xmldb_field('visible');
2049         if ($dbman->field_exists($table, $field)) {
2050             $dbman->drop_field($table, $field);
2051         }
2053     /// Main savepoint reached
2054         upgrade_main_savepoint($result, 2009050619);
2055     }
2057     if ($result && $oldversion < 2009051200) {
2058     /// Let's check the status of mandatory mnet_host records, fixing them
2059     /// and moving "orphan" users to default localhost record. MDL-16879
2060         echo $OUTPUT->notification('Fixing mnet records, this may take a while...', 'notifysuccess');
2061         upgrade_fix_incorrect_mnethostids();
2063     /// Main savepoint reached
2064         upgrade_main_savepoint($result, 2009051200);
2065     }
2068     if ($result && $oldversion < 2009051700) {
2069     /// migrate editor settings
2070         if (empty($CFG->htmleditor)) {
2071             set_config('texteditors', 'textarea');
2072         } else {
2073             set_config('texteditors', 'tinymce,textarea');
2074         }
2076         unset_config('htmleditor');
2077         unset_config('defaulthtmleditor');
2079     /// Main savepoint reached
2080         upgrade_main_savepoint($result, 2009051700);
2081     }
2083     if ($result && $oldversion < 2009060200) {
2084     /// Define table files_cleanup to be dropped - not needed
2085         $table = new xmldb_table('files_cleanup');
2087     /// Conditionally launch drop table for files_cleanup
2088         if ($dbman->table_exists($table)) {
2089             $dbman->drop_table($table);
2090         }
2092     /// Main savepoint reached
2093         upgrade_main_savepoint($result, 2009060200);
2094     }
2096     if ($result && $oldversion < 2009061300) {
2097         //TODO: copy this to the very beginning of this upgrade script so that we may log upgrade queries
2099     /// Define table log_queries to be created
2100         $table = new xmldb_table('log_queries');
2102     /// Adding fields to table log_queries
2103         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
2104         $table->add_field('qtype', XMLDB_TYPE_INTEGER, '5', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2105         $table->add_field('sqltext', XMLDB_TYPE_TEXT, 'medium', null, XMLDB_NOTNULL, null, null);
2106         $table->add_field('sqlparams', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
2107         $table->add_field('error', XMLDB_TYPE_INTEGER, '5', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
2108         $table->add_field('info', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
2109         $table->add_field('backtrace', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
2110         $table->add_field('exectime', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, null);
2111         $table->add_field('timelogged', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2113     /// Adding keys to table log_queries
2114         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
2116     /// Conditionally launch create table for log_queries
2117         if (!$dbman->table_exists($table)) {
2118             $dbman->create_table($table);
2119         }
2121     /// Main savepoint reached
2122         upgrade_main_savepoint($result, 2009061300);
2123     }
2125     /// Repeat 2009050607 upgrade step, which Petr commented out becuase of XMLDB
2126     /// stupidity, so lots of peopel will have missed.
2127     if ($result && $oldversion < 2009061600) {
2128     /// Changing precision of field defaultregion on table block_instances to (16)
2129         $table = new xmldb_table('block_instances');
2130         $field = new xmldb_field('defaultregion', XMLDB_TYPE_CHAR, '16', null, XMLDB_NOTNULL, null, null, 'configdata');
2132     /// Launch change of precision for field defaultregion
2133         $dbman->change_field_precision($table, $field);
2135     /// Main savepoint reached
2136         upgrade_main_savepoint($result, 2009061600);
2137     }
2139     if ($result && $oldversion < 2009061702) {
2140         // standardizing plugin names
2141         if ($configs = $DB->get_records_select('config_plugins', "plugin LIKE 'quizreport_%'")) {
2142             foreach ($configs as $config) {
2143                 unset_config($config->name, $config->plugin); /// unset old config
2144                 $config->plugin = str_replace('quizreport_', 'quiz_', $config->plugin);
2145                 set_config($config->name, $config->value, $config->plugin); /// set new config
2146             }
2147         }
2148         unset($configs);
2149         upgrade_main_savepoint($result, 2009061702);
2150     }
2152     if ($result && $oldversion < 2009061703) {
2153         // standardizing plugin names
2154         if ($configs = $DB->get_records_select('config_plugins', "plugin LIKE 'assignment_type_%'")) {
2155             foreach ($configs as $config) {
2156                 unset_config($config->name, $config->plugin); /// unset old config
2157                 $config->plugin = str_replace('assignment_type_', 'assignment_', $config->plugin);
2158                 set_config($config->name, $config->value, $config->plugin); /// set new config
2159             }
2160         }
2161         unset($configs);
2162         upgrade_main_savepoint($result, 2009061703);
2163     }
2165     if ($result && $oldversion < 2009061704) {
2166         // change component string in capability records to new "_" format
2167         if ($caps = $DB->get_records('capabilities')) {
2168             foreach ($caps as $cap) {
2169                 $cap->component = str_replace('/', '_', $cap->component);
2170                 $DB->update_record('capabilities', $cap);
2171             }
2172         }
2173         unset($caps);
2174         upgrade_main_savepoint($result, 2009061704);
2175     }
2177     if ($result && $oldversion < 2009061705) {
2178         // change component string in events_handlers records to new "_" format
2179         if ($handlers = $DB->get_records('events_handlers')) {
2180             foreach ($handlers as $handler) {
2181                 $handler->handlermodule = str_replace('/', '_', $handler->handlermodule);
2182                 $DB->update_record('events_handlers', $handler);
2183             }
2184         }
2185         unset($handlers);
2186         upgrade_main_savepoint($result, 2009061705);
2187     }
2189     if ($result && $oldversion < 2009061706) {
2190         // change component string in message_providers records to new "_" format
2191         if ($mps = $DB->get_records('message_providers')) {
2192             foreach ($mps as $mp) {
2193                 $mp->component = str_replace('/', '_', $mp->component);
2194                 $DB->update_record('message_providers', $cap);
2195             }
2196         }
2197         unset($caps);
2198         upgrade_main_savepoint($result, 2009061706);
2199     }
2201     if ($result && $oldversion < 2009063000) {
2202         // upgrade format of _with_advanced settings - quiz only
2203         // note: this can be removed later, not needed for upgrades from 1.9.x
2204         if ($quiz = get_config('quiz')) {
2205             foreach ($quiz as $name=>$value) {
2206                 if (strpos($name, 'fix_') !== 0) {
2207                     continue;
2208                 }
2209                 $newname = substr($name,4).'_adv';
2210                 set_config($newname, $value, 'quiz');
2211                 unset_config($name, 'quiz');
2212             }
2213         }
2214         upgrade_main_savepoint($result, 2009063000);
2215     }
2217     if ($result && $oldversion < 2009071000) {
2219     /// Rename field contextid on table block_instances to parentcontextid
2220         $table = new xmldb_table('block_instances');
2221         $field = new xmldb_field('contextid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, 'blockname');
2223     /// Launch rename field parentcontextid
2224         $dbman->rename_field($table, $field, 'parentcontextid');
2226     /// Main savepoint reached
2227         upgrade_main_savepoint($result, 2009071000);
2228     }
2230     if ($result && $oldversion < 2009071300) {
2232     /// Create contexts for every block. In the past, only non-sticky course block had contexts.
2233     /// This is a copy of the code in create_contexts.
2234         $sql = "INSERT INTO {context} (contextlevel, instanceid)
2235                 SELECT " . CONTEXT_BLOCK . ", bi.id
2236                   FROM {block_instances} bi
2237                  WHERE NOT EXISTS (SELECT 'x'
2238                                      FROM {context} ctx
2239                                     WHERE bi.id = ctx.instanceid AND ctx.contextlevel=" . CONTEXT_BLOCK . ")";
2240         $DB->execute($sql);
2242     /// TODO MDL-19776 We should not really use API funcitons in upgrade.
2243     /// If MDL-19776 is done, we can remove this whole upgrade block.
2244         build_context_path();
2246     /// Main savepoint reached
2247         upgrade_main_savepoint($result, 2009071300);
2248     }
2250     if ($result && $oldversion < 2009071600) {
2252     /// Define field summaryformat to be added to post
2253         $table = new xmldb_table('post');
2254         $field = new xmldb_field('summaryformat', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'format');
2256     /// Conditionally launch add field summaryformat
2257         if (!$dbman->field_exists($table, $field)) {
2258             $dbman->add_field($table, $field);
2259         }
2261     /// Main savepoint reached
2262         upgrade_main_savepoint($result, 2009071600);
2263     }
2265     if ($result && $oldversion < 2009072400) {
2267     /// Define table comments to be created
2268         $table = new xmldb_table('comments');
2270     /// Adding fields to table comments
2271         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
2272         $table->add_field('contextid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2273         $table->add_field('commentarea', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
2274         $table->add_field('itemid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2275         $table->add_field('content', XMLDB_TYPE_TEXT, 'small', null, XMLDB_NOTNULL, null, null);
2276         $table->add_field('format', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
2277         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2278         $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2280     /// Adding keys to table comments
2281         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
2283     /// Conditionally launch create table for comments
2284         if (!$dbman->table_exists($table)) {
2285             $dbman->create_table($table);
2286         }
2288     /// Main savepoint reached
2289         upgrade_main_savepoint($result, 2009072400);
2290     }
2292     /**
2293      * This upgrade is to set up the new navigation blocks that have been developed
2294      * as part of Moodle 2.0
2295      * Now I [Sam Hemelryk] hit a conundrum while exploring how to go about this
2296      * as not only do we want to install the new blocks but we also want to set up
2297      * default instances of them, and at the same time remove instances of the blocks
2298      * that were/will-be outmoded by the two new navigation blocks.
2299      * After talking it through with Tim Hunt {@link http://moodle.org/mod/cvsadmin/view.php?conversationid=3112}
2300      * we decided that the best way to go about this was to put the bulk of the
2301      * upgrade operation into core upgrade `here` but to let the plugins block
2302      * still install the blocks.
2303      * This leaves one hairy end in that we will create block_instances within the
2304      * DB before the blocks themselves are created within the DB
2305      */
2306     if ($result && $oldversion < 2009082800) {
2308         echo $OUTPUT->notification(get_string('navigationupgrade', 'admin'));
2310         // Get the system context so we can set the block instances to it
2311         $syscontext = get_context_instance(CONTEXT_SYSTEM);
2313         // An array to contain the new block instances we will create
2314         $newblockinstances = array('globalnavigation'=>new stdClass,'settingsnavigation'=>new stdClass);
2315         // The new global navigation block instance as a stdClass
2316         $newblockinstances['globalnavigation']->blockname = 'global_navigation_tree';
2317         $newblockinstances['globalnavigation']->parentcontextid = $syscontext->id; // System context
2318         $newblockinstances['globalnavigation']->showinsubcontexts = true; // Show absolutly everywhere
2319         $newblockinstances['globalnavigation']->pagetypepattern = '*'; // Thats right everywhere
2320         $newblockinstances['globalnavigation']->subpagetypepattern = null;
2321         $newblockinstances['globalnavigation']->defaultregion = BLOCK_POS_LEFT;
2322         $newblockinstances['globalnavigation']->defaultweight = -10; // Try make this first
2323         $newblockinstances['globalnavigation']->configdata = '';
2324         // The new settings navigation block instance as a stdClass
2325         $newblockinstances['settingsnavigation']->blockname = 'settings_navigation_tree';
2326         $newblockinstances['settingsnavigation']->parentcontextid = $syscontext->id;
2327         $newblockinstances['settingsnavigation']->showinsubcontexts = true;
2328         $newblockinstances['settingsnavigation']->pagetypepattern = '*';
2329         $newblockinstances['settingsnavigation']->subpagetypepattern = null;
2330         $newblockinstances['settingsnavigation']->defaultregion = BLOCK_POS_LEFT;
2331         $newblockinstances['settingsnavigation']->defaultweight = -9; // Try make this second
2332         $newblockinstances['settingsnavigation']->configdata = '';
2334         // Blocks that are outmoded and for whom the bells will toll... by which I
2335         // mean we will delete all instances of
2336         $outmodedblocks = array('participants','admin_tree','activity_modules','admin','course_list');
2337         $outmodedblocksstring = '\''.join('\',\'',$outmodedblocks).'\'';
2338         unset($outmodedblocks);
2339         // Retrieve the block instance id's and parent contexts, so we can join them an GREATLY
2340         // cut down the number of delete queries we will need to run
2341         $allblockinstances = $DB->get_recordset_select('block_instances', 'blockname IN ('.$outmodedblocksstring.')', array(), '', 'id, parentcontextid');
2343         $contextids = array();
2344         $instanceids = array();
2345         // Iterate through all block instances
2346         foreach ($allblockinstances as $blockinstance) {
2347             if (!in_array($blockinstance->parentcontextid, $contextids)) {
2348                 $contextids[] = $blockinstance->parentcontextid;
2350                 // If we have over 1000 contexts clean them up and reset the array
2351                 // this ensures we don't hit any nasty memory limits or such
2352                 if (count($contextids) > 1000) {
2353                     upgrade_cleanup_unwanted_block_contexts($contextids);
2354                     $contextids = array();
2355                 }
2356             }
2357             if (!in_array($blockinstance->id, $instanceids)) {
2358                 $instanceids[] = $blockinstance->id;
2359                 // If we have more than 1000 block instances now remove all block positions
2360                 // and empty the array
2361                 if (count($contextids) > 1000) {
2362                     $instanceidstring = join(',',$instanceids);
2363                     $DB->delete_records_select('block_positions', 'blockinstanceid IN ('.$instanceidstring.')');
2364                     $instanceids = array();
2365                 }
2366             }
2367         }
2369         upgrade_cleanup_unwanted_block_contexts($contextids);
2371         $instanceidstring = join(',',$instanceids);
2372         $outcome1 = $result && $DB->delete_records_select('block_positions', 'blockinstanceid IN ('.$instanceidstring.')');
2374         unset($allblockinstances);
2375         unset($contextids);
2376         unset($instanceids);
2377         unset($instanceidstring);
2379         // Now remove the actual block instance
2380         $$DB->delete_records_select('block_instances', 'blockname IN ('.$outmodedblocksstring.')');
2381         unset($outmodedblocksstring);
2383         // Insert the new block instances. Remember they have not been installed yet
2384         // however this should not be a problem
2385         foreach ($newblockinstances as $blockinstance) {
2386             $blockinstance->id= $DB->insert_record('block_instances', $blockinstance);
2387             // Ensure the block context is created.
2388             get_context_instance(CONTEXT_BLOCK, $blockinstance->id);
2389         }
2390         unset($newblockinstances);
2392         upgrade_main_savepoint($result, 2009082800);
2393         // The end of the navigation upgrade
2394     }
2396     if ($result && $oldversion < 2009090800){
2397         //insert new record for log_display table
2398         //used to record tag update.
2399         if (!$DB->record_exists('log_display', array('action'=>'update', 'module'=>'tag'))) {
2400             $log_action = new object();
2401             $log_action->module = 'tag';
2402             $log_action->action = 'update';
2403             $log_action->mtable = 'tag';
2404             $log_action->field  = 'name';
2406             $result  = $result && $DB->insert_record('log_display', $log_action);
2407         }
2408         upgrade_main_savepoint($result, 2009090800);
2409     }
2411     if ($result && $oldversion < 2009100601) {
2412         // drop all previous tables defined during the dev phase
2413         $dropold = array('external_services_users', 'external_services_functions', 'external_services', 'external_functions');
2414         foreach ($dropold as $tablename) {
2415             $table = new xmldb_table($tablename);
2416             if ($dbman->table_exists($table)) {
2417                 $dbman->drop_table($table);
2418             }
2419         }
2420         upgrade_main_savepoint($result, 2009100601);
2421     }
2423     if ($result && $oldversion < 2009100602) {
2424     /// Define table external_functions to be created
2425         $table = new xmldb_table('external_functions');
2427     /// Adding fields to table external_functions
2428         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
2429         $table->add_field('name', XMLDB_TYPE_CHAR, '200', null, XMLDB_NOTNULL, null, null);
2430         $table->add_field('classname', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null);
2431         $table->add_field('methodname', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null);
2432         $table->add_field('classpath', XMLDB_TYPE_CHAR, '255', null, null, null, null);
2433         $table->add_field('component', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null);
2435     /// Adding keys to table external_functions
2436         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
2438     /// Adding indexes to table external_functions
2439         $table->add_index('name', XMLDB_INDEX_UNIQUE, array('name'));
2441     /// Launch create table for external_functions
2442         $dbman->create_table($table);
2444     /// Main savepoint reached
2445         upgrade_main_savepoint($result, 2009100602);
2446     }
2448     if ($result && $oldversion < 2009100603) {
2449     /// Define table external_services to be created
2450         $table = new xmldb_table('external_services');
2452     /// Adding fields to table external_services
2453         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
2454         $table->add_field('name', XMLDB_TYPE_CHAR, '200', null, XMLDB_NOTNULL, null, null);
2455         $table->add_field('enabled', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2456         $table->add_field('requiredcapability', XMLDB_TYPE_CHAR, '150', null, null, null, null);
2457         $table->add_field('restrictedusers', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2458         $table->add_field('component', XMLDB_TYPE_CHAR, '100', null, null, null, null);
2460     /// Adding keys to table external_services
2461         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
2463     /// Adding indexes to table external_services
2464         $table->add_index('name', XMLDB_INDEX_UNIQUE, array('name'));
2466     /// Launch create table for external_services
2467         $dbman->create_table($table);
2469     /// Main savepoint reached
2470         upgrade_main_savepoint($result, 2009100603);
2471     }
2473     if ($result && $oldversion < 2009100604) {
2474     /// Define table external_services_functions to be created
2475         $table = new xmldb_table('external_services_functions');
2477     /// Adding fields to table external_services_functions
2478         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
2479         $table->add_field('externalserviceid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2480         $table->add_field('functionname', XMLDB_TYPE_CHAR, '200', null, XMLDB_NOTNULL, null, null);
2482     /// Adding keys to table external_services_functions
2483         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
2484         $table->add_key('externalserviceid', XMLDB_KEY_FOREIGN, array('externalserviceid'), 'external_services', array('id'));
2486     /// Launch create table for external_services_functions
2487         $dbman->create_table($table);
2489     /// Main savepoint reached
2490         upgrade_main_savepoint($result, 2009100604);
2491     }
2493     if ($result && $oldversion < 2009100605) {
2494     /// Define table external_services_users to be created
2495         $table = new xmldb_table('external_services_users');
2497     /// Adding fields to table external_services_users
2498         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
2499         $table->add_field('externalserviceid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2500         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2501         $table->add_field('iprestriction', XMLDB_TYPE_CHAR, '255', null, null, null, null);
2502         $table->add_field('validuntil', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
2503         $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
2505     /// Adding keys to table external_services_users
2506         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
2507         $table->add_key('externalserviceid', XMLDB_KEY_FOREIGN, array('externalserviceid'), 'external_services', array('id'));
2508         $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
2510     /// Launch create table for external_services_users
2511         $dbman->create_table($table);
2513     /// Main savepoint reached
2514         upgrade_main_savepoint($result, 2009100605);
2515     }
2517     if ($result && $oldversion < 2009102600) {
2519     /// Define table external_tokens to be created
2520         $table = new xmldb_table('external_tokens');
2522     /// Adding fields to table external_tokens
2523         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
2524         $table->add_field('token', XMLDB_TYPE_CHAR, '128', null, XMLDB_NOTNULL, null, null);
2525         $table->add_field('tokentype', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2526         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2527         $table->add_field('externalserviceid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2528         $table->add_field('sid', XMLDB_TYPE_CHAR, '128', null, null, null, null);
2529         $table->add_field('contextid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2530         $table->add_field('iprestriction', XMLDB_TYPE_CHAR, '255', null, null, null, null);
2531         $table->add_field('validuntil', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
2532         $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2533         $table->add_field('lastaccess', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
2535     /// Adding keys to table external_tokens
2536         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
2537         $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
2538         $table->add_key('externalserviceid', XMLDB_KEY_FOREIGN, array('externalserviceid'), 'external_services', array('id'));
2539         $table->add_key('contextid', XMLDB_KEY_FOREIGN, array('contextid'), 'context', array('id'));
2541     /// Launch create table for external_tokens
2542         $dbman->create_table($table);
2544     /// Main savepoint reached
2545         upgrade_main_savepoint($result, 2009102600);
2546     }
2548    if ($result && $oldversion < 2009103000) {
2550     /// Define table blog_association to be created
2551         $table = new xmldb_table('blog_association');
2553     /// Adding fields to table blog_association
2554         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
2555         $table->add_field('contextid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2556         $table->add_field('blogid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2558     /// Adding keys to table blog_association
2559         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
2560         $table->add_key('contextid', XMLDB_KEY_FOREIGN, array('contextid'), 'context', array('id'));
2561         $table->add_key('blogid', XMLDB_KEY_FOREIGN, array('blogid'), 'post', array('id'));
2563     /// Conditionally launch create table for blog_association
2564         if (!$dbman->table_exists($table)) {
2565             $dbman->create_table($table);
2566         }
2568 /// Define table blog_external to be created
2569         $table = new xmldb_table('blog_external');
2571     /// Adding fields to table blog_external
2572         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
2573         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
2574         $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
2575         $table->add_field('description', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
2576         $table->add_field('url', XMLDB_TYPE_TEXT, 'small', null, XMLDB_NOTNULL, null, null);
2577         $table->add_field('filtertags', XMLDB_TYPE_CHAR, '255', null, null, null, null);
2578         $table->add_field('failedlastsync', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
2579         $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
2580         $table->add_field('timefetched', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
2582     /// Adding keys to table blog_external
2583         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
2584         $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
2586     /// Conditionally launch create table for blog_external
2587         if ($dbman->table_exists($table)) {
2588             // Delete the existing one first (comes from early dev version)
2589             $dbman->drop_table($table);
2590         }
2591         $dbman->create_table($table);
2593         // now inform admins that some settings require attention after upgrade
2594         if (($CFG->bloglevel == BLOG_COURSE_LEVEL || $CFG->bloglevel == BLOG_GROUP_LEVEL) && empty($CFG->bloglevel_upgrade_complete)) {
2595             echo $OUTPUT->notification(get_string('bloglevelupgradenotice', 'admin'));
2597             $site = get_site();
2599             $a = new StdClass;
2600             $a->sitename = $site->fullname;
2601             $a->fixurl   = "$CFG->wwwroot/$CFG->admin/bloglevelupgrade.php";
2603             $subject = get_string('bloglevelupgrade', 'admin');
2604             $description = get_string('bloglevelupgradedescription', 'admin', $a);
2606             // can not use messaging here because it is not configured yet!
2607             upgrade_log(UPGRADE_LOG_NOTICE, null, $subject, $description);
2608         }
2609     /// Main savepoint reached
2610         upgrade_main_savepoint($result, 2009103000);
2611     }
2613     if ($result && $oldversion < 2009110400) {
2615         // An array used to store the table name and keys of summary and trust fields
2616         // to be added
2617         $extendtables = array();
2618         $extendtables['course'] = array('summaryformat');
2619         $extendtables['course_categories'] = array('descriptionformat');
2620         $extendtables['course_request'] = array('summaryformat');
2621         $extendtables['grade_outcomes'] = array('descriptionformat');
2622         $extendtables['groups'] = array('descriptionformat');
2623         $extendtables['groupings'] = array('descriptionformat');
2624         $extendtables['scale'] = array('descriptionformat');
2625         $extendtables['user'] = array('descriptionformat');
2626         $extendtables['user_info_field'] = array('descriptionformat', 'defaultdataformat');
2627         $extendtables['user_info_data'] = array('dataformat');
2629         foreach ($extendtables as $tablestr=>$newfields) {
2630             $table = new xmldb_table($tablestr);
2631             foreach ($newfields as $fieldstr) {
2632                 $field = new xmldb_field($fieldstr, XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
2633                 // Check that the field doesn't already exists
2634                 if (!$dbman->field_exists($table, $field)) {
2635                     // Add the new field
2636                     $dbman->add_field($table, $field);
2637                     // Update the field if the text contains the default FORMAT_MOODLE to FORMAT_HTML
2638                     if (($pos = strpos($fieldstr, 'format'))>0) {
2639                         upgrade_set_timeout(60*20); // this may take a little while
2640                         $params = array(FORMAT_HTML, '<p%', '%<br />%', FORMAT_MOODLE);
2641                         $textfield = substr($fieldstr, 0, $pos);
2642                         $DB->execute('UPDATE {'.$tablestr.'} SET '.$fieldstr.'=? WHERE ('.$textfield.' LIKE ? OR '.$textfield.' LIKE ?) AND '.$fieldstr.'=?', $params);
2643                     }
2644                 }
2645             }
2646         }
2648         unset($extendtables);
2650         upgrade_main_savepoint($result, 2009110400);
2651     }
2653     if ($result && $oldversion < 2009110605) {
2655     /// Define field timecreated to be added to external_services
2656         $table = new xmldb_table('external_services');
2657         $field = new xmldb_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'component');
2659     /// Conditionally launch add field timecreated
2660         if (!$dbman->field_exists($table, $field)) {
2661             $dbman->add_field($table, $field);
2662         }
2664     /// Define field timemodified to be added to external_services
2665         $table = new xmldb_table('external_services');
2666         $field = new xmldb_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null, 'timecreated');
2668     /// Conditionally launch add field timemodified
2669         if (!$dbman->field_exists($table, $field)) {
2670             $dbman->add_field($table, $field);
2671         }
2673     /// Main savepoint reached
2674         upgrade_main_savepoint($result, 2009110605);
2675     }
2677     if ($result && $oldversion < 2009111600) {
2679     /// Define field instance to be added to portfolio_tempdata
2680         $table = new xmldb_table('portfolio_tempdata');
2681         $field = new xmldb_field('instance', XMLDB_TYPE_INTEGER, '10', null, null, null, '0', 'userid');
2683     /// Conditionally launch add field instance
2684         if (!$dbman->field_exists($table, $field)) {
2685             $dbman->add_field($table, $field);
2686         }
2688        $key = new xmldb_key('instancefk', XMLDB_KEY_FOREIGN, array('instance'), 'portfolio_instance', array('id'));
2690     /// Launch add key instancefk
2691         $dbman->add_key($table, $key);
2693     /// Main savepoint reached
2694         upgrade_main_savepoint($result, 2009111600);
2695     }
2697     if ($result && $oldversion < 2009111700) {
2699     /// Define field tempdataid to be added to portfolio_log
2700         $table = new xmldb_table('portfolio_log');
2701         $field = new xmldb_field('tempdataid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'caller_sha1');
2703     /// Conditionally launch add field tempdataid
2704         if (!$dbman->field_exists($table, $field)) {
2705             $dbman->add_field($table, $field);
2706         }
2708     /// Main savepoint reached
2709         upgrade_main_savepoint($result, 2009111700);
2710     }
2712     if ($result && $oldversion < 2009111701) {
2714     /// Define field returnurl to be added to portfolio_log
2715         $table = new xmldb_table('portfolio_log');
2716         $field = new xmldb_field('returnurl', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'tempdataid');
2718     /// Conditionally launch add field returnurl
2719         if (!$dbman->field_exists($table, $field)) {
2720             $dbman->add_field($table, $field);
2721         }
2723     /// Main savepoint reached
2724         upgrade_main_savepoint($result, 2009111701);
2725     }
2727     if ($result && $oldversion < 2009111702) {
2729     /// Define field continueurl to be added to portfolio_log
2730         $table = new xmldb_table('portfolio_log');
2731         $field = new xmldb_field('continueurl', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'returnurl');
2733     /// Conditionally launch add field continueurl
2734         if (!$dbman->field_exists($table, $field)) {
2735             $dbman->add_field($table, $field);
2736         }
2738     /// Main savepoint reached
2739         upgrade_main_savepoint($result, 2009111702);
2740     }
2742     if ($result && $oldversion < 2009112400) {
2743         if (empty($CFG->passwordsaltmain)) {
2744             $subject = get_string('check_passwordsaltmain_name', 'report_security');
2745             $description = get_string('check_passwordsaltmain_warning', 'report_security');;
2746             upgrade_log(UPGRADE_LOG_NOTICE, null, $subject, $description);
2747         }
2748         upgrade_main_savepoint($result, 2009112400);
2749     }
2751     if ($result && $oldversion < 2010010601) {
2753     /// Define field creatorid to be added to external_tokens
2754         $table = new xmldb_table('external_tokens');
2755         $field = new xmldb_field('creatorid', XMLDB_TYPE_INTEGER, '20', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '1', 'contextid');
2757     /// Conditionally launch add field creatorid
2758         if (!$dbman->field_exists($table, $field)) {
2759             $dbman->add_field($table, $field);
2760         }
2762     /// Define key creatorid (foreign) to be added to external_tokens
2763         $table = new xmldb_table('external_tokens');
2764         $key = new xmldb_key('creatorid', XMLDB_KEY_FOREIGN, array('creatorid'), 'user', array('id'));
2766     /// Launch add key creatorid
2767         $dbman->add_key($table, $key);
2769     /// Main savepoint reached
2770         upgrade_main_savepoint($result, 2010010601);
2771     }
2773     if ($result && $oldversion < 2010011200) {
2774         $table = new xmldb_table('grade_categories');
2775         $field = new xmldb_field('hidden', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, 0);
2777         if (!$dbman->field_exists($table, $field)) {
2778             $dbman->add_field($table, $field);
2779         }
2781         upgrade_main_savepoint($result, 2010011200);
2782     }
2785     if ($result && $oldversion < 2010012500) {
2786         upgrade_fix_incorrect_mnethostids();
2787         upgrade_main_savepoint($result, 2010012500);
2788     }
2790     if ($result && $oldversion < 2010012600) {
2791         // do stuff to the mnet table
2792         $table = new xmldb_table('mnet_rpc');
2794         $field = new xmldb_field('parent_type', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null, 'xmlrpc_path');
2795         $dbman->rename_field($table, $field, 'plugintype');
2797         $field = new xmldb_field('parent', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null, 'xmlrpc_path');
2798         $dbman->rename_field($table, $field, 'pluginname');
2800         $field = new xmldb_field('filename', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null, 'profile');
2801         if (!$dbman->field_exists($table, $field)) {
2802             $dbman->add_field($table, $field);
2803         }
2805         $field = new xmldb_field('classname', XMLDB_TYPE_CHAR, '150', null, null, null, null, 'filename');
2806         if (!$dbman->field_exists($table, $field)) {
2807             $dbman->add_field($table, $field);
2808         }
2810         $field = new xmldb_field('static', XMLDB_TYPE_INTEGER, '1', null, null, null, null, 'classname');
2811         if (!$dbman->field_exists($table, $field)) {
2812             $dbman->add_field($table, $field);
2813         }
2815     /// Main savepoint reached
2816         upgrade_main_savepoint($result, 2010012600);
2817     }
2819     if ($result && $oldversion < 2010012900) {
2821     /// Define table mnet_remote_rpc to be created
2822         $table = new xmldb_table('mnet_remote_rpc');
2824     /// Adding fields to table mnet_remote_rpc
2825         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
2826         $table->add_field('functionname', XMLDB_TYPE_CHAR, '40', null, XMLDB_NOTNULL, null, null);
2827         $table->add_field('xmlrpcpath', XMLDB_TYPE_CHAR, '80', null, XMLDB_NOTNULL, null, null);
2829     /// Adding keys to table mnet_remote_rpc
2830         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
2832     /// Conditionally launch create table for mnet_remote_rpc
2833         if (!$dbman->table_exists($table)) {
2834             $dbman->create_table($table);
2835         }
2838     /// Define table mnet_remote_service2rpc to be created
2839         $table = new xmldb_table('mnet_remote_service2rpc');
2841     /// Adding fields to table mnet_remote_service2rpc
2842         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
2843         $table->add_field('serviceid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
2844         $table->add_field('rpcid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
2846     /// Adding keys to table mnet_remote_service2rpc
2847         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
2849     /// Adding indexes to table mnet_remote_service2rpc
2850         $table->add_index('rpcid_serviceid', XMLDB_INDEX_UNIQUE, array('rpcid', 'serviceid'));
2852     /// Conditionally launch create table for mnet_remote_service2rpc
2853         if (!$dbman->table_exists($table)) {
2854             $dbman->create_table($table);
2855         }
2858     /// Rename field function_name on table mnet_rpc to functionname
2859         $table = new xmldb_table('mnet_rpc');
2860         $field = new xmldb_field('function_name', XMLDB_TYPE_CHAR, '40', null, XMLDB_NOTNULL, null, null, 'id');
2862     /// Launch rename field function_name
2863         $dbman->rename_field($table, $field, 'functionname');
2866     /// Rename field xmlrpc_path on table mnet_rpc to xmlrpcpath
2867         $table = new xmldb_table('mnet_rpc');
2868         $field = new xmldb_field('xmlrpc_path', XMLDB_TYPE_CHAR, '80', null, XMLDB_NOTNULL, null, null, 'function_name');
2870     /// Launch rename field xmlrpc_path
2871         $dbman->rename_field($table, $field, 'xmlrpcpath');
2874     /// Main savepoint reached
2875         upgrade_main_savepoint($result, 2010012900);
2876     }
2878     if ($result && $oldversion < 2010012901) {
2880         /// Define field plugintype to be added to mnet_remote_rpc
2881         $table = new xmldb_table('mnet_remote_rpc');
2882         $field = new xmldb_field('plugintype', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null, 'xmlrpcpath');
2884         /// Conditionally launch add field plugintype
2885         if (!$dbman->field_exists($table, $field)) {
2886             $dbman->add_field($table, $field);
2887         }
2889     /// Define field pluginname to be added to mnet_remote_rpc
2890         $field = new xmldb_field('pluginname', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null, 'plugintype');
2892     /// Conditionally launch add field pluginname
2893         if (!$dbman->field_exists($table, $field)) {
2894             $dbman->add_field($table, $field);
2895         }
2897         /// Main savepoint reached
2898         upgrade_main_savepoint($result, 2010012901);
2899     }
2901     if ($result && $oldversion < 2010012902) {
2903     /// Define field enabled to be added to mnet_remote_rpc
2904         $table = new xmldb_table('mnet_remote_rpc');
2905         $field = new xmldb_field('enabled', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, null, 'pluginname');
2907     /// Conditionally launch add field enabled
2908         if (!$dbman->field_exists($table, $field)) {
2909             $dbman->add_field($table, $field);
2910         }
2912         /// Main savepoint reached
2913         upgrade_main_savepoint($result, 2010012902);
2914     }
2916     /// MDL-17863. Increase the portno column length on mnet_host to handle any port number
2917     if ($result && $oldversion < 2010020100) {
2918     /// Changing precision of field portno on table mnet_host to (5)
2919         $table = new xmldb_table('mnet_host');
2920         $field = new xmldb_field('portno', XMLDB_TYPE_INTEGER, '5', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'transport');
2922     /// Launch change of precision for field portno
2923         $dbman->change_field_precision($table, $field);
2925         upgrade_main_savepoint($result, 2010020100);
2926     }
2928     if ($result && $oldversion < 2010020300) {
2930     /// Define field timecreated to be added to user
2931         $table = new xmldb_table('user');
2932         $field = new xmldb_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'trackforums');
2934         if (!$dbman->field_exists($table, $field)) {
2935         /// Launch add field timecreated
2936             $dbman->add_field($table, $field);
2938             $DB->execute("UPDATE {user} SET timecreated = firstaccess");
2940             $sql = "UPDATE {user} SET timecreated = " . time() ." where timecreated = 0";
2941             $DB->execute($sql);
2942         }
2943         upgrade_main_savepoint($result, 2010020300);
2944     }
2946     // MDL-21407. Trim leading spaces from default tex latexpreamble causing problems under some confs
2947     if ($result && $oldversion < 2010020301) {
2948         if ($preamble = $CFG->filter_tex_latexpreamble) {
2949             $preamble = preg_replace('/^ +/m', '', $preamble);
2950             set_config('filter_tex_latexpreamble', $preamble);
2951         }
2952         upgrade_main_savepoint($result, 2010020301);
2953     }
2955     if ($result && $oldversion < 2010021400) {
2956     /// Changes to modinfo mean we need to rebuild course cache
2957         require_once($CFG->dirroot . '/course/lib.php');
2958         rebuild_course_cache(0, true);
2959         upgrade_main_savepoint($result, 2010021400);
2960     }
2962     if ($result && $oldversion < 2010021800) {
2963         $DB->set_field('mnet_application', 'sso_jump_url', '/auth/mnet/jump.php', array('name' => 'moodle'));
2964         upgrade_main_savepoint($result, 2010021800);
2965     }
2967     if ($result && $oldversion < 2010031900) {
2968         // regeneration of sessions is always enabled, no need for this setting any more
2969         unset_config('regenloginsession');
2970         upgrade_main_savepoint($result, 2010031900);
2971     }
2974     if ($result && $oldversion < 2010032400) {
2975         // Upgrade all of those using the standardold theme to the use the standard
2976         // theme instead
2977         if ($CFG->theme == 'standardold') {
2978             // The config setting that affects the whole site
2979             set_config('theme', 'standard');
2980         }
2981         // Course Categories
2982         $DB->execute('UPDATE {course_categories} SET theme=? WHERE theme=?', array('standard', 'standardold'));
2983         // Course
2984         $DB->execute('UPDATE {course} SET theme=? WHERE theme=?', array('standard', 'standardold'));
2985         // User
2986         $DB->execute('UPDATE {user} SET theme=? WHERE theme=?', array('standard', 'standardold'));
2987         upgrade_main_savepoint($result, 2010032400);
2988     }
2990     if ($result && $oldversion < 2010033101.01) {
2992     /// Define field source to be added to files
2993         $table = new xmldb_table('files');
2995         $field = new xmldb_field('source', XMLDB_TYPE_TEXT, 'small', null, null, null, null, 'status');
2997     /// Conditionally launch add field source
2998         if (!$dbman->field_exists($table, $field)) {
2999             $dbman->add_field($table, $field);
3000         }
3002         $field = new xmldb_field('author', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'source');
3004     /// Conditionally launch add field author
3005         if (!$dbman->field_exists($table, $field)) {
3006             $dbman->add_field($table, $field);
3007         }
3009         $field = new xmldb_field('license', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'author');
3011     /// Conditionally launch add field license
3012         if (!$dbman->field_exists($table, $field)) {
3013             $dbman->add_field($table, $field);
3014         }
3016         upgrade_main_savepoint($result, 2010033101.01);
3017     }
3019     if ($result && $oldversion < 2010033101.02) {
3021     /// Define table license to be created
3022         $table = new xmldb_table('license');
3024     /// Adding fields to table license
3025         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3026         $table->add_field('shortname', XMLDB_TYPE_CHAR, '255', null, null, null, null);
3027         $table->add_field('fullname', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
3028         $table->add_field('source', XMLDB_TYPE_CHAR, '255', null, null, null, null);
3029         $table->add_field('enabled', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '1');
3030         $table->add_field('version', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
3032     /// Adding keys to table license
3033         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
3035     /// Conditionally launch create table for license
3036         if (!$dbman->table_exists($table)) {
3037             $dbman->create_table($table);
3038         }
3039         $active_licenses = array();
3041         $license = new stdclass;
3043         // add unknown license
3044         $license->shortname = 'unknown';
3045         $license->fullname = 'Unknown license';
3046         $license->source = '';
3047         $license->enabled = 1;
3048         $license->version = '2010033100';
3049         $active_licenses[] = $license->shortname;
3050         if ($record = $DB->get_record('license', array('shortname'=>$license->shortname))) {
3051             if ($record->version < $license->version) {
3052                 // update license record
3053                 $license->enabled = $record->enabled;
3054                 $license->id = $record->id;
3055                 $DB->update_record('license', $license);
3056             }
3057         } else {
3058             $DB->insert_record('license', $license);
3059         }
3061         // add all rights reserved license
3062         $license->shortname = 'allrightsreserved';
3063         $license->fullname = 'All rights reserved';
3064         $license->source = 'http://en.wikipedia.org/wiki/All_rights_reserved';
3065         $license->enabled = 1;
3066         $license->version = '2010033100';
3067         $active_licenses[] = $license->shortname;
3068         if ($record = $DB->get_record('license', array('shortname'=>$license->shortname))) {
3069             if ($record->version < $license->version) {
3070                 // update license record
3071                 $license->id = $record->id;
3072                 $license->enabled = $record->enabled;
3073                 $DB->update_record('license', $license);
3074             }
3075         } else {
3076             $DB->insert_record('license', $license);
3077         }
3079         // add public domain license
3080         $license->shortname = 'public';
3081         $license->fullname = 'Public Domain';
3082         $license->source = 'http://creativecommons.org/licenses/publicdomain/';
3083         $license->enabled = 1;
3084         $license->version = '2010033100';
3085         $active_licenses[] = $license->shortname;
3086         if ($record = $DB->get_record('license', array('shortname'=>$license->shortname))) {
3087             if ($record->version < $license->version) {
3088                 // update license record
3089                 $license->enabled = $record->enabled;
3090                 $license->id = $record->id;
3091                 $DB->update_record('license', $license);
3092             }
3093         } else {
3094             $DB->insert_record('license', $license);
3095         }
3097         // add creative commons license
3098         $license->shortname = 'cc';
3099         $license->fullname = 'Creative Commons';
3100         $license->source = 'http://creativecommons.org/licenses/by/3.0/';
3101         $license->enabled = 1;
3102         $license->version = '2010033100';
3103         $active_licenses[] = $license->shortname;
3104         if ($record = $DB->get_record('license', array('shortname'=>$license->shortname))) {
3105             if ($record->version < $license->version) {
3106                 // update license record
3107                 $license->enabled = $record->enabled;
3108                 $license->id = $record->id;
3109                 $DB->update_record('license', $license);
3110             }
3111         } else {
3112             $DB->insert_record('license', $license);
3113         }
3115         // add creative commons no derivs license
3116         $license->shortname = 'cc-nd';
3117         $license->fullname = 'Creative Commons - NoDerivs';
3118         $license->source = 'http://creativecommons.org/licenses/by-nd/3.0/';
3119         $license->enabled = 1;
3120         $license->version = '2010033100';
3121         $active_licenses[] = $license->shortname;
3122         if ($record = $DB->get_record('license', array('shortname'=>$license->shortname))) {
3123             if ($record->version < $license->version) {
3124                 // update license record
3125                 $license->enabled = $record->enabled;
3126                 $license->id = $record->id;
3127                 $DB->update_record('license', $license);
3128             }
3129         } else {
3130             $DB->insert_record('license', $license);
3131         }
3133         // add creative commons no commercial no derivs license
3134         $license->shortname = 'cc-nc-nd';
3135         $license->fullname = 'Creative Commons - No Commercial NoDerivs';
3136         $license->source = 'http://creativecommons.org/licenses/by-nc-nd/3.0/';
3137         $license->enabled = 1;
3138         $license->version = '2010033100';
3139         $active_licenses[] = $license->shortname;
3140         if ($record = $DB->get_record('license', array('shortname'=>$license->shortname))) {
3141             if ($record->version < $license->version) {
3142                 // update license record
3143                 $license->enabled = $record->enabled;
3144                 $license->id = $record->id;
3145                 $DB->update_record('license', $license);
3146             }
3147         } else {
3148             $DB->insert_record('license', $license);
3149         }
3151         // add creative commons no commercial
3152         $license->shortname = 'cc-nc-nd';
3153         $license->shortname = 'cc-nc';
3154         $license->fullname = 'Creative Commons - No Commercial';
3155         $license->source = 'http://creativecommons.org/licenses/by-nd/3.0/';
3156         $license->enabled = 1;
3157         $license->version = '2010033100';
3158         $active_licenses[] = $license->shortname;
3159         if ($record = $DB->get_record('license', array('shortname'=>$license->shortname))) {
3160             if ($record->version < $license->version) {
3161                 // update license record
3162                 $license->enabled = $record->enabled;
3163                 $license->id = $record->id;
3164                 $DB->update_record('license', $license);
3165             }
3166         } else {
3167             $DB->insert_record('license', $license);
3168         }
3170         // add creative commons no commercial sharealike
3171         $license->shortname = 'cc-nc-sa';
3172         $license->fullname = 'Creative Commons - No Commercial ShareAlike';
3173         $license->source = 'http://creativecommons.org/licenses/by-nc-sa/3.0/';
3174         $license->enabled = 1;
3175         $license->version = '2010033100';
3176         $active_licenses[] = $license->shortname;
3177         if ($record = $DB->get_record('license', array('shortname'=>$license->shortname))) {
3178             if ($record->version < $license->version) {
3179                 // update license record
3180                 $license->enabled = $record->enabled;
3181                 $license->id = $record->id;
3182                 $DB->update_record('license', $license);
3183             }
3184         } else {
3185             $DB->insert_record('license', $license);
3186         }
3188         // add creative commons sharealike
3189         $license->shortname = 'cc-sa';
3190         $license->fullname = 'Creative Commons - ShareAlike';
3191         $license->source = 'http://creativecommons.org/licenses/by-sa/3.0/';
3192         $license->enabled = 1;
3193         $license->version = '2010033100';
3194         $active_licenses[] = $license->shortname;
3195         if ($record = $DB->get_record('license', array('shortname'=>$license->shortname))) {
3196             if ($record->version < $license->version) {
3197                 // update license record
3198                 $license->enabled = $record->enabled;
3199                 $license->id = $record->id;
3200                 $DB->update_record('license', $license);
3201             }
3202         } else {
3203             $DB->insert_record('license', $license);
3204         }
3206         set_config('licenses', implode(',', $active_licenses));
3207     /// set site default license
3208         set_config('sitedefaultlicense', 'allrightsreserved');
3210     /// Main savepoint reached
3211         upgrade_main_savepoint($result, 2010033101.02);
3212     }
3214     if ($result && $oldversion < 2010033102.00) {
3215         // rename course view capability to participate
3216         $params = array('view'=>'moodle/course:view', 'participate'=>'moodle/course:participate');
3217         $sql = "UPDATE {role_capabilities} SET capability = :participate WHERE capability = :view";
3218         $DB->execute($sql, $params);
3219         $sql = "UPDATE {capabilities} SET name = :participate WHERE name = :view";
3220         $DB->execute($sql, $params);
3221         // note: the view capability is readded again at the end of upgrade, but with different meaning
3222         upgrade_main_savepoint($result, 2010033102.00);
3223     }
3225     if ($result && $oldversion < 2010033102.01) {
3226         // Define field archetype to be added to role table
3227         $table = new xmldb_table('role');
3228         $field = new xmldb_field('archetype', XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, null, 'sortorder');
3229         $dbman->add_field($table, $field);
3230         upgrade_main_savepoint($result, 2010033102.01);
3231     }
3233     if ($result && $oldversion < 2010033102.02) {
3234         // Set archetype for existing roles and change admin role to manager role
3235         $sql = "SELECT r.*, rc.capability
3236                   FROM {role} r
3237                   JOIN {role_capabilities} rc ON rc.roleid = r.id
3238                  WHERE rc.contextid = :syscontextid AND rc.capability LIKE :legacycaps
3239               ORDER BY r.id";
3240         $params = array('syscontextid'=>SYSCONTEXTID, 'legacycaps'=>'moodle/legacy:%');
3241         $substart = strlen('moodle/legacy:');
3242         $roles = $DB->get_recordset_sql($sql, $params); // in theory could be multiple legacy flags in one role
3243         foreach ($roles as $role) {
3244             $role->archetype = substr($role->capability, $substart);
3245             unset($role->capability);
3246             if ($role->archetype === 'admin') {
3247                 $role->archetype = 'manager';
3248                 if ($role->shortname === 'admin') {
3249                     $role->shortname   = 'manager';
3250                     $role->name        = get_string('manager', 'role');
3251                     $role->description = get_string('managerdescription', 'role');
3252                 }
3253             }
3254             $DB->update_record('role', $role);
3255         }
3256         $roles->close();
3258         upgrade_main_savepoint($result, 2010033102.02);
3259     }
3261     if ($result && $oldversion < 2010033102.03) {
3262         // Now pick site admins (===have manager role assigned at the system context)
3263         // and store them in the new $CFG->siteadmins setting as comma separated list
3264         $sql = "SELECT ra.id, ra.userid
3265                   FROM {role_assignments} ra
3266                   JOIN {role} r ON r.id = ra.roleid
3267                   JOIN {user} u ON u.id = ra.userid
3268                  WHERE ra.contextid = :syscontext AND r.archetype = 'manager' AND u.deleted = 0
3269               ORDER BY ra.id";
3270         $ras = $DB->get_records_sql($sql, array('syscontext'=>SYSCONTEXTID));
3271         $admins = array();
3272         foreach ($ras as $ra) {
3273             $admins[$ra->userid] = $ra->userid;
3274             set_config('siteadmins', implode(',', $admins)); // better to save it repeatedly, we do need at least one admin
3275             $DB->delete_records('role_assignments', array('id'=>$ra->id));
3276         }
3278         upgrade_main_savepoint($result, 2010033102.03);
3279     }
3281     if ($result && $oldversion < 2010033102.04) {
3282         // clean up the manager roles
3283         $managers = $DB->get_records('role', array('archetype'=>'manager'));
3284         foreach ($managers as $manager) {
3285             // now sanitize the capabilities and overrides
3286             $DB->delete_records('role_capabilities', array('capability'=>'moodle/site:config', 'roleid'=>$manager->id)); // only site admins may configure servers
3287             // note: doanything and legacy caps are deleted automatically, they get moodle/course:view later at the end of the upgrade
3289             // set usable contexts
3290             $DB->delete_records('role_context_levels', array('roleid'=>$manager->id));
3291             $assignlevels = array(CONTEXT_SYSTEM, CONTEXT_COURSECAT, CONTEXT_COURSE);
3292             foreach ($assignlevels as $assignlevel) {
3293                 $record = (object)array('roleid'=>$manager->id, 'contextlevel'=>$assignlevel);
3294                 $DB->insert_record('role_context_levels', $record);
3295             }
3297             // remove manager role assignments bellow the course context level - admin role was never intended for activities and blocks,
3298             // the problem is that those assignments would not be visible after upgrade and old style admins in activities make no sense anyway
3299             $DB->delete_records_select('role_assignments', "roleid = :manager AND contextid IN (SELECT id FROM {context} WHERE contextlevel > 50)", array('manager'=>$manager->id));
3301             // allow them to assign all roles except default user, guest and frontpage - users get these roles automatically on the fly when needed
3302             $DB->delete_records('role_allow_assign', array('roleid'=>$manager->id));
3303             $roles = $DB->get_records_sql("SELECT * FROM {role} WHERE archetype <> 'user' AND archetype <> 'guest' AND archetype <> 'frontpage'");
3304             foreach ($roles as $role) {
3305                 $record = (object)array('roleid'=>$manager->id, 'allowassign'=>$role->id);
3306                 $DB->insert_record('role_allow_assign', $record);
3307             }
3309             // allow them to override all roles
3310             $DB->delete_records('role_allow_override', array('roleid'=>$manager->id));
3311             $roles = $DB->get_records_sql("SELECT * FROM {role}");
3312             foreach ($roles as $role) {
3313                 $record = (object)array('roleid'=>$manager->id, 'allowoverride'=>$role->id);
3314                 $DB->insert_record('role_allow_override', $record);
3315             }
3317             // allow them to switch to all following roles
3318             $DB->delete_records('role_allow_switch', array('roleid'=>$manager->id));
3319             $roles = $DB->get_records_sql("SELECT * FROM {role} WHERE archetype IN ('student', 'teacher', 'editingteacher')");
3320             foreach ($roles as $role) {
3321                 $record = (object)array('roleid'=>$manager->id, 'allowswitch'=>$role->id);
3322                 $DB->insert_record('role_allow_switch', $record);
3323             }
3324         }
3326         upgrade_main_savepoint($result, 2010033102.04);
3327     }
3329     if ($result && $oldversion < 2010033102.05) {
3330         // remove course:view from all roles that are not used for enrolment, it does NOT belong there because it really means user is enrolled!
3331         $noenrolroles = $DB->get_records_select('role', "archetype IN ('guest', 'user', 'manager', 'coursecreator', 'frontpage')");
3332         foreach ($noenrolroles as $role) {
3333             $DB->delete_records('role_capabilities', array('roleid'=>$role->id, 'capability'=>'moodle/course:participate'));
3334         }
3335         upgrade_main_savepoint($result, 2010033102.05);
3336     }
3338     if ($result && $oldversion < 2010033102.06) {
3339         // make sure there is nothing weird in default user role
3340         if (!empty($CFG->defaultuserroleid)) {
3341             if ($role = $DB->get_record('role', array('id'=>$CFG->defaultuserroleid))) {
3342                 if ($role->archetype !== '' and $role->archetype !== 'user') {
3343                     upgrade_log(UPGRADE_LOG_NOTICE, null, 'Default authenticated user role (defaultuserroleid) value is invalid, setting cleared.');
3344                     unset_config('defaultuserroleid');
3345                 }
3346             } else {
3347                 unset_config('defaultuserroleid');
3348             }
3349         }
3350         upgrade_main_savepoint($result, 2010033102.06);
3351     }
3353     if ($result && $oldversion < 2010033102.07) {
3354         if (!empty($CFG->displayloginfailures) and $CFG->displayloginfailures === 'teacher') {
3355             upgrade_log(UPGRADE_LOG_NOTICE, null, 'Displaying of login failuters to teachers is not supported any more.');
3356             unset_config('displayloginfailures');
3357         }
3358         upgrade_main_savepoint($result, 2010033102.07);
3359     }
3361     if ($result && $oldversion < 2010033102.08) {
3362         // make sure there are no problems in default guest role settings
3363         if (!empty($CFG->guestroleid)) {
3364             if ($role = $DB->get_record('role', array('id'=>$CFG->guestroleid))) {
3365                 if ($role->archetype !== '' and $role->archetype !== 'guest') {
3366                     upgrade_log(UPGRADE_LOG_NOTICE, null, 'Default guest role (guestroleid) value is invalid, setting cleared.');
3367                     unset_config('guestroleid');
3368                 }
3369             } else {
3370                 upgrade_log(UPGRADE_LOG_NOTICE, null, 'Role specified in Default guest role (guestroleid) doeas not exist, setting cleared.');
3371                 unset_config('guestroleid');
3372             }
3373         }
3374         // remove all roles of the guest account - the only way to change it is to override the guest role, sorry
3375         // the guest account gets all the role assignemnts on the fly whcih works fine in has_capability(),
3376         $DB->delete_records_select('role_assignments', "userid IN (SELECT id FROM {user} WHERE username = 'guest')");
3378         upgrade_main_savepoint($result, 2010033102.08);
3379     }
3381     if ($result && $oldversion < 2010033102.09) {
3382         // For MDL-17501. Ensure that any role that has moodle/course:update also has moodle/course:visibility.
3383         // Get the roles with 'moodle/course:update'.
3384         $systemcontext = get_context_instance(CONTEXT_SYSTEM);
3385         $roles = get_roles_with_capability('moodle/course:update', CAP_ALLOW, $systemcontext);
3387         // Give those roles 'moodle/course:visibility'.
3388         foreach ($roles as $role) {
3389             assign_capability('moodle/course:visibility', CAP_ALLOW, $role->id, $systemcontext->id);
3390         }
3392         // Force all sessions to refresh access data.
3393         mark_context_dirty($systemcontext->path);
3395         // Main savepoint reached
3396         upgrade_main_savepoint($result, 2010033102.09);
3397     }
3399     if ($result && $oldversion < 2010040700) {
3400         // migrate old groupings --> groupmembersonly setting
3401         if (isset($CFG->enablegroupings)) {
3402             set_config('enablegroupmembersonly', $CFG->enablegroupings);
3403             unset_config('enablegroupings');
3404         }
3406         // Main savepoint reached
3407         upgrade_main_savepoint($result, 2010040700);
3408     }
3410     if ($result && $oldversion < 2010040900) {
3412         // Changing the default of field lang on table user to good old "en"
3413         $table = new xmldb_table('user');
3414         $field = new xmldb_field('lang', XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, 'en', 'country');
3416         // Launch change of default for field lang
3417         $dbman->change_field_default($table, $field);
3419         // update main site lang
3420         if (strpos($CFG->lang, '_utf8') !== false) {
3421             $lang = str_replace('_utf8', '', $CFG->lang);
3422             set_config('lang', $lang);
3423         }
3425         // tweak langlist
3426         if (!empty($CFG->langlist)) {
3427             $langs = explode(',', $CFG->langlist);
3428             foreach ($langs as $key=>$lang) {
3429                 $lang = str_replace('_utf8', '', $lang);
3430                 $langs[$key] = $lang;
3431             }
3432             set_config('langlist', implode(',', $langs));
3433         }
3435         // Main savepoint reached
3436         upgrade_main_savepoint($result, 2010040900);
3437     }
3439     if ($result && $oldversion < 2010040901) {
3441         // Remove "_utf8" suffix from all langs in user table
3442         $langs = $DB->get_records_sql("SELECT DISTINCT lang FROM {user} WHERE lang LIKE ?", array('%_utf8'));
3444         foreach ($langs as $lang=>$unused) {
3445             $newlang = str_replace('_utf8', '', $lang);
3446             $sql = "UPDATE {user} SET lang = :newlang WHERE lang = :lang";
3447             $DB->execute($sql, array('newlang'=>$newlang, 'lang'=>$lang));
3448         }
3450         // Main savepoint reached
3451         upgrade_main_savepoint($result, 2010040901);
3452     }
3454     if ($result && $oldversion < 2010041301) {
3455         $sql = "UPDATE {block} SET name=? WHERE name=?";
3456         $DB->execute($sql, array('navigation', 'global_navigation_tree'));
3457         $DB->execute($sql, array('settings', 'settings_navigation_tree'));
3459         $sql = "UPDATE {block_instances} SET blockname=? WHERE blockname=?";
3460         $DB->execute($sql, array('navigation', 'global_navigation_tree'));
3461         $DB->execute($sql, array('settings', 'settings_navigation_tree'));
3462         upgrade_main_savepoint($result, 2010041301);
3463     }
3465     if ($result && $oldversion < 2010042100) {
3467     /// Define table backup_controllers to be created
3468         $table = new xmldb_table('backup_controllers');
3470     /// Adding fields to table backup_controllers
3471         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3472         $table->add_field('backupid', XMLDB_TYPE_CHAR, '32', null, XMLDB_NOTNULL, null, null);
3473         $table->add_field('type', XMLDB_TYPE_CHAR, '6', null, XMLDB_NOTNULL, null, null);
3474         $table->add_field('itemid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3475         $table->add_field('format', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null);
3476         $table->add_field('interactive', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3477         $table->add_field('purpose', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3478         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3479         $table->add_field('status', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3480         $table->add_field('execution', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3481         $table->add_field('executiontime', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3482         $table->add_field('checksum', XMLDB_TYPE_CHAR, '32', null, XMLDB_NOTNULL, null, null);
3483         $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3484         $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3485         $table->add_field('controller', XMLDB_TYPE_TEXT, 'big', null, XMLDB_NOTNULL, null, null);
3487     /// Adding keys to table backup_controllers
3488         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
3489         $table->add_key('backupid_uk', XMLDB_KEY_UNIQUE, array('backupid'));
3490         $table->add_key('userid_fk', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
3492     /// Adding indexes to table backup_controllers
3493         $table->add_index('typeitem_ix', XMLDB_INDEX_NOTUNIQUE, array('type', 'itemid'));
3495     /// Conditionally launch create table for backup_controllers
3496         if (!$dbman->table_exists($table)) {
3497             $dbman->create_table($table);
3498         }
3500     /// Define table backup_ids_template to be created
3501         $table = new xmldb_table('backup_ids_template');
3503     /// Adding fields to table backup_ids_template
3504         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3505         $table->add_field('backupid', XMLDB_TYPE_CHAR, '32', null, XMLDB_NOTNULL, null, null);
3506         $table->add_field('itemname', XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, null);
3507         $table->add_field('itemid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3508         $table->add_field('parentitemid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
3510     /// Adding keys to table backup_ids_template
3511         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
3512         $table->add_key('backupid_itemname_itemid_uk', XMLDB_KEY_UNIQUE, array('backupid', 'itemname', 'itemid'));
3514     /// Adding indexes to table backup_ids_template
3515         $table->add_index('backupid_parentitemid_ix', XMLDB_INDEX_NOTUNIQUE, array('backupid', 'itemname', 'parentitemid'));
3517     /// Conditionally launch create table for backup_controllers
3518         if (!$dbman->table_exists($table)) {
3519             $dbman->create_table($table);
3520         }
3522     /// Main savepoint reached
3523         upgrade_main_savepoint($result, 2010042100);
3524     }
3526     if ($result && $oldversion < 2010042301) {
3528         $table = new xmldb_table('course_sections');
3529         $field = new xmldb_field('name', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'section');
3531         if (!$dbman->field_exists($table, $field)) {
3532             $dbman->add_field($table, $field);
3533         }
3535         upgrade_main_savepoint($result, 2010042301);
3536     }
3538     if ($result && $oldversion < 2010042302) {
3539         // Define table cohort to be created
3540         $table = new xmldb_table('cohort');
3542         // Adding fields to table cohort
3543         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3544         $table->add_field('contextid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3545         $table->add_field('name', XMLDB_TYPE_CHAR, '254', null, XMLDB_NOTNULL, null, null);
3546         $table->add_field('idnumber', XMLDB_TYPE_CHAR, '100', null, null, null, null);
3547         $table->add_field('description', XMLDB_TYPE_TEXT, 'small', null, null, null, null);
3548         $table->add_field('descriptionformat', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3549         $table->add_field('component', XMLDB_TYPE_CHAR, '100', null, null, null, null);
3550         $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3551         $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3553         // Adding keys to table cohort
3554         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
3555         $table->add_key('context', XMLDB_KEY_FOREIGN, array('contextid'), 'context', array('id'));
3557         // Conditionally launch create table for cohort
3558         if (!$dbman->table_exists($table)) {
3559             $dbman->create_table($table);
3560         }
3562         upgrade_main_savepoint($result, 2010042302);
3563     }
3565     if ($result && $oldversion < 2010042303) {
3566         // Define table cohort_members to be created
3567         $table = new xmldb_table('cohort_members');
3569         // Adding fields to table cohort_members
3570         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3571         $table->add_field('cohortid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3572         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3573         $table->add_field('timeadded', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3575         // Adding keys to table cohort_members
3576         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
3577         $table->add_key('cohortid', XMLDB_KEY_FOREIGN, array('cohortid'), 'cohort', array('id'));
3578         $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
3580         // Adding indexes to table cohort_members
3581         $table->add_index('cohortid-userid', XMLDB_INDEX_UNIQUE, array('cohortid', 'userid'));
3583         // Conditionally launch create table for cohort_members
3584         if (!$dbman->table_exists($table)) {
3585             $dbman->create_table($table);
3586         }
3588         // Main savepoint reached
3589         upgrade_main_savepoint($result, 2010042303);
3590     }
3592     if ($result && $oldversion < 2010042800) {
3593         //drop the previously created ratings table
3594         $table = new xmldb_table('ratings');
3595         if ($dbman->table_exists($table)) {
3596             $dbman->drop_table($table);
3597         }
3599         //create the rating table (replaces module specific rating implementations)
3600         $table = new xmldb_table('rating');
3601         if ($dbman->table_exists($table)) {
3602             $dbman->drop_table($table);
3603         }
3605     /// Adding fields to table rating
3606         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3607         $table->add_field('contextid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3609         $table->add_field('itemid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3610         $table->add_field('scaleid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
3611         $table->add_field('rating', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3612         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3614         $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3615         $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3617     /// Adding keys to table rating
3618         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
3619         $table->add_key('contextid', XMLDB_KEY_FOREIGN, array('contextid'), 'context', array('id'));
3620         $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
3622     /// Adding indexes to table rating
3623         $table->add_index('itemid', XMLDB_INDEX_NOTUNIQUE, array('itemid'));
3625     /// Create table for ratings
3626         if (!$dbman->table_exists($table)) {
3627             $dbman->create_table($table);
3628         }
3630         upgrade_main_savepoint($result, 2010042800);
3631     }
3633     if ($result && $oldversion < 2010042801) {
3634         // migrating old comments block content
3635         $DB->execute("UPDATE {comments}
3636                          SET contextid = (SELECT parentcontextid
3637                                             FROM {block_instances}
3638                                            WHERE id = {comments}.itemid AND blockname = 'comments'),
3639                              commentarea = 'page_comments',
3640                              itemid = 0
3641                        WHERE commentarea = 'block_comments'
3642                              AND itemid != 0
3643                              AND EXISTS (SELECT 'x'
3644                                            FROM {block_instances}
3645                                           WHERE id = {comments}.itemid
3646                                                 AND blockname = 'comments')");
3648         // remove all orphaned record
3649         $DB->delete_records('comments', array('commentarea'=>'block_comments'));
3650         upgrade_main_savepoint($result, 2010042801);
3651     }
3653     if ($result && $oldversion < 2010042802) { // Change backup_controllers->type to varchar10 (recreate dep. index)
3655     /// Define index typeitem_ix (not unique) to be dropped form backup_controllers
3656         $table = new xmldb_table('backup_controllers');
3657         $index = new xmldb_index('typeitem_ix', XMLDB_INDEX_NOTUNIQUE, array('type', 'itemid'));
3659     /// Conditionally launch drop index typeitem_ix
3660         if ($dbman->index_exists($table, $index)) {
3661             $dbman->drop_index($table, $index);
3662         }
3664     /// Changing precision of field type on table backup_controllers to (10)
3665         $table = new xmldb_table('backup_controllers');
3666         $field = new xmldb_field('type', XMLDB_TYPE_CHAR, '10', null, XMLDB_NOTNULL, null, null, 'backupid');
3668     /// Launch change of precision for field type
3669         $dbman->change_field_precision($table, $field);
3671     /// Define index typeitem_ix (not unique) to be added to backup_controllers
3672         $table = new xmldb_table('backup_controllers');
3673         $index = new xmldb_index('typeitem_ix', XMLDB_INDEX_NOTUNIQUE, array('type', 'itemid'));
3675     /// Conditionally launch add index typeitem_ix
3676         if (!$dbman->index_exists($table, $index)) {
3677             $dbman->add_index($table, $index);
3678         }
3680     /// Main savepoint reached
3681         upgrade_main_savepoint($result, 2010042802);
3682     }
3684     if ($result && $oldversion < 2010043000) {  // Adding new course completion feature
3686     /// Add course completion tables
3687     /// Define table course_completion_aggr_methd to be created
3688         $table = new xmldb_table('course_completion_aggr_methd');
3690     /// Adding fields to table course_completion_aggr_methd
3691         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3692         $table->add_field('course', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3693         $table->add_field('criteriatype', XMLDB_TYPE_INTEGER, '20', XMLDB_UNSIGNED, null, null, null);
3694         $table->add_field('method', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3695         $table->add_field('value', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null);
3697     /// Adding keys to table course_completion_aggr_methd
3698         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
3700     /// Adding indexes to table course_completion_aggr_methd
3701         $table->add_index('course', XMLDB_INDEX_NOTUNIQUE, array('course'));
3702         $table->add_index('criteriatype', XMLDB_INDEX_NOTUNIQUE, array('criteriatype'));
3704     /// Conditionally launch create table for course_completion_aggr_methd
3705         if (!$dbman->table_exists($table)) {
3706             $dbman->create_table($table);
3707         }
3710     /// Define table course_completion_criteria to be created
3711         $table = new xmldb_table('course_completion_criteria');
3713     /// Adding fields to table course_completion_criteria
3714         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3715         $table->add_field('course', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3716         $table->add_field('criteriatype', XMLDB_TYPE_INTEGER, '20', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3717         $table->add_field('module', XMLDB_TYPE_CHAR, '100', null, null, null, null);
3718         $table->add_field('moduleinstance', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
3719         $table->add_field('courseinstance', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
3720         $table->add_field('enrolperiod', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
3721         $table->add_field('timeend', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
3722         $table->add_field('gradepass', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null);
3723         $table->add_field('role', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
3725     /// Adding keys to table course_completion_criteria
3726         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
3728     /// Adding indexes to table course_completion_criteria
3729         $table->add_index('course', XMLDB_INDEX_NOTUNIQUE, array('course'));
3731     /// Conditionally launch create table for course_completion_criteria
3732         if (!$dbman->table_exists($table)) {
3733             $dbman->create_table($table);
3734         }
3737     /// Define table course_completion_crit_compl to be created
3738         $table = new xmldb_table('course_completion_crit_compl');
3740     /// Adding fields to table course_completion_crit_compl
3741         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3742         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3743         $table->add_field('course', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3744         $table->add_field('criteriaid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3745         $table->add_field('gradefinal', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null);
3746         $table->add_field('unenroled', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
3747         $table->add_field('deleted', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, null, null, null);
3748         $table->add_field('timecompleted', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
3750     /// Adding keys to table course_completion_crit_compl
3751         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
3753     /// Adding indexes to table course_completion_crit_compl
3754         $table->add_index('userid', XMLDB_INDEX_NOTUNIQUE, array('userid'));
3755         $table->add_index('course', XMLDB_INDEX_NOTUNIQUE, array('course'));
3756         $table->add_index('criteriaid', XMLDB_INDEX_NOTUNIQUE, array('criteriaid'));
3757         $table->add_index('timecompleted', XMLDB_INDEX_NOTUNIQUE, array('timecompleted'));
3759     /// Conditionally launch create table for course_completion_crit_compl
3760         if (!$dbman->table_exists($table)) {
3761             $dbman->create_table($table);
3762         }
3765     /// Define table course_completion_notify to be created
3766         $table = new xmldb_table('course_completion_notify');
3768     /// Adding fields to table course_completion_notify
3769         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3770         $table->add_field('course', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3771         $table->add_field('role', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3772         $table->add_field('message', XMLDB_TYPE_TEXT, 'small', null, XMLDB_NOTNULL, null, null);
3773         $table->add_field('timesent', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3775     /// Adding keys to table course_completion_notify
3776         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
3778     /// Adding indexes to table course_completion_notify
3779         $table->add_index('course', XMLDB_INDEX_NOTUNIQUE, array('course'));
3781     /// Conditionally launch create table for course_completion_notify
3782         if (!$dbman->table_exists($table)) {
3783             $dbman->create_table($table);
3784         }
3786     /// Define table course_completions to be created
3787         $table = new xmldb_table('course_completions');
3789     /// Adding fields to table course_completions
3790         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3791         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3792         $table->add_field('course', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3793         $table->add_field('deleted', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, null, null, null);
3794         $table->add_field('timenotified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
3795         $table->add_field('timeenrolled', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3796         $table->add_field('timestarted', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3797         $table->add_field('timecompleted', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
3798         $table->add_field('reaggregate', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3800     /// Adding keys to table course_completions
3801         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
3803     /// Adding indexes to table course_completions
3804         $table->add_index('userid', XMLDB_INDEX_NOTUNIQUE, array('userid'));
3805         $table->add_index('course', XMLDB_INDEX_NOTUNIQUE, array('course'));
3806         $table->add_index('timecompleted', XMLDB_INDEX_NOTUNIQUE, array('timecompleted'));
3808     /// Conditionally launch create table for course_completions
3809         if (!$dbman->table_exists($table)) {
3810             $dbman->create_table($table);
3811         }
3814     /// Add cols to course table
3815     /// Define field enablecompletion to be added to course
3816         $table = new xmldb_table('course');
3817         $field = new xmldb_field('enablecompletion', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'defaultrole');
3819     /// Conditionally launch add field enablecompletion
3820         if (!$dbman->field_exists($table, $field)) {
3821             $dbman->add_field($table, $field);
3822         }
3824     /// Define field completionstartonenrol to be added to course
3825         $field = new xmldb_field('completionstartonenrol', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'enablecompletion');
3827     /// Conditionally launch add field completionstartonenrol
3828         if (!$dbman->field_exists($table, $field)) {
3829             $dbman->add_field($table, $field);
3830         }
3832     /// Define field completionnotify to be added to course
3833         $field = new xmldb_field('completionnotify', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'enablecompletion');
3835     /// Conditionally launch add field completionnotify
3836         if (!$dbman->field_exists($table, $field)) {
3837             $dbman->add_field($table, $field);
3838         }
3840         upgrade_main_savepoint($result, 2010043000);
3841     }
3843     if ($result && $oldversion < 2010043001) {
3845     /// Define table registration_hubs to be created
3846         $table = new xmldb_table('registration_hubs');
3848     /// Adding fields to table registration_hubs
3849         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3850         $table->add_field('token', XMLDB_TYPE_CHAR, '40', null, XMLDB_NOTNULL, null, null);
3851         $table->add_field('hubname', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
3852         $table->add_field('huburl', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
3853         $table->add_field('confirmed', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3855     /// Adding keys to table registration_hubs
3856         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
3858     /// Conditionally launch create table for registration_hubs
3859         if (!$dbman->table_exists($table)) {
3860             $dbman->create_table($table);
3861         }
3863     /// Main savepoint reached
3864         upgrade_main_savepoint($result, 2010043001);
3865     }
3867     if ($result && $oldversion < 2010050200) {
3869     /// Define table backup_logs to be created
3870         $table = new xmldb_table('backup_logs');
3872     /// Adding fields to table backup_logs
3873         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3874         $table->add_field('backupid', XMLDB_TYPE_CHAR, '32', null, XMLDB_NOTNULL, null, null);
3875         $table->add_field('loglevel', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3876         $table->add_field('message', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
3877         $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
3879     /// Adding keys to table backup_logs
3880         $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
3881         $table->add_key('backupid', XMLDB_KEY_FOREIGN, array('backupid'), 'backup_controllers', array('backupid'));
3883     /// Adding indexes to table backup_logs
3884         $table->add_index('backupid-id', XMLDB_INDEX_UNIQUE, array('backupid', 'id'));
3886     /// Conditionally launch create table for backup_logs
3887         if (!$dbman->table_exists($table)) {
3888             $dbman->create_table($table);
3889         }
3891     /// Drop some old backup tables, not used anymore
3893     /// Define table backup_files to be dropped
3894         $table = new xmldb_table('backup_files');
3896     /// Conditionally launch drop table for backup_files
3897         if ($dbman->table_exists($table)) {
3898             $dbman->drop_table($table);
3899         }
3901     /// Define table backup_ids to be dropped
3902         $table = new xmldb_table('backup_ids');
3904     /// Conditionally launch drop table for backup_ids
3905         if ($dbman->table_exists($table)) {
3906             $dbman->drop_table($table);
3907         }
3909     /// Main savepoint reached
3910         upgrade_main_savepoint($result, 2010050200);
3911     }
3913     if ($result && $oldversion < 2010050403) {  // my_pages for My Moodle and Public Profile pages
3915     /// Define table my_pages to be created
3916         $table = new xmldb_table('my_pages');
3918     /// Adding fields to table my_pages
3919         $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
3920         $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, 0);
3921         $table->add_field('name', XMLDB_TYPE_CHAR, '200', null, XMLDB_NOTNULL, null, null);
3922         $table->add_field('private', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, 0);
3923         $table->add_field('sortorder', XMLDB_TYPE_INTEGER, '6', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
3926     /// Adding keys to table my_pages
3927         $table->add_key('id', XMLDB_KEY_PRIMARY, array('id'));
3929     /// Adding indexes to table my_pages
3930         $table->add_index('useridprivate', XMLDB_INDEX_NOTUNIQUE, array('userid', 'private'));
3932     /// Conditionally launch create table for my_pages
3933         if (!$dbman->table_exists($table)) {
3934             $dbman->create_table($table);
3935         }
3937     /// Add two lines of data into this new table.  These are the default pages.
3938         $mypage = new object();
3939         $mypage->userid = NULL;
3940         $mypage->name = '__default';
3941         $mypage->private = 0;
3942         $mypage->sortorder  = 0;
3943         if (!$DB->record_exists('my_pages', array('userid'=>NULL, 'private'=>0))) {
3944             $DB->insert_record('my_pages', $mypage);
3945         }
3946         $mypage->private = 1;
3947         if (!$DB->record_exists('my_pages', array('userid'=>NULL, 'private'=>1))) {
3948             $DB->insert_record('my_pages', $mypage);
3949         }
3951     /// This bit is a "illegal" hack, unfortunately, but there is not a better way to install default
3952     /// blocks right now, since the upgrade function need to be called after core AND plugins upgrade,
3953     /// and there is no such hook yet.  Sigh.
3955         if ($mypage = $DB->get_record('my_pages', array('userid'=>NULL, 'private'=>1))) {
3956             if (!$DB->record_exists('block_instances', array('pagetypepattern'=>'my-index', 'parentcontextid'=>SITEID, 'subpagepattern'=>$mypage->id))) {
3958                 // No default exist there yet, let's put a few into My Moodle so it's useful.
3960                 $blockinstance = new stdClass;
3961                 $blockinstance->parentcontextid = SITEID;
3962                 $blockinstance->showinsubcontexts = 0;
3963                 $blockinstance->pagetypepattern = 'my-index';
3964                 $blockinstance->subpagepattern = $mypage->id;
3965                 $blockinstance->configdata = '';
3967                 $blockinstance->blockname = 'private_files';
3968                 $blockinstance->defaultregion = 'side-post';
3969                 $blockinstance->defaultweight = 0;
3970                 $blockinstanceid = $DB->insert_record('block_instances', $blockinstance);
3971                 get_context_instance(CONTEXT_BLOCK, $blockinstanceid);
3973                 $blockinstance->blockname = 'online_users';
3974                 $blockinstance->defaultregion = 'side-post';
3975                 $blockinstance->defaultweight = 1;
3976                 $blockinstanceid = $DB->insert_record('block_instances', $blockinstance);
3977                 get_context_instance(CONTEXT_BLOCK, $blockinstanceid);
3979                 $blockinstance->blockname = 'course_overview';
3980                 $blockinstance->defaultregion = 'content';
3981                 $blockinstance->defaultweight = 0;
3982                 $blockinstanceid = $DB->insert_record('block_instances', $blockinstance);
3983                 get_context_instance(CONTEXT_BLOCK, $blockinstanceid);
3984             }
3985         }
3987     /// Main savepoint reached
3988         upgrade_main_savepoint($result, 2010050403);
3989     }
3991     // fix repository_alfresco version number
3992     if ($result && $oldversion < 2010050411) {
3993         // force to change repository_alfresco version number to upgrade smoothly (from preview 1 -> preview 2)
3994         if ($repository_plugin = $DB->get_record('config_plugins', array('plugin'=>'repositor