unit fMainForm; 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 TForm1 = class(TForm) DADriverManager1: TDADriverManager; DAADODriver1: TDAADODriver; DAConnectionManager1: TDAConnectionManager; dtCustomers: TDACDSDataTable; dsCustomers: TDADataSource; DBGrid1: TDBGrid; dtOrders: TDACDSDataTable; dsOrders: TDADataSource; DBGrid2: TDBGrid; Panel1: TPanel; DBNavigator2: TDBNavigator; Button3: TButton; cbApplyOrdersSchema: TCheckBox; Panel2: TPanel; cbApplyCustomersSchema: TCheckBox; Button2: TButton; DBNavigator1: 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; DASchema1: TDASchema; DABinDataStreamer: TDABinDataStreamer; procedure FormCreate(Sender: TObject); procedure btn_TestDatasetsClick(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure btn_TurnMDClick(Sender: TObject); procedure btn_ShowDeltaCountersClick(Sender: TObject); procedure btn_TestDeltasClick(Sender: TObject); procedure btn_ClearMemoClick(Sender: TObject); private fConnection: IDAConnection; end; var Form1: TForm1; implementation uses uROTypes, uDADelta; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin fConnection := DAConnectionManager1.NewConnection('ADO'); end; procedure TForm1.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 := DASchema1.NewDataset(fConnection, 'Customers'); //customers.Where.AddText(' 1=2'); orders := DASchema1.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 TForm1.Button2Click(Sender: TObject); begin dtCustomers.Active := dtCustomers.Active xor TRUE; end; procedure TForm1.Button3Click(Sender: TObject); begin dtOrders.Active := dtOrders.Active xor TRUE end; procedure TForm1.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 TForm1.btn_ShowDeltaCountersClick(Sender: TObject); begin ShowMessage(Format('Changes: Customers %d, Orders %d', [dtCustomers.Delta.Count, dtOrders.Delta.Count])); end; procedure TForm1.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 TForm1.btn_ClearMemoClick(Sender: TObject); begin Memo.Lines.Clear; end; end.