1 const std = @import("std");
2 const lmdb = @cImport(@cInclude("lmdb.h"));
4 const print = std.debug.print;
6 fn get(txn: ?*lmdb.MDB_txn, dbi: lmdb.MDB_dbi, k: anytype, comptime T: type) ?T {
7 var key = lmdb.MDB_val{
8 .mv_size = @sizeOf(@TypeOf(k)),
9 .mv_data = @constCast(@ptrCast(&k)),
11 var val: lmdb.MDB_val = undefined;
12 return switch (lmdb.mdb_get(txn, dbi, &key, &val)) {
13 0 => @as(*T, @ptrFromInt(@intFromPtr(val.mv_data))).*,
16 // print("get err: {}\n", .{err});
22 fn put(txn: ?*lmdb.MDB_txn, dbi: lmdb.MDB_dbi, k: anytype, v: anytype) void {
23 var key = lmdb.MDB_val{
24 .mv_size = @sizeOf(@TypeOf(k)),
25 .mv_data = @constCast(@ptrCast(&k)),
27 var val = lmdb.MDB_val{
28 .mv_size = @sizeOf(@TypeOf(v)),
29 .mv_data = @constCast(@ptrCast(&v)),
31 switch (lmdb.mdb_put(txn, dbi, &key, &val, 0)) {
34 print("put err: {}\n", .{err});
40 var env: ?*lmdb.MDB_env = undefined;
41 _ = lmdb.mdb_env_create(&env);
42 _ = lmdb.mdb_env_set_maxdbs(env, 10);
43 _ = lmdb.mdb_env_set_mapsize(env, 1024 * 1024 * 120);
44 _ = lmdb.mdb_env_open(env, "./db1", lmdb.MDB_NOSYNC | lmdb.MDB_WRITEMAP, 0o664);
45 defer lmdb.mdb_env_close(env);
47 for (0..1000000) |i| {
48 var txn: ?*lmdb.MDB_txn = undefined;
49 switch (lmdb.mdb_txn_begin(env, null, 0, &txn)) {
52 print("txn err: {}\n", .{err});
56 var db: lmdb.MDB_dbi = undefined;
57 _ = lmdb.mdb_dbi_open(txn, "subdb2", lmdb.MDB_CREATE | lmdb.MDB_INTEGERKEY, &db);
59 var db_stat: lmdb.MDB_stat = undefined;
60 _ = lmdb.mdb_stat(txn, db, &db_stat);
61 // print("{}\n", .{db_stat});
63 defer lmdb.mdb_dbi_close(env, db);
76 std.mem.copyForwards(u8, &new_val.c, "a c efghabcdefgh");
78 const key: u64 = i + 1000;
79 if (get(txn, db, key, Val)) |val| {
80 if (i % 100000 == 0) {
81 print("{}: {}\n", .{ i, val });
86 std.mem.copyForwards(u8, &new_val.c, "a c efghabcdefgh");
88 if (i % 100000 == 0) {
89 print("not found\n", .{});
93 put(txn, db, key, new_val);
95 switch (lmdb.mdb_txn_commit(txn)) {
97 lmdb.MDB_MAP_FULL => {
98 print("resize\n", .{});
99 _ = lmdb.mdb_env_set_mapsize(env, 0);
102 print("commit err: {}\n", .{err});
107 switch (lmdb.mdb_env_sync(env, 1)) {
110 print("sync err: {}\n", .{err});
114 // var env_info: lmdb.MDB_envinfo = undefined;
115 // _ = lmdb.mdb_env_info(env, &env_info);
117 // var env_stat: lmdb.MDB_stat = undefined;
118 // _ = lmdb.mdb_env_stat(env, &env_stat);
120 // print("{}\n", .{env_info});
121 // print("{}\n", .{env_stat});
123 print("done!\n", .{});
127 const pw = "affeaffe";
129 var hash_buffer: [128]u8 = undefined;
131 var buffer: [1024 * 1024]u8 = undefined;
132 var alloc = std.heap.FixedBufferAllocator.init(&buffer);
134 const result = try std.crypto.pwhash.argon2.strHash(pw, .{
135 .allocator = alloc.allocator(),
136 .params = std.crypto.pwhash.argon2.Params.fromLimits(1000, 1024 * 10),
139 print("{s}\n", .{result});
141 if (std.crypto.pwhash.argon2.strVerify(result, "affeaffe", .{
142 .allocator = alloc.allocator(),
144 print("verified\n", .{});
146 print("not verified: {}\n", .{err});