Patch from Luiz Americo, bug #12703

- Format code to get consistent use of spacing, indentation and capitalization.

git-svn-id: trunk@12242 -
This commit is contained in:
joost 2008-11-27 11:03:02 +00:00
parent 1446eb9dc2
commit 332d850f1e
3 changed files with 577 additions and 569 deletions

View File

@ -1,4 +1,4 @@
unit customsqliteds;
unit CustomSqliteDS;
{
This is TCustomSqliteDataset, a TDataset descendant class for use with fpc compiler
@ -39,13 +39,13 @@ unit customsqliteds;
interface
uses
Classes, SysUtils, Db;
Classes, SysUtils, db;
type
PDataRecord = ^DataRecord;
PPDataRecord = ^PDataRecord;
DataRecord = record
Row: PPchar;
Row: PPChar;
BookmarkFlag: TBookmarkFlag;
Next: PDataRecord;
Previous: PDataRecord;
@ -57,17 +57,17 @@ type
FFieldRow: PChar;
FFieldIndex: Integer;
FRowSize: Integer;
FPosition: Longint;
FPosition: LongInt;
public
constructor Create(const ActiveItem: PDataRecord; FieldIndex: Integer);
function Write(const Buffer; Count: Longint): Longint; override;
function Read(var Buffer; Count: Longint): Longint; override;
function Seek(Offset: Longint; Origin: Word): Longint; override;
function Write(const Buffer; Count: LongInt): LongInt; override;
function Read(var Buffer; Count: LongInt): LongInt; override;
function Seek(Offset: LongInt; Origin: Word): LongInt; override;
end;
//callback types
TSqliteCdeclCallback = function(UserData: Pointer; Count: LongInt; Values: PPChar; Names: PPChar): LongInt; cdecl;
TSqliteCallback = function (UserData:Pointer; Count:LongInt; Values:PPChar; Names:PPChar):LongInt of Object;
TSqliteCallback = function(UserData: Pointer; Count: LongInt; Values: PPChar; Names: PPChar): LongInt of object;
TCallbackInfo = record
Proc: TSqliteCallback;
Data: Pointer;
@ -76,7 +76,7 @@ type
TRecordState = (rsAdded, rsDeleted, rsUpdated);
TRecordStateSet = set of TRecordState;
TQueryUpdatesCallback = procedure (UserData: Pointer; Values: PPChar; ABookmark: TBookmark; RecordState: TRecordState) of Object;
TQueryUpdatesCallback = procedure(UserData: Pointer; Values: PPChar; ABookmark: TBookmark; RecordState: TRecordState) of object;
TGetSqlStrFunction = function(APChar: PChar): String;
@ -100,7 +100,7 @@ type
FIndexFieldList: TList;
FOnGetHandle: TDataSetNotifyEvent;
FOptions: TSqliteOptions;
FSqlList:TStrings;
FSQLList: TStrings;
procedure CopyCacheToItem(AItem: PDataRecord);
function GetIndexFields(Value: Integer): TField;
procedure SetMasterIndexValue;
@ -111,7 +111,7 @@ type
FPrimaryKey: String;
FPrimaryKeyNo: Integer;
FFileName: String;
FSql: String;
FSQL: String;
FTableName: String;
FSelectSqlStr: String;
FAutoIncFieldNo: Integer;
@ -190,9 +190,9 @@ type
function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint; override;
function GetFieldData(Field: TField; Buffer: Pointer): Boolean; override;
function GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean): Boolean; override;
function Locate(const KeyFields: string; const KeyValues: Variant; LocateOptions: TLocateOptions) : Boolean; override;
function LocateNext(const KeyFields: string; const KeyValues: Variant; LocateOptions: TLocateOptions) : Boolean;
function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant;override;
function Locate(const KeyFields: String; const KeyValues: Variant; LocateOptions: TLocateOptions) : Boolean; override;
function LocateNext(const KeyFields: String; const KeyValues: Variant; LocateOptions: TLocateOptions) : Boolean;
function Lookup(const KeyFields: String; const KeyValues: Variant; const ResultFields: String): Variant; override;
// Additional procedures
function ApplyUpdates: Boolean;
function CreateTable: Boolean;
@ -223,7 +223,7 @@ type
property ReturnCode: Integer read FReturnCode;
property SqliteHandle: Pointer read FSqliteHandle;
property SqliteVersion: String read GetSqliteVersion;
property SQLList:TStrings read FSqlList;
property SQLList:TStrings read FSQLList;
published
property AutoIncrementKey: Boolean read FAutoIncrementKey write FAutoIncrementKey;
property IndexFieldNames: string read FIndexFieldNames write FIndexFieldNames;
@ -234,10 +234,10 @@ type
property PrimaryKey: String read FPrimaryKey write FPrimaryKey;
property SaveOnClose: Boolean read FSaveOnClose write FSaveOnClose;
property SaveOnRefetch: Boolean read FSaveOnRefetch write FSaveOnRefetch;
property SQL: String read FSql write FSql;
property SQL: String read FSQL write FSQL;
property TableName: String read FTableName write FTableName;
property MasterSource: TDataSource read GetMasterSource write SetMasterSource;
property MasterFields: string read GetMasterFields write SetMasterFields;
property MasterFields: String read GetMasterFields write SetMasterFields;
property Active;
@ -266,8 +266,8 @@ type
property OnPostError;
end;
function Num2SqlStr(APChar: PChar): String;
function Char2SqlStr(APChar: PChar): String;
function Num2SQLStr(APChar: PChar): String;
function Char2SQLStr(APChar: PChar): String;
implementation
@ -289,7 +289,7 @@ begin
Result:= Proc(Data, Count, Values, Names);
end;
function Num2SqlStr(APChar: PChar): String;
function Num2SQLStr(APChar: PChar): String;
begin
if APChar = nil then
begin
@ -299,7 +299,7 @@ begin
Result := String(APChar);
end;
function Char2SqlStr(APChar: PChar): String;
function Char2SQLStr(APChar: PChar): String;
begin
if APChar = nil then
begin
@ -328,7 +328,7 @@ begin
// FRowSize := 0;
end;
function TDSStream.Seek(Offset: Longint; Origin: Word): Longint;
function TDSStream.Seek(Offset: LongInt; Origin: Word): LongInt;
begin
Case Origin of
soFromBeginning : FPosition := Offset;
@ -338,7 +338,7 @@ begin
Result := FPosition;
end;
function TDSStream.Write(const Buffer; Count: Longint): Longint;
function TDSStream.Write(const Buffer; Count: LongInt): LongInt;
var
NewRow: PChar;
begin
@ -367,7 +367,7 @@ begin
Inc(FPosition, Count);
end;
function TDSStream.Read(var Buffer; Count: Longint): Longint;
function TDSStream.Read(var Buffer; Count: Longint): LongInt;
var
BytesToMove: Integer;
begin
@ -405,8 +405,8 @@ begin
FBeginItem^.Previous := nil;
FEndItem^.Next := nil;
FBeginItem^.BookMarkFlag := bfBOF;
FEndItem^.BookMarkFlag := bfEOF;
FBeginItem^.BookmarkFlag := bfBOF;
FEndItem^.BookmarkFlag := bfEOF;
FMasterLink := TMasterDataLink.Create(Self);
FMasterLink.OnMasterChange := @MasterChanged;
@ -416,7 +416,7 @@ begin
FUpdatedItems := TFPList.Create;
FAddedItems := TFPList.Create;
FDeletedItems := TFPList.Create;
FSqlList := TStringList.Create;
FSQLList := TStringList.Create;
inherited Create(AOwner);
end;
@ -468,7 +468,7 @@ begin
FDeletedItems.Destroy;
FMasterLink.Destroy;
FIndexFieldList.Destroy;
FSqlList.Destroy;
FSQLList.Destroy;
// dispose special items
Dispose(FBeginItem);
Dispose(FCacheItem);
@ -493,7 +493,7 @@ begin
end;
function TCustomSqliteDataset.CompareBookmarks(Bookmark1, Bookmark2: TBookmark
): Longint;
): LongInt;
var
TempItem: PDataRecord;
begin
@ -681,16 +681,14 @@ begin
TempItem := FBeginItem;
TempActive := PPDataRecord(ActiveBuffer)^;
if TempActive = FCacheItem then // Record is being edited
begin
TempActive := FInternalActiveBuffer;
end;
//RecNo is 1 based
inc(Result);
Inc(Result);
while TempActive <> TempItem do
begin
if TempItem^.Next <> nil then
begin
inc(Result);
Inc(Result);
TempItem := TempItem^.Next;
end
else
@ -841,18 +839,16 @@ end;
procedure TCustomSqliteDataset.InternalOpen;
var
i: Integer;
begin
if FMasterLink.DataSource <> nil then
begin
//todo: retrieve only necessary fields
FSql := 'Select * from '+FTableName+';'; // forced to obtain all fields
end;
if FMasterLink.DataSource <> nil then
FSQL := 'Select * from ' + FTableName + ';'; //forced to obtain all fields
if FSql = '' then
if FSQL = '' then
begin
if FTablename = '' then
DatabaseError('Tablename not set',Self);
FSql := 'Select * from '+FTableName+';';
FSQL := 'Select * from '+FTableName+';';
end;
if FSqliteHandle = nil then
@ -875,7 +871,7 @@ begin
begin
if FIndexFieldList.Count <> FMasterLink.Fields.Count then
DatabaseError('MasterFields count doesn''t match IndexFields count', Self);
//Set FSql considering MasterSource active record
//Set FSQL considering MasterSource active record
SetDetailFilter;
end;
@ -1055,13 +1051,13 @@ begin
AFieldList.Destroy;
end;
{$ifdef DEBUG_SQLITEDS}
writeln('##TCustomSqliteDataset.FindRecordItem##');
writeln(' KeyFields: ', KeyFields);
WriteLn('##TCustomSqliteDataset.FindRecordItem##');
WriteLn(' KeyFields: ', KeyFields);
for i := 0 to AFieldCount - 1 do
begin
writeln('LocateFields[',i,']');
writeln(' Key: ', LocateFields[i].Key);
writeln(' Index: ', LocateFields[i].Index);
WriteLn('LocateFields[', i, ']');
WriteLn(' Key: ', LocateFields[i].Key);
WriteLn(' Index: ', LocateFields[i].Index);
end;
{$endif}
//Search the list
@ -1075,7 +1071,7 @@ begin
if not CompFunction(TempItem^.Row[Index], Key) then
begin
MatchRecord := False;
Break;//for
break; //for
end;
end;
if MatchRecord then
@ -1088,7 +1084,7 @@ begin
Resync([]);
DoAfterScroll;
end;
Break;//while
break; //while
end;
TempItem := TempItem^.Next;
end;
@ -1113,19 +1109,19 @@ begin
Dispose(AItem);
end;
function TCustomSqliteDataset.Locate(const KeyFields: string; const KeyValues: Variant; LocateOptions: TLocateOptions) : Boolean;
function TCustomSqliteDataset.Locate(const KeyFields: String; const KeyValues: Variant; LocateOptions: TLocateOptions): Boolean;
begin
CheckBrowseMode;
Result := FindRecordItem(FBeginItem^.Next, KeyFields, KeyValues, LocateOptions, True) <> nil;
end;
function TCustomSqliteDataset.LocateNext(const KeyFields: string; const KeyValues: Variant; LocateOptions: TLocateOptions) : Boolean;
function TCustomSqliteDataset.LocateNext(const KeyFields: String; const KeyValues: Variant; LocateOptions: TLocateOptions): Boolean;
begin
CheckBrowseMode;
Result := FindRecordItem(PPDataRecord(ActiveBuffer)^^.Next, KeyFields, KeyValues, LocateOptions, True) <> nil;
end;
function TCustomSqliteDataset.Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant;
function TCustomSqliteDataset.Lookup(const KeyFields: String; const KeyValues: Variant; const ResultFields: String): Variant;
var
TempItem: PDataRecord;
begin
@ -1195,7 +1191,7 @@ begin
ftFloat, ftDateTime, ftDate, ftTime, ftCurrency:
begin
Str(Double(Buffer^), TempStr);
//Str returns a space as the first character for positive values
//Str returns an space as the first character for positive values
//and the - sign for negative values. It's necessary to remove the extra
//space while keeping the - sign
if TempStr[1] = ' ' then
@ -1258,8 +1254,11 @@ procedure TCustomSqliteDataset.SetDetailFilter;
if not AField.IsNull then
begin
case AField.DataType of
ftString,ftMemo: Result:='"'+AField.AsString+'"';//todo: handle " caracter properly
ftDateTime,ftDate,ftTime:Str(AField.AsDateTime,Result);
//todo: handle " caracter properly
ftString, ftMemo:
Result := '"' + AField.AsString + '"';
ftDateTime, ftDate, ftTime:
Str(AField.AsDateTime, Result);
else
Result := AField.AsString;
end; //case
@ -1273,7 +1272,7 @@ var
i: Integer;
begin
if FMasterLink.Dataset.RecordCount = 0 then //Retrieve all data
FSql:='Select * from '+FTableName
FSQL := 'Select * from ' + FTableName
else
begin
AFilter := ' where ';
@ -1283,7 +1282,7 @@ begin
if i <> FMasterLink.Fields.Count - 1 then
AFilter := AFilter + ' and ';
end;
FSql:='Select * from '+FTableName+AFilter;
FSQL := 'Select * from ' + FTableName + AFilter;
end;
end;
@ -1291,16 +1290,16 @@ procedure TCustomSqliteDataset.MasterChanged(Sender: TObject);
begin
SetDetailFilter;
{$ifdef DEBUG_SQLITEDS}
writeln('##TCustomSqliteDataset.MasterChanged##');
writeln(' SQL used to filter detail dataset:');
writeln(' ',FSql);
WriteLn('##TCustomSqliteDataset.MasterChanged##');
WriteLn(' SQL used to filter detail dataset:');
WriteLn(' ', FSQL);
{$endif}
RefetchData;
end;
procedure TCustomSqliteDataset.MasterDisabled(Sender: TObject);
begin
FSql:='Select * from '+FTableName+';';
FSQL := 'Select * from ' + FTableName + ';';
RefetchData;
end;
@ -1356,29 +1355,29 @@ begin
FMasterLink.DataSource := Value;
end;
procedure TCustomSqliteDataset.ExecSQL(const ASql:String);
procedure TCustomSqliteDataset.ExecSQL(const ASQL: String);
begin
if FSqliteHandle = nil then
GetSqliteHandle;
ExecuteDirect(ASql);
ExecuteDirect(ASQL);
end;
procedure TCustomSqliteDataset.ExecSQLList;
begin
if FSqliteHandle = nil then
GetSqliteHandle;
SqliteExec(PChar(FSqlList.Text),nil,nil);
SqliteExec(PChar(FSQLList.Text), nil, nil);
end;
procedure TCustomSqliteDataset.ExecSQL;
begin
ExecSQL(FSql);
ExecSQL(FSQL);
end;
function TCustomSqliteDataset.ApplyUpdates: Boolean;
var
iFields, iItems, StatementsCounter, TempReturnCode: Integer;
SqlTemp,WhereKeyNameEqual,ASqlLine,TemplateStr:String;
SQLTemp, WhereKeyNameEqual, SQLLine, TemplateStr: String;
TempItem: PDataRecord;
begin
CheckBrowseMode;
@ -1400,26 +1399,26 @@ begin
WriteLn(' PrimaryKey: ', WhereKeyNameEqual);
WriteLn(' PrimaryKeyNo: ', FPrimaryKeyNo);
{$endif}
SqlTemp:='BEGIN;';
SQLTemp := 'BEGIN;';
// Delete Records
if FDeletedItems.Count > 0 then
TemplateStr := 'DELETE FROM ' + FTableName + WhereKeyNameEqual;
for iItems := 0 to FDeletedItems.Count - 1 do
begin
TempItem := PDataRecord(FDeletedItems.List^[iItems]);
SqlTemp:=SqlTemp+(TemplateStr+
SQLTemp := SQLTemp + (TemplateStr +
String(TempItem^.Row[FPrimaryKeyNo]) + ';');
FreeItem(TempItem);
inc(StatementsCounter);
//ApplyUpdates each 400 statements
if StatementsCounter = 400 then
begin
SqlTemp:=SqlTemp+'COMMIT;';
TempReturnCode := SqliteExec(PChar(SqlTemp),nil,nil);
SQLTemp := SQLTemp + 'COMMIT;';
TempReturnCode := SqliteExec(PChar(SQLTemp), nil, nil);
if TempReturnCode <> SQLITE_OK then
FReturnCode := TempReturnCode;
StatementsCounter := 0;
SqlTemp:='BEGIN;';
SQLTemp := 'BEGIN;';
end;
end;
// Update changed records
@ -1427,27 +1426,28 @@ begin
TemplateStr := 'UPDATE ' + FTableName + ' SET ';
for iItems := 0 to FUpdatedItems.Count - 1 do
begin
ASqlLine:=TemplateStr;
SQLLine := TemplateStr;
for iFields := 0 to Fields.Count - 2 do
begin
ASqlLine:=ASqlLine + (Fields[iFields].FieldName +' = '+
SQLLine := SQLLine + (Fields[iFields].FieldName + ' = ' +
FGetSqlStr[iFields](PDataRecord(FUpdatedItems[iItems])^.Row[iFields]) + ',');
end;
iFields := Fields.Count - 1;
ASqlLine:=ASqlLine + (Fields[iFields].FieldName +' = '+
SQLLine := SQLLine + (Fields[iFields].FieldName + ' = ' +
FGetSqlStr[iFields](PDataRecord(FUpdatedItems[iItems])^.Row[iFields]) +
WhereKeyNameEqual+String(PDataRecord(FUpdatedItems[iItems])^.Row[FPrimaryKeyNo])+';');
SqlTemp:=SqlTemp + ASqlLine;
WhereKeyNameEqual +
String(PDataRecord(FUpdatedItems[iItems])^.Row[FPrimaryKeyNo]) + ';');
SQLTemp := SQLTemp + SQLLine;
inc(StatementsCounter);
//ApplyUpdates each 400 statements
if StatementsCounter = 400 then
begin
SqlTemp:=SqlTemp+'COMMIT;';
TempReturnCode := SqliteExec(PChar(SqlTemp),nil,nil);
SQLTemp := SQLTemp + 'COMMIT;';
TempReturnCode := SqliteExec(PChar(SQLTemp), nil, nil);
if TempReturnCode <> SQLITE_OK then
FReturnCode := TempReturnCode;
StatementsCounter := 0;
SqlTemp:='BEGIN;';
SQLTemp := 'BEGIN;';
end;
end;
// Add new records
@ -1461,41 +1461,38 @@ begin
end;
for iItems := 0 to FAddedItems.Count - 1 do
begin
ASqlLine:=TemplateStr;
SQLLine := TemplateStr;
for iFields := 0 to Fields.Count - 2 do
begin
ASqlLine:=ASqlLine + (FGetSqlStr[iFields](PDataRecord(FAddedItems[iItems])^.Row[iFields])+',');
end;
//todo: see if i can assume iFields = Fields.Count-2 safely
SQLLine := SQLLine + (FGetSqlStr[iFields](PDataRecord(FAddedItems[iItems])^.Row[iFields]) + ',');
iFields := Fields.Count - 1;
ASqlLine:=ASqlLine + (FGetSqlStr[iFields](PDataRecord(FAddedItems[iItems])^.Row[iFields])+');');
SqlTemp:=SqlTemp + ASqlLine;
inc(StatementsCounter);
SQLLine := SQLLine + (FGetSqlStr[iFields](PDataRecord(FAddedItems[iItems])^.Row[iFields]) + ');' );
SQLTemp := SQLTemp + SQLLine;
Inc(StatementsCounter);
//ApplyUpdates each 400 statements
if StatementsCounter = 400 then
begin
SqlTemp:=SqlTemp+'COMMIT;';
TempReturnCode := SqliteExec(PChar(SqlTemp),nil,nil);
SQLTemp := SQLTemp + 'COMMIT;';
TempReturnCode := SqliteExec(PChar(SQLTemp), nil, nil);
if TempReturnCode <> SQLITE_OK then
FReturnCode := TempReturnCode;
StatementsCounter := 0;
SqlTemp:='BEGIN;';
SQLTemp := 'BEGIN;';
end;
end;
SqlTemp:=SqlTemp+'COMMIT;';
SQLTemp := SQLTemp + 'COMMIT;';
{$ifdef DEBUG_SQLITEDS}
writeln(' SQL: ',SqlTemp);
WriteLn(' SQL: ',SqlTemp);
{$endif}
FAddedItems.Clear;
FUpdatedItems.Clear;
FDeletedItems.Clear;
TempReturnCode := SqliteExec(PChar(SqlTemp),nil,nil);
TempReturnCode := SqliteExec(PChar(SQLTemp), nil, nil);
if TempReturnCode <> SQLITE_OK then
FReturnCode := TempReturnCode;
Result := FReturnCode = SQLITE_OK;
end;
{$ifdef DEBUG_SQLITEDS}
writeln(' Result: ',Result);
WriteLn(' Result: ', Result);
{$endif}
end;
@ -1506,11 +1503,11 @@ end;
function TCustomSqliteDataset.CreateTable(const ATableName: String): Boolean;
var
SqlTemp:String;
SQLTemp: String;
i: Integer;
begin
{$ifdef DEBUG_SQLITEDS}
writeln('##TCustomSqliteDataset.CreateTable##');
WriteLn('##TCustomSqliteDataset.CreateTable##');
if ATableName = '' then
WriteLn(' TableName Not Set');
if FieldDefs.Count = 0 then
@ -1518,56 +1515,57 @@ begin
{$endif}
if (ATableName <> '') and (FieldDefs.Count > 0) then
begin
SqlTemp:='CREATE TABLE '+ATableName+' (';
SQLTemp := 'CREATE TABLE ' + ATableName + ' (';
for i := 0 to FieldDefs.Count - 1 do
begin
//todo: add index to autoinc field
SqlTemp:=SqlTemp + FieldDefs[i].Name;
SQLTemp := SQLTemp + FieldDefs[i].Name;
case FieldDefs[i].DataType of
ftInteger:
SqlTemp:=SqlTemp + ' INTEGER';
SQLTemp := SQLTemp + ' INTEGER';
ftString:
SqlTemp:=SqlTemp + ' VARCHAR';
SQLTemp := SQLTemp + ' VARCHAR';
ftBoolean:
SqlTemp:=SqlTemp + ' BOOL_INT';
SQLTemp := SQLTemp + ' BOOL_INT';
ftFloat:
SqlTemp:=SqlTemp + ' FLOAT';
SQLTemp := SQLTemp + ' FLOAT';
ftWord:
SqlTemp:=SqlTemp + ' WORD';
SQLTemp := SQLTemp + ' WORD';
ftDateTime:
SqlTemp:=SqlTemp + ' DATETIME';
SQLTemp := SQLTemp + ' DATETIME';
ftDate:
SqlTemp:=SqlTemp + ' DATE';
SQLTemp := SQLTemp + ' DATE';
ftTime:
SqlTemp:=SqlTemp + ' TIME';
SQLTemp := SQLTemp + ' TIME';
ftLargeInt:
SqlTemp:=SqlTemp + ' LARGEINT';
SQLTemp := SQLTemp + ' LARGEINT';
ftCurrency:
SqlTemp:=SqlTemp + ' CURRENCY';
SQLTemp := SQLTemp + ' CURRENCY';
ftAutoInc:
SqlTemp:=SqlTemp + ' AUTOINC_INT';
SQLTemp := SQLTemp + ' AUTOINC_INT';
ftMemo:
SqlTemp:=SqlTemp + ' TEXT';
SQLTemp := SQLTemp + ' TEXT';
else
DatabaseError('Field type "'+FieldTypeNames[FieldDefs[i].DataType]+'" not supported',Self);
DatabaseError('Field type "' + FieldTypeNames[FieldDefs[i].DataType] +
'" not supported', Self);
end;
if UpperCase(FieldDefs[i].Name) = UpperCase(FPrimaryKey) then
SqlTemp:=SqlTemp + ' PRIMARY KEY';
SQLTemp := SQLTemp + ' PRIMARY KEY';
if i <> FieldDefs.Count - 1 then
SqlTemp:=SqlTemp+ ' , ';
SQLTemp := SQLTemp + ' , ';
end;
SqlTemp:=SqlTemp+');';
SQLTemp := SQLTemp + ');';
{$ifdef DEBUG_SQLITEDS}
writeln(' SQL: ',SqlTemp);
WriteLn(' SQL: ',SqlTemp);
{$endif}
ExecSQL(SqlTemp);
ExecSQL(SQLTemp);
Result := FReturnCode = SQLITE_OK;
end
else
Result := False;
end;
procedure TCustomSqliteDataset.ExecCallback(const ASql: String; UserData: Pointer = nil);
procedure TCustomSqliteDataset.ExecCallback(const ASQL: String; UserData: Pointer = nil);
var
CallbackInfo: TCallbackInfo;
begin
@ -1577,7 +1575,7 @@ begin
GetSqliteHandle;
CallbackInfo.Data := UserData;
CallbackInfo.Proc := FOnCallback;
SqliteExec(PChar(ASql),@CallbackDispatcher,@CallbackInfo);
SqliteExec(PChar(ASQL), @CallbackDispatcher, @CallbackInfo);
end;
@ -1649,14 +1647,14 @@ begin
(FAddedItems.Count > 0) or (FDeletedItems.Count > 0);
end;
function TCustomSqliteDataset.QuickQuery(const ASql:String):String;
function TCustomSqliteDataset.QuickQuery(const ASQL: String): String;
begin
Result:=QuickQuery(ASql,nil,False);
Result := QuickQuery(ASQL, nil, False);
end;
function TCustomSqliteDataset.QuickQuery(const ASql:String;const AStrList: TStrings):String;
function TCustomSqliteDataset.QuickQuery(const ASQL: String; const AStrList: TStrings): String;
begin
Result:=QuickQuery(ASql,AStrList,False)
Result := QuickQuery(ASQL, AStrList, False)
end;

View File

@ -1,4 +1,4 @@
unit sqlite3ds;
unit Sqlite3DS;
{
This is TSqlite3Dataset, a TDataset descendant class for use with fpc compiler
@ -33,19 +33,19 @@ unit sqlite3ds;
{$mode objfpc}
{$H+}
{ $Define DEBUG}
{.$Define DEBUG_SQLITEDS}
interface
uses
Classes, SysUtils, customsqliteds;
Classes, SysUtils, CustomSqliteDS;
type
{ TSqlite3Dataset }
TSqlite3Dataset = class(TCustomSqliteDataset)
private
function SqliteExec(ASql:PChar; ACallback: TSqliteCdeclCallback; Data: Pointer):Integer;override;
function SqliteExec(ASQL: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer; override;
function InternalGetHandle: Pointer; override;
function GetSqliteVersion: String; override;
procedure InternalCloseHandle; override;
@ -54,9 +54,9 @@ type
procedure InternalInitFieldDefs; override;
function GetRowsAffected:Integer; override;
public
procedure ExecuteDirect(const ASql: String);override;
procedure ExecuteDirect(const ASQL: String); override;
function ReturnString: String; override;
function QuickQuery(const ASql:String;const AStrList: TStrings;FillObjects:Boolean):String;override;
function QuickQuery(const ASQL: String; const AStrList: TStrings; FillObjects: Boolean): String; override;
end;
implementation
@ -101,7 +101,7 @@ begin
end;
end;
function GetAutoIncValue(NextValue: Pointer; Columns: Integer; ColumnValues: PPChar; ColumnNames: PPChar): integer; cdecl;
function GetAutoIncValue(NextValue: Pointer; Columns: Integer; ColumnValues: PPChar; ColumnNames: PPChar): Integer; cdecl;
var
CodeError, TempInt: Integer;
begin
@ -118,9 +118,9 @@ end;
{ TSqlite3Dataset }
function TSqlite3Dataset.SqliteExec(ASql: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer;
function TSqlite3Dataset.SqliteExec(ASQL: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer;
begin
Result:=sqlite3_exec(FSqliteHandle, ASql, ACallback, Data, nil);
Result := sqlite3_exec(FSqliteHandle, ASQL, ACallback, Data, nil);
end;
procedure TSqlite3Dataset.InternalCloseHandle;
@ -144,7 +144,7 @@ begin
FReturnCode := sqlite3_prepare(Result, CheckFileSql, -1, @vm, nil);
if FReturnCode <> SQLITE_OK then
begin
ErrorStr := SqliteCode2Str(FReturnCode) + ' - ' + sqlite3_errmsg(Result);;
ErrorStr := SqliteCode2Str(FReturnCode) + ' - ' + sqlite3_errmsg(Result);
sqlite3_close(Result);
DatabaseError(ErrorStr, Self);
end;
@ -160,12 +160,12 @@ var
i, ColumnCount: Integer;
AType: TFieldType;
begin
{$ifdef DEBUG}
{$ifdef DEBUG_SQLITEDS}
WriteLn('##TSqlite3Dataset.InternalInitFieldDefs##');
{$endif}
FAutoIncFieldNo := -1;
FieldDefs.Clear;
FReturnCode := sqlite3_prepare(FSqliteHandle, PChar(FSql), -1, @vm, nil);
FReturnCode := sqlite3_prepare(FSqliteHandle, PChar(FSQL), -1, @vm, nil);
if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString, Self);
sqlite3_step(vm);
@ -238,17 +238,17 @@ begin
FieldDefs.Add(String(sqlite3_column_name(vm, i)), AType, FieldSizeMap[AType = ftString]);
//Set the pchar2sql function
if AType in [ftString, ftMemo] then
FGetSqlStr[i] := @Char2SqlStr
FGetSqlStr[i] := @Char2SQLStr
else
FGetSqlStr[i] := @Num2SqlStr;
{$ifdef DEBUG}
writeln(' Field[',i,'] Name: ', sqlite3_column_name(vm,i));
writeln(' Field[',i,'] Type: ', sqlite3_column_decltype(vm,i));
FGetSqlStr[i] := @Num2SQLStr;
{$ifdef DEBUG_SQLITEDS}
WriteLn(' Field[', i, '] Name: ', sqlite3_column_name(vm, i));
WriteLn(' Field[', i, '] Type: ', sqlite3_column_decltype(vm, i));
{$endif}
end;
sqlite3_finalize(vm);
{$ifdef DEBUG}
writeln(' FieldDefs.Count: ', FieldDefs.Count);
{$ifdef DEBUG_SQLITEDS}
WriteLn(' FieldDefs.Count: ', FieldDefs.Count);
{$endif}
end;
@ -257,11 +257,11 @@ begin
Result := sqlite3_changes(FSqliteHandle);
end;
procedure TSqlite3Dataset.ExecuteDirect(const ASql: String);
procedure TSqlite3Dataset.ExecuteDirect(const ASQL: String);
var
vm: Pointer;
begin
FReturnCode:=sqlite3_prepare(FSqliteHandle,Pchar(ASql),-1,@vm,nil);
FReturnCode := sqlite3_prepare(FSqliteHandle, Pchar(ASQL), -1, @vm, nil);
if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString, Self);
FReturnCode := sqlite3_step(vm);
@ -276,10 +276,10 @@ var
begin
//Get AutoInc Field initial value
if FAutoIncFieldNo <> -1 then
sqlite3_exec(FSqliteHandle,PChar('Select Max('+Fields[FAutoIncFieldNo].FieldName+') from ' + FTableName),
@GetAutoIncValue,@FNextAutoInc,nil);
sqlite3_exec(FSqliteHandle, PChar('Select Max(' + Fields[FAutoIncFieldNo].FieldName +
') from ' + FTableName), @GetAutoIncValue, @FNextAutoInc, nil);
FReturnCode:=sqlite3_prepare(FSqliteHandle,Pchar(FSql),-1,@vm,nil);
FReturnCode := sqlite3_prepare(FSqliteHandle, PChar(FSQL), -1, @vm, nil);
if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString, Self);
@ -327,7 +327,7 @@ begin
Result := String(sqlite3_version());
end;
function TSqlite3Dataset.QuickQuery(const ASql:String;const AStrList: TStrings;FillObjects:Boolean):String;
function TSqlite3Dataset.QuickQuery(const ASQL: String; const AStrList: TStrings; FillObjects:Boolean): String;
var
vm: Pointer;
@ -343,7 +343,8 @@ var
begin
while FReturnCode = SQLITE_ROW do
begin
AStrList.AddObject(String(sqlite3_column_text(vm,0)), TObject(PtrInt(sqlite3_column_int(vm,1))));
AStrList.AddObject(String(sqlite3_column_text(vm, 0)),
TObject(PtrInt(sqlite3_column_int(vm, 1))));
FReturnCode := sqlite3_step(vm);
end;
end;
@ -351,7 +352,7 @@ begin
if FSqliteHandle = nil then
GetSqliteHandle;
Result := '';
FReturnCode := sqlite3_prepare(FSqliteHandle,Pchar(ASql), -1, @vm, nil);
FReturnCode := sqlite3_prepare(FSqliteHandle,Pchar(ASQL), -1, @vm, nil);
if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString, Self);

View File

@ -1,4 +1,4 @@
unit sqliteds;
unit SqliteDS;
{
This is TSqliteDataset, a TDataset descendant class for use with fpc compiler
@ -33,19 +33,19 @@ unit sqliteds;
{$mode objfpc}
{$H+}
{ $Define DEBUG}
{.$Define DEBUG_SQLITEDS}
interface
uses
Classes, SysUtils, customsqliteds;
Classes, SysUtils, CustomSqliteDS;
type
{ TSqliteDataset }
TSqliteDataset = class(TCustomSqliteDataset)
private
function SqliteExec(ASql:PChar; ACallback: TSqliteCdeclCallback; Data: Pointer):Integer;override;
function SqliteExec(ASQL: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer; override;
function InternalGetHandle: Pointer; override;
function GetSqliteEncoding: String;
function GetSqliteVersion: String; override;
@ -55,9 +55,9 @@ type
procedure InternalInitFieldDefs; override;
function GetRowsAffected:Integer; override;
public
procedure ExecuteDirect(const ASql: String);override;
procedure ExecuteDirect(const ASQL: String); override;
function ReturnString: String; override;
function QuickQuery(const ASql:String;const AStrList: TStrings;FillObjects:Boolean):String;override;
function QuickQuery(const ASQL: String; const AStrList: TStrings; FillObjects: Boolean): String; override;
property SqliteEncoding: String read GetSqliteEncoding;
end;
@ -68,7 +68,7 @@ uses
//function sqlite_last_statement_changes(dbhandle:Pointer):longint;cdecl;external 'sqlite' name 'sqlite_last_statement_changes';
function GetAutoIncValue(NextValue: Pointer; Columns: Integer; ColumnValues: PPChar; ColumnNames: PPChar): integer; cdecl;
function GetAutoIncValue(NextValue: Pointer; Columns: Integer; ColumnValues: PPChar; ColumnNames: PPChar): Integer; cdecl;
var
CodeError, TempInt: Integer;
begin
@ -85,9 +85,9 @@ end;
{ TSqliteDataset }
function TSqliteDataset.SqliteExec(ASql: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer;
function TSqliteDataset.SqliteExec(ASQL: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer;
begin
Result:=sqlite_exec(FSqliteHandle, ASql, ACallback, Data, nil);
Result := sqlite_exec(FSqliteHandle, ASQL, ACallback, Data, nil);
end;
procedure TSqliteDataset.InternalCloseHandle;
@ -118,7 +118,7 @@ var
begin
FieldDefs.Clear;
FAutoIncFieldNo := -1;
FReturnCode := sqlite_compile(FSqliteHandle,PChar(FSql),nil,@vm,nil);
FReturnCode := sqlite_compile(FSqliteHandle, PChar(FSQL), nil, @vm, nil);
if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString, Self);
sqlite_step(vm, @ColumnCount, @ColumnValues, @ColumnNames);
@ -189,9 +189,9 @@ begin
FieldDefs.Add(String(ColumnNames[i]), AType);
//Set the pchar2sql function
if AType in [ftString, ftMemo] then
FGetSqlStr[i]:=@Char2SqlStr
FGetSqlStr[i] := @Char2SQLStr
else
FGetSqlStr[i]:=@Num2SqlStr;
FGetSqlStr[i] := @Num2SQLStr;
end;
sqlite_finalize(vm, nil);
{
@ -206,13 +206,13 @@ begin
//Result := sqlite_last_statement_changes(FSqliteHandle);
end;
procedure TSqliteDataset.ExecuteDirect(const ASql: String);
procedure TSqliteDataset.ExecuteDirect(const ASQL: String);
var
vm: Pointer;
ColumnNames, ColumnValues: PPChar;
ColCount: Integer;
begin
FReturnCode:=sqlite_compile(FSqliteHandle,Pchar(ASql),nil,@vm,nil);
FReturnCode := sqlite_compile(FSqliteHandle, Pchar(ASQL), nil, @vm, nil);
if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString,Self);
@ -233,7 +233,7 @@ begin
sqlite_exec(FSqliteHandle, PChar('Select Max(' + Fields[FAutoIncFieldNo].FieldName + ') from ' + FTableName),
@GetAutoIncValue, @FNextAutoInc, nil);
FReturnCode:=sqlite_compile(FSqliteHandle,Pchar(FSql),nil,@vm,nil);
FReturnCode := sqlite_compile(FSqliteHandle, PChar(FSQL), nil, @vm, nil);
if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString, Self);
@ -298,8 +298,16 @@ begin
SQLITE_AUTH : Result := 'SQLITE_AUTH';
SQLITE_FORMAT : Result := 'SQLITE_FORMAT';
SQLITE_RANGE : Result := 'SQLITE_RANGE';
SQLITE_ROW : begin Result := 'SQLITE_ROW - not an error'; Exit; end;
SQLITE_DONE : begin Result := 'SQLITE_DONE - not an error'; Exit; end;
SQLITE_ROW :
begin
Result := 'SQLITE_ROW - not an error';
Exit;
end;
SQLITE_DONE :
begin
Result := 'SQLITE_DONE - not an error';
Exit;
end;
else
Result := 'Unknow Return Value';
end;
@ -316,7 +324,7 @@ begin
Result := String(sqlite_version);
end;
function TSqliteDataset.QuickQuery(const ASql:String;const AStrList: TStrings;FillObjects:Boolean):String;
function TSqliteDataset.QuickQuery(const ASQL: String; const AStrList: TStrings; FillObjects: Boolean): String;
var
vm: Pointer;
ColumnNames, ColumnValues: PPChar;
@ -335,7 +343,8 @@ var
while FReturnCode = SQLITE_ROW do
begin
// I know, this code is really dirty!!
AStrList.AddObject(String(ColumnValues[0]), TObject(PtrInt(StrToInt(String(ColumnValues[1])))));
AStrList.AddObject(String(ColumnValues[0]),
TObject(PtrInt(StrToInt(String(ColumnValues[1])))));
FReturnCode := sqlite_step(vm, @ColCount, @ColumnValues, @ColumnNames);
end;
end;
@ -343,7 +352,7 @@ begin
if FSqliteHandle = nil then
GetSqliteHandle;
Result := '';
FReturnCode := sqlite_compile(FSqliteHandle, PChar(ASql), nil, @vm, nil);
FReturnCode := sqlite_compile(FSqliteHandle, PChar(ASQL), nil, @vm, nil);
if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString,Self);