aboutsummaryrefslogtreecommitdiff
path: root/lmdb.c
diff options
context:
space:
mode:
authorthe lemons <citrons@mondecitronne.com>2022-12-06 02:51:22 -0600
committerthe lemons <citrons@mondecitronne.com>2022-12-06 02:51:22 -0600
commit2731d37fe4f62b1ce9bfd7da09d1636082526fc2 (patch)
treea565906cb973deb5e82c41c534b38d2729cc30da /lmdb.c
parent442acbe4ea0769d81d39c93572b859fb145b17f4 (diff)
add lmdb.next and pairs(db)
Diffstat (limited to 'lmdb.c')
-rw-r--r--lmdb.c43
1 files changed, 43 insertions, 0 deletions
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},
};