X-Git-Url: https://gitweb.ps.run/ziglmdb/blobdiff_plain/5c1de78acf66f287ecb213033a1a0752c631dc32..8a83e6882df4994d1e32d7c633dd4e14e937d9a5:/src/db.zig diff --git a/src/db.zig b/src/db.zig index 4062ba9..4e8126d 100644 --- a/src/db.zig +++ b/src/db.zig @@ -27,16 +27,22 @@ pub fn Db(comptime K: type, comptime V: type) type { return try self.dbi.has(k); } pub const Iterator = struct { + pub const Result = struct { key: K, val: V }; cursor: lmdb.Cursor, + dir: enum { Forward, Backward }, k: ?K, v: ?V, - pub fn next(self: *Iterator) ?struct { key: K, val: V } { + pub fn next(self: *Iterator) ?Result { if (self.k != null and self.v != null) { - const result = .{ .key = self.k.?, .val = self.v.? }; + 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; } @@ -51,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 }; } }; } @@ -206,13 +219,13 @@ fn SetListViewBase(comptime K: type, comptime V: type) type { return self.dbi.has(self.item_idx(key)); } pub const Iterator = struct { - pub const Result = ?struct { key: K, val: V }; + pub const Result = struct { key: K, val: V }; slv: SetListViewBase(K, V), idx: ?K, dir: enum { Forward, Backward }, - pub fn next(self: *Iterator) Result { + pub fn next(self: *Iterator) ?Result { if (self.idx != null) { const k = self.idx.?; const item = self.slv.item_get(k) catch return null;