mirror of
https://github.com/moodle/moodle.git
synced 2025-01-19 14:27:22 +01:00
a4051353d1
This reverts commit 296c0247c6cc9e525721fc92b5a78c7146e6887d, reversing changes made to 2511b0742a3695298d8216fe9723581c089909d7. Conflicts: lib/db/upgrade.php version.php
333 lines
12 KiB
PHP
333 lines
12 KiB
PHP
<?php
|
|
|
|
// This file is part of Moodle - http://moodle.org/
|
|
//
|
|
// Moodle is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Moodle is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
/**
|
|
* This file keeps track of upgrades to Moodle.
|
|
*
|
|
* Sometimes, changes between versions involve
|
|
* alterations to database structures and other
|
|
* major things that may break installations.
|
|
*
|
|
* The upgrade function in this file will attempt
|
|
* to perform all the necessary actions to upgrade
|
|
* your older installation to the current version.
|
|
*
|
|
* If there's something it cannot do itself, it
|
|
* will tell you what you need to do.
|
|
*
|
|
* The commands in here will all be database-neutral,
|
|
* using the methods of database_manager class
|
|
*
|
|
* Please do not forget to use upgrade_set_timeout()
|
|
* before any action that may take longer time to finish.
|
|
*
|
|
* @package core
|
|
* @subpackage admin
|
|
* @copyright 2006 onwards Martin Dougiamas http://dougiamas.com
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
|
|
defined('MOODLE_INTERNAL') || die();
|
|
|
|
/**
|
|
*
|
|
* @global stdClass $CFG
|
|
* @global stdClass $USER
|
|
* @global moodle_database $DB
|
|
* @global core_renderer $OUTPUT
|
|
* @param int $oldversion
|
|
* @return bool always true
|
|
*/
|
|
function xmldb_main_upgrade($oldversion) {
|
|
global $CFG, $USER, $DB, $OUTPUT;
|
|
|
|
require_once($CFG->libdir.'/db/upgradelib.php'); // Core Upgrade-related functions
|
|
|
|
$dbman = $DB->get_manager(); // loads ddl manager and xmldb classes
|
|
|
|
if ($oldversion < 2011120500) {
|
|
// just in case somebody hacks upgrade scripts or env, we really can not continue
|
|
echo("You need to upgrade to 2.2.x first!\n");
|
|
exit(1);
|
|
// Note this savepoint is 100% unreachable, but needed to pass the upgrade checks
|
|
upgrade_main_savepoint(true, 2011120500);
|
|
}
|
|
|
|
////////////////////////////////////////
|
|
///upgrade supported only from 2.2.x ///
|
|
////////////////////////////////////////
|
|
|
|
if ($oldversion < 2011120500.02) {
|
|
|
|
upgrade_set_timeout(60*20); // This may take a while
|
|
// MDL-28180. Some missing restrictions in certain backup & restore operations
|
|
// were causing incorrect duplicates in the course_completion_aggr_methd table.
|
|
// This upgrade step takes rid of them.
|
|
$sql = 'SELECT course, criteriatype, MIN(id) AS minid
|
|
FROM {course_completion_aggr_methd}
|
|
GROUP BY course, criteriatype
|
|
HAVING COUNT(*) > 1';
|
|
$duprs = $DB->get_recordset_sql($sql);
|
|
foreach ($duprs as $duprec) {
|
|
// We need to handle NULLs in criteriatype diferently
|
|
if (is_null($duprec->criteriatype)) {
|
|
$where = 'course = ? AND criteriatype IS NULL AND id > ?';
|
|
$params = array($duprec->course, $duprec->minid);
|
|
} else {
|
|
$where = 'course = ? AND criteriatype = ? AND id > ?';
|
|
$params = array($duprec->course, $duprec->criteriatype, $duprec->minid);
|
|
}
|
|
$DB->delete_records_select('course_completion_aggr_methd', $where, $params);
|
|
}
|
|
$duprs->close();
|
|
|
|
// Main savepoint reached
|
|
upgrade_main_savepoint(true, 2011120500.02);
|
|
}
|
|
|
|
if ($oldversion < 2011120500.03) {
|
|
|
|
// Changing precision of field value on table user_preferences to (1333)
|
|
$table = new xmldb_table('user_preferences');
|
|
$field = new xmldb_field('value', XMLDB_TYPE_CHAR, '1333', null, XMLDB_NOTNULL, null, null, 'name');
|
|
|
|
// Launch change of precision for field value
|
|
$dbman->change_field_precision($table, $field);
|
|
|
|
// Main savepoint reached
|
|
upgrade_main_savepoint(true, 2011120500.03);
|
|
}
|
|
|
|
if ($oldversion < 2012020200.03) {
|
|
|
|
// Define index rolecontext (not unique) to be added to role_assignments
|
|
$table = new xmldb_table('role_assignments');
|
|
$index = new xmldb_index('rolecontext', XMLDB_INDEX_NOTUNIQUE, array('roleid', 'contextid'));
|
|
|
|
// Conditionally launch add index rolecontext
|
|
if (!$dbman->index_exists($table, $index)) {
|
|
$dbman->add_index($table, $index);
|
|
}
|
|
|
|
// Define index usercontextrole (not unique) to be added to role_assignments
|
|
$index = new xmldb_index('usercontextrole', XMLDB_INDEX_NOTUNIQUE, array('userid', 'contextid', 'roleid'));
|
|
|
|
// Conditionally launch add index usercontextrole
|
|
if (!$dbman->index_exists($table, $index)) {
|
|
$dbman->add_index($table, $index);
|
|
}
|
|
|
|
// Main savepoint reached
|
|
upgrade_main_savepoint(true, 2012020200.03);
|
|
}
|
|
|
|
if ($oldversion < 2012020200.06) {
|
|
// Previously we always allowed users to override their email address via the messaging system
|
|
// We have now added a setting to allow admins to turn this this ability on and off
|
|
// While this setting defaults to 0 (off) we're setting it to 1 (on) to maintain the behaviour for upgrading sites
|
|
set_config('messagingallowemailoverride', 1);
|
|
|
|
// Main savepoint reached
|
|
upgrade_main_savepoint(true, 2012020200.06);
|
|
}
|
|
|
|
if ($oldversion < 2012021700.01) {
|
|
// Changing precision of field uniquehash on table post to 255
|
|
$table = new xmldb_table('post');
|
|
$field = new xmldb_field('uniquehash', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'content');
|
|
|
|
// Launch change of precision for field uniquehash
|
|
$dbman->change_field_precision($table, $field);
|
|
|
|
// Main savepoint reached
|
|
upgrade_main_savepoint(true, 2012021700.01);
|
|
}
|
|
|
|
if ($oldversion < 2012021700.02) {
|
|
// Somewhere before 1.9 summary and content column in post table were not null. In 1.9+
|
|
// not null became false.
|
|
$columns = $DB->get_columns('post');
|
|
|
|
// Fix discrepancies in summary field after upgrade from 1.9
|
|
if (array_key_exists('summary', $columns) && $columns['summary']->not_null != false) {
|
|
$table = new xmldb_table('post');
|
|
$summaryfield = new xmldb_field('summary', XMLDB_TYPE_TEXT, 'big', null, null, null, null, 'subject');
|
|
|
|
if ($dbman->field_exists($table, $summaryfield)) {
|
|
$dbman->change_field_notnull($table, $summaryfield);
|
|
}
|
|
|
|
}
|
|
|
|
// Fix discrepancies in content field after upgrade from 1.9
|
|
if (array_key_exists('content', $columns) && $columns['content']->not_null != false) {
|
|
$table = new xmldb_table('post');
|
|
$contentfield = new xmldb_field('content', XMLDB_TYPE_TEXT, 'big', null, null, null, null, 'summary');
|
|
|
|
if ($dbman->field_exists($table, $contentfield)) {
|
|
$dbman->change_field_notnull($table, $contentfield);
|
|
}
|
|
|
|
}
|
|
|
|
upgrade_main_savepoint(true, 2012021700.02);
|
|
}
|
|
|
|
// The ability to backup user (private) files is out completely - MDL-29248
|
|
if ($oldversion < 2012030100.01) {
|
|
unset_config('backup_general_user_files', 'backup');
|
|
unset_config('backup_general_user_files_locked', 'backup');
|
|
unset_config('backup_auto_user_files', 'backup');
|
|
|
|
upgrade_main_savepoint(true, 2012030100.01);
|
|
}
|
|
|
|
if ($oldversion < 2012030100.02) {
|
|
// migrate all numbers to signed - it should be safe to interrupt this and continue later
|
|
upgrade_mysql_fix_unsigned_columns();
|
|
|
|
// Main savepoint reached
|
|
upgrade_main_savepoint(true, 2012030100.02);
|
|
}
|
|
|
|
if ($oldversion < 2012030900.01) {
|
|
// migrate all texts and binaries to big size - it should be safe to interrupt this and continue later
|
|
upgrade_mysql_fix_lob_columns();
|
|
|
|
// Main savepoint reached
|
|
upgrade_main_savepoint(true, 2012030900.01);
|
|
}
|
|
|
|
if ($oldversion < 2012031500.01) {
|
|
// Upgrade old course_allowed_modules data to be permission overrides.
|
|
if ($CFG->restrictmodulesfor === 'all') {
|
|
$courses = $DB->get_records_menu('course', array(), 'id', 'id, 1');
|
|
} else if ($CFG->restrictmodulesfor === 'requested') {
|
|
$courses = $DB->get_records_menu('course', array('retrictmodules' => 1), 'id', 'id, 1');
|
|
} else {
|
|
$courses = array();
|
|
}
|
|
|
|
if (!$dbman->table_exists('course_allowed_modules')) {
|
|
// Upgrade must already have been run on this server. This might happen,
|
|
// for example, during development of these changes.
|
|
$courses = array();
|
|
}
|
|
|
|
$modidtoname = $DB->get_records_menu('modules', array(), 'id', 'id, name');
|
|
|
|
$coursecount = count($courses);
|
|
if ($coursecount) {
|
|
$pbar = new progress_bar('allowedmods', 500, true);
|
|
$transaction = $DB->start_delegated_transaction();
|
|
}
|
|
|
|
$i = 0;
|
|
foreach ($courses as $courseid => $notused) {
|
|
$i += 1;
|
|
upgrade_set_timeout(60); // 1 minute per course should be fine.
|
|
|
|
$allowedmoduleids = $DB->get_records_menu('course_allowed_modules',
|
|
array('course' => $courseid), 'module', 'module, 1');
|
|
if (empty($allowedmoduleids)) {
|
|
// This seems to be the best match for backwards compatibility,
|
|
// not necessarily with the old code in course_allowed_module function,
|
|
// but with the code that used to be in the coures settings form.
|
|
$allowedmoduleids = explode(',', $CFG->defaultallowedmodules);
|
|
$allowedmoduleids = array_combine($allowedmoduleids, $allowedmoduleids);
|
|
}
|
|
|
|
$context = context_course::instance($courseid);
|
|
|
|
list($roleids) = get_roles_with_cap_in_context($context, 'moodle/course:manageactivities');
|
|
list($managerroleids) = get_roles_with_cap_in_context($context, 'moodle/site:config');
|
|
foreach ($managerroleids as $roleid) {
|
|
unset($roleids[$roleid]);
|
|
}
|
|
|
|
foreach ($modidtoname as $modid => $modname) {
|
|
if (isset($allowedmoduleids[$modid])) {
|
|
// Module is allowed, no worries.
|
|
continue;
|
|
}
|
|
|
|
$capability = 'mod/' . $modname . ':addinstance';
|
|
foreach ($roleids as $roleid) {
|
|
assign_capability($capability, CAP_PREVENT, $roleid, $context);
|
|
}
|
|
}
|
|
|
|
$pbar->update($i, $coursecount, "Upgrading legacy course_allowed_modules data - $i/$coursecount.");
|
|
}
|
|
|
|
if ($coursecount) {
|
|
$transaction->allow_commit();
|
|
}
|
|
|
|
upgrade_main_savepoint(true, 2012031500.01);
|
|
}
|
|
|
|
if ($oldversion < 2012031500.02) {
|
|
|
|
// Define field retrictmodules to be dropped from course
|
|
$table = new xmldb_table('course');
|
|
$field = new xmldb_field('restrictmodules');
|
|
|
|
// Conditionally launch drop field requested
|
|
if ($dbman->field_exists($table, $field)) {
|
|
$dbman->drop_field($table, $field);
|
|
}
|
|
|
|
upgrade_main_savepoint(true, 2012031500.02);
|
|
}
|
|
|
|
if ($oldversion < 2012031500.03) {
|
|
|
|
// Define table course_allowed_modules to be dropped
|
|
$table = new xmldb_table('course_allowed_modules');
|
|
|
|
// Conditionally launch drop table for course_allowed_modules
|
|
if ($dbman->table_exists($table)) {
|
|
$dbman->drop_table($table);
|
|
}
|
|
|
|
upgrade_main_savepoint(true, 2012031500.03);
|
|
}
|
|
|
|
if ($oldversion < 2012031500.04) {
|
|
// Clean up the old admin settings.
|
|
unset_config('restrictmodulesfor');
|
|
unset_config('restrictbydefault');
|
|
unset_config('defaultallowedmodules');
|
|
|
|
upgrade_main_savepoint(true, 2012031500.04);
|
|
}
|
|
|
|
if ($oldversion < 2012032300.02) {
|
|
// Migrate the old admin debug setting.
|
|
if ($CFG->debug == 38911) {
|
|
set_config('debug', DEBUG_DEVELOPER);
|
|
} else if ($CFG->debug == 6143) {
|
|
set_config('debug', DEBUG_ALL);
|
|
}
|
|
upgrade_main_savepoint(true, 2012032300.02);
|
|
}
|
|
|
|
|
|
return true;
|
|
}
|