diff -r 3aa8a37a3dd8 -r b3e05e361f46 dbd/mysql/statement.c --- a/dbd/mysql/statement.c Mon Dec 01 07:22:44 2008 +0000 +++ b/dbd/mysql/statement.c Tue Dec 02 08:10:54 2008 +0000 @@ -189,8 +189,7 @@ return 1; } -static int statement_fetch_impl(lua_State *L, int named_columns) { - statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT); +static int statement_fetch_impl(lua_State *L, statement_t *statement, int named_columns) { int column_count; MYSQL_BIND *bind = NULL; const char *error_message = NULL; @@ -303,18 +302,38 @@ return 1; } -/* - * array = statement:fetch() - */ -static int statement_fetch(lua_State *L) { - return statement_fetch_impl(L, 0); +static int next_iterator(lua_State *L) { + statement_t *statement = (statement_t *)luaL_checkudata(L, lua_upvalueindex(1), DBD_MYSQL_STATEMENT); + int named_columns = lua_toboolean(L, lua_upvalueindex(2)); + + return statement_fetch_impl(L, statement, named_columns); } /* - * hashmap = statement:fetchtable() + * iterfunc = statement:fetch(named_indexes) */ -static int statement_fetchtable(lua_State *L) { - return statement_fetch_impl(L, 1); + +static int statement_fetch(lua_State *L) { + if (lua_gettop(L) == 1) { + lua_pushvalue(L, 1); + lua_pushboolean(L, 0); + } else { + lua_pushvalue(L, 1); + lua_pushboolean(L, lua_toboolean(L, 2)); + } + + lua_pushcclosure(L, next_iterator, 2); + return 1; +} + +/* + * table = statement:row(named_indexes) + */ +static int statement_row(lua_State *L) { + statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_MYSQL_STATEMENT); + int named_columns = lua_toboolean(L, 2); + + return statement_fetch_impl(L, statement, named_columns); } /* @@ -362,7 +381,7 @@ {"close", statement_close}, {"execute", statement_execute}, {"fetch", statement_fetch}, - {"fetchtable", statement_fetchtable}, + {"row", statement_row}, {NULL, NULL} };