You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

191 lines
6.1 KiB

<?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);
}
if (empty($CFG->version)) {
cli_error(get_string('missingconfigversion', 'debug'));
}
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);