sq_unql.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. /* Code generated by script */
  2. #include "sq_sqlite3.h"
  3. extern "C" {
  4. #include "xjd1.h"
  5. }
  6. static const SQChar *xjd1_TAG = "xjd1";
  7. static const SQChar *xjd1_Stmt_TAG = "xjd1Stmt";
  8. static SQRESULT get_xjd1_instance(HSQUIRRELVM v, SQInteger idx, xjd1 **db)
  9. {
  10. SQRESULT _rc_;
  11. if((_rc_ = sq_getinstanceup(v,idx,(SQUserPointer*)db,(void*)xjd1_TAG)) < 0) return _rc_;
  12. if(!*db) return sq_throwerror(v, _SC("database is closed"));
  13. return _rc_;
  14. }
  15. static SQRESULT get_xjd1_stmt_instance(HSQUIRRELVM v, SQInteger idx, xjd1_stmt **stmt)
  16. {
  17. SQRESULT _rc_;
  18. if((_rc_ = sq_getinstanceup(v,idx,(SQUserPointer*)stmt,(void*)xjd1_Stmt_TAG)) < 0) return _rc_;
  19. if(!*stmt) return sq_throwerror(v, _SC("statement is closed"));
  20. return _rc_;
  21. }
  22. static SQRESULT get_sqlite3_instance(HSQUIRRELVM v, SQInteger idx, sq_sqlite3_sdb **sdb)
  23. {
  24. SQRESULT _rc_;
  25. if((_rc_ = sq_getinstanceup(v,idx,(SQUserPointer*)sdb,(void*)SQLite3_TAG)) < 0) return _rc_;
  26. if(!*sdb) return sq_throwerror(v, _SC("database is closed"));
  27. return _rc_;
  28. }
  29. #define push_xjd1_null(v) {sq_pushstring(v, nullName, sizeof(nullName)-1);sq_get(v, 1);}
  30. #define GET_xjd1_INSTANCE_AT(idx) \
  31. xjd1 *self=NULL; \
  32. if((_rc_ = get_xjd1_instance(v,idx,&self)) < 0) return _rc_;
  33. #define GET_xjd1_INSTANCE() GET_xjd1_INSTANCE_AT(1)
  34. #define GET_xjd1_stmt_INSTANCE() \
  35. xjd1_stmt *self=NULL; \
  36. if((_rc_ = get_xjd1_stmt_instance(v,1,&self)) < 0) return _rc_;
  37. static SQRESULT sq_xjd1_stmt_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
  38. {
  39. xjd1_stmt *stmt = ((xjd1_stmt *)p);
  40. if(stmt) xjd1_stmt_delete(stmt);
  41. return 0;
  42. }
  43. static SQRESULT sq_xjd1_stmt_constructor(HSQUIRRELVM v)
  44. {
  45. SQ_FUNC_VARS_NO_TOP(v);
  46. _rc_ = SQ_ERROR;
  47. GET_xjd1_INSTANCE_AT(2);
  48. SQ_GET_STRING(v, 3, sql);
  49. xjd1_stmt *stmt = 0;
  50. if(xjd1_stmt_new(self, sql, &stmt, 0) != XJD1_OK)
  51. {
  52. return sq_throwerror(v, xjd1_errmsg(self));
  53. }
  54. sq_setinstanceup(v, 1, stmt); //replace self for this instance with this new sqlite3_stmt
  55. sq_setreleasehook(v,1, sq_xjd1_stmt_releasehook);
  56. return SQ_OK;
  57. }
  58. static SQRESULT sq_xjd1_stmt_finalize(HSQUIRRELVM v)
  59. {
  60. SQ_FUNC_VARS_NO_TOP(v);
  61. GET_xjd1_stmt_INSTANCE();
  62. sq_setinstanceup(v, 1, 0); //next calls will fail with "statement is closed"
  63. sq_pushinteger(v, xjd1_stmt_delete(self));
  64. return 1;
  65. }
  66. static SQRESULT sq_xjd1_stmt_step(HSQUIRRELVM v)
  67. {
  68. SQ_FUNC_VARS_NO_TOP(v);
  69. GET_xjd1_stmt_INSTANCE();
  70. sq_pushinteger(v, xjd1_stmt_step(self));
  71. return 1;
  72. }
  73. static SQRESULT sq_xjd1_stmt_next_row(HSQUIRRELVM v)
  74. {
  75. SQ_FUNC_VARS_NO_TOP(v);
  76. GET_xjd1_stmt_INSTANCE();
  77. sq_pushbool(v, xjd1_stmt_step(self) == XJD1_ROW);
  78. return 1;
  79. }
  80. static SQRESULT sq_xjd1_stmt_rewind(HSQUIRRELVM v)
  81. {
  82. SQ_FUNC_VARS_NO_TOP(v);
  83. GET_xjd1_stmt_INSTANCE();
  84. sq_pushinteger(v, xjd1_stmt_rewind(self));
  85. return 1;
  86. }
  87. static SQRESULT sq_xjd1_stmt_value(HSQUIRRELVM v)
  88. {
  89. SQ_FUNC_VARS_NO_TOP(v);
  90. GET_xjd1_stmt_INSTANCE();
  91. const char* value;
  92. int rc = xjd1_stmt_value(self, &value);
  93. if(rc == XJD1_OK) sq_pushstring(v, value, -1);
  94. else return sq_throwerror(v, _SC("Erro when getting value from xjd1_stmt -> %d"), rc);
  95. return 1;
  96. }
  97. #define _DECL_FUNC(name,nparams,tycheck, isStatic) {_SC(#name), sq_xjd1_stmt_##name,nparams,tycheck, isStatic}
  98. static SQRegFunction sq_xjd1_stmt_methods[] =
  99. {
  100. _DECL_FUNC(constructor, 3, _SC("xxs"), SQFalse),
  101. _DECL_FUNC(finalize, 1, _SC("x"), SQFalse),
  102. _DECL_FUNC(step, 1, _SC("x"), SQFalse),
  103. _DECL_FUNC(next_row, 1, _SC("x"), SQFalse),
  104. _DECL_FUNC(rewind, 1, _SC("x"), SQFalse),
  105. _DECL_FUNC(value, 1, _SC("x"), SQFalse),
  106. {0,0}
  107. };
  108. #undef _DECL_FUNC
  109. static SQRESULT sq_xjd1_close_release(HSQUIRRELVM v, xjd1 *db)
  110. {
  111. SQRESULT rc = SQ_ERROR;
  112. if(db)
  113. {
  114. int close_rc = xjd1_close(db) == XJD1_OK;
  115. if(!v || (v && close_rc))
  116. {
  117. rc = SQ_OK;
  118. }
  119. else
  120. {
  121. if(v) return sq_throwerror(v, xjd1_errmsg(db));
  122. }
  123. }
  124. return rc;
  125. }
  126. static SQRESULT sq_xjd1_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
  127. {
  128. xjd1 *db = ((xjd1 *)p);
  129. sq_xjd1_close_release(0, db);
  130. return 0;
  131. }
  132. static SQRESULT sq_xjd1_constructor(HSQUIRRELVM v)
  133. {
  134. SQ_FUNC_VARS_NO_TOP(v);
  135. xjd1 *db;
  136. sq_sqlite3_sdb *sdb = NULL;
  137. int rc = XJD1_ERROR;
  138. switch(sq_gettype(v, 2))
  139. {
  140. case OT_STRING:
  141. {
  142. SQ_GET_STRING(v, 2, dbname);
  143. rc = xjd1_open(0, dbname, &db);
  144. }
  145. break;
  146. case OT_INSTANCE:
  147. {
  148. if(get_sqlite3_instance(v, 2, &sdb) == SQ_OK)
  149. {
  150. rc = xjd1_open_with_db(0, sdb->db, &db);
  151. }
  152. }
  153. break;
  154. default:
  155. return sq_throwerror(v, _SC("Wrong parameters to open xjd1 file name or sqlite3 expected !"));
  156. }
  157. if(rc != SQ_OK) return sq_throwerror(v, _SC("Failed to open database ! %d"), rc);
  158. sq_setinstanceup(v, 1, db);
  159. sq_setreleasehook(v,1, sq_xjd1_releasehook);
  160. return SQ_OK;
  161. }
  162. static SQRESULT sq_xjd1_close(HSQUIRRELVM v)
  163. {
  164. SQ_FUNC_VARS_NO_TOP(v);
  165. GET_xjd1_INSTANCE();
  166. if(sq_xjd1_close_release(v, self) != SQ_OK) return SQ_ERROR;
  167. sq_setinstanceup(v, 1, 0); //next calls will fail with "database is closed"
  168. return 0;
  169. }
  170. static SQRESULT sq_xjd1_complete(HSQUIRRELVM v)
  171. {
  172. SQ_FUNC_VARS_NO_TOP(v);
  173. SQ_GET_STRING(v, 2, szSql);
  174. sq_pushinteger(v, xjd1_complete(szSql));
  175. return 1;
  176. }
  177. /* stmt * prepare( const char * sql ) */
  178. static SQRESULT sq_xjd1_prepare(HSQUIRRELVM v)
  179. {
  180. SQ_FUNC_VARS_NO_TOP(v);
  181. //GET_xjd1_INSTANCE();
  182. SQ_GET_STRING(v, 2, sql);
  183. sq_pushstring(v, xjd1_Stmt_TAG, -1);
  184. if(sq_getonroottable(v) == SQ_ERROR) return SQ_ERROR;
  185. sq_pushroottable(v);
  186. sq_push(v, 1);
  187. sq_push(v, 2);
  188. if(sq_call(v, 3, SQTrue, SQFalse) != SQ_OK) return SQ_ERROR;
  189. //printf("%d:%s\n", __LINE__, __FILE__);
  190. return 1;
  191. }
  192. static SQRESULT sq_xjd1_errcode_name(HSQUIRRELVM v)
  193. {
  194. SQ_FUNC_VARS_NO_TOP(v);
  195. GET_xjd1_INSTANCE();
  196. sq_pushstring(v, xjd1_errcode_name(self), -1);
  197. return 1;
  198. }
  199. static SQRESULT sq_xjd1_errmsg(HSQUIRRELVM v)
  200. {
  201. SQ_FUNC_VARS_NO_TOP(v);
  202. GET_xjd1_INSTANCE();
  203. sq_pushstring(v, xjd1_errmsg(self), -1);
  204. return 1;
  205. }
  206. #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name), sq_xjd1_##name,nparams,tycheck}
  207. static SQRegFunction sq_xjd1_methods[] =
  208. {
  209. _DECL_FUNC(constructor, 2, _SC("x x|s")),
  210. _DECL_FUNC(close, 1, _SC("x")),
  211. _DECL_FUNC(errcode_name, 1, _SC("x")),
  212. _DECL_FUNC(errmsg, 1, _SC("x")),
  213. _DECL_FUNC(complete, 1, _SC("s")),
  214. _DECL_FUNC(prepare, 2, _SC("xs")),
  215. {0,0}
  216. };
  217. #undef _DECL_FUNC
  218. #define INT_CONST(v,num) sq_pushstring(v,_SC(#num),-1);sq_pushinteger(v,num);sq_newslot(v,-3,SQTrue);
  219. #ifdef __cplusplus
  220. extern "C" {
  221. #endif
  222. SQRESULT sqext_register_xjd1(HSQUIRRELVM v)
  223. {
  224. sq_pushstring(v,xjd1_TAG,-1);
  225. sq_newclass(v,SQFalse);
  226. sq_settypetag(v,-1,(void*)xjd1_TAG);
  227. sq_insert_reg_funcs(v, sq_xjd1_methods);
  228. INT_CONST(v,XJD1_OK);
  229. INT_CONST(v,XJD1_ERROR);
  230. INT_CONST(v,XJD1_MISUSE);
  231. INT_CONST(v,XJD1_NOMEM);
  232. INT_CONST(v,XJD1_UNKNOWN);
  233. INT_CONST(v,XJD1_SYNTAX);
  234. INT_CONST(v,XJD1_ERROR_OPEN_DB);
  235. INT_CONST(v,XJD1_ROW);
  236. INT_CONST(v,XJD1_DONE);
  237. sq_newslot(v,-3,SQTrue);
  238. sq_pushstring(v, xjd1_Stmt_TAG,-1);
  239. sq_newclass(v,SQFalse);
  240. sq_settypetag(v,-1,(void*)xjd1_Stmt_TAG);
  241. sq_insert_reg_funcs(v, sq_xjd1_stmt_methods);
  242. INT_CONST(v,XJD1_OK);
  243. INT_CONST(v,XJD1_ROW);
  244. INT_CONST(v,XJD1_DONE);
  245. sq_newslot(v,-3,SQTrue);
  246. return 1;
  247. }
  248. #ifdef __cplusplus
  249. }
  250. #endif