Exemple #1
0
 function restore()
 {
     if (!isset($_POST)) {
         $this->main();
     }
     set_error_handler("SXD_errorHandler");
     $buttons = "<INPUT ID=back TYPE=button VALUE='Back' DISABLED onClick=\"history.back();\">";
     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("&#272;ang k&#7871;t n&#7889;i c&#417; s&#7903; d&#7919; li&#7879;u `{$db}`.");
     mysql_select_db($db) or trigger_error("Unable to select database. .<BR>" . 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.<BR>" . 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.<BR>{$sql}<BR>" . 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.<BR>{$sql}<BR>" . 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.<BR>{$sql}<BR>" . 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.<BR>" . 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 "<SCRIPT>document.getElementById('back').disabled = 0;</SCRIPT>";
     // Data Transfer for global statistics
     if (GS) {
         echo "<SCRIPT>document.getElementById('GS').src = 'http://sypex.net/gs.php?r={$this->tabs},{$this->records},{$this->size},{$this->comp},108';</SCRIPT>";
     }
     $this->fn_close($fp);
 }
Exemple #2
0
 function restore()
 {
     if (!isset($_POST)) {
         $this->main();
     }
     set_error_handler("SXD_errorHandler");
     $buttons = "<INPUT ID=back TYPE=button VALUE='Вернуться' DISABLED onClick=\"history.back();\">";
     echo tpl_page(tpl_process("Восстановление БД из резервной копии"), $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("ОШИБКА! Не указана база данных!", C_ERROR);
         echo tpl_enableBack();
         exit;
     }
     echo tpl_l("Подключение к БД `{$db}`.");
     mysql_select_db($db) or trigger_error("Не удается выбрать базу данных.<BR>" . mysql_error(), E_USER_ERROR);
     preg_match("/^(\\d+)\\.(\\d+)\\.(\\d+)/", mysql_get_server_info(), $m);
     $this->mysql_version = sprintf("%d%02d%02d", $m[1], $m[2], $m[3]);
     // Определение формата файла
     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("ОШИБКА! Файл не найден!", C_ERROR);
             echo tpl_enableBack();
             exit;
         }
         echo tpl_l("Чтение файла `{$file}`.");
         $file = $matches[1];
     } else {
         echo tpl_l("ОШИБКА! Не выбран файл!", 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();
     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++;
                 echo tpl_l("Таблица `{$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++;
             $cache .= tpl_l("Таблица `{$table}`.");
             $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);
                     }
                 }
                 $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("Неправильный запрос.<BR>" . 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("БД восстановлена из резервной копии.", C_RESULT);
     if (isset($info[3])) {
         echo tpl_l("Дата создания копии: {$info[3]}", C_RESULT);
     }
     echo tpl_l("Запросов к БД: {$q}", C_RESULT);
     echo tpl_l("Таблиц создано: {$tabs}", C_RESULT);
     echo tpl_l("Строк добавлено: {$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 "<SCRIPT>document.getElementById('back').disabled = 0;</SCRIPT>";
     // Передача данных для глобальной статистики
     if (GS) {
         echo "<SCRIPT>document.getElementById('GS').src = 'http://sypex.net/gs.php?r={$this->tabs},{$this->records},{$this->size},{$this->comp},107';</SCRIPT>";
     }
     $this->fn_close($fp);
 }
Exemple #3
0
 function restore()
 {
     if (!isset($_POST)) {
         $this->main();
     }
     set_error_handler("SXD_errorHandler");
     $buttons = "<INPUT ID=back TYPE=button VALUE='Вернуться' DISABLED onClick=\"history.back();\">";
     echo tpl_page(tpl_process("Восстановление БД из резервной копии"), $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("ОШИБКА! Не указана база данных!", C_ERROR);
         echo tpl_enableBack();
         exit;
     }
     echo tpl_l("Подключение к БД `{$db}`.");
     mysql_select_db($db) or trigger_error("Не удается выбрать базу данных.<BR>" . mysql_error(), E_USER_ERROR);
     // Определение формата файла
     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("ОШИБКА! Файл не найден!", C_ERROR);
             echo tpl_enableBack();
             exit;
         }
         echo tpl_l("Чтение файла `{$file}`.");
         $file = $matches[1];
     } else {
         echo tpl_l("ОШИБКА! Не выбран файл!", 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();
     // Установка кодировки соединения
     if ($this->mysql_version > 40101 && (CHARSET != 'auto' || $this->forced_charset)) {
         // Кодировка по умолчанию, если в дампе не указана кодировка
         mysql_query("SET NAMES '" . $this->restore_charset . "'") or trigger_error("Неудается изменить кодировку соединения.<BR>" . mysql_error(), E_USER_ERROR);
         echo tpl_l("Установлена кодировка соединения `" . $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}`.");
                 $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)) {
                         // Выставляем кодировку соединения
                         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("Неудается изменить кодировку соединения.<BR>{$sql}<BR>" . mysql_error(), E_USER_ERROR);
                                     $cache .= tpl_l("Установлена кодировка соединения `" . $charset[2] . "`.", C_WARNING);
                                     $last_charset = $charset[2];
                                 } else {
                                     $cache .= tpl_l('Кодировка соединения и таблицы не совпадает:', C_ERROR);
                                     $cache .= tpl_l('Таблица `' . $table . '` -> ' . $charset[2] . ' (соединение ' . $this->restore_charset . ')', C_ERROR);
                                 }
                             }
                             // Меняем кодировку если указано форсировать кодировку
                             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') {
                             // Вставляем кодировку для таблиц, если она не указана и установлена auto кодировка
                             $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("Неудается изменить кодировку соединения.<BR>{$sql}<BR>" . mysql_error(), E_USER_ERROR);
                                 $cache .= tpl_l("Установлена кодировка соединения `" . $this->restore_charset . "`.", C_WARNING);
                                 $last_charset = $this->restore_charset;
                             }
                         }
                     }
                     if ($last_showed != $table) {
                         $cache .= tpl_l("Таблица `{$table}`.");
                         $last_showed = $table;
                     }
                 } elseif ($this->mysql_version > 40101 && empty($last_charset)) {
                     // Устанавливаем кодировку на случай если отсутствует CREATE TABLE
                     mysql_query("SET {$this->restore_charset} '" . $this->restore_charset . "'") or trigger_error("Неудается изменить кодировку соединения.<BR>{$sql}<BR>" . mysql_error(), E_USER_ERROR);
                     echo tpl_l("Установлена кодировка соединения `" . $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("Неправильный запрос.<BR>" . 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("БД восстановлена из резервной копии.", C_RESULT);
     if (isset($info[3])) {
         echo tpl_l("Дата создания копии: {$info[3]}", C_RESULT);
     }
     echo tpl_l("Запросов к БД: {$q}", C_RESULT);
     echo tpl_l("Таблиц создано: {$tabs}", C_RESULT);
     echo tpl_l("Строк добавлено: {$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 "<SCRIPT>document.getElementById('back').disabled = 0;</SCRIPT>";
     // Передача данных для глобальной статистики
     if (GS) {
         echo "<SCRIPT>document.getElementById('GS').src = 'http://sypex.net/gs.php?r={$this->tabs},{$this->records},{$this->size},{$this->comp},108';</SCRIPT>";
     }
     $this->fn_close($fp);
 }
Exemple #4
0
 function restore()
 {
     $TEXT_DUMPER_BACK = TEXT_DUMPER_BACK;
     $TEXT_DUMPER_NAME_ERROR = TEXT_DUMPER_NAME_ERROR;
     $TEXT_DUMPER_CONNECT = TEXT_DUMPER_CONNECT;
     $TEXT_DUMPER_CONNECT_ERROR = TEXT_DUMPER_CONNECT_ERROR;
     $TEXT_DUMPER_CREATE_FILE = TEXT_DUMPER_CREATE_FILE;
     $TEXT_DUMPER_CHARSET_ERROR = TEXT_DUMPER_CHARSET_ERROR;
     $TEXT_DUMPER_CHARSET = TEXT_DUMPER_CHARSET;
     $TEXT_DUMPER_CHARSET_COLLATION = TEXT_DUMPER_CHARSET_COLLATION;
     $TEXT_DUMPER_TABLE = TEXT_DUMPER_TABLE;
     $TEXT_DUMPER_CONNECT1 = TEXT_DUMPER_CONNECT1;
     $TEXT_DUMPER_PROCESS = TEXT_DUMPER_PROCESS;
     $TEXT_DUMPER_TABLES_COUNT = TEXT_DUMPER_TABLES_COUNT;
     $TEXT_DUMPER_STRING_COUNT = TEXT_DUMPER_STRING_COUNT;
     $TEXT_DUMPER_RESTORE = TEXT_DUMPER_RESTORE;
     $TEXT_DUMPER_FILE_ERROR = TEXT_DUMPER_FILE_ERROR;
     $TEXT_DUMPER_FILE_READ = TEXT_DUMPER_FILE_READ;
     $TEXT_DUMPER_FILE_ERROR1 = TEXT_DUMPER_FILE_ERROR1;
     $TEXT_DUMPER_QUERY_ERROR = TEXT_DUMPER_QUERY_ERROR;
     $TEXT_DUMPER_RESTORED = TEXT_DUMPER_RESTORED;
     $TEXT_DUMPER_DATE = TEXT_DUMPER_DATE;
     $TEXT_DUMPER_QUERY_COUNT = TEXT_DUMPER_QUERY_COUNT;
     $TEXT_DUMPER_TABLES_CREATED = TEXT_DUMPER_TABLES_CREATED;
     $TEXT_DUMPER_STRINGS_CREATED = TEXT_DUMPER_STRINGS_CREATED;
     $TEXT_DUMPER_MAX = TEXT_DUMPER_MAX;
     $TEXT_DUMPER_MED = TEXT_DUMPER_MED;
     $TEXT_DUMPER_MIN = TEXT_DUMPER_MIN;
     $TEXT_DUMPER_NO = TEXT_DUMPER_NO;
     if (!isset($_REQUEST)) {
         $this->main();
     }
     set_error_handler("SXD_errorHandler");
     $buttons = "<span class=button><button id=back type=button value='" . TEXT_DUMPER_BACK . "' disabled onclick=\"history.back();\">" . TEXT_DUMPER_BACK . "</button></span>";
     echo tpl_page(tpl_process($TEXT_DUMPER_RESTORE), $buttons);
     $this->SET['last_action'] = 1;
     $this->SET['last_db_restore'] = isset($_REQUEST['db_restore']) ? $_REQUEST['db_restore'] : '';
     $file = isset($_POST['file']) ? $_POST['file'] : '';
     $this->fn_save();
     $db = $this->SET['last_db_restore'];
     if (!$db) {
         echo tpl_l($TEXT_DUMPER_NAME_ERROR, C_ERROR);
         echo tpl_enableBack();
         exit;
     }
     echo tpl_l($TEXT_DUMPER_CONNECT . "`{$db}`.");
     mysql_select_db($db) or trigger_error($TEXT_DUMPER_CONNECT_ERROR . "<br />" . mysql_error(), E_USER_ERROR);
     // Определение формата файла
     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($TEXT_DUMPER_FILE_ERROR, C_ERROR);
             echo tpl_enableBack();
             exit;
         }
         echo tpl_l($TEXT_DUMPER_FILE_READ . "`{$file}`.");
         $file = $matches[1];
     } else {
         echo tpl_l($TEXT_DUMPER_FILE_ERROR1, 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();
     // Установка кодировки соединения
     if ($this->mysql_version > 40101 && (CHARSET != 'auto' || $this->forced_charset)) {
         // Кодировка по умолчанию, если в дампе не указана кодировка
         mysql_query("SET NAMES '" . $this->restore_charset . "'") or trigger_error($TEXT_DUMPER_CHARSET_ERROR . "<br />" . mysql_error(), E_USER_ERROR);
         echo tpl_l($TEXT_DUMPER_CHARSET . "`" . $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}`.");
                 $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)) {
                         // Выставляем кодировку соединения
                         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($TEXT_DUMPER_CHARSET_ERROR . "<br />{$sql}<br />" . mysql_error(), E_USER_ERROR);
                                     $cache .= tpl_l($TEXT_DUMPER_CHARSET . "`" . $charset[2] . "`.", C_WARNING);
                                     $last_charset = $charset[2];
                                 } else {
                                     $cache .= tpl_l($TEXT_DUMPER_CHARSET_COLLATION, C_ERROR);
                                     $cache .= tpl_l($TEXT_DUMPER_TABLE . '`' . $table . '` -> ' . $charset[2] . ' (' . $TEXT_DUMPER_CONNECT1 . $this->restore_charset . ')', C_ERROR);
                                 }
                             }
                             // Меняем кодировку если указано форсировать кодировку
                             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') {
                             // Вставляем кодировку для таблиц, если она не указана и установлена auto кодировка
                             $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($TEXT_DUMPER_CHARSET_ERROR . "<br />{$sql}<br />" . mysql_error(), E_USER_ERROR);
                                 $cache .= tpl_l($TEXT_DUMPER_CHARSET . "`" . $this->restore_charset . "`.", C_WARNING);
                                 $last_charset = $this->restore_charset;
                             }
                         }
                     }
                     if ($last_showed != $table) {
                         $cache .= tpl_l($TEXT_DUMPER_TABLE . "`{$table}`.");
                         $last_showed = $table;
                     }
                 } elseif ($this->mysql_version > 40101 && empty($last_charset)) {
                     // Устанавливаем кодировку на случай если отсутствует CREATE table
                     mysql_query("SET {$this->restore_charset} '" . $this->restore_charset . "'") or trigger_error(TEXT_DUMPER_CHARSET_ERROR . "<br />{$sql}<br />" . mysql_error(), E_USER_ERROR);
                     echo tpl_l($TEXT_DUMPER_CHARSET . "`" . $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(TEXT_DUMPER_QUERY_ERROR . "<br />" . 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($TEXT_DUMPER_RESTORED, C_RESULT);
     if (isset($info[3])) {
         echo tpl_l($TEXT_DUMPER_DATE . "{$info[3]}", C_RESULT);
     }
     echo tpl_l($TEXT_DUMPER_QUERY_COUNT . "{$q}", C_RESULT);
     echo tpl_l($TEXT_DUMPER_TABLES_CREATED . "{$tabs}", C_RESULT);
     echo tpl_l(TEXT_DUMPER_STRINGS_CREATED . "{$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 "<script>document.getElementById('back').disabled = 0;</script>";
     // Передача данных для глобальной статистики
     if (GS) {
         echo "<script>document.getElementById('GS').src = 'http://sypex.net/gs.php?r={$this->tabs},{$this->records},{$this->size},{$this->comp},108';</script>";
     }
     $this->fn_close($fp);
 }