Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Ещё вопрос по gbak / 17 сообщений из 17, страница 1 из 1
15.06.2016, 13:18
    #39256320
alex_p_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
Всем привет

Такой вопрос: а вот этот самый gbak вертает какое-то значение по окончании своей работы? Ну, типа 0 - успешно, не 0 - неуспешно, или что-то подобное? Чтобы можно было, запустив его из своей проги по ShellExecute, опеределить статус и результат его работы
...
Рейтинг: 0 / 0
15.06.2016, 13:42
    #39256340
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
alex_p_nЧтобы можно было, запустив его из своей проги по ShellExecute, опеределить статус и результат его работы

не по ShellExecute, а нужно получить лог работы GBAK.
это можно сделать через:
1) ServiceAPI и компонент TIBBackupService
2) через captured запуск внешнего приложения GBAK

код на Delphi7, для уникодной Delphi - НУЖНО ПЕРЕРАБОТАТЬ!!!111адыныдын


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
type
  _STARTUPINFOA = record
    cb             :LongWord;
    lpReserved     :Longword; // Pointer;
    lpDesktop      :Longword; // Pointer;
    lpTitle        :Longword; // Pointer;
    dwX            :LongWord;
    dwY            :LongWord;
    dwXSize        :LongWord;
    dwYSize        :LongWord;
    dwXCountChars  :LongWord;
    dwYCountChars  :LongWord;
    dwFillAttribute:LongWord;
    dwFlags        :LongWord;
    wShowWindow    :Word;
    cbReserved2    :Word;
    lpReserved2    :LongWord; // Pointer;
    hStdInput      :THandle;
    hStdOutput     :THandle;
    hStdError      :THandle;
  end;
  TStartupInfo = _STARTUPINFOA;

  _PROCESS_INFORMATION = record
    hProcess       :THandle;
    hThread        :THandle;
    dwProcessId    :LongWord;
    dwThreadId     :LongWord;
  end;
  TProcessInformation = _PROCESS_INFORMATION;
  
  _SECURITY_ATTRIBUTES = record
    nLength             :LongWord;
    lpSecurityDescriptor:LongWord; // Pointer;
    bInheritHandle      :LongBool;
  end;
  TSecurityAttributes = _SECURITY_ATTRIBUTES;
  
  
  function RunCaptured(const aDirectory, aExeName, aCmdLine:string):string;
  var
    StartInf    :TStartupInfo; 
    ProcInf     :TProcessInformation; 
    SecAttr     :TSecurityAttributes; 
    TmpSA1      :TSecurityAttributes; 
    TmpName     :string; 
    TmpHndl     :THandle; 
    TmpRslt     :Cardinal;
    ProcCreated :LongBool; 
    TmpSL       :TStrings;
  begin
    Result    := 'FAILURE';
    TmpName   := 'log.txt'; // здесь идет получение имени временного файла. 
    SecAttr.nLength        := SizeOf(SecAttr); 
    SecAttr.bInheritHandle := True; 
    TmpHndl := CreateFile(PChar(TmpName), GENERIC_WRITE, FILE_SHARE_WRITE, SecAttr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
      try
        StartInf.cb          := SizeOf(StartInf); 
        StartInf.hStdOutput  := TmpHndl; 
        StartInf.dwFlags     := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; 
        StartInf.wShowWindow := SW_HIDE;
        ProcCreated          := true;
        ProcCreated := CreateProcess(PChar(aExeName), PChar(aExeName+' '+aCmdLine), TmpSA1, TmpSA1, ProcCreated,0,0,PChar(aDirectory),StartInf,ProcInf);
        if(Integer(ProcCreated) = 1)then 
        begin 
          SetPriorityClass   (ProcInf.hProcess,IDLE_PRIORITY_CLASS); 
          WaitForSingleObject(ProcInf.hProcess,INFINITE); 
          GetExitCodeProcess (ProcInf.hProcess,TmpRslt); 
          CloseHandle(ProcInf.hThread); 
          CloseHandle(ProcInf.hProcess); 
          CloseHandle(TmpHndl);
          TmpSL := TStringList.Create;
          try
            TmpSL.LoadFromFile(TmpName);
            Result := TmpSL.Text;
          finally 
            TmpSL.Free;   
            DeleteFile(PChar(TmpName)); 
          end;
        end 
        else 
          Result := 'Ошибка вызова внешнего приложения';
     finally
      CloseHandle(TmpHndl); 
      DeleteFile(PChar(TmpName)); 
     end; 
  end;  




в любом случае, мы получаем лог работы gbak в виде текста.
в этом тексте мы ищем подстроку "COMMITING, FINISHING AND GOING HOME". ну, или как-то так, посомтрите лог Вашего GBAK.
...
Рейтинг: 0 / 0
15.06.2016, 13:45
    #39256341
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
alex_p_nНу, типа 0 - успешно, не 0 - неуспешноВсё так и есть! 0 - успешно, 1 - с ошибкой, детализация ошибки падает в firebird.log
...
Рейтинг: 0 / 0
15.06.2016, 13:50
    #39256342
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
rdb_devalex_p_nНу, типа 0 - успешно, не 0 - неуспешноВсё так и есть! 0 - успешно, 1 - с ошибкой, детализация ошибки падает в firebird.log

да ладно!
а если сервер находится где-то в "кукурудзяндии" и backup делается удалённо через ServiceAPI ? =)
...
Рейтинг: 0 / 0
15.06.2016, 13:55
    #39256346
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
alex_p_n, по воводу автоматизации r/b кто-то замутил на хабре статью: https://habrahabr.ru/post/158575/
Есть еще ключик -VERIFY, который заставляет сплёвывать информацию о текущем действии gbak и позволяет неленивому замутить анализ вывода gbak внутри скрипта командной оболочки.
...
Рейтинг: 0 / 0
15.06.2016, 14:00
    #39256349
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
Hello, Rdb Dev!
You wrote on 15 июня 2016 г. 14:00:08:

Rdb Dev> по воводу автоматизации r/b кто-то замутил на хабре статью...
взрослые люди по хабрам не шастают!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.06.2016, 14:08
    #39256357
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
Мимопроходящийвзрослые люди по хабрам не шастают!
Я не гордый и без понтов, мне можно.
...
Рейтинг: 0 / 0
15.06.2016, 14:40
    #39256377
alex_p_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
Всем спасибо за ответы
Пошёл инфу пережёвывать :)
...
Рейтинг: 0 / 0
15.06.2016, 14:42
    #39256379
alex_p_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
PEAKTOP,
А твой код под Ембаркадеро 2010 будет работать?
...
Рейтинг: 0 / 0
15.06.2016, 14:47
    #39256385
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
rdb_devдетализация ошибки падает в firebird.log
gbak никогда не пишет в firebird.log. Он либо выводит на экран, либо в файл -y filename.
...
Рейтинг: 0 / 0
15.06.2016, 14:49
    #39256387
alex_p_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
kdvrdb_devдетализация ошибки падает в firebird.log
gbak никогда не пишет в firebird.log. Он либо выводит на экран, либо в файл -y filename.
Не-не, таки пишет. Я проверял вчера.
И gbak, и gfix
...
Рейтинг: 0 / 0
15.06.2016, 15:02
    #39256404
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
alex_p_nНе-не, таки пишет. Я проверял вчера.
что проверял? gfix - пишет в firebird.log. gbak - нет. Не путай.
...
Рейтинг: 0 / 0
15.06.2016, 15:11
    #39256410
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
alex_p_nА твой код под Ембаркадеро 2010 будет работать?

конечно НЕТ!
читать про уникод.
...
Рейтинг: 0 / 0
15.06.2016, 15:13
    #39256413
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
kdvgbak никогда не пишет в firebird.log Так написано у Хелен.
...
Рейтинг: 0 / 0
15.06.2016, 15:35
    #39256425
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
rdb_devТак написано у Хелен.
где именно написано?

Глава 39,
Возвращаемые коды и ответная реакция
" Копирование базы данных, выполняемое под Windows, возвращает код 0 при успешном завершении и 1 при ошибках. Если встретилась ошибка, посмотрите файл firebird.log. "

Вот это, что-ли?

- в firebird.log пишет только сервер. Валидация gfix-ом, собственно, выполняется тоже сервером.
- gbak - это простая программа, которой firebird.log по барабану
- gbak может находиться на другом компе. В какой еще firebird.log он будет что писать?
- у Хелен сказано - "при ошибках". Она имела в виду повреждения БД, о которых при чтении данных СЕРВЕР сообщит в firebird.log.
При этом никакой вывод ошибок gbak не будет записан в firebird.log, даже если бэкап-рестор вызывается через services api.

p.s. нашли кому лапшу вешать :-)
...
Рейтинг: 0 / 0
15.06.2016, 15:37
    #39256428
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
kdv- в firebird.log пишет только сервер.И клиент
...
Рейтинг: 0 / 0
15.06.2016, 15:40
    #39256432
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос по gbak
Hello, Hvlad!
You wrote on 15 июня 2016 г. 15:39:58:

Hvlad> И клиенту себя

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Ещё вопрос по gbak / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]