73 |
73 |
74 /* |
74 /* |
75 * success = statement:execute(...) |
75 * success = statement:execute(...) |
76 */ |
76 */ |
77 static int statement_execute(lua_State *L) { |
77 static int statement_execute(lua_State *L) { |
|
78 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_DB2_STATEMENT); |
78 int n = lua_gettop(L); |
79 int n = lua_gettop(L); |
79 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_DB2_STATEMENT); |
|
80 int p; |
80 int p; |
81 int i; |
81 int i; |
82 int errflag = 0; |
82 int errflag = 0; |
83 const char *errstr = NULL; |
83 const char *errstr = NULL; |
84 SQLRETURN rc = SQL_SUCCESS; |
84 SQLRETURN rc = SQL_SUCCESS; |
85 unsigned char b[BIND_BUFFER_SIZE]; |
85 unsigned char *buffer = NULL; |
86 unsigned char *buffer = &b[0]; |
|
87 int offset = 0; |
86 int offset = 0; |
88 resultset_t *resultset = NULL; |
87 resultset_t *resultset = NULL; |
89 bindparams_t *bind; /* variable to read the results */ |
88 bindparams_t *bind; /* variable to read the results */ |
90 SQLSMALLINT num_params; |
89 SQLSMALLINT num_params; |
91 |
90 |
118 lua_pushboolean(L, 0); |
117 lua_pushboolean(L, 0); |
119 lua_pushfstring(L, DBI_ERR_PARAM_MISCOUNT, num_params, n-1); |
118 lua_pushfstring(L, DBI_ERR_PARAM_MISCOUNT, num_params, n-1); |
120 return 2; |
119 return 2; |
121 } |
120 } |
122 |
121 |
123 if (num_params > (BIND_BUFFER_SIZE/sizeof(double))) { |
122 if (num_params > 0) { |
124 luaL_error(L, "Too many bind params: %d", num_params); |
123 buffer = (unsigned char *)malloc(sizeof(double) * num_params); |
125 } |
124 } |
126 |
125 |
127 for (p = 2; p <= n; p++) { |
126 for (p = 2; p <= n; p++) { |
128 int i = p - 1; |
127 int i = p - 1; |
129 int type = lua_type(L, p); |
128 int type = lua_type(L, p); |
138 case LUA_TNIL: |
137 case LUA_TNIL: |
139 rc = SQLBindParameter(statement->stmt, i, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)0, 0, (SQLPOINTER)&nullvalue); |
138 rc = SQLBindParameter(statement->stmt, i, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)0, 0, (SQLPOINTER)&nullvalue); |
140 errflag = rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO; |
139 errflag = rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO; |
141 break; |
140 break; |
142 case LUA_TNUMBER: |
141 case LUA_TNUMBER: |
143 num = (double *)buffer + offset; |
142 num = (double *)(buffer + offset); |
144 *num = lua_tonumber(L, p); |
143 *num = lua_tonumber(L, p); |
145 offset += sizeof(double); |
144 offset += sizeof(double); |
146 rc = SQLBindParameter(statement->stmt, i, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DECIMAL, 10, 0, (SQLPOINTER)num, 0, NULL); |
145 rc = SQLBindParameter(statement->stmt, i, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DECIMAL, 10, 0, (SQLPOINTER)num, 0, NULL); |
147 errflag = rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO; |
146 errflag = rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO; |
148 break; |
147 break; |
150 str = lua_tolstring(L, p, &len); |
149 str = lua_tolstring(L, p, &len); |
151 rc = SQLBindParameter(statement->stmt, i, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLPOINTER)str, len, NULL); |
150 rc = SQLBindParameter(statement->stmt, i, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLPOINTER)str, len, NULL); |
152 errflag = rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO; |
151 errflag = rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO; |
153 break; |
152 break; |
154 case LUA_TBOOLEAN: |
153 case LUA_TBOOLEAN: |
155 boolean = (int *)buffer + offset; |
154 boolean = (int *)(buffer + offset); |
156 *boolean = lua_toboolean(L, p); |
155 *boolean = lua_toboolean(L, p); |
157 offset += sizeof(int); |
156 offset += sizeof(int); |
158 rc = SQLBindParameter(statement->stmt, i, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)boolean, len, NULL); |
157 rc = SQLBindParameter(statement->stmt, i, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)boolean, len, NULL); |
159 errflag = rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO; |
158 errflag = rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO; |
160 break; |
159 break; |
185 return 2; |
187 return 2; |
186 } |
188 } |
187 |
189 |
188 rc = SQLExecute(statement->stmt); |
190 rc = SQLExecute(statement->stmt); |
189 if (rc != SQL_SUCCESS) { |
191 if (rc != SQL_SUCCESS) { |
|
192 if (buffer) |
|
193 free(buffer); |
|
194 |
190 SQLGetDiagRec(SQL_HANDLE_STMT, statement->stmt, 1, sqlstate, &sqlcode, message, SQL_MAX_MESSAGE_LENGTH + 1, &length); |
195 SQLGetDiagRec(SQL_HANDLE_STMT, statement->stmt, 1, sqlstate, &sqlcode, message, SQL_MAX_MESSAGE_LENGTH + 1, &length); |
191 |
196 |
192 lua_pushnil(L); |
197 lua_pushnil(L); |
193 lua_pushfstring(L, DBI_ERR_PREP_STATEMENT, message); |
198 lua_pushfstring(L, DBI_ERR_PREP_STATEMENT, message); |
194 return 2; |
199 return 2; |
219 &resultset[i].size, |
224 &resultset[i].size, |
220 &resultset[i].scale, |
225 &resultset[i].scale, |
221 NULL); |
226 NULL); |
222 |
227 |
223 if (rc != SQL_SUCCESS) { |
228 if (rc != SQL_SUCCESS) { |
|
229 if (buffer) |
|
230 free(buffer); |
|
231 |
224 SQLGetDiagRec(SQL_HANDLE_STMT, statement->stmt, 1, sqlstate, &sqlcode, message, SQL_MAX_MESSAGE_LENGTH + 1, &length); |
232 SQLGetDiagRec(SQL_HANDLE_STMT, statement->stmt, 1, sqlstate, &sqlcode, message, SQL_MAX_MESSAGE_LENGTH + 1, &length); |
225 |
233 |
226 lua_pushnil(L); |
234 lua_pushnil(L); |
227 lua_pushfstring(L, DBI_ERR_DESC_RESULT, message); |
235 lua_pushfstring(L, DBI_ERR_DESC_RESULT, message); |
228 return 2; |
236 return 2; |
241 bind[i].buffer, |
249 bind[i].buffer, |
242 bind[i].buffer_len, |
250 bind[i].buffer_len, |
243 &bind[i].len); |
251 &bind[i].len); |
244 |
252 |
245 if (rc != SQL_SUCCESS) { |
253 if (rc != SQL_SUCCESS) { |
|
254 if (buffer) |
|
255 free(buffer); |
|
256 |
246 SQLGetDiagRec(SQL_HANDLE_STMT, statement->stmt, 1, sqlstate, &sqlcode, message, SQL_MAX_MESSAGE_LENGTH + 1, &length); |
257 SQLGetDiagRec(SQL_HANDLE_STMT, statement->stmt, 1, sqlstate, &sqlcode, message, SQL_MAX_MESSAGE_LENGTH + 1, &length); |
247 |
258 |
248 lua_pushnil(L); |
259 lua_pushnil(L); |
249 lua_pushfstring(L, DBI_ERR_ALLOC_RESULT, message); |
260 lua_pushfstring(L, DBI_ERR_ALLOC_RESULT, message); |
250 return 2; |
261 return 2; |