SQLiteShowcase.mod 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. MODULE SQLiteShowcase;
  2. (* Prepared-statement walkthrough:
  3. open/exec/close, prepare, bind int/text, step, column int/text,
  4. finalize. Prints the two stored rows. *)
  5. FROM SYSTEM IMPORT ADDRESS;
  6. FROM CStr IMPORT CString, Copy;
  7. FROM SysIO IMPORT Write, WriteLn, WriteInt, WriteChar;
  8. FROM SQLite IMPORT
  9. SQLiteOk, SQLiteRow, SQLiteDone,
  10. sqlite3_open, sqlite3_exec, sqlite3_close,
  11. sqlite3_prepare_v2, sqlite3_bind_int, sqlite3_bind_text,
  12. sqlite3_step, sqlite3_column_int, sqlite3_column_text,
  13. sqlite3_finalize, sqlite3_free, SQLiteTransient;
  14. VAR
  15. ExitCode : INTEGER;
  16. db : ADDRESS;
  17. PROCEDURE ExecSQL (sql : ARRAY OF CHAR) : BOOLEAN;
  18. VAR
  19. errmsg : ADDRESS;
  20. ok : BOOLEAN;
  21. BEGIN
  22. errmsg := NIL;
  23. ok := sqlite3_exec(db, sql, NIL, NIL, errmsg) = SQLiteOk;
  24. IF errmsg # NIL THEN
  25. sqlite3_free(errmsg)
  26. END;
  27. RETURN ok
  28. END ExecSQL;
  29. PROCEDURE InsertPerson (id : INTEGER; name : ARRAY OF CHAR) : BOOLEAN;
  30. VAR
  31. stmt : ADDRESS;
  32. rc : INTEGER;
  33. ok : BOOLEAN;
  34. BEGIN
  35. stmt := NIL;
  36. rc := sqlite3_prepare_v2(db, "INSERT INTO people VALUES (?, ?);",
  37. -1, stmt, NIL);
  38. ok := (rc = SQLiteOk) AND (stmt # NIL);
  39. IF ok THEN
  40. ok := (sqlite3_bind_int(stmt, 1, id) = SQLiteOk)
  41. AND (sqlite3_bind_text(stmt, 2, name, -1,
  42. SQLiteTransient()) = SQLiteOk)
  43. END;
  44. IF ok THEN
  45. ok := sqlite3_step(stmt) = SQLiteDone
  46. END;
  47. IF stmt # NIL THEN
  48. IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END
  49. END;
  50. RETURN ok
  51. END InsertPerson;
  52. PROCEDURE ShowPeople () : BOOLEAN;
  53. VAR
  54. stmt : ADDRESS;
  55. rc : INTEGER;
  56. id : INTEGER;
  57. name : ARRAY [0..63] OF CHAR;
  58. ctext : CString;
  59. n : CARDINAL;
  60. ok : BOOLEAN;
  61. BEGIN
  62. stmt := NIL;
  63. rc := sqlite3_prepare_v2(db, "SELECT id, name FROM people ORDER BY id;",
  64. -1, stmt, NIL);
  65. ok := (rc = SQLiteOk) AND (stmt # NIL);
  66. IF ok THEN
  67. LOOP
  68. rc := sqlite3_step(stmt);
  69. IF rc = SQLiteRow THEN
  70. id := sqlite3_column_int(stmt, 0);
  71. ctext := sqlite3_column_text(stmt, 1);
  72. IF ctext = NIL THEN
  73. ok := FALSE; EXIT
  74. END;
  75. n := Copy(ctext, name);
  76. WriteInt(id);
  77. WriteChar(':');
  78. WriteChar(' ');
  79. Write(name);
  80. WriteLn
  81. ELSIF rc = SQLiteDone THEN
  82. EXIT
  83. ELSE
  84. ok := FALSE; EXIT
  85. END
  86. END
  87. END;
  88. IF stmt # NIL THEN
  89. IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END
  90. END;
  91. RETURN ok
  92. END ShowPeople;
  93. BEGIN
  94. db := NIL;
  95. IF sqlite3_open(":memory:", db) = SQLiteOk THEN
  96. IF ExecSQL("CREATE TABLE people(id INTEGER, name TEXT);")
  97. AND InsertPerson(1, "Ada")
  98. AND InsertPerson(2, "Grace")
  99. AND ShowPeople() THEN
  100. ExitCode := 42
  101. ELSE
  102. ExitCode := 1
  103. END
  104. ELSE
  105. ExitCode := 1
  106. END;
  107. IF db # NIL THEN
  108. IF sqlite3_close(db) # SQLiteOk THEN ExitCode := 1 END
  109. END
  110. END SQLiteShowcase.