Merge branch 'w30_MDL-34441_m23_dbtransfer' of git://github.com/skodak/moodle into MOODLE_23_STABLE
This commit is contained in:
@@ -0,0 +1,186 @@
|
||||
<?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 script migrates data from current database to another
|
||||
*
|
||||
* This script is not intended for beginners!
|
||||
* Potential problems:
|
||||
* - su to apache account or sudo before execution
|
||||
* - already broken DB scheme or invalid data
|
||||
*
|
||||
* @package tool_dbtransfer
|
||||
* @copyright 2012 Petr Skoda {@link http://skodak.org/}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
define('CLI_SCRIPT', true);
|
||||
|
||||
require(__DIR__.'/../../../../config.php');
|
||||
require_once($CFG->libdir.'/clilib.php');
|
||||
require_once(__DIR__.'/../locallib.php');
|
||||
|
||||
$help =
|
||||
"Database migration script.
|
||||
|
||||
It is strongly recommended to turn off the web server
|
||||
or enable CLI maintenance mode before starting the migration.
|
||||
|
||||
Options:
|
||||
--dbtype=TYPE Database type.
|
||||
--dblibrary=TYPE Database library. Defaults to 'native'.
|
||||
--dbhost=HOST Database host.
|
||||
--dbname=NAME Database name.
|
||||
--dbuser=USERNAME Database user.
|
||||
--dbpass=PASSWORD Database password.
|
||||
--dbport=NUMBER Database port.
|
||||
--prefix=STRING Table prefix for above database tables.
|
||||
--dbsocket=PATH Use database sockets. Available for some databases only.
|
||||
-h, --help Print out this help.
|
||||
|
||||
Example:
|
||||
\$ sudo -u www-data /usr/bin/php admin/tool/dbtransfer/cli/migrate.php
|
||||
";
|
||||
|
||||
// Now get cli options.
|
||||
list($options, $unrecognized) = cli_get_params(
|
||||
array(
|
||||
'dbtype' => null,
|
||||
'dblibrary' => 'native',
|
||||
'dbhost' => null,
|
||||
'dbname' => null,
|
||||
'dbuser' => null,
|
||||
'dbpass' => null,
|
||||
'dbport' => null,
|
||||
'prefix' => null,
|
||||
'dbsocket' => null,
|
||||
'maintenance' => null,
|
||||
'list' => false,
|
||||
'help' => false,
|
||||
),
|
||||
array(
|
||||
'm' => 'maintenance',
|
||||
'l' => 'list',
|
||||
'h' => 'help',
|
||||
)
|
||||
);
|
||||
|
||||
if ($options['help']) {
|
||||
echo $help;
|
||||
exit(0);
|
||||
}
|
||||
|
||||
echo "\n".get_string('cliheading', 'tool_dbtransfer')."\n\n";
|
||||
|
||||
|
||||
$drivers = tool_dbtransfer_get_drivers();
|
||||
|
||||
if (!isset($options['dbtype'])) {
|
||||
$choose = array();
|
||||
foreach ($drivers as $driver=>$name) {
|
||||
list($dbtype, $dblibrary) = explode('/', $driver);
|
||||
$choose[$dbtype] = $dbtype;
|
||||
}
|
||||
$optionsstr = implode(', ', $choose);
|
||||
cli_heading(get_string('databasetypehead', 'install')." ($optionsstr)");
|
||||
$options['dbtype'] = cli_input(get_string('clitypevalue', 'admin'), '', $choose, true);
|
||||
}
|
||||
|
||||
$choose = array();
|
||||
foreach ($drivers as $driver=>$name) {
|
||||
list($dbtype, $dblibrary) = explode('/', $driver);
|
||||
if ($dbtype === $options['dbtype']) {
|
||||
$choose[$dblibrary] = $dblibrary;
|
||||
}
|
||||
}
|
||||
if (!isset($options['dblibrary']) or !isset($choose[$options['dblibrary']])) {
|
||||
$optionsstr = implode(', ', $choose);
|
||||
cli_heading('Database library'." ($optionsstr)"); // note: no need to localise unless we add real PDO drivers
|
||||
$options['dblibrary'] = cli_input(get_string('clitypevalue', 'admin'), '', $choose, true);
|
||||
}
|
||||
|
||||
if (!isset($options['dbhost'])) {
|
||||
cli_heading(get_string('databasehost', 'install'));
|
||||
$options['dbhost'] = cli_input(get_string('clitypevalue', 'admin'));
|
||||
}
|
||||
|
||||
if (!isset($options['dbname'])) {
|
||||
cli_heading(get_string('databasename', 'install'));
|
||||
$options['dbname'] = cli_input(get_string('clitypevalue', 'admin'));
|
||||
}
|
||||
|
||||
if (!isset($options['dbuser'])) {
|
||||
cli_heading(get_string('databaseuser', 'install'));
|
||||
$options['dbuser'] = cli_input(get_string('clitypevalue', 'admin'));
|
||||
}
|
||||
|
||||
if (!isset($options['dbpass'])) {
|
||||
cli_heading(get_string('databasepass', 'install'));
|
||||
$options['dbpass'] = cli_input(get_string('clitypevalue', 'admin'));
|
||||
}
|
||||
|
||||
if (!isset($options['prefix'])) {
|
||||
cli_heading(get_string('dbprefix', 'install'));
|
||||
$options['prefix'] = cli_input(get_string('clitypevalue', 'admin'));
|
||||
}
|
||||
|
||||
if (!isset($options['dbport'])) {
|
||||
cli_heading(get_string('dbport', 'install'));
|
||||
$options['dbport'] = cli_input(get_string('clitypevalue', 'admin'));
|
||||
}
|
||||
|
||||
if ($CFG->ostype !== 'WINDOWS') {
|
||||
if (!isset($options['dbsocket'])) {
|
||||
cli_heading(get_string('databasesocket', 'install'));
|
||||
$options['dbsocket'] = cli_input(get_string('clitypevalue', 'admin'));
|
||||
}
|
||||
}
|
||||
|
||||
$a = (object)array('dbtypefrom'=>$CFG->dbtype, 'dbtype'=>$options['dbtype'], 'dbname'=>$options['dbname'], 'dbhost'=>$options['dbhost']);
|
||||
cli_heading(get_string('transferringdbto', 'tool_dbtransfer', $a));
|
||||
|
||||
// Try target DB connection.
|
||||
$problem = '';
|
||||
|
||||
$targetdb = moodle_database::get_driver_instance($options['dbtype'], $options['dblibrary']);
|
||||
$dboptions = array();
|
||||
if ($options['dbport']) {
|
||||
$dboptions['dbport'] = $options['dbport'];
|
||||
}
|
||||
if ($options['dbsocket']) {
|
||||
$dboptions['dbsocket'] = $options['dbsocket'];
|
||||
}
|
||||
try {
|
||||
$targetdb->connect($options['dbhost'], $options['dbuser'], $options['dbpass'], $options['dbname'], $options['prefix'], $dboptions);
|
||||
if ($targetdb->get_tables()) {
|
||||
$problem .= get_string('targetdatabasenotempty', 'tool_dbtransfer');
|
||||
}
|
||||
} catch (moodle_exception $e) {
|
||||
$problem .= $e->debuginfo."\n\n";
|
||||
$problem .= get_string('notargetconectexception', 'tool_dbtransfer');
|
||||
}
|
||||
|
||||
if ($problem !== '') {
|
||||
echo $problem."\n\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
$feedback = new text_progress_trace();
|
||||
tool_dbtransfer_transfer_database($DB, $targetdb, $feedback);
|
||||
$feedback->finished();
|
||||
|
||||
cli_heading(get_string('success'));
|
||||
exit(0);
|
||||
@@ -17,16 +17,19 @@
|
||||
/**
|
||||
* Transfer form
|
||||
*
|
||||
* @package tool
|
||||
* @subpackage dbtransfer
|
||||
* @copyright 2008 Petr Skoda
|
||||
* @package tool_dbtransfer
|
||||
* @copyright 2008 Petr Skoda {@link http://skodak.org/}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die;
|
||||
|
||||
require_once $CFG->libdir.'/formslib.php';
|
||||
require_once($CFG->libdir.'/formslib.php');
|
||||
|
||||
|
||||
/**
|
||||
* Definition of db export settings form.
|
||||
*/
|
||||
class database_export_form extends moodleform {
|
||||
|
||||
function definition() {
|
||||
|
||||
@@ -17,55 +17,81 @@
|
||||
/**
|
||||
* Transfer form
|
||||
*
|
||||
* @package tool
|
||||
* @subpackage dbtransfer
|
||||
* @copyright 2008 Petr Skoda
|
||||
* @package tool_dbtransfer
|
||||
* @copyright 2008 Petr Skoda {@link http://skodak.org/}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die;
|
||||
|
||||
require_once $CFG->libdir.'/formslib.php';
|
||||
require_once($CFG->libdir.'/formslib.php');
|
||||
require_once(__DIR__.'/locallib.php');
|
||||
|
||||
|
||||
/**
|
||||
* Definition of db transfer settings form.
|
||||
*/
|
||||
class database_transfer_form extends moodleform {
|
||||
|
||||
function definition() {
|
||||
/**
|
||||
* Define transfer form.
|
||||
*/
|
||||
protected function definition() {
|
||||
global $CFG;
|
||||
|
||||
$mform = $this->_form;
|
||||
|
||||
$mform->addElement('header', 'database', get_string('dbtransfer', 'tool_dbtransfer'));
|
||||
$mform->addElement('header', 'database', get_string('targetdatabase', 'tool_dbtransfer'));
|
||||
|
||||
$supported = array (
|
||||
'mysqli/native',
|
||||
'pgsql/native',
|
||||
'mssql/native',
|
||||
'oci/native',
|
||||
'sqlsrv/native',
|
||||
);
|
||||
$drivers = array();
|
||||
foreach($supported as $driver) {
|
||||
list($dbtype, $dblibrary) = explode('/', $driver);
|
||||
$targetdb = moodle_database::get_driver_instance($dbtype, $dblibrary);
|
||||
if ($targetdb->driver_installed() !== true) {
|
||||
continue;
|
||||
}
|
||||
$drivers[$driver] = $driver;
|
||||
}
|
||||
$drivers = tool_dbtransfer_get_drivers();
|
||||
$drivers = array_reverse($drivers, true);
|
||||
$drivers[''] = get_string('choosedots');
|
||||
$drivers = array_reverse($drivers, true);
|
||||
|
||||
$mform->addElement('select', 'driver', get_string('dbtype', 'install'), $drivers);
|
||||
$mform->addElement('text', 'dbhost', get_string('dbhost', 'install'));
|
||||
$mform->addElement('text', 'dbname', get_string('database', 'install'));
|
||||
$mform->addElement('text', 'dbuser', get_string('user'));
|
||||
$mform->addElement('text', 'dbpass', get_string('password'));
|
||||
$mform->addElement('text', 'dbhost', get_string('databasehost', 'install'));
|
||||
$mform->addElement('text', 'dbname', get_string('databasename', 'install'));
|
||||
$mform->addElement('text', 'dbuser', get_string('databaseuser', 'install'));
|
||||
$mform->addElement('passwordunmask', 'dbpass', get_string('databasepass', 'install'));
|
||||
$mform->addElement('text', 'prefix', get_string('dbprefix', 'install'));
|
||||
$mform->addElement('text', 'dbport', get_string('dbport', 'install'));
|
||||
$mform->addElement('text', 'dbsocket', get_string('databasesocket', 'install'));
|
||||
if ($CFG->ostype !== 'WINDOWS') {
|
||||
$mform->addElement('text', 'dbsocket', get_string('databasesocket', 'install'));
|
||||
} else {
|
||||
$mform->addElement('hidden', 'dbsocket');
|
||||
}
|
||||
|
||||
$mform->addRule('driver', get_string('required'), 'required', null);
|
||||
$mform->addRule('dbhost', get_string('required'), 'required', null);
|
||||
$mform->addRule('dbname', get_string('required'), 'required', null);
|
||||
$mform->addRule('dbuser', get_string('required'), 'required', null);
|
||||
$mform->addRule('dbpass', get_string('required'), 'required', null);
|
||||
$mform->addRule('prefix', get_string('required'), 'required', null);
|
||||
if (!isset($drivers['mysqli/native'])) {
|
||||
$mform->addRule('prefix', get_string('required'), 'required', null);
|
||||
}
|
||||
|
||||
$mform->addElement('header', 'database', get_string('options', 'tool_dbtransfer'));
|
||||
|
||||
$mform->addElement('advcheckbox', 'enablemaintenance', get_string('enablemaintenance', 'tool_dbtransfer'));
|
||||
$mform->addHelpButton('enablemaintenance', 'enablemaintenance', 'tool_dbtransfer');
|
||||
|
||||
$this->add_action_buttons(false, get_string('transferdata', 'tool_dbtransfer'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate prefix is present for non-mysql drivers.
|
||||
* @param array $data
|
||||
* @param array $files
|
||||
* @return array
|
||||
*/
|
||||
public function validation($data, $files) {
|
||||
$errors = parent::validation($data, $files);
|
||||
if ($data['driver'] !== 'mysqli/native') {
|
||||
// This is a bloody hack, let's pretend we do not need to look at db family...
|
||||
if ($data['prefix'] === '') {
|
||||
$errors['prefix'] = get_string('required');
|
||||
}
|
||||
}
|
||||
return $errors;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,9 +17,8 @@
|
||||
/**
|
||||
* Export
|
||||
*
|
||||
* @package tool
|
||||
* @subpackage dbtransfer
|
||||
* @copyright 2008 Petr Skoda
|
||||
* @package tool_dbtransfer
|
||||
* @copyright 2008 Petr Skoda {@link http://skodak.org/}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
@@ -32,11 +31,11 @@ require_once('database_export_form.php');
|
||||
require_login();
|
||||
admin_externalpage_setup('tooldbexport');
|
||||
|
||||
//create form
|
||||
// Create form.
|
||||
$form = new database_export_form();
|
||||
|
||||
if ($data = $form->get_data()) {
|
||||
dbtransfer_export_xml_database($data->description, $DB);
|
||||
tool_dbtransfer_export_xml_database($data->description, $DB);
|
||||
die;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,9 +17,8 @@
|
||||
/**
|
||||
* Transfer tool
|
||||
*
|
||||
* @package tool
|
||||
* @subpackage dbtransfer
|
||||
* @copyright 2008 Petr Skoda
|
||||
* @package tool_dbtransfer
|
||||
* @copyright 2008 Petr Skoda {@link http://skodak.org/}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
@@ -32,8 +31,9 @@ require_once('database_transfer_form.php');
|
||||
require_login();
|
||||
admin_externalpage_setup('tooldbtransfer');
|
||||
|
||||
// Create the form
|
||||
// Create the form.
|
||||
$form = new database_transfer_form();
|
||||
$problem = '';
|
||||
|
||||
// If we have valid input.
|
||||
if ($data = $form->get_data()) {
|
||||
@@ -47,33 +47,63 @@ if ($data = $form->get_data()) {
|
||||
if ($data->dbsocket) {
|
||||
$dboptions['dbsocket'] = $data->dbsocket;
|
||||
}
|
||||
if (!$targetdb->connect($data->dbhost, $data->dbuser, $data->dbpass, $data->dbname, $data->prefix, $dboptions)) {
|
||||
throw new dbtransfer_exception('notargetconectexception', null, "$CFG->wwwroot/$CFG->admin/tool/dbtransfer/");
|
||||
}
|
||||
if ($targetdb->get_tables()) {
|
||||
throw new dbtransfer_exception('targetdatabasenotempty', null, "$CFG->wwwroot/$CFG->admin/tool/dbtransfer/");
|
||||
try {
|
||||
$targetdb->connect($data->dbhost, $data->dbuser, $data->dbpass, $data->dbname, $data->prefix, $dboptions);
|
||||
if ($targetdb->get_tables()) {
|
||||
$problem .= get_string('targetdatabasenotempty', 'tool_dbtransfer');
|
||||
}
|
||||
} catch (moodle_exception $e) {
|
||||
$problem .= get_string('notargetconectexception', 'tool_dbtransfer').'<br />'.$e->debuginfo;
|
||||
}
|
||||
|
||||
// Start output.
|
||||
echo $OUTPUT->header();
|
||||
$data->dbtype = $dbtype;
|
||||
echo $OUTPUT->heading(get_string('transferringdbto', 'tool_dbtransfer', $data));
|
||||
if ($problem === '') {
|
||||
// Scroll down to the bottom when finished.
|
||||
$PAGE->requires->js_init_code("window.scrollTo(0, 5000000);");
|
||||
|
||||
// Do the transfer.
|
||||
$feedback = new html_list_progress_trace();
|
||||
dbtransfer_transfer_database($DB, $targetdb, $feedback);
|
||||
$feedback->finished();
|
||||
// Enable CLI maintenance mode if requested.
|
||||
if ($data->enablemaintenance) {
|
||||
$PAGE->set_pagelayout('maintenance');
|
||||
tool_dbtransfer_create_maintenance_file();
|
||||
}
|
||||
|
||||
// Finish up.
|
||||
echo $OUTPUT->notification(get_string('success'), 'notifysuccess');
|
||||
echo $OUTPUT->continue_button("$CFG->wwwroot/$CFG->admin/");
|
||||
echo $OUTPUT->footer();
|
||||
die;
|
||||
// Start output.
|
||||
echo $OUTPUT->header();
|
||||
$data->dbtype = $dbtype;
|
||||
$data->dbtypefrom = $CFG->dbtype;
|
||||
echo $OUTPUT->heading(get_string('transferringdbto', 'tool_dbtransfer', $data));
|
||||
|
||||
// Do the transfer.
|
||||
$CFG->tool_dbransfer_migration_running = true;
|
||||
try {
|
||||
$feedback = new html_list_progress_trace();
|
||||
tool_dbtransfer_transfer_database($DB, $targetdb, $feedback);
|
||||
$feedback->finished();
|
||||
} catch (Exception $e) {
|
||||
if ($data->enablemaintenance) {
|
||||
tool_dbtransfer_maintenance_callback();
|
||||
}
|
||||
unset($CFG->tool_dbransfer_migration_running);
|
||||
throw $e;
|
||||
}
|
||||
unset($CFG->tool_dbransfer_migration_running);
|
||||
|
||||
// Finish up.
|
||||
echo $OUTPUT->notification(get_string('success'), 'notifysuccess');
|
||||
echo $OUTPUT->continue_button("$CFG->wwwroot/$CFG->admin/");
|
||||
echo $OUTPUT->footer();
|
||||
die;
|
||||
}
|
||||
}
|
||||
|
||||
// Otherwise display the settings form.
|
||||
echo $OUTPUT->header();
|
||||
echo $OUTPUT->heading(get_string('transferdbtoserver', 'tool_dbtransfer'));
|
||||
echo '<p>', get_string('transferdbintro', 'tool_dbtransfer'), "</p>\n\n";
|
||||
|
||||
$info = format_text(get_string('transferdbintro', 'tool_dbtransfer'), FORMAT_MARKDOWN);
|
||||
echo $OUTPUT->box($info);
|
||||
|
||||
$form->display();
|
||||
if ($problem !== '') {
|
||||
echo $OUTPUT->box($problem, 'generalbox error');
|
||||
}
|
||||
echo $OUTPUT->footer();
|
||||
|
||||
@@ -15,21 +15,29 @@
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Strings for component 'tool_generator', language 'en', branch 'MOODLE_22_STABLE'
|
||||
* Strings for component 'tool_generator', language 'en'.
|
||||
*
|
||||
* @package tool
|
||||
* @subpackage dbtransfer
|
||||
* @copyright 2011 Petr Skoda
|
||||
* @package tool_dbtransfer
|
||||
* @copyright 2011 Petr Skoda {@link http://skodak.org/}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
$string['dbexport'] = 'Database transfer';
|
||||
$string['dbtransfer'] = 'Database export';
|
||||
$string['clidriverlist'] = 'Available database drivers for migration';
|
||||
$string['cliheading'] = 'Database migration - make sure nobody is accessing the server during migration!';
|
||||
$string['climigrationnotice'] = 'Database migration in progress, please wait until the migration completes and server administrator updates configuration and deletes the $CFG->dataroot/climaintenance.html file.';
|
||||
$string['convertinglogdisplay'] = 'Converting log display actions';
|
||||
$string['dbexport'] = 'Database export';
|
||||
$string['dbtransfer'] = 'Database migration';
|
||||
$string['enablemaintenance'] = 'Enable maintenance mode';
|
||||
$string['enablemaintenance_help'] = 'This option enables maintanance mode during and after the database migration, it prevents access of all users until the migration is completed. Please note that administrator has to manually delete $CFG->dataroot/climaintenance.html file after updating config.php settings to resume normal operation.';
|
||||
$string['exportdata'] = 'Export data';
|
||||
$string['notargetconectexception'] = 'Can not connect target database, sorry.';
|
||||
$string['options'] = 'Options';
|
||||
$string['pluginname'] = 'Database transfer';
|
||||
$string['targetdatabase'] = 'Target database';
|
||||
$string['targetdatabasenotempty'] = 'Target database must not contain any tables with given prefix!';
|
||||
$string['transferdata'] = 'Transfer data';
|
||||
$string['transferdbintro'] = 'This script will transfer the entire contents of this database to another database server.';
|
||||
$string['transferdbintro'] = 'This script will transfer the entire contents of this database to another database server. It is often used for migration of data to different database type.';
|
||||
$string['transferdbtoserver'] = 'Transfer this Moodle database to another server';
|
||||
$string['transferringdbto'] = 'Transferring this database to {$a->dbtype} database {$a->dbname} on {$a->dbhost}';
|
||||
$string['transferringdbto'] = 'Transferring this {$a->dbtypefrom} database to {$a->dbtype} database "{$a->dbname}" on "{$a->dbhost}"';
|
||||
|
||||
|
||||
@@ -17,9 +17,8 @@
|
||||
/**
|
||||
* Export db content to file.
|
||||
*
|
||||
* @package tool
|
||||
* @subpackage dbtransfer
|
||||
* @copyright 2008 Petr Skoda {@link http://skodak.org}
|
||||
* @package tool_dbtransfer
|
||||
* @copyright 2008 Petr Skoda {@link http://skodak.org/}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
@@ -44,8 +43,13 @@ TODO:
|
||||
require_once($CFG->libdir.'/adminlib.php');
|
||||
require_once($CFG->libdir.'/dtllib.php');
|
||||
|
||||
|
||||
function dbtransfer_export_xml_database($description, $mdb) {
|
||||
/**
|
||||
* Initiate database export.
|
||||
* @param string $description
|
||||
* @param moodle_database $mdb
|
||||
* @return does not return, calls die()
|
||||
*/
|
||||
function tool_dbtransfer_export_xml_database($description, $mdb) {
|
||||
@set_time_limit(0);
|
||||
|
||||
session_get_instance()->write_close(); // release session
|
||||
@@ -65,12 +69,141 @@ function dbtransfer_export_xml_database($description, $mdb) {
|
||||
die;
|
||||
}
|
||||
|
||||
|
||||
function dbtransfer_transfer_database($sourcedb, $targetdb, $feedback = null) {
|
||||
/**
|
||||
* Initiate database transfer.
|
||||
* @param moodle_database $sourcedb
|
||||
* @param moodle_database $targetdb
|
||||
* @param progress_trace $feedback
|
||||
* @return void
|
||||
*/
|
||||
function tool_dbtransfer_transfer_database(moodle_database $sourcedb, moodle_database $targetdb, progress_trace $feedback = null) {
|
||||
@set_time_limit(0);
|
||||
|
||||
session_get_instance()->write_close(); // release session
|
||||
|
||||
$var = new database_mover($sourcedb, $targetdb, true, $feedback);
|
||||
$var->export_database(null);
|
||||
|
||||
tool_dbtransfer_rebuild_target_log_actions($targetdb, $feedback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Very hacky function for rebuilding of log actions in target database.
|
||||
* @param moodle_database $target
|
||||
* @param progress_trace $feedback
|
||||
* @return void
|
||||
* @throws Exception on conversion error
|
||||
*/
|
||||
function tool_dbtransfer_rebuild_target_log_actions(moodle_database $target, progress_trace $feedback = null) {
|
||||
global $DB, $CFG;
|
||||
require_once("$CFG->libdir/upgradelib.php");
|
||||
|
||||
$feedback->output(get_string('convertinglogdisplay', 'tool_dbtransfer'));
|
||||
|
||||
$olddb = $DB;
|
||||
$DB = $target;
|
||||
try {
|
||||
$DB->delete_records('log_display', array('component'=>'moodle'));
|
||||
log_update_descriptions('moodle');
|
||||
$plugintypes = get_plugin_types();
|
||||
foreach ($plugintypes as $type=>$location) {
|
||||
$plugs = get_plugin_list($type);
|
||||
foreach ($plugs as $plug=>$fullplug) {
|
||||
$component = $type.'_'.$plug;
|
||||
$DB->delete_records('log_display', array('component'=>$component));
|
||||
log_update_descriptions($component);
|
||||
}
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$DB = $olddb;
|
||||
throw $e;
|
||||
}
|
||||
$DB = $olddb;
|
||||
$feedback->output(get_string('done', 'core_dbtransfer', null), 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns list of fully working database drivers present in system.
|
||||
* @return array
|
||||
*/
|
||||
function tool_dbtransfer_get_drivers() {
|
||||
global $CFG;
|
||||
|
||||
$files = new RegexIterator(new DirectoryIterator("$CFG->libdir/dml"), '|^.*_moodle_database\.php$|');
|
||||
$drivers = array();
|
||||
|
||||
foreach ($files as $file) {
|
||||
$matches = null;
|
||||
preg_match('|^([a-z0-9]+)_([a-z]+)_moodle_database\.php$|', $file->getFilename(), $matches);
|
||||
if (!$matches) {
|
||||
continue;
|
||||
}
|
||||
$dbtype = $matches[1];
|
||||
$dblibrary = $matches[2];
|
||||
|
||||
if ($dbtype === 'sqlite3') {
|
||||
// Blacklist unfinished drivers.
|
||||
continue;
|
||||
}
|
||||
|
||||
$targetdb = moodle_database::get_driver_instance($dbtype, $dblibrary, false);
|
||||
if ($targetdb->driver_installed() !== true) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$driver = $dbtype.'/'.$dblibrary;
|
||||
|
||||
$drivers[$driver] = $targetdb->get_name();
|
||||
};
|
||||
|
||||
return $drivers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create CLI maintenance file to prevent all access.
|
||||
*/
|
||||
function tool_dbtransfer_create_maintenance_file() {
|
||||
global $CFG;
|
||||
|
||||
register_shutdown_function('tool_dbtransfer_maintenance_callback');
|
||||
|
||||
$options = new stdClass();
|
||||
$options->trusted = false;
|
||||
$options->noclean = false;
|
||||
$options->smiley = false;
|
||||
$options->filter = false;
|
||||
$options->para = true;
|
||||
$options->newlines = false;
|
||||
|
||||
$message = format_text(get_string('climigrationnotice', 'tool_dbtransfer'), FORMAT_MARKDOWN, $options);
|
||||
$message = bootstrap_renderer::early_error_content($message, '', '', array());
|
||||
$html = <<<OET
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<header><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><header/>
|
||||
<body>$message</body>
|
||||
</html>
|
||||
OET;
|
||||
|
||||
file_put_contents("$CFG->dataroot/climaintenance.html", $html);
|
||||
@chmod("$CFG->dataroot/climaintenance.html", $CFG->filepermissions);
|
||||
}
|
||||
|
||||
/**
|
||||
* This callback is responsible for unsetting maintenance mode
|
||||
* if the migration is interrupted.
|
||||
*/
|
||||
function tool_dbtransfer_maintenance_callback() {
|
||||
global $CFG;
|
||||
|
||||
if (empty($CFG->tool_dbransfer_migration_running)) {
|
||||
// Migration was finished properly - keep the maintenance file in place.
|
||||
return;
|
||||
}
|
||||
|
||||
if (file_exists("$CFG->dataroot/climaintenance.html")) {
|
||||
// Failed migration, revert to normal site operation.
|
||||
unlink("$CFG->dataroot/climaintenance.html");
|
||||
error_log('tool_dbtransfer: Interrupted database migration detected, switching off CLI maintenance mode.');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,18 +15,17 @@
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Link to InnoDB conversion tool
|
||||
* Add hidden links db transfer tool
|
||||
*
|
||||
* @package tool
|
||||
* @subpackage dbtransfer
|
||||
* @copyright 2011 Petr Skoda {@link http://skodak.org}
|
||||
* @package tool_dbtransfer
|
||||
* @copyright 2011 Petr Skoda {@link http://skodak.org/}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die;
|
||||
|
||||
if ($hassiteconfig) {
|
||||
// DB transfer related pages
|
||||
$ADMIN->add('experimental', new admin_externalpage('tooldbtransfer', get_string('dbtransfer', 'tool_dbtransfer'), $CFG->wwwroot.'/'.$CFG->admin.'/tool/dbtransfer/index.php', 'moodle/site:config', true));
|
||||
$ADMIN->add('experimental', new admin_externalpage('tooldbtransfer', get_string('dbtransfer', 'tool_dbtransfer'), $CFG->wwwroot.'/'.$CFG->admin.'/tool/dbtransfer/index.php', 'moodle/site:config', false));
|
||||
// DB export/import is not ready yet - keep it hidden for now.
|
||||
$ADMIN->add('experimental', new admin_externalpage('tooldbexport', get_string('dbexport', 'tool_dbtransfer'), $CFG->wwwroot.'/'.$CFG->admin.'/tool/dbtransfer/dbexport.php', 'moodle/site:config', true));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,14 +17,13 @@
|
||||
/**
|
||||
* Version details.
|
||||
*
|
||||
* @package tool
|
||||
* @subpackage dbtransfer
|
||||
* @copyright 2008 Petr Skoda
|
||||
* @package tool_dbtransfer
|
||||
* @copyright 2008 Petr Skoda {@link http://skodak.org/}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$plugin->version = 2012061700; // The current plugin version (Date: YYYYMMDDXX)
|
||||
$plugin->version = 2012062200; // The current plugin version (Date: YYYYMMDDXX)
|
||||
$plugin->requires = 2012061700; // Requires this Moodle version
|
||||
$plugin->component = 'tool_dbtransfer'; // Full name of the plugin (used for diagnostics)
|
||||
|
||||
@@ -380,6 +380,7 @@ class mysqli_native_moodle_database extends moodle_database {
|
||||
$errorno = @$this->mysqli->connect_errno;
|
||||
|
||||
if ($errorno !== 0) {
|
||||
$this->mysqli = null;
|
||||
throw new dml_connection_exception($dberr);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
@@ -15,12 +14,10 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
/**
|
||||
* General database export class
|
||||
*
|
||||
* @package core
|
||||
* @subpackage dtl
|
||||
* @package core_dtl
|
||||
* @copyright 2008 Andrei Bautu
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
@@ -41,16 +38,17 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @see export_table_data for the same table.
|
||||
*/
|
||||
abstract class database_exporter {
|
||||
/** Connection to the source database (a @see moodle_database object). */
|
||||
/** @var moodle_database Connection to the source database (a @see moodle_database object). */
|
||||
protected $mdb;
|
||||
/** Database manager of the source database (a @see database_manager object). */
|
||||
/** @var database_manager Database manager of the source database (a @see database_manager object). */
|
||||
protected $manager;
|
||||
/** Source database schema in XMLDB format (a @see xmldb_structure object). */
|
||||
/** @var xmldb_structure Source database schema in XMLDB format (a @see xmldb_structure object). */
|
||||
protected $schema;
|
||||
/**
|
||||
* Boolean flag - whether or not to check that XML database schema matches
|
||||
* the RDBMS database schema before exporting (used by
|
||||
* @see export_database).
|
||||
* @var bool
|
||||
*/
|
||||
protected $check_schema;
|
||||
|
||||
@@ -158,5 +156,4 @@ abstract class database_exporter {
|
||||
}
|
||||
$this->finish_database_export();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
@@ -15,12 +14,10 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
/**
|
||||
* General database importer class
|
||||
*
|
||||
* @package core
|
||||
* @subpackage dtl
|
||||
* @package core_dtl
|
||||
* @copyright 2008 Andrei Bautu
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
@@ -43,23 +40,22 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* is respected.
|
||||
*/
|
||||
class database_importer {
|
||||
/** Connection to the target database (a @see moodle_database object). */
|
||||
/** @var moodle_database Connection to the target database (a @see moodle_database object). */
|
||||
protected $mdb;
|
||||
/** Database manager of the target database (a @see database_manager object). */
|
||||
/** @var database_manager Database manager of the target database (a @see database_manager object). */
|
||||
protected $manager;
|
||||
/** Target database schema in XMLDB format (a @see xmldb_structure object). */
|
||||
/** @var xmldb_structure Target database schema in XMLDB format (a @see xmldb_structure object). */
|
||||
protected $schema;
|
||||
/**
|
||||
* Boolean flag - whether or not to check that XML database schema matches
|
||||
* the RDBMS database schema before importing (used by
|
||||
* @see begin_database_import).
|
||||
* @var bool
|
||||
*/
|
||||
protected $check_schema;
|
||||
/**
|
||||
* How to use transactions.
|
||||
*/
|
||||
/** @var string How to use transactions. */
|
||||
protected $transactionmode = 'allinone';
|
||||
/** Transaction object */
|
||||
/** @var moodle_transaction Transaction object */
|
||||
protected $transaction;
|
||||
|
||||
/**
|
||||
@@ -105,7 +101,7 @@ class database_importer {
|
||||
global $CFG;
|
||||
|
||||
if (!$this->mdb->get_tables()) {
|
||||
// not tables yet, time to create all tables
|
||||
// No tables present yet, time to create all tables.
|
||||
$this->manager->install_from_xmldb_structure($this->schema);
|
||||
}
|
||||
|
||||
|
||||
+16
-16
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
@@ -15,12 +14,10 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
/**
|
||||
* General database mover class
|
||||
*
|
||||
* @package core
|
||||
* @subpackage dtl
|
||||
* @package core_dtl
|
||||
* @copyright 2008 Andrei Bautu
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
@@ -28,33 +25,35 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
class database_mover extends database_exporter {
|
||||
/** Importer object used to transfer data. */
|
||||
/** @var database_importer Importer object used to transfer data. */
|
||||
protected $importer;
|
||||
protected $feeback;
|
||||
/** @var progress_trace Progress tracing object */
|
||||
protected $feedback;
|
||||
|
||||
/**
|
||||
* Object constructor.
|
||||
*
|
||||
* @param moodle_database $mdb Connection to the source database (a
|
||||
* @param moodle_database $mdb_source Connection to the source database (a
|
||||
* @see moodle_database object).
|
||||
* @param moodle_database $mdb_target Connection to the target database (a
|
||||
* @see moodle_database object).
|
||||
* @param boolean $check_schema - whether or not to check that XML database
|
||||
* schema matches the RDBMS database schema before exporting (used by
|
||||
* @param progress_trace $feedback Progress tracing object
|
||||
* @see export_database).
|
||||
*/
|
||||
public function __construct(moodle_database $mdb_source, moodle_database $mdb_target,
|
||||
$check_schema = true, progress_trace $feeback = null) {
|
||||
if (empty($feeback)) {
|
||||
$this->feeback = new null_progress_trace();
|
||||
$check_schema = true, progress_trace $feedback = null) {
|
||||
if (empty($feedback)) {
|
||||
$this->feedback = new null_progress_trace();
|
||||
} else {
|
||||
$this->feeback = $feeback;
|
||||
$this->feedback = $feedback;
|
||||
}
|
||||
if ($check_schema) {
|
||||
$this->feeback->output(get_string('checkingsourcetables', 'core_dbtransfer'));
|
||||
$this->feedback->output(get_string('checkingsourcetables', 'core_dbtransfer'));
|
||||
}
|
||||
parent::__construct($mdb_source, $check_schema);
|
||||
$this->feeback->output(get_string('creatingtargettables', 'core_dbtransfer'));
|
||||
$this->feedback->output(get_string('creatingtargettables', 'core_dbtransfer'));
|
||||
$this->importer = new database_importer($mdb_target, $check_schema);
|
||||
}
|
||||
|
||||
@@ -70,12 +69,13 @@ class database_mover extends database_exporter {
|
||||
* Callback function. Calls importer's begin_database_import callback method.
|
||||
*
|
||||
* @param float $version the version of the system which generating the data
|
||||
* @param string $release moodle release info
|
||||
* @param string $timestamp the timestamp of the data (in ISO 8601) format.
|
||||
* @param string $description a user description of the data.
|
||||
* @return void
|
||||
*/
|
||||
public function begin_database_export($version, $release, $timestamp, $description) {
|
||||
$this->feeback->output(get_string('copyingtables', 'core_dbtransfer'));
|
||||
$this->feedback->output(get_string('copyingtables', 'core_dbtransfer'));
|
||||
$this->importer->begin_database_import($version, $timestamp, $description);
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ class database_mover extends database_exporter {
|
||||
* @return void
|
||||
*/
|
||||
public function begin_table_export(xmldb_table $table) {
|
||||
$this->feeback->output(get_string('copyingtable', 'core_dbtransfer', $table->getName()), 1);
|
||||
$this->feedback->output(get_string('copyingtable', 'core_dbtransfer', $table->getName()), 1);
|
||||
$this->importer->begin_table_import($table->getName(), $table->getHash());
|
||||
}
|
||||
|
||||
@@ -108,7 +108,7 @@ class database_mover extends database_exporter {
|
||||
* @return void
|
||||
*/
|
||||
public function finish_table_export(xmldb_table $table) {
|
||||
$this->feeback->output(get_string('done', 'core_dbtransfer', $table->getName()), 2);
|
||||
$this->feedback->output(get_string('done', 'core_dbtransfer', $table->getName()), 2);
|
||||
$this->importer->finish_table_import($table->getName());
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
@@ -15,12 +14,10 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
/**
|
||||
* XML format exporter class to file storage
|
||||
*
|
||||
* @package core
|
||||
* @subpackage dtl
|
||||
* @package core_dtl
|
||||
* @copyright 2008 Andrei Bautu
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
@@ -31,9 +28,9 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* XML format exporter class to file storage.
|
||||
*/
|
||||
class file_xml_database_exporter extends xml_database_exporter {
|
||||
/** Path to the XML data file. */
|
||||
/** @var string Path to the XML data file. */
|
||||
protected $filepath;
|
||||
/** File descriptor for the output file. */
|
||||
/** @var resource File descriptor for the output file. */
|
||||
protected $file;
|
||||
|
||||
/**
|
||||
@@ -53,6 +50,7 @@ class file_xml_database_exporter extends xml_database_exporter {
|
||||
|
||||
/**
|
||||
* Specific output method for the file XML sink.
|
||||
* @param string $text
|
||||
*/
|
||||
protected function output($text) {
|
||||
fwrite($this->file, $text);
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
@@ -15,12 +14,10 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
/**
|
||||
* XML format importer class from file storage
|
||||
*
|
||||
* @package core
|
||||
* @subpackage dtl
|
||||
* @package core_dtl
|
||||
* @copyright 2008 Andrei Bautu
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
@@ -31,7 +28,7 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* XML format importer class from file storage.
|
||||
*/
|
||||
class file_xml_database_importer extends xml_database_importer {
|
||||
/** Path to the XML data file. */
|
||||
/** @var string Path to the XML data file. */
|
||||
protected $filepath;
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
@@ -15,12 +14,10 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
/**
|
||||
* XML format exporter class to memory storage
|
||||
*
|
||||
* @package core
|
||||
* @subpackage dtl
|
||||
* @package core_dtl
|
||||
* @copyright 2008 Andrei Bautu
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
@@ -31,11 +28,12 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* XML format exporter class to memory storage (i.e. a string).
|
||||
*/
|
||||
class string_xml_database_exporter extends xml_database_exporter {
|
||||
/** String with XML data. */
|
||||
/** @var string String with XML data. */
|
||||
protected $data;
|
||||
|
||||
/**
|
||||
* Specific output method for the memory XML sink.
|
||||
* @param string $text
|
||||
*/
|
||||
protected function output($text) {
|
||||
$this->data .= $text;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
@@ -15,12 +14,10 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
/**
|
||||
* XML format importer class from memory storage
|
||||
*
|
||||
* @package core
|
||||
* @subpackage dtl
|
||||
* @package core_dtl
|
||||
* @copyright 2008 Andrei Bautu
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
@@ -31,13 +28,13 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* XML format importer class from memory storage (i.e. string).
|
||||
*/
|
||||
class string_xml_database_importer extends xml_database_importer {
|
||||
/** String with XML data. */
|
||||
/** @var string String with XML data. */
|
||||
protected $data;
|
||||
|
||||
/**
|
||||
* Object constructor.
|
||||
*
|
||||
* @param string data - string with XML data
|
||||
* @param string $data - string with XML data
|
||||
* @param moodle_database $mdb Connection to the target database
|
||||
* @see xml_database_importer::__construct()
|
||||
* @param boolean $check_schema - whether or not to check that XML database
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
@@ -15,12 +14,10 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
/**
|
||||
* XML format exporter class
|
||||
*
|
||||
* @package core
|
||||
* @subpackage dtl
|
||||
* @package core_dtl
|
||||
* @copyright 2008 Andrei Bautu
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
@@ -51,7 +48,7 @@ abstract class xml_database_exporter extends database_exporter {
|
||||
public function begin_database_export($version, $release, $timestamp, $description) {
|
||||
$this->output('<?xml version="1.0" encoding="utf-8"?>');
|
||||
//TODO add xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" and schema information
|
||||
$this->output('<moodle_database version="'.$version.'" release="'.$release.'" timestamp="'.$timestamp.'"'.(empty ($description) ? '' : ' comment="'.htmlspecialchars($description, ENT_QUOTES).'"').'>');
|
||||
$this->output('<moodle_database version="'.$version.'" release="'.$release.'" timestamp="'.$timestamp.'"'.(empty ($description) ? '' : ' comment="'.htmlspecialchars($description, ENT_QUOTES, 'UTF-8').'"').'>');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -93,7 +90,7 @@ abstract class xml_database_exporter extends database_exporter {
|
||||
if (is_null($value)) {
|
||||
$this->output('<field name="'.$key.'" value="null" />');
|
||||
} else {
|
||||
$this->output('<field name="'.$key.'">'.htmlspecialchars($value, ENT_NOQUOTES).'</field>');
|
||||
$this->output('<field name="'.$key.'">'.htmlspecialchars($value, ENT_NOQUOTES, 'UTF-8').'</field>');
|
||||
}
|
||||
}
|
||||
$this->output('</record>');
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
@@ -15,12 +14,10 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
/**
|
||||
* XML format importer class
|
||||
*
|
||||
* @package core
|
||||
* @subpackage dtl
|
||||
* @package core_dtl
|
||||
* @copyright 2008 Andrei Bautu
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
@@ -150,9 +147,9 @@ abstract class xml_database_importer extends database_importer {
|
||||
* @param string $data character data to be processed
|
||||
* @return void
|
||||
*/
|
||||
protected function cdata($parser, $cdata) {
|
||||
protected function cdata($parser, $data) {
|
||||
if (isset($this->current_field)) {
|
||||
$this->current_data .= $cdata;
|
||||
$this->current_data .= $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user