Thanks,
I use lua_createtable(L,0,num_rows); but can try this as well.
Joe
On Fri, Apr 6, 2012 at 11:28 AM, Jan-Henrik Haukeland hauk@tildeslash.comwrote:
On Apr 6, 2012, at 7:21 PM, Joe Flemmings wrote:
That would be nice but in lua you create a table in C that you pass to
lua.
If you don't mind continue the discussion a little bit longer? I was curious and went and looked at lua and C integration ( http://www.lua.org/pil/26.1.html) and came across this example for reading a directory which kind of maps conceptually to a result set.
static int l_dir (lua_State *L) { DIR *dir; struct dirent *entry; int i; const char *path = luaL_checkstring(L, 1);
/* open directory */ dir = opendir(path); if (dir == NULL) { /* error opening the directory? */ lua_pushnil(L); /* return nil and ... */ lua_pushstring(L, strerror(errno)); /* error message */ return 2; /* number of results */ } /* create result table */ lua_newtable(L); i = 1; while ((entry = readdir(dir)) != NULL) { lua_pushnumber(L, i++); /* push key */ lua_pushstring(L, entry->d_name); /* push value */ lua_settable(L, -3); } closedir(dir); return 1; /* table is already on top */
}
As far as I can see, lua tables are dynamic hash tables and from the example above there is no need to know the number of entries beforehand.
I simply rewrote the above example to this general C method that can be called from lua and will return any result set given any sql select statement. I have no idea if it will it will compile or has errors, but according to the documentation something like this should be possible. Maybe useful?
static int l_select (lua_State *L) { int result = 1; /* table is on top if all goes well */ const char *select = luaL_checkstring(L, 1); Connection_T c = ConnectionPool_getConnection(pool); // pool is usually global TRY { ResultSet_T r = Connection_executeQuery(c, select); /* create result table */ lua_newtable(L); int columnCount = ResultSet_getColumnCount(r); while (ResultSet_next(r)) { for (int i = 1; i < columnCount; i++) { lua_pushstring(L, ResultSet_getColumnName(r, i)); /* push column name */ lua_pushstring(L, ResultSet_getString(r, i)); /* push value as a string */ lua_settable(L, -3); } } } ELSE { lua_pushnil(L); /* return nil and ... */ lua_pushstring(L, Exception_frame.message); /* error message */ result = 2; /* number of results */ } FINALLY { Connection_close(c); } END_TRY; return result; }
-- To unsubscribe: http://www.tildeslash.com/mailman/listinfo/libzdb-general