SQLiteUtils.mod 2.0 KB

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