sqlite3.bac
'
' Simple SQLite3 wrapper - PvE May 2010, GPL.
'
' SQL syntax here: http://www.sqlite.org/lang.html
'
' Version 1.0: initial release
' Version 1.1: fixed compile warning in DB_ERR$
' Version 1.2: adjustments for including separate functions
' Version 1.3: adapted for BaCon 3.0 and higher
' Version 1.4: added callback method to obtain records.
' Version 1.5: improved import logic.
' Version 1.6: callbacked function in sqlite3_exec should return a value
'---------------------------------------------------------------------------------------------------------
CALL INIT
REM --------------------------------------------------------------------------------------------------
SUB INIT
LOCAL sqlite_LIB$
LOCAL sqlite_seq = -1
CATCH GOTO sqlite_import_retry
sqlite_LIB$ = "libsqlite3.so.0"
sqlite_seq = -1
LABEL sqlite_import_retry
INCR sqlite_seq
IF sqlite_seq > 100 THEN GOTO Print_Error
sqlite_LIB$ = LEFT$(sqlite_LIB$, INSTRREV(sqlite_LIB$, ".")) & STR$(sqlite_seq)
IMPORT "sqlite3_open(char*,long)" FROM sqlite_LIB$ TYPE int
CATCH RESET
IMPORT "sqlite3_close(long)" FROM sqlite_LIB$ TYPE int
IMPORT "sqlite3_errmsg(long)" FROM sqlite_LIB$ TYPE char*
IMPORT "sqlite3_exec(long,char*,void*,void*,long)" FROM sqlite_LIB$ TYPE int
IMPORT "sqlite3_free(void*)" FROM sqlite_LIB$ TYPE void
IMPORT "sqlite3_libversion(void)" FROM sqlite_LIB$ TYPE char*
CONST SQLITE_OK = 0
DECLARE DB_FS$, DB_RS$, DB_RESULT$, DB_ERROR$
DECLARE sqlite_internal_flag
DB_FS$ = TAB$(1)
DB_RS$ = NL$
DB_VERSION$ = sqlite3_libversion()
EXIT SUB
REM Show error
LABEL Print_Error
PRINT "SQLite library not found!"
END
END SUB
'---------------------------------------------------------------------------------------------------------
FUNCTION DB_OPEN(STRING name)
LOCAL db, result
result = sqlite3_open(name, ADDRESS(db))
IF result THEN RETURN result
RETURN db
END FUNCTION
'---------------------------------------------------------------------------------------------------------
FUNCTION sqlite_response(void *NotUsed, int amount, char **value, char **column_name) : REM INCLUDE
LOCAL i
IF sqlite_internal_flag AND amount > 0 THEN
DB_RESULT$ = ""
FOR i = 0 TO amount - 1
DB_RESULT$ = DB_RESULT$ & column_name[i] & DB_FS$
NEXT
DB_RESULT$ = DB_RESULT$ & DB_RS$
sqlite_internal_flag = FALSE
ENDIF
IF amount > 0 THEN
FOR i = 0 TO amount - 1
DB_RESULT$ = DB_RESULT$ & value[i] & DB_FS$
NEXT
DB_RESULT$ = DB_RESULT$ & DB_RS$
END IF
RETURN FALSE
ENDFUNCTION
FUNCTION DB_SQL(NUMBER db, STRING sql$)
LOCAL result TYPE int
LOCAL err_msg TYPE char*
DB_ERROR$ = ""
sqlite_internal_flag = TRUE
result = sqlite3_exec(db, sql$, sqlite_response, 0, ADDRESS(err_msg))
IF result <> SQLITE_OK THEN
DB_ERROR$ = err_msg
sqlite3_free(err_msg)
result = FALSE
ELSE
result = TRUE
END IF
RETURN result
END FUNCTION
'---------------------------------------------------------------------------------------------------------
SUB sqlite_results(void (*UserFunc)(int, char**, char**), int amount, STRING value$[], STRING column$[]) : REM INCLUDE
CALL (*UserFunc)(amount, column$, value$)
END SUB
FUNCTION DB_QUERY(NUMBER db, STRING sql$, void* CallB)
LOCAL result TYPE int
LOCAL err_msg TYPE char*
IF sqlite3_exec(db, sql$, sqlite_results, CallB, ADDRESS(err_msg)) <> SQLITE_OK THEN
DB_ERROR$ = err_msg
sqlite3_free(err_msg)
result = FALSE
ELSE
result = TRUE
END IF
RETURN result
END FUNCTION
'---------------------------------------------------------------------------------------------------------
FUNCTION DB_CLOSE(NUMBER db)
LOCAL result TYPE int
result = sqlite3_close(db)
RETURN result
END FUNCTION
'---------------------------------------------------------------------------------------------------------
FUNCTION DB_STATUS$(NUMBER db)
LOCAL status$
status$ = sqlite3_errmsg(db)
RETURN status$
END FUNCTION
'---------------------------------------------------------------------------------------------------------
CATCH RESET
Generated by GNU Enscript 1.6.6.