From dde9e0effa49543f4b47f4292ea430db733f7357 Mon Sep 17 00:00:00 2001 From: Daniel Gruno Date: Fri, 21 Feb 2014 11:10:10 +0000 Subject: [PATCH] Allow mod_lua to supply a database result with named rows instead of only numeric indexes. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1570528 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 +++ docs/manual/mod/mod_lua.xml | 1 + modules/lua/lua_dbd.c | 27 +++++++++++++++++++++++---- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index d86fc7c199..0196e7a8fc 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.0 + *) mod_lua: Allow for database results to be returned as a hash with + row-name/value pairs instead of just row-number/value. + *) mod_rewrite: Add RewriteOptions InheritDown, InheritDownBefore, and IgnoreInherit to allow RewriteRules to be pushed from parent scopes to child scopes without explicitly configuring each child scope. diff --git a/docs/manual/mod/mod_lua.xml b/docs/manual/mod/mod_lua.xml index 3b06d1e563..6f780849d7 100644 --- a/docs/manual/mod/mod_lua.xml +++ b/docs/manual/mod/mod_lua.xml @@ -1208,6 +1208,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); }