unit DataStreamersMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, Grids, DBGrids, ExtCtrls, DBCtrls, uDADataTable, uDABINAdapter, uDAClasses, uDADriverManager, uDAInterfaces, uDADataStreamer, uDAScriptingProvider, uDACDSDataTable, uDAEngine, uDAADODriver; type TDataStreamersMainForm = class(TForm) DADriverManager: TDADriverManager; DAADODriver: TDAADODriver; DAConnectionManager: TDAConnectionManager; dtCustomers: TDACDSDataTable; dsCustomers: TDADataSource; gCustomers: TDBGrid; dtOrders: TDACDSDataTable; dsOrders: TDADataSource; gOrders: TDBGrid; Panel1: TPanel; dbnOrders: TDBNavigator; btn_OpenOrders: TButton; cbApplyOrdersSchema: TCheckBox; Panel2: TPanel; cbApplyCustomersSchema: TCheckBox; btn_OpenCustomers: TButton; dbnCustomers: TDBNavigator; Panel3: TPanel; Panel4: TPanel; btn_TestDatasets: TButton; cbSkipCustomers: TCheckBox; cbSkipOrders: TCheckBox; btn_TurnMD: TButton; cbCloseBeforeTest: TCheckBox; btn_ShowDeltaCounters: TButton; btn_TestDeltas: TButton; btn_ClearMemo: TButton; Memo: TMemo; DASchema: TDASchema; DABinDataStreamer: TDABinDataStreamer; procedure FormCreate(Sender: TObject); procedure btn_TestDatasetsClick(Sender: TObject); procedure btn_OpenCustomersClick(Sender: TObject); procedure btn_OpenOrdersClick(Sender: TObject); procedure btn_TurnMDClick(Sender: TObject); procedure btn_ShowDeltaCountersClick(Sender: TObject); procedure btn_TestDeltasClick(Sender: TObject); procedure btn_ClearMemoClick(Sender: TObject); procedure FormDestroy(Sender: TObject); private fConnection: IDAConnection; end; var DataStreamersMainForm: TDataStreamersMainForm; implementation uses uROTypes, uDADelta; {$R *.dfm} procedure TDataStreamersMainForm.FormCreate(Sender: TObject); begin fConnection := DAConnectionManager.NewConnection('ADO'); end; procedure TDataStreamersMainForm.FormDestroy(Sender: TObject); begin fConnection:=nil; end; procedure TDataStreamersMainForm.btn_TestDatasetsClick(Sender: TObject); var stream: Binary; customers, orders: IDADataset; i: integer; start: Cardinal; begin if cbCloseBeforeTest.Checked then begin dtCustomers.Close; dtOrders.Close; end; stream := Binary.Create; with DABinDataStreamer do try customers := DASchema.NewDataset(fConnection, 'Customers'); //customers.Where.AddText(' 1=2'); orders := DASchema.NewDataset(fConnection, 'Orders'); //orders.Where.AddText(' 1=2'); start := GetTickCount; // Writes the data Initialize(stream, aiWrite); if not cbSkipCustomers.Checked then WriteDataset(customers, [woSchema, woRows], -1); if not cbSkipOrders.Checked then WriteDataset(orders, [woRows, woSchema], -1); Finalize; // End of write data Memo.Lines.Add('WRITE completed in ' + IntToStr(GetTickCount - start) + 'ms'); // Logging info Memo.Lines.Add('Stream is now ' + IntToStr(stream.Size) + ' bytes long'); start := GetTickCount; Initialize(stream, aiReadFromBeginning); // Reads the data if not cbSkipCustomers.Checked then begin if cbApplyCustomersSchema.Checked then ReadDataset('Customers', dtCustomers, TRUE) else ReadDataset('Customers', dtCustomers); end; if not cbSkipOrders.Checked then begin if cbApplyOrdersSchema.Checked then ReadDataset('Orders', dtOrders, TRUE) else ReadDataset('Orders', dtOrders); end; Finalize; // End of read data Memo.Lines.Add('READ completed in ' + IntToStr(GetTickCount - start) + 'ms'); // Logging info Memo.Lines.Add('The stream contains ' + IntToStr(DatasetCount) + ' datasets and ' + IntToStr(DeltaCount) + ' deltas'); for i := 0 to (DatasetCount - 1) do Memo.Lines.Add('Dataset -> ' + DatasetNames[i]); for i := 0 to (DeltaCount - 1) do Memo.Lines.Add('Delta -> ' + DeltaNames[i]); Memo.Lines.Add(' '); finally stream.Free; end; end; procedure TDataStreamersMainForm.btn_OpenCustomersClick(Sender: TObject); begin dtCustomers.Active := dtCustomers.Active xor TRUE; end; procedure TDataStreamersMainForm.btn_OpenOrdersClick(Sender: TObject); begin dtOrders.Active := dtOrders.Active xor TRUE end; procedure TDataStreamersMainForm.btn_TurnMDClick(Sender: TObject); begin if dtOrders.MasterSource = nil then begin dtOrders.MasterFields := 'CustomerID'; dtOrders.DetailFields := 'CustomerID'; dtOrders.MasterSource := dsCustomers; end else begin dtOrders.MasterSource := nil; dtOrders.MasterFields := ''; dtOrders.DetailFields := ''; end; btn_TestDatasets.Enabled := dtOrders.MasterSource = nil; end; procedure TDataStreamersMainForm.btn_ShowDeltaCountersClick(Sender: TObject); begin ShowMessage(Format('Changes: Customers %d, Orders %d', [dtCustomers.Delta.Count, dtOrders.Delta.Count])); end; procedure TDataStreamersMainForm.btn_TestDeltasClick(Sender: TObject); var stream: TStream; i: integer; orddelta, custdelta: TDADelta; begin if not dtCustomers.Active or not dtOrders.Active then begin MessageDlg('Both datatables must be open!', mtError, [mbOK], 0); Exit; end; stream := TMemoryStream.Create; custdelta := TDADelta.Create(dtCustomers); orddelta := TDADelta.Create(dtOrders); with DABinDataStreamer do try // Writes the data Initialize(stream, aiWrite); if not cbSkipCustomers.Checked then WriteDelta(dtCustomers); if not cbSkipOrders.Checked then WriteDelta(dtOrders); Finalize; // End of write data // Logging info Memo.Lines.Add('Stream is now ' + IntToStr(stream.Size) + ' bytes long'); Initialize(stream, aiReadFromBeginning); // Reads the data if not cbSkipCustomers.Checked then begin ReadDelta('dtCustomers', custdelta); Memo.Lines.Add('Customers delta contains ' + IntToStr(custdelta.Count) + ' changes'); end; if not cbSkipOrders.Checked then begin ReadDelta('dtOrders', orddelta); Memo.Lines.Add('Orders delta contains ' + IntToStr(orddelta.Count) + ' changes'); end; Finalize; // Logging info Memo.Lines.Add('The stream contains ' + IntToStr(DatasetCount) + ' datasets and ' + IntToStr(DeltaCount) + ' deltas'); for i := 0 to (DatasetCount - 1) do Memo.Lines.Add('Dataset -> ' + DatasetNames[i]); for i := 0 to (DeltaCount - 1) do Memo.Lines.Add('Delta -> ' + DeltaNames[i]); Memo.Lines.Add(' '); finally stream.Free; custdelta.Free; orddelta.Free; end; end; procedure TDataStreamersMainForm.btn_ClearMemoClick(Sender: TObject); begin Memo.Lines.Clear; end; end.