the Set-Cookie header. PR56105
[Kevin J Walters <kjw ms com>, Edward Lu <Chaosed0 gmail com>]
+ *) 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 <Chaosed0 gmail com>]
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:
* limitations under the License.
*/
+
#include "mod_lua.h"
#include "lua_dbd.h"
*/
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);
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);
}
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);
}