mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-28 19:33:50 +02:00
203 lines
5.7 KiB
ObjectPascal
203 lines
5.7 KiB
ObjectPascal
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. |