diff options
| author | patrick-scho | 2025-04-21 16:19:21 +0200 |
|---|---|---|
| committer | patrick-scho | 2025-04-21 16:19:21 +0200 |
| commit | 8a83e6882df4994d1e32d7c633dd4e14e937d9a5 (patch) | |
| tree | b796f779cb7678644334e2e2d8d952349d6c41e4 /src/db.zig | |
| parent | f585842e51d2e0ded5ee2e941e468657a1f93aff (diff) | |
| download | ziglmdb-8a83e6882df4994d1e32d7c633dd4e14e937d9a5.tar.gz ziglmdb-8a83e6882df4994d1e32d7c633dd4e14e937d9a5.zip | |
add reverse iterator to DB
Diffstat (limited to 'src/db.zig')
| -rw-r--r-- | src/db.zig | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -29,6 +29,7 @@ pub fn Db(comptime K: type, comptime V: type) type { pub const Iterator = struct { pub const Result = struct { key: K, val: V }; cursor: lmdb.Cursor, + dir: enum { Forward, Backward }, k: ?K, v: ?V, @@ -37,7 +38,11 @@ pub fn Db(comptime K: type, comptime V: type) type { const result = Result{ .key = self.k.?, .val = self.v.? }; var k = self.k.?; - self.v = self.cursor.get(&k, V, .Next) catch return null; + if (self.dir == .Forward) { + self.v = self.cursor.get(&k, V, .Next) catch return null; + } else { + self.v = self.cursor.get(&k, V, .Prev) catch return null; + } if (self.v != null) { self.k = k; } @@ -52,7 +57,14 @@ pub fn Db(comptime K: type, comptime V: type) type { var k: K = undefined; const v = try cursor.get(&k, V, .First); - return .{ .cursor = cursor, .k = k, .v = v }; + return .{ .cursor = cursor, .dir = .Forward, .k = k, .v = v }; + } + pub fn reverse_iterator(self: Self) !Iterator { + var cursor = try self.dbi.cursor(); + + var k: K = undefined; + const v = try cursor.get(&k, V, .Last); + return .{ .cursor = cursor, .dir = .Backward, .k = k, .v = v }; } }; } |
