diff options
Diffstat (limited to 'lmdb.c')
| -rw-r--r-- | lmdb.c | 43 |
1 files changed, 43 insertions, 0 deletions
@@ -276,6 +276,47 @@ static int db_put(lua_State *L) { return 0; } +static int db_next(lua_State *L) { + lua_settop(L, 2); + MDB_dbi dbi = *(MDB_dbi *) luaL_checkudata(L, 1, "lmdb.db"); + check_env(L, 1); + luaL_argcheck( + L, lua_isnil(L, 2) || lua_isstring(L, 2), 2, "expected string or nil"); + + lua_getuservalue(L, 1); + struct handle *tud = lua_touserdata(L, -1); + MDB_cursor *curs; + asserr(mdb_cursor_open(tud->obj, dbi, &curs)); + + MDB_val key; + MDB_val data; + int result; + if (!lua_isnil(L, 2)) { + key = toval(L, 2); + asserr(mdb_cursor_get(curs, &key, &data, MDB_SET)); + result = mdb_cursor_get(curs, &key, &data, MDB_NEXT); + } else + result = mdb_cursor_get(curs, &key, &data, MDB_FIRST); + if (result == MDB_NOTFOUND) { + lua_pushnil(L); + return 1; + } else asserr(result); + + fromval(L, key); + fromval(L, data); + mdb_cursor_close(curs); + return 2; +} + +static int db_pairs(lua_State *L) { + lua_settop(L, 1); + luaL_checkudata(L, 1, "lmdb.db"); + lua_pushcfunction(L, db_next); + lua_pushvalue(L, 1); + lua_pushnil(L); + return 3; +} + static int db_drop(lua_State *L) { lua_settop(L, 2); struct handle *ud = luaL_checkudata(L, 1, "lmdb.txn"); @@ -294,6 +335,7 @@ static int db_drop(lua_State *L) { static const struct luaL_Reg lmdb[] = { {"open", env_open}, {"version", version}, + {"next", db_next}, {NULL, NULL}, }; @@ -322,6 +364,7 @@ static const struct luaL_Reg lmdb_txn[] = { static const struct luaL_Reg lmdb_db[] = { {"__index", db_get}, {"__newindex", db_put}, + {"__pairs", db_pairs}, {NULL, NULL}, }; |
