', for example 'forced-> cp1251', encoding tables in the reconstruction will be forcibly replaced by cp1251
// You can also specify comparison of the right to suit 'cp1251_ukrainian_ci' or 'forced-> cp1251_ukrainian_ci'
define('RESTORE_CHARSET', 'latin1');
// Include your persistence and the latest action
// To turn set 0
define('SC', 1);
// Types tables have been maintained only structure separated semicolon
define('ONLY_CREATE', 'MRG_MyISAM,MERGE,HEAP,MEMORY');
// Global statistics
// To turn set 0
define('GS', 1);
// Forward does not need editing
$is_safe_mode = ini_get('safe_mode') == '1' ? 1 : 0;
if (!$is_safe_mode && function_exists('set_time_limit')) set_time_limit(TIME_LIMIT);
$timer = array_sum(explode(' ', microtime()));
ob_implicit_flush();
error_reporting(E_ALL);
$auth = 0;
$error = '';
if (!empty($_POST['login']) && isset($_POST['pass'])) {
if (@mysql_connect(DBHOST, $_POST['login'], $_POST['pass'])){
setcookie("sxd", base64_encode("SKD101:{$_POST['login']}:{$_POST['pass']}"));
header("Location: ".$_SERVER['PHP_SELF']);
mysql_close();
exit;
}
else{
$error = '#' . mysql_errno() . ': ' . mysql_error();
}
}
elseif (!empty($_COOKIE['sxd'])) {
$user = explode(":", base64_decode($_COOKIE['sxd']));
if (@mysql_connect(DBHOST, $user[1], $user[2])){
$auth = 1;
}
else{
$error = '#' . mysql_errno() . ': ' . mysql_error();
}
}
if (!$auth || (isset($_SERVER['QUERY_STRING']) && $_SERVER['QUERY_STRING'] == 'reload')) {
echo tpl_page(tpl_auth($error ? tpl_error($error) : ''), "");
echo "";
exit;
}
if (!file_exists(PATH) && !$is_safe_mode) {
mkdir(PATH, 0777) || trigger_error("Unable to create a directory for printer ", E_USER_ERROR);
}
$SK = new dumper();
define('C_DEFAULT', 1);
define('C_RESULT', 2);
define('C_ERROR', 3);
define('C_WARNING', 4);
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
switch($action){
case 'backup':
$SK->backup();
break;
case 'restore':
$SK->restore();
break;
default:
$SK->main();
}
mysql_close();
echo "";
class dumper {
function dumper() {
if (file_exists(PATH . "dumper.cfg.php")) {
include(PATH . "dumper.cfg.php");
}
else{
$this->SET['last_action'] = 0;
$this->SET['last_db_backup'] = '';
$this->SET['tables'] = '';
$this->SET['comp_method'] = 2;
$this->SET['comp_level'] = 7;
$this->SET['last_db_restore'] = '';
}
$this->tabs = 0;
$this->records = 0;
$this->size = 0;
$this->comp = 0;
// MySQL type 40101
preg_match("/^(\d+)\.(\d+)\.(\d+)/", mysql_get_server_info(), $m);
$this->mysql_version = sprintf("%d%02d%02d", $m[1], $m[2], $m[3]);
$this->only_create = explode(',', ONLY_CREATE);
$this->forced_charset = false;
$this->restore_charset = $this->restore_collate = '';
if (preg_match("/^(forced->)?(([a-z0-9]+)(\_\w+)?)$/", RESTORE_CHARSET, $matches)) {
$this->forced_charset = $matches[1] == 'forced->';
$this->restore_charset = $matches[3];
$this->restore_collate = !empty($matches[4]) ? ' COLLATE ' . $matches[2] : '';
}
}
function backup() {
if (!isset($_POST)) {$this->main();}
set_error_handler("SXD_errorHandler");
$buttons = "Tải cơ sở dữ liệu về máy ({$filesize}) ";
echo tpl_page(tpl_process("Xin vui lòng chờ đợi trong giây lát... "), $buttons);
$this->SET['last_action'] = 0;
$this->SET['last_db_backup'] = isset($_POST['db_backup']) ? $_POST['db_backup'] : '';
$this->SET['tables_exclude'] = !empty($_POST['tables']) && $_POST['tables']{0} == '^' ? 1 : 0;
$this->SET['tables'] = isset($_POST['tables']) ? $_POST['tables'] : '';
$this->SET['comp_method'] = isset($_POST['comp_method']) ? intval($_POST['comp_method']) : 0;
$this->SET['comp_level'] = isset($_POST['comp_level']) ? intval($_POST['comp_level']) : 0;
$this->fn_save();
$this->SET['tables'] = explode(",", $this->SET['tables']);
if (!empty($_POST['tables'])) {
foreach($this->SET['tables'] AS $table){
$table = preg_replace("/[^\w*?^]/", "", $table);
$pattern = array( "/\?/", "/\*/");
$replace = array( ".", ".*?");
$tbls[] = preg_replace($pattern, $replace, $table);
}
}
else{
$this->SET['tables_exclude'] = 1;
}
if ($this->SET['comp_level'] == 0) {
$this->SET['comp_method'] = 0;
}
$db = $this->SET['last_db_backup'];
if (!$db) {
echo tpl_l("ERROR! No database!", C_ERROR);
echo tpl_enableBack();
exit;
}
echo tpl_l("Đang kết nối cơ sở dữ liệu.");
mysql_select_db($db) or trigger_error ("Unable to select database.
" . mysql_error(), E_USER_ERROR);
$tables = array();
$result = mysql_query("SHOW TABLES");
$all = 0;
while($row = mysql_fetch_array($result)) {
$status = 0;
if (!empty($tbls)) {
foreach($tbls AS $table){
$exclude = preg_match("/^\^/", $table) ? true : false;
if (!$exclude) {
if (preg_match("/^{$table}$/i", $row[0])) {
$status = 1;
}
$all = 1;
}
if ($exclude && preg_match("/{$table}$/i", $row[0])) {
$status = -1;
}
}
}
else {
$status = 1;
}
if ($status >= $all) {
$tables[] = $row[0];
}
}
$tabs = count($tables);
// Determination of tables
$result = mysql_query("SHOW TABLE STATUS");
$tabinfo = array();
$tab_charset = array();
$tab_type = array();
$tabinfo[0] = 0;
$info = '';
while($item = mysql_fetch_assoc($result)){
//print_r($item);
if(in_array($item['Name'], $tables)) {
$item['Rows'] = empty($item['Rows']) ? 0 : $item['Rows'];
$tabinfo[0] += $item['Rows'];
$tabinfo[$item['Name']] = $item['Rows'];
$this->size += $item['Data_length'];
$tabsize[$item['Name']] = 1 + round(LIMIT * 1048576 / ($item['Avg_row_length'] + 1));
if($item['Rows']) $info .= "|" . $item['Rows'];
if (!empty($item['Collation']) && preg_match("/^([a-z0-9]+)_/i", $item['Collation'], $m)) {
$tab_charset[$item['Name']] = $m[1];
}
$tab_type[$item['Name']] = isset($item['Engine']) ? $item['Engine'] : $item['Type'];
}
}
$show = 10 + $tabinfo[0] / 50;
$info = $tabinfo[0] . $info;
$name = $db . '_' . date("Y-m-d_H-i");
$fp = $this->fn_open($name, "w");
echo tpl_l("Bắt đầu tạo tên cơ sở dữ liệu :
\\n - {$this->filename}");
$this->fn_write($fp, "#SKD101|{$db}|{$tabs}|" . date("Y.m.d H:i:s") ."|{$info}\n\n");
$t=0;
echo tpl_l(str_repeat("-", 60));
$result = mysql_query("SET SQL_QUOTE_SHOW_CREATE = 1");
// Encoding connections by default
if ($this->mysql_version > 40101 && CHARSET != 'auto') {
mysql_query("SET NAMES '" . CHARSET . "'") or trigger_error ("Cannot set the encoding for the connection.
" . mysql_error(), E_USER_ERROR);
$last_charset = CHARSET;
}
else{
$last_charset = '';
}
foreach ($tables AS $table){
// Bill encoding connecting the encoding tables
if ($this->mysql_version > 40101 && $tab_charset[$table] != $last_charset) {
if (CHARSET == 'auto') {
mysql_query("SET NAMES '" . $tab_charset[$table] . "'") or trigger_error ("Cannot set the encoding for the connection.
" . mysql_error(), E_USER_ERROR);
echo tpl_l("Using encoding `" . $tab_charset[$table] . "`.", C_WARNING);
$last_charset = $tab_charset[$table];
}
else{
echo tpl_l('Encoding connections, and the table does not match:', C_ERROR);
echo tpl_l('Table `'. $table .'` -> ' . $tab_charset[$table] . ' (Connection ' . CHARSET . ')', C_ERROR);
}
}
echo tpl_l("Processing Table`{$table}` [" . fn_int($tabinfo[$table]) . "].");
// Creating tables
$result = mysql_query("SHOW CREATE TABLE `{$table}`");
$tab = mysql_fetch_array($result);
$tab = preg_replace('/(default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP|DEFAULT CHARSET=\w+|COLLATE=\w+|character set \w+|collate \w+)/i', '/*!40101 \\1 */', $tab);
$this->fn_write($fp, "DROP TABLE IF EXISTS `{$table}`;\n{$tab[1]};\n\n");
// Checking whether dampit data
if (in_array($tab_type[$table], $this->only_create)) {
continue;
}
// Oprededelyaem types of columns
$NumericColumn = array();
$result = mysql_query("SHOW COLUMNS FROM `{$table}`");
$field = 0;
while($col = mysql_fetch_row($result)) {
$NumericColumn[$field++] = preg_match("/^(\w*int|year)/", $col[1]) ? 1 : 0;
}
$fields = $field;
$from = 0;
$limit = $tabsize[$table];
$limit2 = round($limit / 3);
if ($tabinfo[$table] > 0) {
if ($tabinfo[$table] > $limit2) {
echo tpl_s(0, $t / $tabinfo[0]);
}
$i = 0;
$this->fn_write($fp, "INSERT INTO `{$table}` VALUES");
while(($result = mysql_query("SELECT * FROM `{$table}` LIMIT {$from}, {$limit}")) && ($total = mysql_num_rows($result))){
while($row = mysql_fetch_row($result)) {
$i++;
$t++;
for($k = 0; $k < $fields; $k++){
if ($NumericColumn[$k])
$row[$k] = isset($row[$k]) ? $row[$k] : "NULL";
else
$row[$k] = isset($row[$k]) ? "'" . mysql_escape_string($row[$k]) . "'" : "NULL";
}
$this->fn_write($fp, ($i == 1 ? "" : ",") . "\n(" . implode(", ", $row) . ")");
if ($i % $limit2 == 0)
echo tpl_s($i / $tabinfo[$table], $t / $tabinfo[0]);
}
mysql_free_result($result);
if ($total < $limit) {
break;
}
$from += $limit;
}
$this->fn_write($fp, ";\n\n");
echo tpl_s(1, $t / $tabinfo[0]);}
}
$this->tabs = $tabs;
$this->records = $tabinfo[0];
$this->comp = $this->SET['comp_method'] * 10 + $this->SET['comp_level'];
echo tpl_s(1, 1);
echo tpl_l(str_repeat("-", 60));
$this->fn_close($fp);
echo tpl_l("Quá trình xử lý cơ sở dữ liệu `{$db}` đã thành công.", C_RESULT);
echo tpl_l("Size of DB : " . round($this->size / 1048576, 2) . ".", C_RESULT);
$filesize = round(filesize(PATH . $this->filename) / 1048576, 2) . ".";
echo tpl_l("Size of file : {$filesize}", C_RESULT);
echo tpl_l("Tables processed : {$tabs}", C_RESULT);
echo tpl_l("Lines processed : " . fn_int($tabinfo[0]), C_RESULT);
echo "";
// Data Transfer for global statistics
if (GS) echo "";
}
function restore(){
if (!isset($_POST)) {$this->main();}
set_error_handler("SXD_errorHandler");
$buttons = "";
echo tpl_page(tpl_process("Restoring database backup"), $buttons);
$this->SET['last_action'] = 1;
$this->SET['last_db_restore'] = isset($_POST['db_restore']) ? $_POST['db_restore'] : '';
$file = isset($_POST['file']) ? $_POST['file'] : '';
$this->fn_save();
$db = $this->SET['last_db_restore'];
if (!$db) {
echo tpl_l("ERROR! No database!", C_ERROR);
echo tpl_enableBack();
exit;
}
echo tpl_l("Đang kết nối cơ sở dữ liệu `{$db}`.");
mysql_select_db($db) or trigger_error ("Unable to select database. .
" . mysql_error(), E_USER_ERROR);
// Definition file format
if(preg_match("/^(.+?)\.sql(\.(bz2|gz))?$/", $file, $matches)) {
if (isset($matches[3]) && $matches[3] == 'bz2') {
$this->SET['comp_method'] = 2;
}
elseif (isset($matches[2]) &&$matches[3] == 'gz'){
$this->SET['comp_method'] = 1;
}
else{
$this->SET['comp_method'] = 0;
}
$this->SET['comp_level'] = '';
if (!file_exists(PATH . "/{$file}")) {
echo tpl_l("ERROR! File Not Found! !", C_ERROR);
echo tpl_enableBack();
exit;
}
echo tpl_l("Reading File`{$file}`.");
$file = $matches[1];
}
else{
echo tpl_l("ERROR! No file selected(", C_ERROR);
echo tpl_enableBack();
exit;
}
echo tpl_l(str_repeat("-", 60));
$fp = $this->fn_open($file, "r");
$this->file_cache = $sql = $table = $insert = '';
$is_skd = $query_len = $execute = $q =$t = $i = $aff_rows = 0;
$limit = 300;
$index = 4;
$tabs = 0;
$cache = '';
$info = array();
// Setting coding connections
if ($this->mysql_version > 40101 && (CHARSET != 'auto' || $this->forced_charset)) { // Encryption by default if the dump was not encoded
mysql_query("SET NAMES '" . $this->restore_charset . "'") or trigger_error ("Cannot set the encoding for the connection.
" . mysql_error(), E_USER_ERROR);
echo tpl_l("Using encoding `" . $this->restore_charset . "`.", C_WARNING);
$last_charset = $this->restore_charset;
}
else {
$last_charset = '';
}
$last_showed = '';
while(($str = $this->fn_read_str($fp)) !== false){
if (empty($str) || preg_match("/^(#|--)/", $str)) {
if (!$is_skd && preg_match("/^#SKD101\|/", $str)) {
$info = explode("|", $str);
echo tpl_s(0, $t / $info[4]);
$is_skd = 1;
}
continue;
}
$query_len += strlen($str);
if (!$insert && preg_match("/^(INSERT INTO `?([^` ]+)`? .*?VALUES)(.*)$/i", $str, $m)) {
if ($table != $m[2]) {
$table = $m[2];
$tabs++;
$cache .= tpl_l("Table `{$table}`.");
$last_showed = $table;
$i = 0;
if ($is_skd)
echo tpl_s(100 , $t / $info[4]);
}
$insert = $m[1] . ' ';
$sql .= $m[3];
$index++;
$info[$index] = isset($info[$index]) ? $info[$index] : 0;
$limit = round($info[$index] / 20);
$limit = $limit < 300 ? 300 : $limit;
if ($info[$index] > $limit){
echo $cache;
$cache = '';
echo tpl_s(0 / $info[$index], $t / $info[4]);
}
}
else{
$sql .= $str;
if ($insert) {
$i++;
$t++;
if ($is_skd && $info[$index] > $limit && $t % $limit == 0){
echo tpl_s($i / $info[$index], $t / $info[4]);
}
}
}
if (!$insert && preg_match("/^CREATE TABLE (IF NOT EXISTS )?`?([^` ]+)`?/i", $str, $m) && $table != $m[2]){
$table = $m[2];
$insert = '';
$tabs++;
$is_create = true;
$i = 0;
}
if ($sql) {
if (preg_match("/;$/", $str)) {
$sql = rtrim($insert . $sql, ";");
if (empty($insert)) {
if ($this->mysql_version < 40101) {
$sql = preg_replace("/ENGINE\s?=/", "TYPE=", $sql);
}
elseif (preg_match("/CREATE TABLE/i", $sql)){
// Bill encoding connections
if (preg_match("/(CHARACTER SET|CHARSET)[=\s]+(\w+)/i", $sql, $charset)) {
if (!$this->forced_charset && $charset[2] != $last_charset) {
if (CHARSET == 'auto') {
mysql_query("SET NAMES '" . $charset[2] . "'") or trigger_error ("Cannot set the encoding for the connection.
{$sql}
" . mysql_error(), E_USER_ERROR);
$cache .= tpl_l("Using encoding `" . $charset[2] . "`.", C_WARNING);
$last_charset = $charset[2];
}
else{
$cache .= tpl_l('Encoding connections, and the table does not match :', C_ERROR);
$cache .= tpl_l('Table `'. $table .'` -> ' . $charset[2] . ' (Connection ' . $this->restore_charset . ')', C_ERROR);
}
}
// Changing encoding if the rush encoding
if ($this->forced_charset) {
$sql = preg_replace("/(\/\*!\d+\s)?((COLLATE)[=\s]+)\w+(\s+\*\/)?/i", '', $sql);
$sql = preg_replace("/((CHARACTER SET|CHARSET)[=\s]+)\w+/i", "\\1" . $this->restore_charset . $this->restore_collate, $sql);
}
}
elseif(CHARSET == 'auto'){ // Run encoding table if it is not specified and installed auto encoding
$sql .= ' DEFAULT CHARSET=' . $this->restore_charset . $this->restore_collate;
if ($this->restore_charset != $last_charset) {
mysql_query("SET NAMES '" . $this->restore_charset . "'") or trigger_error ("Cannot set the encoding for the connection.
{$sql}
" . mysql_error(), E_USER_ERROR);
$cache .= tpl_l("Using encoding `" . $this->restore_charset . "`.", C_WARNING);
$last_charset = $this->restore_charset;
}
}
}
if ($last_showed != $table) {$cache .= tpl_l("Table `{$table}`."); $last_showed = $table;}
}
elseif($this->mysql_version > 40101 && empty($last_charset)) { // Install encoding for the absence CREATE TABLE
mysql_query("SET $this->restore_charset '" . $this->restore_charset . "'") or trigger_error ("Cannot set the encoding for the connection.
{$sql}
" . mysql_error(), E_USER_ERROR);
echo tpl_l("Using encoding `" . $this->restore_charset . "`.", C_WARNING);
$last_charset = $this->restore_charset;
}
$insert = '';
$execute = 1;
}
if ($query_len >= 65536 && preg_match("/,$/", $str)) {
$sql = rtrim($insert . $sql, ",");
$execute = 1;
}
if ($execute) {
$q++;
mysql_query($sql) or trigger_error ("Bad request.
" . mysql_error(), E_USER_ERROR);
if (preg_match("/^insert/i", $sql)) {
$aff_rows += mysql_affected_rows();
}
$sql = '';
$query_len = 0;
$execute = 0;
}
}
}
echo $cache;
echo tpl_s(1 , 1);
echo tpl_l(str_repeat("-", 60));
echo tpl_l("DB restored from a backup.", C_RESULT);
if (isset($info[3])) echo tpl_l("Established copies: {$info[3]}", C_RESULT);
echo tpl_l("Queries to DB: {$q}", C_RESULT);
echo tpl_l("Tables set up: {$tabs}", C_RESULT);
echo tpl_l("Lines added: {$aff_rows}", C_RESULT);
$this->tabs = $tabs;
$this->records = $aff_rows;
$this->size = filesize(PATH . $this->filename);
$this->comp = $this->SET['comp_method'] * 10 + $this->SET['comp_level'];
echo "";
// Data Transfer for global statistics
if (GS) echo "";
$this->fn_close($fp);
}
function main(){
$this->comp_levels = array('9' => 'Level 9 (Cao nhất)', '8' => 'Level 8', '7' => 'Level 7', '6' => 'Level 6', '5' => 'Level 5 (Trung bình)', '4' => 'Level 4', '3' => 'Level 3', '2' => 'Level 2', '1' => 'Level 1 (Bình thường)','0' => 'Không tối ưu hóa ');
if (function_exists("bzopen")) {
$this->comp_methods[2] = 'BZip2';
}
if (function_exists("gzopen")) {
$this->comp_methods[1] = 'GZip';
}
$this->comp_methods[0] = 'No compression';
if (count($this->comp_methods) == 1) {
$this->comp_levels = array('0' =>'No compression');
}
$dbs = $this->db_select();
$this->vars['db_backup'] = $this->fn_select($dbs, $this->SET['last_db_backup']);
$this->vars['db_restore'] = $this->fn_select($dbs, $this->SET['last_db_restore']);
$this->vars['comp_levels'] = $this->fn_select($this->comp_levels, $this->SET['comp_level']);
$this->vars['comp_methods'] = $this->fn_select($this->comp_methods, $this->SET['comp_method']);
$this->vars['tables'] = $this->SET['tables'];
$this->vars['files'] = $this->fn_select($this->file_select(), '');
$buttons = "";
echo tpl_page(tpl_main(), $buttons);
}
function db_select(){
if (DBNAMES != '') {
$items = explode(',', trim(DBNAMES));
foreach($items AS $item){
if (mysql_select_db($item)) {
$tables = mysql_query("SHOW TABLES");
if ($tables) {
$tabs = mysql_num_rows($tables);
$dbs[$item] = "{$item} ({$tabs})";
}
}
}
}
else {
$result = mysql_query("SHOW DATABASES");
$dbs = array();
while($item = mysql_fetch_array($result)){
if (mysql_select_db($item[0])) {
$tables = mysql_query("SHOW TABLES");
if ($tables) {
$tabs = mysql_num_rows($tables);
$dbs[$item[0]] = "{$item[0]} ({$tabs})";
}
}
}
}
return $dbs;
}
function file_select(){
$files = array('' => ' ');
if (is_dir(PATH) && $handle = opendir(PATH)) {
while (false !== ($file = readdir($handle))) {
if (preg_match("/^.+?\.sql(\.(gz|bz2))?$/", $file)) {
$files[$file] = $file;
}
}
closedir($handle);
}
ksort($files);
return $files;
}
function fn_open($name, $mode){
if ($this->SET['comp_method'] == 2) {
$this->filename = "{$name}.sql.bz2";
return bzopen(PATH . $this->filename, "{$mode}b{$this->SET['comp_level']}");
}
elseif ($this->SET['comp_method'] == 1) {
$this->filename = "{$name}.sql.gz";
return gzopen(PATH . $this->filename, "{$mode}b{$this->SET['comp_level']}");
}
else{
$this->filename = "{$name}.sql";
return fopen(PATH . $this->filename, "{$mode}b");
}
}
function fn_write($fp, $str){
if ($this->SET['comp_method'] == 2) {
bzwrite($fp, $str);
}
elseif ($this->SET['comp_method'] == 1) {
gzwrite($fp, $str);
}
else{
fwrite($fp, $str);
}
}
function fn_read($fp){
if ($this->SET['comp_method'] == 2) {
return bzread($fp, 4096);
}
elseif ($this->SET['comp_method'] == 1) {
return gzread($fp, 4096);
}
else{
return fread($fp, 4096);
}
}
function fn_read_str($fp){
$string = '';
$this->file_cache = ltrim($this->file_cache);
$pos = strpos($this->file_cache, "\n", 0);
if ($pos < 1) {
while (!$string && ($str = $this->fn_read($fp))){
$pos = strpos($str, "\n", 0);
if ($pos === false) {
$this->file_cache .= $str;
}
else{
$string = $this->file_cache . substr($str, 0, $pos);
$this->file_cache = substr($str, $pos + 1);
}
}
if (!$str) {
if ($this->file_cache) {
$string = $this->file_cache;
$this->file_cache = '';
return trim($string);
}
return false;
}
}
else {
$string = substr($this->file_cache, 0, $pos);
$this->file_cache = substr($this->file_cache, $pos + 1);
}
return trim($string);
}
function fn_close($fp){
if ($this->SET['comp_method'] == 2) {
bzclose($fp);
}
elseif ($this->SET['comp_method'] == 1) {
gzclose($fp);
}
else{
fclose($fp);
}
@chmod(PATH . $this->filename, 0666);
$this->fn_index();
}
function fn_select($items, $selected){
$select = '';
foreach($items AS $key => $value){
$select .= $key == $selected ? "