treesummaryrefslogcommitdiff
path: root/src
diff options
context:
space:
mode:
authorpatrick-scho2024-10-20 18:28:38 +0200
committerpatrick-scho2024-10-20 18:29:44 +0200
commit1adf3709493825c0d304efb99ba520740d8d69e3 (patch)
treec1ee1ab49adec6affb23c0e43788d485a5d4dde0 /src
downloadziglmdb-1adf3709493825c0d304efb99ba520740d8d69e3.tar.gz
ziglmdb-1adf3709493825c0d304efb99ba520740d8d69e3.zip
inital commit
Diffstat (limited to 'src')
-rw-r--r--src/main.zig90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/main.zig b/src/main.zig
new file mode 100644
index 0000000..ce9cde9
--- /dev/null
+++ b/src/main.zig
@@ -0,0 +1,90 @@
+const std = @import("std");
+const lmdb = @cImport(@cInclude("lmdb.h"));
+
+const print = std.debug.print;
+
+pub fn Lmdb(comptime KeySize: comptime_int) type {
+ _ = KeySize;
+ return struct {
+ pub fn init(comptime path: []const u8) @This() {
+ var res: @This() = undefined;
+
+ _ = lmdb.mdb_env_create(&res.env);
+ // mdb_env_set_maxreaders(env, 1);
+ // mdb_env_set_maxdbs(env, 1); // named databases
+ // mdb_env_set_mapsize(env, 1024*1024);
+
+ _ = lmdb.mdb_env_open(res.env, path.ptr, 0, 0o664);
+ // /*MDB_FIXEDMAP |MDB_NOSYNC |MDB_NOSUBDIR*/
+
+ _ = lmdb.mdb_txn_begin(res.env, null, 0, &res.txn);
+ _ = lmdb.mdb_dbi_open(res.txn, null, 0, &res.dbi);
+
+ return res;
+ }
+
+ pub fn deinit(self: @This()) void {
+ _ = lmdb.mdb_txn_commit(self.txn);
+ _ = lmdb.mdb_dbi_close(self.env, self.dbi);
+ _ = lmdb.mdb_env_close(self.env);
+ }
+
+ pub fn get(self: @This(), comptime T: type, key: []const u8) ?T {
+ var k = lmdb.MDB_val{
+ .mv_data = @ptrFromInt(@intFromPtr(key.ptr)),
+ .mv_size = key.len,
+ };
+
+ var v: lmdb.MDB_val = undefined;
+
+ const res = lmdb.mdb_get(self.txn, self.dbi, &k, &v);
+
+ if (res == 0 and v.mv_size == @sizeOf(T)) {
+ if (v.mv_data) |data| {
+ return @as(*T, @ptrFromInt(@intFromPtr(data))).*;
+ }
+ }
+
+ return null;
+ }
+
+ pub fn put(self: @This(), comptime T: type, key: []const u8, val: T) void {
+ var k = lmdb.MDB_val{
+ .mv_data = @ptrFromInt(@intFromPtr(key.ptr)),
+ .mv_size = key.len,
+ };
+
+ var v = lmdb.MDB_val{
+ .mv_data = @ptrFromInt(@intFromPtr(&val)),
+ .mv_size = @sizeOf(T),
+ };
+
+ const res = lmdb.mdb_put(self.txn, self.dbi, &k, &v, 0);
+ _ = res;
+
+ // return val;
+ }
+
+ env: ?*lmdb.MDB_env,
+ dbi: lmdb.MDB_dbi,
+ txn: ?*lmdb.MDB_txn,
+ };
+}
+
+pub fn main() !void {
+ var db = Lmdb(16).init("./db");
+ defer db.deinit();
+
+ var testKey = [_]u8{0} ** 16;
+ @memcpy(testKey[0..5], "abcde");
+ // @memcpy(testKey[5..10], "abcde");
+
+ const u_1 = db.get(u8, &testKey);
+ print("u1: {?}\n", .{u_1});
+
+ var u_2 = db.get(u8, "abcde" ++ "12345");
+ db.put(u8, "abcde" ++ "12345", u_2.? + 1);
+
+ u_2 = db.get(u8, "abcde" ++ "12345");
+ print("u2: {?}\n", .{u_2});
+}