SQLitePrepared.mod 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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, SQLiteTransient;
  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,
  34. SQLiteTransient()) = SQLiteOk) THEN
  35. rc := sqlite3_step(stmt);
  36. IF (rc = SQLiteDone) AND (sqlite3_finalize(stmt) = SQLiteOk) THEN
  37. stmt := NIL;
  38. rc := sqlite3_prepare_v2(db,
  39. "SELECT x, s FROM t;", -1, stmt, NIL);
  40. IF (rc = SQLiteOk) AND (stmt # NIL) THEN
  41. rc := sqlite3_step(stmt);
  42. IF rc = SQLiteRow THEN
  43. ctext := sqlite3_column_text(stmt, 1);
  44. IF (sqlite3_column_int(stmt, 0) = 42)
  45. AND (ctext # NIL) THEN
  46. IF Copy(ctext, buf) = 5 THEN
  47. ok := (buf[0] = 'h') AND (buf[4] = 'o')
  48. AND (buf[5] = CHR(0))
  49. END
  50. END;
  51. IF (rc = SQLiteRow) AND (sqlite3_step(stmt) = SQLiteDone) THEN
  52. ok := ok AND (sqlite3_finalize(stmt) = SQLiteOk);
  53. stmt := NIL
  54. END
  55. END
  56. END
  57. END
  58. END
  59. END
  60. END
  61. END
  62. END;
  63. IF stmt # NIL THEN
  64. IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END
  65. END;
  66. IF db # NIL THEN
  67. IF sqlite3_close(db) # SQLiteOk THEN ok := FALSE END
  68. END;
  69. IF ok THEN ExitCode := 42 ELSE ExitCode := 1 END
  70. END SQLitePrepared.