PowerBASIC Forums
  Source Code
  The start of a PowerBASIC SQLite framework

Post New Topic  Post A Reply
profile | register | preferences | faq | search

UBBFriend: Email This Page to Someone! next newest topic | next oldest topic
Author Topic:   The start of a PowerBASIC SQLite framework
Nathan Evans
Member
posted April 07, 2003 07:27 AM     Click Here to See the Profile for Nathan Evans     Edit/Delete Message   Reply w/Quote
Hi, I couldn't find any PowerBASIC source codes for SQLite (www.sqlite.org) so decided to start my own.

Here is the beginning of the essential headers, and a little bit of example code which creates a Table and Inserts a row.

Note this program uses the DEBUG.INC module (search this forum for it). If not just turn all occurances of DEBUG_PRINT into MSGBOX, or whatever

REVISION 3

'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_callback(BYVAL pArg AS LONG PTR, BYVAL nArg AS LONG, BYVAL szArg AS LONG PTR, BYVAL szCol AS LONG PTR) AS LONG
'DEBUG_PRINT "sqlite_callback called" & _
' " -pArg: " & format$(@pArg) & _
' " -nArg: " & FORMAT$(nArg) & _
' " -szArg: " & FORMAT$(szArg) & _
' " -szCol: " & FORMAT$(szCol)

REGISTER enumI AS LONG
LOCAL szTmpArg AS ASCIIZ PTR
LOCAL szTmpCol AS ASCIIZ PTR

FOR enumI = 0 TO nArg

szTmpArg = @szArg[enumI]
szTmpCol = @szCol[enumI]

DEBUG_PRINT @szTmpCol & SPACE$( 30 - LEN(@szTmpCol) ) & @szTmpArg

NEXT enumI

FUNCTION = %SQLITE_OK 'Continues the Query
'FUNCTION = %SQLITE_ABORT 'Aborts the rest of this Query

END FUNCTION

FUNCTION sqlite_readstring(BYVAL lpSz AS LONG) AS STRING

LOCAL szBuffer AS ASCIIZ PTR * 255

szBuffer = lpSz

FUNCTION = TRIM$(@szBuffer)

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 cbParam AS LONG


szFilename = "test.sqlite"
lMode = 0
'szError = "None"
hSQLite = sqlite_open(szFilename, lMode, lpErrorSz )

IF hSQLite THEN

'Succeeded
DEBUG_PRINT "hSQLite: " & FORMAT$(hSQLite)

'szSql = "CREATE TABLE ids_events (event_id INTEGER PRIMARY KEY, event_description VARCHAR(128), ip_source VARCHAR(15), ip_destination VARCHAR(15), port_source INTEGER, port_destination INTEGER);"
'szSql = szSql & "INSERT INTO ids_events (event_description) VALUES('Test Desc');"
szSql = "SELECT * FROM ids_events"
lResult = sqlite_exec(hSQLite, szSql, CODEPTR(sqlite_callback), cbParam, lpErrorSz)

IF lResult = %SQLITE_OK THEN
DEBUG_PRINT "lResult: " & FORMAT$(lResult)
ELSE
DEBUG_PRINT "SQLite Error: " & sqlite_readstring(lpErrorSz)
END IF

sqlite_close hSQLite

ELSE

'Error Occured in sqlite_open
DEBUG_PRINT "SQLite Error: " & sqlite_readstring(lpErrorSz)

END IF

MSGBOX "Close?"
DEBUG_TERMINATE
END FUNCTION

------------------
PB6'er from England!
...
#BLOAT 100000000

[This message has been edited by Nathan Evans (edited April 07, 2003).]

IP: Logged

Alfonso Olivares Ramos
Member
posted April 07, 2003 04:37 PM     Click Here to See the Profile for Alfonso Olivares Ramos     Edit/Delete Message   Reply w/Quote
Hello Nathan i try the code, and is great, but one little
thing happend, when i try to make select when only there is
one register in the table , i get a GPF (General Protection
Fault) other way, works great

i'm using PBwin 7.00 and XP Pro

------------------

IP: Logged

Nathan Evans
Member
posted April 08, 2003 12:02 AM     Click Here to See the Profile for Nathan Evans     Edit/Delete Message   Reply w/Quote
Alfonso: I have started a discussion thread in the 'Programming' forum.

See: http://www.powerbasic.com/support/forums/Forum6/HTML/003376.html

------------------
PB6'er from England!
...
#BLOAT 100000000

IP: Logged

Nathan Evans
Member
posted April 08, 2003 10:00 AM     Click Here to See the Profile for Nathan Evans     Edit/Delete Message   Reply w/Quote
REVISION 4

This one prints out all the Rows/Columns in DB.


'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


------------------
PB6'er from England!
...
#BLOAT 100000000

IP: Logged

All times are EasternTime (US)

next newest topic | next oldest topic

Administrative Options: Close Topic | Archive/Move | Delete Topic
Post New Topic  Post A Reply
Hop to:

Contact Us | PowerBASIC BASIC Compilers

Copyright © 1999-2005 PowerBASIC, Inc. All Rights Reserved.


Ultimate Bulletin Board 5.45c