1
0
mirror of https://github.com/apache/httpd.git synced 2025-08-07 04:02:58 +03:00

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
This commit is contained in:
Daniel Gruno
2014-02-21 11:10:10 +00:00
parent 5c9c72c169
commit dde9e0effa
3 changed files with 27 additions and 4 deletions

View File

@@ -1,6 +1,9 @@
-*- coding: utf-8 -*- -*- coding: utf-8 -*-
Changes with Apache 2.5.0 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, *) mod_rewrite: Add RewriteOptions InheritDown, InheritDownBefore,
and IgnoreInherit to allow RewriteRules to be pushed from parent scopes and IgnoreInherit to allow RewriteRules to be pushed from parent scopes
to child scopes without explicitly configuring each child scope. to child scopes without explicitly configuring each child scope.

View 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 rows = result(0) -- Fetch ALL rows synchronously
local row = result(-1) -- Fetch the next available row, asynchronously local row = result(-1) -- Fetch the next available row, asynchronously
local row = result(1234) -- Fetch row number 1234, 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> </highlight>
<p>One can construct a function that returns an iterative function to iterate over all rows <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: in a synchronous or asynchronous way, depending on the async argument:

View File

@@ -15,6 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
#include "mod_lua.h" #include "mod_lua.h"
#include "lua_dbd.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 lua_db_get_row(lua_State *L)
{ {
int row_no,x; int row_no,x,alpha = 0;
const char *entry; const char *entry, *rowname;
apr_dbd_row_t *row = 0; apr_dbd_row_t *row = 0;
lua_db_result_set *res = lua_get_result_set(L); lua_db_result_set *res = lua_get_result_set(L);
row_no = luaL_optinteger(L, 2, 0); row_no = luaL_optinteger(L, 2, 0);
if (lua_isboolean(L, 3)) {
alpha = lua_toboolean(L, 3);
}
lua_settop(L,0); lua_settop(L,0);
/* Fetch all rows at once? */ /* Fetch all rows at once? */
if (row_no == 0) { if (row_no == 0) {
row_no = 1; row_no = 1;
lua_newtable(L); lua_newtable(L);
@@ -248,7 +253,14 @@ int lua_db_get_row(lua_State *L)
for (x = 0; x < res->cols; x++) { for (x = 0; x < res->cols; x++) {
entry = apr_dbd_get_entry(res->driver, row, x); entry = apr_dbd_get_entry(res->driver, row, x);
if (entry) { 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_pushstring(L, entry);
lua_rawset(L, -3); lua_rawset(L, -3);
} }
@@ -268,7 +280,14 @@ int lua_db_get_row(lua_State *L)
for (x = 0; x < res->cols; x++) { for (x = 0; x < res->cols; x++) {
entry = apr_dbd_get_entry(res->driver, row, x); entry = apr_dbd_get_entry(res->driver, row, x);
if (entry) { 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_pushstring(L, entry);
lua_rawset(L, -3); lua_rawset(L, -3);
} }