aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/SQLite/SQLite3.patch
blob: 6fb38db2338fcf7108e1120aa9a559af62223390 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
--- D:/daten/SQLite3.pas	Mon Oct 13 12:38:56 2008
+++ D:/daten/Projekte/ultrastardx/linuxtrunk/src/lib/SQLite/SQLite3.pas	Mon Oct 13 13:31:18 2008
@@ -8,49 +8,66 @@
   which was based on SQLite.pas by Ben Hochstrasser (bhoc@surfeu.ch)
 }
 
+{$IFDEF FPC}
+  {$MODE DELPHI}
+  {$H+}            (* use AnsiString *)
+  {$PACKENUM 4}    (* use 4-byte enums *)
+  {$PACKRECORDS C} (* C/C++-compatible record packing *)
+{$ELSE}
+  {$MINENUMSIZE 4} (* use 4-byte enums *)
+{$ENDIF}
+
 interface
 
 const
-
+{$IF Defined(MSWINDOWS)}
   SQLiteDLL = 'sqlite3.dll';
+{$ELSEIF Defined(DARWIN)}
+  SQLiteDLL = 'libsqlite3.dylib';
+  {$linklib libsqlite3}
+{$ELSEIF Defined(UNIX)}
+  SQLiteDLL = 'sqlite3.so';
+{$IFEND}
 
 // Return values for sqlite3_exec() and sqlite3_step()
 
-  SQLITE_OK = 0; // Successful result
-  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
+const
+  SQLITE_OK          =  0; // Successful result
+  (* beginning-of-error-codes *)
+  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
 
   SQLITE_INTEGER = 1;
-  SQLITE_FLOAT = 2;
-  SQLITE_TEXT = 3;
-  SQLITE_BLOB = 4;
-  SQLITE_NULL = 5;
+  SQLITE_FLOAT   = 2;
+  SQLITE_TEXT    = 3;
+  SQLITE_BLOB    = 4;
+  SQLITE_NULL    = 5;
 
   SQLITE_UTF8     = 1;
   SQLITE_UTF16    = 2;
@@ -58,21 +75,31 @@
   SQLITE_UTF16LE  = 4;
   SQLITE_ANY      = 5;
 
-  SQLITE_TRANSIENT = pointer(-1);
-  SQLITE_STATIC = pointer(0);
+  SQLITE_STATIC    {: TSQLite3Destructor} = Pointer(0);
+  SQLITE_TRANSIENT {: TSQLite3Destructor} = Pointer(-1);
 
 type
   TSQLiteDB = Pointer;
   TSQLiteResult = ^PChar;
   TSQLiteStmt = Pointer;
 
+type
+  PPCharArray = ^TPCharArray; 
+  TPCharArray = array[0 .. (MaxInt div SizeOf(PChar))-1] of PChar;
+
+type
+  TSQLiteExecCallback = function(UserData: Pointer; NumCols: integer; ColValues:
+    PPCharArray; ColNames: PPCharArray): integer; cdecl;
+  TSQLiteBusyHandlerCallback = function(UserData: Pointer; P2: integer): integer; cdecl;
+
   //function prototype for define own collate
-  TCollateXCompare = function(Userdta: pointer; Buf1Len: integer; Buf1: pointer;
+  TCollateXCompare = function(UserData: pointer; Buf1Len: integer; Buf1: pointer;
     Buf2Len: integer; Buf2: pointer): integer; cdecl;
+    
 
-function SQLite3_Open(dbname: PChar; var db: TSqliteDB): integer; cdecl; external SQLiteDLL name 'sqlite3_open';
+function SQLite3_Open(filename: PChar; var db: TSQLiteDB): integer; cdecl; external SQLiteDLL name 'sqlite3_open';
 function SQLite3_Close(db: TSQLiteDB): integer; cdecl; external SQLiteDLL name 'sqlite3_close';
-function SQLite3_Exec(db: TSQLiteDB; SQLStatement: PChar; CallbackPtr: Pointer; Sender: TObject; var ErrMsg: PChar): integer; cdecl; external SQLiteDLL name 'sqlite3_exec';
+function SQLite3_Exec(db: TSQLiteDB; SQLStatement: PChar; CallbackPtr: TSQLiteExecCallback; UserData: Pointer; var ErrMsg: PChar): integer; cdecl; external SQLiteDLL name 'sqlite3_exec';
 function SQLite3_Version(): PChar; cdecl; external SQLiteDLL name 'sqlite3_libversion';
 function SQLite3_ErrMsg(db: TSQLiteDB): PChar; cdecl; external SQLiteDLL name 'sqlite3_errmsg';
 function SQLite3_ErrCode(db: TSQLiteDB): integer; cdecl; external SQLiteDLL name 'sqlite3_errcode';
@@ -82,76 +109,78 @@
 function SQLite3_Complete(P: PChar): boolean; cdecl; external SQLiteDLL name 'sqlite3_complete';
 function SQLite3_LastInsertRowID(db: TSQLiteDB): int64; cdecl; external SQLiteDLL name 'sqlite3_last_insert_rowid';
 procedure SQLite3_Interrupt(db: TSQLiteDB); cdecl; external SQLiteDLL name 'sqlite3_interrupt';
-procedure SQLite3_BusyHandler(db: TSQLiteDB; CallbackPtr: Pointer; Sender: TObject); cdecl; external SQLiteDLL name 'sqlite3_busy_handler';
+procedure SQLite3_BusyHandler(db: TSQLiteDB; CallbackPtr: TSQLiteBusyHandlerCallback; UserData: Pointer); cdecl; external SQLiteDLL name 'sqlite3_busy_handler';
 procedure SQLite3_BusyTimeout(db: TSQLiteDB; TimeOut: integer); cdecl; external SQLiteDLL name 'sqlite3_busy_timeout';
 function SQLite3_Changes(db: TSQLiteDB): integer; cdecl; external SQLiteDLL name 'sqlite3_changes';
 function SQLite3_TotalChanges(db: TSQLiteDB): integer; cdecl; external SQLiteDLL name 'sqlite3_total_changes';
 function SQLite3_Prepare(db: TSQLiteDB; SQLStatement: PChar; nBytes: integer; var hStmt: TSqliteStmt; var pzTail: PChar): integer; cdecl; external SQLiteDLL name 'sqlite3_prepare';
 function SQLite3_Prepare_v2(db: TSQLiteDB; SQLStatement: PChar; nBytes: integer; var hStmt: TSqliteStmt; var pzTail: PChar): integer; cdecl; external SQLiteDLL name 'sqlite3_prepare_v2';
 function SQLite3_ColumnCount(hStmt: TSqliteStmt): integer; cdecl; external SQLiteDLL name 'sqlite3_column_count';
-function Sqlite3_ColumnName(hStmt: TSqliteStmt; ColNum: integer): pchar; cdecl; external SQLiteDLL name 'sqlite3_column_name';
-function Sqlite3_ColumnDeclType(hStmt: TSqliteStmt; ColNum: integer): pchar; cdecl; external SQLiteDLL name 'sqlite3_column_decltype';
-function Sqlite3_Step(hStmt: TSqliteStmt): integer; cdecl; external SQLiteDLL name 'sqlite3_step';
+function SQLite3_ColumnName(hStmt: TSqliteStmt; ColNum: integer): pchar; cdecl; external SQLiteDLL name 'sqlite3_column_name';
+function SQLite3_ColumnDeclType(hStmt: TSqliteStmt; ColNum: integer): pchar; cdecl; external SQLiteDLL name 'sqlite3_column_decltype';
+function SQLite3_Step(hStmt: TSqliteStmt): integer; cdecl; external SQLiteDLL name 'sqlite3_step';
 function SQLite3_DataCount(hStmt: TSqliteStmt): integer; cdecl; external SQLiteDLL name 'sqlite3_data_count';
 
-function Sqlite3_ColumnBlob(hStmt: TSqliteStmt; ColNum: integer): pointer; cdecl; external SQLiteDLL name 'sqlite3_column_blob';
-function Sqlite3_ColumnBytes(hStmt: TSqliteStmt; ColNum: integer): integer; cdecl; external SQLiteDLL name 'sqlite3_column_bytes';
-function Sqlite3_ColumnDouble(hStmt: TSqliteStmt; ColNum: integer): double; cdecl; external SQLiteDLL name 'sqlite3_column_double';
-function Sqlite3_ColumnInt(hStmt: TSqliteStmt; ColNum: integer): integer; cdecl; external SQLiteDLL name 'sqlite3_column_int';
-function Sqlite3_ColumnText(hStmt: TSqliteStmt; ColNum: integer): pchar; cdecl; external SQLiteDLL name 'sqlite3_column_text';
-function Sqlite3_ColumnType(hStmt: TSqliteStmt; ColNum: integer): integer; cdecl; external SQLiteDLL name 'sqlite3_column_type';
-function Sqlite3_ColumnInt64(hStmt: TSqliteStmt; ColNum: integer): Int64; cdecl; external SQLiteDLL name 'sqlite3_column_int64';
+function SQLite3_ColumnBlob(hStmt: TSqliteStmt; ColNum: integer): pointer; cdecl; external SQLiteDLL name 'sqlite3_column_blob';
+function SQLite3_ColumnBytes(hStmt: TSqliteStmt; ColNum: integer): integer; cdecl; external SQLiteDLL name 'sqlite3_column_bytes';
+function SQLite3_ColumnDouble(hStmt: TSqliteStmt; ColNum: integer): double; cdecl; external SQLiteDLL name 'sqlite3_column_double';
+function SQLite3_ColumnInt(hStmt: TSqliteStmt; ColNum: integer): integer; cdecl; external SQLiteDLL name 'sqlite3_column_int';
+function SQLite3_ColumnText(hStmt: TSqliteStmt; ColNum: integer): pchar; cdecl; external SQLiteDLL name 'sqlite3_column_text';
+function SQLite3_ColumnType(hStmt: TSqliteStmt; ColNum: integer): integer; cdecl; external SQLiteDLL name 'sqlite3_column_type';
+function SQLite3_ColumnInt64(hStmt: TSqliteStmt; ColNum: integer): Int64; cdecl; external SQLiteDLL name 'sqlite3_column_int64';
 function SQLite3_Finalize(hStmt: TSqliteStmt): integer; cdecl; external SQLiteDLL name 'sqlite3_finalize';
 function SQLite3_Reset(hStmt: TSqliteStmt): integer; cdecl; external SQLiteDLL name 'sqlite3_reset';
 
-//
+// 
 // In the SQL strings input to sqlite3_prepare() and sqlite3_prepare16(),
 // one or more literals can be replace by a wildcard "?" or ":N:" where
 // N is an integer.  These value of these wildcard literals can be set
 // using the routines listed below.
-//
+// 
 // In every case, the first parameter is a pointer to the sqlite3_stmt
 // structure returned from sqlite3_prepare().  The second parameter is the
 // index of the wildcard.  The first "?" has an index of 1.  ":N:" wildcards
 // use the index N.
-//
- // The fifth parameter to sqlite3_bind_blob(), sqlite3_bind_text(), and
- //sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
+// 
+// The fifth parameter to sqlite3_bind_blob(), sqlite3_bind_text(), and
+//sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
 //text after SQLite has finished with it.  If the fifth argument is the
 // special value SQLITE_STATIC, then the library assumes that the information
 // is in static, unmanaged space and does not need to be freed.  If the
 // fifth argument has the value SQLITE_TRANSIENT, then SQLite makes its
 // own private copy of the data.
-//
+// 
 // The sqlite3_bind_* routine must be called before sqlite3_step() after
 // an sqlite3_prepare() or sqlite3_reset().  Unbound wildcards are interpreted
 // as NULL.
-//
+// 
 
-function SQLite3_Bind_Blob(hStmt: TSqliteStmt; ParamNum: integer;
-  ptrData: pointer; numBytes: integer; ptrDestructor: pointer): integer;
-  cdecl; external SQLiteDLL name 'sqlite3_bind_blob';
-function SQLite3_Bind_Double(hStmt: TSqliteStmt; ParamNum: integer; Data: Double): integer;
+type
+  TSQLite3Destructor = procedure(Ptr: Pointer); cdecl;
+
+function sqlite3_bind_blob(hStmt: TSqliteStmt; ParamNum: integer;
+  ptrData: pointer; numBytes: integer; ptrDestructor: TSQLite3Destructor): integer;
+cdecl; external SQLiteDLL name 'sqlite3_bind_blob';
+function sqlite3_bind_text(hStmt: TSqliteStmt; ParamNum: integer;
+  Text: PChar; numBytes: integer; ptrDestructor: TSQLite3Destructor): integer;
+cdecl; external SQLiteDLL name 'sqlite3_bind_text';
+function sqlite3_bind_double(hStmt: TSqliteStmt; ParamNum: integer; Data: Double): integer;
   cdecl; external SQLiteDLL name 'sqlite3_bind_double';
-function SQLite3_BindInt(hStmt: TSqLiteStmt; ParamNum: integer; intData: integer): integer;
-  cdecl; external 'sqlite3.dll' name 'sqlite3_bind_int';
-function SQLite3_Bind_int64(hStmt: TSqliteStmt; ParamNum: integer; Data: int64): integer;
+function sqlite3_bind_int(hStmt: TSqLiteStmt; ParamNum: integer; Data: integer): integer;
+  cdecl; external SQLiteDLL name 'sqlite3_bind_int';
+function sqlite3_bind_int64(hStmt: TSqliteStmt; ParamNum: integer; Data: int64): integer;
   cdecl; external SQLiteDLL name 'sqlite3_bind_int64';
-function SQLite3_Bind_null(hStmt: TSqliteStmt; ParamNum: integer): integer;
+function sqlite3_bind_null(hStmt: TSqliteStmt; ParamNum: integer): integer;
   cdecl; external SQLiteDLL name 'sqlite3_bind_null';
-function SQLite3_Bind_text(hStmt: TSqliteStmt; ParamNum: integer;
-  Data: PChar; numBytes: integer; ptrDestructor: pointer): integer;
-  cdecl; external SQLiteDLL name 'sqlite3_bind_text';
 
-function SQLite3_Bind_Parameter_Index(hStmt: TSqliteStmt; zName: PChar): integer;
+function sqlite3_bind_parameter_index(hStmt: TSqliteStmt; zName: PChar): integer;
   cdecl; external SQLiteDLL name 'sqlite3_bind_parameter_index';
 
-function sqlite3_enable_shared_cache(value: integer): integer; cdecl; external SQLiteDLL name 'sqlite3_enable_shared_cache';
+function sqlite3_enable_shared_cache(Value: integer): integer; cdecl; external SQLiteDLL name 'sqlite3_enable_shared_cache';
 
 //user collate definiton
-function sqlite3_create_collation(db: TSQLiteDB; Name: Pchar; eTextRep: integer;
+function SQLite3_create_collation(db: TSQLiteDB; Name: Pchar; eTextRep: integer;
   UserData: pointer; xCompare: TCollateXCompare): integer; cdecl; external SQLiteDLL name 'sqlite3_create_collation';
-
 
 function SQLiteFieldType(SQLiteFieldTypeCode: Integer): AnsiString;
 function SQLiteErrorStr(SQLiteErrorCode: Integer): AnsiString;