From: Daniel Gruno Date: Fri, 21 Feb 2014 11:13:53 +0000 (+0000) Subject: Backport r1570528 X-Git-Tag: 2.4.8~82 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=434da2ff36067f97d144eb60603c4db527073701;p=apache Backport r1570528 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1570530 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 737984bd2f..02438fac02 100644 --- a/CHANGES +++ b/CHANGES @@ -29,6 +29,9 @@ Changes with Apache 2.4.8 the Set-Cookie header. PR56105 [Kevin J Walters , Edward Lu ] + *) mod_lua: Allow for database results to be returned as a hash with + row-name/value pairs instead of just row-number/value. [Daniel Gruno] + *) mod_rewrite: Add %{CONN_REMOTE_ADDR} as the non-useragent counterpart to %{REMOTE_ADDR}. PR 56094. [Edward Lu ] diff --git a/docs/manual/mod/mod_lua.xml b/docs/manual/mod/mod_lua.xml index 4d26b8c5db..81ded89834 100644 --- a/docs/manual/mod/mod_lua.xml +++ b/docs/manual/mod/mod_lua.xml @@ -1196,6 +1196,7 @@ local result, err = db:select(r, "SELECT * FROM `tbl` WHERE 1") local rows = result(0) -- Fetch ALL rows synchronously local row = result(-1) -- Fetch the next available row, asynchronously local row = result(1234) -- Fetch row number 1234, asynchronously +local row = result(-1, true) -- Fetch the next available row, using row names as key indexes.

One can construct a function that returns an iterative function to iterate over all rows in a synchronous or asynchronous way, depending on the async argument: diff --git a/modules/lua/lua_dbd.c b/modules/lua/lua_dbd.c index 501156f803..8b61a60b10 100644 --- a/modules/lua/lua_dbd.c +++ b/modules/lua/lua_dbd.c @@ -15,6 +15,7 @@ * limitations under the License. */ + #include "mod_lua.h" #include "lua_dbd.h" @@ -228,15 +229,19 @@ int lua_db_escape(lua_State *L) */ int lua_db_get_row(lua_State *L) { - int row_no,x; - const char *entry; + int row_no,x,alpha = 0; + const char *entry, *rowname; apr_dbd_row_t *row = 0; lua_db_result_set *res = lua_get_result_set(L); row_no = luaL_optinteger(L, 2, 0); + if (lua_isboolean(L, 3)) { + alpha = lua_toboolean(L, 3); + } lua_settop(L,0); /* Fetch all rows at once? */ + if (row_no == 0) { row_no = 1; lua_newtable(L); @@ -248,7 +253,14 @@ int lua_db_get_row(lua_State *L) for (x = 0; x < res->cols; x++) { entry = apr_dbd_get_entry(res->driver, row, x); if (entry) { - lua_pushinteger(L, x + 1); + if (alpha == 1) { + rowname = apr_dbd_get_name(res->driver, + res->results, x); + lua_pushstring(L, rowname ? rowname : "(oob)"); + } + else { + lua_pushinteger(L, x + 1); + } lua_pushstring(L, entry); lua_rawset(L, -3); } @@ -268,7 +280,14 @@ int lua_db_get_row(lua_State *L) for (x = 0; x < res->cols; x++) { entry = apr_dbd_get_entry(res->driver, row, x); if (entry) { - lua_pushinteger(L, x + 1); + if (alpha == 1) { + rowname = apr_dbd_get_name(res->driver, + res->results, x); + lua_pushstring(L, rowname ? rowname : "(oob)"); + } + else { + lua_pushinteger(L, x + 1); + } lua_pushstring(L, entry); lua_rawset(L, -3); }