bufdatasettoolsunit.pas 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. unit BufDatasetToolsUnit;
  2. { Sets up bufdataset for testing.
  3. Tests expect Get*Dataset to return a dataset with structure and test data, but closed.
  4. A closed BufDataset normally has no data, so these tests won't work.
  5. To circumvent this, this unit saves the dataset contents to file and reloads them on opening
  6. using the BufDataset persistence mechanism.
  7. }
  8. {$mode objfpc}{$H+}
  9. interface
  10. uses
  11. Classes, SysUtils, toolsunit,
  12. db,
  13. BufDataset;
  14. type
  15. { TbufdatasetDBConnector }
  16. TbufdatasetDBConnector = class(TDBConnector)
  17. private
  18. FUniDirectional: boolean;
  19. protected
  20. procedure CreateNDatasets; override;
  21. procedure CreateFieldDataset; override;
  22. procedure DropNDatasets; override;
  23. procedure DropFieldDataset; override;
  24. Function InternalGetNDataset(n : integer) : TDataset; override;
  25. Function InternalGetFieldDataset : TDataSet; override;
  26. procedure SetTestUniDirectional(const AValue: boolean); override;
  27. function GetTestUniDirectional: boolean; override;
  28. end;
  29. implementation
  30. uses
  31. StrUtils, FmtBCD;
  32. type
  33. { TPersistentBufDataSet }
  34. TPersistentBufDataSet=class(TBufDataset)
  35. private
  36. TempFileName:string;
  37. protected
  38. procedure LoadBlobIntoBuffer(FieldDef: TFieldDef; ABlobBuf: PBufBlobField); override;
  39. public
  40. destructor Destroy; override;
  41. end;
  42. { TPersistentBufDataSet }
  43. procedure TPersistentBufDataSet.LoadBlobIntoBuffer(FieldDef: TFieldDef; ABlobBuf: PBufBlobField);
  44. begin
  45. Raise ENotImplemented.Create('LoadBlobIntoBuffer not implemented');
  46. end;
  47. destructor TPersistentBufDataSet.Destroy;
  48. begin
  49. Close; // no locks on TempFileName
  50. DeleteFile(TempFileName);
  51. inherited Destroy;
  52. end;
  53. { TbufdatasetDBConnector }
  54. procedure TbufdatasetDBConnector.CreateNDatasets;
  55. begin
  56. // All datasets are created in InternalGet*Dataset
  57. end;
  58. procedure TbufdatasetDBConnector.CreateFieldDataset;
  59. begin
  60. // All datasets are created in InternalGet*Dataset
  61. end;
  62. procedure TbufdatasetDBConnector.DropNDatasets;
  63. begin
  64. // All datasets are created in InternalGet*Dataset and cleaned up when destroyed
  65. end;
  66. procedure TbufdatasetDBConnector.DropFieldDataset;
  67. begin
  68. // All datasets are created in InternalGet*Dataset and cleaned up when destroyed
  69. end;
  70. function TbufdatasetDBConnector.InternalGetNDataset(n: integer): TDataset;
  71. var BufDataset : TPersistentBufDataSet;
  72. i : integer;
  73. begin
  74. BufDataset := TPersistentBufDataSet.Create(nil);
  75. with BufDataset do
  76. begin
  77. Name := 'NDataset';
  78. FieldDefs.Add('ID',ftInteger);
  79. FieldDefs.Add('NAME',ftString,50);
  80. CreateDataset;
  81. Open;
  82. for i := 1 to n do
  83. begin
  84. Append;
  85. FieldByName('ID').AsInteger := i;
  86. FieldByName('NAME').AsString := 'TestName' + inttostr(i);
  87. Post;
  88. end;
  89. MergeChangeLog;
  90. TempFileName:=GetTempFileName;
  91. FileName:=TempFileName;
  92. Close; // Save data into file
  93. end;
  94. Result := BufDataset;
  95. end;
  96. function TbufdatasetDBConnector.InternalGetFieldDataset : TDataSet;
  97. var BufDataset : TPersistentBufDataSet;
  98. i : integer;
  99. begin
  100. // Values >= 24:00:00.000 can't be handled by StrToTime function
  101. testTimeValues[2] := '23:59:59.000';
  102. testTimeValues[3] := '23:59:59.003';
  103. BufDataset := TPersistentBufDataSet.Create(nil);
  104. with BufDataset do
  105. begin
  106. Name := 'FieldDataset';
  107. FieldDefs.Add('ID',ftInteger);
  108. FieldDefs.Add('FSTRING',ftString,10);
  109. FieldDefs.Add('FSMALLINT',ftSmallint);
  110. FieldDefs.Add('FINTEGER',ftInteger);
  111. FieldDefs.Add('FWORD',ftWord);
  112. FieldDefs.Add('FBOOLEAN',ftBoolean);
  113. FieldDefs.Add('FFLOAT',ftFloat);
  114. FieldDefs.Add('FCURRENCY',ftCurrency);
  115. FieldDefs.Add('FBCD',ftBCD);
  116. FieldDefs.Add('FDATE',ftDate);
  117. FieldDefs.Add('FTIME',ftTime);
  118. FieldDefs.Add('FDATETIME',ftDateTime);
  119. FieldDefs.Add('FVARBYTES',ftVarBytes,10);
  120. FieldDefs.Add('FBLOB',ftBlob);
  121. FieldDefs.Add('FMEMO',ftMemo);
  122. FieldDefs.Add('FFIXEDCHAR',ftFixedChar,10);
  123. FieldDefs.Add('FLARGEINT',ftLargeint);
  124. FieldDefs.Add('FVARIANT',ftVariant);
  125. FieldDefs.Add('FGUID',ftGuid,38);
  126. FieldDefs.Add('FFMTBCD',ftFmtBCD);
  127. FieldDefs.Add('FWIDESTRING',ftWideString,10);
  128. FieldDefs.Add('FFIXEDWIDECHAR',ftFixedWideChar,10);
  129. FieldDefs.Add('FWIDEMEMO',ftWideMemo);
  130. CreateDataset;
  131. Open;
  132. for i := 0 to testValuesCount-1 do
  133. begin
  134. Append;
  135. FieldByName('ID').AsInteger := i;
  136. FieldByName('FSTRING').AsString := testStringValues[i];
  137. FieldByName('FSMALLINT').AsInteger := testSmallIntValues[i];
  138. FieldByName('FINTEGER').AsInteger := testIntValues[i];
  139. FieldByName('FWORD').AsInteger := testWordValues[i];
  140. FieldByName('FBOOLEAN').AsBoolean := testBooleanValues[i];
  141. FieldByName('FFLOAT').AsFloat := testFloatValues[i];
  142. FieldByName('FCURRENCY').AsCurrency := testCurrencyValues[i];
  143. FieldByName('FBCD').AsCurrency := testCurrencyValues[i];
  144. FieldByName('FDATE').AsDateTime := StrToDateTime(testDateValues[i], Self.FormatSettings);
  145. FieldByName('FTIME').AsDateTime := StrToTime(testTimeValues[i], Self.FormatSettings);
  146. FieldByName('FDATETIME').AsDateTime := StrToDateTime(testValues[ftDateTime,i], Self.FormatSettings);
  147. FieldByName('FVARBYTES').AsString := testStringValues[i];
  148. FieldByName('FBLOB').AsString := testStringValues[i];
  149. FieldByName('FMEMO').AsString := testStringValues[i];
  150. FieldByName('FFIXEDCHAR').AsString := PadRight(testStringValues[i], 10);
  151. FieldByName('FLARGEINT').AsLargeInt := testLargeIntValues[i];
  152. FieldByName('FVARIANT').AsString := testStringValues[i];
  153. FieldByName('FGUID').AsString := GuidToString(GUID_NULL);
  154. FieldByName('FFMTBCD').AsBCD := StrToBCD(testFmtBCDValues[i], Self.FormatSettings);
  155. FieldByName('FWIDESTRING').AsString := testStringValues[i];
  156. FieldByName('FFIXEDWIDECHAR').AsString := PadRight(testStringValues[i], 10);
  157. FieldByName('FWIDEMEMO').AsString := testStringValues[i];
  158. Post;
  159. end;
  160. MergeChangeLog;
  161. TempFileName:=GetTempFileName;
  162. FileName:=TempFileName;
  163. Close; // Save data into file
  164. // When data are loaded from file, bidirectional is checked
  165. // so unidirectional bufdataset can't be tested here
  166. UniDirectional := TestUniDirectional;
  167. end;
  168. Result := BufDataset;
  169. end;
  170. procedure TbufdatasetDBConnector.SetTestUniDirectional(const AValue: boolean);
  171. begin
  172. FUniDirectional := AValue;
  173. end;
  174. function TbufdatasetDBConnector.GetTestUniDirectional: boolean;
  175. begin
  176. Result := FUniDirectional;
  177. end;
  178. initialization
  179. RegisterClass(TbufdatasetDBConnector);
  180. end.