IMPLEMENTATION MODULE SQLiteUtils ; FROM SYSTEM IMPORT ADDRESS, ADR; FROM SQLite IMPORT DbHandle, StmtHandle, sqlite3_libversion, sqlite3_errmsg, sqlite3_errstr, sqlite3_exec, sqlite3_free, sqlite3_bind_text, sqlite3_bind_blob; FROM libc IMPORT strlen, strncpy; PROCEDURE CStrToM2 (src: ADDRESS; VAR dst: ARRAY OF CHAR); VAR n: CARDINAL; BEGIN IF HIGH(dst) < 0 THEN RETURN END; IF src = NIL THEN dst[0] := 0C; RETURN END; n := VAL(CARDINAL, strlen(src)); IF n > HIGH(dst) THEN n := HIGH(dst) END; strncpy(ADR(dst), src, n); IF n <= HIGH(dst) THEN dst[n] := 0C END END CStrToM2; PROCEDURE ErrMsg (db: DbHandle; VAR buf: ARRAY OF CHAR); BEGIN CStrToM2(sqlite3_errmsg(db), buf) END ErrMsg; PROCEDURE ErrStr (code: INTEGER; VAR buf: ARRAY OF CHAR); BEGIN CStrToM2(sqlite3_errstr(code), buf) END ErrStr; PROCEDURE LibVersionStr (VAR buf: ARRAY OF CHAR); BEGIN CStrToM2(sqlite3_libversion(), buf) END LibVersionStr; PROCEDURE StaticDestr () : ADDRESS; BEGIN RETURN VAL(ADDRESS, 0) END StaticDestr; PROCEDURE TransientDestr () : ADDRESS; BEGIN RETURN VAL(ADDRESS, -1) END TransientDestr; PROCEDURE BindTextCopy (stmt: StmtHandle; idx: INTEGER; v: ARRAY OF CHAR) : INTEGER; BEGIN RETURN sqlite3_bind_text(stmt, idx, v, -1, TransientDestr()) END BindTextCopy; PROCEDURE BindBlobCopy (stmt: StmtHandle; idx: INTEGER; data: ADDRESS; n: INTEGER) : INTEGER; BEGIN RETURN sqlite3_bind_blob(stmt, idx, data, n, TransientDestr()) END BindBlobCopy; PROCEDURE ExecSimple (db: DbHandle; sql: ARRAY OF CHAR) : INTEGER; BEGIN RETURN sqlite3_exec(db, sql, NIL, NIL, NIL) END ExecSimple; PROCEDURE ExecWithErr (db: DbHandle; sql: ARRAY OF CHAR; VAR buf: ARRAY OF CHAR) : INTEGER; VAR rc: INTEGER; msg: ADDRESS; BEGIN msg := NIL; rc := sqlite3_exec(db, sql, NIL, NIL, ADR(msg)); IF msg # NIL THEN CStrToM2(msg, buf); sqlite3_free(msg) ELSIF HIGH(buf) >= 0 THEN buf[0] := 0C END; RETURN rc END ExecWithErr; END SQLiteUtils.