sqlite3dstoolsunit.pas 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. unit Sqlite3DSToolsUnit;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, toolsunit
  6. ,db, Sqlite3DS
  7. ;
  8. const
  9. STestNotApplicable = 'This test does not apply to this sqlite3ds connection type';
  10. type
  11. { TSqlite3DSDBConnector }
  12. TSqlite3DSDBConnector = class(TDBConnector)
  13. private
  14. FDataset: TSqlite3Dataset;
  15. Function CreateDataset: TSqlite3Dataset;
  16. protected
  17. procedure CreateNDatasets; override;
  18. procedure CreateFieldDataset; override;
  19. procedure DropNDatasets; override;
  20. procedure DropFieldDataset; override;
  21. Function InternalGetNDataset(n : integer) : TDataset; override;
  22. Function InternalGetFieldDataset : TDataSet; override;
  23. public
  24. procedure TryDropIfExist(const ATableName : String);
  25. destructor Destroy; override;
  26. constructor Create; override;
  27. procedure ExecuteDirect(const SQL: string);
  28. end;
  29. implementation
  30. { TSqlite3DSDBConnector }
  31. function TSqlite3DSDBConnector.CreateDataset: TSqlite3Dataset;
  32. begin
  33. Result := TSqlite3Dataset.create(nil);
  34. Result.FileName := dbname;
  35. end;
  36. procedure TSqlite3DSDBConnector.CreateNDatasets;
  37. var CountID : Integer;
  38. begin
  39. try
  40. TryDropIfExist('FPDEV');
  41. FDataset.ExecSQL('create table FPDEV (' +
  42. ' ID INT NOT NULL, ' +
  43. ' NAME VARCHAR(50), ' +
  44. ' PRIMARY KEY (ID) ' +
  45. ')');
  46. FDataset.ExecSQL('BEGIN;');
  47. for countID := 1 to MaxDataSet do
  48. FDataset.ExecSQL('insert into FPDEV (ID,NAME) ' +
  49. 'values ('+inttostr(countID)+',''TestName'+inttostr(countID)+''')');
  50. FDataset.ExecSQL('COMMIT;');
  51. except
  52. on E: Exception do begin
  53. if dblogfilename<>'' then
  54. LogMessage('Custom','Exception running CreateNDatasets: '+E.Message);
  55. FDataset.ExecSQL('ROLLBACK;');
  56. end;
  57. end;
  58. end;
  59. procedure TSqlite3DSDBConnector.CreateFieldDataset;
  60. var
  61. FieldDataset: TSqlite3Dataset;
  62. i: Integer;
  63. begin
  64. FieldDataset := CreateDataset;
  65. try
  66. TryDropIfExist('FPDEV_FIELD');
  67. with FieldDataset do
  68. begin
  69. TableName := 'FPDEV_FIELD';
  70. PrimaryKey := 'ID';
  71. FieldDefs.Add('ID', ftInteger);
  72. FieldDefs.Add('FSTRING', ftString, 10);
  73. //FieldDefs.Add('FSMALLINT', ftSmallint);
  74. FieldDefs.Add('FINTEGER', ftInteger);
  75. FieldDefs.Add('FWORD', ftWord);
  76. FieldDefs.Add('FBOOLEAN', ftBoolean);
  77. FieldDefs.Add('FFLOAT', ftFloat);
  78. FieldDefs.Add('FCURRENCY', ftCurrency);
  79. //FieldDefs.Add('FBCD', ftBCD);
  80. FieldDefs.Add('FDATE', ftDate);
  81. FieldDefs.Add('FDATETIME', ftDateTime);
  82. FieldDefs.Add('FLARGEINT', ftLargeint);
  83. FieldDefs.Add('FMEMO', ftMemo);
  84. if not CreateTable then
  85. raise Exception.Create('Error in CreateTable: ' + FieldDataset.ReturnString);
  86. Open;
  87. for i := 0 to testValuesCount - 1 do
  88. begin
  89. Append;
  90. FieldByName('ID').AsInteger := i;
  91. FieldByName('FSTRING').AsString := testStringValues[i];
  92. //FieldByName('FSMALLINT').AsInteger := testSmallIntValues[i];
  93. FieldByName('FINTEGER').AsInteger := testIntValues[i];
  94. FieldByName('FWORD').AsInteger := testWordValues[i];
  95. FieldByName('FBOOLEAN').AsBoolean := testBooleanValues[i];
  96. FieldByName('FFLOAT').AsFloat := testFloatValues[i];
  97. FieldByName('FCURRENCY').AsCurrency := testCurrencyValues[i];
  98. // work around missing TBCDField.AsBCD:
  99. // FieldByName('FBCD').AsBCD := StrToBCD(testFmtBCDValues[i],Self.FormatSettings);
  100. FieldByName('FDATE').AsDateTime := StrToDate(testDateValues[i], 'yyyy/mm/dd', '-');
  101. FieldByName('FDATETIME').AsDateTime := StrToDateTime(testValues[ftDateTime,i], Self.FormatSettings);
  102. FieldByName('FLARGEINT').AsLargeInt := testLargeIntValues[i];
  103. FieldByName('FMEMO').AsString := testStringValues[i];
  104. Post;
  105. end;
  106. ApplyUpdates;
  107. Destroy;
  108. end;
  109. except
  110. on E: Exception do begin
  111. if dblogfilename<>'' then
  112. LogMessage('Custom','Exception running CreateFieldDataset: '+E.Message);
  113. FDataset.ExecSQL('ROLLBACK;');
  114. end;
  115. end;
  116. end;
  117. procedure TSqlite3DSDBConnector.DropNDatasets;
  118. begin
  119. try
  120. FDataset.ExecSQL('DROP TABLE FPDEV');
  121. Except
  122. on E: Exception do begin
  123. if dblogfilename<>'' then
  124. LogMessage('Custom','Exception running DropNDatasets: '+E.Message);
  125. FDataset.ExecSQL('ROLLBACK;');
  126. end;
  127. end;
  128. end;
  129. procedure TSqlite3DSDBConnector.DropFieldDataset;
  130. begin
  131. try
  132. FDataset.ExecSQL('DROP TABLE FPDEV_FIELD');
  133. Except
  134. on E: Exception do begin
  135. if dblogfilename<>'' then
  136. LogMessage('Custom','Exception running DropFieldDataset: '+E.Message);
  137. FDataset.ExecSQL('ROLLBACK;');
  138. end;
  139. end;
  140. end;
  141. function TSqlite3DSDBConnector.InternalGetNDataset(n: integer): TDataset;
  142. begin
  143. Result := CreateDataset;
  144. with (Result as TSqlite3Dataset) do
  145. begin
  146. sql := 'SELECT * FROM FPDEV WHERE ID < '+inttostr(n+1)+' ORDER BY ID';
  147. end;
  148. end;
  149. function TSqlite3DSDBConnector.InternalGetFieldDataset: TDataSet;
  150. begin
  151. Result := CreateDataset;
  152. with (Result as TSqlite3Dataset) do
  153. begin
  154. sql := 'SELECT * FROM FPDEV_FIELD';
  155. end;
  156. end;
  157. procedure TSqlite3DSDBConnector.TryDropIfExist(const ATableName: String);
  158. begin
  159. FDataset.ExecSQL('drop table if exists ' + ATableName);
  160. end;
  161. procedure TSqlite3DSDBConnector.ExecuteDirect(const SQL: string);
  162. begin
  163. FDataset.ExecSQL(SQL);
  164. end;
  165. destructor TSqlite3DSDBConnector.Destroy;
  166. begin
  167. inherited Destroy;
  168. FDataset.Destroy;
  169. end;
  170. constructor TSqlite3DSDBConnector.Create;
  171. begin
  172. FDataset := CreateDataset;
  173. Inherited;
  174. end;
  175. initialization
  176. RegisterClass(TSqlite3DSDBConnector);
  177. end.