'SQLite Framework for PowerBASIC by Nathan Evans
'Tested on PB 6.11 with SQLite 2.8.0
#COMPILE EXE
#INCLUDE "win32api.inc"
%DEBUGMODE = %TRUE
#INCLUDE "debug.inc"
$SQLITE_VERSION = "2.8.0"
%SQLITE_ISO8859 = 1
%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 sqlite_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 '*/ (Internal Only) Database table 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_ROW = 100 '*/ sqlite_step() has another row ready */
%SQLITE_DONE = 101 '*/ sqlite_step() has finished executing */
DECLARE FUNCTION sqlite_open LIB "sqlite.dll" ALIAS "sqlite_open" (szFilename AS ASCIIZ, BYVAL lMode AS LONG, lpErrMsg AS LONG) AS LONG
DECLARE SUB sqlite_close LIB "sqlite.dll" ALIAS "sqlite_close" (BYVAL lpSQLite AS LONG)
'DECLARE FUNCTION sqlite_exec LIB "sqlite.dll" ALIAS "sqlite_exec" (BYVAL hSQLite AS LONG, szSql AS ASCIIZ, BYVAL sqlite_callback AS LONG, cbParam AS ANY, lpErrMsg AS LONG) AS LONG
DECLARE SUB sqlite_freemem LIB "sqlite.dll" ALIAS "sqlite_freemem" (BYVAL lpSz AS LONG)
DECLARE FUNCTION sqlite_last_insert_rowid LIB "sqlite.dll" ALIAS "sqlite_last_insert_rowid" (BYVAL hSQLite AS LONG) AS LONG
DECLARE FUNCTION sqlite_changes LIB "sqlite.dll" ALIAS "sqlite_changes" (BYVAL hSQLite AS LONG) AS LONG
DECLARE FUNCTION sqlite_interrupt LIB "sqlite.dll" ALIAS "sqlite_interrupt" (BYVAL hSQLite AS LONG) AS LONG
DECLARE FUNCTION sqlite_complete LIB "sqlite.dll" ALIAS "sqlite_complete" (szSql AS ASCIIZ) AS LONG
DECLARE FUNCTION sqlite_get_table LIB "sqlite.dll" ALIAS "sqlite_get_table" (BYVAL hSQLite AS LONG, szSql AS ASCIIZ, lpTable AS LONG, nRow AS LONG, nColumn AS LONG, lpErrMsg AS LONG) AS LONG
DECLARE FUNCTION sqlite_free_table LIB "sqlite.dll" ALIAS "sqlite_free_table" (BYVAL lpTable AS LONG) AS LONG
FUNCTION sqlite_readstring(BYVAL lpSz AS ASCIIZ PTR * 255) AS STRING
'Wrapper function that will return an SQLite String from a SQLite Pointer, and then free the allocated memory
FUNCTION = @lpSz
sqlite_freemem lpSz
END FUNCTION
FUNCTION PBMAIN AS LONG
DEBUG_INITIALIZE
LOCAL hSQLite AS LONG
LOCAL lResult AS LONG
LOCAL szFilename AS ASCIIZ * 260
LOCAL lpErrorSz AS LONG
LOCAL lMode AS LONG
LOCAL szSQL AS ASCIIZ * 4096
LOCAL lCbParam AS LONG
LOCAL lpTable AS LONG PTR
LOCAL nRows AS LONG
LOCAL nColumns AS LONG
LOCAL enumI AS LONG
LOCAL szRow AS ASCIIZ PTR
LOCAL szColumn AS ASCIIZ PTR
szFilename = "test.sqlite" 'Path/Filename of SQLite Database
hSQLite = sqlite_open(szFilename, lMode, lpErrorSz )
IF hSQLite THEN
'Succeeded
DEBUG_PRINT "hSQLite Handle: " & FORMAT$(hSQLite)
szSQL = "SELECT * FROM view_events"
lResult = sqlite_get_table(hSQLite, szSQL, lpTable, nRows, nColumns, lpErrorSz)
IF lResult = %SQLITE_OK THEN
'Succeeded
DEBUG_PRINT "SQLite Table: " & FORMAT$(nRows) & "/" & FORMAT$(nColumns)
FOR enumI = 0 TO (nRows + 1) * nColumns - 1
szRow = @lpTable[enumI]
szColumn = @lpTable[enumI MOD nColumns]
IF szColumn = @lpTable[0] THEN
'Current Column = First Column, so it's a New Row.
DEBUG_PRINT $CRLF & "--------------------------------"
END IF
DEBUG_PRINT @szColumn & " - " & @szRow & ""
IF szColumn = @lpTable[nColumns-1] THEN
'Current Column = Last Column, so it's the Last Row
DEBUG_PRINT "--------------------------------" & $CRLF
END IF
NEXT enumI
sqlite_free_table lpTable
ELSE
'Error Occured in sqlite_get_table
DEBUG_PRINT "SQLite Error (" & FORMAT$(lResult) & "): " & sqlite_readstring(lpErrorSz)
END IF
sqlite_close hSQLite
ELSE
'Error Occured in sqlite_open
DEBUG_PRINT "SQLite Error (" & FORMAT$(lResult) & "): " & sqlite_readstring(lpErrorSz)
END IF
MSGBOX "Close?"
DEBUG_TERMINATE
END FUNCTION