SQLiteConnection.mod 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. MODULE SQLiteConnection;
  2. (* Connection flags, close_v2, changes and last_insert_rowid. *)
  3. FROM SYSTEM IMPORT ADDRESS;
  4. FROM SQLite IMPORT
  5. SQLiteOk,
  6. SQLiteOpenReadOnly, SQLiteOpenReadWrite, SQLiteOpenCreate,
  7. SQLiteOpenMemory, SQLiteReadOnly,
  8. sqlite3_open_v2, sqlite3_exec, sqlite3_close_v2,
  9. sqlite3_prepare_v2, sqlite3_finalize,
  10. sqlite3_changes, sqlite3_total_changes, sqlite3_last_insert_rowid,
  11. sqlite3_free;
  12. VAR
  13. ExitCode : INTEGER;
  14. db, stmt, errmsg : ADDRESS;
  15. rc : INTEGER;
  16. ok : BOOLEAN;
  17. PROCEDURE ExecSQL (sql : ARRAY OF CHAR) : BOOLEAN;
  18. VAR
  19. errmsg : ADDRESS;
  20. good : BOOLEAN;
  21. BEGIN
  22. errmsg := NIL;
  23. good := sqlite3_exec(db, sql, NIL, NIL, errmsg) = SQLiteOk;
  24. IF errmsg # NIL THEN
  25. sqlite3_free(errmsg)
  26. END;
  27. RETURN good
  28. END ExecSQL;
  29. BEGIN
  30. ExitCode := 1;
  31. db := NIL; stmt := NIL;
  32. ok := FALSE;
  33. IF (sqlite3_open_v2(":memory:", db,
  34. SQLiteOpenReadWrite + SQLiteOpenCreate + SQLiteOpenMemory,
  35. NIL) = SQLiteOk) AND (db # NIL) THEN
  36. IF ExecSQL("CREATE TABLE items(id INTEGER PRIMARY KEY, v TEXT);") THEN
  37. ok := TRUE
  38. END;
  39. IF ok THEN
  40. ok := ExecSQL("INSERT INTO items(v) VALUES ('a');")
  41. AND (sqlite3_changes(db) = 1)
  42. AND (sqlite3_total_changes(db) = 1)
  43. AND (sqlite3_last_insert_rowid(db) = 1)
  44. END;
  45. IF ok THEN
  46. ok := ExecSQL("INSERT INTO items(v) VALUES ('b');")
  47. AND (sqlite3_changes(db) = 1)
  48. AND (sqlite3_total_changes(db) = 2)
  49. AND (sqlite3_last_insert_rowid(db) = 2)
  50. END;
  51. IF ok THEN
  52. ok := ExecSQL("UPDATE items SET v = v || '!';")
  53. AND (sqlite3_changes(db) = 2)
  54. AND (sqlite3_total_changes(db) = 4)
  55. AND (sqlite3_last_insert_rowid(db) = 2)
  56. END;
  57. IF ok THEN
  58. ok := ExecSQL("DELETE FROM items WHERE id = 1;")
  59. AND (sqlite3_changes(db) = 1)
  60. AND (sqlite3_total_changes(db) = 5)
  61. END;
  62. (* Leave a statement open across close_v2 to exercise deferred close. *)
  63. IF ok THEN
  64. rc := sqlite3_prepare_v2(db, "SELECT 1;", -1, stmt, NIL);
  65. ok := (rc = SQLiteOk) AND (stmt # NIL)
  66. END;
  67. IF ok THEN
  68. ok := sqlite3_close_v2(db) = SQLiteOk
  69. END;
  70. IF ok THEN
  71. ok := sqlite3_finalize(stmt) = SQLiteOk
  72. END;
  73. stmt := NIL;
  74. db := NIL
  75. END;
  76. (* A read-only connection must reject writes. *)
  77. IF ok THEN
  78. IF sqlite3_open_v2(":memory:", db, SQLiteOpenReadOnly,
  79. NIL) = SQLiteOk THEN
  80. errmsg := NIL;
  81. ok := sqlite3_exec(db, "CREATE TABLE ro(x INTEGER);",
  82. NIL, NIL, errmsg) = SQLiteReadOnly;
  83. IF errmsg # NIL THEN
  84. sqlite3_free(errmsg);
  85. errmsg := NIL
  86. END;
  87. IF sqlite3_close_v2(db) # SQLiteOk THEN ok := FALSE END;
  88. db := NIL
  89. ELSE
  90. ok := FALSE
  91. END
  92. END;
  93. IF ok THEN ExitCode := 42 END
  94. END SQLiteConnection.