sq_sqlite3.cpp 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122
  1. /* Code generated by script */
  2. #include "squirrel.h"
  3. #include "sqlite3.h"
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include "sqstdblobimpl.h"
  7. typedef struct sq_sqlite3_sdb sq_sqlite3_sdb;
  8. typedef struct sq_sqlite3_sdb_func sq_sqlite3_sdb_func;
  9. /* to use as C user data so i know what function sqlite is calling */
  10. struct sq_sqlite3_sdb_func {
  11. /* references to associated lua values */
  12. HSQOBJECT fn_step;
  13. HSQOBJECT fn_finalize;
  14. HSQOBJECT udata;
  15. sq_sqlite3_sdb *sdb;
  16. sq_sqlite3_sdb_func *next;
  17. };
  18. /* information about database */
  19. struct sq_sqlite3_sdb {
  20. /* associated squirrel vm */
  21. HSQUIRRELVM v;
  22. /* sqlite database handle */
  23. sqlite3 *db;
  24. /* sql functions stack usage */
  25. sq_sqlite3_sdb_func *func; /* top SQL function being called */
  26. /* references */
  27. HSQOBJECT busy_cb; /* busy callback */
  28. HSQOBJECT busy_udata;
  29. HSQOBJECT progress_cb; /* progress handler */
  30. HSQOBJECT progress_udata;
  31. HSQOBJECT trace_cb; /* trace callback */
  32. HSQOBJECT trace_udata;
  33. HSQOBJECT null_value;
  34. };
  35. SQ_OPT_STRING_STRLEN();
  36. static const SQChar *SQLite3_TAG = "SQLite3";
  37. static const SQChar *SQLite3_Stmt_TAG = "SQLite3Stmt";
  38. static const SQChar sqlite3_NULL_Name[] = _SC("sqlite3_NULL");
  39. static const SQChar nullName[] = _SC("Null");
  40. static SQRESULT sqlite3_NULL_tostring(HSQUIRRELVM v){
  41. sq_pushstring(v, "", 0);
  42. return 1;
  43. }
  44. SQRegFunction sqlite3_NULL_methods[]={
  45. {_SC("_tostring"),sqlite3_NULL_tostring,1, _SC(".")},
  46. {0,0}
  47. };
  48. static SQRESULT get_sqlite3_instance(HSQUIRRELVM v, SQInteger idx, sq_sqlite3_sdb **sdb){
  49. SQRESULT _rc_;
  50. if((_rc_ = sq_getinstanceup(v,idx,(SQUserPointer*)sdb,(void*)SQLite3_TAG)) < 0) return _rc_;
  51. if(!*sdb) return sq_throwerror(v, _SC("database is closed"));
  52. return _rc_;
  53. }
  54. static SQRESULT get_sqlite3_stmt_instance(HSQUIRRELVM v, SQInteger idx, sqlite3_stmt **stmt){
  55. SQRESULT _rc_;
  56. if((_rc_ = sq_getinstanceup(v,idx,(SQUserPointer*)stmt,(void*)SQLite3_Stmt_TAG)) < 0) return _rc_;
  57. if(!*stmt) return sq_throwerror(v, _SC("statement is closed"));
  58. return _rc_;
  59. }
  60. //#define push_sqlite3_null(v) sq_getonregistrytable(v, sqlite3_NULL_Name, sizeof(sqlite3_NULL_Name)-1);
  61. //#define push_sqlite3_null(v) sq_pushobject(v, sqlite3_NULL);
  62. //#define push_sqlite3_null(v) sq_getbyname(v, 1, nullName, sizeof(nullName)-1)
  63. //#define push_sqlite3_null(v) sq_pushfromregistrytable(v, nullName, sizeof(nullName)-1)
  64. //#define push_sqlite3_null(v) {sq_pushregistrytable(v);sq_pushstring(v, sqlite3_NULL_Name, sizeof(sqlite3_NULL_Name)-1);sq_get(v, -2);sq_remove(v,-2);}
  65. //the line bellow is the fastest one, any other attempt till now was slower
  66. #define push_sqlite3_null(v) {sq_pushstring(v, nullName, sizeof(nullName)-1);sq_get(v, 1);}
  67. #define GET_sqlite3_INSTANCE_AT(idx) \
  68. sq_sqlite3_sdb *sdb=NULL; \
  69. if((_rc_ = get_sqlite3_instance(v,idx,&sdb)) < 0) return _rc_;\
  70. sqlite3 *self = sdb->db;
  71. #define GET_sqlite3_INSTANCE() GET_sqlite3_INSTANCE_AT(1)
  72. //#define GET_sqlite3_INSTANCE() SQ_GET_INSTANCE(v, 1, sqlite3, SQLite3_TAG)
  73. #define GET_sqlite3_stmt_INSTANCE() \
  74. sqlite3_stmt *self=NULL; \
  75. if((_rc_ = get_sqlite3_stmt_instance(v,1,&self)) < 0) return _rc_;
  76. enum e_type_result {tr_first_row_first_col, tr_first_row, tr_all_rows, tr_ddml};
  77. #define AS_STRING_ALWAYS 0x01
  78. #define NULL_AS_EMPTY_STR 0x02
  79. #define WITH_COL_NAMES 0x04
  80. static void sqlite3_stmt_push_string(HSQUIRRELVM v, sqlite3_stmt *stmt, int col, int flags){
  81. const char *value = (const char*) sqlite3_column_text(stmt, col);
  82. if(value) sq_pushstring(v, value, sqlite3_column_bytes(stmt, col));
  83. else push_sqlite3_null(v);
  84. }
  85. static SQRESULT sqlite3_stmt_push_value(HSQUIRRELVM v, sqlite3_stmt *stmt, int col, int flags){
  86. const char *value;
  87. if(flags & AS_STRING_ALWAYS) sqlite3_stmt_push_string(v, stmt, col, flags);
  88. else
  89. {
  90. switch (sqlite3_column_type(stmt, col)) {
  91. case SQLITE_INTEGER:
  92. {
  93. sqlite_int64 i64 = sqlite3_column_int64(stmt, col);
  94. SQInteger n = (SQInteger)i64;
  95. if (n == i64)
  96. sq_pushinteger(v, n);
  97. else
  98. sq_pushstring(v, (const char*) sqlite3_column_text(stmt, col), sqlite3_column_bytes(stmt, col));
  99. }
  100. break;
  101. case SQLITE_FLOAT:
  102. sq_pushfloat(v, sqlite3_column_double(stmt, col));
  103. break;
  104. case SQLITE_TEXT:
  105. sqlite3_stmt_push_string(v, stmt, col, flags);
  106. break;
  107. case SQLITE_BLOB:
  108. value = (const char*) sqlite3_column_blob(stmt, col);
  109. if(value) sq_pushstring(v, value, sqlite3_column_bytes(stmt, col));
  110. else push_sqlite3_null(v);
  111. break;
  112. case SQLITE_NULL:
  113. push_sqlite3_null(v);
  114. break;
  115. default:
  116. push_sqlite3_null(v);
  117. break;
  118. }
  119. }
  120. return 1;
  121. }
  122. static void sqlite3_stmt_row_asArray(HSQUIRRELVM v, sqlite3_stmt *stmt, int flags){
  123. int col_count = sqlite3_column_count(stmt);
  124. sq_newarray(v, col_count);
  125. for(int i=0; i<col_count; ++i){
  126. sq_pushinteger(v, i);
  127. sqlite3_stmt_push_value(v, stmt, i, flags);
  128. sq_rawset(v, -3);
  129. }
  130. }
  131. static void sqlite3_stmt_row_asTable(HSQUIRRELVM v, sqlite3_stmt *stmt, int flags){
  132. int col_count = sqlite3_column_count(stmt);
  133. sq_newtable(v);
  134. for(int i=0; i<col_count; ++i){
  135. sq_pushstring(v, sqlite3_column_name(stmt, i), -1);
  136. sqlite3_stmt_push_value(v, stmt, i, flags);
  137. sq_rawset(v, -3);
  138. }
  139. }
  140. static void sqlite3_stmt_asArrayOfArrays(HSQUIRRELVM v, sqlite3_stmt *stmt, int flags){
  141. sq_newarray(v, 0);
  142. if(flags & WITH_COL_NAMES){
  143. int col_count = sqlite3_column_count(stmt);
  144. sq_newarray(v, col_count);
  145. for(int i=0; i<col_count; ++i){
  146. sq_pushinteger(v, i);
  147. sq_pushstring(v, sqlite3_column_name(stmt, i), -1);
  148. sq_rawset(v, -3);
  149. }
  150. sq_arrayappend(v, -2);
  151. }
  152. while(sqlite3_step(stmt) == SQLITE_ROW){
  153. sqlite3_stmt_row_asArray(v, stmt, flags);
  154. sq_arrayappend(v, -2);
  155. }
  156. }
  157. static void sqlite3_stmt_asArrayOfTables(HSQUIRRELVM v, sqlite3_stmt *stmt, int flags){
  158. sq_newarray(v, 0);
  159. while(sqlite3_step(stmt) == SQLITE_ROW){
  160. sqlite3_stmt_row_asTable(v, stmt, flags);
  161. sq_arrayappend(v, -2);
  162. }
  163. }
  164. static SQRESULT sqlite3_stmt_bind_value(HSQUIRRELVM v, sqlite3_stmt *stmt, int npar, int argn){
  165. int _rc_ = 0;
  166. SQObjectType ptype = sq_gettype(v, argn);
  167. switch(ptype){
  168. case OT_BOOL:
  169. SQ_GET_BOOL(v, argn, param_bool);
  170. _rc_ = sqlite3_bind_int(stmt, npar, param_bool == SQTrue ? 1 : 0);
  171. break;
  172. case OT_INTEGER:
  173. SQ_GET_INTEGER(v, argn, param_integer);
  174. _rc_ = sqlite3_bind_int64(stmt, npar, param_integer);
  175. break;
  176. case OT_FLOAT:
  177. SQ_GET_FLOAT(v, argn, param_float);
  178. _rc_ = sqlite3_bind_double(stmt, npar, param_float);
  179. break;
  180. case OT_STRING:{
  181. SQ_GET_STRING(v, argn, param_string);
  182. _rc_ = sqlite3_bind_text(stmt, npar, param_string, param_string_size, SQLITE_TRANSIENT);
  183. }
  184. break;
  185. case OT_NULL:
  186. _rc_ = sqlite3_bind_null(stmt, npar);
  187. break;
  188. default:
  189. return sq_throwerror(v, "Invalid bind parameter %d", npar);
  190. }
  191. if(_rc_ != SQLITE_OK) {
  192. sqlite3 *db = sqlite3_db_handle(stmt);
  193. return sq_throwerror(v, sqlite3_errmsg(db));
  194. }
  195. return SQ_OK;
  196. }
  197. static SQRESULT sq_sqlite3_stmt_prepare_aux(HSQUIRRELVM v, sqlite3 *db, sqlite3_stmt **stmt, int params_start){
  198. SQ_FUNC_VARS(v);
  199. SQ_GET_STRING(v, params_start, szSQL);
  200. const char* szTail=0;
  201. if(sqlite3_prepare_v2(db, szSQL, szSQL_size, stmt, &szTail) != SQLITE_OK)
  202. {
  203. return sq_throwerror(v, sqlite3_errmsg(db));
  204. }
  205. if(_top_ > params_start){
  206. int nparams = sqlite3_bind_parameter_count(*stmt);
  207. int nparams_given = _top_-params_start;
  208. if(nparams != nparams_given){
  209. return sq_throwerror(v, "expect %d parameters but only %d given", nparams, nparams_given);
  210. }
  211. for(int i=1; i <= nparams; ++i){
  212. int argn = i+params_start;
  213. _rc_ = sqlite3_stmt_bind_value(v, *stmt, i, argn);
  214. if(_rc_ < 0) return _rc_;
  215. }
  216. }
  217. return SQ_OK;
  218. }
  219. static SQRESULT sq_sqlite3_stmt_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  220. {
  221. sqlite3_stmt *stmt = ((sqlite3_stmt *)p);
  222. if(stmt) sqlite3_finalize(stmt);
  223. return 0;
  224. }
  225. static SQRESULT sq_sqlite3_stmt_constructor(HSQUIRRELVM v)
  226. {
  227. SQ_FUNC_VARS(v);
  228. _rc_ = SQ_ERROR;
  229. GET_sqlite3_INSTANCE_AT(2);
  230. sqlite3_stmt *stmt = 0;
  231. if(_top_ > 2){
  232. _rc_ = sq_sqlite3_stmt_prepare_aux(v, self, &stmt, 3);
  233. }
  234. else
  235. {
  236. const char* szTail=0;
  237. if(sqlite3_prepare_v2(self, "select 'statement not prepared';", -1, &stmt, &szTail) != SQLITE_OK)
  238. {
  239. _rc_ = sq_throwerror(v, sqlite3_errmsg(self));
  240. }
  241. else _rc_ = SQ_OK;
  242. }
  243. sq_setinstanceup(v, 1, stmt); //replace self for this instance with this new sqlite3_stmt
  244. sq_setreleasehook(v,1, sq_sqlite3_stmt_releasehook);
  245. return _rc_;
  246. }
  247. static SQRESULT sq_sqlite3_stmt_get_db(HSQUIRRELVM v){
  248. SQ_FUNC_VARS_NO_TOP(v);
  249. GET_sqlite3_stmt_INSTANCE();
  250. sqlite3 *db = sqlite3_db_handle(self);
  251. sq_pushuserpointer(v, db);
  252. if(sq_getonregistrytable(v) == SQ_OK){
  253. sq_getweakrefval(v, -1);
  254. }
  255. else return sq_throwerror(v, _SC("could not retrive database, maybe it was already closed"));
  256. return 1;
  257. }
  258. static SQRESULT sq_sqlite3_stmt_stmt_ptr(HSQUIRRELVM v){
  259. SQ_FUNC_VARS_NO_TOP(v);
  260. GET_sqlite3_stmt_INSTANCE();
  261. sq_pushuserpointer(v, self);
  262. return 1;
  263. }
  264. static SQRESULT sq_sqlite3_stmt_finalize(HSQUIRRELVM v){
  265. SQ_FUNC_VARS_NO_TOP(v);
  266. GET_sqlite3_stmt_INSTANCE();
  267. sq_setinstanceup(v, 1, 0); //next calls will fail with "statement is closed"
  268. sq_pushinteger(v, sqlite3_finalize(self));
  269. return 1;
  270. }
  271. static SQRESULT sq_sqlite3_stmt_prepare(HSQUIRRELVM v){
  272. SQ_FUNC_VARS_NO_TOP(v);
  273. GET_sqlite3_stmt_INSTANCE();
  274. sqlite3 *db = sqlite3_db_handle(self);
  275. sqlite3_stmt *stmt = 0;
  276. _rc_ = sq_sqlite3_stmt_prepare_aux(v, db, &stmt, 2);
  277. if(stmt){
  278. sqlite3_finalize(self); //finalize the previous sqlite3_stmt
  279. sq_setinstanceup(v, 1, stmt); //replace self for this instance with this new sqlite3_stmt
  280. }
  281. return _rc_;
  282. }
  283. static SQRESULT sq_sqlite3_stmt_get_sql(HSQUIRRELVM v){
  284. SQ_FUNC_VARS_NO_TOP(v);
  285. GET_sqlite3_stmt_INSTANCE();
  286. sq_pushstring(v, sqlite3_sql(self), -1);
  287. return 1;
  288. }
  289. static SQRESULT sq_sqlite3_stmt_bind(HSQUIRRELVM v){
  290. SQ_FUNC_VARS_NO_TOP(v);
  291. GET_sqlite3_stmt_INSTANCE();
  292. SQ_GET_INTEGER(v, 2, npar);
  293. return sqlite3_stmt_bind_value(v, self, npar, 3);
  294. }
  295. static SQRESULT sq_sqlite3_stmt_bind_empty_null(HSQUIRRELVM v){
  296. SQ_FUNC_VARS_NO_TOP(v);
  297. GET_sqlite3_stmt_INSTANCE();
  298. SQ_GET_INTEGER(v, 2, npar);
  299. if(sq_gettype(v, 3) == OT_STRING && sq_getsize(v, 3) == 0){
  300. sq_pushnull(v);
  301. sq_replace(v, 3);
  302. }
  303. return sqlite3_stmt_bind_value(v, self, npar, 3);
  304. }
  305. static SQRESULT sq_sqlite3_stmt_bind_blob(HSQUIRRELVM v){
  306. SQ_FUNC_VARS_NO_TOP(v);
  307. GET_sqlite3_stmt_INSTANCE();
  308. SQ_GET_INTEGER(v, 2, npar);
  309. SQ_GET_STRING(v, 3, blob);
  310. if(sqlite3_bind_blob(self, npar, blob, blob_size, SQLITE_TRANSIENT) != SQLITE_OK) {
  311. sqlite3 *db = sqlite3_db_handle(self);
  312. return sq_throwerror(v, sqlite3_errmsg(db));
  313. }
  314. return SQ_OK;
  315. }
  316. static SQRESULT sq_sqlite3_stmt_bind_values(HSQUIRRELVM v){
  317. SQ_FUNC_VARS(v);
  318. GET_sqlite3_stmt_INSTANCE();
  319. if (_top_ - 1 != sqlite3_bind_parameter_count(self))
  320. return sq_throwerror(v,
  321. _SC("incorrect number of parameters to bind (%d given, %d to bind)"),
  322. _top_ - 1,
  323. sqlite3_bind_parameter_count(self));
  324. for (int n = 2; n <= _top_; ++n) {
  325. if (sqlite3_stmt_bind_value(v, self, n-1, n) != SQ_OK) return SQ_ERROR;
  326. }
  327. return 0;
  328. }
  329. static SQRESULT sq_sqlite3_stmt_bind_names(HSQUIRRELVM v){
  330. SQ_FUNC_VARS_NO_TOP(v);
  331. GET_sqlite3_stmt_INSTANCE();
  332. SQObjectType ptype = sq_gettype(v, 2);
  333. int count = sqlite3_bind_parameter_count(self);
  334. int result;
  335. for (int n = 1; n <= count; ++n) {
  336. const char *name = sqlite3_bind_parameter_name(self, n);
  337. if (name && (name[0] == ':' || name[0] == '$' || name[0] == '@')) {
  338. if(ptype == OT_TABLE){
  339. sq_pushstring(v, ++name, -1);
  340. if(sq_get(v, 2) == SQ_OK){
  341. result = sqlite3_stmt_bind_value(v, self, n, -1);
  342. sq_poptop(v);
  343. }
  344. else return sq_throwerror(v, _SC("bind parameter (%s) not found"), name);
  345. }
  346. else return sq_throwerror(v, _SC("table expected to bind named parameters"));
  347. }
  348. else {
  349. if(ptype == OT_ARRAY){
  350. sq_pushinteger(v, n);
  351. if(sq_get(v, 2) == SQ_OK){
  352. result = sqlite3_stmt_bind_value(v, self, n, -1);
  353. sq_poptop(v);
  354. }
  355. else return sq_throwerror(v, _SC("bind parameter (%d) not found"), n);
  356. }
  357. else return sq_throwerror(v, _SC("array expected to bind numbered parameters"));
  358. }
  359. if (result != SQ_OK) return result;
  360. }
  361. return 0;
  362. }
  363. static SQRESULT sq_sqlite3_stmt_bind_parameter_index(HSQUIRRELVM v){
  364. SQ_FUNC_VARS_NO_TOP(v);
  365. GET_sqlite3_stmt_INSTANCE();
  366. SQ_GET_STRING(v, 2, spar);
  367. sq_pushinteger(v, sqlite3_bind_parameter_index(self, spar));
  368. return 1;
  369. }
  370. static SQRESULT sq_sqlite3_stmt_reset(HSQUIRRELVM v){
  371. SQ_FUNC_VARS_NO_TOP(v);
  372. GET_sqlite3_stmt_INSTANCE();
  373. sq_pushinteger(v, sqlite3_reset(self));
  374. return 1;
  375. }
  376. static SQRESULT sq_sqlite3_stmt_step(HSQUIRRELVM v){
  377. SQ_FUNC_VARS_NO_TOP(v);
  378. GET_sqlite3_stmt_INSTANCE();
  379. sq_pushinteger(v, sqlite3_step(self));
  380. return 1;
  381. }
  382. static SQRESULT sq_sqlite3_stmt_next_row(HSQUIRRELVM v){
  383. SQ_FUNC_VARS_NO_TOP(v);
  384. GET_sqlite3_stmt_INSTANCE();
  385. sq_pushbool(v, sqlite3_step(self) == SQLITE_ROW);
  386. return 1;
  387. }
  388. static SQRESULT sq_sqlite3_stmt_col_count(HSQUIRRELVM v){
  389. SQ_FUNC_VARS_NO_TOP(v);
  390. GET_sqlite3_stmt_INSTANCE();
  391. sq_pushinteger(v, sqlite3_column_count(self));
  392. return 1;
  393. }
  394. static SQRESULT sq_sqlite3_stmt_colsAsArray(HSQUIRRELVM v){
  395. SQ_FUNC_VARS(v);
  396. GET_sqlite3_stmt_INSTANCE();
  397. int col_count = sqlite3_column_count(self);
  398. sq_newarray(v, col_count);
  399. for(int i=0; i<col_count; ++i){
  400. sq_pushinteger(v, i);
  401. sq_pushstring(v, sqlite3_column_name(self, i), -1);
  402. sq_rawset(v, -3);
  403. }
  404. return 1;
  405. }
  406. static SQRESULT sq_sqlite3_stmt_colsAsTable(HSQUIRRELVM v){
  407. SQ_FUNC_VARS_NO_TOP(v);
  408. GET_sqlite3_stmt_INSTANCE();
  409. int col_count = sqlite3_column_count(self);
  410. sq_newtable(v);
  411. for(int i=0; i<col_count; ++i){
  412. sq_pushstring(v, sqlite3_column_name(self, i), -1);
  413. sq_pushinteger(v, i);
  414. sq_rawset(v, -3);
  415. }
  416. return 1;
  417. }
  418. static SQRESULT sq_sqlite3_stmt_col_name(HSQUIRRELVM v){
  419. SQ_FUNC_VARS_NO_TOP(v);
  420. GET_sqlite3_stmt_INSTANCE();
  421. SQ_GET_INTEGER(v, 2, col);
  422. sq_pushstring(v, sqlite3_column_name(self, col), -1);
  423. return 1;
  424. }
  425. static SQRESULT sq_sqlite3_stmt_col_type(HSQUIRRELVM v){
  426. SQ_FUNC_VARS_NO_TOP(v);
  427. GET_sqlite3_stmt_INSTANCE();
  428. SQ_GET_INTEGER(v, 2, col);
  429. sq_pushinteger(v, sqlite3_column_type(self, col));
  430. return 1;
  431. }
  432. static SQRESULT sq_sqlite3_stmt_col_declared_type(HSQUIRRELVM v){
  433. SQ_FUNC_VARS_NO_TOP(v);
  434. GET_sqlite3_stmt_INSTANCE();
  435. SQ_GET_INTEGER(v, 2, col);
  436. sq_pushstring(v, sqlite3_column_decltype(self, col), -1);
  437. return 1;
  438. }
  439. static int get_col_index(HSQUIRRELVM v, sqlite3_stmt *self){
  440. SQInteger _rc_, col;
  441. switch(sq_gettype(v, 2)){
  442. case OT_INTEGER:
  443. sq_getinteger(v, 2, &col);
  444. break;
  445. case OT_STRING:{
  446. SQ_GET_STRING(v, 2, col_name);
  447. if(col_name_size == 0) return sq_throwerror(v, "column name can not be empty");
  448. col = -1;
  449. for(int i=0, len=sqlite3_column_count(self); i<len; ++i){
  450. if(strcasecmp(col_name, sqlite3_column_name(self, i)) == 0){
  451. col = i;
  452. break;
  453. }
  454. }
  455. if(col == -1) return sq_throwerror(v, "column name not found \"%s\"", col_name);
  456. }
  457. break;
  458. default:
  459. return sq_throwerror(v, "wrong parameter expected integer|string");
  460. }
  461. return col;
  462. }
  463. static SQRESULT sq_sqlite3_stmt_col(HSQUIRRELVM v){
  464. SQ_FUNC_VARS_NO_TOP(v);
  465. GET_sqlite3_stmt_INSTANCE();
  466. int col = get_col_index(v, self);
  467. if(col < 0) return col;
  468. sqlite3_stmt_push_value(v, self, col, 0);
  469. return 1;
  470. }
  471. static SQRESULT sq_sqlite3_stmt_asBool(HSQUIRRELVM v){
  472. SQ_FUNC_VARS_NO_TOP(v);
  473. GET_sqlite3_stmt_INSTANCE();
  474. int col = get_col_index(v, self);
  475. if(col < 0) return col;
  476. const unsigned char *b = sqlite3_column_text(self, col);
  477. sq_pushbool(v, b && *b == '1');
  478. return 1;
  479. }
  480. static SQRESULT sq_sqlite3_stmt_asInteger(HSQUIRRELVM v){
  481. SQ_FUNC_VARS_NO_TOP(v);
  482. GET_sqlite3_stmt_INSTANCE();
  483. int col = get_col_index(v, self);
  484. if(col < 0) return col;
  485. sq_pushinteger(v, sqlite3_column_int64(self, col));
  486. return 1;
  487. }
  488. static SQRESULT sq_sqlite3_stmt_asFloat(HSQUIRRELVM v){
  489. SQ_FUNC_VARS_NO_TOP(v);
  490. GET_sqlite3_stmt_INSTANCE();
  491. int col = get_col_index(v, self);
  492. if(col < 0) return col;
  493. sq_pushfloat(v, sqlite3_column_double(self, col));
  494. return 1;
  495. }
  496. static SQRESULT sq_sqlite3_stmt_StringOrNull(HSQUIRRELVM v, int withNull){
  497. SQ_FUNC_VARS_NO_TOP(v);
  498. GET_sqlite3_stmt_INSTANCE();
  499. int col = get_col_index(v, self);
  500. if(col < 0) return col;
  501. sqlite3_stmt_push_string(v, self, col, withNull ? 0 : NULL_AS_EMPTY_STR);
  502. return 1;
  503. }
  504. static SQRESULT sq_sqlite3_stmt_asString(HSQUIRRELVM v){
  505. return sq_sqlite3_stmt_StringOrNull(v, 0);
  506. }
  507. static SQRESULT sq_sqlite3_stmt_asStringOrNull(HSQUIRRELVM v){
  508. return sq_sqlite3_stmt_StringOrNull(v, 1);
  509. }
  510. static SQRESULT sq_sqlite3_stmt_asTable(HSQUIRRELVM v){
  511. SQ_FUNC_VARS(v);
  512. GET_sqlite3_stmt_INSTANCE();
  513. SQ_OPT_INTEGER(v, 2, flags, 0);
  514. sqlite3_stmt_row_asTable(v, self, flags);
  515. return 1;
  516. }
  517. static SQRESULT sq_sqlite3_stmt_asArray(HSQUIRRELVM v){
  518. SQ_FUNC_VARS(v);
  519. GET_sqlite3_stmt_INSTANCE();
  520. SQ_OPT_INTEGER(v, 2, flags, 0);
  521. sqlite3_stmt_row_asArray(v, self, flags);
  522. return 1;
  523. }
  524. static SQRESULT sq_sqlite3_stmt_asArrayOfArrays(HSQUIRRELVM v){
  525. SQ_FUNC_VARS(v);
  526. GET_sqlite3_stmt_INSTANCE();
  527. SQ_OPT_INTEGER(v, 2, flags, 0);
  528. sqlite3_stmt_asArrayOfArrays(v, self, flags);
  529. sqlite3_reset(self);
  530. return 1;
  531. }
  532. static SQRESULT sq_sqlite3_stmt_asArrayOfTables(HSQUIRRELVM v){
  533. SQ_FUNC_VARS(v);
  534. GET_sqlite3_stmt_INSTANCE();
  535. SQ_OPT_INTEGER(v, 2, flags, 0);
  536. sqlite3_stmt_asArrayOfTables(v, self, flags);
  537. sqlite3_reset(self);
  538. return 1;
  539. }
  540. /*utility functions*/
  541. static void append_escaping_json(SQBlob &json, const char *sz){
  542. if(sz){ //escape string
  543. int last_idx, idx;
  544. idx = last_idx = 0;
  545. for(; sz[idx]; ++idx){
  546. char c = sz[idx];
  547. switch(c){
  548. case '"':
  549. case '\n':
  550. case '\r':
  551. case '\\':{
  552. json.Write(sz+last_idx, idx-last_idx);
  553. last_idx = idx;
  554. if(c == '\n') {
  555. json.Write("\\n", 2);
  556. ++last_idx;
  557. }
  558. else if(c == '\r'){
  559. //skip it
  560. ++last_idx;
  561. }
  562. else
  563. {
  564. json.Write("\\", 1);
  565. }
  566. }
  567. }
  568. }
  569. //last part
  570. json.Write(sz+last_idx, idx-last_idx);
  571. }
  572. }
  573. static SQRESULT sq_sqlite3_stmt_asJsonArray(HSQUIRRELVM v) {
  574. SQ_FUNC_VARS(v);
  575. GET_sqlite3_stmt_INSTANCE();
  576. SQ_OPT_INTEGER(v, 3, withMetadata, 0);
  577. int col_count = sqlite3_column_count(self);
  578. int i;
  579. const char* value;
  580. SQBlob json(0, 8192);
  581. if(withMetadata){
  582. json.WriteZstr("{\n\"columns\":[\n");
  583. for(i=0; i < col_count; ++i){
  584. json.WriteZstr((i == 0 ? "\"" : ",\""));
  585. json.WriteZstr(sqlite3_column_name(self, i));
  586. json.WriteZstr("\"");
  587. }
  588. json.WriteZstr("\n],\n\"column_types\":[\n");
  589. for(i=0; i < col_count; ++i){
  590. json.WriteZstr((i == 0 ? "\"" : ",\""));
  591. json.WriteZstr(sqlite3_column_decltype(self, i));
  592. json.WriteZstr("\"");
  593. }
  594. json.WriteZstr("\n],\n\"rows\":[\n");
  595. }
  596. else {
  597. json.WriteZstr("[\n");
  598. }
  599. int row_count = 0;
  600. while(sqlite3_step(self) == SQLITE_ROW){
  601. json.WriteZstr((row_count++ == 0 ? "[" : ",["));
  602. for(i=0; i < col_count; ++i){
  603. json.WriteZstr((i == 0 ? "\"" : ",\""));
  604. value = (const char*)sqlite3_column_text(self, i);
  605. if(value)
  606. {
  607. switch(sqlite3_column_type(self, i))
  608. {
  609. case SQLITE_TEXT:
  610. {
  611. append_escaping_json(json, value);
  612. }
  613. break;
  614. default:
  615. json.WriteZstr(value);
  616. }
  617. }
  618. json.WriteZstr("\"");
  619. }
  620. json.WriteZstr("]\n");
  621. }
  622. json.WriteZstr("]");
  623. if(withMetadata) json.WriteZstr("\n}");
  624. sq_pushstring(v, (const SQChar*)json.GetBuf(), json.Len());
  625. return 1;
  626. }
  627. static SQRESULT sq_sqlite3_stmt_asJsonObject(HSQUIRRELVM v) {
  628. SQ_FUNC_VARS_NO_TOP(v);
  629. GET_sqlite3_stmt_INSTANCE();
  630. int col_count = sqlite3_column_count(self);
  631. int i;
  632. const char* value;
  633. SQBlob json(0, 8192);
  634. json.WriteZstr("{");
  635. if(sqlite3_step(self) == SQLITE_ROW){
  636. for(i=0; i < col_count; ++i){
  637. json.WriteZstr((i == 0 ? "\"" : "\",\""));
  638. append_escaping_json(json, (const char*)sqlite3_column_name(self, i));
  639. json.WriteZstr("\":\"");
  640. value = (const char*)sqlite3_column_text(self, i);
  641. if(value)
  642. {
  643. switch(sqlite3_column_type(self, i))
  644. {
  645. case SQLITE_TEXT:
  646. {
  647. append_escaping_json(json, value);
  648. }
  649. break;
  650. default:
  651. json.WriteZstr(value);
  652. }
  653. }
  654. }
  655. json.WriteZstr("\"");
  656. }
  657. json.WriteZstr("}");
  658. sq_pushstring(v, (const SQChar*)json.GetBuf(), json.Len());
  659. return 1;
  660. }
  661. #define UNSIGNED(n) n##U
  662. #define IBYTE1 UNSIGNED(255)
  663. #define IBYTE2 UNSIGNED(255*255)
  664. #define IBYTE3 UNSIGNED(255*255*255)
  665. #define IBYTE4 UNSIGNED(255*255*255*255)
  666. #define SIZE1BYTE 250
  667. #define SIZE2BYTE 251
  668. #define SIZE3BYTE 252
  669. #define SIZE4BYTE 253
  670. #define SLEMARK 254
  671. #define SLEEND 255
  672. static SQRESULT sle2array(HSQUIRRELVM v, const unsigned char *p, size_t sle_size, const unsigned char **next)
  673. {
  674. size_t size, data_len = 0;
  675. if(sle_size == 0) {
  676. *next = 0;
  677. return 0;
  678. }
  679. while(*p != SLEEND) //data finished now follow digest
  680. {
  681. size = *p++;
  682. if(size >= SIZE1BYTE)
  683. {
  684. if(size == SIZE1BYTE)
  685. {
  686. //data bigger than 250 and less 500 next byte has more info
  687. size += *p++;
  688. }
  689. else if(size == SIZE2BYTE)
  690. {
  691. //data bigger than 250 next two bytes has more info
  692. size = (*p++ * IBYTE1);
  693. size += *p++;
  694. }
  695. else if(size == SIZE3BYTE)
  696. {
  697. //data bigger than 250 next three bytes has more info
  698. size = (*p++ * IBYTE2);
  699. size += (*p++ * IBYTE1);
  700. size += *p++;
  701. }
  702. else if(size == SIZE4BYTE)
  703. {
  704. //data bigger than 250 next four bytes has more info
  705. size = (*p++ * IBYTE3);
  706. size += (*p++ * IBYTE2);
  707. size += (*p++ * IBYTE1);
  708. size += *p++;
  709. }
  710. else if(size == SLEMARK)
  711. {
  712. //reserved can be used for multi part data, metadata, digest, ...
  713. break;
  714. }
  715. }
  716. sq_pushstring(v, (const char*)p, size);
  717. sq_arrayappend(v, -2);
  718. p += size;
  719. data_len += size;
  720. if(data_len > sle_size)
  721. {
  722. //something went wrong here
  723. return sq_throwerror(v, "We got more data than expected !");
  724. }
  725. }
  726. *next = ++p;
  727. return 0;
  728. }
  729. static SQRESULT sle2vec(HSQUIRRELVM v, const unsigned char *sle,
  730. size_t sle_size,
  731. const unsigned char **next)
  732. {
  733. int rc;
  734. sq_newarray(v, 0);
  735. if(sle[0] != '[') {
  736. return sq_throwerror(v, "Invalid encoded vector !");
  737. }
  738. if(sle[1] == ']') {
  739. *next = sle+2; //empty array
  740. return 0;
  741. }
  742. if((rc = sle2array(v, sle+1, sle_size-1, next)) < 0) return rc;
  743. if(!*next || *next[0] != ']'){
  744. return sq_throwerror(v, "Invalid end of vector !");
  745. }
  746. (*next)++;
  747. return 0;
  748. }
  749. static SQRESULT sq_sle2vecOfvec(HSQUIRRELVM v)
  750. {
  751. SQ_FUNC_VARS(v);
  752. SQBlob *blob = NULL;
  753. const SQChar *sle, *sle_start;
  754. SQInteger sle_size;
  755. SQObjectType ptype = sq_gettype(v, 2);
  756. switch(ptype){
  757. case OT_STRING:
  758. sq_getstr_and_size(v, 2, &sle, &sle_size);
  759. break;
  760. case OT_INSTANCE:
  761. if(SQ_FAILED(sq_getinstanceup(v,2,(SQUserPointer*)&blob,(SQUserPointer)SQBlob::SQBlob_TAG)))
  762. return sq_throwerror(v,_SC("invalid type tag"));
  763. if(!blob || !blob->IsValid())
  764. return sq_throwerror(v,_SC("the blob is invalid"));
  765. sle = (const SQChar*)blob->GetBuf();
  766. sle_size = blob->Len();
  767. break;
  768. default:
  769. return sq_throwerror(v,_SC("invalid parameter 1 of type %s"), sq_gettypename(v, 2));
  770. }
  771. if(sq_gettype(v, 3) != OT_ARRAY)
  772. return sq_throwerror(v,_SC("invalid parameter 2 of type %s"), sq_gettypename(v, 3));
  773. SQ_OPT_INTEGER(v, 4, start, 0);
  774. if(start < 0) return sq_throwerror(v, _SC("invalid start position (%d)"), start);
  775. sq_push(v, 3);
  776. int rc, data_count = 1;
  777. const unsigned char *next;
  778. sle_start = sle + start;
  779. sle_size -= start;
  780. if(sle_start[0] != '[') {
  781. return sq_throwerror(v, "Invalid encoded vector !");
  782. }
  783. if(sle_start[1] == ']') {
  784. //sq_pushinteger(v, start+2);
  785. return 1; //empty array
  786. }
  787. int saved_top = sq_gettop(v);
  788. if((rc=sle2vec(v, (const unsigned char *)sle_start+1, sle_size-1, &next)) < 0) return rc;
  789. while(next && *next == '['){
  790. sq_arrayappend(v, -2);
  791. data_count++;
  792. if((rc=sle2vec(v, next, sle_size - (next - (const unsigned char *)sle_start), &next)) < 0) return rc;
  793. }
  794. if(sq_gettop(v) != saved_top){
  795. //last added table left
  796. sq_arrayappend(v, -2);
  797. data_count++;
  798. }
  799. if(!next || *next != ']'){
  800. return sq_throwerror(v, "Invalid end of vector !");
  801. }
  802. sq_pushinteger(v, ((const SQChar*)(++next)) - sle);
  803. return 1;
  804. }
  805. typedef unsigned char slebuf_t[8];
  806. static int sleSize2buf(slebuf_t sle, size_t size){
  807. size_t next_size, tmp_size;
  808. if(size < SIZE1BYTE)
  809. {
  810. sle[0] = size;
  811. return 1;
  812. }
  813. else if(size < (SIZE1BYTE*2))
  814. {
  815. sle[0] = SIZE1BYTE;
  816. next_size = size - 250;
  817. sle[1] = next_size;
  818. return 2;
  819. }
  820. else if(size < IBYTE2)
  821. {
  822. sle[0] = SIZE2BYTE;
  823. next_size = size/IBYTE1;
  824. sle[1] = next_size;
  825. next_size = size%IBYTE1;
  826. sle[2] = next_size;
  827. return 3;
  828. }
  829. else if(size < IBYTE3)
  830. {
  831. sle[0] = SIZE3BYTE;
  832. next_size = size/IBYTE2;
  833. sle[1] = next_size;
  834. tmp_size = size%IBYTE2;
  835. next_size = tmp_size/IBYTE1;
  836. sle[2] = next_size;
  837. next_size = tmp_size%IBYTE1;
  838. sle[3] = next_size;
  839. return 4;
  840. }
  841. else if(size < IBYTE4)
  842. {
  843. sle[0] = SIZE4BYTE;
  844. next_size = size/IBYTE3;
  845. sle[1] = next_size;
  846. tmp_size = size%IBYTE3;
  847. next_size = tmp_size/IBYTE2;
  848. sle[2] = next_size;
  849. tmp_size = tmp_size%IBYTE2;
  850. next_size = tmp_size/IBYTE1;
  851. sle[3] = next_size;
  852. next_size = tmp_size%IBYTE1;
  853. sle[5] = next_size;
  854. return 5;
  855. }
  856. return 0;
  857. }
  858. static SQRESULT sq_get_sle_size(HSQUIRRELVM v){
  859. SQ_FUNC_VARS_NO_TOP(v);
  860. slebuf_t slebuf;
  861. SQ_GET_INTEGER(v, 2, size);
  862. int slesize = sleSize2buf(slebuf, size);
  863. if(slesize) {
  864. sq_pushstring(v, (const char *)slebuf, slesize);
  865. return 1;
  866. }
  867. return 0;
  868. }
  869. static int add2sle(SQBlob &sle, const char *str, size_t size){
  870. slebuf_t slebuf;
  871. int slesize = sleSize2buf(slebuf, size);
  872. if(slesize) sle.Write((const char *)slebuf, slesize);
  873. if(size) sle.Write(str, size);
  874. return size;
  875. }
  876. static SQRESULT sq_add2sle(HSQUIRRELVM v) {
  877. SQ_FUNC_VARS(v);
  878. SQ_GET_INSTANCE_VAR(v, 2, SQBlob, blob, SQBlob::SQBlob_TAG);
  879. SQ_GET_STRING(v, 3, str);
  880. SQ_OPT_INTEGER(v, 4, size, str_size);
  881. if(size < 0) return sq_throwerror(v, _SC("invalid size value (%d)"), size);
  882. sq_pushinteger(v, add2sle(*blob, str, size));
  883. return 1;
  884. }
  885. static SQRESULT sq_sqlite3_stmt_asSleArray(HSQUIRRELVM v) {
  886. SQ_FUNC_VARS_NO_TOP(v);
  887. GET_sqlite3_stmt_INSTANCE();
  888. int col_count = sqlite3_column_count(self);
  889. int i;
  890. const char *value;
  891. SQBlob sle(0, 8192);
  892. sle.WriteZstr("[[");
  893. for(i=0; i < col_count; ++i){
  894. value = sqlite3_column_name(self, i);
  895. add2sle(sle, value, strlen(value));
  896. }
  897. sle.WriteChar(SLEEND);
  898. sle.WriteChar(']');
  899. while(sqlite3_step(self) == SQLITE_ROW){
  900. sle.WriteChar('[');
  901. for(i=0; i < col_count; ++i){
  902. switch(sqlite3_column_type(self, i))
  903. {
  904. case SQLITE_BLOB:
  905. {
  906. add2sle(sle, (const char*)sqlite3_column_blob(self, i),
  907. sqlite3_column_bytes(self, i));
  908. }
  909. break;
  910. default:
  911. add2sle(sle, (const char*)sqlite3_column_text(self, i),
  912. sqlite3_column_bytes(self, i));
  913. }
  914. }
  915. sle.WriteChar(SLEEND);
  916. sle.WriteChar(']');
  917. }
  918. sle.WriteChar(']');
  919. sq_pushstring(v, (const SQChar*)sle.GetBuf(), sle.Len());
  920. return 1;
  921. }
  922. #define _DECL_FUNC(name,nparams,tycheck, isStatic) {_SC(#name), sq_sqlite3_stmt_##name,nparams,tycheck, isStatic}
  923. static SQRegFunction sq_sqlite3_stmt_methods[] =
  924. {
  925. _DECL_FUNC(constructor, -2, _SC("xxs s|n|b|o"), SQFalse),
  926. _DECL_FUNC(stmt_ptr, 1, _SC("x"), SQFalse),
  927. _DECL_FUNC(get_db, 1, _SC("x"), SQFalse),
  928. _DECL_FUNC(finalize, 1, _SC("x"), SQFalse),
  929. _DECL_FUNC(prepare, -2, _SC("xs s|n|b|o"), SQFalse),
  930. _DECL_FUNC(get_sql, 1, _SC("x"), SQFalse),
  931. _DECL_FUNC(bind, 3, _SC("xi s|n|b|o"), SQFalse),
  932. _DECL_FUNC(bind_empty_null, 3, _SC("xi s|n|b|o"), SQFalse),
  933. _DECL_FUNC(bind_blob, 3, _SC("xis"), SQFalse),
  934. _DECL_FUNC(bind_values, -2, _SC("x s|n|b|o"), SQFalse),
  935. _DECL_FUNC(bind_names, 2, _SC("x t|a"), SQFalse),
  936. _DECL_FUNC(bind_parameter_index, 2, _SC("xs"), SQFalse),
  937. _DECL_FUNC(step, 1, _SC("x"), SQFalse),
  938. _DECL_FUNC(reset, 1, _SC("x"), SQFalse),
  939. _DECL_FUNC(next_row, 1, _SC("x"), SQFalse),
  940. _DECL_FUNC(colsAsArray, 1, _SC("x"), SQFalse),
  941. _DECL_FUNC(colsAsTable, 1, _SC("x"), SQFalse),
  942. _DECL_FUNC(col_count, 1, _SC("x"), SQFalse),
  943. _DECL_FUNC(col_name, 2, _SC("xi"), SQFalse),
  944. _DECL_FUNC(col_type, 2, _SC("xi"), SQFalse),
  945. _DECL_FUNC(col_declared_type, 2, _SC("xi"), SQFalse),
  946. _DECL_FUNC(asArray, -1, _SC("xi"), SQFalse),
  947. _DECL_FUNC(asTable, -1, _SC("xi"), SQFalse),
  948. _DECL_FUNC(asArrayOfArrays, -1, _SC("xi"), SQFalse),
  949. _DECL_FUNC(asArrayOfTables, -1, _SC("xi"), SQFalse),
  950. _DECL_FUNC(asSleArray, 1, _SC("x"), SQFalse),
  951. _DECL_FUNC(col, 2, _SC("x i|s"), SQFalse),
  952. _DECL_FUNC(asString, 2, _SC("x i|s"), SQFalse),
  953. _DECL_FUNC(asStringOrNull, 2, _SC("x i|s"), SQFalse),
  954. _DECL_FUNC(asInteger, 2, _SC("x i|s"), SQFalse),
  955. _DECL_FUNC(asBool, 2, _SC("x i|s"), SQFalse),
  956. _DECL_FUNC(asFloat, 2, _SC("x i|s"), SQFalse),
  957. {0,0}
  958. };
  959. #undef _DECL_FUNC
  960. static SQRESULT sqlite3_exec_fmt(HSQUIRRELVM v, e_type_result type_result, int null_as_empty_str=1){
  961. SQ_FUNC_VARS_NO_TOP(v);
  962. GET_sqlite3_INSTANCE();
  963. SQ_GET_STRING(v, 2, szSQL);
  964. sqlite3_stmt *stmt = 0;
  965. _rc_ = sq_sqlite3_stmt_prepare_aux(v, self, &stmt, 2);
  966. if(_rc_ < 0){
  967. if(stmt) sqlite3_finalize(stmt);
  968. return _rc_;
  969. }
  970. int rc = sqlite3_step(stmt);
  971. if(type_result == tr_ddml) {
  972. if(rc != SQLITE_DONE) {
  973. sqlite3_finalize(stmt);
  974. return sq_throwerror(v, "SQL is not a DDML %d %s", rc, sqlite3_errmsg(self));
  975. }
  976. sq_pushinteger(v, sqlite3_changes(sqlite3_db_handle(stmt)));
  977. }
  978. else
  979. {
  980. if(rc != SQLITE_ROW) {
  981. sqlite3_finalize(stmt);
  982. return sq_throwerror(v, "%d %s", rc, sqlite3_errmsg(self));
  983. }
  984. switch(type_result){
  985. case tr_first_row_first_col:
  986. sqlite3_stmt_push_value(v, stmt, 0, 0);
  987. break;
  988. case tr_first_row:
  989. sqlite3_stmt_row_asArray(v, stmt, NULL_AS_EMPTY_STR|AS_STRING_ALWAYS);
  990. break;
  991. case tr_all_rows:
  992. sqlite3_stmt_asArrayOfArrays(v, stmt, NULL_AS_EMPTY_STR|AS_STRING_ALWAYS);
  993. break;
  994. default:
  995. sqlite3_finalize(stmt);
  996. return sq_throwerror(v, "Unknown requested return type %d", type_result);
  997. }
  998. }
  999. sqlite3_finalize(stmt);
  1000. return 1;
  1001. }
  1002. static SQRESULT sq_sqlite3_close_release(HSQUIRRELVM v, sq_sqlite3_sdb *sdb){
  1003. SQRESULT rc = SQ_ERROR;
  1004. if(sdb){
  1005. if(sqlite3_close_v2(sdb->db) == SQLITE_OK){
  1006. rc = SQ_OK;
  1007. //remove waekref from registrytable
  1008. sq_pushregistrytable(sdb->v);
  1009. sq_pushuserpointer(sdb->v, sdb->db);
  1010. sq_deleteslot(sdb->v, -2, SQFalse);
  1011. sq_poptop(sdb->v);
  1012. if(sdb->func){
  1013. sq_sqlite3_sdb_func *func, *func_next;
  1014. func = sdb->func;
  1015. while (func) {
  1016. func_next = func->next;
  1017. sq_release(sdb->v, &func->fn_step);
  1018. sq_release(sdb->v, &func->fn_finalize);
  1019. sq_release(sdb->v, &func->udata);
  1020. sq_free(func, sizeof(sq_sqlite3_sdb_func));
  1021. func = func_next;
  1022. }
  1023. sdb->func = NULL;
  1024. }
  1025. /* 'free' all references */
  1026. sq_release(sdb->v, &sdb->busy_cb);
  1027. sq_release(sdb->v, &sdb->busy_udata);
  1028. sq_release(sdb->v, &sdb->progress_cb);
  1029. sq_release(sdb->v, &sdb->progress_udata);
  1030. sq_release(sdb->v, &sdb->trace_cb);
  1031. sq_release(sdb->v, &sdb->trace_udata);
  1032. sq_release(sdb->v, &sdb->null_value);
  1033. sq_free(sdb, sizeof(sq_sqlite3_sdb));
  1034. }
  1035. }
  1036. return rc;
  1037. }
  1038. static SQRESULT sq_sqlite3_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  1039. {
  1040. sq_sqlite3_sdb *sdb = ((sq_sqlite3_sdb *)p);
  1041. sq_sqlite3_close_release(v, sdb);
  1042. return 0;
  1043. }
  1044. static SQRESULT sq_sqlite3_constructor(HSQUIRRELVM v)
  1045. {
  1046. SQ_FUNC_VARS(v);
  1047. SQ_GET_STRING(v, 2, dbname);
  1048. SQ_OPT_INTEGER(v, 3, flags, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_SHAREDCACHE | SQLITE_OPEN_SUBLATIN_NA_LIKE);
  1049. sqlite3 *db;
  1050. int rc = sqlite3_open_v2(dbname, &db, flags, 0);
  1051. if(rc != SQLITE_OK) return sq_throwerror(v, "Failed to open database ! %d", rc);
  1052. sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb *)sq_malloc(sizeof(sq_sqlite3_sdb));
  1053. memset(sdb, 0, sizeof(sq_sqlite3_sdb));
  1054. sdb->db = db;
  1055. sdb->v = v;
  1056. sq_resetobject(&sdb->busy_cb);
  1057. sq_resetobject(&sdb->busy_udata);
  1058. sq_resetobject(&sdb->progress_cb);
  1059. sq_resetobject(&sdb->progress_udata);
  1060. sq_resetobject(&sdb->trace_cb);
  1061. sq_resetobject(&sdb->trace_udata);
  1062. sq_resetobject(&sdb->null_value);
  1063. sq_setinstanceup(v, 1, sdb);
  1064. sq_setreleasehook(v,1, sq_sqlite3_releasehook);
  1065. //save a weakref to allow statement return it's db
  1066. sq_pushuserpointer(v, sdb->db);
  1067. sq_weakref(v, 1);
  1068. sq_setonregistrytable(v);
  1069. return 1;
  1070. }
  1071. static SQRESULT sq_sqlite3_close(HSQUIRRELVM v){
  1072. SQ_FUNC_VARS_NO_TOP(v);
  1073. GET_sqlite3_INSTANCE();
  1074. if(sq_sqlite3_close_release(v, sdb) == SQ_OK){
  1075. sq_setinstanceup(v, 1, 0); //next calls will fail with "database is closed"
  1076. }
  1077. else {
  1078. return sq_throwerror(v, sqlite3_errmsg(self));
  1079. }
  1080. return 0;
  1081. }
  1082. static SQRESULT sq_sqlite3_db_ptr(HSQUIRRELVM v){
  1083. SQ_FUNC_VARS_NO_TOP(v);
  1084. GET_sqlite3_INSTANCE();
  1085. sq_pushuserpointer(v, self);
  1086. return 1;
  1087. }
  1088. /* bool IsAutoCommitOn( ) */
  1089. static SQRESULT sq_sqlite3_IsAutoCommitOn(HSQUIRRELVM v){
  1090. SQ_FUNC_VARS_NO_TOP(v);
  1091. GET_sqlite3_INSTANCE();
  1092. sq_pushbool(v, sqlite3_get_autocommit(self) ? SQTrue : SQFalse);
  1093. return 1;
  1094. }
  1095. /* int changes( ) */
  1096. static SQRESULT sq_sqlite3_changes(HSQUIRRELVM v){
  1097. SQ_FUNC_VARS_NO_TOP(v);
  1098. GET_sqlite3_INSTANCE();
  1099. sq_pushinteger(v, sqlite3_total_changes(self));
  1100. return 1;
  1101. }
  1102. static SQRESULT sq_sqlite3_exec(HSQUIRRELVM v){
  1103. return sqlite3_exec_fmt(v, tr_all_rows);
  1104. }
  1105. /* int exec_dml( const char * szSQL ) */
  1106. static SQRESULT sq_sqlite3_exec_dml(HSQUIRRELVM v){
  1107. return sqlite3_exec_fmt(v, tr_ddml);
  1108. }
  1109. /* bool exec_get_one( std::string & result , const char * szSQL ) */
  1110. static SQRESULT sq_sqlite3_exec_get_one(HSQUIRRELVM v){
  1111. return sqlite3_exec_fmt(v, tr_first_row_first_col);
  1112. }
  1113. static SQRESULT sq_sqlite3_exec_get_first_row(HSQUIRRELVM v){
  1114. return sqlite3_exec_fmt(v, tr_first_row);
  1115. }
  1116. /* const char * get_db_name( ) */
  1117. static SQRESULT sq_sqlite3_get_db_name(HSQUIRRELVM v){
  1118. SQ_FUNC_VARS_NO_TOP(v);
  1119. GET_sqlite3_INSTANCE();
  1120. sq_pushstring(v, sqlite3_db_filename(self, "main"), -1);
  1121. return 1;
  1122. }
  1123. /* sqlite3_int64 last_row_id( ) */
  1124. static SQRESULT sq_sqlite3_last_row_id(HSQUIRRELVM v){
  1125. SQ_FUNC_VARS_NO_TOP(v);
  1126. GET_sqlite3_INSTANCE();
  1127. sq_pushinteger(v, sqlite3_last_insert_rowid(self));
  1128. return 1;
  1129. }
  1130. /* stmt * prepare( const char * sql ) */
  1131. static SQRESULT sq_sqlite3_prepare(HSQUIRRELVM v){
  1132. SQ_FUNC_VARS_NO_TOP(v);
  1133. GET_sqlite3_INSTANCE();
  1134. SQ_GET_STRING(v, 2, sql);
  1135. sq_pushstring(v, SQLite3_Stmt_TAG, -1);
  1136. if(sq_getonroottable(v) == SQ_ERROR) return SQ_ERROR;
  1137. sq_pushroottable(v);
  1138. sq_push(v, 1);
  1139. sq_push(v, 2);
  1140. if(sq_call(v, 3, SQTrue, SQFalse) != SQ_OK) return SQ_ERROR;
  1141. return 1;
  1142. }
  1143. /* void set_busy_timeout( int nMillisecs ) */
  1144. static SQRESULT sq_sqlite3_set_busy_timeout(HSQUIRRELVM v){
  1145. SQ_FUNC_VARS_NO_TOP(v);
  1146. GET_sqlite3_INSTANCE();
  1147. SQ_GET_INTEGER(v, 2, nMillisecs);
  1148. //self->set_busy_timeout(nMillisecs);
  1149. return 0;
  1150. }
  1151. /* int total_changes( ) */
  1152. static SQRESULT sq_sqlite3_total_changes(HSQUIRRELVM v){
  1153. SQ_FUNC_VARS_NO_TOP(v);
  1154. GET_sqlite3_INSTANCE();
  1155. sq_pushinteger(v, sqlite3_total_changes(self));
  1156. return 1;
  1157. }
  1158. static SQRESULT sq_sqlite3_enable_shared_cache(HSQUIRRELVM v) {
  1159. SQ_FUNC_VARS_NO_TOP(v);
  1160. SQ_GET_BOOL(v, 2, bhow);
  1161. sq_pushbool(v, sqlite3_enable_shared_cache(bhow) == SQLITE_OK);
  1162. return 1;
  1163. }
  1164. static SQRESULT sq_sqlite3_sleep(HSQUIRRELVM v) {
  1165. SQ_FUNC_VARS_NO_TOP(v);
  1166. SQ_GET_INTEGER(v, 2, n);
  1167. sqlite3_sleep(n);
  1168. return 0;
  1169. }
  1170. static SQRESULT sq_sqlite3_version(HSQUIRRELVM v) {
  1171. sq_pushstring(v, sqlite3_libversion(), -1);
  1172. return 1;
  1173. }
  1174. static SQRESULT sq_sqlite3_errcode(HSQUIRRELVM v) {
  1175. SQ_FUNC_VARS_NO_TOP(v);
  1176. GET_sqlite3_INSTANCE();
  1177. sq_pushinteger(v, sqlite3_errcode(self));
  1178. return 1;
  1179. }
  1180. static SQRESULT sq_sqlite3_errmsg(HSQUIRRELVM v) {
  1181. SQ_FUNC_VARS_NO_TOP(v);
  1182. GET_sqlite3_INSTANCE();
  1183. sq_pushstring(v, sqlite3_errmsg(self), -1);
  1184. return 1;
  1185. }
  1186. #ifndef WIN32
  1187. static SQRESULT sq_sqlite3_temp_directory(HSQUIRRELVM v) {
  1188. SQ_FUNC_VARS(v);
  1189. const char *oldtemp = sqlite3_temp_directory;
  1190. if (_top_ > 1) {
  1191. SQ_GET_STRING(v, 2, temp);
  1192. if (sqlite3_temp_directory) {
  1193. sqlite3_free((char*)sqlite3_temp_directory);
  1194. }
  1195. if (temp && temp_size) {
  1196. sqlite3_temp_directory = sqlite3_mprintf("%s", temp);
  1197. }
  1198. else {
  1199. sqlite3_temp_directory = NULL;
  1200. }
  1201. }
  1202. sq_pushstring(v, oldtemp, -1);
  1203. return 1;
  1204. }
  1205. #endif
  1206. #ifdef SQLITE_HAS_CODEC
  1207. //#include "codecext.h"
  1208. /*
  1209. ** Params: db, sql
  1210. ** returns: code, compiled length or error message
  1211. */
  1212. static SQRESULT sq_sqlite3_key(HSQUIRRELVM v) {
  1213. SQ_FUNC_VARS_NO_TOP(v);
  1214. GET_sqlite3_INSTANCE();
  1215. SQ_GET_STRING(v, 2, key);
  1216. sq_pushinteger(v, sqlite3_key(self, key, key_size));
  1217. return 1;
  1218. }
  1219. /*
  1220. ** Params: db, sql
  1221. ** returns: code, compiled length or error message
  1222. */
  1223. static SQRESULT sq_sqlite3_rekey(HSQUIRRELVM v) {
  1224. SQ_FUNC_VARS_NO_TOP(v);
  1225. GET_sqlite3_INSTANCE();
  1226. SQ_GET_STRING(v, 2, key);
  1227. sq_pushinteger(v, sqlite3_rekey(self, key, key_size));
  1228. return 1;
  1229. }
  1230. #endif
  1231. #if !defined(SQLITE_OMIT_PROGRESS_CALLBACK) || !SQLITE_OMIT_PROGRESS_CALLBACK
  1232. /*
  1233. ** progress handler:
  1234. ** Params: database, number of opcodes, callback function, userdata
  1235. **
  1236. ** callback function:
  1237. ** Params: userdata
  1238. ** returns: 0 to return immediatly and return SQLITE_ABORT, non-zero to continue
  1239. */
  1240. static int db_progress_callback(void *user) {
  1241. int result = 1; /* abort by default */
  1242. sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb*)user;
  1243. HSQUIRRELVM v = sdb->v;
  1244. int top = sq_gettop(v);
  1245. sq_pushobject(v, sdb->progress_cb);
  1246. sq_pushroottable(v); //this
  1247. sq_pushobject(v, sdb->progress_udata);
  1248. /* call lua function */
  1249. if (sq_call(v, 2, SQTrue, SQFalse) == SQ_OK)
  1250. sq_getinteger(v, -1, &result);
  1251. sq_settop(v, top);
  1252. return result;
  1253. }
  1254. static SQRESULT sq_sqlite3_progress_handler(HSQUIRRELVM v) {
  1255. SQ_FUNC_VARS(v);
  1256. GET_sqlite3_INSTANCE();
  1257. if (_top_ < 2 || sq_gettype(v, 2) == OT_NULL) {
  1258. sq_release(v, &sdb->progress_cb);
  1259. sq_release(v, &sdb->progress_udata);
  1260. sq_resetobject(&sdb->progress_cb);
  1261. sq_resetobject(&sdb->progress_udata);
  1262. /* clear busy handler */
  1263. sqlite3_progress_handler(self, 0, NULL, NULL);
  1264. }
  1265. else {
  1266. SQ_GET_INTEGER(v, 2, nop);
  1267. if(sq_gettype(v, 3) != OT_CLOSURE)
  1268. return sq_throwerror(v, _SC("invalid second parameter expected closure"));
  1269. sq_getstackobj(v, 3, &sdb->progress_cb);
  1270. sq_addref(v, &sdb->progress_cb);
  1271. if(_top_ > 3){
  1272. sq_getstackobj(v, 4, &sdb->progress_udata);
  1273. sq_addref(v, &sdb->progress_udata);
  1274. }
  1275. /* set progress callback */
  1276. sqlite3_progress_handler(self, nop, db_progress_callback, sdb);
  1277. }
  1278. return 0;
  1279. }
  1280. #else /* #if !defined(SQLITE_OMIT_PROGRESS_CALLBACK) || !SQLITE_OMIT_PROGRESS_CALLBACK */
  1281. static SQRESULT sq_sqlite3_progress_handler(HSQUIRRELVM v) {
  1282. return sq_throwerror(v, _SC("progress callback support disabled at compile time"));
  1283. return 0;
  1284. }
  1285. #endif /* #if !defined(SQLITE_OMIT_PROGRESS_CALLBACK) || !SQLITE_OMIT_PROGRESS_CALLBACK */
  1286. /*
  1287. ** trace callback:
  1288. ** Params: database, callback function, userdata
  1289. **
  1290. ** callback function:
  1291. ** Params: userdata, sql
  1292. */
  1293. static void db_trace_callback(void *user, const char *sql) {
  1294. sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb*)user;
  1295. HSQUIRRELVM v = sdb->v;
  1296. int top = sq_gettop(v);
  1297. /* setup squirrel callback call */
  1298. sq_pushobject(v, sdb->trace_cb);
  1299. sq_pushroottable(v);
  1300. sq_pushobject(v, sdb->trace_udata);
  1301. sq_pushstring(v, sql, -1); /* traced sql statement */
  1302. /* call squirrel function */
  1303. sq_call(v, 3, SQFalse, SQFalse);
  1304. /* ignore any error generated by this function */
  1305. sq_settop(v, top);
  1306. }
  1307. static SQRESULT sq_sqlite3_trace(HSQUIRRELVM v) {
  1308. SQ_FUNC_VARS(v);
  1309. GET_sqlite3_INSTANCE();
  1310. if (_top_ < 2 || sq_gettype(v, 2) == OT_NULL) {
  1311. sq_release(v, &sdb->trace_cb);
  1312. sq_release(v, &sdb->trace_udata);
  1313. sq_resetobject(&sdb->trace_cb);
  1314. sq_resetobject(&sdb->trace_udata);
  1315. /* clear trace handler */
  1316. sqlite3_trace(self, NULL, NULL);
  1317. }
  1318. else {
  1319. if(sq_gettype(v, 2) != OT_CLOSURE)
  1320. return sq_throwerror(v, _SC("invalid fisrt parameter expected closure"));
  1321. sq_getstackobj(v, 2, &sdb->trace_cb);
  1322. sq_addref(v, &sdb->trace_cb);
  1323. if(_top_ > 2){
  1324. sq_getstackobj(v, 3, &sdb->trace_udata);
  1325. sq_addref(v, &sdb->trace_udata);
  1326. }
  1327. /* set trace callback */
  1328. sqlite3_trace(self, db_trace_callback, sdb);
  1329. }
  1330. return 0;
  1331. }
  1332. /*
  1333. ** busy handler:
  1334. ** Params: database, callback function, userdata
  1335. **
  1336. ** callback function:
  1337. ** Params: userdata, number of tries
  1338. ** returns: 0 to return immediatly and return SQLITE_BUSY, non-zero to try again
  1339. */
  1340. static int db_busy_callback(void *user, int tries) {
  1341. SQBool retry = SQFalse; /* abort by default */
  1342. sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb*)user;
  1343. HSQUIRRELVM v = sdb->v;
  1344. int top = sq_gettop(v);
  1345. sq_pushobject(v, sdb->busy_cb);
  1346. sq_pushroottable(v);
  1347. sq_pushobject(v, sdb->busy_udata);
  1348. sq_pushinteger(v, tries);
  1349. /* call lua function */
  1350. if (sq_call(v, 3, SQTrue, SQFalse) == SQ_OK)
  1351. sq_getbool(v, -1, &retry);
  1352. sq_settop(v, top);
  1353. return retry == SQTrue;
  1354. }
  1355. static SQRESULT sq_sqlite3_busy_handler(HSQUIRRELVM v) {
  1356. SQ_FUNC_VARS(v);
  1357. GET_sqlite3_INSTANCE();
  1358. if (_top_ < 2 || sq_gettype(v, 2) == OT_NULL) {
  1359. sq_release(v, &sdb->busy_cb);
  1360. sq_release(v, &sdb->busy_udata);
  1361. sq_resetobject(&sdb->busy_cb);
  1362. sq_resetobject(&sdb->busy_udata);
  1363. /* clear busy handler */
  1364. sqlite3_busy_handler(self, NULL, NULL);
  1365. }
  1366. else {
  1367. if(sq_gettype(v, 2) != OT_CLOSURE)
  1368. return sq_throwerror(v, _SC("invalid fisrt parameter expected closure"));
  1369. sq_getstackobj(v, 2, &sdb->busy_cb);
  1370. sq_addref(v, &sdb->busy_cb);
  1371. if(_top_ > 2){
  1372. sq_getstackobj(v, 3, &sdb->busy_udata);
  1373. sq_addref(v, &sdb->busy_udata);
  1374. }
  1375. /* set busy callback */
  1376. sqlite3_busy_handler(self, db_busy_callback, sdb);
  1377. }
  1378. return 0;
  1379. }
  1380. static SQRESULT sq_sqlite3_busy_timeout(HSQUIRRELVM v) {
  1381. SQ_FUNC_VARS_NO_TOP(v);
  1382. GET_sqlite3_INSTANCE();
  1383. SQ_GET_INTEGER(v, 2, timeout);
  1384. sqlite3_busy_timeout(self, timeout);
  1385. /* if there was a timeout callback registered, it is now
  1386. ** invalid/useless. free any references we may have */
  1387. sq_release(v, &sdb->busy_cb);
  1388. sq_resetobject(&sdb->busy_cb);
  1389. sq_release(v, &sdb->busy_udata);
  1390. sq_resetobject(&sdb->busy_udata);
  1391. return 0;
  1392. }
  1393. static SQRESULT sq_sqlite3_interrupt(HSQUIRRELVM v) {
  1394. SQ_FUNC_VARS_NO_TOP(v);
  1395. GET_sqlite3_INSTANCE();
  1396. sqlite3_interrupt(self);
  1397. return 0;
  1398. }
  1399. /*
  1400. ** =======================================================
  1401. ** User Defined Functions - Context Methods
  1402. ** =======================================================
  1403. */
  1404. typedef struct {
  1405. sqlite3_context *ctx;
  1406. HSQOBJECT udata;
  1407. } sq_sqlite3_context_st;
  1408. static const SQChar sq_sqlite3_context_TAG[] = _SC(":sqlite3:ctx");
  1409. static SQRESULT sq_sqlite3_context_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  1410. {
  1411. sq_sqlite3_context_st *ctx = ((sq_sqlite3_context_st *)p);
  1412. /* 'free' all references */
  1413. sq_free(ctx, sizeof(sq_sqlite3_context_st));
  1414. return 0;
  1415. }
  1416. static SQRESULT sq_sqlite3_context_constructor(HSQUIRRELVM v) {
  1417. sq_sqlite3_context_st *ctx = (sq_sqlite3_context_st*)sq_malloc(sizeof(sq_sqlite3_context_st));
  1418. ctx->ctx = NULL;
  1419. sq_resetobject(&ctx->udata);
  1420. sq_setinstanceup(v, 1, ctx);
  1421. sq_setreleasehook(v,1, sq_sqlite3_context_releasehook);
  1422. return 1;
  1423. }
  1424. #define SQ_SQLITE3_GETCONTEXT(v, idx) \
  1425. sq_sqlite3_context_st *self;\
  1426. if((_rc_ = sq_getinstanceup(v, idx, (void**)&self, (void*)sq_sqlite3_context_TAG)) < 0) return _rc_;
  1427. #define GET_sqlite3_context_INSTANCE() SQ_SQLITE3_GETCONTEXT(v,1)
  1428. static SQRESULT sq_sqlite3_context__tostring(HSQUIRRELVM v) {
  1429. SQ_FUNC_VARS_NO_TOP(v);
  1430. GET_sqlite3_context_INSTANCE();
  1431. char buff[64];
  1432. snprintf(buff, sizeof(buff), "sqlite function context (%p)", self);
  1433. sq_pushstring(v, buff, -1);
  1434. return 1;
  1435. }
  1436. static SQRESULT sq_sqlite3_context_check_aggregate(HSQUIRRELVM v, sq_sqlite3_context_st *ctx) {
  1437. sq_sqlite3_sdb_func *func = (sq_sqlite3_sdb_func*)sqlite3_user_data(ctx->ctx);
  1438. if (sq_isclosure(func->fn_finalize)) {
  1439. return sq_throwerror(v, "attempt to call aggregate method from scalar function");
  1440. }
  1441. return 1;
  1442. }
  1443. static SQRESULT sq_sqlite3_context_user_data(HSQUIRRELVM v) {
  1444. SQ_FUNC_VARS_NO_TOP(v);
  1445. GET_sqlite3_context_INSTANCE();
  1446. sq_sqlite3_sdb_func *func = (sq_sqlite3_sdb_func*)sqlite3_user_data(self->ctx);
  1447. sq_pushobject(v, func->udata);
  1448. return 1;
  1449. }
  1450. static SQRESULT sq_sqlite3_context_aggregate_data(HSQUIRRELVM v) {
  1451. SQ_FUNC_VARS(v);
  1452. GET_sqlite3_context_INSTANCE();
  1453. sq_sqlite3_context_check_aggregate(v, self);
  1454. if(_top_ < 2){
  1455. sq_pushobject(v, self->udata);
  1456. }
  1457. else
  1458. {
  1459. sq_release(v, &self->udata);
  1460. sq_getstackobj(v, 2, &self->udata);
  1461. sq_addref(v, &self->udata);
  1462. }
  1463. return 0;
  1464. }
  1465. static SQRESULT sq_sqlite3_context_aggregate_count(HSQUIRRELVM v) {
  1466. SQ_FUNC_VARS_NO_TOP(v);
  1467. GET_sqlite3_context_INSTANCE();
  1468. sq_sqlite3_context_check_aggregate(v, self);
  1469. sq_pushinteger(v, sqlite3_aggregate_count(self->ctx));
  1470. return 1;
  1471. }
  1472. #if 0
  1473. void *sqlite3_get_auxdata(sqlite3_context*, int);
  1474. void sqlite3_set_auxdata(sqlite3_context*, int, void*, void (*)(void*));
  1475. #endif
  1476. static SQRESULT sq_sqlite3_context_result_blob(HSQUIRRELVM v) {
  1477. SQ_FUNC_VARS_NO_TOP(v);
  1478. GET_sqlite3_context_INSTANCE();
  1479. SQ_GET_STRING(v, 2, blob);
  1480. sqlite3_result_blob(self->ctx, (const void*)blob, blob_size, SQLITE_TRANSIENT);
  1481. return 0;
  1482. }
  1483. static SQRESULT sq_sqlite3_context_result_double(HSQUIRRELVM v) {
  1484. SQ_FUNC_VARS_NO_TOP(v);
  1485. GET_sqlite3_context_INSTANCE();
  1486. SQ_GET_FLOAT(v, 2, d);
  1487. sqlite3_result_double(self->ctx, d);
  1488. return 0;
  1489. }
  1490. static SQRESULT sq_sqlite3_context_result_error(HSQUIRRELVM v) {
  1491. SQ_FUNC_VARS_NO_TOP(v);
  1492. GET_sqlite3_context_INSTANCE();
  1493. SQ_GET_STRING(v,2, err);
  1494. sqlite3_result_error(self->ctx, err, err_size);
  1495. return 0;
  1496. }
  1497. static SQRESULT sq_sqlite3_context_result_int(HSQUIRRELVM v) {
  1498. SQ_FUNC_VARS_NO_TOP(v);
  1499. GET_sqlite3_context_INSTANCE();
  1500. SQ_GET_INTEGER(v, 2, i);
  1501. sqlite3_result_int(self->ctx, i);
  1502. return 0;
  1503. }
  1504. static SQRESULT sq_sqlite3_context_result_null(HSQUIRRELVM v) {
  1505. SQ_FUNC_VARS_NO_TOP(v);
  1506. GET_sqlite3_context_INSTANCE();
  1507. sqlite3_result_null(self->ctx);
  1508. return 0;
  1509. }
  1510. static SQRESULT sq_sqlite3_context_result_text(HSQUIRRELVM v) {
  1511. SQ_FUNC_VARS_NO_TOP(v);
  1512. GET_sqlite3_context_INSTANCE();
  1513. SQ_GET_STRING(v, 2, text);
  1514. sqlite3_result_text(self->ctx, text, text_size, SQLITE_TRANSIENT);
  1515. return 0;
  1516. }
  1517. #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name), sq_sqlite3_context_##name,nparams,tycheck}
  1518. static SQRegFunction sq_sqlite3_context_methods[] =
  1519. {
  1520. _DECL_FUNC(constructor, 1, _SC("x")),
  1521. _DECL_FUNC(user_data, 1, _SC("x")),
  1522. _DECL_FUNC(aggregate_data, -1, _SC("x.")),
  1523. _DECL_FUNC(aggregate_count, 1, _SC("x")),
  1524. _DECL_FUNC(result_null, 1, _SC("x")),
  1525. _DECL_FUNC(result_double, 2, _SC("xn")),
  1526. _DECL_FUNC(result_int, 2, _SC("xi")),
  1527. _DECL_FUNC(result_text, 2, _SC("xs")),
  1528. _DECL_FUNC(result_blob, 2, _SC("xs")),
  1529. _DECL_FUNC(result_error, 2, _SC("xs")),
  1530. _DECL_FUNC(_tostring, -1, _SC("x")),
  1531. {0,0}
  1532. };
  1533. #undef _DECL_FUNC
  1534. /*
  1535. ** callback functions used when calling registered sql functions
  1536. */
  1537. static void sqlite3_push_value(HSQUIRRELVM v, sqlite3_value *value) {
  1538. const char *tmp_value;
  1539. switch (sqlite3_value_type(value)) {
  1540. case SQLITE_TEXT:
  1541. tmp_value = (const char*) sqlite3_value_text(value);
  1542. if(tmp_value) sq_pushstring(v, tmp_value, sqlite3_value_bytes(value));
  1543. else push_sqlite3_null(v);
  1544. break;
  1545. case SQLITE_INTEGER:
  1546. {
  1547. sqlite_int64 i64 = sqlite3_value_int64(value);
  1548. SQInteger n = (SQInteger)i64;
  1549. if (n == i64)
  1550. sq_pushinteger(v, n);
  1551. else
  1552. sq_pushstring(v, (const char*) sqlite3_value_text(value), sqlite3_value_bytes(value));
  1553. }
  1554. break;
  1555. case SQLITE_FLOAT:
  1556. sq_pushfloat(v, sqlite3_value_double(value));
  1557. break;
  1558. case SQLITE_BLOB:
  1559. tmp_value = (const char*) sqlite3_value_blob(value);
  1560. if(tmp_value) sq_pushstring(v, tmp_value, sqlite3_value_bytes(value));
  1561. else push_sqlite3_null(v);
  1562. break;
  1563. case SQLITE_NULL:
  1564. push_sqlite3_null(v);
  1565. break;
  1566. default:
  1567. /* things done properly (SQLite + Lua SQLite)
  1568. ** this should never happen */
  1569. push_sqlite3_null(v);
  1570. break;
  1571. }
  1572. }
  1573. //#if 0
  1574. static SQRESULT new_context_instance(HSQUIRRELVM v, sq_sqlite3_context_st **ctx){
  1575. sq_pushregistrytable(v);
  1576. sq_pushstring(v,_SC("sqite3_context"),-1);
  1577. int rc = sq_rawget(v, -2);
  1578. sq_remove(v, -2); //remove registrytable
  1579. sq_pushroottable(v);
  1580. rc = sq_call(v, 1, SQTrue, SQFalse);
  1581. sq_remove(v, -2); //class
  1582. rc = sq_getinstanceup(v, -1, (void**)ctx, (void*)sq_sqlite3_context_TAG);
  1583. return rc;
  1584. }
  1585. /* scalar function to be called
  1586. ** callback params: context, values... */
  1587. static void db_sql_normal_function(sqlite3_context *context, int argc, sqlite3_value **argv) {
  1588. sq_sqlite3_sdb_func *func = (sq_sqlite3_sdb_func*)sqlite3_user_data(context);
  1589. HSQUIRRELVM v = func->sdb->v;
  1590. int n;
  1591. sq_sqlite3_context_st *ctx;
  1592. int top = sq_gettop(v);
  1593. /* ensure there is enough space in the stack */
  1594. sq_reservestack(v, argc + 5);
  1595. sq_pushobject(v, func->fn_step);
  1596. sq_pushroottable(v);
  1597. if (!sq_isclosure(func->fn_finalize)) {
  1598. new_context_instance(v, &ctx);
  1599. }
  1600. else {
  1601. /* reuse context userdata value */
  1602. void *p = sqlite3_aggregate_context(context, 1);
  1603. /* i think it is OK to use assume that using a light user data
  1604. ** as an entry on LUA REGISTRY table will be unique */
  1605. sq_pushregistrytable(v);
  1606. sq_pushuserpointer(v, p);
  1607. /* context table */
  1608. if(sq_rawget(v, -2) != SQ_OK){
  1609. /* not yet created? */
  1610. sq_poptop(v); //remove null
  1611. new_context_instance(v, &ctx);
  1612. sq_pushuserpointer(v, p);
  1613. sq_push(v, -2);
  1614. sq_rawset(v, -4); //insert into registrytable
  1615. }
  1616. sq_remove(v, -2); //remove registrytable
  1617. }
  1618. /* push params */
  1619. for (n = 0; n < argc; ++n) {
  1620. sqlite3_push_value(v, argv[n]);
  1621. }
  1622. /* set context */
  1623. ctx->ctx = context;
  1624. if (sq_call(v, argc + 2, SQFalse, SQFalse) != SQ_OK) { //2 = roottable + ctx
  1625. sqlite3_result_error(context, sq_getlasterror_str(v), -1);
  1626. }
  1627. /* invalidate context */
  1628. ctx->ctx = NULL;
  1629. if (!sq_isclosure(func->fn_finalize)) {
  1630. sq_release(v, &ctx->udata);
  1631. sq_resetobject(&ctx->udata);
  1632. }
  1633. sq_settop(v, top);
  1634. }
  1635. static void db_sql_finalize_function(sqlite3_context *context) {
  1636. sq_sqlite3_sdb_func *func = (sq_sqlite3_sdb_func*)sqlite3_user_data(context);
  1637. HSQUIRRELVM v = func->sdb->v;
  1638. void *p = sqlite3_aggregate_context(context, 1); /* minimal mem usage */
  1639. sq_sqlite3_context_st *ctx;
  1640. int top = sq_gettop(v);
  1641. sq_pushobject(v, func->fn_finalize);
  1642. sq_pushroottable(v);
  1643. /* i think it is OK to use assume that using a light user data
  1644. ** as an entry on LUA REGISTRY table will be unique */
  1645. sq_pushregistrytable(v);
  1646. sq_pushuserpointer(v, p);
  1647. /* remove it from registry but we'll use it last time here */
  1648. /* context table */
  1649. if(sq_deleteslot(v, -2, SQTrue) != SQ_OK){
  1650. /* not yet created? - shouldn't happen in finalize function */
  1651. sq_pop(v, 1);
  1652. new_context_instance(v, &ctx);
  1653. sq_pushuserpointer(v, p);
  1654. sq_push(v, -2);
  1655. sq_rawset(v, -4);
  1656. }
  1657. sq_remove(v, -2); //registrytable
  1658. /* set context */
  1659. ctx->ctx = context;
  1660. if (sq_call(v, 1, SQFalse, SQFalse) != SQ_OK) {
  1661. sqlite3_result_error(context, sq_getlasterror_str(v), -1);
  1662. }
  1663. /* invalidate context */
  1664. ctx->ctx = NULL;
  1665. /* cleanup context */
  1666. sq_release(v, &ctx->udata);
  1667. sq_resetobject(&ctx->udata);
  1668. sq_settop(v, top);
  1669. }
  1670. /*
  1671. ** Register a normal function
  1672. ** Params: db, function name, number arguments, [ callback | step, finalize], user data
  1673. ** Returns: true on sucess
  1674. **
  1675. ** Normal function:
  1676. ** Params: context, params
  1677. **
  1678. ** Aggregate function:
  1679. ** Params of step: context, params
  1680. ** Params of finalize: context
  1681. */
  1682. static SQRESULT db_register_function(HSQUIRRELVM v, int aggregate) {
  1683. SQ_FUNC_VARS(v);
  1684. GET_sqlite3_INSTANCE();
  1685. SQ_GET_STRING(v, 2, name);
  1686. SQ_GET_INTEGER(v, 3, nargs);
  1687. if(sq_gettype(v, 4) != OT_CLOSURE)
  1688. return sq_throwerror(v, "invalid parameter 3 expected closure");
  1689. if (aggregate) {
  1690. if(sq_gettype(v,5) != OT_CLOSURE)
  1691. return sq_throwerror(v, "invalid parameter 4 expected closure");
  1692. }
  1693. sq_sqlite3_sdb_func *func;
  1694. /* maybe an alternative way to allocate memory should be used/avoided */
  1695. func = (sq_sqlite3_sdb_func*)sq_malloc(sizeof(sq_sqlite3_sdb_func));
  1696. memset(func, 0, sizeof(sq_sqlite3_sdb_func));
  1697. _rc_ = sqlite3_create_function(
  1698. self, name, nargs, SQLITE_UTF8, func,
  1699. aggregate ? NULL : db_sql_normal_function,
  1700. aggregate ? db_sql_normal_function : NULL,
  1701. aggregate ? db_sql_finalize_function : NULL
  1702. );
  1703. if (_rc_ == SQLITE_OK) {
  1704. /* save registered function in db function list */
  1705. func->sdb = sdb;
  1706. func->next = sdb->func;
  1707. sdb->func = func;
  1708. /* save the setp/normal function callback */
  1709. sq_resetobject(&func->fn_step);
  1710. sq_getstackobj(v, 4, &func->fn_step);
  1711. sq_addref(v, &func->fn_step);
  1712. /* save the finalize function callback */
  1713. sq_resetobject(&func->fn_finalize);
  1714. if (aggregate) {
  1715. sq_getstackobj(v, 5, &func->fn_finalize);
  1716. sq_addref(v, &func->fn_finalize);
  1717. }
  1718. /* save user data */
  1719. sq_resetobject(&func->udata);
  1720. int udata_idx = aggregate ? 6 : 5;
  1721. if(_top_ >= udata_idx){
  1722. sq_getstackobj(v, udata_idx, &func->udata);
  1723. sq_addref(v, &func->udata);
  1724. }
  1725. }
  1726. else {
  1727. /* free allocated memory */
  1728. sq_free(func, sizeof(sq_sqlite3_sdb_func));
  1729. }
  1730. sq_pushbool(v, _rc_ == SQLITE_OK ? 1 : 0);
  1731. return 1;
  1732. }
  1733. //#endif
  1734. static SQRESULT sq_sqlite3_create_function(HSQUIRRELVM v) {
  1735. return db_register_function(v, 0);
  1736. }
  1737. static SQRESULT sq_sqlite3_create_aggregate(HSQUIRRELVM v) {
  1738. return db_register_function(v, 1);
  1739. }
  1740. #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name), sq_sqlite3_##name,nparams,tycheck}
  1741. static SQRegFunction sq_sqlite3_methods[] =
  1742. {
  1743. _DECL_FUNC(constructor, -2, _SC("xsi")),
  1744. _DECL_FUNC(close, 1, _SC("x")),
  1745. _DECL_FUNC(db_ptr, 1, _SC("x")),
  1746. _DECL_FUNC(IsAutoCommitOn, 1, _SC("x")),
  1747. _DECL_FUNC(close, 1, _SC("x")),
  1748. _DECL_FUNC(version, 1, _SC("x")),
  1749. _DECL_FUNC(errcode, 1, _SC("x")),
  1750. _DECL_FUNC(errmsg, 1, _SC("x")),
  1751. _DECL_FUNC(sleep, 1, _SC("x")),
  1752. _DECL_FUNC(interrupt, 1, _SC("x")),
  1753. _DECL_FUNC(progress_handler, -2, _SC("x i|o c .")),
  1754. _DECL_FUNC(trace, -2, _SC("x c|o .")),
  1755. _DECL_FUNC(busy_handler, -2, _SC("x c|o .")),
  1756. _DECL_FUNC(busy_timeout, 2, _SC("xi")),
  1757. _DECL_FUNC(create_function, 4, _SC("xsic")),
  1758. _DECL_FUNC(create_aggregate, 5, _SC("xsicc")),
  1759. #ifndef WIN32
  1760. _DECL_FUNC(temp_directory, 2, _SC("xs")),
  1761. #endif
  1762. _DECL_FUNC(enable_shared_cache, 2, _SC("xb")),
  1763. _DECL_FUNC(changes, 1, _SC("x")),
  1764. _DECL_FUNC(exec, 2, _SC("xs")),
  1765. _DECL_FUNC(exec_dml, 2, _SC("xs")),
  1766. _DECL_FUNC(exec_get_first_row, 2, _SC("xs")),
  1767. _DECL_FUNC(exec_get_one, 2, _SC("xs")),
  1768. _DECL_FUNC(get_db_name, 1, _SC("x")),
  1769. _DECL_FUNC(last_row_id, 1, _SC("x")),
  1770. _DECL_FUNC(prepare, 2, _SC("xs")),
  1771. _DECL_FUNC(set_busy_timeout, -1, _SC("xi")),
  1772. _DECL_FUNC(total_changes, 1, _SC("x")),
  1773. #ifdef SQLITE_HAS_CODEC
  1774. _DECL_FUNC(key, 2, _SC("xs")),
  1775. _DECL_FUNC(rekey, 2, _SC("xs")),
  1776. #endif
  1777. {0,0}
  1778. };
  1779. #undef _DECL_FUNC
  1780. #define INT_CONST(v,num) sq_pushstring(v,_SC(#num),-1);sq_pushinteger(v,num);sq_newslot(v,-3,SQTrue);
  1781. #ifdef __cplusplus
  1782. extern "C" {
  1783. #endif
  1784. SQRESULT sqext_register_SQLite3(HSQUIRRELVM v)
  1785. {
  1786. sq_insertfunc(v, _SC("sle2vecOfvec"), sq_sle2vecOfvec, -2, _SC(". s|x a i"), SQTrue);
  1787. sq_insertfunc(v, _SC("get_sle_size"), sq_get_sle_size, -2, _SC(".i"), SQTrue);
  1788. sq_insertfunc(v, _SC("add2sle"), sq_add2sle, -3, _SC(".xsi"), SQTrue);
  1789. sq_pushconsttable(v);
  1790. #define INT_SLE_CONST(num) sq_pushstring(v,_SC("SLE_" #num),-1);sq_pushinteger(v,num);sq_newslot(v,-3,SQTrue);
  1791. INT_SLE_CONST(IBYTE1);
  1792. INT_SLE_CONST(IBYTE2);
  1793. INT_SLE_CONST(IBYTE3);
  1794. INT_SLE_CONST(IBYTE4);
  1795. INT_SLE_CONST(SIZE1BYTE);
  1796. INT_SLE_CONST(SIZE2BYTE);
  1797. INT_SLE_CONST(SIZE3BYTE);
  1798. INT_SLE_CONST(SIZE4BYTE);
  1799. INT_SLE_CONST(SLEMARK);
  1800. INT_SLE_CONST(SLEEND);
  1801. sq_poptop(v); //remove const table
  1802. HSQOBJECT sqlite3_NULL;
  1803. sq_pushregistrytable(v);
  1804. sq_pushstring(v, sqlite3_NULL_Name,-1);
  1805. sq_newuserdata(v, sizeof(void*));
  1806. sq_resetobject(&sqlite3_NULL);
  1807. sq_getstackobj(v, -1, &sqlite3_NULL);
  1808. sq_newtable(v);
  1809. sq_insert_reg_funcs(v, sqlite3_NULL_methods);
  1810. sq_setdelegate(v, -2);
  1811. sq_newslot(v,-3,SQTrue);
  1812. sq_pushstring(v,_SC("sqite3_context"),-1);
  1813. sq_newclass(v,SQFalse);
  1814. sq_settypetag(v,-1,(void*)sq_sqlite3_context_TAG);
  1815. sq_insert_reg_funcs(v, sq_sqlite3_context_methods);
  1816. sq_newslot(v,-3,SQTrue);
  1817. sq_poptop(v); //remove registrytable
  1818. sq_pushstring(v,SQLite3_TAG,-1);
  1819. sq_newclass(v,SQFalse);
  1820. sq_settypetag(v,-1,(void*)SQLite3_TAG);
  1821. sq_insert_reg_funcs(v, sq_sqlite3_methods);
  1822. INT_CONST(v,SQLITE_OPEN_CREATE);
  1823. INT_CONST(v,SQLITE_OPEN_READWRITE);
  1824. INT_CONST(v,SQLITE_OPEN_SHAREDCACHE);
  1825. INT_CONST(v,SQLITE_OPEN_SUBLATIN_NA_LIKE);
  1826. INT_CONST(v,SQLITE_OK);
  1827. INT_CONST(v,SQLITE_INTERRUPT);
  1828. //push sqlite3_NULL as a member
  1829. sq_pushstring(v, nullName,-1);
  1830. sq_pushobject(v, sqlite3_NULL);
  1831. sq_newslot(v,-3,SQTrue);
  1832. sq_newslot(v,-3,SQTrue);
  1833. sq_pushstring(v, SQLite3_Stmt_TAG,-1);
  1834. sq_newclass(v,SQFalse);
  1835. sq_settypetag(v,-1,(void*)SQLite3_Stmt_TAG);
  1836. sq_insert_reg_funcs(v, sq_sqlite3_stmt_methods);
  1837. INT_CONST(v,SQLITE_OK);
  1838. INT_CONST(v,SQLITE_ROW);
  1839. INT_CONST(v,SQLITE_DONE);
  1840. INT_CONST(v,AS_STRING_ALWAYS);
  1841. INT_CONST(v,NULL_AS_EMPTY_STR);
  1842. INT_CONST(v,WITH_COL_NAMES);
  1843. //push sqlite3_NULL as a member
  1844. sq_pushstring(v, nullName,-1);
  1845. sq_pushobject(v, sqlite3_NULL);
  1846. sq_newslot(v,-3,SQTrue);
  1847. sq_newslot(v,-3,SQTrue);
  1848. return 1;
  1849. }
  1850. #ifdef __cplusplus
  1851. }
  1852. #endif