Blame


1 e84153de 2023-12-31 op // This is free and unencumbered software released into the public domain.
2 e84153de 2023-12-31 op //
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
6 e84153de 2023-12-31 op // means.
7 e84153de 2023-12-31 op //
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.
15 e84153de 2023-12-31 op //
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.
23 e84153de 2023-12-31 op
24 e84153de 2023-12-31 op use strings;
25 e84153de 2023-12-31 op use types;
26 e84153de 2023-12-31 op use types::c;
27 e84153de 2023-12-31 op
28 7446e0fc 2023-12-31 op export type conn = *opaque;
29 e84153de 2023-12-31 op export type statement = *opaque;
30 e84153de 2023-12-31 op
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;
38 e84153de 2023-12-31 op // ...
39 e84153de 2023-12-31 op export def OPEN_NOMUTEX: int = 0x00008000;
40 e84153de 2023-12-31 op // ..
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;
44 e84153de 2023-12-31 op
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;
47 e84153de 2023-12-31 op
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,
51 e84153de 2023-12-31 op flags: int,
52 e84153de 2023-12-31 op vfs: nullable *const c::char,
53 e84153de 2023-12-31 op ) int;
54 e84153de 2023-12-31 op
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];
58 e84153de 2023-12-31 op
59 e84153de 2023-12-31 op let path = c::fromstr(filename);
60 e84153de 2023-12-31 op defer free(path);
61 e84153de 2023-12-31 op
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;
66 e84153de 2023-12-31 op };
67 e84153de 2023-12-31 op return code2err(ret);
68 e84153de 2023-12-31 op };
69 e84153de 2023-12-31 op
70 e84153de 2023-12-31 op @symbol("sqlite3_close_v2") fn libsqlite3_close_v2(sqlite3: *opaque) int;
71 e84153de 2023-12-31 op
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);
76 e84153de 2023-12-31 op };
77 e84153de 2023-12-31 op };
78 e84153de 2023-12-31 op
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,
82 e84153de 2023-12-31 op nbyte: int,
83 e84153de 2023-12-31 op stmt: *opaque,
84 e84153de 2023-12-31 op tail: nullable *opaque,
85 e84153de 2023-12-31 op ) int;
86 e84153de 2023-12-31 op
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);
90 e84153de 2023-12-31 op
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,
93 e84153de 2023-12-31 op null);
94 e84153de 2023-12-31 op if (ret == sqlite_ok) {
95 e84153de 2023-12-31 op return stmt: statement;
96 e84153de 2023-12-31 op };
97 e84153de 2023-12-31 op return code2err(ret);
98 e84153de 2023-12-31 op };
99 e84153de 2023-12-31 op
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
104 e84153de 2023-12-31 op
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,
108 e84153de 2023-12-31 op ) int;
109 e84153de 2023-12-31 op
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;
114 e84153de 2023-12-31 op };
115 e84153de 2023-12-31 op
116 e84153de 2023-12-31 op let n = c::fromstr(name);
117 e84153de 2023-12-31 op defer free(n);
118 e84153de 2023-12-31 op
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;
122 e84153de 2023-12-31 op };
123 e84153de 2023-12-31 op
124 e84153de 2023-12-31 op return ret;
125 e84153de 2023-12-31 op };
126 e84153de 2023-12-31 op
127 e84153de 2023-12-31 op @symbol("sqlite3_bind_int") fn libsqlite3_bind_int(
128 e84153de 2023-12-31 op stmt: *opaque,
129 e84153de 2023-12-31 op col: int,
130 e84153de 2023-12-31 op val: int,
131 e84153de 2023-12-31 op ) int;
132 e84153de 2023-12-31 op
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);
138 e84153de 2023-12-31 op };
139 e84153de 2023-12-31 op };
140 e84153de 2023-12-31 op
141 e84153de 2023-12-31 op @symbol("sqlite3_bind_null") fn libsqlite3_bind_null(
142 e84153de 2023-12-31 op stmt: *opaque,
143 e84153de 2023-12-31 op col: int,
144 e84153de 2023-12-31 op ) int;
145 e84153de 2023-12-31 op
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);
151 e84153de 2023-12-31 op };
152 e84153de 2023-12-31 op };
153 e84153de 2023-12-31 op
154 e84153de 2023-12-31 op fn freecstr(s: *opaque) void = free(s: *c::char);
155 e84153de 2023-12-31 op
156 e84153de 2023-12-31 op @symbol("sqlite3_bind_text") fn libsqlite3_bind_text(
157 e84153de 2023-12-31 op stmt: *opaque,
158 e84153de 2023-12-31 op col: int,
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
162 e84153de 2023-12-31 op ) int;
163 e84153de 2023-12-31 op
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)?;
166 e84153de 2023-12-31 op
167 e84153de 2023-12-31 op let s = c::fromstr(v);
168 e84153de 2023-12-31 op // free'd via the callback
169 e84153de 2023-12-31 op
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);
173 e84153de 2023-12-31 op };
174 e84153de 2023-12-31 op };
175 e84153de 2023-12-31 op
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);
185 e84153de 2023-12-31 op };
186 e84153de 2023-12-31 op };
187 e84153de 2023-12-31 op
188 e84153de 2023-12-31 op @symbol("sqlite3_step") fn libsqlite3_step(stmt: *opaque) int;
189 e84153de 2023-12-31 op
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);
196 e84153de 2023-12-31 op };
197 e84153de 2023-12-31 op };
198 e84153de 2023-12-31 op
199 e84153de 2023-12-31 op @symbol("sqlite3_column_text") fn libsqlite3_column_text(
200 e84153de 2023-12-31 op stmt: *opaque,
201 e84153de 2023-12-31 op col: int,
202 e84153de 2023-12-31 op ) *const c::char;
203 e84153de 2023-12-31 op
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) {
207 e84153de 2023-12-31 op return "";
208 e84153de 2023-12-31 op };
209 e84153de 2023-12-31 op return c::tostr_unsafe(s);
210 e84153de 2023-12-31 op };
211 e84153de 2023-12-31 op
212 e84153de 2023-12-31 op @symbol("sqlite3_column_int") fn libsqlite3_column_int(
213 e84153de 2023-12-31 op stmt: *opaque,
214 e84153de 2023-12-31 op col: int,
215 e84153de 2023-12-31 op ) int;
216 e84153de 2023-12-31 op
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);
219 e84153de 2023-12-31 op };
220 e84153de 2023-12-31 op
221 e84153de 2023-12-31 op @symbol("sqlite3_finalize") fn libsqlite3_finalize(stmt: *opaque) int;
222 e84153de 2023-12-31 op
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);
227 e84153de 2023-12-31 op };
228 e84153de 2023-12-31 op };
229 e84153de 2023-12-31 op
230 e84153de 2023-12-31 op @symbol("sqlite3_reset") fn libsqlite3_reset(stmt: *opaque) int;
231 e84153de 2023-12-31 op
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);
236 e84153de 2023-12-31 op };
237 e84153de 2023-12-31 op };
238 e84153de 2023-12-31 op
239 e84153de 2023-12-31 op @symbol("sqlite3_clear_bindings") fn libsqlite3_clear_bindings(stmt: *opaque) int;
240 e84153de 2023-12-31 op
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);
245 e84153de 2023-12-31 op };
246 e84153de 2023-12-31 op };