SQLiteShowcase.mod 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. MODULE SQLiteShowcase;
  2. (* Showcase of the current SQLite binding surface:
  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, SQLiteTransient;
  14. VAR
  15. ExitCode : INTEGER;
  16. db : ADDRESS;
  17. PROCEDURE ExecSQL (sql : ARRAY OF CHAR) : BOOLEAN;
  18. BEGIN
  19. RETURN sqlite3_exec(db, sql, NIL, NIL, NIL) = SQLiteOk
  20. END ExecSQL;
  21. PROCEDURE InsertPerson (id : INTEGER; name : ARRAY OF CHAR) : BOOLEAN;
  22. VAR
  23. stmt : ADDRESS;
  24. rc : INTEGER;
  25. ok : BOOLEAN;
  26. BEGIN
  27. stmt := NIL;
  28. rc := sqlite3_prepare_v2(db, "INSERT INTO people VALUES (?, ?);",
  29. -1, stmt, NIL);
  30. ok := (rc = SQLiteOk) AND (stmt # NIL);
  31. IF ok THEN
  32. ok := (sqlite3_bind_int(stmt, 1, id) = SQLiteOk)
  33. AND (sqlite3_bind_text(stmt, 2, name, -1,
  34. SQLiteTransient()) = SQLiteOk)
  35. END;
  36. IF ok THEN
  37. ok := sqlite3_step(stmt) = SQLiteDone
  38. END;
  39. IF stmt # NIL THEN
  40. IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END
  41. END;
  42. RETURN ok
  43. END InsertPerson;
  44. PROCEDURE ShowPeople () : BOOLEAN;
  45. VAR
  46. stmt : ADDRESS;
  47. rc : INTEGER;
  48. id : INTEGER;
  49. name : ARRAY [0..63] OF CHAR;
  50. ctext : CString;
  51. n : CARDINAL;
  52. ok : BOOLEAN;
  53. BEGIN
  54. stmt := NIL;
  55. rc := sqlite3_prepare_v2(db, "SELECT id, name FROM people ORDER BY id;",
  56. -1, stmt, NIL);
  57. ok := (rc = SQLiteOk) AND (stmt # NIL);
  58. IF ok THEN
  59. LOOP
  60. rc := sqlite3_step(stmt);
  61. IF rc = SQLiteRow THEN
  62. id := sqlite3_column_int(stmt, 0);
  63. ctext := sqlite3_column_text(stmt, 1);
  64. IF ctext = NIL THEN
  65. ok := FALSE; EXIT
  66. END;
  67. n := Copy(ctext, name);
  68. WriteInt(id);
  69. WriteChar(':');
  70. WriteChar(' ');
  71. Write(name);
  72. WriteLn
  73. ELSIF rc = SQLiteDone THEN
  74. EXIT
  75. ELSE
  76. ok := FALSE; EXIT
  77. END
  78. END
  79. END;
  80. IF stmt # NIL THEN
  81. IF sqlite3_finalize(stmt) # SQLiteOk THEN ok := FALSE END
  82. END;
  83. RETURN ok
  84. END ShowPeople;
  85. BEGIN
  86. db := NIL;
  87. IF sqlite3_open(":memory:", db) = SQLiteOk THEN
  88. IF ExecSQL("CREATE TABLE people(id INTEGER, name TEXT);")
  89. AND InsertPerson(1, "Ada")
  90. AND InsertPerson(2, "Grace")
  91. AND ShowPeople() THEN
  92. ExitCode := 42
  93. ELSE
  94. ExitCode := 1
  95. END
  96. ELSE
  97. ExitCode := 1
  98. END;
  99. IF db # NIL THEN
  100. IF sqlite3_close(db) # SQLiteOk THEN ExitCode := 1 END
  101. END
  102. END SQLiteShowcase.