Github User Fetcher 1.0.0
C Application with Server and GUI
Loading...
Searching...
No Matches
lsqlite3.c
Go to the documentation of this file.
1/************************************************************************
2* lsqlite3 *
3* Copyright (C) 2002-2016 Tiago Dionizio, Doug Currie *
4* All rights reserved. *
5* Author : Tiago Dionizio <tiago.dionizio@ist.utl.pt> *
6* Author : Doug Currie <doug.currie@alum.mit.edu> *
7* Library : lsqlite3 - an SQLite 3 database binding for Lua 5 *
8* *
9* Permission is hereby granted, free of charge, to any person obtaining *
10* a copy of this software and associated documentation files (the *
11* "Software"), to deal in the Software without restriction, including *
12* without limitation the rights to use, copy, modify, merge, publish, *
13* distribute, sublicense, and/or sell copies of the Software, and to *
14* permit persons to whom the Software is furnished to do so, subject to *
15* the following conditions: *
16* *
17* The above copyright notice and this permission notice shall be *
18* included in all copies or substantial portions of the Software. *
19* *
20* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
21* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
22* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*
23* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY *
24* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, *
25* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE *
26* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
27************************************************************************/
28
29#include <stdlib.h>
30#include <string.h>
31#include <assert.h>
32
33#include "civetweb_lua.h"
34
35#if LUA_VERSION_NUM > 501
36/*
37** Lua 5.2
38*/
39#ifndef lua_strlen
40#define lua_strlen lua_rawlen
41#endif
42/* luaL_typerror always used with arg at ndx == NULL */
43#define luaL_typerror(L,ndx,str) luaL_error(L,"bad argument %d (%s expected, got nil)",ndx,str)
44/* luaL_register used once, so below expansion is OK for this case */
45#define luaL_register(L,name,reg) lua_newtable(L);luaL_setfuncs(L,reg,0)
46/* luaL_openlib always used with name == NULL */
47#define luaL_openlib(L,name,reg,nup) luaL_setfuncs(L,reg,nup)
48
49#if LUA_VERSION_NUM > 502
50/*
51** Lua 5.3
52*/
53#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n)))
54#endif
55#endif
56
57#include "sqlite3.h"
58
59/* compile time features */
60#if !defined(SQLITE_OMIT_PROGRESS_CALLBACK)
61 #define SQLITE_OMIT_PROGRESS_CALLBACK 0
62#endif
63#if !defined(LSQLITE_OMIT_UPDATE_HOOK)
64 #define LSQLITE_OMIT_UPDATE_HOOK 0
65#endif
66#if defined(LSQLITE_OMIT_OPEN_V2)
67 #define SQLITE3_OPEN(L,filename,flags) sqlite3_open(L,filename)
68#else
69 #define SQLITE3_OPEN(L,filename,flags) sqlite3_open_v2(L,filename,flags,NULL)
70#endif
71
72typedef struct sdb sdb;
73typedef struct sdb_vm sdb_vm;
74typedef struct sdb_bu sdb_bu;
75typedef struct sdb_func sdb_func;
76
77/* to use as C user data so i know what function sqlite is calling */
78struct sdb_func {
79 /* references to associated lua values */
82 int udata;
83
86
88};
89
90/* information about database */
91struct sdb {
92 /* associated lua state */
94 /* sqlite database handle */
96
97 /* sql functions stack usage */
98 sdb_func *func; /* top SQL function being called */
99
100 /* references */
101 int busy_cb; /* busy callback */
103
104 int progress_cb; /* progress handler */
106
107 int trace_cb; /* trace callback */
109
110#if !defined(LSQLITE_OMIT_UPDATE_HOOK) || !LSQLITE_OMIT_UPDATE_HOOK
111
112 int update_hook_cb; /* update_hook callback */
114
115 int commit_hook_cb; /* commit_hook callback */
117
118 int rollback_hook_cb; /* rollback_hook callback */
120
121#endif
122};
123
124static const char *sqlite_meta = ":sqlite3";
125static const char *sqlite_vm_meta = ":sqlite3:vm";
126static const char *sqlite_bu_meta = ":sqlite3:bu";
127static const char *sqlite_ctx_meta = ":sqlite3:ctx";
129
130/* Lua 5.3 introduced an integer type, but depending on the implementation, it could be 32
131** or 64 bits (or something else?). This helper macro tries to do "the right thing."
132*/
133
134#if LUA_VERSION_NUM > 502
135#define PUSH_INT64(L,i64in,fallback) \
136 do { \
137 sqlite_int64 i64 = i64in; \
138 lua_Integer i = (lua_Integer )i64; \
139 if (i == i64) lua_pushinteger(L, i);\
140 else { \
141 lua_Number n = (lua_Number)i64; \
142 if (n == i64) lua_pushnumber(L, n); \
143 else fallback; \
144 } \
145 } while (0)
146#else
147#define PUSH_INT64(L,i64in,fallback) \
148 do { \
149 sqlite_int64 i64 = i64in; \
150 lua_Number n = (lua_Number)i64; \
151 if (n == i64) lua_pushnumber(L, n); \
152 else fallback; \
153 } while (0)
154#endif
155
156/*
157** =======================================================
158** Database Virtual Machine Operations
159** =======================================================
160*/
161
162static void vm_push_column(lua_State *L, sqlite3_stmt *vm, int idx) {
163 switch (sqlite3_column_type(vm, idx)) {
164 case SQLITE_INTEGER:
166 , lua_pushlstring(L, (const char*)sqlite3_column_text(vm, idx)
167 , sqlite3_column_bytes(vm, idx)));
168 break;
169 case SQLITE_FLOAT:
171 break;
172 case SQLITE_TEXT:
173 lua_pushlstring(L, (const char*)sqlite3_column_text(vm, idx), sqlite3_column_bytes(vm, idx));
174 break;
175 case SQLITE_BLOB:
177 break;
178 case SQLITE_NULL:
179 lua_pushnil(L);
180 break;
181 default:
182 lua_pushnil(L);
183 break;
184 }
185}
186
187/* virtual machine information */
188struct sdb_vm {
189 sdb *db; /* associated database handle */
190 sqlite3_stmt *vm; /* virtual machine */
191
192 /* sqlite3_step info */
193 int columns; /* number of columns in result */
194 char has_values; /* true when step succeeds */
195
196 char temp; /* temporary vm used in db:rows */
197};
198
199/* called with db,sql text on the lua stack */
200static sdb_vm *newvm(lua_State *L, sdb *db) {
201 sdb_vm *svm = (sdb_vm*)lua_newuserdata(L, sizeof(sdb_vm)); /* db sql svm_ud -- */
202
204 lua_setmetatable(L, -2); /* set metatable */
205
206 svm->db = db;
207 svm->columns = 0;
208 svm->has_values = 0;
209 svm->vm = NULL;
210 svm->temp = 0;
211
212 /* add an entry on the database table: svm -> db to keep db live while svm is live */
213 lua_pushlightuserdata(L, db); /* db sql svm_ud db_lud -- */
214 lua_rawget(L, LUA_REGISTRYINDEX); /* db sql svm_ud reg[db_lud] -- */
215 lua_pushlightuserdata(L, svm); /* db sql svm_ud reg[db_lud] svm_lud -- */
216 lua_pushvalue(L, -5); /* db sql svm_ud reg[db_lud] svm_lud db -- */
217 lua_rawset(L, -3); /* (reg[db_lud])[svm_lud] = db ; set the db for this vm */
218 lua_pop(L, 1); /* db sql svm_ud -- */
219
220 return svm;
221}
222
223static int cleanupvm(lua_State *L, sdb_vm *svm) {
224
225 /* remove entry in database table - no harm if not present in the table */
226 lua_pushlightuserdata(L, svm->db);
228 lua_pushlightuserdata(L, svm);
229 lua_pushnil(L);
230 lua_rawset(L, -3);
231 lua_pop(L, 1);
232
233 svm->columns = 0;
234 svm->has_values = 0;
235
236 if (!svm->vm) return 0;
237
239 svm->vm = NULL;
240 return 1;
241}
242
243static int stepvm(lua_State *L, sdb_vm *svm) {
244 return sqlite3_step(svm->vm);
245}
246
249 if (svm == NULL) luaL_argerror(L, index, "bad sqlite virtual machine");
250 return svm;
251}
252
254 sdb_vm *svm = lsqlite_getvm(L, index);
255 if (svm->vm == NULL) luaL_argerror(L, index, "attempt to use closed sqlite virtual machine");
256 return svm;
257}
258
259static int dbvm_isopen(lua_State *L) {
260 sdb_vm *svm = lsqlite_getvm(L, 1);
261 lua_pushboolean(L, svm->vm != NULL ? 1 : 0);
262 return 1;
263}
264
265static int dbvm_tostring(lua_State *L) {
266 char buff[39];
267 sdb_vm *svm = lsqlite_getvm(L, 1);
268 if (svm->vm == NULL)
269 strcpy(buff, "closed");
270 else
271 sprintf(buff, "%p", svm);
272 lua_pushfstring(L, "sqlite virtual machine (%s)", buff);
273 return 1;
274}
275
276static int dbvm_gc(lua_State *L) {
277 sdb_vm *svm = lsqlite_getvm(L, 1);
278 if (svm->vm != NULL) /* ignore closed vms */
279 cleanupvm(L, svm);
280 return 0;
281}
282
283static int dbvm_step(lua_State *L) {
284 int result;
285 sdb_vm *svm = lsqlite_checkvm(L, 1);
286
287 result = stepvm(L, svm);
288 svm->has_values = result == SQLITE_ROW ? 1 : 0;
289 svm->columns = sqlite3_data_count(svm->vm);
290
291 lua_pushinteger(L, result);
292 return 1;
293}
294
295static int dbvm_finalize(lua_State *L) {
296 sdb_vm *svm = lsqlite_checkvm(L, 1);
297 return cleanupvm(L, svm);
298}
299
300static int dbvm_reset(lua_State *L) {
301 sdb_vm *svm = lsqlite_checkvm(L, 1);
302 sqlite3_reset(svm->vm);
304 return 1;
305}
306
307static void dbvm_check_contents(lua_State *L, sdb_vm *svm) {
308 if (!svm->has_values) {
309 luaL_error(L, "misuse of function");
310 }
311}
312
313static void dbvm_check_index(lua_State *L, sdb_vm *svm, int index) {
314 if (index < 0 || index >= svm->columns) {
315 luaL_error(L, "index out of range [0..%d]", svm->columns - 1);
316 }
317}
318
319static void dbvm_check_bind_index(lua_State *L, sdb_vm *svm, int index) {
320 if (index < 1 || index > sqlite3_bind_parameter_count(svm->vm)) {
321 luaL_error(L, "bind index out of range [1..%d]", sqlite3_bind_parameter_count(svm->vm));
322 }
323}
324
326 sdb_vm *svm = lsqlite_checkvm(L, 1);
327 /* conversion warning: int64 -> luaNumber */
329 PUSH_INT64(L, rowid, lua_pushfstring(L, "%ll", rowid));
330 return 1;
331}
332
333/*
334** =======================================================
335** Virtual Machine - generic info
336** =======================================================
337*/
338static int dbvm_columns(lua_State *L) {
339 sdb_vm *svm = lsqlite_checkvm(L, 1);
341 return 1;
342}
343
344/*
345** =======================================================
346** Virtual Machine - getters
347** =======================================================
348*/
349
350static int dbvm_get_value(lua_State *L) {
351 sdb_vm *svm = lsqlite_checkvm(L, 1);
352 int index = luaL_checkint(L, 2);
353 dbvm_check_contents(L, svm);
354 dbvm_check_index(L, svm, index);
355 vm_push_column(L, svm->vm, index);
356 return 1;
357}
358
359static int dbvm_get_name(lua_State *L) {
360 sdb_vm *svm = lsqlite_checkvm(L, 1);
361 int index = luaL_checknumber(L, 2);
362 dbvm_check_index(L, svm, index);
364 return 1;
365}
366
367static int dbvm_get_type(lua_State *L) {
368 sdb_vm *svm = lsqlite_checkvm(L, 1);
369 int index = luaL_checknumber(L, 2);
370 dbvm_check_index(L, svm, index);
372 return 1;
373}
374
376 sdb_vm *svm = lsqlite_checkvm(L, 1);
377 sqlite3_stmt *vm = svm->vm;
378 int columns = svm->columns;
379 int n;
380 dbvm_check_contents(L, svm);
381
382 lua_createtable(L, columns, 0);
383 for (n = 0; n < columns;) {
384 vm_push_column(L, vm, n++);
385 lua_rawseti(L, -2, n);
386 }
387 return 1;
388}
389
390static int dbvm_get_names(lua_State *L) {
391 sdb_vm *svm = lsqlite_checkvm(L, 1);
392 sqlite3_stmt *vm = svm->vm;
393 int columns = sqlite3_column_count(vm); /* valid as soon as statement prepared */
394 int n;
395
396 lua_createtable(L, columns, 0);
397 for (n = 0; n < columns;) {
399 lua_rawseti(L, -2, n);
400 }
401 return 1;
402}
403
404static int dbvm_get_types(lua_State *L) {
405 sdb_vm *svm = lsqlite_checkvm(L, 1);
406 sqlite3_stmt *vm = svm->vm;
407 int columns = sqlite3_column_count(vm); /* valid as soon as statement prepared */
408 int n;
409
410 lua_createtable(L, columns, 0);
411 for (n = 0; n < columns;) {
413 lua_rawseti(L, -2, n);
414 }
415 return 1;
416}
417
419 sdb_vm *svm = lsqlite_checkvm(L, 1);
420 sqlite3_stmt *vm = svm->vm;
421 int columns = svm->columns;
422 int n;
423 dbvm_check_contents(L, svm);
424
425 lua_checkstack(L, columns);
426 for (n = 0; n < columns; ++n)
427 vm_push_column(L, vm, n);
428 return columns;
429}
430
432 sdb_vm *svm = lsqlite_checkvm(L, 1);
433 sqlite3_stmt *vm = svm->vm;
434 int columns = sqlite3_column_count(vm); /* valid as soon as statement prepared */
435 int n;
436
437 lua_checkstack(L, columns);
438 for (n = 0; n < columns; ++n)
440 return columns;
441}
442
444 sdb_vm *svm = lsqlite_checkvm(L, 1);
445 sqlite3_stmt *vm = svm->vm;
446 int columns = sqlite3_column_count(vm); /* valid as soon as statement prepared */
447 int n;
448
449 lua_checkstack(L, columns);
450 for (n = 0; n < columns; ++n)
452 return columns;
453}
454
456 sdb_vm *svm = lsqlite_checkvm(L, 1);
457 sqlite3_stmt *vm = svm->vm;
458 int columns = svm->columns;
459 int n;
460 dbvm_check_contents(L, svm);
461
462 lua_createtable(L, 0, columns);
463 for (n = 0; n < columns; ++n) {
465 vm_push_column(L, vm, n);
466 lua_rawset(L, -3);
467 }
468 return 1;
469}
470
472 sdb_vm *svm = lsqlite_checkvm(L, 1);
473 sqlite3_stmt *vm = svm->vm;
474 int columns = sqlite3_column_count(vm);
475 int n;
476
477 lua_createtable(L, 0, columns);
478 for (n = 0; n < columns; ++n) {
481 lua_rawset(L, -3);
482 }
483 return 1;
484}
485
486/*
487** =======================================================
488** Virtual Machine - Bind
489** =======================================================
490*/
491
492static int dbvm_bind_index(lua_State *L, sqlite3_stmt *vm, int index, int lindex) {
493 switch (lua_type(L, lindex)) {
494 case LUA_TSTRING:
495 return sqlite3_bind_text(vm, index, lua_tostring(L, lindex), lua_strlen(L, lindex), SQLITE_TRANSIENT);
496 case LUA_TNUMBER:
497#if LUA_VERSION_NUM > 502
498 if (lua_isinteger(L, lindex))
499 return sqlite3_bind_int64(vm, index, lua_tointeger(L, lindex));
500#endif
501 return sqlite3_bind_double(vm, index, lua_tonumber(L, lindex));
502 case LUA_TBOOLEAN:
503 return sqlite3_bind_int(vm, index, lua_toboolean(L, lindex) ? 1 : 0);
504 case LUA_TNONE:
505 case LUA_TNIL:
506 return sqlite3_bind_null(vm, index);
507 default:
508 luaL_error(L, "index (%d) - invalid data type for bind (%s)", index, lua_typename(L, lua_type(L, lindex)));
509 return SQLITE_MISUSE; /*!*/
510 }
511}
512
513
515 sdb_vm *svm = lsqlite_checkvm(L, 1);
517 return 1;
518}
519
521 sdb_vm *svm = lsqlite_checkvm(L, 1);
522 int index = luaL_checknumber(L, 2);
525 return 1;
526}
527
528static int dbvm_bind(lua_State *L) {
529 sdb_vm *svm = lsqlite_checkvm(L, 1);
530 sqlite3_stmt *vm = svm->vm;
531 int index = luaL_checkint(L, 2);
532 int result;
533
535 result = dbvm_bind_index(L, vm, index, 3);
536
537 lua_pushinteger(L, result);
538 return 1;
539}
540
541static int dbvm_bind_blob(lua_State *L) {
542 sdb_vm *svm = lsqlite_checkvm(L, 1);
543 int index = luaL_checkint(L, 2);
544 const char *value = luaL_checkstring(L, 3);
545 int len = lua_strlen(L, 3);
546
548 return 1;
549}
550
552 sdb_vm *svm = lsqlite_checkvm(L, 1);
553 sqlite3_stmt *vm = svm->vm;
554 int top = lua_gettop(L);
555 int result, n;
556
557 if (top - 1 != sqlite3_bind_parameter_count(vm))
558 luaL_error(L,
559 "incorrect number of parameters to bind (%d given, %d to bind)",
560 top - 1,
562 );
563
564 for (n = 2; n <= top; ++n) {
565 if ((result = dbvm_bind_index(L, vm, n - 1, n)) != SQLITE_OK) {
566 lua_pushinteger(L, result);
567 return 1;
568 }
569 }
570
572 return 1;
573}
574
576 sdb_vm *svm = lsqlite_checkvm(L, 1);
577 sqlite3_stmt *vm = svm->vm;
578 int count = sqlite3_bind_parameter_count(vm);
579 const char *name;
580 int result, n;
582
583 for (n = 1; n <= count; ++n) {
585 if (name && (name[0] == ':' || name[0] == '$')) {
586 lua_pushstring(L, ++name);
587 lua_gettable(L, 2);
588 result = dbvm_bind_index(L, vm, n, -1);
589 lua_pop(L, 1);
590 }
591 else {
592 lua_pushinteger(L, n);
593 lua_gettable(L, 2);
594 result = dbvm_bind_index(L, vm, n, -1);
595 lua_pop(L, 1);
596 }
597
598 if (result != SQLITE_OK) {
599 lua_pushinteger(L, result);
600 return 1;
601 }
602 }
603
605 return 1;
606}
607
608/*
609** =======================================================
610** Database (internal management)
611** =======================================================
612*/
613
614/*
615** When creating database handles, always creates a `closed' database handle
616** before opening the actual database; so, if there is a memory error, the
617** database is not left opened.
618**
619** Creates a new 'table' and leaves it in the stack
620*/
621static sdb *newdb (lua_State *L) {
622 sdb *db = (sdb*)lua_newuserdata(L, sizeof(sdb));
623 db->L = L;
624 db->db = NULL; /* database handle is currently `closed' */
625 db->func = NULL;
626
627 db->busy_cb =
628 db->busy_udata =
629 db->progress_cb =
630 db->progress_udata =
631 db->trace_cb =
632 db->trace_udata =
633#if !defined(LSQLITE_OMIT_UPDATE_HOOK) || !LSQLITE_OMIT_UPDATE_HOOK
634 db->update_hook_cb =
636 db->commit_hook_cb =
638 db->rollback_hook_cb =
640#endif
641 LUA_NOREF;
642
644 lua_setmetatable(L, -2); /* set metatable */
645
646 /* to keep track of 'open' virtual machines */
648 lua_newtable(L);
650
651 return db;
652}
653
654static int cleanupdb(lua_State *L, sdb *db) {
655 sdb_func *func;
656 sdb_func *func_next;
657 int top;
658 int result;
659
660 /* free associated virtual machines */
663
664 /* close all used handles */
665 top = lua_gettop(L);
666 lua_pushnil(L);
667 while (lua_next(L, -2)) {
668 sdb_vm *svm = lua_touserdata(L, -2); /* key: vm; val: sql text */
669 cleanupvm(L, svm);
670
671 lua_settop(L, top);
672 lua_pushnil(L);
673 }
674
675 lua_pop(L, 1); /* pop vm table */
676
677 /* remove entry in lua registry table */
679 lua_pushnil(L);
681
682 /* 'free' all references */
689#if !defined(LSQLITE_OMIT_UPDATE_HOOK) || !LSQLITE_OMIT_UPDATE_HOOK
696#endif
697
698 /* close database */
699 result = sqlite3_close(db->db);
700 db->db = NULL;
701
702 /* free associated memory with created functions */
703 func = db->func;
704 while (func) {
705 func_next = func->next;
709 free(func);
710 func = func_next;
711 }
712 db->func = NULL;
713 return result;
714}
715
718 if (db == NULL) luaL_typerror(L, index, "sqlite database");
719 return db;
720}
721
723 sdb *db = lsqlite_getdb(L, index);
724 if (db->db == NULL) luaL_argerror(L, index, "attempt to use closed sqlite database");
725 return db;
726}
727
728
729/*
730** =======================================================
731** User Defined Functions - Context Methods
732** =======================================================
733*/
734typedef struct {
736 int ud;
737} lcontext;
738
740 lcontext *ctx = (lcontext*)lua_newuserdata(L, sizeof(lcontext));
742 lua_setmetatable(L, -2);
743 ctx->ctx = NULL;
744 ctx->ud = LUA_NOREF;
745 return ctx;
746}
747
750 if (ctx == NULL) luaL_typerror(L, index, "sqlite context");
751 return ctx;
752}
753
756 if (ctx->ctx == NULL) luaL_argerror(L, index, "invalid sqlite context");
757 return ctx;
758}
759
761 char buff[39];
762 lcontext *ctx = lsqlite_getcontext(L, 1);
763 if (ctx->ctx == NULL)
764 strcpy(buff, "closed");
765 else
766 sprintf(buff, "%p", ctx->ctx);
767 lua_pushfstring(L, "sqlite function context (%s)", buff);
768 return 1;
769}
770
772 sdb_func *func = (sdb_func*)sqlite3_user_data(ctx->ctx);
773 if (!func->aggregate) {
774 luaL_error(L, "attempt to call aggregate method from scalar function");
775 }
776}
777
779 lcontext *ctx = lsqlite_checkcontext(L, 1);
780 sdb_func *func = (sdb_func*)sqlite3_user_data(ctx->ctx);
782 return 1;
783}
784
786 lcontext *ctx = lsqlite_checkcontext(L, 1);
789 return 1;
790}
791
793 lcontext *ctx = lsqlite_checkcontext(L, 1);
795 lua_settop(L, 2);
797 ctx->ud = luaL_ref(L, LUA_REGISTRYINDEX);
798 return 0;
799}
800
802 lcontext *ctx = lsqlite_checkcontext(L, 1);
805 return 1;
806}
807
808#if 0
810void sqlite3_set_auxdata(sqlite3_context*, int, void*, void (*)(void*));
811#endif
812
814 lcontext *ctx = lsqlite_checkcontext(L, 1);
815 switch (lua_type(L, 2)) {
816 case LUA_TNUMBER:
817#if LUA_VERSION_NUM > 502
818 if (lua_isinteger(L, 2))
820 else
821#endif
823 break;
824 case LUA_TSTRING:
826 break;
827 case LUA_TNIL:
828 case LUA_TNONE:
830 break;
831 default:
832 luaL_error(L, "invalid result type %s", lua_typename(L, 2));
833 break;
834 }
835
836 return 0;
837}
838
840 lcontext *ctx = lsqlite_checkcontext(L, 1);
841 const char *blob = luaL_checkstring(L, 2);
842 int size = lua_strlen(L, 2);
843 sqlite3_result_blob(ctx->ctx, (const void*)blob, size, SQLITE_TRANSIENT);
844 return 0;
845}
846
848 lcontext *ctx = lsqlite_checkcontext(L, 1);
849 double d = luaL_checknumber(L, 2);
850 sqlite3_result_double(ctx->ctx, d);
851 return 0;
852}
853
855 lcontext *ctx = lsqlite_checkcontext(L, 1);
856 const char *err = luaL_checkstring(L, 2);
857 int size = lua_strlen(L, 2);
858 sqlite3_result_error(ctx->ctx, err, size);
859 return 0;
860}
861
863 lcontext *ctx = lsqlite_checkcontext(L, 1);
864 int i = luaL_checkint(L, 2);
865 sqlite3_result_int(ctx->ctx, i);
866 return 0;
867}
868
870 lcontext *ctx = lsqlite_checkcontext(L, 1);
872 return 0;
873}
874
876 lcontext *ctx = lsqlite_checkcontext(L, 1);
877 const char *text = luaL_checkstring(L, 2);
878 int size = lua_strlen(L, 2);
879 sqlite3_result_text(ctx->ctx, text, size, SQLITE_TRANSIENT);
880 return 0;
881}
882
883/*
884** =======================================================
885** Database Methods
886** =======================================================
887*/
888
889static int db_isopen(lua_State *L) {
890 sdb *db = lsqlite_getdb(L, 1);
891 lua_pushboolean(L, db->db != NULL ? 1 : 0);
892 return 1;
893}
894
896 sdb *db = lsqlite_checkdb(L, 1);
897 /* conversion warning: int64 -> luaNumber */
899 PUSH_INT64(L, rowid, lua_pushfstring(L, "%ll", rowid));
900 return 1;
901}
902
903static int db_changes(lua_State *L) {
904 sdb *db = lsqlite_checkdb(L, 1);
906 return 1;
907}
908
910 sdb *db = lsqlite_checkdb(L, 1);
912 return 1;
913}
914
915static int db_errcode(lua_State *L) {
916 sdb *db = lsqlite_checkdb(L, 1);
918 return 1;
919}
920
921static int db_errmsg(lua_State *L) {
922 sdb *db = lsqlite_checkdb(L, 1);
924 return 1;
925}
926
927static int db_interrupt(lua_State *L) {
928 sdb *db = lsqlite_checkdb(L, 1);
930 return 0;
931}
932
933static int db_db_filename(lua_State *L) {
934 sdb *db = lsqlite_checkdb(L, 1);
935 const char *db_name = luaL_checkstring(L, 2);
936 // sqlite3_db_filename may return NULL, in that case Lua pushes nil...
937 lua_pushstring(L, sqlite3_db_filename(db->db, db_name));
938 return 1;
939}
940
941/*
942** Registering SQL functions:
943*/
944
946 switch (sqlite3_value_type(value)) {
947 case SQLITE_TEXT:
949 break;
950
951 case SQLITE_INTEGER:
953 , lua_pushlstring(L, (const char*)sqlite3_value_text(value)
955 break;
956
957 case SQLITE_FLOAT:
959 break;
960
961 case SQLITE_BLOB:
963 break;
964
965 case SQLITE_NULL:
966 lua_pushnil(L);
967 break;
968
969 default:
970 /* things done properly (SQLite + Lua SQLite)
971 ** this should never happen */
972 lua_pushnil(L);
973 break;
974 }
975}
976
977/*
978** callback functions used when calling registered sql functions
979*/
980
981/* scalar function to be called
982** callback params: context, values... */
983static void db_sql_normal_function(sqlite3_context *context, int argc, sqlite3_value **argv) {
984 sdb_func *func = (sdb_func*)sqlite3_user_data(context);
985 lua_State *L = func->db->L;
986 int n;
987 lcontext *ctx;
988
989 int top = lua_gettop(L);
990
991 /* ensure there is enough space in the stack */
992 lua_checkstack(L, argc + 3);
993
994 lua_rawgeti(L, LUA_REGISTRYINDEX, func->fn_step); /* function to call */
995
996 if (!func->aggregate) {
997 ctx = lsqlite_make_context(L); /* push context - used to set results */
998 }
999 else {
1000 /* reuse context userdata value */
1001 void *p = sqlite3_aggregate_context(context, 1);
1002 /* i think it is OK to use assume that using a light user data
1003 ** as an entry on LUA REGISTRY table will be unique */
1005 lua_rawget(L, LUA_REGISTRYINDEX); /* context table */
1006
1007 if (lua_isnil(L, -1)) { /* not yet created? */
1008 lua_pop(L, 1);
1009 ctx = lsqlite_make_context(L);
1011 lua_pushvalue(L, -2);
1013 }
1014 else
1015 ctx = lsqlite_getcontext(L, -1);
1016 }
1017
1018 /* push params */
1019 for (n = 0; n < argc; ++n) {
1020 db_push_value(L, argv[n]);
1021 }
1022
1023 /* set context */
1024 ctx->ctx = context;
1025
1026 if (lua_pcall(L, argc + 1, 0, 0)) {
1027 const char *errmsg = lua_tostring(L, -1);
1028 int size = lua_strlen(L, -1);
1029 sqlite3_result_error(context, errmsg, size);
1030 }
1031
1032 /* invalidate context */
1033 ctx->ctx = NULL;
1034
1035 if (!func->aggregate) {
1037 }
1038
1039 lua_settop(L, top);
1040}
1041
1043 sdb_func *func = (sdb_func*)sqlite3_user_data(context);
1044 lua_State *L = func->db->L;
1045 void *p = sqlite3_aggregate_context(context, 1); /* minimal mem usage */
1046 lcontext *ctx;
1047 int top = lua_gettop(L);
1048
1049 lua_rawgeti(L, LUA_REGISTRYINDEX, func->fn_finalize); /* function to call */
1050
1051 /* i think it is OK to use assume that using a light user data
1052 ** as an entry on LUA REGISTRY table will be unique */
1054 lua_rawget(L, LUA_REGISTRYINDEX); /* context table */
1055
1056 if (lua_isnil(L, -1)) { /* not yet created? - shouldn't happen in finalize function */
1057 lua_pop(L, 1);
1058 ctx = lsqlite_make_context(L);
1060 lua_pushvalue(L, -2);
1062 }
1063 else
1064 ctx = lsqlite_getcontext(L, -1);
1065
1066 /* set context */
1067 ctx->ctx = context;
1068
1069 if (lua_pcall(L, 1, 0, 0)) {
1070 sqlite3_result_error(context, lua_tostring(L, -1), -1);
1071 }
1072
1073 /* invalidate context */
1074 ctx->ctx = NULL;
1075
1076 /* cleanup context */
1078 /* remove it from registry */
1080 lua_pushnil(L);
1082
1083 lua_settop(L, top);
1084}
1085
1086/*
1087** Register a normal function
1088** Params: db, function name, number arguments, [ callback | step, finalize], user data
1089** Returns: true on sucess
1090**
1091** Normal function:
1092** Params: context, params
1093**
1094** Aggregate function:
1095** Params of step: context, params
1096** Params of finalize: context
1097*/
1098static int db_register_function(lua_State *L, int aggregate) {
1099 sdb *db = lsqlite_checkdb(L, 1);
1100 const char *name;
1101 int args;
1102 int result;
1103 sdb_func *func;
1104
1105 /* safety measure */
1106 if (aggregate) aggregate = 1;
1107
1108 name = luaL_checkstring(L, 2);
1109 args = luaL_checkint(L, 3);
1111 if (aggregate) luaL_checktype(L, 5, LUA_TFUNCTION);
1112
1113 /* maybe an alternative way to allocate memory should be used/avoided */
1114 func = (sdb_func*)malloc(sizeof(sdb_func));
1115 if (func == NULL) {
1116 luaL_error(L, "out of memory");
1117 }
1118
1119 result = sqlite3_create_function(
1120 db->db, name, args, SQLITE_UTF8, func,
1121 aggregate ? NULL : db_sql_normal_function,
1122 aggregate ? db_sql_normal_function : NULL,
1123 aggregate ? db_sql_finalize_function : NULL
1124 );
1125
1126 if (result == SQLITE_OK) {
1127 /* safety measures for userdata field to be present in the stack */
1128 lua_settop(L, 5 + aggregate);
1129
1130 /* save registered function in db function list */
1131 func->db = db;
1132 func->aggregate = aggregate;
1133 func->next = db->func;
1134 db->func = func;
1135
1136 /* save the setp/normal function callback */
1137 lua_pushvalue(L, 4);
1139 /* save user data */
1140 lua_pushvalue(L, 5+aggregate);
1141 func->udata = luaL_ref(L, LUA_REGISTRYINDEX);
1142
1143 if (aggregate) {
1144 lua_pushvalue(L, 5);
1146 }
1147 else
1148 func->fn_finalize = LUA_NOREF;
1149 }
1150 else {
1151 /* free allocated memory */
1152 free(func);
1153 }
1154
1155 lua_pushboolean(L, result == SQLITE_OK ? 1 : 0);
1156 return 1;
1157}
1158
1160 return db_register_function(L, 0);
1161}
1162
1164 return db_register_function(L, 1);
1165}
1166
1167/* create_collation; contributed by Thomas Lauer
1168*/
1169
1170typedef struct {
1172 int ref;
1173} scc;
1174
1175static int collwrapper(scc *co,int l1,const void *p1,
1176 int l2,const void *p2) {
1177 int res=0;
1178 lua_State *L=co->L;
1180 lua_pushlstring(L,p1,l1);
1181 lua_pushlstring(L,p2,l2);
1182 if (lua_pcall(L,2,1,0)==0) res=(int)lua_tonumber(L,-1);
1183 lua_pop(L,1);
1184 return res;
1185}
1186
1187static void collfree(scc *co) {
1188 if (co) {
1190 free(co);
1191 }
1192}
1193
1195 sdb *db=lsqlite_checkdb(L,1);
1196 const char *collname=luaL_checkstring(L,2);
1197 scc *co=NULL;
1198 int (*collfunc)(scc *,int,const void *,int,const void *)=NULL;
1199 lua_settop(L,3); /* default args to nil, and exclude extras */
1200 if (lua_isfunction(L,3)) collfunc=collwrapper;
1201 else if (!lua_isnil(L,3))
1202 luaL_error(L,"create_collation: function or nil expected");
1203 if (collfunc != NULL) {
1204 co=(scc *)malloc(sizeof(scc)); /* userdata is a no-no as it
1205 will be garbage-collected */
1206 if (co) {
1207 co->L=L;
1208 /* lua_settop(L,3) above means we don't need: lua_pushvalue(L,3); */
1210 }
1211 else luaL_error(L,"create_collation: could not allocate callback");
1212 }
1214 (void *)co,
1215 (int(*)(void*,int,const void*,int,const void*))collfunc,
1216 (void(*)(void*))collfree);
1217 return 0;
1218}
1219
1220/* Thanks to Wolfgang Oertl...
1221*/
1223 sdb *db=lsqlite_checkdb(L,1);
1224 const char *extname=luaL_optstring(L,2,NULL);
1225 const char *entrypoint=luaL_optstring(L,3,NULL);
1226 int result;
1227 char *errmsg = NULL;
1228
1229 if (extname == NULL) {
1230 result = sqlite3_enable_load_extension(db->db,0); /* disable extension loading */
1231 }
1232 else {
1233 sqlite3_enable_load_extension(db->db,1); /* enable extension loading */
1234 result = sqlite3_load_extension(db->db,extname,entrypoint,&errmsg);
1235 }
1236
1237 if (result == SQLITE_OK) {
1238 lua_pushboolean(L,1);
1239 return 1;
1240 }
1241
1242 lua_pushboolean(L,0); /* so, assert(load_extension(...)) works */
1243 lua_pushstring(L,errmsg);
1244 sqlite3_free(errmsg);
1245 return 2;
1246}
1247
1248/*
1249** trace callback:
1250** Params: database, callback function, userdata
1251**
1252** callback function:
1253** Params: userdata, sql
1254*/
1255static void db_trace_callback(void *user, const char *sql) {
1256 sdb *db = (sdb*)user;
1257 lua_State *L = db->L;
1258 int top = lua_gettop(L);
1259
1260 /* setup lua callback call */
1261 lua_rawgeti(L, LUA_REGISTRYINDEX, db->trace_cb); /* get callback */
1262 lua_rawgeti(L, LUA_REGISTRYINDEX, db->trace_udata); /* get callback user data */
1263 lua_pushstring(L, sql); /* traced sql statement */
1264
1265 /* call lua function */
1266 lua_pcall(L, 2, 0, 0);
1267 /* ignore any error generated by this function */
1268
1269 lua_settop(L, top);
1270}
1271
1272static int db_trace(lua_State *L) {
1273 sdb *db = lsqlite_checkdb(L, 1);
1274
1275 if (lua_gettop(L) < 2 || lua_isnil(L, 2)) {
1278
1279 db->trace_cb =
1280 db->trace_udata = LUA_NOREF;
1281
1282 /* clear trace handler */
1283 sqlite3_trace(db->db, NULL, NULL);
1284 }
1285 else {
1287
1288 /* make sure we have an userdata field (even if nil) */
1289 lua_settop(L, 3);
1290
1293
1296
1297 /* set trace handler */
1299 }
1300
1301 return 0;
1302}
1303
1304#if !defined(LSQLITE_OMIT_UPDATE_HOOK) || !LSQLITE_OMIT_UPDATE_HOOK
1305
1306/*
1307** update_hook callback:
1308** Params: database, callback function, userdata
1309**
1310** callback function:
1311** Params: userdata, {one of SQLITE_INSERT, SQLITE_DELETE, or SQLITE_UPDATE},
1312** database name, table name (containing the affected row), rowid of the row
1313*/
1314static void db_update_hook_callback(void *user, int op, char const *dbname, char const *tblname, sqlite3_int64 rowid) {
1315 sdb *db = (sdb*)user;
1316 lua_State *L = db->L;
1317 int top = lua_gettop(L);
1318 lua_Number n;
1319
1320 /* setup lua callback call */
1321 lua_rawgeti(L, LUA_REGISTRYINDEX, db->update_hook_cb); /* get callback */
1322 lua_rawgeti(L, LUA_REGISTRYINDEX, db->update_hook_udata); /* get callback user data */
1323 lua_pushinteger(L, op);
1324 lua_pushstring(L, dbname); /* update_hook database name */
1325 lua_pushstring(L, tblname); /* update_hook database name */
1326
1327 PUSH_INT64(L, rowid, lua_pushfstring(L, "%ll", rowid));
1328
1329 /* call lua function */
1330 lua_pcall(L, 5, 0, 0);
1331 /* ignore any error generated by this function */
1332
1333 lua_settop(L, top);
1334}
1335
1337 sdb *db = lsqlite_checkdb(L, 1);
1338
1339 if (lua_gettop(L) < 2 || lua_isnil(L, 2)) {
1342
1343 db->update_hook_cb =
1345
1346 /* clear update_hook handler */
1348 }
1349 else {
1351
1352 /* make sure we have an userdata field (even if nil) */
1353 lua_settop(L, 3);
1354
1357
1360
1361 /* set update_hook handler */
1363 }
1364
1365 return 0;
1366}
1367
1368/*
1369** commit_hook callback:
1370** Params: database, callback function, userdata
1371**
1372** callback function:
1373** Params: userdata
1374** Returned value: Return false or nil to continue the COMMIT operation normally.
1375** return true (non false, non nil), then the COMMIT is converted into a ROLLBACK.
1376*/
1377static int db_commit_hook_callback(void *user) {
1378 sdb *db = (sdb*)user;
1379 lua_State *L = db->L;
1380 int top = lua_gettop(L);
1381 int rollback = 0;
1382
1383 /* setup lua callback call */
1384 lua_rawgeti(L, LUA_REGISTRYINDEX, db->commit_hook_cb); /* get callback */
1385 lua_rawgeti(L, LUA_REGISTRYINDEX, db->commit_hook_udata); /* get callback user data */
1386
1387 /* call lua function */
1388 if (!lua_pcall(L, 1, 1, 0))
1389 rollback = lua_toboolean(L, -1); /* use result if there was no error */
1390
1391 lua_settop(L, top);
1392 return rollback;
1393}
1394
1396 sdb *db = lsqlite_checkdb(L, 1);
1397
1398 if (lua_gettop(L) < 2 || lua_isnil(L, 2)) {
1401
1402 db->commit_hook_cb =
1404
1405 /* clear commit_hook handler */
1407 }
1408 else {
1410
1411 /* make sure we have an userdata field (even if nil) */
1412 lua_settop(L, 3);
1413
1416
1419
1420 /* set commit_hook handler */
1422 }
1423
1424 return 0;
1425}
1426
1427/*
1428** rollback hook callback:
1429** Params: database, callback function, userdata
1430**
1431** callback function:
1432** Params: userdata
1433*/
1434static void db_rollback_hook_callback(void *user) {
1435 sdb *db = (sdb*)user;
1436 lua_State *L = db->L;
1437 int top = lua_gettop(L);
1438
1439 /* setup lua callback call */
1440 lua_rawgeti(L, LUA_REGISTRYINDEX, db->rollback_hook_cb); /* get callback */
1441 lua_rawgeti(L, LUA_REGISTRYINDEX, db->rollback_hook_udata); /* get callback user data */
1442
1443 /* call lua function */
1444 lua_pcall(L, 1, 0, 0);
1445 /* ignore any error generated by this function */
1446
1447 lua_settop(L, top);
1448}
1449
1451 sdb *db = lsqlite_checkdb(L, 1);
1452
1453 if (lua_gettop(L) < 2 || lua_isnil(L, 2)) {
1456
1457 db->rollback_hook_cb =
1459
1460 /* clear rollback_hook handler */
1462 }
1463 else {
1465
1466 /* make sure we have an userdata field (even if nil) */
1467 lua_settop(L, 3);
1468
1471
1474
1475 /* set rollback_hook handler */
1477 }
1478
1479 return 0;
1480}
1481
1482#endif /* #if !defined(LSQLITE_OMIT_UPDATE_HOOK) || !LSQLITE_OMIT_UPDATE_HOOK */
1483
1484#if !defined(SQLITE_OMIT_PROGRESS_CALLBACK) || !SQLITE_OMIT_PROGRESS_CALLBACK
1485
1486/*
1487** progress handler:
1488** Params: database, number of opcodes, callback function, userdata
1489**
1490** callback function:
1491** Params: userdata
1492** returns: 0 to return immediatly and return SQLITE_ABORT, non-zero to continue
1493*/
1494static int db_progress_callback(void *user) {
1495 int result = 1; /* abort by default */
1496 sdb *db = (sdb*)user;
1497 lua_State *L = db->L;
1498 int top = lua_gettop(L);
1499
1502
1503 /* call lua function */
1504 if (!lua_pcall(L, 1, 1, 0))
1505 result = lua_toboolean(L, -1);
1506
1507 lua_settop(L, top);
1508 return result;
1509}
1510
1512 sdb *db = lsqlite_checkdb(L, 1);
1513
1514 if (lua_gettop(L) < 2 || lua_isnil(L, 2)) {
1517
1518 db->progress_cb =
1520
1521 /* clear busy handler */
1523 }
1524 else {
1525 int nop = luaL_checkint(L, 2); /* number of opcodes */
1527
1528 /* make sure we have an userdata field (even if nil) */
1529 lua_settop(L, 4);
1530
1533
1536
1537 /* set progress callback */
1539 }
1540
1541 return 0;
1542}
1543
1544#else /* #if !defined(SQLITE_OMIT_PROGRESS_CALLBACK) || !SQLITE_OMIT_PROGRESS_CALLBACK */
1545
1546static int db_progress_handler(lua_State *L) {
1547 lua_pushliteral(L, "progress callback support disabled at compile time");
1548 lua_error(L);
1549 return 0;
1550}
1551
1552#endif /* #if !defined(SQLITE_OMIT_PROGRESS_CALLBACK) || !SQLITE_OMIT_PROGRESS_CALLBACK */
1553
1554/* Online Backup API */
1555#if 0
1557 sqlite3 *pDest, /* Destination database handle */
1558 const char *zDestName, /* Destination database name */
1559 sqlite3 *pSource, /* Source database handle */
1560 const char *zSourceName /* Source database name */
1561);
1562int sqlite3_backup_step(sqlite3_backup *p, int nPage);
1566#endif
1567
1568struct sdb_bu {
1569 sqlite3_backup *bu; /* backup structure */
1570};
1571
1572static int cleanupbu(lua_State *L, sdb_bu *sbu) {
1573
1574 if (!sbu->bu) return 0; /* already finished */
1575
1576 /* remove table from registry */
1577 lua_pushlightuserdata(L, sbu->bu);
1578 lua_pushnil(L);
1580
1582 sbu->bu = NULL;
1583
1584 return 1;
1585}
1586
1588
1589 sdb *target_db = lsqlite_checkdb(L, 1);
1590 const char *target_nm = luaL_checkstring(L, 2);
1591 sdb *source_db = lsqlite_checkdb(L, 3);
1592 const char *source_nm = luaL_checkstring(L, 4);
1593
1594 sqlite3_backup *bu = sqlite3_backup_init(target_db->db, target_nm, source_db->db, source_nm);
1595
1596 if (NULL != bu) {
1597 sdb_bu *sbu = (sdb_bu*)lua_newuserdata(L, sizeof(sdb_bu));
1598
1600 lua_setmetatable(L, -2); /* set metatable */
1601 sbu->bu = bu;
1602
1603 /* create table from registry */
1604 /* to prevent referenced databases from being garbage collected while bu is live */
1605 lua_pushlightuserdata(L, bu);
1606 lua_createtable(L, 2, 0);
1607 /* add source and target dbs to table at indices 1 and 2 */
1608 lua_pushvalue(L, 1); /* target db */
1609 lua_rawseti(L, -2, 1);
1610 lua_pushvalue(L, 3); /* source db */
1611 lua_rawseti(L, -2, 2);
1612 /* put table in registry with key lightuserdata bu */
1614
1615 return 1;
1616 }
1617 else {
1618 return 0;
1619 }
1620}
1621
1624 if (sbu == NULL) luaL_typerror(L, index, "sqlite database backup");
1625 return sbu;
1626}
1627
1629 sdb_bu *sbu = lsqlite_getbu(L, index);
1630 if (sbu->bu == NULL) luaL_argerror(L, index, "attempt to use closed sqlite database backup");
1631 return sbu;
1632}
1633
1634static int dbbu_gc(lua_State *L) {
1635 sdb_bu *sbu = lsqlite_getbu(L, 1);
1636 if (sbu->bu != NULL) {
1637 cleanupbu(L, sbu);
1638 lua_pop(L, 1);
1639 }
1640 /* else ignore if already finished */
1641 return 0;
1642}
1643
1644static int dbbu_step(lua_State *L) {
1645 sdb_bu *sbu = lsqlite_checkbu(L, 1);
1646 int nPage = luaL_checkint(L, 2);
1647 lua_pushinteger(L, sqlite3_backup_step(sbu->bu, nPage));
1648 return 1;
1649}
1650
1652 sdb_bu *sbu = lsqlite_checkbu(L, 1);
1654 return 1;
1655}
1656
1658 sdb_bu *sbu = lsqlite_checkbu(L, 1);
1660 return 1;
1661}
1662
1663static int dbbu_finish(lua_State *L) {
1664 sdb_bu *sbu = lsqlite_checkbu(L, 1);
1665 return cleanupbu(L, sbu);
1666}
1667
1668/* end of Online Backup API */
1669
1670/*
1671** busy handler:
1672** Params: database, callback function, userdata
1673**
1674** callback function:
1675** Params: userdata, number of tries
1676** returns: 0 to return immediatly and return SQLITE_BUSY, non-zero to try again
1677*/
1678static int db_busy_callback(void *user, int tries) {
1679 int retry = 0; /* abort by default */
1680 sdb *db = (sdb*)user;
1681 lua_State *L = db->L;
1682 int top = lua_gettop(L);
1683
1686 lua_pushinteger(L, tries);
1687
1688 /* call lua function */
1689 if (!lua_pcall(L, 2, 1, 0))
1690 retry = lua_toboolean(L, -1);
1691
1692 lua_settop(L, top);
1693 return retry;
1694}
1695
1697 sdb *db = lsqlite_checkdb(L, 1);
1698
1699 if (lua_gettop(L) < 2 || lua_isnil(L, 2)) {
1702
1703 db->busy_cb =
1704 db->busy_udata = LUA_NOREF;
1705
1706 /* clear busy handler */
1708 }
1709 else {
1711 /* make sure we have an userdata field (even if nil) */
1712 lua_settop(L, 3);
1713
1716
1719
1720 /* set busy handler */
1722 }
1723
1724 return 0;
1725}
1726
1728 sdb *db = lsqlite_checkdb(L, 1);
1729 int timeout = luaL_checkint(L, 2);
1730 sqlite3_busy_timeout(db->db, timeout);
1731
1732 /* if there was a timeout callback registered, it is now
1733 ** invalid/useless. free any references we may have */
1736 db->busy_cb =
1737 db->busy_udata = LUA_NOREF;
1738
1739 return 0;
1740}
1741
1742/*
1743** Params: db, sql, callback, user
1744** returns: code [, errmsg]
1745**
1746** Callback:
1747** Params: user, number of columns, values, names
1748** Returns: 0 to continue, other value will cause abort
1749*/
1750static int db_exec_callback(void* user, int columns, char **data, char **names) {
1751 int result = SQLITE_ABORT; /* abort by default */
1752 lua_State *L = (lua_State*)user;
1753 int n;
1754
1755 int top = lua_gettop(L);
1756
1757 lua_pushvalue(L, 3); /* function to call */
1758 lua_pushvalue(L, 4); /* user data */
1759 lua_pushinteger(L, columns); /* total number of rows in result */
1760
1761 /* column values */
1762 lua_pushvalue(L, 6);
1763 for (n = 0; n < columns;) {
1764 lua_pushstring(L, data[n++]);
1765 lua_rawseti(L, -2, n);
1766 }
1767
1768 /* columns names */
1769 lua_pushvalue(L, 5);
1770 if (lua_isnil(L, -1)) {
1771 lua_pop(L, 1);
1772 lua_createtable(L, columns, 0);
1773 lua_pushvalue(L, -1);
1774 lua_replace(L, 5);
1775 for (n = 0; n < columns;) {
1776 lua_pushstring(L, names[n++]);
1777 lua_rawseti(L, -2, n);
1778 }
1779 }
1780
1781 /* call lua function */
1782 if (!lua_pcall(L, 4, 1, 0)) {
1783
1784#if LUA_VERSION_NUM > 502
1785 if (lua_isinteger(L, -1))
1786 result = lua_tointeger(L, -1);
1787 else
1788#endif
1789 if (lua_isnumber(L, -1))
1790 result = (int)lua_tonumber(L, -1);
1791 }
1792
1793 lua_settop(L, top);
1794 return result;
1795}
1796
1797static int db_exec(lua_State *L) {
1798 sdb *db = lsqlite_checkdb(L, 1);
1799 const char *sql = luaL_checkstring(L, 2);
1800 int result;
1801
1802 if (!lua_isnoneornil(L, 3)) {
1803 /* stack:
1804 ** 3: callback function
1805 ** 4: userdata
1806 ** 5: column names
1807 ** 6: reusable column values
1808 */
1810 lua_settop(L, 4); /* 'trap' userdata - nil extra parameters */
1811 lua_pushnil(L); /* column names not known at this point */
1812 lua_newtable(L); /* column values table */
1813
1814 result = sqlite3_exec(db->db, sql, db_exec_callback, L, NULL);
1815 }
1816 else {
1817 /* no callbacks */
1818 result = sqlite3_exec(db->db, sql, NULL, NULL, NULL);
1819 }
1820
1821 lua_pushinteger(L, result);
1822 return 1;
1823}
1824
1825/*
1826** Params: db, sql
1827** returns: code, compiled length or error message
1828*/
1829static int db_prepare(lua_State *L) {
1830 sdb *db = lsqlite_checkdb(L, 1);
1831 const char *sql = luaL_checkstring(L, 2);
1832 int sql_len = lua_strlen(L, 2);
1833 const char *sqltail;
1834 sdb_vm *svm;
1835 lua_settop(L,2); /* db,sql is on top of stack for call to newvm */
1836 svm = newvm(L, db);
1837
1838 if (sqlite3_prepare_v2(db->db, sql, sql_len, &svm->vm, &sqltail) != SQLITE_OK) {
1839 lua_pushnil(L);
1841 if (cleanupvm(L, svm) == 1)
1842 lua_pop(L, 1); /* this should not happen since sqlite3_prepare_v2 will not set ->vm on error */
1843 return 2;
1844 }
1845
1846 /* vm already in the stack */
1847 lua_pushstring(L, sqltail);
1848 return 2;
1849}
1850
1851static int db_do_next_row(lua_State *L, int packed) {
1852 int result;
1853 sdb_vm *svm = lsqlite_checkvm(L, 1);
1854 sqlite3_stmt *vm;
1855 int columns;
1856 int i;
1857
1858 result = stepvm(L, svm);
1859 vm = svm->vm; /* stepvm may change svm->vm if re-prepare is needed */
1860 svm->has_values = result == SQLITE_ROW ? 1 : 0;
1861 svm->columns = columns = sqlite3_data_count(vm);
1862
1863 if (result == SQLITE_ROW) {
1864 if (packed) {
1865 if (packed == 1) {
1866 lua_createtable(L, columns, 0);
1867 for (i = 0; i < columns;) {
1868 vm_push_column(L, vm, i);
1869 lua_rawseti(L, -2, ++i);
1870 }
1871 }
1872 else {
1873 lua_createtable(L, 0, columns);
1874 for (i = 0; i < columns; ++i) {
1876 vm_push_column(L, vm, i);
1877 lua_rawset(L, -3);
1878 }
1879 }
1880 return 1;
1881 }
1882 else {
1883 lua_checkstack(L, columns);
1884 for (i = 0; i < columns; ++i)
1885 vm_push_column(L, vm, i);
1886 return svm->columns;
1887 }
1888 }
1889
1890 if (svm->temp) {
1891 /* finalize and check for errors */
1892 result = sqlite3_finalize(vm);
1893 svm->vm = NULL;
1894 cleanupvm(L, svm);
1895 }
1896 else if (result == SQLITE_DONE) {
1897 result = sqlite3_reset(vm);
1898 }
1899
1900 if (result != SQLITE_OK) {
1902 lua_error(L);
1903 }
1904 return 0;
1905}
1906
1907static int db_next_row(lua_State *L) {
1908 return db_do_next_row(L, 0);
1909}
1910
1912 return db_do_next_row(L, 1);
1913}
1914
1916 return db_do_next_row(L, 2);
1917}
1918
1919static int dbvm_do_rows(lua_State *L, int(*f)(lua_State *)) {
1920 /* sdb_vm *svm = */
1921 lsqlite_checkvm(L, 1);
1922 lua_pushvalue(L,1);
1923 lua_pushcfunction(L, f);
1924 lua_insert(L, -2);
1925 return 2;
1926}
1927
1928static int dbvm_rows(lua_State *L) {
1930}
1931
1932static int dbvm_nrows(lua_State *L) {
1934}
1935
1936static int dbvm_urows(lua_State *L) {
1937 return dbvm_do_rows(L, db_next_row);
1938}
1939
1940static int db_do_rows(lua_State *L, int(*f)(lua_State *)) {
1941 sdb *db = lsqlite_checkdb(L, 1);
1942 const char *sql = luaL_checkstring(L, 2);
1943 sdb_vm *svm;
1944 lua_settop(L,2); /* db,sql is on top of stack for call to newvm */
1945 svm = newvm(L, db);
1946 svm->temp = 1;
1947
1948 if (sqlite3_prepare_v2(db->db, sql, -1, &svm->vm, NULL) != SQLITE_OK) {
1950 if (cleanupvm(L, svm) == 1)
1951 lua_pop(L, 1); /* this should not happen since sqlite3_prepare_v2 will not set ->vm on error */
1952 lua_error(L);
1953 }
1954
1955 lua_pushcfunction(L, f);
1956 lua_insert(L, -2);
1957 return 2;
1958}
1959
1960static int db_rows(lua_State *L) {
1961 return db_do_rows(L, db_next_packed_row);
1962}
1963
1964static int db_nrows(lua_State *L) {
1965 return db_do_rows(L, db_next_named_row);
1966}
1967
1968/* unpacked version of db:rows */
1969static int db_urows(lua_State *L) {
1970 return db_do_rows(L, db_next_row);
1971}
1972
1973static int db_tostring(lua_State *L) {
1974 char buff[32];
1975 sdb *db = lsqlite_getdb(L, 1);
1976 if (db->db == NULL)
1977 strcpy(buff, "closed");
1978 else
1979 sprintf(buff, "%p", lua_touserdata(L, 1));
1980 lua_pushfstring(L, "sqlite database (%s)", buff);
1981 return 1;
1982}
1983
1984static int db_close(lua_State *L) {
1985 sdb *db = lsqlite_checkdb(L, 1);
1986 lua_pushinteger(L, cleanupdb(L, db));
1987 return 1;
1988}
1989
1990static int db_close_vm(lua_State *L) {
1991 sdb *db = lsqlite_checkdb(L, 1);
1992 /* cleanup temporary only tables? */
1993 int temp = lua_toboolean(L, 2);
1994
1995 /* free associated virtual machines */
1996 lua_pushlightuserdata(L, db);
1998
1999 /* close all used handles */
2000 lua_pushnil(L);
2001 while (lua_next(L, -2)) {
2002 sdb_vm *svm = lua_touserdata(L, -2); /* key: vm; val: sql text */
2003
2004 if ((!temp || svm->temp) && svm->vm)
2005 {
2006 sqlite3_finalize(svm->vm);
2007 svm->vm = NULL;
2008 }
2009
2010 /* leave key in the stack */
2011 lua_pop(L, 1);
2012 }
2013 return 0;
2014}
2015
2016/* From: Wolfgang Oertl
2017When using lsqlite3 in a multithreaded environment, each thread has a separate Lua
2018environment, but full userdata structures can't be passed from one thread to another.
2019This is possible with lightuserdata, however. See: lsqlite_open_ptr().
2020*/
2021static int db_get_ptr(lua_State *L) {
2022 sdb *db = lsqlite_checkdb(L, 1);
2023 lua_pushlightuserdata(L, db->db);
2024 return 1;
2025}
2026
2027static int db_gc(lua_State *L) {
2028 sdb *db = lsqlite_getdb(L, 1);
2029 if (db->db != NULL) /* ignore closed databases */
2030 cleanupdb(L, db);
2031 return 0;
2032}
2033
2034/*
2035** =======================================================
2036** General library functions
2037** =======================================================
2038*/
2039
2042 return 1;
2043}
2044
2046 const char *sql = luaL_checkstring(L, 1);
2048 return 1;
2049}
2050
2051#ifndef _WIN32
2053 const char *oldtemp = sqlite3_temp_directory;
2054
2055 if (!lua_isnone(L, 1)) {
2056 const char *temp = luaL_optstring(L, 1, NULL);
2059 }
2060 if (temp) {
2062 }
2063 else {
2065 }
2066 }
2067 lua_pushstring(L, oldtemp);
2068 return 1;
2069}
2070#endif
2071
2072static int lsqlite_do_open(lua_State *L, const char *filename, int flags) {
2073 sdb *db = newdb(L); /* create and leave in stack */
2074
2075 if (SQLITE3_OPEN(filename, &db->db, flags) == SQLITE_OK) {
2076 /* database handle already in the stack - return it */
2077 return 1;
2078 }
2079
2080 /* failed to open database */
2081 lua_pushnil(L); /* push nil */
2083 lua_pushstring(L, sqlite3_errmsg(db->db)); /* push error message */
2084
2085 /* clean things up */
2086 cleanupdb(L, db);
2087
2088 /* return */
2089 return 3;
2090}
2091
2092static int lsqlite_open(lua_State *L) {
2093 const char *filename = luaL_checkstring(L, 1);
2095 return lsqlite_do_open(L, filename, flags);
2096}
2097
2100}
2101
2102/* From: Wolfgang Oertl
2103When using lsqlite3 in a multithreaded environment, each thread has a separate Lua
2104environment, but full userdata structures can't be passed from one thread to another.
2105This is possible with lightuserdata, however. See: db_get_ptr().
2106*/
2108 sqlite3 *db_ptr;
2109 sdb *db;
2110 int rc;
2111
2113 db_ptr = lua_touserdata(L, 1);
2114 /* This is the only API function that runs sqlite3SafetyCheck regardless of
2115 * SQLITE_ENABLE_API_ARMOR and does almost nothing (without an SQL
2116 * statement) */
2117 rc = sqlite3_exec(db_ptr, NULL, NULL, NULL, NULL);
2118 if (rc != SQLITE_OK)
2119 luaL_argerror(L, 1, "not a valid SQLite3 pointer");
2120
2121 db = newdb(L); /* create and leave in stack */
2122 db->db = db_ptr;
2123 return 1;
2124}
2125
2127 lua_pushliteral(L, "attempt to change readonly table");
2128 lua_error(L);
2129 return 0;
2130}
2131
2132#ifndef LSQLITE_VERSION
2133/* should be defined in rockspec, but just in case... */
2134#define LSQLITE_VERSION "unknown"
2135#endif
2136
2137/* Version number of this library
2138*/
2141 return 1;
2142}
2143
2144/*
2145** =======================================================
2146** Register functions
2147** =======================================================
2148*/
2149
2150#define SC(s) { #s, SQLITE_ ## s },
2151#define LSC(s) { #s, LSQLITE_ ## s },
2152
2153static const struct {
2154 const char* name;
2156} sqlite_constants[] = {
2157 /* error codes */
2158 SC(OK) SC(ERROR) SC(INTERNAL) SC(PERM)
2159 SC(ABORT) SC(BUSY) SC(LOCKED) SC(NOMEM)
2160 SC(READONLY) SC(INTERRUPT) SC(IOERR) SC(CORRUPT)
2161 SC(NOTFOUND) SC(FULL) SC(CANTOPEN) SC(PROTOCOL)
2162 SC(EMPTY) SC(SCHEMA) SC(TOOBIG) SC(CONSTRAINT)
2163 SC(MISMATCH) SC(MISUSE) SC(NOLFS)
2164 SC(FORMAT) SC(NOTADB)
2165
2166 /* sqlite_step specific return values */
2167 SC(RANGE) SC(ROW) SC(DONE)
2168
2169 /* column types */
2170 SC(INTEGER) SC(FLOAT) SC(TEXT) SC(BLOB)
2171 SC(NULL)
2172
2173 /* Authorizer Action Codes */
2174 SC(CREATE_INDEX )
2175 SC(CREATE_TABLE )
2176 SC(CREATE_TEMP_INDEX )
2177 SC(CREATE_TEMP_TABLE )
2178 SC(CREATE_TEMP_TRIGGER)
2179 SC(CREATE_TEMP_VIEW )
2180 SC(CREATE_TRIGGER )
2181 SC(CREATE_VIEW )
2182 SC(DELETE )
2183 SC(DROP_INDEX )
2184 SC(DROP_TABLE )
2185 SC(DROP_TEMP_INDEX )
2186 SC(DROP_TEMP_TABLE )
2187 SC(DROP_TEMP_TRIGGER )
2188 SC(DROP_TEMP_VIEW )
2189 SC(DROP_TRIGGER )
2190 SC(DROP_VIEW )
2191 SC(INSERT )
2192 SC(PRAGMA )
2193 SC(READ )
2194 SC(SELECT )
2195 SC(TRANSACTION )
2196 SC(UPDATE )
2197 SC(ATTACH )
2198 SC(DETACH )
2199 SC(ALTER_TABLE )
2200 SC(REINDEX )
2201 SC(ANALYZE )
2202 SC(CREATE_VTABLE )
2203 SC(DROP_VTABLE )
2204 SC(FUNCTION )
2205 SC(SAVEPOINT )
2206
2207 /* file open flags */
2208 SC(OPEN_READONLY)
2209 SC(OPEN_READWRITE)
2210 SC(OPEN_CREATE)
2211 SC(OPEN_URI)
2212 SC(OPEN_MEMORY)
2213 SC(OPEN_NOMUTEX)
2214 SC(OPEN_FULLMUTEX)
2215 SC(OPEN_SHAREDCACHE)
2216 SC(OPEN_PRIVATECACHE)
2217
2218 /* terminator */
2219 { NULL, 0 }
2221
2222/* ======================================================= */
2223
2224static const luaL_Reg dblib[] = {
2225 {"isopen", db_isopen },
2226 {"last_insert_rowid", db_last_insert_rowid },
2227 {"changes", db_changes },
2228 {"total_changes", db_total_changes },
2229 {"errcode", db_errcode },
2230 {"error_code", db_errcode },
2231 {"errmsg", db_errmsg },
2232 {"error_message", db_errmsg },
2233 {"interrupt", db_interrupt },
2234 {"db_filename", db_db_filename },
2235
2236 {"create_function", db_create_function },
2237 {"create_aggregate", db_create_aggregate },
2238 {"create_collation", db_create_collation },
2239 {"load_extension", db_load_extension },
2240
2241 {"trace", db_trace },
2242 {"progress_handler", db_progress_handler },
2243 {"busy_timeout", db_busy_timeout },
2244 {"busy_handler", db_busy_handler },
2245#if !defined(LSQLITE_OMIT_UPDATE_HOOK) || !LSQLITE_OMIT_UPDATE_HOOK
2246 {"update_hook", db_update_hook },
2247 {"commit_hook", db_commit_hook },
2248 {"rollback_hook", db_rollback_hook },
2249#endif
2250
2251 {"prepare", db_prepare },
2252 {"rows", db_rows },
2253 {"urows", db_urows },
2254 {"nrows", db_nrows },
2255
2256 {"exec", db_exec },
2257 {"execute", db_exec },
2258 {"close", db_close },
2259 {"close_vm", db_close_vm },
2260 {"get_ptr", db_get_ptr },
2261
2262 {"__tostring", db_tostring },
2263 {"__gc", db_gc },
2264
2265 {NULL, NULL}
2266};
2267
2268static const luaL_Reg vmlib[] = {
2269 {"isopen", dbvm_isopen },
2270
2271 {"step", dbvm_step },
2272 {"reset", dbvm_reset },
2273 {"finalize", dbvm_finalize },
2274
2275 {"columns", dbvm_columns },
2276
2277 {"bind", dbvm_bind },
2278 {"bind_values", dbvm_bind_values },
2279 {"bind_names", dbvm_bind_names },
2280 {"bind_blob", dbvm_bind_blob },
2281 {"bind_parameter_count",dbvm_bind_parameter_count},
2282 {"bind_parameter_name", dbvm_bind_parameter_name},
2283
2284 {"get_value", dbvm_get_value },
2285 {"get_values", dbvm_get_values },
2286 {"get_name", dbvm_get_name },
2287 {"get_names", dbvm_get_names },
2288 {"get_type", dbvm_get_type },
2289 {"get_types", dbvm_get_types },
2290 {"get_uvalues", dbvm_get_uvalues },
2291 {"get_unames", dbvm_get_unames },
2292 {"get_utypes", dbvm_get_utypes },
2293
2294 {"get_named_values", dbvm_get_named_values },
2295 {"get_named_types", dbvm_get_named_types },
2296
2297 {"rows", dbvm_rows },
2298 {"urows", dbvm_urows },
2299 {"nrows", dbvm_nrows },
2300
2301 {"last_insert_rowid", dbvm_last_insert_rowid },
2302
2303 /* compatibility names (added by request) */
2304 {"idata", dbvm_get_values },
2305 {"inames", dbvm_get_names },
2306 {"itypes", dbvm_get_types },
2307 {"data", dbvm_get_named_values },
2308 {"type", dbvm_get_named_types },
2309
2310 {"__tostring", dbvm_tostring },
2311 {"__gc", dbvm_gc },
2312
2313 { NULL, NULL }
2314};
2315
2316static const luaL_Reg ctxlib[] = {
2317 {"user_data", lcontext_user_data },
2318
2319 {"get_aggregate_data", lcontext_get_aggregate_context },
2320 {"set_aggregate_data", lcontext_set_aggregate_context },
2321 {"aggregate_count", lcontext_aggregate_count },
2322
2323 {"result", lcontext_result },
2324 {"result_null", lcontext_result_null },
2325 {"result_number", lcontext_result_double },
2326 {"result_double", lcontext_result_double },
2327 {"result_int", lcontext_result_int },
2328 {"result_text", lcontext_result_text },
2329 {"result_blob", lcontext_result_blob },
2330 {"result_error", lcontext_result_error },
2331
2332 {"__tostring", lcontext_tostring },
2333 {NULL, NULL}
2334};
2335
2336static const luaL_Reg dbbulib[] = {
2337
2338 {"step", dbbu_step },
2339 {"remaining", dbbu_remaining },
2340 {"pagecount", dbbu_pagecount },
2341 {"finish", dbbu_finish },
2342
2343// {"__tostring", dbbu_tostring },
2344 {"__gc", dbbu_gc },
2345 {NULL, NULL}
2346};
2347
2348static const luaL_Reg sqlitelib[] = {
2349 {"lversion", lsqlite_lversion },
2350 {"version", lsqlite_version },
2351 {"complete", lsqlite_complete },
2352#ifndef _WIN32
2353 {"temp_directory", lsqlite_temp_directory },
2354#endif
2355 {"open", lsqlite_open },
2356 {"open_memory", lsqlite_open_memory },
2357 {"open_ptr", lsqlite_open_ptr },
2358
2359 {"backup_init", lsqlite_backup_init },
2360
2361 {"__newindex", lsqlite_newindex },
2362 {NULL, NULL}
2363};
2364
2365static void create_meta(lua_State *L, const char *name, const luaL_Reg *lib) {
2367 lua_pushstring(L, "__index");
2368 lua_pushvalue(L, -2); /* push metatable */
2369 lua_rawset(L, -3); /* metatable.__index = metatable */
2370
2371 /* register metatable functions */
2372 luaL_openlib(L, NULL, lib, 0);
2373
2374 /* remove metatable from stack */
2375 lua_pop(L, 1);
2376}
2377
2380 luaL_setfuncs(L, sqlitelib, 0);
2381 return 1;
2382}
2383
2389
2392
2393 /* register global sqlite3 library */
2394 luaL_requiref(L, "sqlite3", luaopen_sqlitelib, 1);
2395
2396 {
2397 int i = 0;
2398 /* add constants to global table */
2399 while (sqlite_constants[i].name) {
2402 lua_rawset(L, -3);
2403 ++i;
2404 }
2405 }
2406
2407 /* set sqlite's metatable to itself - set as readonly (__newindex) */
2408 lua_pushvalue(L, -1);
2409 lua_setmetatable(L, -2);
2410
2411 return 1;
2412}
#define free
Definition civetweb.c:1542
#define malloc
Definition civetweb.c:1539
guint index
#define NULL
Definition gmacros.h:924
static int dbbu_step(lua_State *L)
Definition lsqlite3.c:1644
static void vm_push_column(lua_State *L, sqlite3_stmt *vm, int idx)
Definition lsqlite3.c:162
static int dbvm_bind_values(lua_State *L)
Definition lsqlite3.c:551
static int dbvm_gc(lua_State *L)
Definition lsqlite3.c:276
static int cleanupbu(lua_State *L, sdb_bu *sbu)
Definition lsqlite3.c:1572
static int dbbu_gc(lua_State *L)
Definition lsqlite3.c:1634
static int db_do_next_row(lua_State *L, int packed)
Definition lsqlite3.c:1851
static int db_db_filename(lua_State *L)
Definition lsqlite3.c:933
static int db_rows(lua_State *L)
Definition lsqlite3.c:1960
static int lsqlite_open(lua_State *L)
Definition lsqlite3.c:2092
static int cleanupvm(lua_State *L, sdb_vm *svm)
Definition lsqlite3.c:223
static int lcontext_tostring(lua_State *L)
Definition lsqlite3.c:760
static int dbbu_finish(lua_State *L)
Definition lsqlite3.c:1663
static int db_busy_timeout(lua_State *L)
Definition lsqlite3.c:1727
static int dbvm_bind_blob(lua_State *L)
Definition lsqlite3.c:541
static int dbvm_get_type(lua_State *L)
Definition lsqlite3.c:367
static void lcontext_check_aggregate(lua_State *L, lcontext *ctx)
Definition lsqlite3.c:771
static void db_update_hook_callback(void *user, int op, char const *dbname, char const *tblname, sqlite3_int64 rowid)
Definition lsqlite3.c:1314
static void db_rollback_hook_callback(void *user)
Definition lsqlite3.c:1434
static int db_prepare(lua_State *L)
Definition lsqlite3.c:1829
static const luaL_Reg vmlib[]
Definition lsqlite3.c:2268
static int db_rollback_hook(lua_State *L)
Definition lsqlite3.c:1450
static int dbvm_tostring(lua_State *L)
Definition lsqlite3.c:265
static int db_commit_hook_callback(void *user)
Definition lsqlite3.c:1377
static int db_register_function(lua_State *L, int aggregate)
Definition lsqlite3.c:1098
static void collfree(scc *co)
Definition lsqlite3.c:1187
static int db_next_row(lua_State *L)
Definition lsqlite3.c:1907
static int dbvm_last_insert_rowid(lua_State *L)
Definition lsqlite3.c:325
static const char * sqlite_meta
Definition lsqlite3.c:124
static lcontext * lsqlite_make_context(lua_State *L)
Definition lsqlite3.c:739
static int dbbu_remaining(lua_State *L)
Definition lsqlite3.c:1651
static int lsqlite_version(lua_State *L)
Definition lsqlite3.c:2040
static int db_create_aggregate(lua_State *L)
Definition lsqlite3.c:1163
static int dbvm_bind_index(lua_State *L, sqlite3_stmt *vm, int index, int lindex)
Definition lsqlite3.c:492
static int lsqlite_temp_directory(lua_State *L)
Definition lsqlite3.c:2052
static int dbvm_get_types(lua_State *L)
Definition lsqlite3.c:404
#define SQLITE3_OPEN(L, filename, flags)
Definition lsqlite3.c:69
static int db_next_packed_row(lua_State *L)
Definition lsqlite3.c:1911
static int lcontext_user_data(lua_State *L)
Definition lsqlite3.c:778
static void db_trace_callback(void *user, const char *sql)
Definition lsqlite3.c:1255
static int lcontext_result_text(lua_State *L)
Definition lsqlite3.c:875
static int db_progress_callback(void *user)
Definition lsqlite3.c:1494
static int lcontext_aggregate_count(lua_State *L)
Definition lsqlite3.c:801
static int dbvm_get_named_values(lua_State *L)
Definition lsqlite3.c:455
static void db_sql_normal_function(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition lsqlite3.c:983
static int db_nrows(lua_State *L)
Definition lsqlite3.c:1964
static void dbvm_check_contents(lua_State *L, sdb_vm *svm)
Definition lsqlite3.c:307
static int lsqlite_open_ptr(lua_State *L)
Definition lsqlite3.c:2107
static int lsqlite_backup_init(lua_State *L)
Definition lsqlite3.c:1587
static int lsqlite_newindex(lua_State *L)
Definition lsqlite3.c:2126
static sdb_bu * lsqlite_checkbu(lua_State *L, int index)
Definition lsqlite3.c:1628
static lcontext * lsqlite_getcontext(lua_State *L, int index)
Definition lsqlite3.c:748
static lcontext * lsqlite_checkcontext(lua_State *L, int index)
Definition lsqlite3.c:754
static int db_close(lua_State *L)
Definition lsqlite3.c:1984
static int lsqlite_lversion(lua_State *L)
Definition lsqlite3.c:2139
static sdb_vm * newvm(lua_State *L, sdb *db)
Definition lsqlite3.c:200
static int db_trace(lua_State *L)
Definition lsqlite3.c:1272
static int dbvm_get_uvalues(lua_State *L)
Definition lsqlite3.c:418
static int dbvm_step(lua_State *L)
Definition lsqlite3.c:283
static int db_progress_handler(lua_State *L)
Definition lsqlite3.c:1511
static int dbvm_bind_parameter_count(lua_State *L)
Definition lsqlite3.c:514
static int cleanupdb(lua_State *L, sdb *db)
Definition lsqlite3.c:654
#define SC(s)
Definition lsqlite3.c:2150
static int db_exec_callback(void *user, int columns, char **data, char **names)
Definition lsqlite3.c:1750
static sdb_bu * lsqlite_getbu(lua_State *L, int index)
Definition lsqlite3.c:1622
static int sqlite_ctx_meta_ref
Definition lsqlite3.c:128
static int dbvm_get_values(lua_State *L)
Definition lsqlite3.c:375
static int dbvm_finalize(lua_State *L)
Definition lsqlite3.c:295
static int db_busy_callback(void *user, int tries)
Definition lsqlite3.c:1678
static const struct @45 sqlite_constants[]
static int collwrapper(scc *co, int l1, const void *p1, int l2, const void *p2)
Definition lsqlite3.c:1175
static const luaL_Reg ctxlib[]
Definition lsqlite3.c:2316
static int stepvm(lua_State *L, sdb_vm *svm)
Definition lsqlite3.c:243
static int db_errcode(lua_State *L)
Definition lsqlite3.c:915
static int db_interrupt(lua_State *L)
Definition lsqlite3.c:927
const char * name
Definition lsqlite3.c:2154
static int dbvm_get_names(lua_State *L)
Definition lsqlite3.c:390
static int lcontext_get_aggregate_context(lua_State *L)
Definition lsqlite3.c:785
static int dbvm_columns(lua_State *L)
Definition lsqlite3.c:338
static int lsqlite_complete(lua_State *L)
Definition lsqlite3.c:2045
static int db_gc(lua_State *L)
Definition lsqlite3.c:2027
static int lcontext_result_blob(lua_State *L)
Definition lsqlite3.c:839
static void dbvm_check_bind_index(lua_State *L, sdb_vm *svm, int index)
Definition lsqlite3.c:319
static int dbvm_bind(lua_State *L)
Definition lsqlite3.c:528
static int db_urows(lua_State *L)
Definition lsqlite3.c:1969
static int db_get_ptr(lua_State *L)
Definition lsqlite3.c:2021
static void db_sql_finalize_function(sqlite3_context *context)
Definition lsqlite3.c:1042
static int db_create_collation(lua_State *L)
Definition lsqlite3.c:1194
static sdb_vm * lsqlite_getvm(lua_State *L, int index)
Definition lsqlite3.c:247
static int db_total_changes(lua_State *L)
Definition lsqlite3.c:909
static int dbvm_reset(lua_State *L)
Definition lsqlite3.c:300
static void create_meta(lua_State *L, const char *name, const luaL_Reg *lib)
Definition lsqlite3.c:2365
static int db_changes(lua_State *L)
Definition lsqlite3.c:903
static sdb * newdb(lua_State *L)
Definition lsqlite3.c:621
static int dbvm_nrows(lua_State *L)
Definition lsqlite3.c:1932
static void dbvm_check_index(lua_State *L, sdb_vm *svm, int index)
Definition lsqlite3.c:313
static int dbvm_get_named_types(lua_State *L)
Definition lsqlite3.c:471
static int db_next_named_row(lua_State *L)
Definition lsqlite3.c:1915
static int db_commit_hook(lua_State *L)
Definition lsqlite3.c:1395
static int dbvm_rows(lua_State *L)
Definition lsqlite3.c:1928
static int db_load_extension(lua_State *L)
Definition lsqlite3.c:1222
static int dbvm_get_utypes(lua_State *L)
Definition lsqlite3.c:443
#define PUSH_INT64(L, i64in, fallback)
Definition lsqlite3.c:147
static int lcontext_result_double(lua_State *L)
Definition lsqlite3.c:847
static int lcontext_result(lua_State *L)
Definition lsqlite3.c:813
static int dbvm_isopen(lua_State *L)
Definition lsqlite3.c:259
int value
Definition lsqlite3.c:2155
static void db_push_value(lua_State *L, sqlite3_value *value)
Definition lsqlite3.c:945
#define LSQLITE_VERSION
Definition lsqlite3.c:2134
static int lsqlite_do_open(lua_State *L, const char *filename, int flags)
Definition lsqlite3.c:2072
static const luaL_Reg dblib[]
Definition lsqlite3.c:2224
static int lcontext_set_aggregate_context(lua_State *L)
Definition lsqlite3.c:792
static int db_close_vm(lua_State *L)
Definition lsqlite3.c:1990
static const char * sqlite_ctx_meta
Definition lsqlite3.c:127
static int db_isopen(lua_State *L)
Definition lsqlite3.c:889
static int dbvm_get_value(lua_State *L)
Definition lsqlite3.c:350
static int db_do_rows(lua_State *L, int(*f)(lua_State *))
Definition lsqlite3.c:1940
static int dbvm_get_unames(lua_State *L)
Definition lsqlite3.c:431
static int dbvm_bind_names(lua_State *L)
Definition lsqlite3.c:575
static int lsqlite_open_memory(lua_State *L)
Definition lsqlite3.c:2098
static int dbvm_bind_parameter_name(lua_State *L)
Definition lsqlite3.c:520
static int db_update_hook(lua_State *L)
Definition lsqlite3.c:1336
static int db_create_function(lua_State *L)
Definition lsqlite3.c:1159
static const char * sqlite_bu_meta
Definition lsqlite3.c:126
static sdb * lsqlite_checkdb(lua_State *L, int index)
Definition lsqlite3.c:722
static int db_exec(lua_State *L)
Definition lsqlite3.c:1797
static int lcontext_result_null(lua_State *L)
Definition lsqlite3.c:869
LUALIB_API int luaopen_lsqlite3(lua_State *L)
Definition lsqlite3.c:2384
static int luaopen_sqlitelib(lua_State *L)
Definition lsqlite3.c:2378
static int db_last_insert_rowid(lua_State *L)
Definition lsqlite3.c:895
static sdb * lsqlite_getdb(lua_State *L, int index)
Definition lsqlite3.c:716
static const char * sqlite_vm_meta
Definition lsqlite3.c:125
static int dbvm_do_rows(lua_State *L, int(*f)(lua_State *))
Definition lsqlite3.c:1919
static int db_tostring(lua_State *L)
Definition lsqlite3.c:1973
static int lcontext_result_error(lua_State *L)
Definition lsqlite3.c:854
static int db_busy_handler(lua_State *L)
Definition lsqlite3.c:1696
static const luaL_Reg dbbulib[]
Definition lsqlite3.c:2336
static int lcontext_result_int(lua_State *L)
Definition lsqlite3.c:862
static const luaL_Reg sqlitelib[]
Definition lsqlite3.c:2348
static sdb_vm * lsqlite_checkvm(lua_State *L, int index)
Definition lsqlite3.c:253
static int dbvm_get_name(lua_State *L)
Definition lsqlite3.c:359
static int db_errmsg(lua_State *L)
Definition lsqlite3.c:921
static int dbvm_urows(lua_State *L)
Definition lsqlite3.c:1936
static int dbbu_pagecount(lua_State *L)
Definition lsqlite3.c:1657
LUA_API void lua_pushstring(lua_State *L, const char *s)
LUA_API int lua_setmetatable(lua_State *L, int objindex)
LUA_API void lua_pushnil(lua_State *L)
LUA_API void lua_pushnumber(lua_State *L, lua_Number n)
LUA_API const char * lua_pushfstring(lua_State *L, const char *fmt,...)
LUA_API void lua_rawget(lua_State *L, int idx)
LUA_API int lua_toboolean(lua_State *L, int idx)
LUA_API void lua_pushboolean(lua_State *L, int b)
LUA_API void lua_pushvalue(lua_State *L, int idx)
LUA_API int lua_type(lua_State *L, int idx)
LUA_API int lua_error(lua_State *L)
LUA_API void lua_gettable(lua_State *L, int idx)
LUA_API void lua_createtable(lua_State *L, int narray, int nrec)
LUA_API void lua_pushlightuserdata(lua_State *L, void *p)
LUA_API void lua_rawseti(lua_State *L, int idx, int n)
LUA_API int lua_isnumber(lua_State *L, int idx)
LUA_API int lua_next(lua_State *L, int idx)
LUA_API void * lua_touserdata(lua_State *L, int idx)
LUA_API int lua_checkstack(lua_State *L, int size)
LUA_API void lua_pushlstring(lua_State *L, const char *s, size_t len)
LUA_API void lua_settop(lua_State *L, int idx)
LUA_API void lua_pushinteger(lua_State *L, lua_Integer n)
LUA_API const char * lua_typename(lua_State *L, int t)
LUA_API void lua_rawgeti(lua_State *L, int idx, int n)
LUA_API void lua_rawset(lua_State *L, int idx)
LUA_API int lua_gettop(lua_State *L)
LUALIB_API int luaL_typerror(lua_State *L, int narg, const char *tname)
LUALIB_API int luaL_ref(lua_State *L, int t)
LUALIB_API void luaL_checktype(lua_State *L, int narg, int t)
LUALIB_API int luaL_newmetatable(lua_State *L, const char *tname)
LUALIB_API void * luaL_checkudata(lua_State *L, int ud, const char *tname)
LUALIB_API int luaL_error(lua_State *L, const char *fmt,...)
LUALIB_API lua_Integer luaL_checkinteger(lua_State *L, int narg)
LUALIB_API lua_Integer luaL_optinteger(lua_State *L, int narg, lua_Integer def)
LUALIB_API int luaL_argerror(lua_State *L, int narg, const char *extramsg)
LUALIB_API void luaL_unref(lua_State *L, int t, int ref)
LUALIB_API lua_Number luaL_checknumber(lua_State *L, int narg)
#define luaL_getmetatable(L, n)
#define LUA_NOREF
#define luaL_optstring(L, n, d)
#define luaL_checkstring(L, n)
#define luaL_checkint(L, n)
#define lua_pushcfunction(L, f)
#define LUA_TTABLE
#define LUA_REGISTRYINDEX
#define LUA_TNONE
#define lua_pushliteral(L, s)
#define LUA_TSTRING
#define LUA_TBOOLEAN
#define lua_isfunction(L, n)
#define LUA_TNUMBER
#define lua_isnil(L, n)
#define LUA_TLIGHTUSERDATA
#define lua_newtable(L)
#define lua_pop(L, n)
#define lua_tostring(L, i)
#define lua_isnone(L, n)
#define LUA_TFUNCTION
#define LUA_TNIL
LUA_NUMBER lua_Number
#define lua_strlen(L, i)
#define lua_isnoneornil(L, n)
#define LUALIB_API
LUALIB_API void luaL_requiref(lua_State *L, const char *modname, lua_CFunction openf, int glb)
LUALIB_API void luaL_setfuncs(lua_State *L, const luaL_Reg *l, int nup)
#define luaL_newlibtable(L, l)
#define lua_tointeger(L, i)
#define lua_tonumber(L, i)
#define lua_pcall(L, n, r, f)
#define FUNCTION
#define FORMAT
LUA_API int lua_isinteger(lua_State *L, int idx)
#define lua_replace(L, idx)
#define lua_insert(L, idx)
#define lua_newuserdata(L, s)
SQLITE_API int sqlite3_column_bytes(sqlite3_stmt *, int iCol)
Definition sqlite3.c:84101
#define SQLITE_OPEN_CREATE
Definition sqlite3.c:1603
sqlite_int64 sqlite3_int64
Definition sqlite3.c:1329
#define SQLITE_FLOAT
Definition sqlite3.c:5792
SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage)
Definition sqlite3.c:75371
SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p)
Definition sqlite3.c:75625
SQLITE_API void sqlite3_result_int(sqlite3_context *, int)
Definition sqlite3.c:83419
SQLITE_API sqlite3_backup * sqlite3_backup_init(sqlite3 *pDest, const char *zDestName, sqlite3 *pSource, const char *zSourceName)
Definition sqlite3.c:75191
#define SQLITE_BLOB
Definition sqlite3.c:5793
SQLITE_API void sqlite3_result_text(sqlite3_context *, const char *, int, void(*)(void *))
Definition sqlite3.c:83449
SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p)
Definition sqlite3.c:75679
SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt)
Definition sqlite3.c:83978
#define SQLITE_MISUSE
Definition sqlite3.c:1491
SQLITE_API double sqlite3_column_double(sqlite3_stmt *, int iCol)
Definition sqlite3.c:84111
SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt *, int iCol)
Definition sqlite3.c:84121
SQLITE_API int sqlite3_column_type(sqlite3_stmt *, int iCol)
Definition sqlite3.c:84147
SQLITE_API double sqlite3_value_double(sqlite3_value *)
Definition sqlite3.c:83172
#define SQLITE_OPEN_READWRITE
Definition sqlite3.c:1602
SQLITE_API int sqlite3_create_function(sqlite3 *db, const char *zFunctionName, int nArg, int eTextRep, void *pApp, void(*xFunc)(sqlite3_context *, int, sqlite3_value **), void(*xStep)(sqlite3_context *, int, sqlite3_value **), void(*xFinal)(sqlite3_context *))
Definition sqlite3.c:162936
SQLITE_API const char * sqlite3_libversion(void)
Definition sqlite3.c:161104
SQLITE_API void * sqlite3_commit_hook(sqlite3 *, int(*)(void *), void *)
Definition sqlite3.c:163156
SQLITE_API char * sqlite3_mprintf(const char *,...)
Definition sqlite3.c:29323
SQLITE_API const char * sqlite3_column_decltype(sqlite3_stmt *, int)
Definition sqlite3.c:84241
long long int sqlite_int64
Definition sqlite3.c:1326
SQLITE_API void sqlite3_result_double(sqlite3_context *, double)
Definition sqlite3.c:83403
SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p)
Definition sqlite3.c:75693
SQLITE_API void sqlite3_result_error(sqlite3_context *, const char *, int)
Definition sqlite3.c:83407
#define SQLITE_ROW
Definition sqlite3.c:1499
SQLITE_API void sqlite3_set_auxdata(sqlite3_context *, int N, void *, void(*)(void *))
Definition sqlite3.c:83916
#define SQLITE_OK
Definition sqlite3.c:1469
SQLITE_API void sqlite3_free(void *)
Definition sqlite3.c:27692
SQLITE_API int sqlite3_bind_null(sqlite3_stmt *, int)
Definition sqlite3.c:84439
SQLITE_API int sqlite3_bind_blob(sqlite3_stmt *, int, const void *, int n, void(*)(void *))
Definition sqlite3.c:84390
#define SQLITE_INTEGER
Definition sqlite3.c:5791
SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt)
Definition sqlite3.c:83107
SQLITE_API void sqlite3_progress_handler(sqlite3 *, int, int(*)(void *), void *)
Definition sqlite3.c:162700
SQLITE_API int sqlite3_errcode(sqlite3 *db)
Definition sqlite3.c:163553
#define SQLITE_UTF8
Definition sqlite3.c:6252
SQLITE_API int sqlite3_bind_text(sqlite3_stmt *, int, const char *, int, void(*)(void *))
Definition sqlite3.c:84466
SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt)
Definition sqlite3.c:83080
SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context *)
Definition sqlite3.c:83969
SQLITE_API int sqlite3_prepare_v2(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail)
Definition sqlite3.c:129146
SQLITE_API int sqlite3_total_changes(sqlite3 *)
Definition sqlite3.c:162095
SQLITE_API const char * sqlite3_bind_parameter_name(sqlite3_stmt *, int)
Definition sqlite3.c:84573
SQLITE_API int sqlite3_changes(sqlite3 *)
Definition sqlite3.c:162082
SQLITE_API int sqlite3_bind_double(sqlite3_stmt *, int, double)
Definition sqlite3.c:84416
SQLITE_API void * sqlite3_aggregate_context(sqlite3_context *, int nBytes)
Definition sqlite3.c:83867
SQLITE_API int sqlite3_exec(sqlite3 *, const char *sql, int(*callback)(void *, int, char **, char **), void *, char **errmsg)
Definition sqlite3.c:123455
SQLITE_API int sqlite3_complete(const char *sql)
Definition sqlite3.c:160710
SQLITE_API void * sqlite3_update_hook(sqlite3 *, void(*)(void *, int, char const *, char const *, sqlite3_int64), void *)
Definition sqlite3.c:163181
SQLITE_API void sqlite3_result_int64(sqlite3_context *, sqlite3_int64)
Definition sqlite3.c:83423
SQLITE_API int sqlite3_load_extension(sqlite3 *db, const char *zFile, const char *zProc, char **pzErrMsg)
Definition sqlite3.c:124876
SQLITE_API void * sqlite3_rollback_hook(sqlite3 *, void(*)(void *), void *)
Definition sqlite3.c:163206
SQLITE_API void sqlite3_result_blob(sqlite3_context *, const void *, int, void(*)(void *))
Definition sqlite3.c:83379
SQLITE_API int sqlite3_bind_int(sqlite3_stmt *, int, int)
Definition sqlite3.c:84426
SQLITE_API char * sqlite3_temp_directory
Definition sqlite3.c:7084
#define SQLITE_ABORT
Definition sqlite3.c:1474
SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value *)
Definition sqlite3.c:83178
SQLITE_API void sqlite3_interrupt(sqlite3 *)
Definition sqlite3.c:162748
SQLITE_API int sqlite3_step(sqlite3_stmt *)
Definition sqlite3.c:83730
SQLITE_API int sqlite3_close(sqlite3 *)
Definition sqlite3.c:162246
SQLITE_API int sqlite3_value_type(sqlite3_value *)
Definition sqlite3.c:83216
SQLITE_API void * sqlite3_get_auxdata(sqlite3_context *, int N)
Definition sqlite3.c:83888
#define SQLITE_TEXT
Definition sqlite3.c:5798
SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt *)
Definition sqlite3.c:84562
SQLITE_API int sqlite3_create_collation_v2(sqlite3 *, const char *zName, int eTextRep, void *pArg, int(*xCompare)(void *, int, const void *, int, const void *), void(*xDestroy)(void *))
Definition sqlite3.c:164452
SQLITE_API const void * sqlite3_column_blob(sqlite3_stmt *, int iCol)
Definition sqlite3.c:84091
SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt)
Definition sqlite3.c:83987
SQLITE_API void * sqlite3_user_data(sqlite3_context *)
Definition sqlite3.c:83779
SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3 *)
Definition sqlite3.c:162054
#define SQLITE_TRANSIENT
Definition sqlite3.c:6671
SQLITE_API const char * sqlite3_column_name(sqlite3_stmt *, int N)
Definition sqlite3.c:84218
SQLITE_API const char * sqlite3_errmsg(sqlite3 *)
Definition sqlite3.c:163483
SQLITE_API void sqlite3_result_null(sqlite3_context *)
Definition sqlite3.c:83427
SQLITE_API int sqlite3_busy_handler(sqlite3 *, int(*)(void *, int), void *)
Definition sqlite3.c:162677
SQLITE_API const unsigned char * sqlite3_column_text(sqlite3_stmt *, int iCol)
Definition sqlite3.c:84126
SQLITE_API int sqlite3_value_bytes(sqlite3_value *)
Definition sqlite3.c:83166
SQLITE_API const unsigned char * sqlite3_value_text(sqlite3_value *)
Definition sqlite3.c:83198
SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff)
Definition sqlite3.c:124907
struct sqlite3_stmt sqlite3_stmt
Definition sqlite3.c:4844
SQLITE_API const void * sqlite3_value_blob(sqlite3_value *)
Definition sqlite3.c:83153
SQLITE_API int sqlite3_bind_int64(sqlite3_stmt *, int, sqlite3_int64)
Definition sqlite3.c:84429
SQLITE_API const char * sqlite3_db_filename(sqlite3 *db, const char *zDbName)
Definition sqlite3.c:165384
SQLITE_API SQLITE_DEPRECATED void * sqlite3_trace(sqlite3 *, void(*xTrace)(void *, const char *), void *)
Definition sqlite3.c:163075
SQLITE_API int sqlite3_busy_timeout(sqlite3 *, int ms)
Definition sqlite3.c:162731
#define SQLITE_NULL
Definition sqlite3.c:5794
#define SQLITE_DONE
Definition sqlite3.c:1500
sqlite3_context * ctx
Definition lsqlite3.c:735
int ref
Definition lsqlite3.c:1172
lua_State * L
Definition lsqlite3.c:1171
sqlite3_backup * bu
Definition lsqlite3.c:1569
sdb_func * next
Definition lsqlite3.c:87
sdb * db
Definition lsqlite3.c:84
int fn_step
Definition lsqlite3.c:80
char aggregate
Definition lsqlite3.c:85
int udata
Definition lsqlite3.c:82
int fn_finalize
Definition lsqlite3.c:81
sqlite3_stmt * vm
Definition lsqlite3.c:190
int columns
Definition lsqlite3.c:193
char temp
Definition lsqlite3.c:196
char has_values
Definition lsqlite3.c:194
sdb * db
Definition lsqlite3.c:189
Definition lsqlite3.c:91
int update_hook_cb
Definition lsqlite3.c:112
sqlite3 * db
Definition lsqlite3.c:95
lua_State * L
Definition lsqlite3.c:93
int rollback_hook_cb
Definition lsqlite3.c:118
int update_hook_udata
Definition lsqlite3.c:113
int commit_hook_cb
Definition lsqlite3.c:115
int trace_cb
Definition lsqlite3.c:107
int commit_hook_udata
Definition lsqlite3.c:116
int trace_udata
Definition lsqlite3.c:108
int progress_udata
Definition lsqlite3.c:105
int busy_udata
Definition lsqlite3.c:102
int busy_cb
Definition lsqlite3.c:101
sdb_func * func
Definition lsqlite3.c:98
int rollback_hook_udata
Definition lsqlite3.c:119
int progress_cb
Definition lsqlite3.c:104