bufdatasettoolsunit.pas 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. unit BufDatasetToolsUnit;
  2. { Sets up bufdataset for testing.
  3. Tests expect Get*Dataset tho 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 using BufDataset persistence mechanism.
  6. }
  7. {$mode objfpc}{$H+}
  8. interface
  9. uses
  10. Classes, SysUtils, toolsunit,
  11. db,
  12. BufDataset;
  13. type
  14. { TbufdatasetConnector }
  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. BufDataset.Name := 'NDataset';
  70. BufDataset.FieldDefs.Add('ID',ftInteger);
  71. BufDataset.FieldDefs.Add('NAME',ftString,50);
  72. BufDataset.CreateDataset;
  73. BufDataset.Open;
  74. for i := 1 to n do
  75. begin
  76. BufDataset.Append;
  77. BufDataset.FieldByName('ID').AsInteger := i;
  78. BufDataset.FieldByName('NAME').AsString := 'TestName' + inttostr(i);
  79. BufDataset.Post;
  80. end;
  81. BufDataset.TempFileName:=GetTempFileName;
  82. BufDataset.FileName:=BufDataset.TempFileName;
  83. BufDataset.Close; // Save data into file
  84. Result := BufDataset;
  85. end;
  86. function TbufdatasetDBConnector.InternalGetFieldDataset : TDataSet;
  87. var BufDataset : TPersistentBufDataSet;
  88. i : integer;
  89. begin
  90. // Values >= 24:00:00.000 can't be handled by StrToTime function
  91. testTimeValues[2] := '23:59:59.000';
  92. testTimeValues[3] := '23:59:59.003';
  93. BufDataset := TPersistentBufDataSet.Create(nil);
  94. with BufDataset do
  95. begin
  96. Name := 'FieldDataset';
  97. UniDirectional := FUniDirectional;
  98. FieldDefs.Add('ID',ftInteger);
  99. FieldDefs.Add('FSTRING',ftString,10);
  100. FieldDefs.Add('FSMALLINT',ftSmallint);
  101. FieldDefs.Add('FINTEGER',ftInteger);
  102. FieldDefs.Add('FWORD',ftWord);
  103. FieldDefs.Add('FBOOLEAN',ftBoolean);
  104. FieldDefs.Add('FFLOAT',ftFloat);
  105. FieldDefs.Add('FCURRENCY',ftCurrency);
  106. FieldDefs.Add('FBCD',ftBCD);
  107. FieldDefs.Add('FDATE',ftDate);
  108. FieldDefs.Add('FTIME',ftTime);
  109. FieldDefs.Add('FDATETIME',ftDateTime);
  110. FieldDefs.Add('FBLOB',ftBlob);
  111. FieldDefs.Add('FMEMO',ftMemo);
  112. FieldDefs.Add('FLARGEINT',ftLargeint);
  113. FieldDefs.Add('FFIXEDCHAR',ftFixedChar,10);
  114. FieldDefs.Add('FFMTBCD',ftFmtBCD);
  115. CreateDataset;
  116. Open;
  117. for i := 0 to testValuesCount-1 do
  118. begin
  119. Append;
  120. FieldByName('ID').AsInteger := i;
  121. FieldByName('FSTRING').AsString := testStringValues[i];
  122. FieldByName('FSMALLINT').AsInteger := testSmallIntValues[i];
  123. FieldByName('FINTEGER').AsInteger := testIntValues[i];
  124. FieldByName('FBOOLEAN').AsBoolean := testBooleanValues[i];
  125. FieldByName('FFLOAT').AsFloat := testFloatValues[i];
  126. FieldByName('FCURRENCY').AsCurrency := testCurrencyValues[i];
  127. FieldByName('FBCD').AsCurrency := testCurrencyValues[i];
  128. FieldByName('FDATE').AsDateTime := StrToDateTime(testDateValues[i], Self.FormatSettings);
  129. FieldByName('FTIME').AsDateTime := StrToTime(testTimeValues[i], Self.FormatSettings);
  130. FieldByName('FDATETIME').AsDateTime := StrToDateTime(testValues[ftDateTime,i], Self.FormatSettings);
  131. FieldByName('FBLOB').AsString := testStringValues[i];
  132. FieldByName('FMEMO').AsString := testStringValues[i];
  133. FieldByName('FLARGEINT').AsLargeInt := testLargeIntValues[i];
  134. FieldByName('FFIXEDCHAR').AsString := PadRight(testStringValues[i], 10);
  135. FieldByName('FFMTBCD').AsBCD := StrToBCD(testFmtBCDValues[i], Self.FormatSettings);
  136. Post;
  137. end;
  138. BufDataset.TempFileName:=GetTempFileName;
  139. BufDataset.FileName:=BufDataset.TempFileName;
  140. Close; // Save data into file
  141. end;
  142. Result := BufDataset;
  143. end;
  144. procedure TbufdatasetDBConnector.SetTestUniDirectional(const AValue: boolean);
  145. begin
  146. FUniDirectional := AValue;
  147. end;
  148. function TbufdatasetDBConnector.GetTestUniDirectional: boolean;
  149. begin
  150. Result := FUniDirectional;
  151. end;
  152. initialization
  153. RegisterClass(TbufdatasetDBConnector);
  154. end.