Delphi Can
Uygulama içinde FB DB bakımı - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: Uygulama içinde FB DB bakımı (/showthread.php?tid=5176)



Uygulama içinde FB DB bakımı - mcuyan - 14-08-2020

Merhaba arkadaşlar.

FB veritabanını normalde gfix uygulaması ile bakım yaptırtıyorum. Fakat bu bazen kilitlenmelere neden oluyor. (Exe içinde shellexecute ile kod çalıştırıyorum 

ShellExecute(0, nil, 'cmd.exe', PWideChar('/C ' + 'gfix -validate db\2013.snc -user sysdba -password masterkey'), nil, SW_NORMAL); 
). 

ve bir işlem bitmeden diğerine geçtiği için bazen sıkıntılar yaşıyorum DB lock gibi.

Örneğin DB yedeğini almak için delphi uygulamam içinde TFDBackup componentini kullanıyorum.

(bu arada FDBackup component kullanımınıda vermiş olayım bilmeyenler için

    FDPhysFBDriverLink1.DriverID := 'FB';
    FDPhysFBDriverLink1.VendorLib := getcurrentdir() + '\fbclient.dll';
    Backup.UserName := 'SYSDBA';
    Backup.Password := 'masterkey';
    Backup.Database := adres + 'db.fdb';
    Backup.Verbose := True;
    Backup.Host := 'localhost';
    Backup.BackupFiles.Clear;

    Backup.BackupFiles.Add(adres + gun_ay_yil + '.fbk');
    Backup.Backup;
    TRY
      zipFile(adres + gun_ay_yil + '.zip', adres + gun_ay_yil + '.fbk');
      FINALLY DeleteFile(adres + gun_ay_yil + '.fbk');

    END;
    Showmessage('Oto yedek alma işlemi (HDD) başarıyla tamamlandı..');

)

Sorum şu: 
Uygulama içinde backup alma gibi db bakımı (sweep, validate, kill vs) yapan bir component var mıdır?


Cvp: Uygulama içinde FB DB bakımı - Tuğrul HELVACI - 14-08-2020

ShellExecute API'si yerine ShellExecuteEx API'sini kullanabilirsiniz. Bu sayede SHELLEXECUTEINFO yapısı içindeki hProcess üyesini; WaitForSingleObject API'si ile kullanabilir ve ShellExecuteEx ile çalıştırdığınız uygulamanın bitmesini bekleyebilirsiniz.


Uygulama içinde FB DB bakımı - uparlayan - 14-08-2020

Yakın zamanda benim de benzer bir fonksiyona ihtiyacım olmuştu, şöyle bir şey işinize yarayabilir.

unit OrtakUnit_;

interface

/// <summary>
///  Temelde Konsol uygulamalarını "Parametreleriyle birlikte" çalıştırılabilmesini VE o prosesin bitmesini veya sonlanmasını bekleyebilir. Bekleme anlamında ShellExecute'nin biraz daha gelişmişidir.
/// </summary>
/// <remarks>
///  Hata kodlarının anlamları için şurayı inceleyin; 
///  <seealso>https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes</seealso>
/// </remarks>
/// <remarks>
///  API döküğmantasyonu için şuraya bakın; 
///  <seealso>https://docs.microsoft.com/tr-tr/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa?redirectedfrom=MSDN</seealso>
/// </remarks>
function ShellWait(const aTamUygulamaYolu, aParametreler: string; aKlasor: string; aSonlandirilanaKadarBekle, aBostaKalanaKadarBekle, aMinimumdaCalis: boolean; var aHataKodu: integer): boolean;

implementation

uses
    Winapi.Windows
  , System.SysUtils
  , Vcl.Forms
  ;

function ShellWait(const aTamUygulamaYolu, aParametreler: string; aKlasor: string; aSonlandirilanaKadarBekle, aBostaKalanaKadarBekle, aMinimumdaCalis: boolean; var aHataKodu: integer): boolean;
var
  S: String;
  SI: TStartupInfo;
  PI: TProcessInformation;
  CalismaKlasoru: PChar;
begin
  aHataKodu := NO_ERROR;
  Result := True;
  if (FileExists( aTamUygulamaYolu, True) = False) then begin
      aHataKodu := ERROR_FILE_NOT_FOUND;
      Exit(False);
  end;
  S := String('"' + aTamUygulamaYolu + '" ' + aParametreler).Trim;
  
  ZeroMemory(@SI, SizeOf(SI));
  SI.cb := SizeOf(SI);
  if (aMinimumdaCalis = True) then begin
      SI.dwFlags     := STARTF_USESHOWWINDOW;
      SI.wShowWindow := SW_SHOWMINIMIZED;
  end;
  if (aKlasor = '')  then aKlasor := ExcludeTrailingPathDelimiter(ExtractFilePath(aTamUygulamaYolu));
  if (aKlasor <> '') then CalismaKlasoru := PChar(aKlasor) else CalismaKlasoru := nil;
  if (CreateProcess(nil, PChar(S), nil, nil, False, 0, nil, CalismaKlasoru, SI, PI) = FALSE) then begin
      aHataKodu := GetLastError;
      exit(False);
  end;

  CloseHandle(PI.hThread);
  if (aBostaKalanaKadarBekle    = True) then WaitForInputIdle(PI.hProcess, INFINITE);
  if (aSonlandirilanaKadarBekle = True) then
      repeat 
        Application.ProcessMessages;
      until  
        MsgWaitForMultipleObjects(1, PI.hProcess, False, INFINITE, QS_ALLINPUT) <> WAIT_OBJECT_0 + 1;
  CloseHandle(PI.hProcess);
end;

end.



Uygulama içinde FB DB bakımı - mcuyan - 14-08-2020

Müthiş 2 yöntem. çok teşekkürler.