<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
Сделано аккуратненько, несомненный +1
Гарантируется целостность и непротиворечивость базы, заархивированной при работающей 1С?
Грамотный вопрос. Во время активного ввода информации пользователями ничего гарантировать нельзя. Но лучше получить копию с «битым» документом, чем вообще ничего. Еще полезно делать «ночные» копии.
Неплохая штука. Маленький размер, фейс продуман, даже удаление мусора.
Нет: второго пути для копирования (про запас)
А если винрара нет в системе?
Да, и пароль на закрытие и изменение настроек — от продвинутых юзеров нужен.
А еще лучше — значок «не показывать в трейе».
Ох, не хочется возиться с шифрованием… А закрыть настройки можно средствами ОС, если «продвинутый пользователь» <> админ, в хелпе прописано.
Значок из трея убирать плохо: что если нужно срочно архивировать/восстановить, а админ в отпуске/бухает/болеет
Об архивировании без WinRAR — подумаю на досуге.
(6)отпуске/бухает/болеет
бухает и болеет — это и то же :)))))))))
«что если нужно срочно архивировать/восстановить»
при стабильном ночном бэкапе — не за чем. А распаковать все умеют.
🙂
сыровато..
навскидку в ХР настроил архивирование по времени — тупо выдал ошибку «..list of bounds…»
(2)
“Во время активного ввода информации пользователями ничего гарантировать нельзя”
В Вашей разработке или вообще?
Если “вообще”, то можно. Могу предоставить текст программы на Clipper-е для осмысления или кратко рассказать суть решения. Если, конечно, Вам это интересно.
Было бы неплохо добавить в настройку расписания режим архивации при включении компа
(10) > Если “вообще”, то можно
и как?
в конторе админ длябэкапов юзает Cobian — вроде так ничего… но как только включаешь опцию «теневого» бэкапа — т.е. при открытых файлах — начинает косячить…
(12)
“Если “вообще”, то можно и как?”
Общий алгоритм, без деталей:
1) Висит задача, которая по заданному графику начинает свою работу.
2) В момент “Ч” читаются имена DBF файлов из заданного каталога.
3) Для каждого файла выполняется попытка полной блокировки. В случае успешной попытки, делается попытка блокировки следующего файла. В случае не успешной попытки снимаются блокировки с, ранее заблокированных, файлов. И всё начинается заново с первого файла.
4) Когда все файлы успешно заблокированы, производится копирование каждого файла в рабочий каталог. Копирование выполняется огромными блоками очень быстро. Копирование начинается с самого короткого файла. После копирования каждого файла блокировка с этого файла снимается.
5) Запускается архиватор для файлов из рабочего каталога.
Естественно, надо организовать поколение архивов. Имеет смысл дать возможность настраивать порядок блокировки и копирования файлов применительно к особенностям программы, чью базу копируем. В случае 1Са возможны проблемы с бездарным алгоритмом блокировки записей и порядок копирования файлов весьма существенен, но определяемый. И т.д.
У меня такой алгоритм работал пять лет, выполняя копирования каждые 1-3 часа для самопальной торговой системы на DBFах. Количество пользователей было 10-20 человек. Правда, восстановление потребовалось сделать всего один раз за эти пять лет из-за поломки диска. И иногда использовали эти копии базы для поиска “вчерашнего дня” из-за нерадивости пользователей.
> Для каждого файла выполняется попытка полной блокировки.
вы хотите сказать 1Ска DBF-ной версии не держит блокировки на файлах — это понятно, если это не монопольный режим…?
но вероятность того, что ни один файл базы 1Ски не заблокирован в данный момент работы бэкапера — имхо весьма сомнителен…
или я не прав?
(9) Ошибку отловил, работе она не мешает, но все равно неприятно. Будет исправлено.
(11) Весьма специфичное пожелание. Думаю, архивация при запуске мало кому пригодится.
(14) Вероятность того, что ни один файл не заблокирован, ИМХО, весьма велика. Но я тоже не понял. Как возможна полная блокировка, если файлы открыты 1С-кой?
Или что подразумевается под полной блокировкой?
Еще вопросик. Проверялось что будет, если 1С попытается писать в заблокированный файл?
Выложил новый релиз. Исправлены ошибки.
(14)
http://infostart.ru/profile/2905/projects/1725/
“вы хотите сказать 1Ска DBF-ной версии не держит блокировки на файлах — это понятно, если это не монопольный режим…?”
Да.
“но вероятность того, что ни один файл базы 1Ски не заблокирован в данный момент работы бэкапера — имхо весьма сомнителен…”
Это та вероятность, которую сложно вычислить. Но, по пониманию их алгоритмов работы, думаю, она далеко не нулевая. Я б проверил на своей промышленной системе, но у меня совсем (!) не типовая конфигурация и результат будет не объективный для общего случая. Поэтому я и написал в (13) где и как это использовалось. А писать такую обработку для 1С мне не хочется. Мы ни разу за восемь лет не копировали базу данных. У нас нет в этом нужды. Но данный алгоритм решает поднятый в (1) вопрос.
(16)
“Но я тоже не понял. Как возможна полная блокировка, если файлы открыты 1С-кой?”
Способ см. в описании FoxPro функцию FLOCK([nWorkArea | cTableAlias]).
А механизмы описаны в
“Проверялось что будет, если 1С попытается писать в заблокированный файл?”
В общем случае “Ожидание транзакции”. А в частных см. в (13) предпоследний пункт. Если появится желание писать такую программу, обращайтесь ко мне с вопросами – разберёмся быстро.
Еще подправил.
В исключения добавлен файл .LCK
(18) Спасибо. Буду подумать.
(18) спсб за разъяснения
Отличная вещь, но ждем когда автор вылечит от зависимости к WinRAR. В эпоху легалайза, зависимость еще от одного не бесплатного софта омрачает
(16) <<Думаю, архивация при запуске мало кому пригодится.>>
Я бы так не сказал. Есть небольшие конторы, где нет серевера, база на одной из рабочих станций. Утром включили — бэкап.
Ну, плюс к тому — сервер внезапно перегрузился или ночью плановая перезагрузка — после нее бэкап.
почему бы winrar не поменять на 7zip?
(23)
“…сервер внезапно перегрузился…”
Это уже не сервер. 😉
(25) Скорее не UPS 😉
почему бы winrar не поменять на 7zip? Мне кажестя менять не надо, нужно сделать выбор чем архивировать… Я лично не в восторге от 7zip!
Не знаю связано ли это с программой но после второго архивирования у меня пропали все dbf и файл конфигугации . в фильтре на удаления эти файлы не стояли
Неудобное, архивирпование в плане того, что постоянно архивируется отчетность(все годы 700 MB) ведь там нет фильтра, есть только маска для файлов которые удаляются физически перед архивацией.
Программа очень непродуманная, не ставьте её она базы удаляет!!!
Ну и ну…
(29) Если архивируется отчетность, значит она нужна. А если не нужна, то что она делает в базе?
(30) Прога удаляет то, что ей скажут. Может у Вас звездочка одинокая в качестве маски файла?
отчетность находилась всегда в каталоге с базой в папке Extforms и убирать её никуда нельзя из базы и весит она прилично, а по поводу удалений баз(файлов dbf md и прочее),они начали пропадать как только я установил эту программу, я даже снял галочку чтобы он ничего не удалял о очистил этот список.Лучше бы сделали фильтр, это намного удобней, чем удалять файлы из базы.
(32)Перед использованием WinRAR проверьте Параметры архивации в Профиле архивации по умолчанию. В частности, снят ли флажок «Удалить файлы после упаковки».
(33)
>>> а также выполнять архивирование при запущенной 1С.
не работает при запущенной 1С, не делает архив базы 🙁