Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы с программным backup/restore Firebird


Андрей Жук ©   (2005-09-12 12:02:00) 

Используются IBX. Но бэкап/рестор в FIB аналогичен.

Процедура создания бэкапа
procedure TFormMain.DoBackup(FileName: TFileName; AlertOnExit: boolean = true);
var
 USER_NAME, PASSWORD: string;
begin
 USER_NAME := DataModuleMain.DBMain.Params.Values['user_name'];
 PASSWORD := DataModuleMain.DBMain.Params.Values['password'];
 with DataModuleMain.IBBackup do
 begin
   DatabaseName := DataModuleMain.DBMain.DatabaseName;
   Params.Clear;
   Params.Add('user_name=' + USER_NAME);
   Params.Add('password=' + PASSWORD);
   BackupFile.Clear;
   BackupFile.Add(FileName);
   Attach;
   ServiceStart;
   Detach;
   if AlertOnExit then
     InformationMsg('Базу збережено', 'Файл збережено в ' + FileName);
 end;
end;


Процедура восстановления базы
function TFormMain.DoRestore(FileName: TFileName; DBName: string; ReplaceCurrent: boolean; AlertOnExit: boolean = true): string;
var
 USER_NAME, PASSWORD: string;
begin
 USER_NAME := DataModuleMain.DBMain.Params.Values['user_name'];
 PASSWORD := DataModuleMain.DBMain.Params.Values['password'];
 with DataModuleMain.IBRestore do
 begin
   if ReplaceCurrent then
   begin
     DataModuleMain.DBMain.Connected := false;
     Options := Options + [Replace] - [CreateNewDB];
   end
   else
     Options := Options - [Replace] + [CreateNewDB];
   DatabaseName.Clear;
   DatabaseName.Add(DBName + '=2048');
   Params.Clear;
   Params.Add('user_name=' + USER_NAME);
   Params.Add('password=' + PASSWORD);

   BackupFile.Clear;
   BackupFile.Add(FileName);
   Attach;
   ServiceStart;
   while not Eof do
   begin
     Logging('Information', GetNextLine);
     Next;
   end;
   Detach;
   Result := DBName;
   if AlertOnExit then
     InformationMsg('Базу відновлено', 'Файл збережено в ' + DBName);
   if ReplaceCurrent then
     DataModuleMain.DBMain.Connected := true;
 end;
end;


Вызов в программе (сначала backup, потом restore - делаем новую базу для записи на флешку)

procedure TFormMain.ToolButtonRestoreFlashClick(Sender: TObject);
var
 FName, FRName: TFileName;
 TempPath, SavePointName: string;
 R: Cardinal;
 procedure MakeChanges(str: string);
 begin
   with DataModuleMain.IBSQL do
   begin
     SQL.Clear;
     SQL.Add(str);
     ExecQuery;
     Transaction.Commit;
     Transaction.Active := true;
   end;
 end;
begin
 R := GetTempPath(0, nil);
 SetLength(TempPath, R);
 GetTempPath(R, PChar(TempPath));
 FName := ExtractFilePath(TempPath) + FormatDateTime('ddmmhhnn', now) + '.fbk';
 FRName := ExtractFilePath(TempPath) + FormatDateTime('ddmmhhnn', now) + '.fdb';
 if InputQuery('Введіть назву точки збереження', 'Savepoint', SavePointName) then
 begin
   MakeChanges(Format('EXECUTE  PROCEDURE APP_SAVEPOINTS_IU (''%s'',''Y'')', [SavePointName]));
   MakeChanges('SELECT gen_id(GEN_FILIAL_COUNTER,1) from rdb$database');
   DoBackup(FName, false);
   MakeChanges(Format('UPDATE APP_SAVEPOINTS SET IS_ACTIVE=''N'' WHERE SAVEPOINT_NAME=''%s''', [SavePointName]));
 end;

 if FileExists(FName) then
   DoRestore(FName, FRName, false, false);
end;


И вот на восстановлении получаем
cannot open backup file C:\DOCUME~1\zhouck\LOCALS~1\Temp\12091056.fbk.
Хотя такой файл есть. Вероятно, файл еще занят процедурой создания бэкапа.
Что порекомендуете сделать?


Desdechado   (2005-09-12 12:25:00) [1]

НЕ используй локальный коннект
он глюкавый


Андрей Жук   (2005-09-12 12:11:00) [2]

Странно...
Поставил Application.ProcessMessages; в цикл получения инфы о бэкапе/ресторе - ошибки (пока) исчезли...


Андрей Жук   (2005-09-12 12:07:00) [3]

Да, еще.
Если в процедуру создания бэкапа добавить

  begin
    Logging('Information', GetNextLine);
    Next;
  end


То иногда (непостоянно)получаю ошибку "обрыв связи" (это на локальном коннекте).


Наверх

Титульная страница Поиск, карта сайта Написать письмо