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; |