Provides a prepared-statement SQLite3 interface that prevents SQL injection by design. All text columns are read into caller-provided buffers, so there is no hidden heap allocation on the Modula-2 side. Requires -lsqlite3 at link time.
- DB (ADDRESS) -- Opaque database connection handle.
- Stmt (ADDRESS) -- Opaque prepared statement handle.
- Status --
Ok,Error,Row,Done,Busy,Locked. - ColType --
IntCol,FloatCol,TextCol,BlobCol,NullCol.
-
PROCEDURE Open(path: ARRAY OF CHAR; VAR db: DB): StatusOpen or create a database file. -
PROCEDURE Close(db: DB): StatusClose the database connection. -
PROCEDURE Exec(db: DB; sql: ARRAY OF CHAR): StatusExecute a simple SQL statement (no result rows). Useful for DDL and pragmas.
-
PROCEDURE Prepare(db: DB; sql: ARRAY OF CHAR; VAR stmt: Stmt): StatusCompile a SQL statement. Use?placeholders for parameters. -
PROCEDURE Step(stmt: Stmt): StatusExecute one step. ReturnsRowif a result row is available,Donewhen finished. -
PROCEDURE Reset(stmt: Stmt): StatusReset a statement so it can be executed again with new bindings. -
PROCEDURE ClearBindings(stmt: Stmt): StatusClear all parameter bindings. -
PROCEDURE Finalize(stmt: Stmt): StatusDestroy a prepared statement and free its resources.
PROCEDURE BindInt(stmt: Stmt; idx: INTEGER; val: INTEGER): StatusPROCEDURE BindLong(stmt: Stmt; idx: INTEGER; val: LONGINT): StatusPROCEDURE BindReal(stmt: Stmt; idx: INTEGER; val: REAL): StatusPROCEDURE BindText(stmt: Stmt; idx: INTEGER; text: ARRAY OF CHAR): StatusPROCEDURE BindNull(stmt: Stmt; idx: INTEGER): Status
Parameter indices start at 1.
PROCEDURE ColumnCount(stmt: Stmt): INTEGERPROCEDURE ColumnType(stmt: Stmt; idx: INTEGER): ColTypePROCEDURE ColumnInt(stmt: Stmt; idx: INTEGER): INTEGERPROCEDURE ColumnLong(stmt: Stmt; idx: INTEGER): LONGINTPROCEDURE ColumnReal(stmt: Stmt; idx: INTEGER): REALPROCEDURE ColumnText(stmt: Stmt; idx: INTEGER; VAR buf: ARRAY OF CHAR)
Column indices start at 0.
-
PROCEDURE Changes(db: DB): INTEGERNumber of rows modified by the last INSERT, UPDATE, or DELETE. -
PROCEDURE GetError(db: DB; VAR buf: ARRAY OF CHAR)Copy the last error message into buf.
MODULE SqliteDemo;
FROM InOut IMPORT WriteString, WriteLn, WriteInt;
FROM SQLite IMPORT DB, Stmt, Status, Open, Close, Exec,
Prepare, Step, Finalize, BindText,
ColumnInt, ColumnText, Ok, Row;
VAR
db: DB;
stmt: Stmt;
s: Status;
name: ARRAY [0..63] OF CHAR;
BEGIN
s := Open("test.db", db);
IF s # Ok THEN HALT END;
Exec(db, "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
Exec(db, "INSERT INTO users (name) VALUES ('Alice')");
Exec(db, "INSERT INTO users (name) VALUES ('Bob')");
s := Prepare(db, "SELECT id, name FROM users", stmt);
IF s = Ok THEN
WHILE Step(stmt) = Row DO
WriteInt(ColumnInt(stmt, 0), 0);
WriteString(" ");
ColumnText(stmt, 1, name);
WriteString(name);
WriteLn
END;
Finalize(stmt)
END;
Close(db)
END SqliteDemo.