From 2731d37fe4f62b1ce9bfd7da09d1636082526fc2 Mon Sep 17 00:00:00 2001 From: the lemons Date: Tue, 6 Dec 2022 02:51:22 -0600 Subject: add lmdb.next and pairs(db) --- lmdb.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'lmdb.c') diff --git a/lmdb.c b/lmdb.c index 7e562c0..d85ce4f 100644 --- a/lmdb.c +++ b/lmdb.c @@ -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}, }; -- cgit v1.2.3