Tue, 01 Sep 2009 13:15:02 +0000
Add __tostring method to connection and statement objects.
1 | 1 | #include "dbd_mysql.h" |
2 | ||
3 | static lua_push_type_t mysql_to_lua_push(unsigned int mysql_type) { | |
4 | lua_push_type_t lua_type; | |
5 | ||
6 | switch(mysql_type) { | |
7 | case MYSQL_TYPE_NULL: | |
8 | lua_type = LUA_PUSH_NIL; | |
9 | break; | |
10 | ||
11 | case MYSQL_TYPE_TINY: | |
12 | case MYSQL_TYPE_SHORT: | |
13 | case MYSQL_TYPE_LONG: | |
14 | lua_type = LUA_PUSH_INTEGER; | |
15 | break; | |
16 | ||
17 | case MYSQL_TYPE_DOUBLE: | |
18 | case MYSQL_TYPE_LONGLONG: | |
19 | lua_type = LUA_PUSH_NUMBER; | |
20 | break; | |
21 | ||
22 | default: | |
23 | lua_type = LUA_PUSH_STRING; | |
24 | } | |
25 | ||
26 | return lua_type; | |
27 | } | |
28 | ||
2 | 29 | /* |
21
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
30 | * num_affected_rows = statement:affected() |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
31 | */ |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
32 | static int statement_affected(lua_State *L) { |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
33 | statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT); |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
34 | |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
35 | if (!statement->stmt) { |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
36 | luaL_error(L, DBI_ERR_INVALID_STATEMENT); |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
37 | } |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
38 | |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
39 | lua_pushinteger(L, mysql_stmt_affected_rows(statement->stmt)); |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
40 | |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
41 | return 1; |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
42 | } |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
43 | |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
44 | /* |
2 | 45 | * success = statement:close() |
46 | */ | |
1 | 47 | static int statement_close(lua_State *L) { |
48 | statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT); | |
49 | ||
50 | if (statement->metadata) { | |
51 | mysql_free_result(statement->metadata); | |
3 | 52 | statement->metadata = NULL; |
1 | 53 | } |
54 | ||
55 | if (statement->stmt) { | |
3 | 56 | mysql_stmt_close(statement->stmt); |
57 | statement->stmt = NULL; | |
1 | 58 | } |
59 | ||
3 | 60 | lua_pushboolean(L, 1); |
1 | 61 | return 1; |
62 | } | |
63 | ||
2 | 64 | /* |
30
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
65 | * column_names = statement:columns() |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
66 | */ |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
67 | static int statement_columns(lua_State *L) { |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
68 | statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT); |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
69 | |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
70 | MYSQL_FIELD *fields; |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
71 | int i; |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
72 | int num_columns; |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
73 | int d = 1; |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
74 | |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
75 | if (!statement->stmt) { |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
76 | luaL_error(L, DBI_ERR_INVALID_STATEMENT); |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
77 | return 0; |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
78 | } |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
79 | |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
80 | fields = mysql_fetch_fields(statement->metadata); |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
81 | num_columns = mysql_num_fields(statement->metadata); |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
82 | lua_newtable(L); |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
83 | for (i = 0; i < num_columns; i++) { |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
84 | const char *name = fields[i].name; |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
85 | |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
86 | LUA_PUSH_ARRAY_STRING(d, name); |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
87 | } |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
88 | |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
89 | return 1; |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
90 | } |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
91 | |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
92 | |
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
93 | /* |
3 | 94 | * success,err = statement:execute(...) |
2 | 95 | */ |
1 | 96 | static int statement_execute(lua_State *L) { |
97 | int n = lua_gettop(L); | |
98 | statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT); | |
99 | int num_bind_params = n - 1; | |
3 | 100 | int expected_params; |
14 | 101 | |
25 | 102 | unsigned char *buffer = NULL; |
14 | 103 | int offset = 0; |
1 | 104 | |
105 | MYSQL_BIND *bind = NULL; | |
106 | MYSQL_RES *metadata = NULL; | |
107 | ||
108 | char *error_message = NULL; | |
10 | 109 | char *errstr = NULL; |
1 | 110 | |
111 | int p; | |
112 | ||
3 | 113 | if (!statement->stmt) { |
114 | lua_pushboolean(L, 0); | |
4 | 115 | lua_pushstring(L, DBI_ERR_EXECUTE_INVALID); |
3 | 116 | return 2; |
117 | } | |
118 | ||
119 | expected_params = mysql_stmt_param_count(statement->stmt); | |
120 | ||
121 | if (expected_params != num_bind_params) { | |
122 | /* | |
10 | 123 | * mysql_stmt_bind_param does not handle this condition, |
3 | 124 | * and the client library will segfault if these do no match |
125 | */ | |
126 | lua_pushboolean(L, 0); | |
4 | 127 | lua_pushfstring(L, DBI_ERR_PARAM_MISCOUNT, expected_params, num_bind_params); |
3 | 128 | return 2; |
129 | } | |
130 | ||
26 | 131 | if (num_bind_params > 0) { |
25 | 132 | bind = malloc(sizeof(MYSQL_BIND) * num_bind_params); |
133 | if (bind == NULL) { | |
134 | luaL_error(L, "Could not alloc bind params\n"); | |
135 | } | |
136 | ||
26 | 137 | buffer = (unsigned char *)malloc(num_bind_params * sizeof(double)); |
25 | 138 | memset(bind, 0, sizeof(MYSQL_BIND) * num_bind_params); |
23
a4825c3e65e9
Bugfix: memory corruption possible after reallocs. Using a static buffer instead. Will need to check for overflows on static buffer.
nrich@ii.net
parents:
21
diff
changeset
|
139 | } |
a4825c3e65e9
Bugfix: memory corruption possible after reallocs. Using a static buffer instead. Will need to check for overflows on static buffer.
nrich@ii.net
parents:
21
diff
changeset
|
140 | |
1 | 141 | for (p = 2; p <= n; p++) { |
142 | int type = lua_type(L, p); | |
143 | int i = p - 2; | |
144 | ||
145 | const char *str = NULL; | |
7
4480ae002881
Bugfix - the size of strings for bind params pointed to the same memory
nrich@ii.net
parents:
6
diff
changeset
|
146 | size_t *str_len = NULL; |
6
22046b996150
Fixed bug: double bind params were using the same variables memory space so they were all being set to the same number.
nrich@ii.net
parents:
4
diff
changeset
|
147 | double *num = NULL; |
9 | 148 | int *boolean = NULL; |
10 | 149 | char err[64]; |
1 | 150 | |
151 | switch(type) { | |
152 | case LUA_TNIL: | |
153 | bind[i].buffer_type = MYSQL_TYPE_NULL; | |
154 | bind[i].is_null = (my_bool*)1; | |
155 | break; | |
156 | ||
9 | 157 | case LUA_TBOOLEAN: |
26 | 158 | boolean = (int *)(buffer + offset); |
14 | 159 | offset += sizeof(int); |
9 | 160 | *boolean = lua_toboolean(L, p); |
14 | 161 | |
9 | 162 | bind[i].buffer_type = MYSQL_TYPE_LONG; |
163 | bind[i].is_null = (my_bool*)0; | |
164 | bind[i].buffer = (char *)boolean; | |
165 | bind[i].length = 0; | |
166 | break; | |
167 | ||
1 | 168 | case LUA_TNUMBER: |
6
22046b996150
Fixed bug: double bind params were using the same variables memory space so they were all being set to the same number.
nrich@ii.net
parents:
4
diff
changeset
|
169 | /* |
22046b996150
Fixed bug: double bind params were using the same variables memory space so they were all being set to the same number.
nrich@ii.net
parents:
4
diff
changeset
|
170 | * num needs to be it's own |
22046b996150
Fixed bug: double bind params were using the same variables memory space so they were all being set to the same number.
nrich@ii.net
parents:
4
diff
changeset
|
171 | * memory here |
22046b996150
Fixed bug: double bind params were using the same variables memory space so they were all being set to the same number.
nrich@ii.net
parents:
4
diff
changeset
|
172 | */ |
26 | 173 | num = (double *)(buffer + offset); |
14 | 174 | offset += sizeof(double); |
9 | 175 | *num = lua_tonumber(L, p); |
1 | 176 | |
177 | bind[i].buffer_type = MYSQL_TYPE_DOUBLE; | |
178 | bind[i].is_null = (my_bool*)0; | |
6
22046b996150
Fixed bug: double bind params were using the same variables memory space so they were all being set to the same number.
nrich@ii.net
parents:
4
diff
changeset
|
179 | bind[i].buffer = (char *)num; |
1 | 180 | bind[i].length = 0; |
181 | break; | |
182 | ||
183 | case LUA_TSTRING: | |
26 | 184 | str_len = (size_t *)(buffer + offset); |
14 | 185 | offset += sizeof(size_t); |
9 | 186 | str = lua_tolstring(L, p, str_len); |
1 | 187 | |
188 | bind[i].buffer_type = MYSQL_TYPE_STRING; | |
189 | bind[i].is_null = (my_bool*)0; | |
190 | bind[i].buffer = (char *)str; | |
7
4480ae002881
Bugfix - the size of strings for bind params pointed to the same memory
nrich@ii.net
parents:
6
diff
changeset
|
191 | bind[i].length = str_len; |
1 | 192 | break; |
193 | ||
194 | default: | |
10 | 195 | snprintf(err, sizeof(err)-1, DBI_ERR_BINDING_TYPE_ERR, lua_typename(L, type)); |
196 | errstr = err; | |
197 | error_message = DBI_ERR_BINDING_PARAMS; | |
1 | 198 | goto cleanup; |
199 | } | |
200 | } | |
201 | ||
202 | if (mysql_stmt_bind_param(statement->stmt, bind)) { | |
4 | 203 | error_message = DBI_ERR_BINDING_PARAMS; |
1 | 204 | goto cleanup; |
205 | } | |
206 | ||
207 | if (mysql_stmt_execute(statement->stmt)) { | |
4 | 208 | error_message = DBI_ERR_BINDING_EXEC; |
1 | 209 | goto cleanup; |
210 | } | |
211 | ||
212 | metadata = mysql_stmt_result_metadata(statement->stmt); | |
213 | ||
21
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
214 | if (metadata) { |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
215 | mysql_stmt_store_result(statement->stmt); |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
216 | } |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
217 | |
1 | 218 | cleanup: |
23
a4825c3e65e9
Bugfix: memory corruption possible after reallocs. Using a static buffer instead. Will need to check for overflows on static buffer.
nrich@ii.net
parents:
21
diff
changeset
|
219 | if (bind) { |
1 | 220 | free(bind); |
23
a4825c3e65e9
Bugfix: memory corruption possible after reallocs. Using a static buffer instead. Will need to check for overflows on static buffer.
nrich@ii.net
parents:
21
diff
changeset
|
221 | } |
1 | 222 | |
25 | 223 | if (buffer) { |
224 | free(buffer); | |
225 | } | |
226 | ||
1 | 227 | if (error_message) { |
3 | 228 | lua_pushboolean(L, 0); |
10 | 229 | lua_pushfstring(L, error_message, errstr ? errstr : mysql_stmt_error(statement->stmt)); |
3 | 230 | return 2; |
1 | 231 | } |
232 | ||
233 | statement->metadata = metadata; | |
234 | ||
3 | 235 | lua_pushboolean(L, 1); |
1 | 236 | return 1; |
237 | } | |
238 | ||
11
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
239 | static int statement_fetch_impl(lua_State *L, statement_t *statement, int named_columns) { |
1 | 240 | int column_count; |
241 | MYSQL_BIND *bind = NULL; | |
242 | const char *error_message = NULL; | |
243 | ||
244 | if (!statement->stmt) { | |
4 | 245 | luaL_error(L, DBI_ERR_FETCH_INVALID); |
3 | 246 | return 0; |
247 | } | |
248 | ||
249 | if (!statement->metadata) { | |
4 | 250 | luaL_error(L, DBI_ERR_FETCH_NO_EXECUTE); |
3 | 251 | return 0; |
1 | 252 | } |
253 | ||
254 | column_count = mysql_num_fields(statement->metadata); | |
255 | ||
256 | if (column_count > 0) { | |
257 | int i; | |
258 | MYSQL_FIELD *fields; | |
259 | ||
260 | bind = malloc(sizeof(MYSQL_BIND) * column_count); | |
261 | memset(bind, 0, sizeof(MYSQL_BIND) * column_count); | |
262 | ||
263 | fields = mysql_fetch_fields(statement->metadata); | |
264 | ||
265 | for (i = 0; i < column_count; i++) { | |
266 | unsigned int length = fields[i].length; | |
267 | ||
268 | char *buffer = (char *)malloc(length); | |
269 | memset(buffer, 0, length); | |
270 | ||
271 | bind[i].buffer_type = fields[i].type; | |
272 | bind[i].buffer = buffer; | |
273 | bind[i].buffer_length = length; | |
274 | } | |
275 | ||
276 | if (mysql_stmt_bind_result(statement->stmt, bind)) { | |
4 | 277 | error_message = DBI_ERR_BINDING_RESULTS; |
1 | 278 | goto cleanup; |
279 | } | |
280 | ||
281 | if (!mysql_stmt_fetch(statement->stmt)) { | |
282 | int d = 1; | |
283 | ||
284 | lua_newtable(L); | |
285 | for (i = 0; i < column_count; i++) { | |
286 | lua_push_type_t lua_push = mysql_to_lua_push(fields[i].type); | |
287 | const char *name = fields[i].name; | |
288 | ||
289 | if (lua_push == LUA_PUSH_NIL) { | |
290 | if (named_columns) { | |
291 | LUA_PUSH_ATTRIB_NIL(name); | |
292 | } else { | |
293 | LUA_PUSH_ARRAY_NIL(d); | |
294 | } | |
295 | } else if (lua_push == LUA_PUSH_INTEGER) { | |
296 | if (named_columns) { | |
297 | LUA_PUSH_ATTRIB_INT(name, *(int *)(bind[i].buffer)); | |
298 | } else { | |
299 | LUA_PUSH_ARRAY_INT(d, *(int *)(bind[i].buffer)); | |
300 | } | |
301 | } else if (lua_push == LUA_PUSH_NUMBER) { | |
302 | if (named_columns) { | |
303 | LUA_PUSH_ATTRIB_FLOAT(name, *(double *)(bind[i].buffer)); | |
304 | } else { | |
305 | LUA_PUSH_ARRAY_FLOAT(d, *(double *)(bind[i].buffer)); | |
306 | } | |
307 | } else if (lua_push == LUA_PUSH_STRING) { | |
308 | if (named_columns) { | |
309 | LUA_PUSH_ATTRIB_STRING(name, bind[i].buffer); | |
310 | } else { | |
311 | LUA_PUSH_ARRAY_STRING(d, bind[i].buffer); | |
312 | } | |
313 | } else if (lua_push == LUA_PUSH_BOOLEAN) { | |
314 | if (named_columns) { | |
315 | LUA_PUSH_ATTRIB_BOOL(name, *(int *)(bind[i].buffer)); | |
316 | } else { | |
317 | LUA_PUSH_ARRAY_BOOL(d, *(int *)(bind[i].buffer)); | |
318 | } | |
319 | } else { | |
4 | 320 | luaL_error(L, DBI_ERR_UNKNOWN_PUSH); |
1 | 321 | } |
322 | } | |
323 | } else { | |
324 | lua_pushnil(L); | |
325 | } | |
326 | } | |
327 | ||
328 | cleanup: | |
329 | if (bind) { | |
330 | int i; | |
331 | ||
332 | for (i = 0; i < column_count; i++) { | |
333 | free(bind[i].buffer); | |
334 | } | |
335 | ||
336 | free(bind); | |
337 | } | |
338 | ||
339 | if (error_message) { | |
340 | luaL_error(L, error_message, mysql_stmt_error(statement->stmt)); | |
341 | return 0; | |
342 | } | |
343 | ||
344 | return 1; | |
345 | } | |
346 | ||
11
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
347 | static int next_iterator(lua_State *L) { |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
348 | statement_t *statement = (statement_t *)luaL_checkudata(L, lua_upvalueindex(1), DBD_MYSQL_STATEMENT); |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
349 | int named_columns = lua_toboolean(L, lua_upvalueindex(2)); |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
350 | |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
351 | return statement_fetch_impl(L, statement, named_columns); |
1 | 352 | } |
353 | ||
2 | 354 | /* |
12
014ba3ab3903
Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents:
11
diff
changeset
|
355 | * table = statement:fetch(named_indexes) |
014ba3ab3903
Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents:
11
diff
changeset
|
356 | */ |
014ba3ab3903
Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents:
11
diff
changeset
|
357 | static int statement_fetch(lua_State *L) { |
014ba3ab3903
Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents:
11
diff
changeset
|
358 | statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT); |
014ba3ab3903
Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents:
11
diff
changeset
|
359 | int named_columns = lua_toboolean(L, 2); |
014ba3ab3903
Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents:
11
diff
changeset
|
360 | |
014ba3ab3903
Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents:
11
diff
changeset
|
361 | return statement_fetch_impl(L, statement, named_columns); |
014ba3ab3903
Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents:
11
diff
changeset
|
362 | } |
014ba3ab3903
Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents:
11
diff
changeset
|
363 | |
014ba3ab3903
Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents:
11
diff
changeset
|
364 | /* |
21
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
365 | * num_rows = statement:rowcount() |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
366 | */ |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
367 | static int statement_rowcount(lua_State *L) { |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
368 | statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT); |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
369 | |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
370 | if (!statement->stmt) { |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
371 | luaL_error(L, DBI_ERR_INVALID_STATEMENT); |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
372 | } |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
373 | |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
374 | lua_pushinteger(L, mysql_stmt_num_rows(statement->stmt)); |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
375 | |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
376 | return 1; |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
377 | } |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
378 | |
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
379 | /* |
12
014ba3ab3903
Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents:
11
diff
changeset
|
380 | * iterfunc = statement:rows(named_indexes) |
2 | 381 | */ |
12
014ba3ab3903
Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents:
11
diff
changeset
|
382 | static int statement_rows(lua_State *L) { |
11
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
383 | if (lua_gettop(L) == 1) { |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
384 | lua_pushvalue(L, 1); |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
385 | lua_pushboolean(L, 0); |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
386 | } else { |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
387 | lua_pushvalue(L, 1); |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
388 | lua_pushboolean(L, lua_toboolean(L, 2)); |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
389 | } |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
390 | |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
391 | lua_pushcclosure(L, next_iterator, 2); |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
392 | return 1; |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
393 | } |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
394 | |
b3e05e361f46
Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents:
10
diff
changeset
|
395 | /* |
2 | 396 | * __gc |
397 | */ | |
1 | 398 | static int statement_gc(lua_State *L) { |
399 | /* always free the handle */ | |
400 | statement_close(L); | |
401 | ||
402 | return 0; | |
403 | } | |
404 | ||
32
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
405 | /* |
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
406 | * __tostring |
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
407 | */ |
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
408 | static int statement_tostring(lua_State *L) { |
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
409 | statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT); |
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
410 | |
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
411 | lua_pushfstring(L, "%s: %p", DBD_MYSQL_STATEMENT, statement); |
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
412 | |
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
413 | return 1; |
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
414 | } |
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
415 | |
1 | 416 | int dbd_mysql_statement_create(lua_State *L, connection_t *conn, const char *sql_query) { |
417 | unsigned long sql_len = strlen(sql_query); | |
418 | ||
419 | statement_t *statement = NULL; | |
420 | ||
421 | MYSQL_STMT *stmt = mysql_stmt_init(conn->mysql); | |
422 | ||
423 | if (!stmt) { | |
3 | 424 | lua_pushnil(L); |
4 | 425 | lua_pushfstring(L, DBI_ERR_ALLOC_STATEMENT, mysql_error(conn->mysql)); |
3 | 426 | return 2; |
1 | 427 | } |
428 | ||
429 | if (mysql_stmt_prepare(stmt, sql_query, sql_len)) { | |
3 | 430 | lua_pushnil(L); |
4 | 431 | lua_pushfstring(L, DBI_ERR_PREP_STATEMENT, mysql_stmt_error(stmt)); |
3 | 432 | return 2; |
1 | 433 | } |
434 | ||
435 | statement = (statement_t *)lua_newuserdata(L, sizeof(statement_t)); | |
436 | statement->mysql = conn->mysql; | |
437 | statement->stmt = stmt; | |
438 | statement->metadata = NULL; | |
439 | ||
440 | luaL_getmetatable(L, DBD_MYSQL_STATEMENT); | |
441 | lua_setmetatable(L, -2); | |
442 | ||
443 | return 1; | |
444 | } | |
445 | ||
446 | int dbd_mysql_statement(lua_State *L) { | |
2 | 447 | static const luaL_Reg statement_methods[] = { |
21
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
448 | {"affected", statement_affected}, |
2 | 449 | {"close", statement_close}, |
30
8599f34c139b
Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents:
26
diff
changeset
|
450 | {"columns", statement_columns}, |
2 | 451 | {"execute", statement_execute}, |
452 | {"fetch", statement_fetch}, | |
21
7956401a0c5e
Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents:
14
diff
changeset
|
453 | {"rowcount", statement_rowcount}, |
12
014ba3ab3903
Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents:
11
diff
changeset
|
454 | {"rows", statement_rows}, |
2 | 455 | {NULL, NULL} |
456 | }; | |
457 | ||
458 | static const luaL_Reg statement_class_methods[] = { | |
459 | {NULL, NULL} | |
460 | }; | |
461 | ||
1 | 462 | luaL_newmetatable(L, DBD_MYSQL_STATEMENT); |
463 | luaL_register(L, 0, statement_methods); | |
464 | lua_pushvalue(L,-1); | |
465 | lua_setfield(L, -2, "__index"); | |
466 | ||
467 | lua_pushcfunction(L, statement_gc); | |
468 | lua_setfield(L, -2, "__gc"); | |
469 | ||
32
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
470 | lua_pushcfunction(L, statement_tostring); |
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
471 | lua_setfield(L, -2, "__tostring"); |
03ed0ca09837
Add __tostring method to connection and statement objects.
nrich@ii.net
parents:
30
diff
changeset
|
472 | |
1 | 473 | luaL_register(L, DBD_MYSQL_STATEMENT, statement_class_methods); |
474 | ||
475 | return 1; | |
476 | } |