123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- unit BufDatasetToolsUnit;
- { Sets up bufdataset for testing.
- Tests expect Get*Dataset to return a dataset with structure and test data, but closed.
- A closed BufDataset normally has no data, so these tests won't work.
- To circumvent this, this unit saves the dataset contents to file and reloads them on opening
- using the BufDataset persistence mechanism.
- }
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils, toolsunit,
- db,
- BufDataset;
- type
- { TbufdatasetDBConnector }
- TbufdatasetDBConnector = class(TDBConnector)
- private
- FUniDirectional: boolean;
- protected
- procedure CreateNDatasets; override;
- procedure CreateFieldDataset; override;
- procedure DropNDatasets; override;
- procedure DropFieldDataset; override;
- Function InternalGetNDataset(n : integer) : TDataset; override;
- Function InternalGetFieldDataset : TDataSet; override;
- procedure SetTestUniDirectional(const AValue: boolean); override;
- function GetTestUniDirectional: boolean; override;
- end;
- implementation
- uses
- StrUtils, FmtBCD;
- type
- { TPersistentBufDataSet }
- TPersistentBufDataSet=class(TBufDataset)
- private
- TempFileName:string;
- protected
- procedure LoadBlobIntoBuffer(FieldDef: TFieldDef; ABlobBuf: PBufBlobField); override;
- public
- destructor Destroy; override;
- end;
- { TPersistentBufDataSet }
- procedure TPersistentBufDataSet.LoadBlobIntoBuffer(FieldDef: TFieldDef; ABlobBuf: PBufBlobField);
- begin
- Raise ENotImplemented.Create('LoadBlobIntoBuffer not implemented');
- end;
- destructor TPersistentBufDataSet.Destroy;
- begin
- Close; // no locks on TempFileName
- DeleteFile(TempFileName);
- inherited Destroy;
- end;
- { TbufdatasetDBConnector }
- procedure TbufdatasetDBConnector.CreateNDatasets;
- begin
- // All datasets are created in InternalGet*Dataset
- end;
- procedure TbufdatasetDBConnector.CreateFieldDataset;
- begin
- // All datasets are created in InternalGet*Dataset
- end;
- procedure TbufdatasetDBConnector.DropNDatasets;
- begin
- // All datasets are created in InternalGet*Dataset and cleaned up when destroyed
- end;
- procedure TbufdatasetDBConnector.DropFieldDataset;
- begin
- // All datasets are created in InternalGet*Dataset and cleaned up when destroyed
- end;
- function TbufdatasetDBConnector.InternalGetNDataset(n: integer): TDataset;
- var BufDataset : TPersistentBufDataSet;
- i : integer;
- begin
- BufDataset := TPersistentBufDataSet.Create(nil);
- with BufDataset do
- begin
- Name := 'NDataset';
- FieldDefs.Add('ID',ftInteger);
- FieldDefs.Add('NAME',ftString,50);
- CreateDataset;
- Open;
- for i := 1 to n do
- begin
- Append;
- FieldByName('ID').AsInteger := i;
- FieldByName('NAME').AsString := 'TestName' + inttostr(i);
- Post;
- end;
- MergeChangeLog;
- TempFileName:=GetTempFileName;
- FileName:=TempFileName;
- Close; // Save data into file
- end;
- Result := BufDataset;
- end;
- function TbufdatasetDBConnector.InternalGetFieldDataset : TDataSet;
- var BufDataset : TPersistentBufDataSet;
- i : integer;
- begin
- // Values >= 24:00:00.000 can't be handled by StrToTime function
- testTimeValues[2] := '23:59:59.000';
- testTimeValues[3] := '23:59:59.003';
- BufDataset := TPersistentBufDataSet.Create(nil);
- with BufDataset do
- begin
- Name := 'FieldDataset';
- FieldDefs.Add('ID',ftInteger);
- FieldDefs.Add('FSTRING',ftString,10);
- FieldDefs.Add('FSMALLINT',ftSmallint);
- FieldDefs.Add('FINTEGER',ftInteger);
- FieldDefs.Add('FWORD',ftWord);
- FieldDefs.Add('FBOOLEAN',ftBoolean);
- FieldDefs.Add('FFLOAT',ftFloat);
- FieldDefs.Add('FCURRENCY',ftCurrency);
- FieldDefs.Add('FBCD',ftBCD);
- FieldDefs.Add('FDATE',ftDate);
- FieldDefs.Add('FTIME',ftTime);
- FieldDefs.Add('FDATETIME',ftDateTime);
- FieldDefs.Add('FVARBYTES',ftVarBytes,10);
- FieldDefs.Add('FBLOB',ftBlob);
- FieldDefs.Add('FMEMO',ftMemo);
- FieldDefs.Add('FFIXEDCHAR',ftFixedChar,10);
- FieldDefs.Add('FLARGEINT',ftLargeint);
- FieldDefs.Add('FVARIANT',ftVariant);
- FieldDefs.Add('FGUID',ftGuid,38);
- FieldDefs.Add('FFMTBCD',ftFmtBCD);
- FieldDefs.Add('FWIDESTRING',ftWideString,10);
- FieldDefs.Add('FFIXEDWIDECHAR',ftFixedWideChar,10);
- FieldDefs.Add('FWIDEMEMO',ftWideMemo);
- CreateDataset;
- Open;
- for i := 0 to testValuesCount-1 do
- begin
- Append;
- FieldByName('ID').AsInteger := i;
- FieldByName('FSTRING').AsString := testStringValues[i];
- FieldByName('FSMALLINT').AsInteger := testSmallIntValues[i];
- FieldByName('FINTEGER').AsInteger := testIntValues[i];
- FieldByName('FWORD').AsInteger := testWordValues[i];
- FieldByName('FBOOLEAN').AsBoolean := testBooleanValues[i];
- FieldByName('FFLOAT').AsFloat := testFloatValues[i];
- FieldByName('FCURRENCY').AsCurrency := testCurrencyValues[i];
- FieldByName('FBCD').AsCurrency := testCurrencyValues[i];
- FieldByName('FDATE').AsDateTime := StrToDateTime(testDateValues[i], Self.FormatSettings);
- FieldByName('FTIME').AsDateTime := StrToTime(testTimeValues[i], Self.FormatSettings);
- FieldByName('FDATETIME').AsDateTime := StrToDateTime(testValues[ftDateTime,i], Self.FormatSettings);
- FieldByName('FVARBYTES').AsString := testStringValues[i];
- FieldByName('FBLOB').AsString := testStringValues[i];
- FieldByName('FMEMO').AsString := testStringValues[i];
- FieldByName('FFIXEDCHAR').AsString := PadRight(testStringValues[i], 10);
- FieldByName('FLARGEINT').AsLargeInt := testLargeIntValues[i];
- FieldByName('FVARIANT').AsString := testStringValues[i];
- FieldByName('FGUID').AsString := GuidToString(GUID_NULL);
- FieldByName('FFMTBCD').AsBCD := StrToBCD(testFmtBCDValues[i], Self.FormatSettings);
- FieldByName('FWIDESTRING').AsString := testStringValues[i];
- FieldByName('FFIXEDWIDECHAR').AsString := PadRight(testStringValues[i], 10);
- FieldByName('FWIDEMEMO').AsString := testStringValues[i];
- Post;
- end;
- MergeChangeLog;
- TempFileName:=GetTempFileName;
- FileName:=TempFileName;
- Close; // Save data into file
- // When data are loaded from file, bidirectional is checked
- // so unidirectional bufdataset can't be tested here
- UniDirectional := TestUniDirectional;
- end;
- Result := BufDataset;
- end;
- procedure TbufdatasetDBConnector.SetTestUniDirectional(const AValue: boolean);
- begin
- FUniDirectional := AValue;
- end;
- function TbufdatasetDBConnector.GetTestUniDirectional: boolean;
- begin
- Result := FUniDirectional;
- end;
- initialization
- RegisterClass(TbufdatasetDBConnector);
- end.
|