public function exec_restore($params = false)
{
ignore_user_abort(true);
ini_set('memory_limit', '512M');
if (!strstr(INI_SYSTEM_CHECK_DISABLED, 'set_time_limit')) {
set_time_limit(0);
}
$loc = $this->backup_file;
// Get the provided arg
if (isset($params['id'])) {
$id = $params['id'];
} elseif (isset($_GET['filename'])) {
$id = $params['filename'];
} elseif (isset($_GET['file'])) {
$id = $params['file'];
} elseif ($loc != false) {
$id = $loc;
}
if ($id == null) {
return array('error' => 'You have not provided a backup to restore.');
}
$here = $this->get_bakup_location();
$filename = $here . $id;
$ext = get_file_extension($filename);
$ext_error = false;
$sql_file = false;
if (!is_file($filename)) {
return array('error' => 'You have not provided a existing backup to restore.');
die;
}
$temp_dir_restore = false;
switch ($ext) {
case 'zip':
$back_log_action = 'Unzipping userfiles';
$this->log_action($back_log_action);
$exract_folder = md5(basename($filename));
$unzip = new \Microweber\Utils\Unzip();
$target_dir = mw_cache_path() . 'backup_restore' . DS . $exract_folder . DS;
if (!is_dir($target_dir)) {
mkdir_recursive($target_dir);
}
$result = $unzip->extract($filename, $target_dir, $preserve_filepath = true);
$temp_dir_restore = $target_dir;
$sql_restore = $target_dir . 'mw_sql_restore.sql';
if (is_file($sql_restore)) {
$sql_file = $sql_restore;
}
break;
case 'sql':
$sql_file = $filename;
break;
default:
$ext_error = true;
break;
}
if ($ext_error == true) {
return array('error' => 'Invalid file extension. The restore file must be .sql or .zip');
die;
}
if ($sql_file != false) {
$back_log_action = 'Restoring database';
$this->log_action($back_log_action);
$filename = $sql_file;
$sqlErrorText = '';
$sqlErrorCode = 0;
$sqlStmt = '';
$sqlFile = file_get_contents($filename);
$sqlArray = explode($this->file_q_sep, $sqlFile);
if (!isset($sqlArray[1])) {
$sqlArray = explode("\n", $sqlFile);
}
// Process the sql file by statements
$engine = mw()->database_manager->get_sql_engine();
foreach ($sqlArray as $stmt) {
$stmt = str_replace('/* MW_TABLE_SEP */', ' ', $stmt);
$stmt = str_ireplace($this->prefix_placeholder, get_table_prefix(), $stmt);
$stmt = str_replace("", '', $stmt);
// $stmt = str_replace("\x0D", '', $stmt);
// $stmt = str_replace("\x09", '', $stmt);
////
// $stmt = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\x9F]/u', '', $stmt);
if ($engine == 'sqlite') {
$stmt = str_replace("\\'", "''", $stmt);
}
if ($this->debug) {
d($stmt);
}
if (strlen(trim($stmt)) > 3) {
try {
@mw()->database_manager->q($stmt, true);
// mw()->database_manager->q($stmt);
} catch (QueryException $e) {
echo 'Caught exception: ' . $e->getMessage() . "\n";
$sqlErrorCode = 1;
} catch (Exception $e) {
echo 'Caught exception: ' . $e->getMessage() . "\n";
$sqlErrorCode = 1;
}
}
}
// Print message (error or success)
if ($sqlErrorCode == 0) {
$back_log_action = 'Database restored!';
$this->log_action($back_log_action);
echo "Database restored!\n";
echo 'Backup used: ' . $filename . "\n";
} else {
echo "An error occurred while restoring backup!<br><br>\n";
echo "Error code: {$sqlErrorCode}<br>\n";
echo "Error text: {$sqlErrorText}<br>\n";
echo "Statement:<br/> {$sqlStmt}<br>";
}
$back_log_action = 'Database restored!';
$this->log_action($back_log_action);
echo "Files restored successfully!<br>\n";
echo 'Backup used: ' . $filename . "<br>\n";
if ($temp_dir_restore != false) {
@unlink($filename);
}
}
if (userfiles_path()) {
if (!is_dir(userfiles_path())) {
mkdir_recursive(userfiles_path());
}
}
if (media_base_path()) {
if (!is_dir(media_base_path())) {
mkdir_recursive(media_base_path());
}
}
if ($temp_dir_restore != false and is_dir($temp_dir_restore)) {
echo "Media restored!<br>\n";
$srcDir = $temp_dir_restore;
$destDir = userfiles_path();
$copy = $this->copyr($srcDir, $destDir);
}
if (function_exists('mw_post_update')) {
mw_post_update();
}
$back_log_action = 'Cleaning up cache';
$this->log_action($back_log_action);
mw()->cache_manager->clear();
$this->log_action(false);
}