dbd/mysql/statement.c

changeset 33
6c64c45e7d8f
parent 32
03ed0ca09837
child 36
942bfe1843bc
equal deleted inserted replaced
32:03ed0ca09837 33:6c64c45e7d8f
7 case MYSQL_TYPE_NULL: 7 case MYSQL_TYPE_NULL:
8 lua_type = LUA_PUSH_NIL; 8 lua_type = LUA_PUSH_NIL;
9 break; 9 break;
10 10
11 case MYSQL_TYPE_TINY: 11 case MYSQL_TYPE_TINY:
12 case MYSQL_TYPE_YEAR:
12 case MYSQL_TYPE_SHORT: 13 case MYSQL_TYPE_SHORT:
13 case MYSQL_TYPE_LONG: 14 case MYSQL_TYPE_LONG:
14 lua_type = LUA_PUSH_INTEGER; 15 lua_type = LUA_PUSH_INTEGER;
15 break; 16 break;
16 17
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 }

mercurial