Daily Archiv: Tuesday - 06 November 2012

Membuat sendiri aplikasi Online Dump menggunakan Delphi

Online Dump atau Incremental backup merupakan salah satu variant backup dalam Interbase.

Yang membedakan dengan backup biasa adalah, pada Online Dump backupnya bisa nyambung tidak selalu dimulai dari awal, ini sangat berguna untuk data yang besar tapi harus sering backup.

Selain bisa nyambung hasil dari Online Dump bisa langsung dipakai hanya dengan merubah attributnya, tanpa harus ada proses restore yang memakan waktu lama.

Sebenarnya Interbase sudah menyediakan tool untuk melakukan Online Backup ini yaitu dengan commandline

gbak.exe -d 127.0.0.1:DATA_AKTIF d:\backupdata_aktif.dump -user SYSDBA -pass masterkey

Pada Delphi kita bisa langsung memanggil commandline diatas menggunakan WinExec, ShellExecute atau Create prosess.

Namun yang kita bahas kali ini adalah menjalankan Online menggunakan Interbase API, menggunakan Delphi tanpa bantuan VCL apapun.

Sebenarnya fitur ini sudah include di VCL IBExpress versi 10.11 keatas (VCL bawaan delphi yang dibundling dengan Interbase 2007),  tapi gpplah itung belajar.

Dengan menggunakan API hasilnya akan lebih “bersih” karena user/password bisa diencrypt, tidak seperti menjalankan commandline yang parameternya masih bisa “di-intip” menggunakan software sejenis Proccess Explorer.

Untuk melakukan  Online dump kita menggunakan fungsi  isc_attach_database yang ada di library gds32.dll.

Dalam melakukan pemanggilan Interbase API, sebelumnya kita perlu mengirimkan parameter dalam format block, dikirim berurutan dalam bentuk character/string.

Untuk Online Dump, parameter block yang dikirim sbb:

     
#01 1/isc_dpb_version1 sebagai tanda awal parameter block
#1C 28/isc_dpb_user_name sebagai tanda akan mengirim user
#06 6 adalah panjang user
'sysdba' nama user
#1D 29/isc_dpb_password sebagai tanda akan mengirim password
#09 9 adalah panjang password
'masterkey' ini passwordnya
#21 33/isc_dpb_online_dump proses yang akan dikerjakan
#01 panjang perintah = 1
#01 (1) nilainya selalu 1
#36 54/isc_dpb_overwrite disambung/ditindih
#01 panjang perintah = 1
#00 (0) diisi 0 untuk menyambung atau 1 untuk menindih
#24 36/isc_dpb_old_file_name sebagai tanda akan mengirim nama file tujuan backup
#0E 14 panjang nama file
'c:barang.dump' ini nama filenya
#22 34/isc_dpb_old_file_size jumlah filenya
#01 panjang perintah = 1
#01 diisi 1

Untuk lebih jelasnya dapat dilihat pada contoh coding berikut

program VsrOnLineDump;
uses
    Windows;

const
     ISC_SPB_CURRENT_VERSION    = #2;
     ISC_SPB_VERSION            = #2;
     ISC_SPB_USER_NAME          = #28;
     ISC_SPB_PASSWORD           = #29;

     ISC_DPB_VERSION1           = #1;
     ISC_DPB_USER_NAME          = ISC_SPB_USER_NAME;
     ISC_DPB_PASSWORD           = ISC_SPB_PASSWORD;

     ISC_DPB_ONLINE_DUMP        = #33;
     ISC_DPB_OLD_FILE_SIZE      = #34;
     ISC_DPB_OLD_FILE_NAME      = #36;
     ISC_DPB_OVERWRITE          = #54;

     DLL                        = 'gds32.dll';

type
    ISC_HANDLE          = HWND;
    TISC_DB_HANDLE      = ^ISC_HANDLE;
    ISC_STATUS          = Longint;
    PISC_STATUS         = ^ISC_STATUS;
    PISC_DB_HANDLE      = ^TISC_DB_HANDLE;

var
   FDPB: string;
   FDBHandle: TISC_DB_HANDLE;
   FStatus: PISC_STATUS;
   FDBName, FTargetDB, FUser, FPass: string;
   bOverwrite: Boolean;

function AddDPB(cKey: char; sItem: string): Integer;
begin
     if sItem='' then
        FDPB:=FDPB+cKey
     else
         FDPB:=FDPB+cKey+chr(Length(sItem))+sItem;
     Result:=Length(FDPB);
end;

function isc_attach_database(status_vector:PISC_STATUS;
         db_name_length:Short;
         db_name:PChar;
         db_handle:PISC_DB_HANDLE;
         parm_buffer_length: Short;
         parm_buffer:PChar):ISC_STATUS;
         stdcall;external DLL;

begin
     FDBName:='127.0.0.1:DATA_AKTIF';
     FTargetDB:='d:\backupdata_aktif.dump';
     FUser:='SYSDBA';
     FPass:='masterkey';
     bOverwrite:=False;
     FDPB:=ISC_DPB_VERSION1;
     AddDPB(ISC_DPB_USER_NAME,FUser);
     AddDPB(ISC_DPB_PASSWORD,FPass);
     FDBHandle:=nil;
     AddDPB(ISC_DPB_ONLINE_DUMP,#1);
     AddDPB(ISC_DPB_OVERWRITE,chr(Byte(bOverwrite)));
     AddDPB(ISC_DPB_OLD_FILE_NAME,FTargetDB);
     AddDPB(ISC_DPB_OLD_FILE_SIZE,#1);
     if isc_attach_database(@FStatus,
        0,PChar(FDBName), @FDBHandle,
        Length(FDPB),PChar(FDPB))=0 then
        // MessageBox jika diperlukan
        ;
end.

Dengan membuat coding sendiri menggunakan delphi kita dapat dengan leluasa mengatur jadwal Online Dump, misalnya kita buat per 10 menit, per 30 menit, dibuat perhari dibackup dengan tujuan beda-beda (ada 7 file tujuan sesuai dengan jumlah hari).

Selain itu dengan membuat coding sendiri akan sedikit lebih keren dan punya nilai sendri dimata pengguna (klien).