1 e84153de 2023-12-31 op // This is free and unencumbered software released into the public domain.
3 e84153de 2023-12-31 op // Anyone is free to copy, modify, publish, use, compile, sell, or
4 e84153de 2023-12-31 op // distribute this software, either in source code form or as a compiled
5 e84153de 2023-12-31 op // binary, for any purpose, commercial or non-commercial, and by any
8 e84153de 2023-12-31 op // In jurisdictions that recognize copyright laws, the author or authors
9 e84153de 2023-12-31 op // of this software dedicate any and all copyright interest in the
10 e84153de 2023-12-31 op // software to the public domain. We make this dedication for the benefit
11 e84153de 2023-12-31 op // of the public at large and to the detriment of our heirs and
12 e84153de 2023-12-31 op // successors. We intend this dedication to be an overt act of
13 e84153de 2023-12-31 op // relinquishment in perpetuity of all present and future rights to this
14 e84153de 2023-12-31 op // software under copyright law.
16 e84153de 2023-12-31 op // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 e84153de 2023-12-31 op // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 e84153de 2023-12-31 op // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 e84153de 2023-12-31 op // IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 e84153de 2023-12-31 op // OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 e84153de 2023-12-31 op // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 e84153de 2023-12-31 op // OTHER DEALINGS IN THE SOFTWARE.
28 7446e0fc 2023-12-31 op export type conn = *opaque;
29 e84153de 2023-12-31 op export type statement = *opaque;
31 e84153de 2023-12-31 op export def OPEN_READONLY: int = 0x00000001;
32 e84153de 2023-12-31 op export def OPEN_READWRITE: int = 0x00000002;
33 e84153de 2023-12-31 op export def OPEN_CREATE: int = 0x00000004;
34 e84153de 2023-12-31 op export def OPEN_DELETEONCLOSE: int = 0x00000008; // VFS only
35 e84153de 2023-12-31 op export def OPEN_EXCLUSIVE: int = 0x00000010; // VFS only
36 e84153de 2023-12-31 op export def OPEN_AUTOPROXY: int = 0x00000020; // VFS only
37 e84153de 2023-12-31 op export def OPEN_URI: int = 0x00000040;
39 e84153de 2023-12-31 op export def OPEN_NOMUTEX: int = 0x00008000;
41 e84153de 2023-12-31 op export def OPEN_WAL: int = 0x00080000; // VFS only
42 e84153de 2023-12-31 op export def OPEN_NOFOLLOW: int = 0x01000000;
43 e84153de 2023-12-31 op export def OPEN_EXRESCODE: int = 0x02000000;
45 e84153de 2023-12-31 op export def def_open_flags = OPEN_READWRITE | OPEN_CREATE | OPEN_WAL |
46 e84153de 2023-12-31 op OPEN_URI | OPEN_NOMUTEX;
48 e84153de 2023-12-31 op @symbol("sqlite3_open_v2") fn libsqlite3_open_v2(
49 e84153de 2023-12-31 op filename: *const c::char,
50 e84153de 2023-12-31 op sqlite3: *opaque,
52 e84153de 2023-12-31 op vfs: nullable *const c::char,
55 e84153de 2023-12-31 op // XXX vfs support?
56 7446e0fc 2023-12-31 op export fn open(filename: const str, flags: int...) (conn | error) = {
57 e84153de 2023-12-31 op let f = if (len(flags) == 0) def_open_flags else flags[0];
59 e84153de 2023-12-31 op let path = c::fromstr(filename);
60 e84153de 2023-12-31 op defer free(path);
62 e84153de 2023-12-31 op let addr: uintptr = 0;
63 e84153de 2023-12-31 op let ret = libsqlite3_open_v2(path, &addr: *opaque, f, null);
64 e84153de 2023-12-31 op if (ret == sqlite_ok) {
65 7446e0fc 2023-12-31 op return (addr: *opaque): conn;
67 e84153de 2023-12-31 op return code2err(ret);
70 e84153de 2023-12-31 op @symbol("sqlite3_close_v2") fn libsqlite3_close_v2(sqlite3: *opaque) int;
72 7446e0fc 2023-12-31 op export fn close(conn: conn) (void | error) = {
73 7446e0fc 2023-12-31 op let ret = libsqlite3_close_v2(conn: *opaque);
74 e84153de 2023-12-31 op if (ret != sqlite_ok) {
75 e84153de 2023-12-31 op return code2err(ret);
79 e84153de 2023-12-31 op @symbol("sqlite3_prepare_v2") fn libsqlite3_prepare_v2(
80 e84153de 2023-12-31 op sqlite3: *opaque,
81 e84153de 2023-12-31 op sql: *const c::char,
83 e84153de 2023-12-31 op stmt: *opaque,
84 e84153de 2023-12-31 op tail: nullable *opaque,
87 7446e0fc 2023-12-31 op export fn prepare(conn: conn, sql: const str) (statement | error) = {
88 e84153de 2023-12-31 op let s = c::fromstr(sql);
89 e84153de 2023-12-31 op defer free(s);
91 e84153de 2023-12-31 op let stmt: uintptr = 0;
92 7446e0fc 2023-12-31 op let ret = libsqlite3_prepare_v2(conn: *opaque, s, -1, &stmt: *opaque,
94 e84153de 2023-12-31 op if (ret == sqlite_ok) {
95 e84153de 2023-12-31 op return stmt: statement;
97 e84153de 2023-12-31 op return code2err(ret);
100 e84153de 2023-12-31 op // XXX missing
101 e84153de 2023-12-31 op // sqlite3_bind_blob
102 e84153de 2023-12-31 op // sqlite3_bind_blob64
103 e84153de 2023-12-31 op // sqlite3_bind_double
105 e84153de 2023-12-31 op @symbol("sqlite3_bind_parameter_index") fn libsqlite3_bind_parameter_index(
106 e84153de 2023-12-31 op stmt: *opaque,
107 e84153de 2023-12-31 op name: *const c::char,
110 e84153de 2023-12-31 op fn bind_parameter_index(stmt: statement, col: (str | int)) (int | error) = {
111 e84153de 2023-12-31 op let name = match (col) {
112 e84153de 2023-12-31 op case let n: int => return n;
113 e84153de 2023-12-31 op case let n: str => yield n;
116 e84153de 2023-12-31 op let n = c::fromstr(name);
117 e84153de 2023-12-31 op defer free(n);
119 e84153de 2023-12-31 op let ret = libsqlite3_bind_parameter_index(stmt: *opaque, n);
120 e84153de 2023-12-31 op if (ret == 0) {
121 e84153de 2023-12-31 op return sqlite_error;
127 e84153de 2023-12-31 op @symbol("sqlite3_bind_int") fn libsqlite3_bind_int(
128 e84153de 2023-12-31 op stmt: *opaque,
133 e84153de 2023-12-31 op export fn bind_int(stmt: statement, col: (str | int), v: int) (void | error) = {
134 e84153de 2023-12-31 op let n = bind_parameter_index(stmt, col)?;
135 e84153de 2023-12-31 op let ret = libsqlite3_bind_int(stmt: *opaque, n, v);
136 e84153de 2023-12-31 op if (ret != sqlite_ok) {
137 e84153de 2023-12-31 op return code2err(ret);
141 e84153de 2023-12-31 op @symbol("sqlite3_bind_null") fn libsqlite3_bind_null(
142 e84153de 2023-12-31 op stmt: *opaque,
146 e84153de 2023-12-31 op export fn bind_null(stmt: statement, col: (str | int)) (void | error) = {
147 e84153de 2023-12-31 op let n = bind_parameter_index(stmt, col)?;
148 e84153de 2023-12-31 op let ret = libsqlite3_bind_null(stmt: *opaque, n);
149 e84153de 2023-12-31 op if (ret != sqlite_ok) {
150 e84153de 2023-12-31 op return code2err(ret);
154 e84153de 2023-12-31 op fn freecstr(s: *opaque) void = free(s: *c::char);
156 e84153de 2023-12-31 op @symbol("sqlite3_bind_text") fn libsqlite3_bind_text(
157 e84153de 2023-12-31 op stmt: *opaque,
159 e84153de 2023-12-31 op val: *const c::char,
160 e84153de 2023-12-31 op bytelen: int,
161 e84153de 2023-12-31 op freefn: *fn(*opaque) void
164 e84153de 2023-12-31 op export fn bind_text(stmt: statement, col: (str | int), v: str) (void | error) = {
165 e84153de 2023-12-31 op let n = bind_parameter_index(stmt, col)?;
167 e84153de 2023-12-31 op let s = c::fromstr(v);
168 e84153de 2023-12-31 op // free'd via the callback
170 e84153de 2023-12-31 op let ret = libsqlite3_bind_text(stmt: *opaque, n, s, -1, &freecstr);
171 e84153de 2023-12-31 op if (ret != sqlite_ok) {
172 e84153de 2023-12-31 op return code2err(ret);
176 e84153de 2023-12-31 op export fn bind(
177 e84153de 2023-12-31 op stmt: statement,
178 e84153de 2023-12-31 op col: (str | int),
179 e84153de 2023-12-31 op val: (int | void | str),
180 e84153de 2023-12-31 op ) (void | error) = {
181 e84153de 2023-12-31 op match (val) {
182 e84153de 2023-12-31 op case let v: int => return bind_int(stmt, col, v);
183 e84153de 2023-12-31 op case let v: void => return bind_null(stmt, col);
184 e84153de 2023-12-31 op case let v: str => return bind_text(stmt, col, v);
188 e84153de 2023-12-31 op @symbol("sqlite3_step") fn libsqlite3_step(stmt: *opaque) int;
190 e84153de 2023-12-31 op export fn step(stmt: statement) (bool | error) = {
191 e84153de 2023-12-31 op let ret = libsqlite3_step(stmt: *opaque);
192 e84153de 2023-12-31 op switch (ret) {
193 e84153de 2023-12-31 op case sqlite_row => return true;
194 e84153de 2023-12-31 op case sqlite_done => return false;
195 e84153de 2023-12-31 op case => return code2err(ret);
199 e84153de 2023-12-31 op @symbol("sqlite3_column_text") fn libsqlite3_column_text(
200 e84153de 2023-12-31 op stmt: *opaque,
202 e84153de 2023-12-31 op ) *const c::char;
204 e84153de 2023-12-31 op export fn column_text(stmt: statement, col: int) const str = {
205 e84153de 2023-12-31 op let s = libsqlite3_column_text(stmt: *opaque, col);
206 e84153de 2023-12-31 op if (s == null) {
209 e84153de 2023-12-31 op return c::tostr_unsafe(s);
212 e84153de 2023-12-31 op @symbol("sqlite3_column_int") fn libsqlite3_column_int(
213 e84153de 2023-12-31 op stmt: *opaque,
217 e84153de 2023-12-31 op export fn column_int(stmt: statement, col: int) int = {
218 e84153de 2023-12-31 op return libsqlite3_column_int(stmt: *opaque, col);
221 e84153de 2023-12-31 op @symbol("sqlite3_finalize") fn libsqlite3_finalize(stmt: *opaque) int;
223 e84153de 2023-12-31 op export fn finalize(stmt: statement) (void | error) = {
224 e84153de 2023-12-31 op let ret = libsqlite3_finalize(stmt: *opaque);
225 e84153de 2023-12-31 op if (ret != sqlite_ok) {
226 e84153de 2023-12-31 op return code2err(ret);
230 e84153de 2023-12-31 op @symbol("sqlite3_reset") fn libsqlite3_reset(stmt: *opaque) int;
232 e84153de 2023-12-31 op export fn reset(stmt: statement) (void | error) = {
233 e84153de 2023-12-31 op let ret = libsqlite3_reset(stmt: *opaque);
234 e84153de 2023-12-31 op if (ret != sqlite_ok) {
235 e84153de 2023-12-31 op return code2err(ret);
239 e84153de 2023-12-31 op @symbol("sqlite3_clear_bindings") fn libsqlite3_clear_bindings(stmt: *opaque) int;
241 e84153de 2023-12-31 op export fn clear_bindings(stmt: statement) (void | error) = {
242 e84153de 2023-12-31 op let ret = libsqlite3_clear_bindings(stmt: *opaque);
243 e84153de 2023-12-31 op if (ret != sqlite_ok) {
244 e84153de 2023-12-31 op return code2err(ret);