dbd/mysql/statement.c

changeset 23
a4825c3e65e9
parent 21
7956401a0c5e
child 25
2cc3feba9277
equal deleted inserted replaced
22:fd78e9cdc6e9 23:a4825c3e65e9
68 int n = lua_gettop(L); 68 int n = lua_gettop(L);
69 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT); 69 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT);
70 int num_bind_params = n - 1; 70 int num_bind_params = n - 1;
71 int expected_params; 71 int expected_params;
72 72
73 unsigned char *buffer = NULL; 73 unsigned char b[1024];
74 unsigned char *buffer = &b[0];
74 int offset = 0; 75 int offset = 0;
75 76
76 MYSQL_BIND *bind = NULL; 77 MYSQL_BIND *bind = NULL;
77 MYSQL_RES *metadata = NULL; 78 MYSQL_RES *metadata = NULL;
78 79
98 lua_pushfstring(L, DBI_ERR_PARAM_MISCOUNT, expected_params, num_bind_params); 99 lua_pushfstring(L, DBI_ERR_PARAM_MISCOUNT, expected_params, num_bind_params);
99 return 2; 100 return 2;
100 } 101 }
101 102
102 bind = malloc(sizeof(MYSQL_BIND) * num_bind_params); 103 bind = malloc(sizeof(MYSQL_BIND) * num_bind_params);
104
105 if (bind == NULL) {
106 luaL_error(L, "Could not alloc bind params\n");
107 }
108
103 memset(bind, 0, sizeof(MYSQL_BIND) * num_bind_params); 109 memset(bind, 0, sizeof(MYSQL_BIND) * num_bind_params);
104 110
105 for (p = 2; p <= n; p++) { 111 for (p = 2; p <= n; p++) {
106 int type = lua_type(L, p); 112 int type = lua_type(L, p);
107 int i = p - 2; 113 int i = p - 2;
117 bind[i].buffer_type = MYSQL_TYPE_NULL; 123 bind[i].buffer_type = MYSQL_TYPE_NULL;
118 bind[i].is_null = (my_bool*)1; 124 bind[i].is_null = (my_bool*)1;
119 break; 125 break;
120 126
121 case LUA_TBOOLEAN: 127 case LUA_TBOOLEAN:
122 buffer = realloc(buffer, offset + sizeof(int));
123 boolean = (int *)buffer + offset; 128 boolean = (int *)buffer + offset;
124 offset += sizeof(int); 129 offset += sizeof(int);
125 *boolean = lua_toboolean(L, p); 130 *boolean = lua_toboolean(L, p);
126 131
127 bind[i].buffer_type = MYSQL_TYPE_LONG; 132 bind[i].buffer_type = MYSQL_TYPE_LONG;
133 case LUA_TNUMBER: 138 case LUA_TNUMBER:
134 /* 139 /*
135 * num needs to be it's own 140 * num needs to be it's own
136 * memory here 141 * memory here
137 */ 142 */
138 buffer = realloc(buffer, offset + sizeof(double));
139 num = (double *)buffer + offset; 143 num = (double *)buffer + offset;
140 offset += sizeof(double); 144 offset += sizeof(double);
141 *num = lua_tonumber(L, p); 145 *num = lua_tonumber(L, p);
142 146
143 bind[i].buffer_type = MYSQL_TYPE_DOUBLE; 147 bind[i].buffer_type = MYSQL_TYPE_DOUBLE;
145 bind[i].buffer = (char *)num; 149 bind[i].buffer = (char *)num;
146 bind[i].length = 0; 150 bind[i].length = 0;
147 break; 151 break;
148 152
149 case LUA_TSTRING: 153 case LUA_TSTRING:
150 buffer = realloc(buffer, offset + sizeof(size_t));
151 str_len = (size_t *)buffer + offset; 154 str_len = (size_t *)buffer + offset;
152 offset += sizeof(size_t); 155 offset += sizeof(size_t);
153 str = lua_tolstring(L, p, str_len); 156 str = lua_tolstring(L, p, str_len);
154 157
155 bind[i].buffer_type = MYSQL_TYPE_STRING; 158 bind[i].buffer_type = MYSQL_TYPE_STRING;
181 if (metadata) { 184 if (metadata) {
182 mysql_stmt_store_result(statement->stmt); 185 mysql_stmt_store_result(statement->stmt);
183 } 186 }
184 187
185 cleanup: 188 cleanup:
186 /* 189 if (bind) {
187 * free the buffer with a resize to 0
188 */
189 realloc(buffer, 0);
190
191 if (bind)
192 free(bind); 190 free(bind);
191 }
193 192
194 if (error_message) { 193 if (error_message) {
195 lua_pushboolean(L, 0); 194 lua_pushboolean(L, 0);
196 lua_pushfstring(L, error_message, errstr ? errstr : mysql_stmt_error(statement->stmt)); 195 lua_pushfstring(L, error_message, errstr ? errstr : mysql_stmt_error(statement->stmt));
197 return 2; 196 return 2;
220 219
221 if (!statement->metadata) { 220 if (!statement->metadata) {
222 lua_pushnil(L); 221 lua_pushnil(L);
223 return 1; 222 return 1;
224 } 223 }
224
225 225
226 column_count = mysql_num_fields(statement->metadata); 226 column_count = mysql_num_fields(statement->metadata);
227 227
228 if (column_count > 0) { 228 if (column_count > 0) {
229 int i; 229 int i;

mercurial