bufdatasettoolsunit.pas 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. type
  31. { TPersistentBufDataSet }
  32. TPersistentBufDataSet=class(TBufDataset)
  33. private
  34. TempFileName:string;
  35. public
  36. destructor Destroy; override;
  37. end;
  38. { TPersistentBufDataSet }
  39. destructor TPersistentBufDataSet.Destroy;
  40. begin
  41. Close; // no locks on TempFileName
  42. DeleteFile(TempFileName);
  43. inherited Destroy;
  44. end;
  45. { TbufdatasetDBConnector }
  46. procedure TbufdatasetDBConnector.CreateNDatasets;
  47. begin
  48. // All datasets are created in InternalGet*Dataset
  49. end;
  50. procedure TbufdatasetDBConnector.CreateFieldDataset;
  51. begin
  52. // All datasets are created in InternalGet*Dataset
  53. end;
  54. procedure TbufdatasetDBConnector.DropNDatasets;
  55. begin
  56. // All datasets are created in InternalGet*Dataset and cleaned up when destroyed
  57. end;
  58. procedure TbufdatasetDBConnector.DropFieldDataset;
  59. begin
  60. // All datasets are created in InternalGet*Dataset and cleaned up when destroyed
  61. end;
  62. function TbufdatasetDBConnector.InternalGetNDataset(n: integer): TDataset;
  63. var BufDataset : TPersistentBufDataSet;
  64. i : integer;
  65. begin
  66. BufDataset := TPersistentBufDataSet.Create(nil);
  67. BufDataset.FieldDefs.Add('ID',ftInteger);
  68. BufDataset.FieldDefs.Add('NAME',ftString,50);
  69. BufDataset.CreateDataset;
  70. BufDataset.Open;
  71. for i := 1 to n do
  72. begin
  73. BufDataset.Append;
  74. BufDataset.FieldByName('ID').AsInteger := i;
  75. BufDataset.FieldByName('NAME').AsString := 'TestName' + inttostr(i);
  76. BufDataset.Post;
  77. end;
  78. BufDataset.TempFileName:=GetTempFileName;
  79. BufDataset.FileName:=BufDataset.TempFileName;
  80. BufDataset.Close; // Save data into file
  81. Result := BufDataset;
  82. end;
  83. function TbufdatasetDBConnector.InternalGetFieldDataset : TDataSet;
  84. var BufDataset : TPersistentBufDataSet;
  85. i : integer;
  86. begin
  87. // Values >= 24:00:00.000 can't be handled by bufdataset
  88. testTimeValues[2] := '23:59:59.000';
  89. testTimeValues[3] := '23:59:59.003';
  90. BufDataset := TPersistentBufDataSet.Create(nil);
  91. with BufDataset do
  92. begin
  93. UniDirectional := FUniDirectional;
  94. FieldDefs.Add('ID',ftInteger);
  95. FieldDefs.Add('FSTRING',ftString,10);
  96. FieldDefs.Add('FSMALLINT',ftSmallint);
  97. FieldDefs.Add('FINTEGER',ftInteger);
  98. // Not supported by BufDataset:
  99. // FieldDefs.Add('FWORD',ftWord);
  100. FieldDefs.Add('FBOOLEAN',ftBoolean);
  101. FieldDefs.Add('FFLOAT',ftFloat);
  102. FieldDefs.Add('FCURRENCY',ftCurrency);
  103. FieldDefs.Add('FBCD',ftBCD);
  104. FieldDefs.Add('FDATE',ftDate);
  105. FieldDefs.Add('FTIME',ftTime);
  106. FieldDefs.Add('FDATETIME',ftDateTime);
  107. FieldDefs.Add('FLARGEINT',ftLargeint);
  108. CreateDataset;
  109. Open;
  110. for i := 0 to testValuesCount-1 do
  111. begin
  112. Append;
  113. FieldByName('ID').AsInteger := i;
  114. FieldByName('FSTRING').AsString := testStringValues[i];
  115. FieldByName('FSMALLINT').AsInteger := testSmallIntValues[i];
  116. FieldByName('FINTEGER').AsInteger := testIntValues[i];
  117. FieldByName('FBOOLEAN').AsBoolean := testBooleanValues[i];
  118. FieldByName('FFLOAT').AsFloat := testFloatValues[i];
  119. FieldByName('FCURRENCY').AsCurrency := testCurrencyValues[i];
  120. FieldByName('FBCD').AsCurrency := testCurrencyValues[i];
  121. FieldByName('FDATE').AsDateTime := StrToDateTime(testDateValues[i], Self.FormatSettings);
  122. FieldByName('FTIME').AsDateTime := StrToTime(testTimeValues[i], Self.FormatSettings);
  123. FieldByName('FLARGEINT').AsLargeInt := testLargeIntValues[i];
  124. Post;
  125. end;
  126. BufDataset.TempFileName:=GetTempFileName;
  127. BufDataset.FileName:=BufDataset.TempFileName;
  128. Close; // Save data into file
  129. end;
  130. Result := BufDataset;
  131. end;
  132. procedure TbufdatasetDBConnector.SetTestUniDirectional(const AValue: boolean);
  133. begin
  134. FUniDirectional := AValue;
  135. end;
  136. function TbufdatasetDBConnector.GetTestUniDirectional: boolean;
  137. begin
  138. Result := FUniDirectional;
  139. end;
  140. initialization
  141. RegisterClass(TbufdatasetDBConnector);
  142. end.