sqlite3dstoolsunit.pas 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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. if not ApplyUpdates then
  107. raise Exception.Create('Error in ApplyUpdates: ' + FieldDataset.ReturnString);
  108. Destroy;
  109. end;
  110. except
  111. on E: Exception do begin
  112. if dblogfilename<>'' then
  113. LogMessage('Custom','Exception running CreateFieldDataset: '+E.Message);
  114. FDataset.ExecSQL('ROLLBACK;');
  115. end;
  116. end;
  117. end;
  118. procedure TSqlite3DSDBConnector.DropNDatasets;
  119. begin
  120. try
  121. FDataset.ExecSQL('DROP TABLE FPDEV');
  122. Except
  123. on E: Exception do begin
  124. if dblogfilename<>'' then
  125. LogMessage('Custom','Exception running DropNDatasets: '+E.Message);
  126. FDataset.ExecSQL('ROLLBACK;');
  127. end;
  128. end;
  129. end;
  130. procedure TSqlite3DSDBConnector.DropFieldDataset;
  131. begin
  132. try
  133. FDataset.ExecSQL('DROP TABLE FPDEV_FIELD');
  134. Except
  135. on E: Exception do begin
  136. if dblogfilename<>'' then
  137. LogMessage('Custom','Exception running DropFieldDataset: '+E.Message);
  138. FDataset.ExecSQL('ROLLBACK;');
  139. end;
  140. end;
  141. end;
  142. function TSqlite3DSDBConnector.InternalGetNDataset(n: integer): TDataset;
  143. begin
  144. Result := CreateDataset;
  145. with (Result as TSqlite3Dataset) do
  146. begin
  147. sql := 'SELECT * FROM FPDEV WHERE ID < '+inttostr(n+1)+' ORDER BY ID';
  148. end;
  149. end;
  150. function TSqlite3DSDBConnector.InternalGetFieldDataset: TDataSet;
  151. begin
  152. Result := CreateDataset;
  153. with (Result as TSqlite3Dataset) do
  154. begin
  155. sql := 'SELECT * FROM FPDEV_FIELD';
  156. end;
  157. end;
  158. procedure TSqlite3DSDBConnector.TryDropIfExist(const ATableName: String);
  159. begin
  160. FDataset.ExecSQL('drop table if exists ' + ATableName);
  161. end;
  162. procedure TSqlite3DSDBConnector.ExecuteDirect(const SQL: string);
  163. begin
  164. FDataset.ExecSQL(SQL);
  165. end;
  166. destructor TSqlite3DSDBConnector.Destroy;
  167. begin
  168. inherited Destroy;
  169. FDataset.Destroy;
  170. end;
  171. constructor TSqlite3DSDBConnector.Create;
  172. begin
  173. FDataset := CreateDataset;
  174. Inherited;
  175. end;
  176. initialization
  177. RegisterClass(TSqlite3DSDBConnector);
  178. end.