hello_db.mod 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. MODULE hello_db ;
  2. (*
  3. m2SQLITE example: create a table, insert two rows with bound
  4. parameters, then read them back with prepare/step/column.
  5. *)
  6. FROM SYSTEM IMPORT ADDRESS;
  7. FROM SQLite IMPORT DbHandle, StmtHandle,
  8. SQLiteOk, SQLiteRow, SQLiteDone,
  9. sqlite3_open, sqlite3_close,
  10. sqlite3_prepare_v2, sqlite3_step, sqlite3_finalize,
  11. sqlite3_bind_int, sqlite3_column_int, sqlite3_column_text;
  12. FROM SQLiteUtils IMPORT ExecSimple, BindTextCopy, CStrToM2, ErrMsg;
  13. FROM libc IMPORT printf;
  14. VAR db: DbHandle; stmt: StmtHandle;
  15. rc: INTEGER; buf: ARRAY [0..63] OF CHAR;
  16. name: ARRAY [0..63] OF CHAR; id: INTEGER;
  17. PROCEDURE check (rc: INTEGER; what: ARRAY OF CHAR);
  18. VAR e: ARRAY [0..255] OF CHAR;
  19. BEGIN
  20. IF rc # SQLiteOk THEN
  21. ErrMsg(db, e);
  22. printf("FAIL %s: %s\n", what, e);
  23. HALT(1)
  24. END
  25. END check;
  26. BEGIN
  27. check(sqlite3_open(":memory:", db), "open");
  28. check(ExecSimple(db, "CREATE TABLE hi(id INTEGER, name TEXT);"),
  29. "create");
  30. check(sqlite3_prepare_v2(db, "INSERT INTO hi(id,name) VALUES(?,?);",
  31. -1, stmt, NIL), "prep insert");
  32. check(sqlite3_bind_int(stmt, 1, 1), "bind1");
  33. check(BindTextCopy(stmt, 2, "modula"), "bind2");
  34. IF sqlite3_step(stmt) # SQLiteDone THEN HALT(1) END;
  35. check(sqlite3_finalize(stmt), "fin1");
  36. check(sqlite3_prepare_v2(db, "INSERT INTO hi(id,name) VALUES(?,?);",
  37. -1, stmt, NIL), "prep insert2");
  38. check(sqlite3_bind_int(stmt, 1, 2), "bind3");
  39. check(BindTextCopy(stmt, 2, "sqlite"), "bind4");
  40. IF sqlite3_step(stmt) # SQLiteDone THEN HALT(1) END;
  41. check(sqlite3_finalize(stmt), "fin2");
  42. check(sqlite3_prepare_v2(db, "SELECT id, name FROM hi ORDER BY id;",
  43. -1, stmt, NIL), "prep select");
  44. LOOP
  45. rc := sqlite3_step(stmt);
  46. IF rc = SQLiteDone THEN EXIT END;
  47. IF rc # SQLiteRow THEN
  48. printf("FAIL step rc=%d\n", rc);
  49. HALT(1)
  50. END;
  51. id := sqlite3_column_int(stmt, 0);
  52. CStrToM2(sqlite3_column_text(stmt, 1), name);
  53. printf("row id=%d name=%s\n", id, name)
  54. END;
  55. check(sqlite3_finalize(stmt), "fin3");
  56. check(sqlite3_close(db), "close");
  57. printf("hello_db OK\n")
  58. END hello_db.