dbd/sqlite3/statement.c

Wed, 26 Nov 2008 10:43:45 +0000

author
nrich@ii.net
date
Wed, 26 Nov 2008 10:43:45 +0000
changeset 4
c50b0e6f25d6
parent 3
b61020ca4753
child 5
e66b88e013ca
permissions
-rw-r--r--

Clean up error messages for consistency.

1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
1 #include "dbd_sqlite3.h"
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
2
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
3 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
4 * Converts SQLite types to Lua types
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
5 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
6 static lua_push_type_t sqlite_to_lua_push(unsigned int sqlite_type) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
7 lua_push_type_t lua_type;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
8
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
9 switch(sqlite_type) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
10 case SQLITE_NULL:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
11 lua_type = LUA_PUSH_NIL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
12 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
13
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
14 case SQLITE_INTEGER:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
15 lua_type = LUA_PUSH_INTEGER;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
16 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
17
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
18 case SQLITE_FLOAT:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
19 lua_type = LUA_PUSH_NUMBER;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
20 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
21
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
22 default:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
23 lua_type = LUA_PUSH_STRING;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
24 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
25
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
26 return lua_type;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
27 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
28
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
29 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
30 * runs sqlite3_step on a statement handle
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
31 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
32 static int step(statement_t *statement) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
33 int res = sqlite3_step(statement->stmt);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
34
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
35 if (res == SQLITE_DONE) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
36 statement->more_data = 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
37 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
38 } else if (res == SQLITE_ROW) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
39 statement->more_data = 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
40 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
41 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
42
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
43 return 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
44 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
45
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
46 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
47 * success = statement:close()
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
48 */
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
49 int statement_close(lua_State *L) {
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
50 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_SQLITE_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
51 int ok = 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
52
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
53 if (statement->stmt) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
54 if (sqlite3_finalize(statement->stmt) == SQLITE_OK) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
55 ok = 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
56 }
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
57
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
58 statement->stmt = NULL;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
59 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
60
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
61 lua_pushboolean(L, ok);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
62 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
63 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
64
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
65 /*
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
66 * success,err = statement:execute(...)
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
67 */
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
68 int statement_execute(lua_State *L) {
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
69 int n = lua_gettop(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
70 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_SQLITE_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
71 int p;
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
72 int err = 0;
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
73
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
74
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
75 if (!statement->stmt) {
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
76 lua_pushboolean(L, 0);
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
77 lua_pushstring(L, DBI_ERR_EXECUTE_INVALID);
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
78 return 2;
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
79 }
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
80
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
81 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
82 * reset the handle before binding params
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
83 * this wil be a NOP if the handle has not
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
84 * been executed
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
85 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
86 if (sqlite3_reset(statement->stmt) != SQLITE_OK) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
87 lua_pushboolean(L, 0);
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
88 lua_pushfstring(L, DBI_ERR_EXECUTE_FAILED, sqlite3_errmsg(statement->sqlite));
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
89 return 2;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
90 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
91
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
92 for (p = 2; p <= n; p++) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
93 int i = p - 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
94
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
95 if (lua_isnil(L, p)) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
96 if (sqlite3_bind_null(statement->stmt, i) != SQLITE_OK) {
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
97 err = 1;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
98 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
99 } else if (lua_isnumber(L, p)) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
100 if (sqlite3_bind_double(statement->stmt, i, luaL_checknumber(L, p)) != SQLITE_OK) {
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
101 err = 1;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
102 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
103 } else if (lua_isstring(L, p)) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
104 if (sqlite3_bind_text(statement->stmt, i, luaL_checkstring(L, p), -1, SQLITE_STATIC) != SQLITE_OK) {
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
105 err = 1;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
106 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
107 }
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
108
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
109 if (err)
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
110 break;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
111 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
112
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
113 if (err) {
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
114 lua_pushboolean(L, 0);
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
115 lua_pushfstring(L, DBI_ERR_BINDING_PARAMS, sqlite3_errmsg(statement->sqlite));
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
116 return 2;
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
117 }
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
118
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
119 if (!step(statement)) {
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
120 lua_pushboolean(L, 0);
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
121 lua_pushfstring(L, DBI_ERR_EXECUTE_FAILED, sqlite3_errmsg(statement->sqlite));
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
122 }
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
123
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
124 lua_pushboolean(L, 1);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
125 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
126 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
127
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
128 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
129 * must be called after an execute
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
130 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
131 static int statement_fetch_impl(lua_State *L, int named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
132 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_SQLITE_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
133 int num_columns;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
134
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
135 if (!statement->stmt) {
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
136 luaL_error(L, DBI_ERR_FETCH_INVALID);
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
137 return 0;
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
138 }
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
139
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
140 if (!statement->more_data) {
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
141 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
142 * Result set is empty, or not result set returned
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
143 */
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
144
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
145 lua_pushnil(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
146 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
147 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
148
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
149 num_columns = sqlite3_column_count(statement->stmt);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
150
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
151 if (num_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
152 int i;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
153 int d = 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
154
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
155 lua_newtable(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
156
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
157 for (i = 0; i < num_columns; i++) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
158 lua_push_type_t lua_push = sqlite_to_lua_push(sqlite3_column_type(statement->stmt, i));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
159 const char *name = sqlite3_column_name(statement->stmt, i);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
160
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
161 if (lua_push == LUA_PUSH_NIL) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
162 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
163 LUA_PUSH_ATTRIB_NIL(name);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
164 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
165 LUA_PUSH_ARRAY_NIL(d);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
166 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
167 } else if (lua_push == LUA_PUSH_INTEGER) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
168 int val = sqlite3_column_int(statement->stmt, i);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
169
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
170 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
171 LUA_PUSH_ATTRIB_INT(name, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
172 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
173 LUA_PUSH_ARRAY_INT(d, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
174 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
175 } else if (lua_push == LUA_PUSH_NUMBER) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
176 double val = sqlite3_column_double(statement->stmt, i);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
177
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
178 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
179 LUA_PUSH_ATTRIB_FLOAT(name, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
180 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
181 LUA_PUSH_ARRAY_FLOAT(d, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
182 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
183 } else if (lua_push == LUA_PUSH_STRING) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
184 const char *val = (const char *)sqlite3_column_text(statement->stmt, i);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
185
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
186 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
187 LUA_PUSH_ATTRIB_STRING(name, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
188 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
189 LUA_PUSH_ARRAY_STRING(d, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
190 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
191 } else if (lua_push == LUA_PUSH_BOOLEAN) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
192 int val = sqlite3_column_int(statement->stmt, i);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
193
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
194 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
195 LUA_PUSH_ATTRIB_BOOL(name, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
196 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
197 LUA_PUSH_ARRAY_BOOL(d, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
198 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
199 } else {
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
200 luaL_error(L, DBI_ERR_UNKNOWN_PUSH);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
201 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
202 }
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
203 } else {
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
204 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
205 * no columns returned by statement?
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
206 */
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
207 lua_pushnil(L);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
208 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
209
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
210 if (step(statement) == 0) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
211 if (sqlite3_reset(statement->stmt) != SQLITE_OK) {
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
212 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
213 * reset needs to be called to retrieve the 'real' error message
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
214 */
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
215 luaL_error(L, DBI_ERR_FETCH_FAILED, sqlite3_errmsg(statement->sqlite));
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
216 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
217 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
218
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
219 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
220 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
221
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
222 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
223 * array = statement:fetch()
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
224 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
225 static int statement_fetch(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
226 return statement_fetch_impl(L, 0);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
227 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
228
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
229 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
230 * hashmap = statement:fetchtable()
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
231 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
232 static int statement_fetchtable(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
233 return statement_fetch_impl(L, 1);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
234 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
235
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
236 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
237 * __gc
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
238 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
239 static int statement_gc(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
240 /* always free the handle */
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
241 statement_close(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
242
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
243 return 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
244 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
245
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
246 int dbd_sqlite3_statement_create(lua_State *L, connection_t *conn, const char *sql_query) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
247 statement_t *statement = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
248
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
249 statement = (statement_t *)lua_newuserdata(L, sizeof(statement_t));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
250 statement->sqlite = conn->sqlite;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
251 statement->stmt = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
252 statement->more_data = 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
253
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
254 if (sqlite3_prepare_v2(statement->sqlite, sql_query, strlen(sql_query), &statement->stmt, NULL) != SQLITE_OK) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
255 lua_pushnil(L);
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
256 lua_pushfstring(L, DBI_ERR_PREP_STATEMENT, sqlite3_errmsg(statement->sqlite));
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
257 return 2;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
258 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
259
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
260 luaL_getmetatable(L, DBD_SQLITE_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
261 lua_setmetatable(L, -2);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
262 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
263 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
264
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
265 int dbd_sqlite3_statement(lua_State *L) {
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
266 static const luaL_Reg statement_methods[] = {
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
267 {"close", statement_close},
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
268 {"execute", statement_execute},
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
269 {"fetch", statement_fetch},
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
270 {"fetchtable", statement_fetchtable},
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
271 {NULL, NULL}
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
272 };
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
273
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
274 static const luaL_Reg statement_class_methods[] = {
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
275 {NULL, NULL}
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
276 };
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
277
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
278 luaL_newmetatable(L, DBD_SQLITE_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
279 luaL_register(L, 0, statement_methods);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
280 lua_pushvalue(L,-1);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
281 lua_setfield(L, -2, "__index");
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
282
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
283 lua_pushcfunction(L, statement_gc);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
284 lua_setfield(L, -2, "__gc");
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
285
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
286 luaL_register(L, DBD_SQLITE_STATEMENT, statement_class_methods);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
287
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
288 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
289 }

mercurial