SQLiteScalar.mod 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. MODULE SQLiteScalar;
  2. (* Scalar binding/result metadata: int, int64, double, text, NULL. *)
  3. FROM SYSTEM IMPORT ADDRESS;
  4. FROM CStr IMPORT CString, Copy;
  5. FROM SQLite IMPORT
  6. SQLiteOk, SQLiteRow, SQLiteDone,
  7. SQLiteInteger, SQLiteFloat, SQLiteText, SQLiteNull,
  8. sqlite3_open, sqlite3_exec, sqlite3_close,
  9. sqlite3_prepare_v2, sqlite3_bind_int, sqlite3_bind_int64,
  10. sqlite3_bind_double, sqlite3_bind_null, sqlite3_bind_text,
  11. sqlite3_step, sqlite3_reset, sqlite3_clear_bindings,
  12. sqlite3_column_count, sqlite3_data_count, sqlite3_column_type,
  13. sqlite3_column_bytes, sqlite3_column_int, sqlite3_column_int64,
  14. sqlite3_column_double, sqlite3_column_text, sqlite3_column_name,
  15. sqlite3_column_decltype, sqlite3_finalize, sqlite3_free,
  16. sqlite3_extended_result_codes, SQLiteTransient;
  17. VAR
  18. ExitCode : INTEGER;
  19. db : ADDRESS;
  20. PROCEDURE ExecSQL (sql : ARRAY OF CHAR) : BOOLEAN;
  21. VAR
  22. errmsg : ADDRESS;
  23. ok : BOOLEAN;
  24. BEGIN
  25. errmsg := NIL;
  26. ok := sqlite3_exec(db, sql, NIL, NIL, errmsg) = SQLiteOk;
  27. IF errmsg # NIL THEN
  28. sqlite3_free(errmsg)
  29. END;
  30. RETURN ok
  31. END ExecSQL;
  32. VAR
  33. stmt : ADDRESS;
  34. rc : INTEGER;
  35. ok : BOOLEAN;
  36. svalue : CString;
  37. name : ARRAY [0..63] OF CHAR;
  38. text : ARRAY [0..63] OF CHAR;
  39. decl : ARRAY [0..63] OF CHAR;
  40. BEGIN
  41. ExitCode := 1;
  42. db := NIL;
  43. stmt := NIL;
  44. ok := FALSE;
  45. IF (sqlite3_open(":memory:", db) = SQLiteOk) AND (db # NIL) THEN
  46. IF sqlite3_extended_result_codes(db, 1) = SQLiteOk THEN
  47. IF ExecSQL("CREATE TABLE t(i INTEGER, j INTEGER, r REAL, s TEXT, n TEXT);") THEN
  48. rc := sqlite3_prepare_v2(db,
  49. "INSERT INTO t VALUES (?, ?, ?, ?, ?);", -1, stmt, NIL);
  50. ok := (rc = SQLiteOk) AND (stmt # NIL);
  51. IF ok THEN
  52. ok := (sqlite3_bind_int(stmt, 1, 42) = SQLiteOk)
  53. AND (sqlite3_bind_int64(stmt, 2, 43) = SQLiteOk)
  54. AND (sqlite3_bind_double(stmt, 3, 3.5) = SQLiteOk)
  55. AND (sqlite3_bind_text(stmt, 4, "hello", -1,
  56. SQLiteTransient()) = SQLiteOk)
  57. AND (sqlite3_bind_null(stmt, 5) = SQLiteOk)
  58. END;
  59. IF ok THEN
  60. ok := sqlite3_step(stmt) = SQLiteDone
  61. END;
  62. IF stmt # NIL THEN
  63. IF sqlite3_reset(stmt) # SQLiteOk THEN ok := FALSE END;
  64. IF sqlite3_clear_bindings(stmt) # SQLiteOk THEN ok := FALSE END;
  65. IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END;
  66. stmt := NIL
  67. END
  68. END
  69. END
  70. END;
  71. IF ok THEN
  72. rc := sqlite3_prepare_v2(db,
  73. "SELECT i, j, r, s, n FROM t;", -1, stmt, NIL);
  74. ok := (rc = SQLiteOk) AND (stmt # NIL);
  75. IF ok THEN
  76. IF sqlite3_column_count(stmt) = 5 THEN
  77. rc := sqlite3_step(stmt);
  78. IF rc = SQLiteRow THEN
  79. ok := (sqlite3_data_count(stmt) = 5)
  80. AND (sqlite3_column_type(stmt, 0) = SQLiteInteger)
  81. AND (sqlite3_column_type(stmt, 1) = SQLiteInteger)
  82. AND (sqlite3_column_type(stmt, 2) = SQLiteFloat)
  83. AND (sqlite3_column_type(stmt, 3) = SQLiteText)
  84. AND (sqlite3_column_type(stmt, 4) = SQLiteNull)
  85. AND (sqlite3_column_int(stmt, 0) = 42)
  86. AND (sqlite3_column_int64(stmt, 1) = 43)
  87. AND (sqlite3_column_double(stmt, 2) = 3.5)
  88. AND (sqlite3_column_bytes(stmt, 3) = 5);
  89. svalue := sqlite3_column_text(stmt, 3);
  90. IF (svalue = NIL) OR (Copy(svalue, text) # 5) THEN
  91. ok := FALSE
  92. ELSIF (text[0] # 'h') OR (text[4] # 'o') THEN
  93. ok := FALSE
  94. END;
  95. svalue := sqlite3_column_name(stmt, 3);
  96. IF (svalue = NIL) OR (Copy(svalue, name) # 1)
  97. OR (name[0] # 's') THEN
  98. ok := FALSE
  99. END;
  100. svalue := sqlite3_column_decltype(stmt, 3);
  101. IF (svalue = NIL) OR (Copy(svalue, decl) # 4)
  102. OR (decl[0] # 'T') OR (decl[3] # 'T') THEN
  103. ok := FALSE
  104. END;
  105. IF sqlite3_step(stmt) # SQLiteDone THEN ok := FALSE END
  106. ELSE
  107. ok := FALSE
  108. END
  109. ELSE
  110. ok := FALSE
  111. END;
  112. IF stmt # NIL THEN
  113. IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END;
  114. stmt := NIL
  115. END
  116. END
  117. END;
  118. IF stmt # NIL THEN
  119. IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END
  120. END;
  121. IF db # NIL THEN
  122. IF sqlite3_close(db) # SQLiteOk THEN ok := FALSE END
  123. END;
  124. IF ok THEN ExitCode := 42 END
  125. END SQLiteScalar.