this repo has no description
1package sqlite3
2
3import "core:c"
4
5Connection :: rawptr
6Backup :: rawptr
7Statement :: rawptr
8Blob :: rawptr
9
10@(private)
11USE_DYNAMIC_LIB :: #config(SQLITE3_DYNAMIC_LIB, false)
12@(private)
13USE_SYSTEM_LIB :: #config(SQLITE3_SYSTEM_LIB, false)
14@(private)
15USE_SQLCIPHER :: #config(SQLITE3_USE_SQLCIPHER, false)
16
17when ODIN_OS == .Windows {
18 when USE_SYSTEM_LIB {
19 when USE_DYNAMIC_LIB {
20 when USE_SQLCIPHER {
21 foreign import sqlite "system:libsqlcipher.dll"
22 } else {
23 foreign import sqlite "system:libsqlite3.dll"
24 }
25 } else {
26 when USE_SQLCIPHER {
27 foreign import sqlite "system:libsqlcipher.lib"
28 } else {
29 foreign import sqlite "system:libsqlite3.lib"
30 }
31 }
32 } else {
33 when USE_DYNAMIC_LIB {
34 when USE_SQLCIPHER {
35 foreign import sqlite "libsqlcipher.dll"
36 } else {
37 foreign import sqlite "libsqlite3.dll"
38 }
39 } else {
40 when USE_SQLCIPHER {
41 foreign import sqlite "libsqlcipher.lib"
42 } else {
43 foreign import sqlite "libsqlite3.lib"
44 }
45 }
46 }
47} else when ODIN_OS == .Darwin {
48 when USE_SYSTEM_LIB {
49 when USE_DYNAMIC_LIB {
50 when USE_SQLCIPHER {
51 foreign import sqlite "system:libsqlcipher.dylib"
52 } else {
53 foreign import sqlite "system:libsqlite3.dylib"
54 }
55 } else {
56 when USE_SQLCIPHER {
57 foreign import sqlite "system:libsqlcipher.a"
58 } else {
59 foreign import sqlite "system:libsqlite3.a"
60 }
61 }
62 } else {
63 when USE_DYNAMIC_LIB {
64 when USE_SQLCIPHER {
65 foreign import sqlite "libsqlcipher.dylib"
66 } else {
67 foreign import sqlite "libsqlite3.dylib"
68 }
69 } else {
70 when USE_SQLCIPHER {
71 foreign import sqlite "libsqlcipher.a"
72 } else {
73 foreign import sqlite "libsqlite3.a"
74 }
75 }
76 }
77} else when ODIN_OS == .Linux {
78 when USE_SYSTEM_LIB {
79 when USE_DYNAMIC_LIB {
80 when USE_SQLCIPHER {
81 foreign import sqlite "system:libsqlcipher.so"
82 } else {
83 foreign import sqlite "system:libsqlite3.so"
84 }
85 } else {
86 when USE_SQLCIPHER {
87 foreign import sqlite "system:libsqlcipher.a"
88 } else {
89 foreign import sqlite "system:libsqlite3.a"
90 }
91 }
92 } else {
93 when USE_DYNAMIC_LIB {
94 when USE_SQLCIPHER {
95 foreign import sqlite "libsqlcipher.so"
96 } else {
97 foreign import sqlite "libsqlite3.so"
98 }
99 } else {
100 when USE_SQLCIPHER {
101 foreign import sqlite "libsqlcipher.a"
102 } else {
103 foreign import sqlite "libsqlite3.a"
104 }
105 }
106 }
107}
108
109Config_Option :: enum (c.int) {
110 Single_Thread = 1,
111 Multi_Thread = 2,
112 Serialized = 3,
113 Malloc = 4,
114 Get_Malloc = 5,
115 Scratch = 6,
116 Page_Cache = 7,
117 Heap = 8,
118 Mem_Status = 9,
119 Mutex = 10,
120 Get_Mutex = 11,
121 Lookaside = 13,
122 PCache = 14,
123 Get_PCache = 15,
124 Log = 16,
125 Uri = 17,
126 PCache2 = 18,
127 Get_PCache2 = 19,
128 Covering_Index_Scan = 20,
129 SqlLog = 21,
130 Mmap_Size = 22,
131 Win32_Heapsize = 23,
132 PCache_Hdrsz = 24,
133 Pmasz = 25,
134 StmtJrnl_Spill = 26,
135 Small_Malloc = 27,
136 SorterRef_Size = 28,
137 Memdb_Maxsize = 29,
138 Rowid_In_View = 30,
139}
140
141Destructor_Behavior :: enum (int) {
142 Static = 0,
143 Transient = -1,
144}
145
146Destructor :: struct #raw_union {
147 callback: proc(it: rawptr),
148 behaviour: Destructor_Behavior,
149}
150
151Result_Code :: enum (c.int) {
152 Ok = 0,
153 Error = 1,
154 Internal = 2,
155 Perm = 3,
156 Abort = 4,
157 Busy = 5,
158 Locked = 6,
159 NoMem = 7,
160 ReadOnly = 8,
161 Interrupt = 9,
162 IoErr = 10,
163 Corrupt = 11,
164 NotFound = 12,
165 Full = 13,
166 CantOpen = 14,
167 Protocol = 15,
168 Empty = 16,
169 Schema = 17,
170 TooBig = 18,
171 Constraint = 19,
172 Mismatch = 20,
173 Misuse = 21,
174 NoLfs = 22,
175 Auth = 23,
176 Format = 24,
177 Range = 25,
178 NotA_Db = 26,
179 Notice = 27,
180 Warning = 28,
181 Row = 100,
182 Done = 101,
183 Ok_Load_Permanently = 256,
184 Error_Missing_CollSeq = 257,
185 Busy_Recovery = 261,
186 Locked_SharedCache = 262,
187 ReadOnly_Recovery = 264,
188 IoErr_Read = 266,
189 Corrupt_Vtab = 267,
190 CantOpen_NoTempDir = 270,
191 Constraint_Check = 275,
192 Auth_User = 279,
193 Notice_Recover_Wal = 283,
194 Warning_AutoIndex = 284,
195 Error_Retry = 513,
196 Abort_Rollback = 516,
197 Busy_Snapshot = 517,
198 Locked_Vtab = 518,
199 ReadOnly_CantLock = 520,
200 IoErr_Short_Read = 522,
201 Corrupt_Sequence = 523,
202 CantOpen_IsDir = 526,
203 Constraint_CommitHook = 531,
204 Notice_Recover_Rollback = 539,
205 Error_Snapshot = 769,
206 Busy_Timeout = 773,
207 ReadOnly_Rollback = 776,
208 IoErr_Write = 778,
209 Corrupt_Index = 779,
210 CantOpen_FullPath = 782,
211 Constraint_ForeignKey = 787,
212 ReadOnly_DbMoved = 1032,
213 IoErr_FSync = 1034,
214 CantOpen_ConvPath = 1038,
215 Constraint_Function = 1043,
216 ReadOnly_CantInit = 1288,
217 IoErr_Dir_FSync = 1290,
218 CantOpen_DirtyWal = 1294,
219 Constraint_NotNull = 1299,
220 ReadOnly_Directory = 1544,
221 IoErr_Truncate = 1546,
222 CantOpen_Symlink = 1550,
223 Constraint_PrimaryKey = 1555,
224 IoErr_FStat = 1802,
225 Constraint_Trigger = 1811,
226 IoErr_Unlock = 2058,
227 Constraint_Unique = 2067,
228 IoErr_RdLock = 2314,
229 Constraint_Vtab = 2323,
230 IoErr_Delete = 2570,
231 Constraint_RowId = 2579,
232 IoErr_Blocked = 2826,
233 Constraint_Pinned = 2835,
234 IoErr_NoMem = 3082,
235 Constraint_DataType = 3091,
236 IoErr_Access = 3338,
237 IoErr_CheckReservedLock = 3594,
238 IoErr_Lock = 3850,
239 IoErr_Close = 4106,
240 IoErr_Dir_Close = 4362,
241 IoErr_ShmOpen = 4618,
242 IoErr_ShmSize = 4874,
243 IoErr_ShmLock = 5130,
244 IoErr_ShmMap = 5386,
245 IoErr_Seek = 5642,
246 IoErr_Delete_NoEnt = 5898,
247 IoErr_MMap = 6154,
248 IoErr_GetTempPath = 6410,
249 IoErr_ConvPath = 6666,
250 IoErr_VNode = 6922,
251 IoErr_Auth = 7178,
252 IoErr_Begin_Atomic = 7434,
253 IoErr_Commit_Atomic = 7690,
254 IoErr_Rollback_Atomic = 7946,
255 IoErr_Data = 8202,
256 IoErr_CorruptFS = 8458,
257}
258
259@(link_prefix = "sqlite3_")
260foreign sqlite {
261 free :: proc "c" (ptr: rawptr) ---
262 open :: proc "c" (filename: cstring, db: ^^Connection) -> Result_Code ---
263 open16 :: proc "c" (filename: cstring, db: ^^Connection) -> Result_Code ---
264 open_v2 :: proc "c" (filename: cstring, db: ^^Connection, flags: c.int, z_vfs: cstring) -> Result_Code ---
265 close :: proc "c" (db: ^Connection) -> Result_Code ---
266 close_v2 :: proc "c" (db: ^Connection) -> Result_Code ---
267 prepare :: proc "c" (db: ^Connection, sql: cstring, n_bytes: c.int, statement: ^^Statement, tail: ^^cstring) -> Result_Code ---
268 prepare_v2 :: proc "c" (db: ^Connection, sql: cstring, n_bytes: c.int, statement: ^^Statement, tail: ^^cstring) -> Result_Code ---
269 step :: proc "c" (statement: ^Statement) -> Result_Code ---
270 finalize :: proc "c" (statememt: ^Statement) -> Result_Code ---
271 exec :: proc "c" (db: ^Connection, sql: cstring, cb: proc "c" (ctx: rawptr, argc: c.int, argv: [^]cstring, col_names: [^]cstring) -> c.int, ctx: rawptr, err: ^cstring) -> Result_Code ---
272 changes :: proc "c" (db: ^Connection) -> c.int ---
273 changes64 :: proc "c" (db: ^Connection) -> c.int64_t ---
274 errmsg :: proc "c" (db: ^Connection) -> cstring ---
275 extended_result_codes :: proc "c" (db: ^Connection, onoff: c.int) -> c.int ---
276 extended_errcode :: proc "c" (db: ^Connection) -> Result_Code ---
277 auto_extension :: proc "c" (x_entry_point: proc "c" ()) -> Result_Code ---
278 cancel_auto_extension :: proc "c" (x_entry_point: proc "c" ()) -> Result_Code ---
279 backup :: proc "c" (dest: ^Connection, dest_name: cstring, source: ^Connection, source_name: cstring) -> ^Backup ---
280 backup_step :: proc "c" (backup: ^Backup, n_page: c.int) -> c.int ---
281 backup_finish :: proc "c" (backup: ^Backup) -> Result_Code ---
282 backup_remaining :: proc "c" (backup: ^Backup) -> c.int ---
283 backup_pagecount :: proc "c" (backup: ^Backup) -> c.int ---
284 bind_blob :: proc "c" (statement: ^Statement, param_idx: c.int, param_value: [^]byte, param_len: c.int, free: Destructor) -> Result_Code ---
285 bind_blob64 :: proc "c" (statement: ^Statement, param_idx: c.int, param_value: [^]byte, param_len: c.int64_t, free: Destructor) -> Result_Code ---
286 bind_double :: proc "c" (statement: ^Statement, param_idx: c.int, param_value: c.double) -> Result_Code ---
287 bind_int :: proc "c" (statement: ^Statement, param_idx: c.int, param_value: c.int) -> Result_Code ---
288 bind_int64 :: proc "c" (statement: ^Statement, param_idx: c.int, param_value: c.int64_t) -> Result_Code ---
289 bind_null :: proc "c" (statement: ^Statement, param_idx: c.int) -> Result_Code ---
290 bind_text :: proc "c" (statement: ^Statement, param_idx: c.int, param_value: cstring, param_len: c.int, free: Destructor) -> Result_Code ---
291 bind_text16 :: proc "c" (statement: ^Statement, param_idx: c.int, param_value: cstring, param_len: c.int, free: Destructor) -> Result_Code ---
292 bind_text64 :: proc "c" (statement: ^Statement, param_idx: c.int, param_value: cstring, param_len: c.int64_t, free: Destructor, encoding: c.uchar) -> Result_Code ---
293 bind_zeroblob :: proc "c" (statement: ^Statement, param_idx: c.int, len: c.int) -> Result_Code ---
294 bind_zeroblob64 :: proc "c" (statement: ^Statement, param_idx: c.int, len: c.int64_t) -> Result_Code ---
295 bind_parameter_count :: proc "c" (statement: ^Statement) -> c.int ---
296 bind_parameter_index :: proc "c" (statement: ^Statement, name: cstring) -> c.int ---
297 bind_parameter_name :: proc "c" (statement: ^Statement, param_idx: c.int) -> cstring ---
298 blob_bytes :: proc "c" (blob: ^Blob) -> c.int ---
299 blob_close :: proc "c" (blob: ^Blob) -> Result_Code ---
300 blob_open :: proc "c" (db: ^Connection, database_name: cstring, table: cstring, column: cstring, row_idx: c.int64_t, flags: c.int, blob: ^^Blob) -> Result_Code ---
301 blob_read :: proc "c" (blob: ^Blob, dest: rawptr, n_bytes: c.int, n_bytes_offset: c.int) -> Result_Code ---
302 blob_write :: proc "c" (blob: ^Blob, source: rawptr, n_bytes: c.int, n_bytes_offset: c.int) -> Result_Code ---
303 blob_reopen :: proc "c" (blob: ^Blob, row_id: c.int64_t) -> Result_Code ---
304 busy_handler :: proc "c" (db: ^Connection, handler: proc "c" (ctx: rawptr, attempt: c.int) -> Result_Code, ctx: rawptr) -> Result_Code ---
305 busy_timeout :: proc "c" (db: ^Connection, ms: c.int) -> Result_Code ---
306 @(require_results)
307 column_database_name :: proc "c" (statement: ^Statement, col_idx: c.int) -> cstring ---
308 @(require_results)
309 column_database_name16 :: proc "c" (statement: ^Statement, col_idx: c.int) -> cstring ---
310 @(require_results)
311 column_table_name :: proc "c" (statement: ^Statement, col_idx: c.int) -> cstring ---
312 @(require_results)
313 column_table_name16 :: proc "c" (statement: ^Statement, col_idx: c.int) -> cstring ---
314 @(require_results)
315 column_origin_name :: proc "c" (statement: ^Statement, col_idx: c.int) -> cstring ---
316 @(require_results)
317 column_origin_name16 :: proc "c" (statement: ^Statement, col_idx: c.int) -> cstring ---
318 @(require_results)
319 column_decltype :: proc "c" (statement: ^Statement, col_idx: c.int) -> cstring ---
320 @(require_results)
321 column_decltype16 :: proc "c" (statement: ^Statement, col_idx: c.int) -> cstring ---
322 @(require_results)
323 column_text :: proc "c" (statement: ^Statement, col_idx: c.int) -> cstring ---
324 column_blob :: proc "c" (statement: ^Statement, col_idx: c.int) -> rawptr ---
325 column_double :: proc "c" (statement: ^Statement, col_idx: c.int) -> c.double ---
326 column_int :: proc "c" (statement: ^Statement, col_idx: c.int) -> c.int ---
327 column_int64 :: proc "c" (statement: ^Statement, col_idx: c.int) -> c.int64_t ---
328 column_bytes :: proc "c" (statement: ^Statement, col_idx: c.int) -> c.int ---
329 column_bytes16 :: proc "c" (statement: ^Statement, col_idx: c.int) -> c.int ---
330 column_type :: proc "c" (statement: ^Statement, col_idx: c.int) -> c.int ---
331 column_count :: proc "c" (statement: ^Statement) -> c.int ---
332 column_name :: proc "c" (statement: ^Statement, col_idx: c.int) -> cstring ---
333 commit_hook :: proc "c" (db: ^Connection, cb: proc "c" (ctx: rawptr) -> Result_Code, ctx: rawptr) -> rawptr ---
334 rollback_hook :: proc "c" (db: ^Connection, cb: proc "c" (ctx: rawptr) -> Result_Code, ctx: rawptr) -> rawptr ---
335 compileoption_used :: proc "c" (opt_name: cstring) -> c.int ---
336 @(require_results)
337 compileoption_get :: proc "c" (n: c.int) -> cstring ---
338 complete :: proc "c" (sql: cstring) -> c.int ---
339 complete16 :: proc "c" (sql: cstring) -> c.int ---
340 // TODO: this function should also have varargs
341 config :: proc "c" (option: Config_Option) -> Result_Code ---
342 sql :: proc "c" (statement: ^Statement) -> cstring ---
343 expanded_sql :: proc "c" (statement: ^Statement) -> cstring ---
344 threadsafe :: proc "c" () -> c.int ---
345
346 // Export SQLCipher-specific functions conditionally.
347 when USE_SQLCIPHER {
348 key :: proc "c" (db: ^Connection, key: rawptr, nKey: c.int) -> c.int ---
349 key_v2 :: proc "c" (db: ^Connection, zDbName: cstring, key: rawptr, nKey: c.int) -> c.int ---
350 rekey :: proc "c" (db: ^Connection, key: rawptr, nKey: c.int) -> c.int ---
351 rekey_v2 :: proc "c" (db: ^Connection, zDbName: cstring, key: rawptr, nKey: c.int) -> c.int ---
352 }
353}