From e050f7ddb1dc2510e87dbb8c5bd5937ab94e0c2f Mon Sep 17 00:00:00 2001 From: michael Date: Mon, 8 Aug 2005 16:45:33 +0000 Subject: [PATCH] =?UTF-8?q?=20*=20Patch=20from=20Luiz=20Am=C3=A9rico:=20?= =?UTF-8?q?=20=20Sqlite=20interface:=20=20-=20Added=20missing=20constant?= =?UTF-8?q?=20=20-=20Remapps=20sqlite=5Fversion=20from=20cvar=20to=20funct?= =?UTF-8?q?ion=20call,=20the=20former=20was=20not=20working=20in=20win32?= =?UTF-8?q?=20=20-=20Clean=20up=20the=20code=20=20SQLite=20Dataset=20:=20?= =?UTF-8?q?=20-=20Reduce=20memory=20usage=20=20-=20Replaces=20TList=20with?= =?UTF-8?q?=20TFPList=20=20-=20Add=20auxiliary=20QuickQuery=20functions=20?= =?UTF-8?q?=20-=20Misc=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: trunk@827 - --- fcl/db/sqlite/customsqliteds.pas | 66 ++++++----- fcl/db/sqlite/sqlite3ds.pas | 59 ++++++++++ fcl/db/sqlite/sqliteds.pas | 72 +++++++++++- packages/base/sqlite/sqlite.pp | 132 ++++++++++----------- packages/base/sqlite/sqlite3.pp | 192 +++++++++++++------------------ 5 files changed, 306 insertions(+), 215 deletions(-) diff --git a/fcl/db/sqlite/customsqliteds.pas b/fcl/db/sqlite/customsqliteds.pas index 79964c6ebd..4b6d08a498 100644 --- a/fcl/db/sqlite/customsqliteds.pas +++ b/fcl/db/sqlite/customsqliteds.pas @@ -37,7 +37,6 @@ type PPDataRecord = ^PDataRecord; DataRecord = record Row: PPchar; - BookmarkData: Pointer; BookmarkFlag: TBookmarkFlag; Next: PDataRecord; Previous: PDataRecord; @@ -78,10 +77,10 @@ type FSaveOnClose: Boolean; FSaveOnRefetch: Boolean; FComplexSql: Boolean; - FUpdatedItems: TList; - FAddedItems: TList; - FDeletedItems: TList; - FOrphanItems: TList; + FUpdatedItems: TFPList; + FAddedItems: TFPList; + FDeletedItems: TFPList; + FOrphanItems: TFPList; FMasterLink: TMasterDataLink; FIndexFieldNames: String; FIndexFieldList: TList; @@ -105,6 +104,7 @@ type function SqliteExec(AHandle: Pointer; Sql:PChar):Integer;virtual; abstract; procedure SqliteClose(AHandle: Pointer);virtual;abstract; function GetSqliteHandle: Pointer; virtual; abstract; + function GetSqliteVersion: String; virtual; abstract; procedure BuildLinkedList; virtual; abstract; function SqliteReturnString: String; virtual; abstract; function TableExists: Boolean;virtual;abstract; @@ -153,6 +153,9 @@ type function CreateTable: Boolean; virtual; function ExecSQL:Integer; function ExecSQL(const ASql:String):Integer; + function QuickQuery(const ASql:String):String;overload; + function QuickQuery(const ASql:String;const AStrList: TStrings):String;overload; + function QuickQuery(const ASql:String;const AStrList: TStrings;FillObjects:Boolean):String;virtual;abstract;overload; procedure RefetchData; function UpdatesPending: Boolean; {$ifdef DEBUGACTIVEBUFFER} @@ -162,9 +165,9 @@ type {$ifdef USE_SQLITEDS_INTERNALS} property BeginItem: PDataRecord read FBeginItem; property EndItem: PDataRecord read FEndItem; - property UpdatedItems: TList read FUpdatedItems; - property AddedItems: TList read FAddedItems; - property DeletedItems: TList read FDeletedItems; + property UpdatedItems: TFPList read FUpdatedItems; + property AddedItems: TFPList read FAddedItems; + property DeletedItems: TFPList read FDeletedItems; {$endif} property ComplexSql: Boolean read FComplexSql write FComplexSql; property ExpectedAppends: Integer read FExpectedAppends write SetExpectedAppends; @@ -172,6 +175,8 @@ type property ExpectedDeletes: Integer read FExpectedDeletes write SetExpectedDeletes; property IndexFields[Value: Integer]: TField read GetIndexFields; property SqliteReturnId: Integer read FSqliteReturnId; + property SqliteHandle: Pointer read FSqliteHandle; + property SqliteVersion: String read GetSqliteVersion; published property IndexFieldNames: string read FIndexFieldNames write FIndexFieldNames; property FileName: String read FFileName write FFileName; @@ -325,13 +330,13 @@ begin FIndexFieldList:=TList.Create; BookmarkSize := SizeOf(Pointer); FBufferSize := SizeOf(PPDataRecord); - FUpdatedItems:= TList.Create; + FUpdatedItems:= TFPList.Create; FUpdatedItems.Capacity:=20; - FAddedItems:= TList.Create; + FAddedItems:= TFPList.Create; FAddedItems.Capacity:=20; - FOrphanItems:= TList.Create; + FOrphanItems:= TFPList.Create; FOrphanItems.Capacity:=20; - FDeletedItems:= TList.Create; + FDeletedItems:= TFPList.Create; FDeletedItems.Capacity:=20; inherited Create(AOwner); end; @@ -359,7 +364,7 @@ end; function TCustomSqliteDataset.GetIndexFields(Value: Integer): TField; begin if (Value < 0) or (Value > FIndexFieldList.Count - 1) then - DatabaseError('Error acessing IndexFields: Index out of bonds'); + DatabaseError('Error acessing IndexFields: Index out of bonds',Self); Result:= TField(FIndexFieldList[Value]); end; @@ -407,7 +412,7 @@ end; procedure TCustomSqliteDataset.GetBookmarkData(Buffer: PChar; Data: Pointer); begin - Pointer(Data^) := PPDataRecord(Buffer)^^.BookmarkData; + Pointer(Data^) := PPDataRecord(Buffer)^; end; function TCustomSqliteDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; @@ -467,11 +472,7 @@ begin if Result = grOk then begin PDataRecord(Pointer(Buffer)^):=FCurrentItem; - with FCurrentItem^ do - begin - BookmarkData := FCurrentItem; - BookmarkFlag := bfCurrent; - end; + FCurrentItem^.BookmarkFlag := bfCurrent; end else if (Result = grError) and DoCheck then DatabaseError('SqliteDs - No records',Self); @@ -634,9 +635,9 @@ procedure TCustomSqliteDataset.InternalOpen; begin FAutoIncFieldNo:=-1; if not FileExists(FFileName) then - DatabaseError('TCustomSqliteDataset - File '+FFileName+' not found'); + DatabaseError('TCustomSqliteDataset - File "'+FFileName+'" not found',Self); if (FTablename = '') and not (FComplexSql) then - DatabaseError('TCustomSqliteDataset - Tablename not set'); + DatabaseError('TCustomSqliteDataset - Tablename not set',Self); if MasterSource <> nil then begin @@ -660,7 +661,7 @@ begin UpdateIndexFields; if FMasterLink.Active and (FIndexFieldList.Count <> FMasterLink.Fields.Count) then - DatabaseError('MasterFields count doesnt match IndexFields count'); + DatabaseError('MasterFields count doesnt match IndexFields count',Self); // Get PrimaryKeyNo if available if Fields.FindField(FPrimaryKey) <> nil then @@ -690,7 +691,7 @@ end; procedure TCustomSqliteDataset.SetBookmarkData(Buffer: PChar; Data: Pointer); begin - PPDataRecord(Buffer)^^.BookmarkData := Pointer(Data^); + //The BookMarkData is the Buffer itsef; end; procedure TCustomSqliteDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); @@ -714,6 +715,8 @@ procedure TCustomSqliteDataset.SetExpectedDeletes(AValue:Integer); begin if Assigned(FDeletedItems) then FDeletedItems.Capacity:=AValue; + if Assigned(FOrphanItems) then + FOrphanItems.Capacity:=AValue; end; procedure TCustomSqliteDataset.SetFieldData(Field: TField; Buffer: Pointer); @@ -757,7 +760,7 @@ var TempItem:PDataRecord; begin if (Value >= FRecordCount) or (Value < 0) then - DatabaseError('SqliteDs - Record Number Out Of Range'); + DatabaseError('SqliteDs - Record Number Out Of Range',Self); TempItem:=FBeginItem; for Counter := 0 to Value do TempItem:=TempItem^.Next; @@ -805,7 +808,7 @@ end; procedure TCustomSqliteDataset.SetMasterFields(Value: String); begin if Active then - DatabaseError('It''s not allowed to set MasterFields property in a open dataset'); + DatabaseError('It''s not allowed to set MasterFields property in a open dataset',Self); FMasterLink.FieldNames:=Value; end; @@ -852,7 +855,7 @@ begin if FFileName <> '' then AHandle := GetSqliteHandle else - DatabaseError ('ExecSql - FileName not set'); + DatabaseError ('ExecSql - FileName not set',Self); FSqliteReturnId:= SqliteExec(AHandle,PChar(ASql)); //todo: add a way to get the num of changes //Result:=sqlite_changes(AHandle); @@ -1079,6 +1082,17 @@ begin (FAddedItems.Count > 0) or (FUpdatedItems.Count > 0); end; +function TCustomSqliteDataset.QuickQuery(const ASql:String):String; +begin + Result:=QuickQuery(ASql,nil,False); +end; + +function TCustomSqliteDataset.QuickQuery(const ASql:String;const AStrList: TStrings):String; +begin + Result:=QuickQuery(ASql,AStrList,False) +end; + + {$ifdef DEBUGACTIVEBUFFER} procedure TCustomSqliteDataset.SetCurrentItem(Value:PDataRecord); var diff --git a/fcl/db/sqlite/sqlite3ds.pas b/fcl/db/sqlite/sqlite3ds.pas index c39f6c2955..fcb741709e 100644 --- a/fcl/db/sqlite/sqlite3ds.pas +++ b/fcl/db/sqlite/sqlite3ds.pas @@ -37,6 +37,7 @@ type private function SqliteExec(AHandle: Pointer; ASql:PChar):Integer;override; function GetSqliteHandle: Pointer; override; + function GetSqliteVersion: String; override; procedure SqliteClose(AHandle: Pointer);override; procedure BuildLinkedList; override; protected @@ -44,6 +45,7 @@ type public function SqliteReturnString: String; override; function TableExists: Boolean;override; + function QuickQuery(const ASql:String;const AStrList: TStrings;FillObjects:Boolean):String;override; end; implementation @@ -285,6 +287,63 @@ begin end; end; +function TSqlite3Dataset.GetSqliteVersion: String; +begin + Result:=StrPas(sqlite3_version); +end; + +function TSqlite3Dataset.QuickQuery(const ASql:String;const AStrList: TStrings;FillObjects:Boolean):String; +var + vm,AHandle:Pointer; + + procedure FillStrings; + begin + while FSqliteReturnId = SQLITE_ROW do + begin + AStrList.Add(StrPas(sqlite3_column_text(vm,0))); + FSqliteReturnId:=sqlite3_step(vm); + end; + end; + procedure FillStringsAndObjects; + begin + while FSqliteReturnId = SQLITE_ROW do + begin + AStrList.AddObject(StrPas(sqlite3_column_text(vm,0)),TObject(sqlite3_column_int(vm,1))); + FSqliteReturnId:=sqlite3_step(vm); + end; + end; +begin + if FSqliteHandle <> nil then + AHandle:=FSqliteHandle + else + if FileExists(FFileName) then + AHandle:=GetSqliteHandle + else + DatabaseError('File '+FFileName+' not Exists',Self); + Result:=''; + if AStrList <> nil then + AStrList.Clear; + FSqliteReturnId:=sqlite3_prepare(AHandle,Pchar(ASql),-1,@vm,nil); + //FSqliteReturnId:=sqlite_compile(AHandle,Pchar(ASql),nil,@vm,nil); + if FSqliteReturnId <> SQLITE_OK then + DatabaseError('Error returned by sqlite in QuickQuery: '+SqliteReturnString,Self); + + FSqliteReturnId:=sqlite3_step(vm); + if (FSqliteReturnId = SQLITE_ROW) and (sqlite3_column_count(vm) > 0) then + begin + Result:=StrPas(sqlite3_column_text(vm,0)); + if AStrList <> nil then + begin + if FillObjects and (sqlite3_column_count(vm) > 1) then + FillStringsAndObjects + else + FillStrings; + end; + end; + sqlite3_finalize(vm); + if FSqliteHandle = nil then + sqlite3_close(AHandle); +end; end. diff --git a/fcl/db/sqlite/sqliteds.pas b/fcl/db/sqlite/sqliteds.pas index 44136381db..fe21e7b21e 100644 --- a/fcl/db/sqlite/sqliteds.pas +++ b/fcl/db/sqlite/sqliteds.pas @@ -37,6 +37,8 @@ type private function SqliteExec(AHandle: Pointer; ASql:PChar):Integer;override; function GetSqliteHandle: Pointer; override; + function GetSqliteEncoding: String; + function GetSqliteVersion: String; override; procedure SqliteClose(AHandle: Pointer);override; procedure BuildLinkedList; override; protected @@ -44,6 +46,8 @@ type public function SqliteReturnString: String; override; function TableExists: Boolean;override; + function QuickQuery(const ASql:String;const AStrList: TStrings;FillObjects:Boolean):String;override; + property SqliteEncoding: String read GetSqliteEncoding; end; implementation @@ -254,7 +258,7 @@ begin {$endif} Result:=FSqliteReturnId = SQLITE_ROW; sqlite_finalize(vm, nil); - if (FSqliteHandle = nil) then + if FSqliteHandle = nil then SqliteClose(AHandle); end; {$ifdef DEBUG} @@ -290,7 +294,7 @@ begin SQLITE_NOLFS : Result := 'SQLITE_NOLFS '; SQLITE_AUTH : Result := 'SQLITE_AUTH '; SQLITE_FORMAT : Result := 'SQLITE_FORMAT '; - // SQLITE_RANGE : Result := 'SQLITE_RANGE '; + SQLITE_RANGE : Result := 'SQLITE_RANGE '; SQLITE_ROW : Result := 'SQLITE_ROW '; SQLITE_DONE : Result := 'SQLITE_DONE '; else @@ -298,6 +302,70 @@ begin end; end; +function TSqliteDataset.GetSqliteEncoding: String; +begin + Result:=StrPas(sqlite_encoding); +end; + +function TSqliteDataset.GetSqliteVersion: String; +begin + Result:=StrPas(sqlite_version); +end; +function TSqliteDataset.QuickQuery(const ASql:String;const AStrList: TStrings;FillObjects:Boolean):String; +var + vm,AHandle:Pointer; + ColumnNames,ColumnValues:PPChar; + ColCount:Integer; + + procedure FillStrings; + begin + while FSqliteReturnId = SQLITE_ROW do + begin + AStrList.Add(StrPas(ColumnValues[0])); + FSqliteReturnId:=sqlite_step(vm,@ColCount,@ColumnValues,@ColumnNames); + end; + end; + procedure FillStringsAndObjects; + begin + while FSqliteReturnId = SQLITE_ROW do + begin + // I know, this code is really dirty!! + AStrList.AddObject(StrPas(ColumnValues[0]),TObject(StrToInt(StrPas(ColumnValues[1])))); + FSqliteReturnId:=sqlite_step(vm,@ColCount,@ColumnValues,@ColumnNames); + end; + end; +begin + if FSqliteHandle <> nil then + AHandle:=FSqliteHandle + else + if FileExists(FFileName) then + AHandle:=GetSqliteHandle + else + DatabaseError('File '+FFileName+' not Exists',Self); + Result:=''; + if AStrList <> nil then + AStrList.Clear; + FSqliteReturnId:=sqlite_compile(AHandle,Pchar(ASql),nil,@vm,nil); + if FSqliteReturnId <> SQLITE_OK then + DatabaseError('Error returned by sqlite in QuickQuery: '+SqliteReturnString,Self); + + FSqliteReturnId:=sqlite_step(vm,@ColCount,@ColumnValues,@ColumnNames); + if (FSqliteReturnId = SQLITE_ROW) and (ColCount > 0) then + begin + Result:=StrPas(ColumnValues[0]); + if AStrList <> nil then + begin + if FillObjects and (ColCount > 1) then + FillStringsAndObjects + else + FillStrings; + end; + end; + sqlite_finalize(vm, nil); + if FSqliteHandle = nil then + sqlite_close(AHandle); +end; + end. diff --git a/packages/base/sqlite/sqlite.pp b/packages/base/sqlite/sqlite.pp index 64a9bbc543..ad45503dcf 100644 --- a/packages/base/sqlite/sqlite.pp +++ b/packages/base/sqlite/sqlite.pp @@ -13,32 +13,14 @@ interface sqlite.h } - const - External_library='sqlite'; {Setup as you need} - - { Pointers to basic pascal types, inserted by h2pas conversion program.} - Type - PLongint = ^Longint; - PSmallInt = ^SmallInt; - PByte = ^Byte; - PWord = ^Word; - PDWord = ^DWord; - PDouble = ^Double; - PPPchar = ^ppchar; - {$PACKRECORDS C} const - _SQLITE_VERSION = '2.8.3'; - SQLITE_ISO8859 = 1; - -{$ifndef win32} -var - sqlite_version : pchar;cvar;external; - sqlite_encoding : pchar;cvar;external; -{$endif} - -const + External_library='sqlite'; + + SQLITE_ISO8859 = 1;//? + + //sqlite_exec and sqlite_step return values SQLITE_OK = 0; SQLITE_ERROR = 1; SQLITE_INTERNAL = 2; @@ -64,10 +46,11 @@ const SQLITE_NOLFS = 22; SQLITE_AUTH = 23; SQLITE_FORMAT = 24; + SQLITE_RANGE = 25; SQLITE_ROW = 100; SQLITE_DONE = 101; - + // values used in sqlite_set_authorizer to define what operations authorize SQLITE_COPY = 0; SQLITE_CREATE_INDEX = 1; SQLITE_CREATE_TABLE = 2; @@ -92,6 +75,8 @@ const SQLITE_SELECT = 21; SQLITE_TRANSACTION = 22; SQLITE_UPDATE = 23; + + //Return values of the authorizer function SQLITE_DENY = 1; SQLITE_IGNORE = 2; @@ -99,8 +84,8 @@ const SQLITE_TEXT = -2; SQLITE_ARGS = -3; - Type + PPPchar = ^ppchar; Psqlite = Pointer; Psqlite_vm = Pointer; PPsqlite_vm = ^Psqlite_vm; @@ -108,61 +93,64 @@ Type // Procedural types used in functions. - sqlite_callback = function (_para1:pointer; _para2:longint; _para3:PPchar; _para4:PPchar):longint;{$ifdef win32}cdecl{$else}cdecl{$endif}; - sqlite_trace_func = procedure (_para1:pointer; _para2:Pchar);{$ifdef win32}cdecl{$else}cdecl{$endif}; - sqlite_create_func = procedure (_para1:Psqlite_func; _para2:longint; _para3:PPchar);{$ifdef win32}cdecl{$else}cdecl{$endif}; - sqlite_handler = function (_para1:pointer; _para2:Pchar; _para3:longint):longint;{$ifdef win32}cdecl{$else}cdecl{$endif}; - sqlite_step_func = procedure (_para1:Psqlite_func; _para2:longint; _para3:PPchar) ;{$ifdef win32}cdecl{$else}cdecl{$endif}; - sqlite_finalize_func = procedure (_para1:Psqlite_func);{$ifdef win32}cdecl{$else}cdecl{$endif}; - sqlite_authorize_func = function (_para1:pointer; _para2:longint; _para3, _para4,_para5,_para6:Pchar):longint;{$ifdef win32}cdecl{$else}cdecl{$endif}; + sqlite_callback = function (_para1:pointer; _para2:longint; _para3:PPchar; _para4:PPchar):longint;cdecl; + sqlite_trace_func = procedure (_para1:pointer; _para2:Pchar);cdecl; + sqlite_create_func = procedure (_para1:Psqlite_func; _para2:longint; _para3:PPchar);cdecl; + sqlite_handler = function (_para1:pointer; _para2:Pchar; _para3:longint):longint;cdecl; + sqlite_step_func = procedure (_para1:Psqlite_func; _para2:longint; _para3:PPchar);cdecl; + sqlite_finalize_func = procedure (_para1:Psqlite_func);cdecl; + sqlite_authorize_func = function (_para1:pointer; _para2:longint; _para3, _para4,_para5,_para6:Pchar):longint;cdecl; - function sqlite_create_function(_para1:Psqlite; zName:Pchar; nArg:longint; xFunc:sqlite_create_func; pUserData:pointer):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_create_function'; - function sqlite_open(filename:Pchar; mode:longint; errmsg:PPchar):Psqlite;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_open'; - procedure sqlite_close(_para1:Psqlite);{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_close'; - function sqlite_exec(_para1:Psqlite; sql:Pchar; _para3:sqlite_callback; _para4:pointer; errmsg:PPchar):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_exec'; - function sqlite_last_insert_rowid(_para1:Psqlite):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_last_insert_rowid'; - function sqlite_changes(_para1:Psqlite):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_changes'; - function sqlite_error_string(_para1:longint):Pchar;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_error_string'; - procedure do_sqlite_interrupt(_para1:Psqlite);{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_interrupt'; - function sqlite_complete(sql:Pchar):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_complete'; - procedure sqlite_busy_handler(_para1:Psqlite; _para2:sqlite_handler; _para3:pointer);{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_busy_handler'; - procedure sqlite_busy_timeout(_para1:Psqlite; ms:longint);{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_busy_timeout'; + function sqlite_create_function(_para1:Psqlite; zName:Pchar; nArg:longint; xFunc:sqlite_create_func; pUserData:pointer):longint;cdecl;external External_library name 'sqlite_create_function'; + function sqlite_open(filename:Pchar; mode:longint; errmsg:PPchar):Psqlite;cdecl;external External_library name 'sqlite_open'; + procedure sqlite_close(_para1:Psqlite);cdecl;external External_library name 'sqlite_close'; + function sqlite_exec(_para1:Psqlite; sql:Pchar; _para3:sqlite_callback; _para4:pointer; errmsg:PPchar):longint;cdecl;external External_library name 'sqlite_exec'; + function sqlite_last_insert_rowid(_para1:Psqlite):longint;cdecl;external External_library name 'sqlite_last_insert_rowid'; + function sqlite_changes(_para1:Psqlite):longint;cdecl;external External_library name 'sqlite_changes'; + function sqlite_error_string(_para1:longint):Pchar;cdecl;external External_library name 'sqlite_error_string'; + procedure do_sqlite_interrupt(_para1:Psqlite);cdecl;external External_library name 'sqlite_interrupt'; + function sqlite_complete(sql:Pchar):longint;cdecl;external External_library name 'sqlite_complete'; + procedure sqlite_busy_handler(_para1:Psqlite; _para2:sqlite_handler; _para3:pointer);cdecl;external External_library name 'sqlite_busy_handler'; + procedure sqlite_busy_timeout(_para1:Psqlite; ms:longint);cdecl;external External_library name 'sqlite_busy_timeout'; function sqlite_get_table(_para1:Psqlite; sql:Pchar; resultp:PPPchar; nrow:Plongint; ncolumn:Plongint; - errmsg:PPchar):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_get_table'; - procedure sqlite_free_table(result:PPchar);{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_free_table'; + errmsg:PPchar):longint;cdecl;external External_library name 'sqlite_get_table'; + procedure sqlite_free_table(result:PPchar);cdecl;external External_library name 'sqlite_free_table'; function sqlite_exec_printf(_para1:Psqlite; sqlFormat:Pchar; _para3:sqlite_callback; _para4:pointer; errmsg:PPchar; - args:array of const):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_exec_printf'; - function sqlite_exec_printf(_para1:Psqlite; sqlFormat:Pchar; _para3:sqlite_callback; _para4:pointer; errmsg:PPchar):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_exec_printf'; + args:array of const):longint;cdecl;external External_library name 'sqlite_exec_printf'; + function sqlite_exec_printf(_para1:Psqlite; sqlFormat:Pchar; _para3:sqlite_callback; _para4:pointer; errmsg:PPchar):longint;cdecl;external External_library name 'sqlite_exec_printf'; function sqlite_exec_vprintf(_para1:Psqlite; sqlFormat:Pchar; _para3:sqlite_callback; _para4:pointer; errmsg:PPchar; - ap:array of const):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_exec_vprintf'; + ap:array of const):longint;cdecl;external External_library name 'sqlite_exec_vprintf'; function sqlite_get_table_printf(_para1:Psqlite; sqlFormat:Pchar; resultp:PPPchar; nrow:Plongint; ncolumn:Plongint; - errmsg:PPchar; args:array of const):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_get_table_printf'; + errmsg:PPchar; args:array of const):longint;cdecl;external External_library name 'sqlite_get_table_printf'; function sqlite_get_table_printf(_para1:Psqlite; sqlFormat:Pchar; resultp:PPPchar; nrow:Plongint; ncolumn:Plongint; - errmsg:PPchar):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_get_table_printf'; + errmsg:PPchar):longint;cdecl;external External_library name 'sqlite_get_table_printf'; function sqlite_get_table_vprintf(_para1:Psqlite; sqlFormat:Pchar; resultp:PPPchar; nrow:Plongint; ncolumn:Plongint; - errmsg:PPchar; ap:array of const):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_get_table_vprintf'; - function sqlite_mprintf(_para1:Pchar; args:array of const):Pchar;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_mprintf'; - function sqlite_mprintf(_para1:Pchar):Pchar;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_mprintf'; - procedure sqlite_freemem(p:pointer);{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_freemem'; - function sqlite_libversion:Pchar;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_libversion'; - function sqlite_libencoding:Pchar;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_libencoding'; + errmsg:PPchar; ap:array of const):longint;cdecl;external External_library name 'sqlite_get_table_vprintf'; + function sqlite_mprintf(_para1:Pchar; args:array of const):Pchar;cdecl;external External_library name 'sqlite_mprintf'; + function sqlite_mprintf(_para1:Pchar):Pchar;cdecl;external External_library name 'sqlite_mprintf'; + procedure sqlite_freemem(p:pointer);cdecl;external External_library name 'sqlite_freemem'; + function sqlite_libversion:Pchar;cdecl;external External_library name 'sqlite_libversion'; + function sqlite_libencoding:Pchar;cdecl;external External_library name 'sqlite_libencoding'; function sqlite_create_aggregate(_para1:Psqlite; zName:Pchar; nArg:longint; xStep:sqlite_step_func ; xFinalize:sqlite_finalize_func; - pUserData:pointer):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_create_aggregate'; - function sqlite_function_type(db:Psqlite; zName:Pchar; datatype:longint):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_function_type'; - function sqlite_set_result_string(_para1:Psqlite_func; _para2:Pchar; _para3:longint):Pchar;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_set_result_string'; - procedure sqlite_set_result_int(_para1:Psqlite_func; _para2:longint);{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_set_result_int'; - procedure sqlite_set_result_double(_para1:Psqlite_func; _para2:double);{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_set_result_double'; - procedure sqlite_set_result_error(_para1:Psqlite_func; _para2:Pchar; _para3:longint);{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_set_result_error'; - function sqlite_user_data(_para1:Psqlite_func):pointer;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_user_data'; - function sqlite_aggregate_context(_para1:Psqlite_func; nBytes:longint):pointer;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_aggregate_context'; - function sqlite_aggregate_count(_para1:Psqlite_func):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_aggregate_count'; - function sqlite_set_authorizer(_para1:Psqlite; xAuth:sqlite_authorize_func ; pUserData:pointer):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_set_authorizer'; - function sqlite_trace(_para1:Psqlite; xTrace:sqlite_trace_func; _para3:pointer):pointer;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_trace'; - function sqlite_compile(db:Psqlite; zSql:Pchar; pzTail:PPchar; ppVm:PPsqlite_vm; pzErrmsg:PPchar):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_compile'; - function sqlite_step(pVm:Psqlite_vm; pN:Plongint; pazValue:PPPchar; pazColName:PPPchar):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_step'; - function sqlite_finalize(_para1:Psqlite_vm; pzErrMsg:PPchar):longint;{$ifdef win32}cdecl{$else}cdecl{$endif};external External_library name 'sqlite_finalize'; - + pUserData:pointer):longint;cdecl;external External_library name 'sqlite_create_aggregate'; + function sqlite_function_type(db:Psqlite; zName:Pchar; datatype:longint):longint;cdecl;external External_library name 'sqlite_function_type'; + function sqlite_set_result_string(_para1:Psqlite_func; _para2:Pchar; _para3:longint):Pchar;cdecl;external External_library name 'sqlite_set_result_string'; + procedure sqlite_set_result_int(_para1:Psqlite_func; _para2:longint);cdecl;external External_library name 'sqlite_set_result_int'; + procedure sqlite_set_result_double(_para1:Psqlite_func; _para2:double);cdecl;external External_library name 'sqlite_set_result_double'; + procedure sqlite_set_result_error(_para1:Psqlite_func; _para2:Pchar; _para3:longint);cdecl;external External_library name 'sqlite_set_result_error'; + function sqlite_user_data(_para1:Psqlite_func):pointer;cdecl;external External_library name 'sqlite_user_data'; + function sqlite_aggregate_context(_para1:Psqlite_func; nBytes:longint):pointer;cdecl;external External_library name 'sqlite_aggregate_context'; + function sqlite_aggregate_count(_para1:Psqlite_func):longint;cdecl;external External_library name 'sqlite_aggregate_count'; + function sqlite_set_authorizer(_para1:Psqlite; xAuth:sqlite_authorize_func ; pUserData:pointer):longint;cdecl;external External_library name 'sqlite_set_authorizer'; + function sqlite_trace(_para1:Psqlite; xTrace:sqlite_trace_func; _para3:pointer):pointer;cdecl;external External_library name 'sqlite_trace'; + function sqlite_compile(db:Psqlite; zSql:Pchar; pzTail:PPchar; ppVm:PPsqlite_vm; pzErrmsg:PPchar):longint;cdecl;external External_library name 'sqlite_compile'; + function sqlite_step(pVm:Psqlite_vm; pN:Plongint; pazValue:PPPchar; pazColName:PPPchar):longint;cdecl;external External_library name 'sqlite_step'; + function sqlite_finalize(_para1:Psqlite_vm; pzErrMsg:PPchar):longint;cdecl;external External_library name 'sqlite_finalize'; + + //Use functions instead of external variables to retrieve version and encoding info + function sqlite_version: PChar external External_library name 'sqlite_libversion'; + function sqlite_encoding: PChar external External_library name 'sqlite_libencoding'; + implementation - end. diff --git a/packages/base/sqlite/sqlite3.pp b/packages/base/sqlite/sqlite3.pp index 1d04e8111a..b2628f8cd7 100644 --- a/packages/base/sqlite/sqlite3.pp +++ b/packages/base/sqlite/sqlite3.pp @@ -13,29 +13,73 @@ interface Manual corrections made by Luiz Américo - 2005 } - const - External_library='sqlite3'; {Setup as you need} - - Type - PPPChar = ^PPChar; - Plongint = ^longint; - Psqlite3 = Pointer; - PPSqlite3 = ^PSqlite3; - Psqlite3_context = Pointer; - Psqlite3_stmt = Pointer; - PPsqlite3_stmt = ^Psqlite3_stmt; - Psqlite3_value = Pointer; - PPsqlite3_value = ^Psqlite3_value; - -{$IFDEF FPC} {$PACKRECORDS C} -{$ENDIF} + +const + External_library='sqlite3'; + + SQLITE_INTEGER = 1; + SQLITE_FLOAT = 2; +{ #define SQLITE_TEXT 3 // See below } + SQLITE_BLOB = 4; + SQLITE_NULL = 5; + SQLITE_TEXT = 3; + SQLITE3_TEXT = 3; + SQLITE_UTF8 = 1; + SQLITE_UTF16LE = 2; + SQLITE_UTF16BE = 3; +{ Use native byte order } + SQLITE_UTF16 = 4; +{ sqlite3_create_function only } + SQLITE_ANY = 5; + + //sqlite_exec return values + SQLITE_OK = 0; + SQLITE_ERROR = 1;{ SQL error or missing database } + SQLITE_INTERNAL = 2;{ An internal logic error in SQLite } + SQLITE_PERM = 3; { Access permission denied } + SQLITE_ABORT = 4; { Callback routine requested an abort } + SQLITE_BUSY = 5; { The database file is locked } + SQLITE_LOCKED = 6;{ A table in the database is locked } + SQLITE_NOMEM = 7; { A malloc() failed } + SQLITE_READONLY = 8;{ Attempt to write a readonly database } + SQLITE_INTERRUPT = 9;{ Operation terminated by sqlite3_interrupt() } + SQLITE_IOERR = 10; { Some kind of disk I/O error occurred } + SQLITE_CORRUPT = 11; { The database disk image is malformed } + SQLITE_NOTFOUND = 12; { (Internal Only) Table or record not found } + SQLITE_FULL = 13; { Insertion failed because database is full } + SQLITE_CANTOPEN = 14; { Unable to open the database file } + SQLITE_PROTOCOL = 15; { Database lock protocol error } + SQLITE_EMPTY = 16; { Database is empty } + SQLITE_SCHEMA = 17; { The database schema changed } + SQLITE_TOOBIG = 18; { Too much data for one row of a table } + SQLITE_CONSTRAINT = 19; { Abort due to contraint violation } + SQLITE_MISMATCH = 20; { Data type mismatch } + SQLITE_MISUSE = 21; { Library used incorrectly } + SQLITE_NOLFS = 22; { Uses OS features not supported on host } + SQLITE_AUTH = 23; { Authorization denied } + SQLITE_FORMAT = 24; { Auxiliary database format error } + SQLITE_RANGE = 25; { 2nd parameter to sqlite3_bind out of range } + SQLITE_NOTADB = 26; { File opened that is not a database file } + SQLITE_ROW = 100; { sqlite3_step() has another row ready } + SQLITE_DONE = 101; { sqlite3_step() has finished executing } + +type + sqlite_int64 = int64; + sqlite_uint64 = qword; + PPPChar = ^PPChar; + Psqlite3 = Pointer; + PPSqlite3 = ^PSqlite3; + Psqlite3_context = Pointer; + Psqlite3_stmt = Pointer; + PPsqlite3_stmt = ^Psqlite3_stmt; + Psqlite3_value = Pointer; + PPsqlite3_value = ^Psqlite3_value; //Callback function types //Notice that most functions were named using as prefix the function name that uses them, //rather than describing their functions -type sqlite3_callback = function (_para1:pointer; _para2:longint; _para3:PPchar; _para4:PPchar):longint;cdecl; busy_handler_func = function (_para1:pointer; _para2:longint):longint;cdecl; sqlite3_set_authorizer_func = function (_para1:pointer; _para2:longint; _para3:Pchar; _para4:Pchar; _para5:Pchar; _para6:Pchar):longint;cdecl; @@ -50,96 +94,15 @@ type sqlite3_result_func = procedure (_para1:pointer);cdecl; sqlite3_create_collation_func = function (_para1:pointer; _para2:longint; _para3:pointer; _para4:longint; _para5:pointer):longint;cdecl; sqlite3_collation_needed_func = procedure (_para1:pointer; _para2:Psqlite3; eTextRep:longint; _para4:Pchar);cdecl; - - -const - SQLITE_VERSION = '3.2.1'; - SQLITE_VERSION_NUMBER = 3002001; - - - SQLITE_INTEGER = 1; - SQLITE_FLOAT = 2; -{ #define SQLITE_TEXT 3 // See below } - SQLITE_BLOB = 4; - SQLITE_NULL = 5; - - SQLITE_TEXT = 3; - - SQLITE3_TEXT = 3; - - SQLITE_UTF8 = 1; - SQLITE_UTF16LE = 2; - SQLITE_UTF16BE = 3; -{ Use native byte order } - SQLITE_UTF16 = 4; -{ sqlite3_create_function only } - SQLITE_ANY = 5; - +{$ifndef win32} var - sqlite3_version : Pchar;cvar;external; + //This is not working under windows. Any clues? sqlite3_temp_directory : Pchar;cvar;external; - - -function sqlite3_libversion:PChar;cdecl;external External_library name 'sqlite3_libversion'; -//function sqlite3_libversion_number:longint;cdecl;external External_library name 'sqlite3_libversion_number'; - -type - sqlite_int64 = int64; - sqlite_uint64 = qword; +{$endif} function sqlite3_close(_para1:Psqlite3):longint;cdecl;external External_library name 'sqlite3_close'; - function sqlite3_exec(_para1:Psqlite3; sql:Pchar; _para3:sqlite3_callback; _para4:pointer; errmsg:PPchar):longint;cdecl;external External_library name 'sqlite3_exec'; - -const - SQLITE_OK = 0; { SQL error or missing database } - SQLITE_ERROR = 1;{ An internal logic error in SQLite } - SQLITE_INTERNAL = 2;{ Access permission denied } - SQLITE_PERM = 3; { Callback routine requested an abort } - SQLITE_ABORT = 4; { The database file is locked } - SQLITE_BUSY = 5; { A table in the database is locked } - SQLITE_LOCKED = 6;{ A malloc() failed } - SQLITE_NOMEM = 7; { Attempt to write a readonly database } - SQLITE_READONLY = 8;{ Operation terminated by sqlite3_interrupt() } - SQLITE_INTERRUPT = 9;{ Some kind of disk I/O error occurred } - SQLITE_IOERR = 10; { The database disk image is malformed } - SQLITE_CORRUPT = 11; -{ (Internal Only) Table or record not found } - SQLITE_NOTFOUND = 12; -{ Insertion failed because database is full } - SQLITE_FULL = 13; -{ Unable to open the database file } - SQLITE_CANTOPEN = 14; -{ Database lock protocol error } - SQLITE_PROTOCOL = 15; -{ Database is empty } - SQLITE_EMPTY = 16; -{ The database schema changed } - SQLITE_SCHEMA = 17; -{ Too much data for one row of a table } - SQLITE_TOOBIG = 18; -{ Abort due to contraint violation } - SQLITE_CONSTRAINT = 19; -{ Data type mismatch } - SQLITE_MISMATCH = 20; -{ Library used incorrectly } - SQLITE_MISUSE = 21; -{ Uses OS features not supported on host } - SQLITE_NOLFS = 22; -{ Authorization denied } - SQLITE_AUTH = 23; -{ Auxiliary database format error } - SQLITE_FORMAT = 24; -{ 2nd parameter to sqlite3_bind out of range } - SQLITE_RANGE = 25; -{ File opened that is not a database file } - SQLITE_NOTADB = 26; -{ sqlite3_step() has another row ready } - SQLITE_ROW = 100; -{ sqlite3_step() has finished executing } - SQLITE_DONE = 101; - function sqlite3_last_insert_rowid(_para1:Psqlite3):sqlite_int64;cdecl;external External_library name 'sqlite3_last_insert_rowid'; function sqlite3_changes(_para1:Psqlite3):longint;cdecl;external External_library name 'sqlite3_changes'; function sqlite3_total_changes(_para1:Psqlite3):longint;cdecl;external External_library name 'sqlite3_total_changes'; @@ -162,7 +125,6 @@ function sqlite3_snprintf(_para1:longint; _para2:Pchar; _para3:Pchar):Pchar;cdec function sqlite3_set_authorizer(_para1:Psqlite3; xAuth:sqlite3_set_authorizer_func; pUserData:pointer):longint;cdecl;external External_library name 'sqlite3_set_authorizer'; - const SQLITE_COPY = 0; { Index Name Table Name } @@ -222,9 +184,9 @@ const { #define SQLITE_OK 0 // Allow access (This is actually defined above) } { Abort the SQL statement with an error } - SQLITE_DENY = 1; + SQLITE_DENY = 1; { Don't allow access, but don't generate an error } - SQLITE_IGNORE = 2; + SQLITE_IGNORE = 2; function sqlite3_trace(_para1:Psqlite3; xTrace:sqlite3_trace_func; _para3:pointer):pointer;cdecl;external External_library name 'sqlite3_trace'; procedure sqlite3_progress_handler(_para1:Psqlite3; _para2:longint; _para3:sqlite3_progress_handler_func; _para4:pointer);cdecl;external External_library name 'sqlite3_progress_handler'; @@ -318,19 +280,19 @@ function sqlite3_create_collation16(_para1:Psqlite3; zName:Pchar; eTextRep:longi function sqlite3_collation_needed(_para1:Psqlite3; _para2:pointer; _para3:sqlite3_collation_needed_func):longint;cdecl;external External_library name 'sqlite3_collation_needed'; function sqlite3_collation_needed16(_para1:Psqlite3; _para2:pointer; _para3:sqlite3_collation_needed_func):longint;cdecl;external External_library name 'sqlite3_collation_needed16'; - -//function sqlite3_key(db:Psqlite3; pKey:pointer; nKey:longint):longint;cdecl;external External_library name 'sqlite3_key'; - -//function sqlite3_rekey(db:Psqlite3; pKey:pointer; nKey:longint):longint;cdecl;external External_library name 'sqlite3_rekey'; - -//function sqlite3_sleep(_para1:longint):longint;cdecl;external External_library name 'sqlite3_sleep'; - -//function sqlite3_expired(_para1:Psqlite3_stmt):longint;cdecl;external External_library name 'sqlite3_expired'; - -//function sqlite3_global_recover:longint;cdecl;external External_library name 'sqlite3_global_recover'; +function sqlite3_libversion:PChar;cdecl;external External_library name 'sqlite3_libversion'; +//Alias for allowing better code portability (win32 is not working with external variables) +function sqlite3_version:PChar;cdecl;external External_library name 'sqlite3_libversion'; + +// Not published functions +//function sqlite3_libversion_number:longint;cdecl;external External_library name 'sqlite3_libversion_number'; +//function sqlite3_key(db:Psqlite3; pKey:pointer; nKey:longint):longint;cdecl;external External_library name 'sqlite3_key'; +//function sqlite3_rekey(db:Psqlite3; pKey:pointer; nKey:longint):longint;cdecl;external External_library name 'sqlite3_rekey'; +//function sqlite3_sleep(_para1:longint):longint;cdecl;external External_library name 'sqlite3_sleep'; +//function sqlite3_expired(_para1:Psqlite3_stmt):longint;cdecl;external External_library name 'sqlite3_expired'; +//function sqlite3_global_recover:longint;cdecl;external External_library name 'sqlite3_global_recover'; implementation - end.