diff -r 03ed0ca09837 -r 6c64c45e7d8f dbd/mysql/statement.c --- a/dbd/mysql/statement.c Tue Sep 01 13:15:02 2009 +0000 +++ b/dbd/mysql/statement.c Fri Sep 18 12:40:53 2009 +0000 @@ -9,6 +9,7 @@ break; case MYSQL_TYPE_TINY: + case MYSQL_TYPE_YEAR: case MYSQL_TYPE_SHORT: case MYSQL_TYPE_LONG: lua_type = LUA_PUSH_INTEGER; @@ -26,6 +27,46 @@ return lua_type; } +static size_t mysql_buffer_size(MYSQL_FIELD *field) { + unsigned int mysql_type = field->type; + size_t size = 0; + + switch (mysql_type) { + case MYSQL_TYPE_TINY: + size = 4; + break; + case MYSQL_TYPE_YEAR: + case MYSQL_TYPE_SHORT: + size = 4; + break; + case MYSQL_TYPE_INT24: + size = 4; + break; + case MYSQL_TYPE_LONG: + size = 4; + break; + case MYSQL_TYPE_LONGLONG: + size = 8; + break; + case MYSQL_TYPE_FLOAT: + size = 4; + break; + case MYSQL_TYPE_DOUBLE: + size = 8; + break; + case MYSQL_TYPE_TIME: + case MYSQL_TYPE_DATE: + case MYSQL_TYPE_DATETIME: + case MYSQL_TYPE_TIMESTAMP: + size = sizeof(MYSQL_TIME); + break; + default: + size = field->length; + } + + return size; +} + /* * num_affected_rows = statement:affected() */ @@ -263,8 +304,7 @@ fields = mysql_fetch_fields(statement->metadata); for (i = 0; i < column_count; i++) { - unsigned int length = fields[i].length; - + unsigned int length = mysql_buffer_size(&fields[i]); char *buffer = (char *)malloc(length); memset(buffer, 0, length); @@ -305,10 +345,47 @@ LUA_PUSH_ARRAY_FLOAT(d, *(double *)(bind[i].buffer)); } } else if (lua_push == LUA_PUSH_STRING) { - if (named_columns) { - LUA_PUSH_ATTRIB_STRING(name, bind[i].buffer); + + if (fields[i].type == MYSQL_TYPE_TIMESTAMP || fields[i].type == MYSQL_TYPE_DATETIME) { + char str[20]; + struct st_mysql_time *t = bind[i].buffer; + + snprintf(str, 20, "%d-%02d-%02d %02d:%02d:%02d", t->year, t->month, t->day, t->hour, t->minute, t->second); + + if (named_columns) { + LUA_PUSH_ATTRIB_STRING(name, str); + } else { + LUA_PUSH_ARRAY_STRING(d, str); + } + } else if (fields[i].type == MYSQL_TYPE_TIME) { + char str[9]; + struct st_mysql_time *t = bind[i].buffer; + + snprintf(str, 9, "%02d:%02d:%02d", t->hour, t->minute, t->second); + + if (named_columns) { + LUA_PUSH_ATTRIB_STRING(name, str); + } else { + LUA_PUSH_ARRAY_STRING(d, str); + } + } else if (fields[i].type == MYSQL_TYPE_DATE) { + char str[20]; + struct st_mysql_time *t = bind[i].buffer; + + snprintf(str, 11, "%d-%02d-%02d", t->year, t->month, t->day); + + if (named_columns) { + LUA_PUSH_ATTRIB_STRING(name, str); + } else { + LUA_PUSH_ARRAY_STRING(d, str); + } + } else { - LUA_PUSH_ARRAY_STRING(d, bind[i].buffer); + if (named_columns) { + LUA_PUSH_ATTRIB_STRING(name, bind[i].buffer); + } else { + LUA_PUSH_ARRAY_STRING(d, bind[i].buffer); + } } } else if (lua_push == LUA_PUSH_BOOLEAN) { if (named_columns) { @@ -437,6 +514,10 @@ statement->stmt = stmt; statement->metadata = NULL; + /* + mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (my_bool*)0); + */ + luaL_getmetatable(L, DBD_MYSQL_STATEMENT); lua_setmetatable(L, -2);