23 lua_type = LUA_PUSH_STRING; |
24 lua_type = LUA_PUSH_STRING; |
24 } |
25 } |
25 |
26 |
26 return lua_type; |
27 return lua_type; |
27 } |
28 } |
|
29 |
|
30 static size_t mysql_buffer_size(MYSQL_FIELD *field) { |
|
31 unsigned int mysql_type = field->type; |
|
32 size_t size = 0; |
|
33 |
|
34 switch (mysql_type) { |
|
35 case MYSQL_TYPE_TINY: |
|
36 size = 4; |
|
37 break; |
|
38 case MYSQL_TYPE_YEAR: |
|
39 case MYSQL_TYPE_SHORT: |
|
40 size = 4; |
|
41 break; |
|
42 case MYSQL_TYPE_INT24: |
|
43 size = 4; |
|
44 break; |
|
45 case MYSQL_TYPE_LONG: |
|
46 size = 4; |
|
47 break; |
|
48 case MYSQL_TYPE_LONGLONG: |
|
49 size = 8; |
|
50 break; |
|
51 case MYSQL_TYPE_FLOAT: |
|
52 size = 4; |
|
53 break; |
|
54 case MYSQL_TYPE_DOUBLE: |
|
55 size = 8; |
|
56 break; |
|
57 case MYSQL_TYPE_TIME: |
|
58 case MYSQL_TYPE_DATE: |
|
59 case MYSQL_TYPE_DATETIME: |
|
60 case MYSQL_TYPE_TIMESTAMP: |
|
61 size = sizeof(MYSQL_TIME); |
|
62 break; |
|
63 default: |
|
64 size = field->length; |
|
65 } |
|
66 |
|
67 return size; |
|
68 } |
28 |
69 |
29 /* |
70 /* |
30 * num_affected_rows = statement:affected() |
71 * num_affected_rows = statement:affected() |
31 */ |
72 */ |
32 static int statement_affected(lua_State *L) { |
73 static int statement_affected(lua_State *L) { |
261 memset(bind, 0, sizeof(MYSQL_BIND) * column_count); |
302 memset(bind, 0, sizeof(MYSQL_BIND) * column_count); |
262 |
303 |
263 fields = mysql_fetch_fields(statement->metadata); |
304 fields = mysql_fetch_fields(statement->metadata); |
264 |
305 |
265 for (i = 0; i < column_count; i++) { |
306 for (i = 0; i < column_count; i++) { |
266 unsigned int length = fields[i].length; |
307 unsigned int length = mysql_buffer_size(&fields[i]); |
267 |
|
268 char *buffer = (char *)malloc(length); |
308 char *buffer = (char *)malloc(length); |
269 memset(buffer, 0, length); |
309 memset(buffer, 0, length); |
270 |
310 |
271 bind[i].buffer_type = fields[i].type; |
311 bind[i].buffer_type = fields[i].type; |
272 bind[i].buffer = buffer; |
312 bind[i].buffer = buffer; |
303 LUA_PUSH_ATTRIB_FLOAT(name, *(double *)(bind[i].buffer)); |
343 LUA_PUSH_ATTRIB_FLOAT(name, *(double *)(bind[i].buffer)); |
304 } else { |
344 } else { |
305 LUA_PUSH_ARRAY_FLOAT(d, *(double *)(bind[i].buffer)); |
345 LUA_PUSH_ARRAY_FLOAT(d, *(double *)(bind[i].buffer)); |
306 } |
346 } |
307 } else if (lua_push == LUA_PUSH_STRING) { |
347 } else if (lua_push == LUA_PUSH_STRING) { |
308 if (named_columns) { |
348 |
309 LUA_PUSH_ATTRIB_STRING(name, bind[i].buffer); |
349 if (fields[i].type == MYSQL_TYPE_TIMESTAMP || fields[i].type == MYSQL_TYPE_DATETIME) { |
|
350 char str[20]; |
|
351 struct st_mysql_time *t = bind[i].buffer; |
|
352 |
|
353 snprintf(str, 20, "%d-%02d-%02d %02d:%02d:%02d", t->year, t->month, t->day, t->hour, t->minute, t->second); |
|
354 |
|
355 if (named_columns) { |
|
356 LUA_PUSH_ATTRIB_STRING(name, str); |
|
357 } else { |
|
358 LUA_PUSH_ARRAY_STRING(d, str); |
|
359 } |
|
360 } else if (fields[i].type == MYSQL_TYPE_TIME) { |
|
361 char str[9]; |
|
362 struct st_mysql_time *t = bind[i].buffer; |
|
363 |
|
364 snprintf(str, 9, "%02d:%02d:%02d", t->hour, t->minute, t->second); |
|
365 |
|
366 if (named_columns) { |
|
367 LUA_PUSH_ATTRIB_STRING(name, str); |
|
368 } else { |
|
369 LUA_PUSH_ARRAY_STRING(d, str); |
|
370 } |
|
371 } else if (fields[i].type == MYSQL_TYPE_DATE) { |
|
372 char str[20]; |
|
373 struct st_mysql_time *t = bind[i].buffer; |
|
374 |
|
375 snprintf(str, 11, "%d-%02d-%02d", t->year, t->month, t->day); |
|
376 |
|
377 if (named_columns) { |
|
378 LUA_PUSH_ATTRIB_STRING(name, str); |
|
379 } else { |
|
380 LUA_PUSH_ARRAY_STRING(d, str); |
|
381 } |
|
382 |
310 } else { |
383 } else { |
311 LUA_PUSH_ARRAY_STRING(d, bind[i].buffer); |
384 if (named_columns) { |
|
385 LUA_PUSH_ATTRIB_STRING(name, bind[i].buffer); |
|
386 } else { |
|
387 LUA_PUSH_ARRAY_STRING(d, bind[i].buffer); |
|
388 } |
312 } |
389 } |
313 } else if (lua_push == LUA_PUSH_BOOLEAN) { |
390 } else if (lua_push == LUA_PUSH_BOOLEAN) { |
314 if (named_columns) { |
391 if (named_columns) { |
315 LUA_PUSH_ATTRIB_BOOL(name, *(int *)(bind[i].buffer)); |
392 LUA_PUSH_ATTRIB_BOOL(name, *(int *)(bind[i].buffer)); |
316 } else { |
393 } else { |
435 statement = (statement_t *)lua_newuserdata(L, sizeof(statement_t)); |
512 statement = (statement_t *)lua_newuserdata(L, sizeof(statement_t)); |
436 statement->mysql = conn->mysql; |
513 statement->mysql = conn->mysql; |
437 statement->stmt = stmt; |
514 statement->stmt = stmt; |
438 statement->metadata = NULL; |
515 statement->metadata = NULL; |
439 |
516 |
|
517 /* |
|
518 mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (my_bool*)0); |
|
519 */ |
|
520 |
440 luaL_getmetatable(L, DBD_MYSQL_STATEMENT); |
521 luaL_getmetatable(L, DBD_MYSQL_STATEMENT); |
441 lua_setmetatable(L, -2); |
522 lua_setmetatable(L, -2); |
442 |
523 |
443 return 1; |
524 return 1; |
444 } |
525 } |