Code: Select all
; SQLite3 Include for Windows, Linux and MacOS
; based on a example by MLK
; binding functions based on code by Kiffi (PBOSL)
; tested with Ansi and Unicode under WinXP and XUbuntu
; Autor: ts-soft
; new Version For PB 4.20 + using static lib from pb
; ascii compatibility-functions removed!
Enumeration
#SQLITE3_OK = 0 ; Successful Result
#SQLITE3_ERROR = 1 ; SQL error Or missing database
#SQLITE3_INTERNAL = 2 ; An internal logic error in SQLite
#SQLITE3_PERM = 3 ; Access permission denied
#SQLITE3_ABORT = 4 ; Callback routine requested An abort
#SQLITE3_BUSY = 5 ; The database file is locked
#SQLITE3_LOCKED = 6 ; A table in The database is locked
#SQLITE3_NOMEM = 7 ; A malloc() failed
#SQLITE3_READONLY = 8 ; Attempt To write A readonly database
#SQLITE3_INTERRUPT = 9 ; Operation terminated by SQLite_Interrupt()
#SQLITE3_IOERR = 10 ; Some kind of disk I/O error occurred
#SQLITE3_CORRUPT = 11 ; The database disk image is malformed
#SQLITE3_NOTFOUND = 12 ; (internal Only) table Or record not found
#SQLITE3_FULL = 13 ; Insertion failed because database is full
#SQLITE3_CANTOPEN = 14 ; Unable To open The database file
#SQLITE3_PROTOCOL = 15 ; database lock protocol error
#SQLITE3_EMPTY = 16 ; (internal Only) database table is empty
#SQLITE3_SCHEMA = 17 ; The database schema changed
#SQLITE3_TOOBIG = 18 ; Too much Data For one Row of A table
#SQLITE3_CONStraint = 19 ; abort due To contraint violation
#SQLITE3_MISMATCH = 20 ; Data type mismatch
#SQLITE3_MISUSE = 21 ; Library used incorrectly
#SQLITE3_NOLFS = 22 ; Uses OS features not supported on host
#SQLITE3_AUTH = 23 ; Authorization denied
#SQLITE3_ROW = 100 ; sqlite_step() has another Row ready
#SQLITE3_DONE = 101 ; sqlite_step() has finished executing
#SQLITE3_STATIC = 0
#SQLITE_TRANSIENT = -1
#SQLITE_INTEGER = 1
#SQLITE_FLOAT = 2
#SQLITE_TEXT = 3
#SQLITE_BLOB = 4
#SQLITE_NULL = 5
EndEnumeration
UseSQLiteDatabase()
ImportC ""
sqlite3_close (hDB.l)
sqlite3_errcode (hDB.l)
sqlite3_errmsg (hDB.l)
sqlite3_errmsg16 (hDB.l)
sqlite3_exec (hDB.l, Statement.p-utf8, cb.l = 0, cbdata.l = 0, errmsg.l = 0)
sqlite3_free_table (*table)
sqlite3_get_table (hDB.l, Statement.p-utf8, *table, nRow.l, nColumn.l, errmsg.l = 0)
sqlite3_libversion ()
sqlite3_open (filename.s, *hDB)
sqlite3_open16 (filename.s, *hDB)
sqlite3_last_insert_rowid (hDB.l)
sqlite3_prepare (hDB.l, Statement.p-utf8, nBytes.l, *hResult, *pzTail = 0)
sqlite3_prepare16 (hDB.l, Statement.p-unicode, nBytes.l, *hResult, *pzTail = 0)
sqlite3_finalize (lStatement.l)
sqlite3_reset(lStatement.l)
sqlite3_step (lStatement.l)
sqlite3_bind_blob (lStatement.l, lIndex.l, lBinaryBuffer.l, lBinaryBufferLength.l, *void = -1)
sqlite3_bind_double (lStatement.l, lIndex.l, dValue.d)
sqlite3_bind_int (lStatement.l, lIndex.l, lValue.l)
sqlite3_bind_int64 (lStatement.l, lIndex.l, qValue.q)
sqlite3_bind_text (lStatement, lIndex, lTextBuffer.p-ascii, len.l = -1, type.l = #SQLITE_TRANSIENT)
sqlite3_bind_text16 (lStatement, lIndex, lTextBuffer.p-unicode, len.l = -1, type.l = #SQLITE_TRANSIENT)
sqlite3_column (lStatement, lCol.l)
sqlite3_column_double (lStatement, lCol.l)
sqlite3_column_quad (lStatement, lCol.l)
sqlite3_column_blob (lStatement, lCol.l)
sqlite3_column_bytes (lStatement, lCol.l)
sqlite3_column_bytes16 (lStatement, lCol.l)
sqlite3_column_int (lStatement, lCol.l)
sqlite3_column_int64 (lStatement, lCol.l)
sqlite3_column_text (lStatement, lCol.l)
sqlite3_column_text16 (lStatement, lCol.l)
sqlite3_column_type (lStatement, lCol.l)
EndImport
Structure SQ3_TABLEMAP
Table.l
Rows.l
Cols.l
RowPos.l
ColPos.l
EndStructure
Procedure.l SQLiteClose(hDB.l)
If Not hDB : ProcedureReturn #False : EndIf
If Not sqlite3_close(hDB)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteOpen(FileName.s)
Protected hDB.l
CompilerIf #PB_Compiler_Unicode
If Not sqlite3_open16(FileName, @hDB)
ProcedureReturn hDB
EndIf
CompilerElse
If Not sqlite3_open(FileName, @hDB)
ProcedureReturn hDB
EndIf
CompilerEndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteErrorCode(hDB.l)
If Not hDB : ProcedureReturn -1 : EndIf
ProcedureReturn sqlite3_errcode(hDB)
EndProcedure
Procedure.s SQLiteErrorMsg(hDB.l)
If Not hDB : ProcedureReturn "Database handle missing" : EndIf
CompilerIf #PB_Compiler_Unicode
ProcedureReturn PeekS(sqlite3_errmsg16(hDB))
CompilerElse
ProcedureReturn PeekS(sqlite3_errmsg(hDB))
CompilerEndIf
EndProcedure
Procedure.s SQLiteLibversion()
ProcedureReturn PeekS(sqlite3_libversion(), #PB_Any, #PB_Ascii)
EndProcedure
Procedure.l SQLiteExecute(hDB.l, Statement.s, callback.l = 0, cbpara.l = 0)
If Not hDB : ProcedureReturn #False : EndIf
If Not sqlite3_exec(hDB, Statement, callback, cbpara)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteLastInsertRowId(hDB.l)
If Not hDB : ProcedureReturn #False : EndIf
ProcedureReturn sqlite3_last_insert_rowid(hDB)
EndProcedure
; table-functions
Procedure.l SQliteFreeTable(*table.SQ3_TABLEMAP)
If *table
sqlite3_free_table(*table\Table)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteGetTable(hDB.l, Statement.s, *table.SQ3_TABLEMAP)
Protected nRow.l, nColumn.l, lResultPtr.l, result.l
If Not hDB : ProcedureReturn #False : EndIf
result = sqlite3_get_table(hDB, Statement, @lResultPtr, @nRow, @nColumn)
If Not result
*table\Table = lResultPtr
*table\Rows = nRow
*table\Cols = nColumn
*table\RowPos = 0
*table\ColPos = 0
ProcedureReturn *table
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteNextRow(*Table.SQ3_TABLEMAP)
If *Table
If *Table\RowPos < *Table\Rows
*Table\RowPos + 1
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteNextCol(*Table.SQ3_TABLEMAP)
If *Table
If *Table\ColPos < *Table\Cols
*Table\ColPos + 1
ProcedureReturn #True
Else
*Table\ColPos = 0
EndIf
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteSelectRow(*Table.SQ3_TABLEMAP, Row.l)
If *Table
If Row > 0 And Row <= *Table\Rows
*Table\RowPos = Row
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteSelectCol(*Table.SQ3_TABLEMAP, Col.l)
If *Table
If Col > 0 And Col <= *Table\Cols
*Table\ColPos = Col
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteSelectPos(*Table.SQ3_TABLEMAP, Row.l, Col.l)
If *Table
If Row > 0 And Row <= *Table\Rows And Col > 0 And Col <= *Table\Cols
*Table\RowPos = Row
*Table\ColPos = Col
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteResetPos(*Table.SQ3_TABLEMAP)
If *Table
*Table\RowPos = 0
*Table\ColPos = 0
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.s SQLiteColName(*Table.SQ3_TABLEMAP, Col.l)
Protected *val.l
If *Table
If Col > 0 And Col <= *Table\Cols
*val.l = PeekL(*Table\Table + ((Col - 1) * 4))
If *val
ProcedureReturn PeekS(*val, #PB_Any, #PB_UTF8)
EndIf
EndIf
EndIf
ProcedureReturn ""
EndProcedure
Procedure.s SQLiteValue(*Table.SQ3_TABLEMAP)
Protected *val.l
If *Table
If *Table\RowPos > 0 And *Table\RowPos <= *Table\Rows And *Table\ColPos > 0 And *Table\ColPos <= *Table\Cols
*val.l = PeekL(*Table\Table + ((*Table\ColPos - 1 + (*Table\RowPos * *Table\Cols)) * 4))
If *val
ProcedureReturn PeekS(*val, #PB_Any, #PB_UTF8)
EndIf
EndIf
EndIf
ProcedureReturn ""
EndProcedure
Procedure.s SQLiteRowValue(*Table.SQ3_TABLEMAP, Row.l)
Protected *val.l
If *Table
If Row > 0 And Row <= *Table\Rows And *Table\Cols > 0 And *Table\Cols <= *Table\Cols
*val.l = PeekL(*Table\Table + ((*Table\Cols - 1 + (Row * *Table\Cols)) * 4))
If *val
ProcedureReturn PeekS(*val, #PB_Any, #PB_UTF8)
EndIf
EndIf
EndIf
ProcedureReturn ""
EndProcedure
Procedure.s SQLiteColValue(*Table.SQ3_TABLEMAP, Col.l)
Protected *val.l
If *Table
If *Table\RowPos > 0 And *Table\RowPos <= *Table\Rows And Col > 0 And Col <= *Table\Cols
*val.l = PeekL(*Table\Table + ((Col - 1 + (*Table\RowPos * *Table\Cols)) * 4))
If *val
ProcedureReturn PeekS(*val, #PB_Any, #PB_UTF8)
EndIf
EndIf
EndIf
ProcedureReturn ""
EndProcedure
Procedure.s SQLiteSelectValue(*Table.SQ3_TABLEMAP, Row.l, Col.l)
Protected *val.l
If *Table
If Row > 0 And Row <= *Table\Rows And Col > 0 And Col <= *Table\Cols
*val.l = PeekL(*Table\Table + ((Col - 1 + (Row * *Table\Cols)) * 4))
If *val
ProcedureReturn PeekS(*val, #PB_Any, #PB_UTF8)
EndIf
EndIf
EndIf
ProcedureReturn ""
EndProcedure
Procedure.l SQLiteRows(*Table.SQ3_TABLEMAP)
If *Table
ProcedureReturn *Table\Rows
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteCols(*Table.SQ3_TABLEMAP)
If *Table
ProcedureReturn *Table\Cols
EndIf
ProcedureReturn #False
EndProcedure
; binding-functions
Procedure.l SQLitePrepare(hDB.l, Statement.s); Result is lStatement
Protected Result.l
CompilerIf #PB_Compiler_Unicode
If Not sqlite3_prepare16(hDB, Statement, -1, @Result)
ProcedureReturn Result
EndIf
CompilerElse
If Not sqlite3_prepare(hDB, Statement, -1, @Result)
ProcedureReturn Result
EndIf
CompilerEndIf
EndProcedure
Procedure.l SQLiteFinalize(lStatement.l)
If Not sqlite3_finalize(lStatement)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteReset(lStatement.l)
If Not sqlite3_reset(lStatement)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteStep(lStatement.l)
If sqlite3_step(lStatement) = #SQLITE3_ROW
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteBindBlob(lStatement.l, lIndex.l, lBuffer.l, lBufferLength.l)
If Not sqlite3_bind_blob(lStatement, lIndex, lBuffer, lBufferLength)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteBindDouble(lStatement.l, lIndex.l, dValue.d)
If Not sqlite3_bind_double(lStatement, lIndex, dValue)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteBindLong(lStatement.l, lIndex.l, lValue.l)
If Not sqlite3_bind_int(lStatement, lIndex, lValue)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteBindQuad(lStatement.l, lIndex.l, qValue.q)
If Not sqlite3_bind_int64(lStatement, lIndex, qValue)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteBindText(lStatement.l, lIndex.l, Text.s)
CompilerIf #PB_Compiler_Unicode
If Not sqlite3_bind_text16(lStatement, lIndex, Text)
ProcedureReturn #True
EndIf
CompilerElse
If Not sqlite3_bind_text(lStatement, lIndex, Text)
ProcedureReturn #True
EndIf
CompilerEndIf
ProcedureReturn #False
EndProcedure
Procedure.l SQLiteColumnBlob(lStatement.l, lColumn.l)
ProcedureReturn sqlite3_column_blob(lStatement, lColumn)
EndProcedure
Procedure.l SQLiteColumnByte(lStatement.l, lColumn.l)
CompilerIf #PB_Compiler_Unicode
ProcedureReturn sqlite3_column_bytes16(lStatement, lColumn)
CompilerElse
ProcedureReturn sqlite3_column_bytes(lStatement, lColumn)
CompilerEndIf
EndProcedure
Procedure.d SQLiteColumnDouble(lStatement.l, lColumn.l)
ProcedureReturn sqlite3_column_double(lStatement, lColumn)
EndProcedure
Procedure.l SQLiteColumnLong(lStatement.l, lColumn.l)
ProcedureReturn sqlite3_column_int(lStatement, lColumn)
EndProcedure
Procedure.q SQLiteColumnQuad(lStatement.l, lColumn.l)
ProcedureReturn sqlite3_column_int64(lStatement, lColumn)
EndProcedure
Procedure.s SQLiteColumnText(lStatement.l, lColumn.l)
Protected Result.l
CompilerIf #PB_Compiler_Unicode
Result = sqlite3_column_text16(lStatement, lColumn)
If Result
ProcedureReturn PeekS(Result)
EndIf
CompilerElse
Result = sqlite3_column_text(lStatement, lColumn)
If Result
ProcedureReturn PeekS(Result)
EndIf
CompilerEndIf
EndProcedure
Procedure.l SQLiteColumnType(lStatement.l, lColumn.l)
ProcedureReturn sqlite3_column_type(lStatement, lColumn)
EndProcedure