Merge branch 'w30_MDL-34441_m23_dbtransfer' of git://github.com/skodak/moodle into MOODLE_23_STABLE

This commit is contained in:
Dan Poltawski
2012-07-25 10:51:15 +08:00
19 changed files with 517 additions and 156 deletions
+186
View File
@@ -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;
}
}
+4 -5
View File
@@ -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;
}
+53 -23
View File
@@ -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}"';
+140 -7
View File
@@ -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.');
}
}
+6 -7
View File
@@ -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));
}
}
+3 -4
View File
@@ -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);
}
+5 -8
View File
@@ -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();
}
}
+8 -12
View File
@@ -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
View File
@@ -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());
}
+4 -6
View File
@@ -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);
+2 -5
View File
@@ -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;
/**
+3 -5
View File
@@ -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;
+3 -6
View File
@@ -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
+3 -6
View File
@@ -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>');
+3 -6
View File
@@ -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;
}
}
}