<?php
define('MSR_VERSION', '1.0.0');
define('__SEP__', "/*sep*/" );
define('MSR_STRING', 0);
define('MSR_FILE', 1);
set_time_limit( 600 );
class MySQL_Restore {
var $server = 'localhost';
var $port = 3306;
var $username = 'root';
var $password = '';
var $database = '';
var $link_id = -1;
var $connected = false;
var $queries = array();
var $error = '';
var $debug = false;
var $log_folder = "";
var $log_file_name = "";
function MySQL_Restore() {
$this->log_file_name = "restore_" . date( "Ymd_his" ) . ".log";
}
function Execute( $param, $mode = MSR_STRING, $is_compressed = false, $split_only = false ) {
if ( $this->debug ) {
$this->saveLog( "[start reading file]" );
}
if ( $mode == MSR_FILE ) {
if (!($sql = $this->_ReadFromFile($param, $is_compressed))) {
$this->error = 'Can\'t read backup file.';
return false;
}
} else {
$sql = ($is_compressed ? gzuncompress($param) : $param);
}
if ( $this->debug ) {
$this->saveLog( "[file readed]" );
}
return $this->_Restore( $sql, $split_only );
}
function _Connect() {
$value = false;
if ( !$this->connected ) {
$host = $this->server . ':' . $this->port;
$this->link_id = mysql_pconnect( $host, $this->username, $this->password );
}
if ( $this->link_id ) {
if ( empty( $this->database ) ) {
$value = true;
} elseif ( $this->link_id !== -1 ) {
$value = mysql_select_db($this->database, $this->link_id);
} else {
$value = mysql_select_db($this->database);
}
}
if (!$value) {
$this->error = mysql_error();
}
return $value;
}
function _Disconnect() {
if ( $this->link_id ) {
mysql_close( $this->link_id );
}
}
function _Query( $sql ) {
if ( $this->link_id !== -1 ) {
$result = mysql_query( $sql, $this->link_id );
} else {
$result = mysql_query( $sql );
}
if ( !$result ) {
$this->error = mysql_error();
}
return $result;
}
// The logic from phpMyAdmin source
function _Decompose( &$ret, $sql ) {
$sql = rtrim( $sql, "\n\r" );
$sql_len = strlen( $sql );
$char = '';
$string_start = '';
$in_string = false;
$nothing = true;
$time0 = time();
for ( $i = 0; $i < $sql_len; ++$i ) {
$char = $sql[$i];
if ( $in_string ) {
for (;;) {
$i = strpos( $sql, $string_start, $i );
if ( !$i ) {
$ret[] = $sql;
return true;
} elseif ( $string_start == '`' || $sql[$i - 1] != '\\' ) {
$string_start = '';
$in_string = false;
break;
} else {
$j = 2;
$escaped_backslash = false;
while ( $i - $j > 0 && $sql[$i - $j] == '\\' ) {
$escaped_backslash = !$escaped_backslash;
$j++;
}
if ( $escaped_backslash ) {
$string_start = '';
$in_string = false;
break;
} else {
$i++;
}
}
}
} else if ( ($char == '-' && $sql_len > $i + 2 && $sql[$i + 1] == '-' && $sql[$i + 2] <= ' ') || $char == '#' || ($char == '/' && $sql_len > $i + 1 && $sql[$i + 1] == '*') ) {
$comm_end = ($char == '/' ? '*/' : "\n");
$i = strpos($sql, $comm_end, $i);
if ( $i === false ) {
break;
}
if ($char == '/') {
$i++;
}
} else if ($char == ';') {
$ret[] = array( 'query' => substr( $sql, 0, $i ), 'empty' => $nothing );
$nothing = true;
$sql = ltrim(substr($sql, min($i + 1, $sql_len)));
$sql_len = strlen($sql);
if ( $sql_len ) {
$i = -1;
} else {
return true;
}
} else if (($char == '"') || ($char == '\'') || ($char == '`')) {
$in_string = true;
$nothing = false;
$string_start = $char;
} elseif ($nothing) {
$nothing = false;
}
$time1 = time();
if ($time1 >= $time0 + 30) {
$time0 = $time1;
@header('X-pmaPing: Pong');
}
}
if (!empty($sql) && preg_match('@[^[:space:]]+@', $sql)) {
$ret[] = array('query' => $sql, 'empty' => $nothing);
}
return true;
}
function _Restore($sql, $split_only) {
if ( $this->debug ) {
$this->saveLog( "[start restoring]" );
}
if ( $this->debug ) {
$this->saveLog( "[connecting to DB...]" );
}
if (!$this->_Connect()) {
return false;
}
if ( $this->debug ) {
$this->saveLog( "[connected to DB]" );
}
if ( $this->debug ) {
$this->saveLog( "[decomposing...]" );
}
$queries = array();
$errors = '';
// check if is this our backup
if ( strpos( $sql, __SEP__ ) !== false ) {
if ( $this->debug ) {
$this->saveLog( "[founding our backup file]" );
}
$queries = explode( __SEP__, $sql );
if ( count( $queries ) ) {
if ( $this->debug ) {
$this->saveLog( "[decomposed]" );
}
if (!$split_only) {
foreach ($queries as $query) {
$query = trim( $query );
if ( !empty( $query ) ) {
if (!$this->_Query( $query ) ) {
$errors .= $this->error . '<br />';
}
if ( $this->debug ) {
$this->saveLog( $query );
}
}
}
}
}
} else {
if ( $this->debug ) {
$this->saveLog( "[common sql file founded]" );
}
if (!$this->_Decompose( $queries, $sql ) ) {
return false;
}
if ( $this->debug ) {
$this->saveLog( "[decomposed]" );
}
foreach ($queries as $query) {
if (!$split_only) {
if (!$this->_Query( trim( $query['query'] ) ) ) {
$errors .= $this->error . '<br /><br />';
}
}
if ( $this->debug ) {
$this->saveLog( $query['query'] );
}
}
}
if ( $this->debug ) {
$this->saveLog( "[finished restoring]" );
}
$this->_Disconnect();
if ( !empty( $errors ) ) {
$this->error = $errors;
return false;
}
return true;
}
function _ReadFromFile($fname, $is_compressed) {
if ($is_compressed) {
$sql = gzfile($fname);
} else {
$sql = file($fname);
}
if ($sql === false) {
return false;
}
return implode('', $sql);
}
function saveLog( $str ) {
$f = @fopen( $this->log_folder . $this->log_file_name, "a" );
@fwrite( $f, "[" . date( "H:i:s" ). "] " . $str . "\n" );
@fclose( $f );
}
}
?>
MySQL Restore-Klasse
Chris Coyier am
Schöne Snippets :-)
Ich fand sie wirklich nützlich, aber ich weiß nicht, warum der gesamte Code ohne Kommentare ist, da diese den Code für die Leute viel nützlicher machen.
Auch gibt es bei den meisten Snippets keine Nutzungsweise.
Ich habe versucht, den Code zu verfolgen und zu debuggen, um die Wiederherstellungsfunktionalität zu realisieren, aber am Ende werden nur die Tabellen wiederhergestellt, für die bereits Einfügungen vorgenommen wurden, und die leeren Tabellen werden nicht wiederhergestellt.
Kann jemand bitte schreiben, wie man es benutzt.
HINWEIS
Ich habe das Backup über MySQL_Backup gemacht, das ist ein anderes Snippet hier; und ich weiß auch, dass der Dateiname in der MySQL_Restore-Klasse ein anderes Format haben sollte.
Wo schreibe ich den Pfad zu der Datei, die ich wiederherstellen möchte?
Wo schreibe ich den Pfad zu der Datei, die ich wiederherstellen möchte??? ??? ??? ???