bufdatasettoolsunit.pas 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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. public
  38. destructor Destroy; override;
  39. end;
  40. { TPersistentBufDataSet }
  41. destructor TPersistentBufDataSet.Destroy;
  42. begin
  43. Close; // no locks on TempFileName
  44. DeleteFile(TempFileName);
  45. inherited Destroy;
  46. end;
  47. { TbufdatasetDBConnector }
  48. procedure TbufdatasetDBConnector.CreateNDatasets;
  49. begin
  50. // All datasets are created in InternalGet*Dataset
  51. end;
  52. procedure TbufdatasetDBConnector.CreateFieldDataset;
  53. begin
  54. // All datasets are created in InternalGet*Dataset
  55. end;
  56. procedure TbufdatasetDBConnector.DropNDatasets;
  57. begin
  58. // All datasets are created in InternalGet*Dataset and cleaned up when destroyed
  59. end;
  60. procedure TbufdatasetDBConnector.DropFieldDataset;
  61. begin
  62. // All datasets are created in InternalGet*Dataset and cleaned up when destroyed
  63. end;
  64. function TbufdatasetDBConnector.InternalGetNDataset(n: integer): TDataset;
  65. var BufDataset : TPersistentBufDataSet;
  66. i : integer;
  67. begin
  68. BufDataset := TPersistentBufDataSet.Create(nil);
  69. with BufDataset do
  70. begin
  71. Name := 'NDataset';
  72. FieldDefs.Add('ID',ftInteger);
  73. FieldDefs.Add('NAME',ftString,50);
  74. CreateDataset;
  75. Open;
  76. for i := 1 to n do
  77. begin
  78. Append;
  79. FieldByName('ID').AsInteger := i;
  80. FieldByName('NAME').AsString := 'TestName' + inttostr(i);
  81. Post;
  82. end;
  83. MergeChangeLog;
  84. TempFileName:=GetTempFileName;
  85. FileName:=TempFileName;
  86. Close; // Save data into file
  87. end;
  88. Result := BufDataset;
  89. end;
  90. function TbufdatasetDBConnector.InternalGetFieldDataset : TDataSet;
  91. var BufDataset : TPersistentBufDataSet;
  92. i : integer;
  93. begin
  94. // Values >= 24:00:00.000 can't be handled by StrToTime function
  95. testTimeValues[2] := '23:59:59.000';
  96. testTimeValues[3] := '23:59:59.003';
  97. BufDataset := TPersistentBufDataSet.Create(nil);
  98. with BufDataset do
  99. begin
  100. Name := 'FieldDataset';
  101. FieldDefs.Add('ID',ftInteger);
  102. FieldDefs.Add('FSTRING',ftString,10);
  103. FieldDefs.Add('FSMALLINT',ftSmallint);
  104. FieldDefs.Add('FINTEGER',ftInteger);
  105. FieldDefs.Add('FWORD',ftWord);
  106. FieldDefs.Add('FBOOLEAN',ftBoolean);
  107. FieldDefs.Add('FFLOAT',ftFloat);
  108. FieldDefs.Add('FCURRENCY',ftCurrency);
  109. FieldDefs.Add('FBCD',ftBCD);
  110. FieldDefs.Add('FDATE',ftDate);
  111. FieldDefs.Add('FTIME',ftTime);
  112. FieldDefs.Add('FDATETIME',ftDateTime);
  113. FieldDefs.Add('FVARBYTES',ftVarBytes,10);
  114. FieldDefs.Add('FBLOB',ftBlob);
  115. FieldDefs.Add('FMEMO',ftMemo);
  116. FieldDefs.Add('FFIXEDCHAR',ftFixedChar,10);
  117. FieldDefs.Add('FLARGEINT',ftLargeint);
  118. FieldDefs.Add('FVARIANT',ftVariant);
  119. FieldDefs.Add('FGUID',ftGuid,38);
  120. FieldDefs.Add('FFMTBCD',ftFmtBCD);
  121. FieldDefs.Add('FWIDESTRING',ftWideString,10);
  122. FieldDefs.Add('FFIXEDWIDECHAR',ftFixedWideChar,10);
  123. FieldDefs.Add('FWIDEMEMO',ftWideMemo);
  124. CreateDataset;
  125. Open;
  126. for i := 0 to testValuesCount-1 do
  127. begin
  128. Append;
  129. FieldByName('ID').AsInteger := i;
  130. FieldByName('FSTRING').AsString := testStringValues[i];
  131. FieldByName('FSMALLINT').AsInteger := testSmallIntValues[i];
  132. FieldByName('FINTEGER').AsInteger := testIntValues[i];
  133. FieldByName('FWORD').AsInteger := testWordValues[i];
  134. FieldByName('FBOOLEAN').AsBoolean := testBooleanValues[i];
  135. FieldByName('FFLOAT').AsFloat := testFloatValues[i];
  136. FieldByName('FCURRENCY').AsCurrency := testCurrencyValues[i];
  137. FieldByName('FBCD').AsCurrency := testCurrencyValues[i];
  138. FieldByName('FDATE').AsDateTime := StrToDateTime(testDateValues[i], Self.FormatSettings);
  139. FieldByName('FTIME').AsDateTime := StrToTime(testTimeValues[i], Self.FormatSettings);
  140. FieldByName('FDATETIME').AsDateTime := StrToDateTime(testValues[ftDateTime,i], Self.FormatSettings);
  141. FieldByName('FVARBYTES').AsString := testStringValues[i];
  142. FieldByName('FBLOB').AsString := testStringValues[i];
  143. FieldByName('FMEMO').AsString := testStringValues[i];
  144. FieldByName('FFIXEDCHAR').AsString := PadRight(testStringValues[i], 10);
  145. FieldByName('FLARGEINT').AsLargeInt := testLargeIntValues[i];
  146. FieldByName('FVARIANT').AsString := testStringValues[i];
  147. FieldByName('FGUID').AsString := GuidToString(GUID_NULL);
  148. FieldByName('FFMTBCD').AsBCD := StrToBCD(testFmtBCDValues[i], Self.FormatSettings);
  149. FieldByName('FWIDESTRING').AsString := testStringValues[i];
  150. FieldByName('FFIXEDWIDECHAR').AsString := PadRight(testStringValues[i], 10);
  151. FieldByName('FWIDEMEMO').AsString := testStringValues[i];
  152. Post;
  153. end;
  154. MergeChangeLog;
  155. TempFileName:=GetTempFileName;
  156. FileName:=TempFileName;
  157. Close; // Save data into file
  158. // When data are loaded from file, bidirectional is checked
  159. // so unidirectional bufdataset can't be tested here
  160. UniDirectional := TestUniDirectional;
  161. end;
  162. Result := BufDataset;
  163. end;
  164. procedure TbufdatasetDBConnector.SetTestUniDirectional(const AValue: boolean);
  165. begin
  166. FUniDirectional := AValue;
  167. end;
  168. function TbufdatasetDBConnector.GetTestUniDirectional: boolean;
  169. begin
  170. Result := FUniDirectional;
  171. end;
  172. initialization
  173. RegisterClass(TbufdatasetDBConnector);
  174. end.