dbd/mysql/statement.c

Sun, 23 Nov 2008 01:29:09 +0000

author
nrich@ii.net
date
Sun, 23 Nov 2008 01:29:09 +0000
changeset 1
408291a6eb3e
child 2
c4f02fc67e5a
permissions
-rw-r--r--

Initial import.

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
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
29 static int statement_close(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
30 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
31
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
32 if (statement->metadata) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
33 mysql_free_result(statement->metadata);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
34 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
35
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
36 if (statement->stmt) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
37 mysql_stmt_close(statement->stmt);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
38 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
39
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 static int statement_execute(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
44 int n = lua_gettop(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
45 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
46 int num_bind_params = n - 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
47
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
48 MYSQL_BIND *bind = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
49 MYSQL_RES *metadata = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
50
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
51 char *error_message = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
52
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
53 int p;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
54
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
55 bind = malloc(sizeof(MYSQL_BIND) * num_bind_params);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
56 memset(bind, 0, sizeof(MYSQL_BIND) * num_bind_params);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
57
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
58 for (p = 2; p <= n; p++) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
59 int type = lua_type(L, p);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
60 int i = p - 2;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
61
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
62 const char *str = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
63 size_t str_len;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
64
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
65 double num;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
66
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
67 switch(type) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
68 case LUA_TNIL:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
69 bind[i].buffer_type = MYSQL_TYPE_NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
70 bind[i].is_null = (my_bool*)1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
71 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
72
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
73 case LUA_TNUMBER:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
74 num = luaL_checknumber(L, p);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
75
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
76 bind[i].buffer_type = MYSQL_TYPE_DOUBLE;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
77 bind[i].is_null = (my_bool*)0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
78 bind[i].buffer = (char *)&num;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
79 bind[i].length = 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
80 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
81
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
82 case LUA_TSTRING:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
83 str = luaL_checklstring(L, p, &str_len);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
84
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
85 bind[i].buffer_type = MYSQL_TYPE_STRING;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
86 bind[i].is_null = (my_bool*)0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
87 bind[i].buffer = (char *)str;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
88 bind[i].length = &str_len;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
89 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
90
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
91 default:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
92 error_message = "Binding unknown or unsupported type";
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
93 goto cleanup;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
94 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
95 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
96
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
97 if (mysql_stmt_bind_param(statement->stmt, bind)) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
98 error_message = "Error binding statement parameters: %s";
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
99 goto cleanup;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
100 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
101
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
102 if (mysql_stmt_execute(statement->stmt)) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
103 error_message = "Error executing statement: %s";
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
104 goto cleanup;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
105 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
106
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
107 metadata = mysql_stmt_result_metadata(statement->stmt);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
108
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
109 cleanup:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
110 if (bind)
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
111 free(bind);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
112
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
113 if (error_message) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
114 luaL_error(L, error_message, mysql_stmt_error(statement->stmt));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
115 return 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
116 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
117
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
118 statement->metadata = metadata;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
119
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
120 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
121 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
122
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
123 static int statement_fetch_impl(lua_State *L, int named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
124 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
125 int column_count;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
126 MYSQL_BIND *bind = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
127 const char *error_message = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
128
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
129 if (!statement->stmt) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
130 luaL_error(L, "fetch called before execute");
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
131 lua_pushnil(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
132 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
133 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
134
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
135 if (!statement->metadata) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
136 lua_pushnil(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
137 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
138 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
139
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
140 column_count = mysql_num_fields(statement->metadata);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
141
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
142 if (column_count > 0) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
143 int i;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
144 MYSQL_FIELD *fields;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
145
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
146 bind = malloc(sizeof(MYSQL_BIND) * column_count);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
147 memset(bind, 0, sizeof(MYSQL_BIND) * column_count);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
148
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
149 fields = mysql_fetch_fields(statement->metadata);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
150
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
151 for (i = 0; i < column_count; i++) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
152 unsigned int length = fields[i].length;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
153
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
154 char *buffer = (char *)malloc(length);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
155 memset(buffer, 0, length);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
156
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
157 bind[i].buffer_type = fields[i].type;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
158 bind[i].buffer = buffer;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
159 bind[i].buffer_length = length;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
160 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
161
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
162 if (mysql_stmt_bind_result(statement->stmt, bind)) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
163 error_message = "Error binding results: %s";
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
164 goto cleanup;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
165 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
166
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
167 if (!mysql_stmt_fetch(statement->stmt)) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
168 int d = 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
169
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
170 lua_newtable(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
171 for (i = 0; i < column_count; i++) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
172 lua_push_type_t lua_push = mysql_to_lua_push(fields[i].type);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
173 const char *name = fields[i].name;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
174
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
175 if (lua_push == LUA_PUSH_NIL) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
176 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
177 LUA_PUSH_ATTRIB_NIL(name);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
178 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
179 LUA_PUSH_ARRAY_NIL(d);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
180 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
181 } else if (lua_push == LUA_PUSH_INTEGER) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
182 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
183 LUA_PUSH_ATTRIB_INT(name, *(int *)(bind[i].buffer));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
184 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
185 LUA_PUSH_ARRAY_INT(d, *(int *)(bind[i].buffer));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
186 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
187 } else if (lua_push == LUA_PUSH_NUMBER) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
188 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
189 LUA_PUSH_ATTRIB_FLOAT(name, *(double *)(bind[i].buffer));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
190 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
191 LUA_PUSH_ARRAY_FLOAT(d, *(double *)(bind[i].buffer));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
192 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
193 } else if (lua_push == LUA_PUSH_STRING) {
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_STRING(name, bind[i].buffer);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
196 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
197 LUA_PUSH_ARRAY_STRING(d, bind[i].buffer);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
198 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
199 } else if (lua_push == LUA_PUSH_BOOLEAN) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
200 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
201 LUA_PUSH_ATTRIB_BOOL(name, *(int *)(bind[i].buffer));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
202 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
203 LUA_PUSH_ARRAY_BOOL(d, *(int *)(bind[i].buffer));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
204 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
205 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
206 luaL_error(L, "Unknown push type in result set");
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
207 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
208 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
209 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
210 lua_pushnil(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
211 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
212 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
213
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
214 cleanup:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
215 if (bind) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
216 int i;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
217
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
218 for (i = 0; i < column_count; i++) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
219 free(bind[i].buffer);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
220 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
221
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
222 free(bind);
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 (error_message) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
226 luaL_error(L, error_message, mysql_stmt_error(statement->stmt));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
227 return 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
228 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
229
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
230 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
231 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
232
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
233
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
234 static int statement_fetch(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
235 return statement_fetch_impl(L, 0);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
236 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
237
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
238 static int statement_fetchtable(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
239 return statement_fetch_impl(L, 1);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
240 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
241
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
242 static int statement_gc(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
243 /* always free the handle */
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
244 statement_close(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
245
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
246 return 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
247 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
248
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
249
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
250 static const luaL_Reg statement_methods[] = {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
251 {"close", statement_close},
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
252 {"execute", statement_execute},
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
253 {"fetch", statement_fetch},
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
254 {"fetchtable", statement_fetchtable},
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
255 {NULL, NULL}
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 static const luaL_Reg statement_class_methods[] = {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
259 {NULL, NULL}
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
260 };
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
261
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
262 int dbd_mysql_statement_create(lua_State *L, connection_t *conn, const char *sql_query) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
263 unsigned long sql_len = strlen(sql_query);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
264
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
265 statement_t *statement = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
266
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
267 MYSQL_STMT *stmt = mysql_stmt_init(conn->mysql);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
268
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
269 if (!stmt) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
270 luaL_error(L, "Error allocating statement handle: %s", mysql_error(conn->mysql));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
271 return 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
272 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
273
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
274 if (mysql_stmt_prepare(stmt, sql_query, sql_len)) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
275 luaL_error(L, "Error preparing statement handle: %s", mysql_stmt_error(stmt));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
276 return 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
277 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
278
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
279 statement = (statement_t *)lua_newuserdata(L, sizeof(statement_t));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
280 statement->mysql = conn->mysql;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
281 statement->stmt = stmt;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
282 statement->metadata = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
283
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
284 luaL_getmetatable(L, DBD_MYSQL_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
285 lua_setmetatable(L, -2);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
286
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
287 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
288 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
289
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
290 int dbd_mysql_statement(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
291 luaL_newmetatable(L, DBD_MYSQL_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
292 luaL_register(L, 0, statement_methods);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
293 lua_pushvalue(L,-1);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
294 lua_setfield(L, -2, "__index");
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
295
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
296 lua_pushcfunction(L, statement_gc);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
297 lua_setfield(L, -2, "__gc");
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
298
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
299 luaL_register(L, DBD_MYSQL_STATEMENT, statement_class_methods);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
300
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
301 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
302 }

mercurial