bufdatasettoolsunit.pas 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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. { TPersistentBufDataSet }
  30. TPersistentBufDataSet=class(TBufDataset)
  31. private
  32. TempFileName:string;
  33. protected
  34. procedure LoadBlobIntoBuffer(FieldDef: TFieldDef; ABlobBuf: PBufBlobField); override;
  35. public
  36. destructor Destroy; override;
  37. end;
  38. implementation
  39. uses
  40. StrUtils, FmtBCD;
  41. { TPersistentBufDataSet }
  42. procedure TPersistentBufDataSet.LoadBlobIntoBuffer(FieldDef: TFieldDef; ABlobBuf: PBufBlobField);
  43. begin
  44. Raise ENotImplemented.Create('LoadBlobIntoBuffer not implemented');
  45. end;
  46. destructor TPersistentBufDataSet.Destroy;
  47. begin
  48. Close; // no locks on TempFileName
  49. DeleteFile(TempFileName);
  50. inherited Destroy;
  51. end;
  52. { TbufdatasetDBConnector }
  53. procedure TbufdatasetDBConnector.CreateNDatasets;
  54. begin
  55. // All datasets are created in InternalGet*Dataset
  56. end;
  57. procedure TbufdatasetDBConnector.CreateFieldDataset;
  58. begin
  59. // All datasets are created in InternalGet*Dataset
  60. end;
  61. procedure TbufdatasetDBConnector.DropNDatasets;
  62. begin
  63. // All datasets are created in InternalGet*Dataset and cleaned up when destroyed
  64. end;
  65. procedure TbufdatasetDBConnector.DropFieldDataset;
  66. begin
  67. // All datasets are created in InternalGet*Dataset and cleaned up when destroyed
  68. end;
  69. function TbufdatasetDBConnector.InternalGetNDataset(n: integer): TDataset;
  70. var
  71. 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. // Writeln(FileName);
  93. Close; // Save data into file
  94. Fields.Clear;
  95. end;
  96. Result := BufDataset;
  97. end;
  98. function TbufdatasetDBConnector.InternalGetFieldDataset : TDataSet;
  99. var BufDataset : TPersistentBufDataSet;
  100. i : integer;
  101. begin
  102. // Values >= 24:00:00.000 can't be handled by StrToTime function
  103. testTimeValues[2] := '23:59:59.000';
  104. testTimeValues[3] := '23:59:59.003';
  105. BufDataset := TPersistentBufDataSet.Create(nil);
  106. with BufDataset do
  107. begin
  108. Name := 'FieldDataset';
  109. FieldDefs.Add('ID',ftInteger);
  110. FieldDefs.Add('FSTRING',ftString,10);
  111. FieldDefs.Add('FSMALLINT',ftSmallint);
  112. FieldDefs.Add('FINTEGER',ftInteger);
  113. FieldDefs.Add('FWORD',ftWord);
  114. FieldDefs.Add('FBOOLEAN',ftBoolean);
  115. FieldDefs.Add('FFLOAT',ftFloat);
  116. FieldDefs.Add('FCURRENCY',ftCurrency);
  117. FieldDefs.Add('FBCD',ftBCD);
  118. FieldDefs.Add('FDATE',ftDate);
  119. FieldDefs.Add('FTIME',ftTime);
  120. FieldDefs.Add('FDATETIME',ftDateTime);
  121. FieldDefs.Add('FVARBYTES',ftVarBytes,20);
  122. FieldDefs.Add('FBLOB',ftBlob);
  123. FieldDefs.Add('FMEMO',ftMemo);
  124. FieldDefs.Add('FFIXEDCHAR',ftFixedChar,10);
  125. FieldDefs.Add('FLARGEINT',ftLargeint);
  126. FieldDefs.Add('FVARIANT',ftVariant);
  127. FieldDefs.Add('FGUID',ftGuid,38);
  128. FieldDefs.Add('FFMTBCD',ftFmtBCD);
  129. FieldDefs.Add('FWIDESTRING',ftWideString,10);
  130. FieldDefs.Add('FFIXEDWIDECHAR',ftFixedWideChar,10);
  131. FieldDefs.Add('FWIDEMEMO',ftWideMemo);
  132. FieldDefs.Add('FLONGWORD',ftLongWord);
  133. FieldDefs.Add('FSHORTINT',ftShortInt);
  134. FieldDefs.Add('FBYTE',ftByte);
  135. FieldDefs.Add('FEXTENDED',ftExtended);
  136. FieldDefs.Add('FSINGLE',ftSingle);
  137. CreateDataset;
  138. Open;
  139. for i := 0 to testValuesCount-1 do
  140. begin
  141. Append;
  142. FieldByName('ID').AsInteger := i;
  143. FieldByName('FSTRING').AsString := testStringValues[i];
  144. FieldByName('FSMALLINT').AsInteger := testSmallIntValues[i];
  145. FieldByName('FINTEGER').AsInteger := testIntValues[i];
  146. FieldByName('FWORD').AsInteger := testWordValues[i];
  147. FieldByName('FBOOLEAN').AsBoolean := testBooleanValues[i];
  148. FieldByName('FFLOAT').AsFloat := testFloatValues[i];
  149. FieldByName('FCURRENCY').AsCurrency := testCurrencyValues[i];
  150. FieldByName('FBCD').AsCurrency := testCurrencyValues[i];
  151. FieldByName('FDATE').AsDateTime := StrToDateTime(testDateValues[i], Self.FormatSettings);
  152. FieldByName('FTIME').AsDateTime := StrToTime(testTimeValues[i], Self.FormatSettings);
  153. FieldByName('FDATETIME').AsDateTime := StrToDateTime(testValues[ftDateTime,i], Self.FormatSettings);
  154. FieldByName('FVARBYTES').AsString := testStringValues[i];
  155. { if not (FieldByName('FVARBYTES').AsString = testStringValues[i]) then
  156. Writeln('Error');
  157. }
  158. FieldByName('FBLOB').AsString := testStringValues[i];
  159. FieldByName('FMEMO').AsString := testStringValues[i];
  160. FieldByName('FFIXEDCHAR').AsString := PadRight(testStringValues[i], 10);
  161. FieldByName('FLARGEINT').AsLargeInt := testLargeIntValues[i];
  162. FieldByName('FVARIANT').AsString := testStringValues[i];
  163. FieldByName('FGUID').AsString := GuidToString(GUID_NULL);
  164. FieldByName('FFMTBCD').AsBCD := StrToBCD(testFmtBCDValues[i], Self.FormatSettings);
  165. FieldByName('FWIDESTRING').AsString := testStringValues[i];
  166. FieldByName('FFIXEDWIDECHAR').AsString := PadRight(testStringValues[i], 10);
  167. FieldByName('FWIDEMEMO').AsString := testStringValues[i];
  168. FieldByName('FLONGWORD').AsLongWord := testLongWordValues[i];
  169. FieldByName('FSHORTINT').AsInteger := testShortIntValues[i];
  170. FieldByName('FBYTE').AsInteger := testByteValues[i];
  171. FieldByName('FEXTENDED').AsExtended := testFloatValues[i];
  172. FieldByName('FSINGLE').AsSingle := testSingleValues[i];
  173. Post;
  174. end;
  175. MergeChangeLog;
  176. TempFileName:=GetTempFileName;
  177. FileName:=TempFileName;
  178. Close; // Save data into file
  179. // When data are loaded from file, bidirectional is checked
  180. // so unidirectional bufdataset can't be tested here
  181. UniDirectional := TestUniDirectional;
  182. end;
  183. Result := BufDataset;
  184. end;
  185. procedure TbufdatasetDBConnector.SetTestUniDirectional(const AValue: boolean);
  186. begin
  187. FUniDirectional := AValue;
  188. end;
  189. function TbufdatasetDBConnector.GetTestUniDirectional: boolean;
  190. begin
  191. Result := FUniDirectional;
  192. end;
  193. initialization
  194. RegisterClass(TbufdatasetDBConnector);
  195. end.