Восстановление базы данных с использованием архиватора WinRAR.

Это решение является продолжением (или 2-й частью) решения по дублированию базы данных с использованием архиватора WinRAR.

Восстановление базы данных с использованием архиватора WinRAR.

PROCEDURE RecoveBD
* ПРОЦЕДУРА ВОССТАНОВЛЕНИЯ БД

* делаем подготовку (определяем пути, собираем файлы и пр.)
LOCAL lcPathTarget && путь назначения
lcPathTarget = ""
* проверим на предмет задания файла-дубля БД
DO WHILE EMPTY(ALLTRIM(lcPathTarget))
lcPathTarget = GETFILE("rar","","",0,"Найдите и задайте файл-дубль базы"+;
" данных") && определяем путь и имя файла для чтения
IF EMPTY(ALLTRIM(lcPathTarget )) THEN
IF MESSAGEBOX ("Не указан файл - дубль базы данных."+CHR(10)+;
"Повторить поиск файла?",4+32+0,"ВОПРОС") # 6;
THEN
DO MyExit && уходим
ENDIF
ENDIF
ENDDO

LOCAL lcArgument
lcArgument = " e " + lcPathTarget + " " + DataPath && DataPath - путь к
* папке, куда все восстанавливается

* АРХИВИРУЕМ
*объявляем функцию api для отлавливания начала и завершения дублирования
DECLARE integer FindWindow IN Win32API string, string

LOCAL StartDateTime && время начала старта
LOCAL lcMessError && сообщение об ошибке

* Проверяем на предмет незанятости базы данных
LOCAL lcOldError
lcOldError = ON('Error') && запоминаем путь к старому обработчику ошибок
ON ERROR DO Zaglushka
LOCAL llZanjato
llZanjato = .T.
DO WHILE llZanjato && крутимся в цикле, пока не освободится БД
OPEN DATABASE KlassNar EXCLUSIVE
IF DBUSED('KlassNar') THEN && если база открылась, то работаем
llZanjato = .F.
ELSE
IF MESSAGEBOX("Кто-то работает с базой данных."+CHR(10)+;
"Восстановить базу данных невозможно."+CHR(10)+;
"Выгоните их всех!"+CHR(10)+CHR(10)+;
"Повторить попытку восстановления?",5+16+0,"ВОПРОС") = 4 THEN
llZanjato = .T.
ELSE
DO MyExit && уходим
ENDIF
ENDIF
ENDDO

* Резко закрываем активные базы и таблицы
CLOSE DATABASE ALL

lcMessError = myRun("WinRAR.exe",lcArgument) && архивация (или дублирование)

LOCAL ltDeltaTime && время ожидания, сек
ltDeltaTime = 60
StartDateTime = DATETIME()
*Ждем появления окна WinRAR или пока не истекло время ожидания
DO WHILE FindWindow(NULL,'WinRAR')=0
IF DATETIME() > StartDateTime + ltDeltaTime THEN && время ожидания появления окна
* 60 сек
MESSAGEBOX("Истекло время ожидания запуска архиватора."+CHR(10)+;
"Восстановление не выполнено!"+CHR(10)+;
"Возможно не установлен архиватор WinRar.",0+16+0,"ОШИБКА")
DO MyExit && уходим
ENDIF
ENDDO

*Ждем завершения работы WinRAR или пока не истекло время ожидания
ltDeltaTime = 300 && 5 минут
StartDateTime = DATETIME()
LOCAL ltDeltaTime && время ожидания, сек
DO WHILE FindWindow(NULL,'WinRAR')#0
IF DATETIME() > StartDateTime + ltDeltaTime THEN
* запросим выход или еще подождем 2 минуты
IF MESSAGEBOX('Истекло время ожидания завершения восстановления.'+CHR(10)+;
'Подождать еще 2 минуты?'+CHR(10)+CHR(10)+;
'ПОЯСНЕНИЕ: Если восстановление завершилось пока Вы думали, все '+;
'равно нажмите "Да". '+;
'Нажатие "Нет" приводит к прекращению дальнейшей работы.';
,4+32+0,"ВОПРОС") = 6 THEN
StartDateTime = DATETIME()
ltDeltaTime = 120 && 2 минуты
ELSE
DO MyExit && уходим
ENDIF
ENDIF
ENDDO

ON ERROR &lcOldError && восстановить обработчик ошибок

* проверяем результат восстановления на ошибки
IF NOT EMPTY(ALLTRIM(lcMessError)) THEN
MESSAGEBOX ("Ошибка при восстановлении базы данных."+CHR(10)+;
"Восстановление не выполнено!"+CHR(10)+;
"Возможно не установлен архиватор WinRar.",0+16+0,"ОШИБКА")
ELSE
MESSAGEBOX("Восстановление базы данных завершено",0+64+0,"ИНФОРМАЦИЯ")
ENDIF
DO MyExit && уходим

ENDPROC
*************************************************************

FUNCTION myRun
* Функция, которая ищет файл и запускает соответствующее приложение для этого файла
* С помощью данной функции можно запускать программы (например, WinRar)

LPARAMETERS cFile, cAtribut
LOCAL lcAtribut
* а передается ли атрибут для вызываемого файла?
IF PARAMETERS()<2 THEN
lcAtribut = "" && нет параметра для передачи
ELSE
lcAtribut = cAtribut && передаваемый параметр
ENDIF

LOCAL nWhnd, cStartPath, nResult, cMsg
DECLARE INTEGER ShellExecute IN SHELL32 INTEGER hwnd, STRING cOP, STRING
cFile, ;
STRING cParams, STRING cStartDir, INTEGER nShowCmd
DECLARE INTEGER GetDesktopWindow IN User32

nWhnd = GetDesktopWindow()
cStartPath = ADDBS(JUSTPATH(cFile))
*!* nResult = ShellExecute(nWhnd, 'OPEN', cFile, '', cStartPath, 1)
nResult = ShellExecute(nWhnd, 'OPEN', cFile, lcAtribut, cStartPath, 1)
cMsg = ''
IF nResult < 0x32
DO CASE
CASE nResult = 2 && File not found
cMsg = 'Файл не найден'
CASE nResult = 3 && Path not found
cMsg = 'Неверный путь'
CASE nResult = 5 && Access denied
cMsg = 'Запуск невозможен'
CASE nResult = 8 && Not enough memory
cMsg = 'Недостаточно памяти для запуска приложения'
CASE nResult = 0x32 && DLL Not found
cMsg = 'DLL не найдена'
CASE nResult = 0x26 && Sharing violation
cMsg = 'Попытка совместного доступа'
CASE nResult = 0x27 && Invalid file association
cMsg = 'Неправильная ассоциация файла'
CASE nResult = 0x28 && DDE Timeout
cMsg = 'DDE Timeout'
CASE nResult = 0x29 && DDE Fail
cMsg = 'DDE Fail'
CASE nResult = 0x30 && DDE Busy
cMsg = 'DDE занято'
CASE nResult = 0x31 && No association
cMsg = 'С данным файлом не сопоставлено никакое приложение'
CASE nResult = 0x11 && Invalid EXE format
cMsg = 'Неверный формат EXE'
OTHERWISE
cMsg = 'Неизвестная ошибка'
ENDCASE
ENDIF

RETURN cMsg
ENDFUNC
*************************************************************

PROCEDURE Zaglushka
* ЗАГЛУШКА
RETURN
ENDPROC
**************************************************************

PROC MyExit
*выход из программы

CLEAR EVENTS
CLOSE DATABASES
CLOSE ALL

QUIT

ENDPROC
*************************************************************

Автор: ГВК
0

Автор публикации

не в сети 1 год

admin

0
Комментарии: 0Публикации: 109Регистрация: 10-12-2000
Оставить комментарий
Авторизация
*
*
Генерация пароля