2
0

sq_unql.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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, HSQUIRRELVM v)
  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. if(xjd1_close(db) == XJD1_OK)
  115. {
  116. rc = SQ_OK;
  117. }
  118. else return sq_throwerror(v, xjd1_errmsg(db));
  119. }
  120. return rc;
  121. }
  122. static SQRESULT sq_xjd1_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
  123. {
  124. xjd1 *db = ((xjd1 *)p);
  125. sq_xjd1_close_release(v, db);
  126. return 0;
  127. }
  128. static SQRESULT sq_xjd1_constructor(HSQUIRRELVM v)
  129. {
  130. SQ_FUNC_VARS_NO_TOP(v);
  131. xjd1 *db;
  132. sq_sqlite3_sdb *sdb = NULL;
  133. int rc = XJD1_ERROR;
  134. switch(sq_gettype(v, 2))
  135. {
  136. case OT_STRING:
  137. {
  138. SQ_GET_STRING(v, 2, dbname);
  139. rc = xjd1_open(0, dbname, &db);
  140. }
  141. break;
  142. case OT_INSTANCE:
  143. {
  144. if(get_sqlite3_instance(v, 2, &sdb) == SQ_OK)
  145. {
  146. rc = xjd1_open_with_db(0, sdb->db, &db);
  147. }
  148. }
  149. break;
  150. default:
  151. return sq_throwerror(v, _SC("Wrong parameters to open xjd1 file name or sqlite3 expected !"));
  152. }
  153. if(rc != SQ_OK) return sq_throwerror(v, _SC("Failed to open database ! %d"), rc);
  154. sq_setinstanceup(v, 1, db);
  155. sq_setreleasehook(v,1, sq_xjd1_releasehook);
  156. return SQ_OK;
  157. }
  158. static SQRESULT sq_xjd1_close(HSQUIRRELVM v)
  159. {
  160. SQ_FUNC_VARS_NO_TOP(v);
  161. GET_xjd1_INSTANCE();
  162. if(sq_xjd1_close_release(v, self) != SQ_OK) return SQ_ERROR;
  163. sq_setinstanceup(v, 1, 0); //next calls will fail with "database is closed"
  164. return 0;
  165. }
  166. static SQRESULT sq_xjd1_complete(HSQUIRRELVM v)
  167. {
  168. SQ_FUNC_VARS_NO_TOP(v);
  169. SQ_GET_STRING(v, 2, szSql);
  170. sq_pushinteger(v, xjd1_complete(szSql));
  171. return 1;
  172. }
  173. /* stmt * prepare( const char * sql ) */
  174. static SQRESULT sq_xjd1_prepare(HSQUIRRELVM v)
  175. {
  176. SQ_FUNC_VARS_NO_TOP(v);
  177. //GET_xjd1_INSTANCE();
  178. SQ_GET_STRING(v, 2, sql);
  179. sq_pushstring(v, xjd1_Stmt_TAG, -1);
  180. if(sq_getonroottable(v) == SQ_ERROR) return SQ_ERROR;
  181. sq_pushroottable(v);
  182. sq_push(v, 1);
  183. sq_push(v, 2);
  184. if(sq_call(v, 3, SQTrue, SQFalse) != SQ_OK) return SQ_ERROR;
  185. //printf("%d:%s\n", __LINE__, __FILE__);
  186. return 1;
  187. }
  188. static SQRESULT sq_xjd1_errcode_name(HSQUIRRELVM v)
  189. {
  190. SQ_FUNC_VARS_NO_TOP(v);
  191. GET_xjd1_INSTANCE();
  192. sq_pushstring(v, xjd1_errcode_name(self), -1);
  193. return 1;
  194. }
  195. static SQRESULT sq_xjd1_errmsg(HSQUIRRELVM v)
  196. {
  197. SQ_FUNC_VARS_NO_TOP(v);
  198. GET_xjd1_INSTANCE();
  199. sq_pushstring(v, xjd1_errmsg(self), -1);
  200. return 1;
  201. }
  202. #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name), sq_xjd1_##name,nparams,tycheck}
  203. static SQRegFunction sq_xjd1_methods[] =
  204. {
  205. _DECL_FUNC(constructor, 2, _SC("x x|s")),
  206. _DECL_FUNC(close, 1, _SC("x")),
  207. _DECL_FUNC(errcode_name, 1, _SC("x")),
  208. _DECL_FUNC(errmsg, 1, _SC("x")),
  209. _DECL_FUNC(complete, 1, _SC("s")),
  210. _DECL_FUNC(prepare, 2, _SC("xs")),
  211. {0,0}
  212. };
  213. #undef _DECL_FUNC
  214. #define INT_CONST(v,num) sq_pushstring(v,_SC(#num),-1);sq_pushinteger(v,num);sq_newslot(v,-3,SQTrue);
  215. #ifdef __cplusplus
  216. extern "C" {
  217. #endif
  218. SQRESULT sqext_register_xjd1(HSQUIRRELVM v)
  219. {
  220. sq_pushstring(v,xjd1_TAG,-1);
  221. sq_newclass(v,SQFalse);
  222. sq_settypetag(v,-1,(void*)xjd1_TAG);
  223. sq_insert_reg_funcs(v, sq_xjd1_methods);
  224. INT_CONST(v,XJD1_OK);
  225. INT_CONST(v,XJD1_ERROR);
  226. INT_CONST(v,XJD1_MISUSE);
  227. INT_CONST(v,XJD1_NOMEM);
  228. INT_CONST(v,XJD1_UNKNOWN);
  229. INT_CONST(v,XJD1_SYNTAX);
  230. INT_CONST(v,XJD1_ERROR_OPEN_DB);
  231. INT_CONST(v,XJD1_ROW);
  232. INT_CONST(v,XJD1_DONE);
  233. sq_newslot(v,-3,SQTrue);
  234. sq_pushstring(v, xjd1_Stmt_TAG,-1);
  235. sq_newclass(v,SQFalse);
  236. sq_settypetag(v,-1,(void*)xjd1_Stmt_TAG);
  237. sq_insert_reg_funcs(v, sq_xjd1_stmt_methods);
  238. INT_CONST(v,XJD1_OK);
  239. INT_CONST(v,XJD1_ROW);
  240. INT_CONST(v,XJD1_DONE);
  241. sq_newslot(v,-3,SQTrue);
  242. return 1;
  243. }
  244. #ifdef __cplusplus
  245. }
  246. #endif