stmt.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. /*
  2. ** Copyright (c) 2011 D. Richard Hipp
  3. **
  4. ** This program is free software; you can redistribute it and/or
  5. ** modify it under the terms of the Simplified BSD License (also
  6. ** known as the "2-Clause License" or "FreeBSD License".)
  7. **
  8. ** This program is distributed in the hope that it will be useful,
  9. ** but without any warranty; without even the implied warranty of
  10. ** merchantability or fitness for a particular purpose.
  11. **
  12. ** Author contact information:
  13. ** [email protected]
  14. ** http://www.hwaci.com/drh/
  15. **
  16. *************************************************************************
  17. ** Interfaces to prepared statment objects.
  18. */
  19. #include "xjd1Int.h"
  20. /*
  21. ** Create a new prepared statement for database connection pConn. The
  22. ** program code to be parsed is zStmt. Return the new statement in *ppNew.
  23. ** Write the number of zStmt bytes read into *pN.
  24. */
  25. int xjd1_stmt_new(xjd1 *pConn, const char *zStmt, xjd1_stmt **ppNew, int *pN){
  26. xjd1_stmt *p;
  27. int dummy;
  28. Command *pCmd;
  29. int rc;
  30. if( pN==0 ) pN = &dummy;
  31. *pN = strlen(zStmt);
  32. *ppNew = p = xjd1_malloc( sizeof(*p) );
  33. if( p==0 ) return XJD1_NOMEM;
  34. memset(p, 0, sizeof(*p));
  35. p->pConn = pConn;
  36. p->pNext = pConn->pStmt;
  37. pConn->pStmt = p;
  38. p->zCode = xjd1PoolDup(&p->sPool, zStmt, -1);
  39. xjd1StringInit(&p->retValue, &p->sPool, 0);
  40. xjd1StringInit(&p->errMsg, &p->sPool, 0);
  41. rc = xjd1RunParser(pConn, p, p->zCode, pN);
  42. pCmd = p->pCmd;
  43. assert( rc==XJD1_OK || (pCmd==0 && pConn->errCode==rc) );
  44. if( pCmd ){
  45. switch( pCmd->eCmdType ){
  46. case TK_SELECT: {
  47. rc = xjd1QueryInit(pCmd->u.q.pQuery, p, 0);
  48. break;
  49. }
  50. case TK_INSERT: {
  51. xjd1QueryInit(pCmd->u.ins.pQuery, p, 0);
  52. break;
  53. }
  54. case TK_DELETE: {
  55. xjd1ExprInit(pCmd->u.del.pWhere, p, 0, 0, 0);
  56. break;
  57. }
  58. case TK_UPDATE: {
  59. xjd1ExprInit(pCmd->u.update.pWhere, p, 0, 0, 0);
  60. xjd1ExprListInit(pCmd->u.update.pChng, p, 0, 0, 0);
  61. xjd1ExprInit(pCmd->u.update.pUpsert, p, 0, 0, 0);
  62. break;
  63. }
  64. }
  65. if( p->errCode ){
  66. xjd1Error(pConn, p->errCode, "%s", p->errMsg.zBuf);
  67. rc = p->errCode;
  68. }else if( rc!=XJD1_OK ){
  69. xjd1Error(pConn, rc, 0);
  70. }
  71. }
  72. if( rc!=XJD1_OK ){
  73. xjd1_stmt_delete(p);
  74. *ppNew = 0;
  75. }
  76. return rc;
  77. }
  78. /*
  79. ** Configure a prepared statement.
  80. */
  81. int xdj1_stmt_config(xjd1_stmt *pStmt, int op, ...){
  82. return XJD1_UNKNOWN;
  83. }
  84. /*
  85. ** Delete a prepared statement.
  86. */
  87. int xjd1_stmt_delete(xjd1_stmt *pStmt){
  88. Command *pCmd;
  89. if( pStmt==0 ) return XJD1_OK;
  90. pStmt->isDying = 1;
  91. if( pStmt->nRef>0 ) return XJD1_OK;
  92. pCmd = pStmt->pCmd;
  93. if( pCmd ){
  94. switch( pCmd->eCmdType ){
  95. case TK_SELECT: {
  96. xjd1QueryClose(pCmd->u.q.pQuery);
  97. break;
  98. }
  99. case TK_INSERT: {
  100. xjd1QueryClose(pCmd->u.ins.pQuery);
  101. break;
  102. }
  103. case TK_DELETE: {
  104. xjd1ExprClose(pCmd->u.del.pWhere);
  105. break;
  106. }
  107. case TK_UPDATE: {
  108. xjd1ExprClose(pCmd->u.update.pWhere);
  109. xjd1ExprListClose(pCmd->u.update.pChng);
  110. xjd1ExprClose(pCmd->u.update.pUpsert);
  111. break;
  112. }
  113. }
  114. }
  115. if( pStmt->pPrev ){
  116. pStmt->pPrev->pNext = pStmt->pNext;
  117. }else{
  118. //assert( pStmt->pConn->pStmt==pStmt ); wrong assumption
  119. pStmt->pConn->pStmt = pStmt->pNext;
  120. }
  121. if( pStmt->pNext ){
  122. pStmt->pNext->pPrev = pStmt->pPrev;
  123. }
  124. xjd1Unref(pStmt->pConn);
  125. xjd1PoolClear(&pStmt->sPool);
  126. xjd1StringClear(&pStmt->retValue);
  127. xjd1_free(pStmt);
  128. return XJD1_OK;
  129. }
  130. /*
  131. ** Execute a prepared statement up to its next return value or until
  132. ** it completes.
  133. */
  134. int xjd1_stmt_step(xjd1_stmt *pStmt){
  135. Command *pCmd;
  136. int rc = XJD1_DONE;
  137. if( pStmt==0 ) return rc;
  138. pCmd = pStmt->pCmd;
  139. if( pCmd==0 ) return rc;
  140. switch( pCmd->eCmdType ){
  141. case TK_CREATECOLLECTION: {
  142. char *zSql;
  143. int res;
  144. char *zErr = 0;
  145. zSql = sqlite3_mprintf("CREATE TABLE %s \"%w\"(x)",
  146. pCmd->u.crtab.ifExists ? "IF NOT EXISTS" : "",
  147. pCmd->u.crtab.zName);
  148. res = sqlite3_exec(pStmt->pConn->db, zSql, 0, 0, &zErr);
  149. if( zErr ){
  150. xjd1Error(pStmt->pConn, XJD1_ERROR, "%s", zErr);
  151. sqlite3_free(zErr);
  152. rc = XJD1_ERROR;
  153. }
  154. sqlite3_free(zSql);
  155. break;
  156. }
  157. case TK_DROPCOLLECTION: {
  158. char *zSql;
  159. int res;
  160. char *zErr = 0;
  161. zSql = sqlite3_mprintf("DROP TABLE %s \"%w\"",
  162. pCmd->u.crtab.ifExists ? "IF EXISTS" : "",
  163. pCmd->u.crtab.zName);
  164. res = sqlite3_exec(pStmt->pConn->db, zSql, 0, 0, &zErr);
  165. if( zErr ){
  166. xjd1Error(pStmt->pConn, XJD1_ERROR, "%s", zErr);
  167. sqlite3_free(zErr);
  168. rc = XJD1_ERROR;
  169. }
  170. sqlite3_free(zSql);
  171. break;
  172. }
  173. case TK_INSERT: {
  174. JsonNode *pNode;
  175. String json;
  176. int res;
  177. char *zErr;
  178. char *zSql;
  179. if( pCmd->u.ins.pQuery ){
  180. xjd1Error(pStmt->pConn, XJD1_ERROR,
  181. "INSERT INTO ... SELECT not yet implemented");
  182. break;
  183. }
  184. pNode = xjd1ExprEval(pCmd->u.ins.pValue);
  185. if( pNode==0 ) break;
  186. xjd1StringInit(&json,0,0);
  187. xjd1JsonRender(&json, pNode);
  188. xjd1JsonFree(pNode);
  189. zSql = sqlite3_mprintf("INSERT INTO \"%w\" VALUES('%q')",
  190. pCmd->u.ins.zName,
  191. xjd1StringText(&json));
  192. xjd1StringClear(&json);
  193. res = sqlite3_exec(pStmt->pConn->db, zSql, 0, 0, &zErr);
  194. if( zErr ){
  195. xjd1Error(pStmt->pConn, XJD1_ERROR, "%s", zErr);
  196. sqlite3_free(zErr);
  197. rc = XJD1_ERROR;
  198. }
  199. sqlite3_free(zSql);
  200. break;
  201. }
  202. case TK_SELECT: {
  203. Query *pQuery = pCmd->u.q.pQuery;
  204. rc = xjd1QueryStep(pQuery);
  205. xjd1StringClear(&pStmt->retValue);
  206. if( rc==XJD1_ROW ){
  207. JsonNode *pValue = xjd1QueryDoc(pQuery, 0);
  208. xjd1JsonRender(&pStmt->retValue, pValue);
  209. xjd1JsonFree(pValue);
  210. pStmt->okValue = 1;
  211. }else{
  212. pStmt->okValue = 0;
  213. }
  214. break;
  215. }
  216. case TK_DELETE: {
  217. rc = xjd1DeleteStep(pStmt);
  218. break;
  219. }
  220. case TK_UPDATE: {
  221. rc = xjd1UpdateStep(pStmt);
  222. break;
  223. }
  224. case TK_PRAGMA: {
  225. rc = xjd1PragmaStep(pStmt);
  226. break;
  227. }
  228. }
  229. return rc;
  230. }
  231. /*
  232. ** Rewind a prepared statement back to the beginning.
  233. */
  234. int xjd1_stmt_rewind(xjd1_stmt *pStmt){
  235. Command *pCmd = pStmt->pCmd;
  236. if( pCmd ){
  237. switch( pCmd->eCmdType ){
  238. case TK_SELECT: {
  239. xjd1QueryRewind(pCmd->u.q.pQuery);
  240. xjd1StringTruncate(&pStmt->retValue);
  241. pStmt->okValue = 0;
  242. break;
  243. }
  244. case TK_INSERT: {
  245. xjd1QueryRewind(pCmd->u.ins.pQuery);
  246. break;
  247. }
  248. }
  249. }
  250. return XJD1_OK;
  251. }
  252. /*
  253. ** Return the output value of a prepared statement resulting from
  254. ** its most recent xjd1_stmt_step() call.
  255. */
  256. int xjd1_stmt_value(xjd1_stmt *pStmt, const char **pzValue){
  257. if( pStmt==0 ) return XJD1_MISUSE;
  258. *pzValue = pStmt->retValue.zBuf;
  259. return XJD1_OK;
  260. }
  261. /*
  262. ** Construct a human-readable listing of a prepared statement showing
  263. ** its internal structure. Used for debugging and analysis only.
  264. **
  265. ** The return string is obtained from xjd1_malloc and must be freed by
  266. ** the caller.
  267. */
  268. char *xjd1_stmt_debug_listing(xjd1_stmt *p){
  269. String x;
  270. xjd1StringInit(&x, 0, 0);
  271. xjd1TraceCommand(&x, 0, p->pCmd);
  272. return x.zBuf;
  273. }
  274. /*
  275. ** Return the current value for a particular document in the given
  276. ** statement.
  277. **
  278. ** The caller is responsible for invoking xjd1JsonFree() on the result.
  279. */
  280. JsonNode *xjd1StmtDoc(xjd1_stmt *pStmt){
  281. Command *pCmd;
  282. JsonNode *pRes = 0;
  283. if( pStmt==0 ) return 0;
  284. pCmd = pStmt->pCmd;
  285. if( pCmd==0 ) return 0;
  286. switch( pCmd->eCmdType ){
  287. case TK_SELECT: {
  288. pRes = xjd1QueryDoc(pCmd->u.q.pQuery, 0);
  289. break;
  290. }
  291. case TK_UPDATE:
  292. case TK_DELETE: {
  293. pRes = xjd1JsonRef(pStmt->pDoc);
  294. break;
  295. }
  296. }
  297. return pRes;
  298. }
  299. void xjd1StmtError(xjd1_stmt *pStmt, int errCode, const char *zFormat, ...){
  300. va_list ap;
  301. pStmt->errCode = errCode;
  302. va_start(ap, zFormat);
  303. xjd1StringVAppendF(&pStmt->errMsg, zFormat, ap);
  304. va_end(ap);
  305. }