// Minimal FreePascal wrapper for sqlite3.dll
unit CJHSqlite3;
interface
const
//'** Many SQLite functions return an integer result code from the set shown
//'** here in order to indicates success or failure.
//'**
//'** See also: [SQLITE_IOERR_READ | extended result codes]
//'*/
SQLITE_OK = 0 ; // ' /* Successful result */
//'/* beginning-of-error-codes */
SQLITE_ERROR = 1 ; // ' /* SQL error or missing database */
SQLITE_INTERNAL = 2 ; // ' /* NOT USED. 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; // ' /* NOT USED. 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; // ' /* NOT USED. Database lock protocol error */
SQLITE_EMPTY = 16; // ' /* Database is empty */
SQLITE_SCHEMA = 17; // ' /* The database schema changed */
SQLITE_TOOBIG = 18; // ' /* String or BLOB exceeds size limit */
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 */
//'/* end-of-error-codes */
function sqlite3_open(ppath: pChar; var hDB : dword) : longint; cdecl;
external 'sqlite3' name 'sqlite3_open';
function sqlite3_close(hDB : dword) : longint; cdecl;
external 'sqlite3' name 'sqlite3_close';
function sqlite3_get_table( db: cardinal; sql: pchar; var result: PPCharArray;
var RowCount: Cardinal; var ColCount: Cardinal;
var errmsg: pchar): integer; cdecl;
external 'sqlite3' name 'sqlite3_get_table';
procedure sqlite3_free( pzerms: dword); cdecl;
external 'sqlite3' name 'sqlite3_free';
procedure sqlite3_free_Table( p: dword); cdecl;
external 'sqlite3' name 'sqlite3_free_table';
//
type
Qlite = class
public
hDB : dword; { DB handle }
sdbpath : string; { DB path }
SQL : string; { SQL query }
pszerms : pchar; { ptr to error message string }
nerror : longint; { error number }
nrows : longint; { no of rows in results }
ncolumns : longint; { no of columns in results }
pQresults : dword; { ptr to sqlite's results }
function Qlopen (s_in_path : string) : longint;
function Qlclose : longint;
function QlQuery : longint;
end;
//
implementation;
// open db identified by spath and return error code
function Qlopen (s_in_path : string) : longint ;
begin
sdbpath := '';
pszerms := nil;
SQL := '';
hDB := 0;
nrows := 0; ncolumns := 0;
pQresults := nil;
nerror := sqlite3_open( @s_in_path[0], hDB);
if nerror = SQLITE_OK then sdbpath := s_in_path
QLopen = nerror;
end;
// close db and return error code
function Qlclose : longint;
begin
if pszerms <> nil then sqlite3_free( pszerms);
if pQresults <> nil then sqlite_free_table(pQresults);
if sqlite3_close(hDB) <> SQLITE_OK then
Qlclose := 1;
end;
end;
// issue query and return sqlite error code
function QlQuery : longint;
if pQresults <> nil then begin
sqlite_free_table(pQresults);
ncolumns := 0; nrows := 0;
end;
if pszerms <> nil then begin
sqlite3_free( pszerms);
nerror := 0;
end;
QlQuery := sqlite3_get_table( hDB,
pChar(SQL),
pointer(pQresults),
nrows, ncolumns,
pChar(pzerms));
end; {function}
end; {type}
end.