SQLitePrepared.mod 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. MODULE SQLitePrepared;
  2. (* Prepared statements, bound texts and a result read. *)
  3. FROM SYSTEM IMPORT ADDRESS;
  4. FROM CStr IMPORT CString, Copy;
  5. FROM SQLite IMPORT
  6. SQLiteOk, SQLiteRow, SQLiteDone,
  7. sqlite3_open, sqlite3_close,
  8. sqlite3_prepare_v2, sqlite3_bind_int, sqlite3_bind_text,
  9. sqlite3_step, sqlite3_column_int, sqlite3_column_text,
  10. sqlite3_finalize;
  11. VAR
  12. ExitCode : INTEGER;
  13. db, stmt : ADDRESS;
  14. ctext : CString;
  15. buf : ARRAY [0..63] OF CHAR;
  16. rc : INTEGER;
  17. ok : BOOLEAN;
  18. BEGIN
  19. db := NIL; stmt := NIL;
  20. ok := FALSE;
  21. rc := sqlite3_open(":memory:", db);
  22. IF (rc = SQLiteOk) AND (db # NIL) THEN
  23. rc := sqlite3_prepare_v2(db,
  24. "CREATE TABLE t(x INTEGER, s TEXT);", -1, stmt, NIL);
  25. IF (rc = SQLiteOk) AND (stmt # NIL) THEN
  26. rc := sqlite3_step(stmt);
  27. IF (rc = SQLiteDone) AND (sqlite3_finalize(stmt) = SQLiteOk) THEN
  28. stmt := NIL;
  29. rc := sqlite3_prepare_v2(db,
  30. "INSERT INTO t VALUES (?, ?);", -1, stmt, NIL);
  31. IF (rc = SQLiteOk) AND (stmt # NIL) THEN
  32. IF (sqlite3_bind_int(stmt, 1, 42) = SQLiteOk)
  33. AND (sqlite3_bind_text(stmt, 2, "hello", -1, NIL) = SQLiteOk) THEN
  34. rc := sqlite3_step(stmt);
  35. IF (rc = SQLiteDone) AND (sqlite3_finalize(stmt) = SQLiteOk) THEN
  36. stmt := NIL;
  37. rc := sqlite3_prepare_v2(db,
  38. "SELECT x, s FROM t;", -1, stmt, NIL);
  39. IF (rc = SQLiteOk) AND (stmt # NIL) THEN
  40. rc := sqlite3_step(stmt);
  41. IF rc = SQLiteRow THEN
  42. ctext := sqlite3_column_text(stmt, 1);
  43. IF (sqlite3_column_int(stmt, 0) = 42)
  44. AND (ctext # NIL) THEN
  45. IF Copy(ctext, buf) = 5 THEN
  46. ok := (buf[0] = 'h') AND (buf[4] = 'o')
  47. AND (buf[5] = CHR(0))
  48. END
  49. END;
  50. IF (rc = SQLiteRow) AND (sqlite3_step(stmt) = SQLiteDone) THEN
  51. ok := ok AND (sqlite3_finalize(stmt) = SQLiteOk);
  52. stmt := NIL
  53. END
  54. END
  55. END
  56. END
  57. END
  58. END
  59. END
  60. END
  61. END;
  62. IF stmt # NIL THEN
  63. IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END
  64. END;
  65. IF db # NIL THEN
  66. IF sqlite3_close(db) # SQLiteOk THEN ok := FALSE END
  67. END;
  68. IF ok THEN ExitCode := 42 ELSE ExitCode := 1 END
  69. END SQLitePrepared.