dbd/db2/statement.c

changeset 26
cf847efefdb5
parent 25
2cc3feba9277
child 27
1d2369ebee21
equal deleted inserted replaced
25:2cc3feba9277 26:cf847efefdb5
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;
170 if (errflag) 169 if (errflag)
171 break; 170 break;
172 } 171 }
173 172
174 if (errflag) { 173 if (errflag) {
174 if (buffer)
175 free(buffer);
176
175 lua_pushboolean(L, 0); 177 lua_pushboolean(L, 0);
176 178
177 if (errstr) { 179 if (errstr) {
178 lua_pushfstring(L, DBI_ERR_BINDING_PARAMS, errstr); 180 lua_pushfstring(L, DBI_ERR_BINDING_PARAMS, errstr);
179 } else { 181 } else {
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;
252 } 263 }
253 264
254 statement->resultset = resultset; 265 statement->resultset = resultset;
255 statement->bind = bind; 266 statement->bind = bind;
256 } 267 }
268
269 if (buffer)
270 free(buffer);
257 271
258 lua_pushboolean(L, 1); 272 lua_pushboolean(L, 1);
259 return 1; 273 return 1;
260 } 274 }
261 275

mercurial