123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- unit Sqlite3DSToolsUnit;
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils, toolsunit
- ,db, Sqlite3DS
- ;
- const
- STestNotApplicable = 'This test does not apply to this sqlite3ds connection type';
- type
- { TSqlite3DSDBConnector }
- TSqlite3DSDBConnector = class(TDBConnector)
- private
- FDataset: TSqlite3Dataset;
- Function CreateDataset: TSqlite3Dataset;
- protected
- procedure CreateNDatasets; override;
- procedure CreateFieldDataset; override;
- procedure DropNDatasets; override;
- procedure DropFieldDataset; override;
- Function InternalGetNDataset(n : integer) : TDataset; override;
- Function InternalGetFieldDataset : TDataSet; override;
- public
- procedure TryDropIfExist(const ATableName : String);
- destructor Destroy; override;
- constructor Create; override;
- procedure ExecuteDirect(const SQL: string);
- end;
- implementation
- { TSqlite3DSDBConnector }
- function TSqlite3DSDBConnector.CreateDataset: TSqlite3Dataset;
- begin
- Result := TSqlite3Dataset.create(nil);
- Result.FileName := dbname;
- end;
- procedure TSqlite3DSDBConnector.CreateNDatasets;
- var CountID : Integer;
- begin
- try
- TryDropIfExist('FPDEV');
- FDataset.ExecSQL('create table FPDEV (' +
- ' ID INT NOT NULL, ' +
- ' NAME VARCHAR(50), ' +
- ' PRIMARY KEY (ID) ' +
- ')');
- FDataset.ExecSQL('BEGIN;');
- for countID := 1 to MaxDataSet do
- FDataset.ExecSQL('insert into FPDEV (ID,NAME) ' +
- 'values ('+inttostr(countID)+',''TestName'+inttostr(countID)+''')');
- FDataset.ExecSQL('COMMIT;');
- except
- on E: Exception do begin
- if dblogfilename<>'' then
- LogMessage('Custom','Exception running CreateNDatasets: '+E.Message);
- FDataset.ExecSQL('ROLLBACK;');
- end;
- end;
- end;
- procedure TSqlite3DSDBConnector.CreateFieldDataset;
- var
- FieldDataset: TSqlite3Dataset;
- i: Integer;
- begin
- FieldDataset := CreateDataset;
- try
- TryDropIfExist('FPDEV_FIELD');
- with FieldDataset do
- begin
- TableName := 'FPDEV_FIELD';
- PrimaryKey := 'ID';
- FieldDefs.Add('ID', ftInteger);
- FieldDefs.Add('FSTRING', ftString, 10);
- //FieldDefs.Add('FSMALLINT', ftSmallint);
- FieldDefs.Add('FINTEGER', ftInteger);
- FieldDefs.Add('FWORD', ftWord);
- FieldDefs.Add('FBOOLEAN', ftBoolean);
- FieldDefs.Add('FFLOAT', ftFloat);
- FieldDefs.Add('FCURRENCY', ftCurrency);
- //FieldDefs.Add('FBCD', ftBCD);
- FieldDefs.Add('FDATE', ftDate);
- FieldDefs.Add('FDATETIME', ftDateTime);
- FieldDefs.Add('FLARGEINT', ftLargeint);
- FieldDefs.Add('FMEMO', ftMemo);
- if not CreateTable then
- raise Exception.Create('Error in CreateTable: ' + FieldDataset.ReturnString);
- Open;
- for i := 0 to testValuesCount - 1 do
- begin
- Append;
- FieldByName('ID').AsInteger := i;
- FieldByName('FSTRING').AsString := testStringValues[i];
- //FieldByName('FSMALLINT').AsInteger := testSmallIntValues[i];
- FieldByName('FINTEGER').AsInteger := testIntValues[i];
- FieldByName('FWORD').AsInteger := testWordValues[i];
- FieldByName('FBOOLEAN').AsBoolean := testBooleanValues[i];
- FieldByName('FFLOAT').AsFloat := testFloatValues[i];
- FieldByName('FCURRENCY').AsCurrency := testCurrencyValues[i];
- // work around missing TBCDField.AsBCD:
- // FieldByName('FBCD').AsBCD := StrToBCD(testFmtBCDValues[i],Self.FormatSettings);
- FieldByName('FDATE').AsDateTime := StrToDate(testDateValues[i], 'yyyy/mm/dd', '-');
- FieldByName('FDATETIME').AsDateTime := StrToDateTime(testValues[ftDateTime,i], Self.FormatSettings);
- FieldByName('FLARGEINT').AsLargeInt := testLargeIntValues[i];
- FieldByName('FMEMO').AsString := testStringValues[i];
- Post;
- end;
- if not ApplyUpdates then
- raise Exception.Create('Error in ApplyUpdates: ' + FieldDataset.ReturnString);
- Destroy;
- end;
- except
- on E: Exception do begin
- if dblogfilename<>'' then
- LogMessage('Custom','Exception running CreateFieldDataset: '+E.Message);
- FDataset.ExecSQL('ROLLBACK;');
- end;
- end;
- end;
- procedure TSqlite3DSDBConnector.DropNDatasets;
- begin
- try
- FDataset.ExecSQL('DROP TABLE FPDEV');
- Except
- on E: Exception do begin
- if dblogfilename<>'' then
- LogMessage('Custom','Exception running DropNDatasets: '+E.Message);
- FDataset.ExecSQL('ROLLBACK;');
- end;
- end;
- end;
- procedure TSqlite3DSDBConnector.DropFieldDataset;
- begin
- try
- FDataset.ExecSQL('DROP TABLE FPDEV_FIELD');
- Except
- on E: Exception do begin
- if dblogfilename<>'' then
- LogMessage('Custom','Exception running DropFieldDataset: '+E.Message);
- FDataset.ExecSQL('ROLLBACK;');
- end;
- end;
- end;
- function TSqlite3DSDBConnector.InternalGetNDataset(n: integer): TDataset;
- begin
- Result := CreateDataset;
- with (Result as TSqlite3Dataset) do
- begin
- sql := 'SELECT * FROM FPDEV WHERE ID < '+inttostr(n+1)+' ORDER BY ID';
- end;
- end;
- function TSqlite3DSDBConnector.InternalGetFieldDataset: TDataSet;
- begin
- Result := CreateDataset;
- with (Result as TSqlite3Dataset) do
- begin
- sql := 'SELECT * FROM FPDEV_FIELD';
- end;
- end;
- procedure TSqlite3DSDBConnector.TryDropIfExist(const ATableName: String);
- begin
- FDataset.ExecSQL('drop table if exists ' + ATableName);
- end;
- procedure TSqlite3DSDBConnector.ExecuteDirect(const SQL: string);
- begin
- FDataset.ExecSQL(SQL);
- end;
- destructor TSqlite3DSDBConnector.Destroy;
- begin
- inherited Destroy;
- FDataset.Destroy;
- end;
- constructor TSqlite3DSDBConnector.Create;
- begin
- FDataset := CreateDataset;
- Inherited;
- end;
- initialization
- RegisterClass(TSqlite3DSDBConnector);
- end.
|