Перейти к содержимому


Создание собственного бєкапа


Сообщений в теме: 39

#21 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 20 Март 2014 - 12:58

Цитата

Нет ни одной таблицы

Я в курсе что таблиц нет. Поэтому и говорю Вам, что файлы явно потерянные, и для их поиска и удаления есть соответствующий функционал. Это не внешние файлы, об этом речь и не шла.

#22 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 20 Март 2014 - 13:02

Цитата

Загружаемый файл не является файлом бэкапа программы Клиентская база.

Ну так вы сравните сами формат того и другого. Во-первых, у вас нет информационного заголовка, без него программа не считает файл бэкапом КБ. Во-вторых, все запросы должны быть в одну строку, т.к. чтение запросов построчное. У вас формат обычного дампа БД, такие программа не читает.

#23 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 20 Март 2014 - 13:07

Просмотр сообщенияCbCoder (20 Март 2014 - 13:02) писал:

Ну так вы сравните сами формат того и другого. Во-первых, у вас нет информационного заголовка, без него программа не считает файл бэкапом КБ. Во-вторых, все запросы должны быть в одну строку, т.к. чтение запросов построчное. У вас формат обычного дампа БД, такие программа не читает.
Даже так. Хорошо. Сейчас исправлю. Отпишусь. А вот еще такой вопрос, имеет ли значение нахождения инсертов? То есть сначала идет create table, потом должен обязательно быть insert для это таблицы? Или можно сделать все create table, потом уже insert-ы?

Сообщение отредактировал wondertalik: 20 Март 2014 - 13:20


#24 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 20 Март 2014 - 13:55

Исправил все о чем говорили. Но результат тот же. Что не так? Новый бэкап

class DiffBackup {

    private $filter = array();
    private $settings;
    private $list;
    private $file;
    private $delimiter = "\n";

    public function __construct(CBSettings $setngs) {
        $this->settings = $setngs;
        $this->file = new WFile("10.03.2014.sql");
    }

    /**
     * Используется для получения списка таблиц, которые требуется в бэкап отправить
     * @return mixed
     */
    public function getListTable() {
        //Получаем список всех таблиц
        $sqlQuery = "SHOW TABLES";
        $result = sql_query($sqlQuery);

        $tables = array();
        if(sql_num_rows($result) > 0) {
            while($row = sql_fetch_assoc($result)) {
                //Формируем массив таблиц
                $tables[] = $row['Tables_in_' . $this->settings->getSettings(CBSettings::DBNAME)];
            }
        }

        //Прогоняем список таблиц через фильтры
        foreach($this->filter as $key => $value) {
            $value->addTableByArray($tables);
            $tables = $value->filter();
        }

        $this->list = $tables;
//P::_print_r($tables);
        return $this->list;
    }


    public function addFilter(Filter $fil) {
        $this->filter[] = $fil;
    }


    public function delFilter($key) {
        unset($this->filter[$key]);
    }

    public function getListFilter() {
        foreach($this->filter as $key => $value) {
            P::_echo($value->getName());
        }
    }

    /**
     * Получаем SQL-команды создания всех таблиц
     */
    private function getCreateSqlCommand() {

        $string = "-- ' version ".$this->settings->getSettings(CBSettings::DBVERSION)." ' -- ' revision 11793 ' -- ' prefix ".$this->settings->getSettings(CBSettings::DBTABLE_PREFIX)." ' --";

        $this->file->fwrite($string . ";".$this->delimiter);

        foreach($this->list as $value) {

            $sqlQuery = "SHOW CREATE TABLE " . $value;
            $result = sql_query($sqlQuery);
            $row = sql_fetch_assoc($result);

            $tmp_c = implode("",explode("\n", strtolower($row['Create Table'])));
            $this->file->fwrite($tmp_c . ";".$this->delimiter);

            $this->getInsertSqlCommand($value);
        }


    }

    private function getInsertSqlCommand($table) {

        //Выбираем все строки
        $sqlQuery = "SELECT * FROM " . $table;

        $result = sql_query($sqlQuery);
        while($row = sql_fetch_assoc($result)) {
            $values = array();

            foreach($row as $fields => $val) {
                $values[] = is_numeric($val) ? $val : "'" . addslashes($val) . "'";

            }

            $insert = "insert into " . $table . " values (" . implode(', ', $values) . ")";

            $this->file->fwrite($insert . ";".$this->delimiter);
        }

    }


    public function getSQL() {
        $this->file->open();
        $this->getCreateSqlCommand();
        $this->file->fclose();
    }

}


unlink("10.03.2014.sql");
$listTable = array(1);
$filter = new DataFilter($settings, $listTable);

$backup = new DiffBackup($settings);
$backup->addFilter(new DataFilter($settings, array(1, 341)));
//$backup->addFilter(new CalendarFilter($settings));
$backup->getListTable();
$backup->getSQL();

$zip = new ZipArchive();
$res = $zip->open("test.zip", ZipArchive::OVERWRITE);

if($res === TRUE) {
    $zip->addEmptyDir("files/.ext_files");
    $zip->addFile("10.03.2014.sql");
    $zip->close();
}

Сообщение отредактировал wondertalik: 20 Март 2014 - 18:44


#25 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 20 Март 2014 - 14:34

Цитата

А вот еще такой вопрос, имеет ли значение нахождения инсертов? То есть сначала идет create table, потом должен обязательно быть insert для это таблицы? Или можно сделать все create table, потом уже insert-ы?

Не проверял, но возможно что и не имеет. Такой порядок связан чисто с последовательностью создания бэкапа, а не какой-то задумкой.

Цитата

Но результат тот же

Тот же - это "файл не является бэкапом"? Тогда не знаю, на это вроде только заголовок влияет. Попробуйте переводы строки в конце заменить на "\r\n" вместо "\n".

#26 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 20 Март 2014 - 15:23

Просмотр сообщенияCbCoder (20 Март 2014 - 14:34) писал:

Тот же - это "файл не является бэкапом"? Тогда не знаю, на это вроде только заголовок влияет. Попробуйте переводы строки в конце заменить на "\r\n" вместо "\n".
Загружаемый файл не является файлом бэкапа программы Клиентская база.

#27 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 20 Март 2014 - 16:00

Проверил. Информационная строка оказывается не является причиной, ее может и не быть. Главное чтобы первая срока (исключая информационную) начиналась с "create table". Очевидно у вас регистр просто не тот, все запросы должны быть в нижнем регистре.

#28 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 20 Март 2014 - 16:03

Просмотр сообщенияCbCoder (20 Март 2014 - 16:00) писал:

Проверил. Информационная строка оказывается не является причиной, ее может и не быть. Главное чтобы первая срока (исключая информационную) начиналась с "create table". Очевидно у вас регистр просто не тот, все запросы должны быть в нижнем регистре.
Хм. Сейчас проверю. отпишусь. Хотя для sql запросов регистр не имеет значение:).

#29 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 20 Март 2014 - 16:24

Ошибка системы.

Error generated:
C:\Program Files (x86)\MSTL\ClientBase\www\include\functions_cron.php(1170) : sql_query()
C:\Program Files (x86)\MSTL\ClientBase\www\backup.php(401) : load_backup()
Ошибка SQL запроса:
insert into f_acc_calendars values (10, 1, 10, 1);
Duplicate entry '10' for key 'PRIMARY'

Теперь вот так, с учетом что в бэкапе есть только одна такая строка. То есть дубликата просто не может быть в теории. Новый бэкап делался с чистой конфигурации вот он

И еще, откуда берется информация о ревизии, остальное понятно с config.php?
$string = "-- ' version ".$this->settings->getSettings(CBSettings::DBVERSION)." ' -- ' revision 11793 ' -- ' prefix ".$this->settings->getSettings(CBSettings::DBTABLE_PREFIX)." ' --";

Сообщение отредактировал wondertalik: 20 Март 2014 - 18:44


#30 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 20 Март 2014 - 17:15

Цитата

Теперь вот так, с учетом что в бэкапе есть только одна такая строка. То есть дубликата просто не может быть в теории

Значит в БД он есть.

Цитата

И еще, откуда берется информация о ревизии, остальное понятно с config.php?

Все берется с $config. В том числе и $config['revision']. Сами вы его не прочитаете нигде, это зашито в код установщиком.

#31 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 20 Март 2014 - 18:43

Просмотр сообщенияCbCoder (20 Март 2014 - 17:15) писал:

Значит в БД он есть.
Я взял sql-файл из сформированного бэкапа и через phpmyadmin сделал импорт в пустую бд. Никаких проблем не наблюдал. Импорт успешно был завершен. Взял бэкап с этим же sql и получил ошибку, указанную выше. Так как распаковывается бэкап?

#32 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Март 2014 - 08:28

Тем не менее ошибку вернул именно MySQL, возможно запрос выполнился 2 раза. Сказать в чем именно причина затрудняюсь, нужна отладка.

#33 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 21 Март 2014 - 10:02

Просмотр сообщенияCbCoder (21 Март 2014 - 08:28) писал:

Тем не менее ошибку вернул именно MySQL, возможно запрос выполнился 2 раза. Сказать в чем именно причина затрудняюсь, нужна отладка.
Хорошо. Какой выход из ситуации. Мне ну очень нужно решение или хотя бы понимание в чем проблема. Что Вам от меня нужно предоставить полные исходники?

Прикрепленные файлы

  • Прикрепленный файл  diffbackup.rar   4,45К   102 Количество загрузок:


#34 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Март 2014 - 10:15

Просмотр сообщенияCbCoder (20 Март 2014 - 14:34) писал:

Попробуйте переводы строки в конце заменить на "\r\n" вместо "\n".

Мало ли, может в этом дело.

Ваши исходники мне вряд ли нужны, т.к. проблема в вашем бэкапе и его интерпретации нашей функцией. Надо смотреть в чем отличие вашего файла от наших.

#35 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 21 Март 2014 - 10:20

Уже пробовал, это первое что мне в голову пришло.

#36 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Март 2014 - 10:38

Все таки, попробуйте максимально сблизить содержимое вашего и наших бэкапов. В идеале они вообще должны совпадать для случая когда вы у себя выбрали все таблицы и другие переносимые элементы.

#37 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 24 Март 2014 - 11:40

Может я парюсь, но вроде бы как была в ранних версиях программы функция "Слияния двух разных конфиг"... Или я действительно парюсь...

#38 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 24 Март 2014 - 11:44

Просмотр сообщенияdolphin (24 Март 2014 - 11:40) писал:

Может я парюсь, но вроде бы как была в ранних версиях программы функция "Слияния двух разных конфиг"... Или я действительно парюсь...
Мне не нужно сливание двух конфиг. На данный момент меня интересует создание дифференциального бэкапа с строго указанными таблицами и их данными.

#39 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 24 Март 2014 - 13:47

Ну так "подглядеть" как там импортится, и на этом основании сделать экспорт. Нет?

#40 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 24 Март 2014 - 13:56

Не понял Вас.Куда подглядеть? Код весь зашифрован. Меня интересует именно создание полностью совместимого бэкапа. Так чтобы его можно было независимо просто развернуть стандартными средствами. При этом для конечного пользователя все очень прозрачно. Над этим я сейчас работаю.





Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 анонимных