SQLitePrepareTail.mod 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. MODULE SQLitePrepareTail;
  2. (* sqlite3_prepare_v3: prepare one statement and reuse its tail. *)
  3. FROM SYSTEM IMPORT ADDRESS;
  4. FROM CStr IMPORT Copy;
  5. FROM SQLite IMPORT
  6. DbHandle, StmtHandle,
  7. SQLiteOk, SQLiteRow, SQLiteDone,
  8. SQLiteOpenReadWrite, SQLiteOpenCreate, SQLiteOpenMemory,
  9. SQLitePreparePersistent,
  10. sqlite3_open_v2, sqlite3_close,
  11. sqlite3_prepare_v3, sqlite3_step, sqlite3_column_int,
  12. sqlite3_finalize;
  13. VAR
  14. ExitCode : INTEGER;
  15. db : DbHandle;
  16. stmt : StmtHandle;
  17. tail, tail2 : ADDRESS;
  18. rc : INTEGER;
  19. ok : BOOLEAN;
  20. buf : ARRAY [0..127] OF CHAR;
  21. PROCEDURE SameText (a, b : ARRAY OF CHAR) : BOOLEAN;
  22. VAR
  23. i : INTEGER;
  24. BEGIN
  25. i := 0;
  26. WHILE (a[i] # CHR(0)) AND (a[i] = b[i]) DO i := i + 1 END;
  27. RETURN (a[i] = CHR(0)) AND (b[i] = CHR(0))
  28. END SameText;
  29. BEGIN
  30. ExitCode := 1;
  31. db := NIL; stmt := NIL; tail := NIL; tail2 := NIL; ok := FALSE;
  32. IF (sqlite3_open_v2(":memory:", db,
  33. SQLiteOpenReadWrite + SQLiteOpenCreate + SQLiteOpenMemory,
  34. NIL) = SQLiteOk) AND (db # NIL) THEN
  35. rc := sqlite3_prepare_v3(db, "SELECT 1; SELECT 2;", -1,
  36. SQLitePreparePersistent, stmt, tail);
  37. ok := (rc = SQLiteOk) AND (stmt # NIL) AND (tail # NIL);
  38. IF ok THEN
  39. IF Copy(tail, buf) = 0 THEN
  40. ok := FALSE
  41. ELSIF NOT SameText(buf, " SELECT 2;") THEN
  42. ok := FALSE
  43. END
  44. END;
  45. IF ok THEN ok := sqlite3_step(stmt) = SQLiteRow END;
  46. IF ok THEN ok := sqlite3_column_int(stmt, 0) = 1 END;
  47. IF ok THEN ok := sqlite3_step(stmt) = SQLiteDone END;
  48. IF stmt # NIL THEN
  49. IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END;
  50. stmt := NIL
  51. END;
  52. IF ok THEN
  53. rc := sqlite3_prepare_v3(db, buf, -1, 0, stmt, tail2);
  54. ok := (rc = SQLiteOk) AND (stmt # NIL);
  55. IF ok THEN ok := sqlite3_step(stmt) = SQLiteRow END;
  56. IF ok THEN ok := sqlite3_column_int(stmt, 0) = 2 END;
  57. IF ok THEN ok := sqlite3_step(stmt) = SQLiteDone END;
  58. IF stmt # NIL THEN
  59. IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END;
  60. stmt := NIL
  61. END
  62. END
  63. END;
  64. IF stmt # NIL THEN
  65. IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END
  66. END;
  67. IF db # NIL THEN
  68. IF sqlite3_close(db) # SQLiteOk THEN ok := FALSE END
  69. END;
  70. IF ok THEN ExitCode := 42 END
  71. END SQLitePrepareTail.