Примерно так:
function TBaseDM.ExecuteDBOptimize(BackupDBFileSpec: String;
RemoveBackupDBFile: Boolean;
DoRestore: Boolean): Boolean;
var
RestoredDBFileSpec: String;
DBFileSizeBefore, DBFileSizeAfter: Cardinal;
begin
// TODO зарезервировать объем на диске для операции
DBFileSizeBefore := GetFileSize(DBFileSpec);
if BackupDBFileSpec = '' then
BackupDBFileSpec := DBFileSpec + '.backup.tmp';
RestoredDBFileSpec := DBFileSpec + '.restored.tmp';
IBDatabase.Connected := False;
FibBackupService.DatabaseName := DBFileSpec;
FibBackupService.Params.Values['password'] := GetPassword;
FibBackupService.BackupFile.Clear;
FibBackupService.BackupFile.Add(BackupDBFileSpec);
CheckDeleteFile(FibBackupService.BackupFile[0]);
LogMsg(Format('Backup database "%s" (%d bytes) to "%s" . . .',
[FibBackupService.DatabaseName, DBFileSizeBefore, FibBackupService.BackupFile[0]]));
FibBackupService.Active := True;
try
FibBackupService.ServiceStart;
while not FibBackupService.Eof do
begin
if not ProgressJob(JobId, [pnPercent], pkValueIncrement, 1, '') then
begin
FAborted := True;
Break;
end;
LogMsg(FibBackupService.GetNextLine);
end;
finally
FibBackupService.Active := False;
end;
if DoRestore and (not FAborted) then
begin
FibRestoreService.DatabaseName.Clear;
FibRestoreService.DatabaseName.Add(RestoredDBFileS pec);
FibRestoreService.Params.Values['password'] := GetPassword;
FibRestoreService.BackupFile.Clear;
FibRestoreService.BackupFile.Add(BackupDBFileSpec) ;
LogMsg(Format('Restore database "%s" from "%s" . . .',
[FibRestoreService.DatabaseName[0], FibRestoreService.BackupFile[0]]));
FibRestoreService.Active := True;
try
FibRestoreService.ServiceStart;
while not FibRestoreService.Eof do
begin
if not ProgressJob(JobId, [pnPercent], pkValueIncrement, 1, '') then
begin
FAborted := True;
Break;
end;
LogMsg(FibRestoreService.GetNextLine);
end;
finally
FibRestoreService.Active := False;
end;
if not FAborted then
begin
LogMsg(Format('Move "%s" to "%s" . . .', [RestoredDBFileSpec, DBFileSpec]));
CheckMoveFile(RestoredDBFileSpec, DBFileSpec);
DBFileSizeAfter := GetFileSize(DBFileSpec);
LogMsg(Format('INFO: Database size before optimization - %d bytes, after - %d bytes', [DBFileSizeBefore, DBFileSizeAfter]));
ProgressJob(JobId, [pnPercent], pkValueIncrement, 10, '');
if RemoveBackupDBFile then
begin
LogMsg(Format('Deleting file "%s" . . .', [BackupDBFileSpec]));
CheckDeleteFile(BackupDBFileSpec);
end;
LogMsg(Format('Deleting file "%s" . . .', [RestoredDBFileSpec]));
CheckDeleteFile(RestoredDBFileSpec);
end;
end; //if DoRestore and (not FAborted) then
if FAborted then
EndJob(JobId, lmOk, 'Оптимизация прервана')
else
begin
EndJob(JobId, lmOk, 'Оптимизация успешно завершена');
end;
Result := not FAborted;
end;
Добавлено через 1 минуту
Ээ, нехороршо форматирование кода поубирало...
