Arsip: Kompresi dan Enkripsi BLOB Field

 
user image
more 20 years ago

kifmesoft

Dear All saya memiliki Tabel tersendiri dengan field BLOB/MEMO yang digunakan untuk menyimpan source code. dan sesudah saya membaca artike tentang 'Enkripsi Data String dan Stream' http://www.delphi-id.com/dpr/Article33.pas saya jadi ingin menggunakannya untuk tipe BLOB seperti MEMO pada Database Server, sekaligus jg di Kompress dg Unit ZLIB, supaya data2 di MEMO menjadi kecil & proses Query (Client & Sever) menjadi cepat.. tapi gimana ya trik menerapkannya... yg sederhana, efektif, dan mudah.. :D
user image
more 20 years ago

delphy

sebelum data dimasukkan ke tabel, enkripsi dulu, baru di post. sedangkan untuk menampilkan, taruh ke variabel dulu, dekripsi, baru view post ke tabel: objek/komponen/memo --> enkripsi ke variabel ---> field menampilkan ke form: field --> dekripsi ke variabel ---> objek/komponen/memo memang dua langkah kerja, tp begitulah cara kami di KIOSS ;)
user image
more 20 years ago

kifmesoft

menurutku langkahnya memang spt ini:
post ke tabel: objek/komponen/memo --> enkripsi ke variabel ---> field menampilkan ke form: field --> dekripsi ke variabel ---> objek/komponen/memo
masalahnya kan karena kita kemudian jadi sulit untuk menggunakan Data Controls spt DBMemo dan DBImage. belum lagi kalo kita mau mencetak di QuickReport ya... rekan2 di KIOSS pastilah punya trik yg jitu.. btw, saya coba googling untuk cari komponen / sample source tapi blm nemu.. jadi ya.. skrg saya sdg bereksperimen ria agar Kompresi & Enkripsi BLOB Field tetap dapat menggunakan komponen standard spt DBMemo, DBImage, QRDBImage dll... :?
user image
more 20 years ago

delphy

buat komponen turunan dari "DBMemo" dan atau "DBImage" didalamnya mendefinisikan alur kerja spt yang sy tulis di thread sebelumnya. dan sy pribadi -hampir dikatakan- tidak pernah menggunakan db-control secara langsung, kecuali DBGrid, dan malah sekarang sy sudah tidak lagi memakai komponen standar delphi. pengambilan dan penulisan data ke dalam database sy lakukan secara manual didalam koding. memang kemudian ribet, tapi itu yang sy rasa menyenangkan buat saya. tapi mau gimana yaa.. ini sudah jadi standar koding di KIOSS ;) sy juga ngikut ajah.. heheheheh ....
user image
more 20 years ago

kifmesoft

pas muncul saran dari mas delphy untuk menurunkan "DBMemo" dan "DBImage", saya mencoba untuk melihat source code milik delphi... trus.. sy melihat-lihat jg ke "TTable" dan "TQuery" sehingga muncul ide untuk melakukan "Override" method "CreateBlobStream", skrg sedang sy coba... :) btw, memang mengasikkan melakukan manual koding.. sy jg merasakannya... ;)
user image
more 20 years ago

delphy

xixixixxixi......... sip sip siiipp...... met sukses yahh...
user image
more 20 years ago

kifmesoft

hmm........ akhirnya..... thanks to Mr. Delphy Kesimpulan saya adalah sbb: Dengan Menurunkan Turunan kelas TDataSet (misal: "TTable" dan "TQuery") dan melakukan "Override" terhadap method "CreateBlobStream", dan penambahan method parameter untuk syntax SQL, maka pemakaian "Kompresi & Enkripsi" pada BLOB Field menjadi lebih mudah... ;) Rekan-rekan yg membaca thread ini... Cobalah Skrip Code dibawah ini, dan ikutilah langkah-langkah yag terdapat (ditulis) sesudah Skrip Code untuk melihat hasilnya dan jangan lupa kasih komentarnya yaa.....

{              }
{    Nama Komponen : TkifZEDQuery dan TkifZEDTable       }
{              }
{    Pemrogram     : kifmesoft. ([email protected])    }
{    Tanggal [Jam] : 04 April 2005 [08:35:00]            }
{    Basis Program : Borland Delphi 5 (Build 5.62)       }
{              }
{    Keterangan    : Kompresi & Enkripsi BLOB Field      }
{              }
Unit kifZEDDataSet;
Interface
Uses
  Classes, Db, DBTables;
Type
  TkifZEDTable = Class(TTable)
  Private
    FZEDBlobFields: String;
  Public
    Function CreateBlobStream(Field: TField;
               Mode: TBlobStreamMode): TStream; Override;
  Published
    //  kriteria Field yg diproses oleh CreateBlobStream...
    Property ZEDBlobFields: String Read FZEDBlobFields
                                   Write FZEDBlobFields;
  End;
  TkifZEDQuery = Class(TQuery)
  Private
    FZEDBlobFields: String;
  Public
    Function CreateBlobStream(Field: TField;
               Mode: TBlobStreamMode): TStream; Override;
    Procedure ParamZEDFromData(const ParamName: String;
                               Buffer: Pointer; Size: Integer);
    Procedure ParamZEDFromStream(const ParamName: String;
                                 Stream: TStream);
    Procedure ParamZEDFromFile(const ParamName, FileName: String);
  Published
    //  kriteria Field yg diproses oleh CreateBlobStream...
    Property ZEDBlobFields: String Read FZEDBlobFields
                                   Write FZEDBlobFields;
  End;
Procedure Register;
Implementation
Uses EnDeCode, SysUtils, ZLib;
Const
  ukuran_ZLibBuffer = 1024;
Type
  TkifZEDBlobStream = Class(TMemoryStream)
  Private
    FZLibBuffer: Array[0..ukuran_ZLibBuffer - 1] Of Byte;
    FBlobStream: TStream;
    FOpened: Boolean;
    FModified: Boolean;
  Public
    Constructor Create(BlobStream: TStream; Mode: TBlobStreamMode);
    Destructor Destroy; Override;
    Function   Write(const Buffer; Count: Longint): Longint; Override;
    Procedure  Truncate;
  End;
Const
  pengenal: String = '{   kifmesoft BLOB Stream  }'#13#10;
Function FieldDiinginkan(DataSet:TDataSet;
                  const kriteria: String; Field: TField): Boolean;
Var
  l: TList;
  i: Integer;
Begin
  Result:= False;
  l:= TList.Create;
  DataSet.GetFieldList(l, kriteria);
  If l.Count > 0 Then
    For i:= 0 To l.Count - 1 Do
      If UpperCase(TField(l[i]).FieldName) =
         UpperCase(Field.FieldName) Then
      Begin
        Result:= True;
        Break;
      End;
  l.Free;
End;
{  TkifZEDTable  }
function TkifZEDTable.CreateBlobStream(Field: TField;
                          Mode: TBlobStreamMode): TStream;
Begin
  If (ZEDBlobFields <> '') And
     FieldDiinginkan(Self, ZEDBlobFields, Field) Then
    Result:= TkifZEDBlobStream.Create(
               Inherited CreateBlobStream(Field, Mode), Mode)
  Else Result:= Inherited CreateBlobStream(Field, Mode);
End;
{  TkifZEDQuery  }
function TkifZEDQuery.CreateBlobStream(Field: TField;
                          Mode: TBlobStreamMode): TStream;
Begin
  If (ZEDBlobFields <> '') And
     FieldDiinginkan(Self, ZEDBlobFields, Field) Then
    Result:= TkifZEDBlobStream.Create(
               Inherited CreateBlobStream(Field, Mode), Mode)
  Else Result:= Inherited CreateBlobStream(Field, Mode);
End;
Procedure TkifZEDQuery.ParamZEDFromData(const ParamName: String;
                              Buffer: Pointer; Size: Integer);
Var
  param: TParam;
  mi, mo: TMemoryStream;
Begin
  param:= Params.FindParam(ParamName);
  If param = Nil Then Exit;
  mi:= TMemoryStream.Create;
  mo:= TMemoryStream.Create;
  //  atur buffer...
  mo.Size:= Size;
  //  masukkan Buffer...
  System.Move(Buffer^, mo.Memory^, Size);
  //  Memadatkan dengan Unit ZLib...
  With TCompressionStream.Create(clMax, mi) Do
  Begin
    CopyFrom(mo, 0);
    Free;
  End;
  //  masukkan pengenal...
  mo.Clear;
  mo.Write(pengenal[1], Length(pengenal));
  mi.Seek(0, soFromBeginning);
  //  enkripsi...
  EncodeStream(mi, mo);
  mo.Seek(0, soFromBeginning);
  // masukkan parameter...
  param.LoadFromStream(mo, ftBlob);
  mo.Free;
  mi.Free;
End;
Procedure TkifZEDQuery.ParamZEDFromStream(const ParamName: String;
                                          Stream: TStream);
Var
  s: String;
Begin
  SetLength(s, Stream.Size);
  Stream.Read(s[1], Stream.Size);
  ParamZEDFromData(ParamName, @s[1], Length(s));
End;
Procedure TkifZEDQuery.ParamZEDFromFile(const ParamName,
                                              FileName: String);
Var
  param: TParam;
  Stream: TStream;
Begin
  param:= Params.FindParam(ParamName);
  If param = Nil Then Exit;
  Stream := TFileStream.Create(FileName,
                          fmOpenRead Or fmShareDenyWrite);
  Try
    ParamZEDFromStream(ParamName, Stream);
  Finally
    Stream.Free;
  End;
End;
{  TkifZEDBlobStream  }
Constructor TkifZEDBlobStream.Create(BlobStream: TStream;
                                     Mode: TBlobStreamMode);
Var
  pengenal_stream: String;
  temp_stream: TMemoryStream;
  cacah: Longint;
Begin
  If Not Assigned(BlobStream) Then Exit;
  FBlobStream:= BlobStream;
  FModified:= Mode = bmWrite;
  If Not FModified Then
  Begin
    If FBlobStream.Size >= Length(pengenal) Then
    Begin
      SetLength(pengenal_stream, Length(pengenal));
      //  Membaca pengenal Stream...
      FBlobStream.Read(pengenal_stream[1], Length(pengenal));
      If pengenal = pengenal_stream Then
      Begin
        temp_stream:= TMemoryStream.Create;
        //  Mengembalikan Penyandian Stream...
        DecodeStream(FBlobStream, temp_stream);
        temp_stream.Seek(0, soFromBeginning);
        //   Mekarkan dengan Unit ZLib...
        With TDecompressionStream.Create(temp_stream) Do
        Begin
          While True Do
          Begin
            cacah:= Read(FZLibBuffer, ukuran_ZLibBuffer);
            If cacah <> 0 Then
              Self.WriteBuffer(FZLibBuffer, cacah)
            Else Break;
          End;
          Free;
        End;
        temp_stream.Free;
      End
      Else Self.CopyFrom(FBlobStream, 0);
    End
    Else Self.CopyFrom(FBlobStream, 0);
    //  Set ke awal Stream...
    Seek(0, soFromBeginning);
  End;
  //  kifZEDBlobStream Ready..
  FOpened:= True;
End;
Destructor TkifZEDBlobStream.Destroy;
Var
  temp_stream: TMemoryStream;
Begin
  If FModified And Assigned(FBlobStream) then
  Begin
    temp_stream:= TMemoryStream.Create;
    //  Memadatkan dengan Unit ZLib...
    With TCompressionStream.Create(clMax, temp_stream) Do
    Begin
      CopyFrom(Self, 0);
      Free;
    End;
    temp_stream.Seek(0, soFromBeginning);
    FBlobStream.Size:= 0;
    //  Mencatat pengenal Stream...
    FBlobStream.Write(pengenal[1], Length(pengenal));
    //  Menyandikan Stream...
    EncodeStream(temp_stream, FBlobStream);
    temp_stream.Free;
  End;
  //  * Membebaskan BlobStream asli...
  If Assigned(FBlobStream) Then FBlobStream.Free;
  Inherited Destroy;
End;
Function TkifZEDBlobStream.Write(const Buffer; Count: Longint): Longint;
Begin
  Result:= Inherited Write(Buffer, Count);
  If FOpened And (Not FModified) Then
    FModified:= Result > 0;
End;
Procedure TkifZEDBlobStream.Truncate;
Begin
  Size:= Position;
  FModified:= True;
End;
Procedure Register;
Begin
  RegisterComponents('Data Access', [TkifZEDQuery, TkifZEDTable]);
End;
End.
Berikut ini adalah contoh penggunaannya, dan pada contoh ini BLOB Field yang kita proses adalah bertipe "MEMO" Contoh Langkah penggunaan : 1. Buatlah tabel contoh yang setidaknya memilik sebuah BLOB Field --> misal bernama: "memoku" 2. Instal Skrip: Menu "Component" --> "Install Component" 3. Buat program baru.. 4. Ambilah komponen TkifZEDTable yang sudah terinstal, dan gunakanlah seperti kita menggunakan "TTable" 5. Isikan property "ZEDBlobFields" dengan "memoku" 6. Jalankan program, isikan data untuk field "memoku" Misal:

kifZEDTable1.Append;
DBMemo1.Lines.LoadFromFile('c:\dataku.txt');
kifZEDTable1.Post;
7. Amati Hasilnya... 8. Gunakanlah DBManager.. Amati Hasilnya.. Selamat Mencoba..!! Silakan Posting komentarnya.. kifmesoft
user image
more 20 years ago

adludin

sipppp, tak coba deh...!!! :)
user image
more 20 years ago

adludin

Sudah saya coba dan OK, sudah saya buatkan juga dalam bentuk komponen package untuk delphi 5 dan 6 termasuk contoh programnya.. Screenshot contoh aplikasi : Sudah saya post-kan di bagian download area.. http://delphi-id.com/dpr/Downloads-index-req-viewdownloaddetails-lid-64.pas Mudah-mudahan bisa menjadikan manfaat bagi teman-teman semua.. Trims buat kifmesoft dan delphy atas ide dan masukannya..
user image
more 20 years ago

kifmesoft

siiipppp... eko dech.. jika sempat.. terapin juga untuk ZEOS dan IBX.. trus.. jika ada tambahan, japri lagi dech agar bisa ku ikuti perkembangannya... again.. TenQyu yahh... :)
more ...
  • Pages:
  • 1
Share to

AI Forward

🚀 We're thrilled to partner with Alibaba Cloud for "AI Forward - Alibaba Cloud Global Developer Summit 2025" in Jakarta! Join us and explore the future of AI. Register now: https://int.alibabacloud.com/m/1000400772/
#AlibabaCloud #DeveloperSummit #Jakarta #AIFORWARD

Random Topic

Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com