1 const std = @import("std");
2 const lmdb = @cImport(@cInclude("lmdb.h"));
4 const print = std.debug.print;
6 pub fn Lmdb(comptime KeySize: comptime_int) type {
9 pub fn init(comptime path: []const u8) @This() {
10 var res: @This() = undefined;
12 _ = lmdb.mdb_env_create(&res.env);
13 // mdb_env_set_maxreaders(env, 1);
14 // mdb_env_set_maxdbs(env, 1); // named databases
15 // mdb_env_set_mapsize(env, 1024*1024);
17 _ = lmdb.mdb_env_open(res.env, path.ptr, 0, 0o664);
18 // /*MDB_FIXEDMAP |MDB_NOSYNC |MDB_NOSUBDIR*/
20 _ = lmdb.mdb_txn_begin(res.env, null, 0, &res.txn);
21 _ = lmdb.mdb_dbi_open(res.txn, null, 0, &res.dbi);
26 pub fn deinit(self: @This()) void {
27 _ = lmdb.mdb_txn_commit(self.txn);
28 _ = lmdb.mdb_dbi_close(self.env, self.dbi);
29 _ = lmdb.mdb_env_close(self.env);
32 pub fn get(self: @This(), comptime T: type, key: []const u8) ?T {
34 .mv_data = @ptrFromInt(@intFromPtr(key.ptr)),
38 var v: lmdb.MDB_val = undefined;
40 const res = lmdb.mdb_get(self.txn, self.dbi, &k, &v);
42 if (res == 0 and v.mv_size == @sizeOf(T)) {
43 if (v.mv_data) |data| {
44 return @as(*T, @ptrFromInt(@intFromPtr(data))).*;
51 pub fn put(self: @This(), comptime T: type, key: []const u8, val: T) void {
53 .mv_data = @ptrFromInt(@intFromPtr(key.ptr)),
58 .mv_data = @ptrFromInt(@intFromPtr(&val)),
59 .mv_size = @sizeOf(T),
62 const res = lmdb.mdb_put(self.txn, self.dbi, &k, &v, 0);
75 var db = Lmdb(16).init("./db");
78 var testKey = [_]u8{0} ** 16;
79 @memcpy(testKey[0..5], "abcde");
80 // @memcpy(testKey[5..10], "abcde");
82 const u_1 = db.get(u8, &testKey);
83 print("u1: {?}\n", .{u_1});
85 var u_2 = db.get(u8, "abcde" ++ "12345");
86 db.put(u8, "abcde" ++ "12345", u_2.? + 1);
88 u_2 = db.get(u8, "abcde" ++ "12345");
89 print("u2: {?}\n", .{u_2});