Arsip: Kompresi dan Enkripsi BLOB Field
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
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 ;)
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/memomasalahnya 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... :?
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 ....
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... ;)
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
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..
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..
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
reply |
Report Obsolete
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
Last Articles
Last Topic
- PascalTalk #6: (Podcast) Kuliah IT di luar negeri, susah gak sih?
by LuriDarmawan in Tutorial & Community Project more 5 years ago - PascalTalk #5: UX: Research, Design and Engineer
by LuriDarmawan in Tutorial & Community Project more 5 years ago - PascalTalk #4: Obrolan Ringan Seputar IT
by LuriDarmawan in Tutorial & Community Project more 5 years ago - PascalTalk #2: Membuat Sendiri SMART HOME
by LuriDarmawan in Tutorial & Community Project more 5 years ago - PascalTalk #3: RADically Fast and Easy Mobile Apps Development with Delphi
by LuriDarmawan in Tutorial & Community Project more 5 years ago - PascalTalk #1: Pemanfaatan Artificial Intelligence di Masa Covid-19
by LuriDarmawan in Tutorial & Community Project more 5 years ago - Tempat Latihan Posting
by LuriDarmawan in OOT more 5 years ago - Archive
- Looping lagi...
by idhiel in Hal umum tentang Pascal Indonesia more 13 years ago - [ask] koneksi ke ODBC user Dsn saat runtime dengan ado
by halimanh in FireBird more 13 years ago - Validasi menggunakan data tanggal
by mas_kofa in Hal umum tentang Pascal Indonesia more 13 years ago
Random Topic
- Minta infonya dunk...
by p2bf in Enginering more 18 years ago - membuat no urut di dbgrid1 bagaimana yaa?
by mully in MySQL more 18 years ago - Cara buat file log
by em052007 in Tip n Trik Pemrograman more 18 years ago - aplikasi psikotes
by Lidan in Tip n Trik Pemrograman more 17 years ago - Tanya Konversi Angka
by tAtA in Tip n Trik Pemrograman more 18 years ago - Jangan Di KLik....cm Test POst...
by jarangkonek in OOT more 18 years ago - sudah ada yang pernah coba Delphi7 Second Edition v7.2 ?
by EkoIndri in OOT more 18 years ago - Cara Perhitungan Saldo Seperti Dalam Buku Bank(MySQL),Sukses
by faridx in MsSQL more 18 years ago - Tanya mengurangkan tanggal
by em_bjr in Hal umum tentang Pascal Indonesia more 17 years ago - Bagaimana Cara Memindahkan Settingan Path Database MySQL
by babypigs in Tip n Trik Pemrograman more 17 years ago