1 # Prepared SQLite statements through libsqlite3. Source: https://github.com/paymog/bend-kit/tree/main/sqlite 2 import Base 3 4 # Handles are opaque U32 IDs. Close each database after finalizing all its statements. 5 # Every effect returns (SQLite error code, message) on failure. 6 # BEND_LIBSQLITE selects a custom libsqlite3 path. 7 def db.open(path: String) -> IO(Result<&1, &1, U32 & String, U32>): 8 import "./effs/sqlite.c" 9 import "./effs/sqlite.js" 10 11 def db.close(db: U32) -> IO(Result<&1, &1, U32 & String, Unit>): 12 import "./effs/sqlite.c" 13 import "./effs/sqlite.js" 14 15 # Exactly one SQL statement is accepted; use bind operations for values. 16 def stmt.prepare(db: U32, sql: String) -> IO(Result<&1, &1, U32 & String, U32>): 17 import "./effs/sqlite.c" 18 import "./effs/sqlite.js" 19 20 def stmt.finalize(stmt: U32) -> IO(Result<&1, &1, U32 & String, Unit>): 21 import "./effs/sqlite.c" 22 import "./effs/sqlite.js" 23 24 # Bind positions start at 1. Integer values are unsigned 32-bit. 25 def stmt.bind.int(stmt: U32, index: U32, value: U32) -> IO(Result<&1, &1, U32 & String, Unit>): 26 import "./effs/sqlite.c" 27 import "./effs/sqlite.js" 28 29 def stmt.bind.text(stmt: U32, index: U32, text: String) -> IO(Result<&1, &1, U32 & String, Unit>): 30 import "./effs/sqlite.c" 31 import "./effs/sqlite.js" 32 33 def stmt.bind.null(stmt: U32, index: U32) -> IO(Result<&1, &1, U32 & String, Unit>): 34 import "./effs/sqlite.c" 35 import "./effs/sqlite.js" 36 37 # Blob octets are packed four per U32, least-significant byte first. 38 def stmt.bind.blob(stmt: U32, index: U32, len: U32, words: Array) -> IO(Result<&1, &1, U32 & String, Unit>): 39 import "./effs/sqlite.c" 40 import "./effs/sqlite.js" 41 42 # True means a row is available; False means no more rows. 43 def stmt.step(stmt: U32) -> IO(Result<&1, &1, U32 & String, Bool>): 44 import "./effs/sqlite.c" 45 import "./effs/sqlite.js" 46 47 def stmt.reset(stmt: U32) -> IO(Result<&1, &1, U32 & String, Unit>): 48 import "./effs/sqlite.c" 49 import "./effs/sqlite.js" 50 51 # Column indexes start at 0. Read columns only after a True step. 52 # SQLite kinds: 1 integer, 2 float, 3 text, 4 blob, 5 null. 53 def stmt.column.kind(stmt: U32, index: U32) -> IO(Result<&1, &1, U32 & String, U32>): 54 import "./effs/sqlite.c" 55 import "./effs/sqlite.js" 56 57 def stmt.column.int(stmt: U32, index: U32) -> IO(Result<&1, &1, U32 & String, U32>): 58 import "./effs/sqlite.c" 59 import "./effs/sqlite.js" 60 61 def stmt.column.text(stmt: U32, index: U32) -> IO(Result<&1, &1, U32 & String, String>): 62 import "./effs/sqlite.c" 63 import "./effs/sqlite.js" 64 65 def stmt.column.blob(stmt: U32, index: U32) -> IO(Result<&1, &1, U32 & String, U32 & Array>): 66 import "./effs/sqlite.c" 67 import "./effs/sqlite.js"