dbd/mysql/statement.c

Sat, 20 Dec 2008 23:53:07 +0000

author
nrich@ii.net
date
Sat, 20 Dec 2008 23:53:07 +0000
changeset 25
2cc3feba9277
parent 23
a4825c3e65e9
child 26
cf847efefdb5
permissions
-rw-r--r--

Cleanup.

1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
1 #include "dbd_mysql.h"
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
2
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
3 static lua_push_type_t mysql_to_lua_push(unsigned int mysql_type) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
4 lua_push_type_t lua_type;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
5
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
6 switch(mysql_type) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
7 case MYSQL_TYPE_NULL:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
8 lua_type = LUA_PUSH_NIL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
9 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
10
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
11 case MYSQL_TYPE_TINY:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
12 case MYSQL_TYPE_SHORT:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
13 case MYSQL_TYPE_LONG:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
14 lua_type = LUA_PUSH_INTEGER;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
15 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
16
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
17 case MYSQL_TYPE_DOUBLE:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
18 case MYSQL_TYPE_LONGLONG:
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 /*
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
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
45 * success = statement:close()
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
46 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
47 static int statement_close(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
48 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
49
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
50 if (statement->metadata) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
51 mysql_free_result(statement->metadata);
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
52 statement->metadata = NULL;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
53 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
54
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
55 if (statement->stmt) {
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
56 mysql_stmt_close(statement->stmt);
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
57 statement->stmt = NULL;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
58 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
59
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
60 lua_pushboolean(L, 1);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
61 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
62 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
63
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
64 /*
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
65 * success,err = statement:execute(...)
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
66 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
67 static int statement_execute(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
68 int n = lua_gettop(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
69 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
70 int num_bind_params = n - 1;
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
71 int expected_params;
14
98192b7d4e89 Add DB2 driver module.
nrich@ii.net
parents: 12
diff changeset
72
25
2cc3feba9277 Cleanup.
nrich@ii.net
parents: 23
diff changeset
73 unsigned char *buffer = NULL;
14
98192b7d4e89 Add DB2 driver module.
nrich@ii.net
parents: 12
diff changeset
74 int offset = 0;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
75
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
76 MYSQL_BIND *bind = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
77 MYSQL_RES *metadata = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
78
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
79 char *error_message = NULL;
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
80 char *errstr = NULL;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
81
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
82 int p;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
83
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
84 if (!statement->stmt) {
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
85 lua_pushboolean(L, 0);
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
86 lua_pushstring(L, DBI_ERR_EXECUTE_INVALID);
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
87 return 2;
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
88 }
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
89
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
90 expected_params = mysql_stmt_param_count(statement->stmt);
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
91
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
92 if (expected_params != num_bind_params) {
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
93 /*
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
94 * mysql_stmt_bind_param does not handle this condition,
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
95 * and the client library will segfault if these do no match
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
96 */
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
97 lua_pushboolean(L, 0);
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
98 lua_pushfstring(L, DBI_ERR_PARAM_MISCOUNT, expected_params, num_bind_params);
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
99 return 2;
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
100 }
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
101
25
2cc3feba9277 Cleanup.
nrich@ii.net
parents: 23
diff changeset
102 if (num_bind_params) {
2cc3feba9277 Cleanup.
nrich@ii.net
parents: 23
diff changeset
103 bind = malloc(sizeof(MYSQL_BIND) * num_bind_params);
2cc3feba9277 Cleanup.
nrich@ii.net
parents: 23
diff changeset
104 if (bind == NULL) {
2cc3feba9277 Cleanup.
nrich@ii.net
parents: 23
diff changeset
105 luaL_error(L, "Could not alloc bind params\n");
2cc3feba9277 Cleanup.
nrich@ii.net
parents: 23
diff changeset
106 }
2cc3feba9277 Cleanup.
nrich@ii.net
parents: 23
diff changeset
107
2cc3feba9277 Cleanup.
nrich@ii.net
parents: 23
diff changeset
108 buffer = malloc(num_bind_params * sizeof(size_t));
2cc3feba9277 Cleanup.
nrich@ii.net
parents: 23
diff changeset
109 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
110 }
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
111
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
112 for (p = 2; p <= n; p++) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
113 int type = lua_type(L, p);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
114 int i = p - 2;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
115
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
116 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
117 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
118 double *num = NULL;
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 7
diff changeset
119 int *boolean = NULL;
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
120 char err[64];
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
121
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
122 switch(type) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
123 case LUA_TNIL:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
124 bind[i].buffer_type = MYSQL_TYPE_NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
125 bind[i].is_null = (my_bool*)1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
126 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
127
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 7
diff changeset
128 case LUA_TBOOLEAN:
14
98192b7d4e89 Add DB2 driver module.
nrich@ii.net
parents: 12
diff changeset
129 boolean = (int *)buffer + offset;
98192b7d4e89 Add DB2 driver module.
nrich@ii.net
parents: 12
diff changeset
130 offset += sizeof(int);
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 7
diff changeset
131 *boolean = lua_toboolean(L, p);
14
98192b7d4e89 Add DB2 driver module.
nrich@ii.net
parents: 12
diff changeset
132
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 7
diff changeset
133 bind[i].buffer_type = MYSQL_TYPE_LONG;
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 7
diff changeset
134 bind[i].is_null = (my_bool*)0;
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 7
diff changeset
135 bind[i].buffer = (char *)boolean;
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 7
diff changeset
136 bind[i].length = 0;
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 7
diff changeset
137 break;
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 7
diff changeset
138
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
139 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
140 /*
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
141 * 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
142 * 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
143 */
14
98192b7d4e89 Add DB2 driver module.
nrich@ii.net
parents: 12
diff changeset
144 num = (double *)buffer + offset;
98192b7d4e89 Add DB2 driver module.
nrich@ii.net
parents: 12
diff changeset
145 offset += sizeof(double);
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 7
diff changeset
146 *num = lua_tonumber(L, p);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
147
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
148 bind[i].buffer_type = MYSQL_TYPE_DOUBLE;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
149 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
150 bind[i].buffer = (char *)num;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
151 bind[i].length = 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
152 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
153
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
154 case LUA_TSTRING:
14
98192b7d4e89 Add DB2 driver module.
nrich@ii.net
parents: 12
diff changeset
155 str_len = (size_t *)buffer + offset;
98192b7d4e89 Add DB2 driver module.
nrich@ii.net
parents: 12
diff changeset
156 offset += sizeof(size_t);
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 7
diff changeset
157 str = lua_tolstring(L, p, str_len);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
158
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
159 bind[i].buffer_type = MYSQL_TYPE_STRING;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
160 bind[i].is_null = (my_bool*)0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
161 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
162 bind[i].length = str_len;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
163 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
164
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
165 default:
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
166 snprintf(err, sizeof(err)-1, DBI_ERR_BINDING_TYPE_ERR, lua_typename(L, type));
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
167 errstr = err;
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
168 error_message = DBI_ERR_BINDING_PARAMS;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
169 goto cleanup;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
170 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
171 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
172
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
173 if (mysql_stmt_bind_param(statement->stmt, bind)) {
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
174 error_message = DBI_ERR_BINDING_PARAMS;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
175 goto cleanup;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
176 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
177
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
178 if (mysql_stmt_execute(statement->stmt)) {
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
179 error_message = DBI_ERR_BINDING_EXEC;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
180 goto cleanup;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
181 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
182
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
183 metadata = mysql_stmt_result_metadata(statement->stmt);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
184
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
185 if (metadata) {
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
186 mysql_stmt_store_result(statement->stmt);
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
187 }
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
188
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
189 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
190 if (bind) {
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
191 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
192 }
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
193
25
2cc3feba9277 Cleanup.
nrich@ii.net
parents: 23
diff changeset
194 if (buffer) {
2cc3feba9277 Cleanup.
nrich@ii.net
parents: 23
diff changeset
195 free(buffer);
2cc3feba9277 Cleanup.
nrich@ii.net
parents: 23
diff changeset
196 }
2cc3feba9277 Cleanup.
nrich@ii.net
parents: 23
diff changeset
197
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
198 if (error_message) {
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
199 lua_pushboolean(L, 0);
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
200 lua_pushfstring(L, error_message, errstr ? errstr : mysql_stmt_error(statement->stmt));
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
201 return 2;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
202 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
203
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
204 statement->metadata = metadata;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
205
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
206 lua_pushboolean(L, 1);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
207 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
208 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
209
11
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
210 static int statement_fetch_impl(lua_State *L, statement_t *statement, int named_columns) {
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
211 int column_count;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
212 MYSQL_BIND *bind = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
213 const char *error_message = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
214
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
215 if (!statement->stmt) {
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
216 luaL_error(L, DBI_ERR_FETCH_INVALID);
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
217 return 0;
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
218 }
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
219
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
220 if (!statement->metadata) {
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
221 luaL_error(L, DBI_ERR_FETCH_NO_EXECUTE);
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
222 return 0;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
223 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
224
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
225 if (!statement->metadata) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
226 lua_pushnil(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
227 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
228 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
229
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
230
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
231 column_count = mysql_num_fields(statement->metadata);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
232
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
233 if (column_count > 0) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
234 int i;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
235 MYSQL_FIELD *fields;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
236
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
237 bind = malloc(sizeof(MYSQL_BIND) * column_count);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
238 memset(bind, 0, sizeof(MYSQL_BIND) * column_count);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
239
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
240 fields = mysql_fetch_fields(statement->metadata);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
241
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
242 for (i = 0; i < column_count; i++) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
243 unsigned int length = fields[i].length;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
244
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
245 char *buffer = (char *)malloc(length);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
246 memset(buffer, 0, length);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
247
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
248 bind[i].buffer_type = fields[i].type;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
249 bind[i].buffer = buffer;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
250 bind[i].buffer_length = length;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
251 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
252
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
253 if (mysql_stmt_bind_result(statement->stmt, bind)) {
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
254 error_message = DBI_ERR_BINDING_RESULTS;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
255 goto cleanup;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
256 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
257
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
258 if (!mysql_stmt_fetch(statement->stmt)) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
259 int d = 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
260
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
261 lua_newtable(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
262 for (i = 0; i < column_count; i++) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
263 lua_push_type_t lua_push = mysql_to_lua_push(fields[i].type);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
264 const char *name = fields[i].name;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
265
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
266 if (lua_push == LUA_PUSH_NIL) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
267 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
268 LUA_PUSH_ATTRIB_NIL(name);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
269 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
270 LUA_PUSH_ARRAY_NIL(d);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
271 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
272 } else if (lua_push == LUA_PUSH_INTEGER) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
273 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
274 LUA_PUSH_ATTRIB_INT(name, *(int *)(bind[i].buffer));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
275 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
276 LUA_PUSH_ARRAY_INT(d, *(int *)(bind[i].buffer));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
277 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
278 } else if (lua_push == LUA_PUSH_NUMBER) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
279 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
280 LUA_PUSH_ATTRIB_FLOAT(name, *(double *)(bind[i].buffer));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
281 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
282 LUA_PUSH_ARRAY_FLOAT(d, *(double *)(bind[i].buffer));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
283 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
284 } else if (lua_push == LUA_PUSH_STRING) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
285 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
286 LUA_PUSH_ATTRIB_STRING(name, bind[i].buffer);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
287 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
288 LUA_PUSH_ARRAY_STRING(d, bind[i].buffer);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
289 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
290 } else if (lua_push == LUA_PUSH_BOOLEAN) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
291 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
292 LUA_PUSH_ATTRIB_BOOL(name, *(int *)(bind[i].buffer));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
293 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
294 LUA_PUSH_ARRAY_BOOL(d, *(int *)(bind[i].buffer));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
295 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
296 } else {
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
297 luaL_error(L, DBI_ERR_UNKNOWN_PUSH);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
298 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
299 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
300 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
301 lua_pushnil(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
302 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
303 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
304
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
305 cleanup:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
306 if (bind) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
307 int i;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
308
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
309 for (i = 0; i < column_count; i++) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
310 free(bind[i].buffer);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
311 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
312
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
313 free(bind);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
314 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
315
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
316 if (error_message) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
317 luaL_error(L, error_message, mysql_stmt_error(statement->stmt));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
318 return 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
319 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
320
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
321 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
322 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
323
11
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
324 static int next_iterator(lua_State *L) {
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
325 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
326 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
327
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
328 return statement_fetch_impl(L, statement, named_columns);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
329 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
330
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
331 /*
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
332 * 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
333 */
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
334 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
335 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
336 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
337
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
338 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
339 }
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
340
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
341 /*
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
342 * num_rows = statement:rowcount()
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
343 */
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
344 static int statement_rowcount(lua_State *L) {
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
345 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
346
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
347 if (!statement->stmt) {
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
348 luaL_error(L, DBI_ERR_INVALID_STATEMENT);
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
349 }
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
350
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
351 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
352
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
353 return 1;
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
354 }
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
355
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
356 /*
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
357 * iterfunc = statement:rows(named_indexes)
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
358 */
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
359 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
360 if (lua_gettop(L) == 1) {
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
361 lua_pushvalue(L, 1);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
362 lua_pushboolean(L, 0);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
363 } else {
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
364 lua_pushvalue(L, 1);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
365 lua_pushboolean(L, lua_toboolean(L, 2));
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
366 }
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
367
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
368 lua_pushcclosure(L, next_iterator, 2);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
369 return 1;
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
370 }
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
371
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
372 /*
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
373 * __gc
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
374 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
375 static int statement_gc(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
376 /* always free the handle */
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
377 statement_close(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
378
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
379 return 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
380 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
381
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
382 int dbd_mysql_statement_create(lua_State *L, connection_t *conn, const char *sql_query) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
383 unsigned long sql_len = strlen(sql_query);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
384
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
385 statement_t *statement = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
386
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
387 MYSQL_STMT *stmt = mysql_stmt_init(conn->mysql);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
388
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
389 if (!stmt) {
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
390 lua_pushnil(L);
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
391 lua_pushfstring(L, DBI_ERR_ALLOC_STATEMENT, mysql_error(conn->mysql));
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
392 return 2;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
393 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
394
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
395 if (mysql_stmt_prepare(stmt, sql_query, sql_len)) {
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
396 lua_pushnil(L);
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
397 lua_pushfstring(L, DBI_ERR_PREP_STATEMENT, mysql_stmt_error(stmt));
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
398 return 2;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
399 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
400
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
401 statement = (statement_t *)lua_newuserdata(L, sizeof(statement_t));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
402 statement->mysql = conn->mysql;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
403 statement->stmt = stmt;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
404 statement->metadata = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
405
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
406 luaL_getmetatable(L, DBD_MYSQL_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
407 lua_setmetatable(L, -2);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
408
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
409 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
410 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
411
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
412 int dbd_mysql_statement(lua_State *L) {
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
413 static const luaL_Reg statement_methods[] = {
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
414 {"affected", statement_affected},
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
415 {"close", statement_close},
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
416 {"execute", statement_execute},
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
417 {"fetch", statement_fetch},
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 14
diff changeset
418 {"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
419 {"rows", statement_rows},
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
420 {NULL, NULL}
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
421 };
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
422
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
423 static const luaL_Reg statement_class_methods[] = {
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
424 {NULL, NULL}
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
425 };
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
426
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
427 luaL_newmetatable(L, DBD_MYSQL_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
428 luaL_register(L, 0, statement_methods);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
429 lua_pushvalue(L,-1);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
430 lua_setfield(L, -2, "__index");
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
431
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
432 lua_pushcfunction(L, statement_gc);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
433 lua_setfield(L, -2, "__gc");
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
434
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
435 luaL_register(L, DBD_MYSQL_STATEMENT, statement_class_methods);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
436
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
437 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
438 }

mercurial