]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Allow mod_lua to supply a database result with named rows instead of only numeric...
authorDaniel Gruno <humbedooh@apache.org>
Fri, 21 Feb 2014 11:10:10 +0000 (11:10 +0000)
committerDaniel Gruno <humbedooh@apache.org>
Fri, 21 Feb 2014 11:10:10 +0000 (11:10 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1570528 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
docs/manual/mod/mod_lua.xml
modules/lua/lua_dbd.c

diff --git a/CHANGES b/CHANGES
index d86fc7c199ca1c3b0d762cd051ee2fe28a12301d..0196e7a8fc380502f0dec1d93a551515b0d8f761 100644 (file)
--- 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.
index 3b06d1e563ae1696bf80a792c227607ba89b89cf..6f780849d743d24b90d18809fa7350a616910dbe 100644 (file)
@@ -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.
     </highlight>
     <p>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:
index 501156f803e1217d4d9885fb803cfc34355f40fa..8b61a60b10752d9501cff86d8a5d9ff067ee2928 100644 (file)
@@ -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);
             }