SQLiteUtils.mod 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. IMPLEMENTATION MODULE SQLiteUtils ;
  2. FROM SYSTEM IMPORT ADDRESS, ADR;
  3. FROM SQLite IMPORT DbHandle, StmtHandle, ContextHandle, ValueHandle,
  4. sqlite3_libversion, sqlite3_errmsg, sqlite3_errstr,
  5. sqlite3_exec, sqlite3_free,
  6. sqlite3_bind_text, sqlite3_bind_blob,
  7. sqlite3_value_text, sqlite3_result_text;
  8. FROM libc IMPORT strlen, strncpy;
  9. PROCEDURE CStrToM2 (src: ADDRESS; VAR dst: ARRAY OF CHAR);
  10. VAR n: CARDINAL;
  11. BEGIN
  12. IF HIGH(dst) < 0 THEN RETURN END;
  13. IF src = NIL THEN dst[0] := 0C; RETURN END;
  14. n := VAL(CARDINAL, strlen(src));
  15. IF n > HIGH(dst) THEN n := HIGH(dst) END;
  16. strncpy(ADR(dst), src, n);
  17. IF n <= HIGH(dst) THEN dst[n] := 0C END
  18. END CStrToM2;
  19. PROCEDURE ErrMsg (db: DbHandle; VAR buf: ARRAY OF CHAR);
  20. BEGIN
  21. CStrToM2(sqlite3_errmsg(db), buf)
  22. END ErrMsg;
  23. PROCEDURE ErrStr (code: INTEGER; VAR buf: ARRAY OF CHAR);
  24. BEGIN
  25. CStrToM2(sqlite3_errstr(code), buf)
  26. END ErrStr;
  27. PROCEDURE LibVersionStr (VAR buf: ARRAY OF CHAR);
  28. BEGIN
  29. CStrToM2(sqlite3_libversion(), buf)
  30. END LibVersionStr;
  31. PROCEDURE StaticDestr () : ADDRESS;
  32. BEGIN
  33. RETURN VAL(ADDRESS, 0)
  34. END StaticDestr;
  35. PROCEDURE TransientDestr () : ADDRESS;
  36. BEGIN
  37. RETURN VAL(ADDRESS, -1)
  38. END TransientDestr;
  39. PROCEDURE BindTextCopy (stmt: StmtHandle; idx: INTEGER;
  40. v: ARRAY OF CHAR) : INTEGER;
  41. BEGIN
  42. RETURN sqlite3_bind_text(stmt, idx, v, -1, TransientDestr())
  43. END BindTextCopy;
  44. PROCEDURE BindBlobCopy (stmt: StmtHandle; idx: INTEGER;
  45. data: ADDRESS; n: INTEGER) : INTEGER;
  46. BEGIN
  47. RETURN sqlite3_bind_blob(stmt, idx, data, n, TransientDestr())
  48. END BindBlobCopy;
  49. PROCEDURE ValueText (v: ValueHandle; VAR buf: ARRAY OF CHAR);
  50. BEGIN
  51. CStrToM2(sqlite3_value_text(v), buf)
  52. END ValueText;
  53. PROCEDURE ResultTextCopy (ctx: ContextHandle; str: ARRAY OF CHAR);
  54. BEGIN
  55. sqlite3_result_text(ctx, str, -1, TransientDestr())
  56. END ResultTextCopy;
  57. PROCEDURE ExecSimple (db: DbHandle; sql: ARRAY OF CHAR) : INTEGER;
  58. BEGIN
  59. RETURN sqlite3_exec(db, sql, NIL, NIL, NIL)
  60. END ExecSimple;
  61. PROCEDURE ExecWithErr (db: DbHandle; sql: ARRAY OF CHAR;
  62. VAR buf: ARRAY OF CHAR) : INTEGER;
  63. VAR rc: INTEGER; msg: ADDRESS;
  64. BEGIN
  65. msg := NIL;
  66. rc := sqlite3_exec(db, sql, NIL, NIL, ADR(msg));
  67. IF msg # NIL THEN
  68. CStrToM2(msg, buf);
  69. sqlite3_free(msg)
  70. ELSIF HIGH(buf) >= 0 THEN
  71. buf[0] := 0C
  72. END;
  73. RETURN rc
  74. END ExecWithErr;
  75. END SQLiteUtils.