Bachir Soussi Chiadmi 1bc61b12ad first import
2015-04-08 11:40:19 +02:00

183 lines
5.0 KiB
PHP

<?php
/**
* @file
* General database dump/restore code for Backup and Migrate.
*/
/**
* Restore from a previously backed up files. File must be a decompressed SQL file.
*/
function backup_migrate_db_restore($source, $file, $settings) {
$num = 0;
if ($type = _backup_migrate_db_get_db_type($source->dest_url['scheme'])) {
// Switch to a different db if specified.
_backup_migrate_db_switch_db($source->get_location());
backup_migrate_filters_invoke_all('pre_restore', $file, $settings);
// Open the file using the file wrapper. Check that the dump is of the right type (allow .sql for legacy reasons).
if ($file->type_id() !== $type && $file->type_id() !== 'sql') {
_backup_migrate_message("Unable to restore from file %file because it is of an unknown file type.", array("%file" => $file->filepath()), 'error');
}
else {
// Dump the database.
$function = 'backup_migrate_restore_db_from_file_'. $type;
if (function_exists($function)) {
$num = $function($file, $settings);
}
}
backup_migrate_filters_invoke_all('post_restore', $file, $settings, $num);
// Switch back to the previous db.
_backup_migrate_db_switch_db();
}
return $num;
}
/**
* Build the database dump file. Takes a list of tables to exclude and some formatting options.
*/
function backup_migrate_db_backup($source, $file, $settings) {
$success = FALSE;
if ($type = _backup_migrate_db_get_db_type($source->dest_url['scheme'])) {
$file->push_type($type);
// Switch to a different db if specified.
_backup_migrate_db_switch_db($source->get_location());
backup_migrate_filters_invoke_all('pre_backup', $source, $file, $settings);
// Dump the database.
$function = 'backup_migrate_backup_db_to_file_'. $type;
if (function_exists($function)) {
$success = $function($file, $settings);
}
backup_migrate_filters_invoke_all('post_backup', $source, $file, $settings, $success);
// Switch back to the previous db.
_backup_migrate_db_switch_db();
}
return $success ? $file : FALSE;
}
/**
* Get the list of table names.
*/
function _backup_migrate_get_table_names($source) {
$out = array();
if ($source && $type = _backup_migrate_db_get_db_type($source->dest_url['scheme'])) {
$function = '_backup_migrate_get_table_names_'. $type;
if (function_exists($function)) {
$out = $function();
}
}
return $out;
}
/**
* Tables to ingore altogether. None by default.
*/
function _backup_migrate_default_exclude_tables() {
return array();
}
/**
* Return the default tables whose data can be ignored. These tables mostly contain
* info which can be easily reproducted (such as cache or search index)
* but also tables which can become quite bloated but are not necessarily extremely
* important to back up or migrate during development (such ass access log and watchdog)
*/
function _backup_migrate_default_structure_only_tables() {
$core = array(
'cache',
'cache_admin_menu',
'cache_browscap',
'cache_content',
'cache_filter',
'cache_calendar_ical',
'cache_location',
'cache_menu',
'cache_page',
'cache_reptag',
'cache_views',
'cache_views_data',
'cache_block',
'cache_update',
'cache_form',
'cache_bootstrap',
'cache_field',
'cache_image',
'cache_path',
'sessions',
'search_dataset',
'search_index',
'search_keywords_log',
'search_total',
'watchdog',
'accesslog',
'devel_queries',
'devel_times',
);
$alltables = array_merge($core, module_invoke_all('devel_caches'));
return $alltables;
}
/**
* Switch to the db described by the DB URL, or back to previous if none selected.
*/
function _backup_migrate_db_switch_db($in_url = NULL) {
static $db_stack = array();
global $db_url;
// If no DB URL is specified, pop the previous one and set to it.
if ($in_url === NULL && $db_stack) {
db_set_active(array_pop($db_stack));
}
// If there is a valid DB URL, switch to it.
if ($in_url) {
// Make the db_url into an array if needed.
if (!is_array($db_url)) {
$db_url = array('default' => $db_url);
}
// Add the new db to the db_url array.
$db_url[$in_url] = $in_url;
// Switch to the new db and push the old one on the stack
$db_stack[] = db_set_active($in_url);
}
}
/**
* Get the appropriate db type for file inclusion and calling the right function.
*/
function _backup_migrate_db_get_db_type($scheme) {
static $type = NULL;
if ($type === NULL) {
switch ($scheme) {
case 'mysql':
case 'mysqli':
$type = 'mysql';
backup_migrate_include('db.mysql');
break;
default:
$type = false;
break;
}
if (!$type) {
if ($scheme) {
_backup_migrate_message("Backup and migrate does not support @type databases.", array("@type" => $scheme), 'error');
}
else {
_backup_migrate_message("Backup and migrate does not support this database type.", array(), 'error');
}
}
}
return $type;
}