]> gitweb.ps.run Git - ziglmdb/blob - src/main.zig
ce9cde92dcc966fdbdda0f4a8378b0d9213b97e9
[ziglmdb] / src / main.zig
1 const std = @import("std");
2 const lmdb = @cImport(@cInclude("lmdb.h"));
3
4 const print = std.debug.print;
5
6 pub fn Lmdb(comptime KeySize: comptime_int) type {
7     _ = KeySize;
8     return struct {
9         pub fn init(comptime path: []const u8) @This() {
10             var res: @This() = undefined;
11
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);
16
17             _ = lmdb.mdb_env_open(res.env, path.ptr, 0, 0o664);
18             // /*MDB_FIXEDMAP |MDB_NOSYNC |MDB_NOSUBDIR*/
19
20             _ = lmdb.mdb_txn_begin(res.env, null, 0, &res.txn);
21             _ = lmdb.mdb_dbi_open(res.txn, null, 0, &res.dbi);
22
23             return res;
24         }
25
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);
30         }
31
32         pub fn get(self: @This(), comptime T: type, key: []const u8) ?T {
33             var k = lmdb.MDB_val{
34                 .mv_data = @ptrFromInt(@intFromPtr(key.ptr)),
35                 .mv_size = key.len,
36             };
37
38             var v: lmdb.MDB_val = undefined;
39
40             const res = lmdb.mdb_get(self.txn, self.dbi, &k, &v);
41
42             if (res == 0 and v.mv_size == @sizeOf(T)) {
43                 if (v.mv_data) |data| {
44                     return @as(*T, @ptrFromInt(@intFromPtr(data))).*;
45                 }
46             }
47
48             return null;
49         }
50
51         pub fn put(self: @This(), comptime T: type, key: []const u8, val: T) void {
52             var k = lmdb.MDB_val{
53                 .mv_data = @ptrFromInt(@intFromPtr(key.ptr)),
54                 .mv_size = key.len,
55             };
56
57             var v = lmdb.MDB_val{
58                 .mv_data = @ptrFromInt(@intFromPtr(&val)),
59                 .mv_size = @sizeOf(T),
60             };
61
62             const res = lmdb.mdb_put(self.txn, self.dbi, &k, &v, 0);
63             _ = res;
64
65             // return val;
66         }
67
68         env: ?*lmdb.MDB_env,
69         dbi: lmdb.MDB_dbi,
70         txn: ?*lmdb.MDB_txn,
71     };
72 }
73
74 pub fn main() !void {
75     var db = Lmdb(16).init("./db");
76     defer db.deinit();
77
78     var testKey = [_]u8{0} ** 16;
79     @memcpy(testKey[0..5], "abcde");
80     // @memcpy(testKey[5..10], "abcde");
81
82     const u_1 = db.get(u8, &testKey);
83     print("u1: {?}\n", .{u_1});
84
85     var u_2 = db.get(u8, "abcde" ++ "12345");
86     db.put(u8, "abcde" ++ "12345", u_2.? + 1);
87
88     u_2 = db.get(u8, "abcde" ++ "12345");
89     print("u2: {?}\n", .{u_2});
90 }