diff options
| -rw-r--r-- | build.zig | 17 | ||||
| -rw-r--r-- | src/c.h | 1 | ||||
| -rw-r--r-- | src/lmdb.zig | 190 |
3 files changed, 110 insertions, 98 deletions
@@ -4,12 +4,24 @@ pub fn build(b: *std.Build) void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); + const translate_c = b.addTranslateC(.{ + .root_source_file = b.path("src/c.h"), + .target = target, + .optimize = optimize, + }); + translate_c.addIncludePath(b.path("lmdb")); + const lmdb = b.addModule("lmdb", .{ .root_source_file = b.path("src/lmdb.zig"), .target = target, .optimize = optimize, + .imports = &.{ + .{ + .name = "c", + .module = translate_c.createModule(), + }, + }, }); - lmdb.addIncludePath(b.path("lmdb")); lmdb.addCSourceFiles(.{ .files = &.{ "./lmdb/midl.c", "./lmdb/mdb.c", @@ -26,13 +38,10 @@ pub fn build(b: *std.Build) void { const lmdb_tests = b.addTest(.{ .root_module = lmdb, }); - lmdb_tests.addIncludePath(b.path("lmdb")); - lmdb_tests.linkLibC(); const db_tests = b.addTest(.{ .root_module = db, }); - db_tests.root_module.addImport("lmdb", lmdb); const lmdb_test_bin = b.addInstallBinFile(lmdb_tests.getEmittedBin(), "./lmdb_test"); const db_test_bin = b.addInstallBinFile(db_tests.getEmittedBin(), "./db_test"); @@ -0,0 +1 @@ +#include <lmdb.h> diff --git a/src/lmdb.zig b/src/lmdb.zig index b7d97ea..39a50f2 100644 --- a/src/lmdb.zig +++ b/src/lmdb.zig @@ -1,46 +1,46 @@ const std = @import("std"); -const lmdb = @cImport(@cInclude("lmdb.h")); +const c = @import("c"); pub const Cursor = struct { const Self = @This(); pub const Flags = enum(c_uint) { - First = lmdb.MDB_FIRST, - FirstDup = lmdb.MDB_FIRST_DUP, - GetBoth = lmdb.MDB_GET_BOTH, - GetBothRange = lmdb.MDB_GET_BOTH_RANGE, - GetCurrent = lmdb.MDB_GET_CURRENT, - GetMultiple = lmdb.MDB_GET_MULTIPLE, - Last = lmdb.MDB_LAST, - LastDup = lmdb.MDB_LAST_DUP, - Next = lmdb.MDB_NEXT, - NextDup = lmdb.MDB_NEXT_DUP, - NextMultiple = lmdb.MDB_NEXT_MULTIPLE, - NextNodup = lmdb.MDB_NEXT_NODUP, - Prev = lmdb.MDB_PREV, - PrevDup = lmdb.MDB_PREV_DUP, - PrevNodup = lmdb.MDB_PREV_NODUP, - Set = lmdb.MDB_SET, - SetKey = lmdb.MDB_SET_KEY, - SetRange = lmdb.MDB_SET_RANGE, + First = c.MDB_FIRST, + FirstDup = c.MDB_FIRST_DUP, + GetBoth = c.MDB_GET_BOTH, + GetBothRange = c.MDB_GET_BOTH_RANGE, + GetCurrent = c.MDB_GET_CURRENT, + GetMultiple = c.MDB_GET_MULTIPLE, + Last = c.MDB_LAST, + LastDup = c.MDB_LAST_DUP, + Next = c.MDB_NEXT, + NextDup = c.MDB_NEXT_DUP, + NextMultiple = c.MDB_NEXT_MULTIPLE, + NextNodup = c.MDB_NEXT_NODUP, + Prev = c.MDB_PREV, + PrevDup = c.MDB_PREV_DUP, + PrevNodup = c.MDB_PREV_NODUP, + Set = c.MDB_SET, + SetKey = c.MDB_SET_KEY, + SetRange = c.MDB_SET_RANGE, }; - ptr: ?*lmdb.MDB_cursor = undefined, + ptr: ?*c.MDB_cursor = undefined, pub fn close(self: Self) void { - lmdb.mdb_cursor_close(self.ptr); + c.mdb_cursor_close(self.ptr); } pub fn put(self: Self, k: anytype, v: anytype) !void { - var key = lmdb.MDB_val{ + var key = c.MDB_val{ .mv_size = @sizeOf(@TypeOf(k)), - .mv_data = @constCast(@ptrCast(&k)), + .mv_data = @ptrCast(@constCast(&k)), }; - var val = lmdb.MDB_val{ + var val = c.MDB_val{ .mv_size = @sizeOf(@TypeOf(v)), - .mv_data = @constCast(@ptrCast(&v)), + .mv_data = @ptrCast(@constCast(&v)), }; - switch (lmdb.mdb_cursor_put(self.ptr, &key, &val, 0)) { + switch (c.mdb_cursor_put(self.ptr, &key, &val, 0)) { 0 => {}, else => |err| { _ = err; @@ -53,18 +53,18 @@ pub const Cursor = struct { const k_ti = @typeInfo(@TypeOf(k)); const K = k_ti.pointer.child; - var key = lmdb.MDB_val{ + var key = c.MDB_val{ .mv_size = @sizeOf(K), - .mv_data = @constCast(@ptrCast(k)), + .mv_data = @ptrCast(@constCast(k)), }; - var val: lmdb.MDB_val = undefined; - return switch (lmdb.mdb_cursor_get(self.ptr, &key, &val, @intFromEnum(flags))) { + var val: c.MDB_val = undefined; + return switch (c.mdb_cursor_get(self.ptr, &key, &val, @intFromEnum(flags))) { 0 => { const ptr = @as(*K, @constCast(k)); ptr.* = std.mem.bytesToValue(K, key.mv_data.?); return std.mem.bytesToValue(V, val.mv_data.?); }, - lmdb.MDB_NOTFOUND => null, + c.MDB_NOTFOUND => null, else => |err| { _ = err; return error.CursorGet; @@ -73,11 +73,11 @@ pub const Cursor = struct { } pub fn del(self: Self, k: anytype) !void { - var key = lmdb.MDB_val{ + var key = c.MDB_val{ .mv_size = @sizeOf(@TypeOf(k)), - .mv_data = @constCast(@ptrCast(&k)), + .mv_data = @ptrCast(@constCast(&k)), }; - switch (lmdb.mdb_cursor_del(self.ptr, &key, 0)) { + switch (c.mdb_cursor_del(self.ptr, &key, 0)) { 0 => {}, else => |err| { _ = err; @@ -90,16 +90,16 @@ pub const Cursor = struct { const k_ti = @typeInfo(@TypeOf(k)); const K = k_ti.pointer.child; - var key = lmdb.MDB_val{ + var key = c.MDB_val{ .mv_size = @sizeOf(K), - .mv_data = @constCast(@ptrCast(k)), + .mv_data = @ptrCast(@constCast(k)), }; - var val: lmdb.MDB_val = undefined; - return switch (lmdb.mdb_cursor_get(self.ptr, &key, &val, @intFromEnum(flags))) { + var val: c.MDB_val = undefined; + return switch (c.mdb_cursor_get(self.ptr, &key, &val, @intFromEnum(flags))) { 0 => { return true; }, - lmdb.MDB_NOTFOUND => { + c.MDB_NOTFOUND => { return false; }, else => { @@ -112,34 +112,34 @@ pub const Cursor = struct { pub const Dbi = struct { const Self = @This(); - ptr: lmdb.MDB_dbi = undefined, + ptr: c.MDB_dbi = undefined, txn: Txn = undefined, env: Env = undefined, pub fn close(self: Self) void { // TODO: necessary? - lmdb.mdb_dbi_close(self.env.ptr, self.ptr); + c.mdb_dbi_close(self.env.ptr, self.ptr); } pub fn cursor(self: Self) !Cursor { var result = Cursor{}; - return switch (lmdb.mdb_cursor_open(self.txn.ptr, self.ptr, &result.ptr)) { + return switch (c.mdb_cursor_open(self.txn.ptr, self.ptr, &result.ptr)) { 0 => result, else => error.DbiCursor, }; } pub fn put(self: Self, k: anytype, v: anytype) !void { - var key = lmdb.MDB_val{ + var key = c.MDB_val{ .mv_size = @sizeOf(@TypeOf(k)), - .mv_data = @constCast(@ptrCast(&k)), + .mv_data = @ptrCast(@constCast(&k)), }; - var val = lmdb.MDB_val{ + var val = c.MDB_val{ .mv_size = @sizeOf(@TypeOf(v)), - .mv_data = @constCast(@ptrCast(&v)), + .mv_data = @ptrCast(@constCast(&v)), }; - switch (lmdb.mdb_put(self.txn.ptr, self.ptr, &key, &val, 0)) { + switch (c.mdb_put(self.txn.ptr, self.ptr, &key, &val, 0)) { 0 => {}, else => |err| { _ = err; @@ -149,29 +149,31 @@ pub const Dbi = struct { } pub fn get(self: Self, k: anytype, comptime V: type) !V { - var key = lmdb.MDB_val{ + var key = c.MDB_val{ .mv_size = @sizeOf(@TypeOf(k)), - .mv_data = @constCast(@ptrCast(&k)), + .mv_data = @ptrCast(@constCast(&k)), }; - var val: lmdb.MDB_val = undefined; - return switch (lmdb.mdb_get(self.txn.ptr, self.ptr, &key, &val)) { + var val: c.MDB_val = undefined; + switch (c.mdb_get(self.txn.ptr, self.ptr, &key, &val)) { 0 => { return std.mem.bytesToValue(V, val.mv_data.?); }, - lmdb.MDB_NOTFOUND => error.NotFound, + c.MDB_NOTFOUND => { + return error.NotFound; + }, else => |err| { _ = err; return error.DbiGet; }, - }; + } } pub fn del(self: Self, k: anytype) !void { - var key = lmdb.MDB_val{ + var key = c.MDB_val{ .mv_size = @sizeOf(@TypeOf(k)), - .mv_data = @constCast(@ptrCast(&k)), + .mv_data = @ptrCast(@constCast(&k)), }; - switch (lmdb.mdb_del(self.txn.ptr, self.ptr, &key, null)) { + switch (c.mdb_del(self.txn.ptr, self.ptr, &key, null)) { 0 => {}, else => |err| { _ = err; @@ -181,16 +183,16 @@ pub const Dbi = struct { } pub fn has(self: Self, k: anytype) !bool { - var key = lmdb.MDB_val{ + var key = c.MDB_val{ .mv_size = @sizeOf(@TypeOf(k)), - .mv_data = @constCast(@ptrCast(&k)), + .mv_data = @ptrCast(@constCast(&k)), }; - var val: lmdb.MDB_val = undefined; - return switch (lmdb.mdb_get(self.txn.ptr, self.ptr, &key, &val)) { + var val: c.MDB_val = undefined; + return switch (c.mdb_get(self.txn.ptr, self.ptr, &key, &val)) { 0 => { return true; }, - lmdb.MDB_NOTFOUND => { + c.MDB_NOTFOUND => { return false; }, else => |err| { @@ -202,13 +204,13 @@ pub const Dbi = struct { }; pub const Txn = struct { - ptr: ?*lmdb.MDB_txn = undefined, + ptr: ?*c.MDB_txn = undefined, env: Env = undefined, pub fn dbi(self: Txn, name: ?[:0]const u8) !Dbi { var result = Dbi{ .env = self.env, .txn = self }; - // TODO: lmdb.MDB_INTEGERKEY? - switch (lmdb.mdb_dbi_open(self.ptr, @ptrCast(name), lmdb.MDB_CREATE, &result.ptr)) { + // TODO: c.MDB_INTEGERKEY? + switch (c.mdb_dbi_open(self.ptr, @ptrCast(name), c.MDB_CREATE, &result.ptr)) { 0 => return result, else => |err| { _ = err; @@ -218,10 +220,10 @@ pub const Txn = struct { } pub fn commit(self: Txn) !void { - switch (lmdb.mdb_txn_commit(self.ptr)) { + switch (c.mdb_txn_commit(self.ptr)) { 0 => {}, - lmdb.MDB_MAP_FULL => { - _ = lmdb.mdb_env_set_mapsize(self.env.ptr, 0); + c.MDB_MAP_FULL => { + _ = c.mdb_env_set_mapsize(self.env.ptr, 0); return error.TxnCommitMapFull; }, else => |err| { @@ -232,21 +234,21 @@ pub const Txn = struct { } pub fn abort(self: Txn) void { - lmdb.mdb_txn_abort(self.ptr); + c.mdb_txn_abort(self.ptr); } }; pub const Env = struct { - ptr: ?*lmdb.MDB_env = undefined, + ptr: ?*c.MDB_env = undefined, - pub fn open(name: [:0]const u8, size: lmdb.mdb_size_t) !Env { + pub fn open(name: [:0]const u8, size: c.mdb_size_t) !Env { var result = Env{}; - _ = lmdb.mdb_env_create(&result.ptr); - _ = lmdb.mdb_env_set_maxdbs(result.ptr, 10); - _ = lmdb.mdb_env_set_mapsize(result.ptr, size); - const res = lmdb.mdb_env_open(result.ptr, name, lmdb.MDB_WRITEMAP | lmdb.MDB_NOSUBDIR, 0o664); - // _ = lmdb.mdb_env_open(result.ptr, name, lmdb.MDB_NOSYNC | lmdb.MDB_WRITEMAP, 0o664); + _ = c.mdb_env_create(&result.ptr); + _ = c.mdb_env_set_maxdbs(result.ptr, 10); + _ = c.mdb_env_set_mapsize(result.ptr, size); + const res = c.mdb_env_open(result.ptr, name, c.MDB_WRITEMAP | c.MDB_NOSUBDIR, 0o664); + // _ = c.mdb_env_open(result.ptr, name, c.MDB_NOSYNC | c.MDB_WRITEMAP, 0o664); if (res != 0) { return error.EnvOpen; @@ -256,12 +258,12 @@ pub const Env = struct { } pub fn close(self: Env) void { - lmdb.mdb_env_close(self.ptr); + c.mdb_env_close(self.ptr); } pub fn txn(self: Env) !Txn { var result = Txn{ .env = self }; - switch (lmdb.mdb_txn_begin(self.ptr, null, 0, &result.ptr)) { + switch (c.mdb_txn_begin(self.ptr, null, 0, &result.ptr)) { 0 => return result, else => |err| { _ = err; @@ -271,7 +273,7 @@ pub const Env = struct { } pub fn sync(self: Env) !void { - switch (lmdb.mdb_env_sync(self.ptr, 1)) { + switch (c.mdb_env_sync(self.ptr, 1)) { 0 => {}, else => |err| { _ = err; @@ -341,13 +343,13 @@ test "cursor" { } } -// pub fn get(txn: ?*lmdb.MDB_txn, dbi: lmdb.MDB_dbi, k: anytype, comptime T: type) ?T { -// var key = lmdb.MDB_val{ +// pub fn get(txn: ?*c.MDB_txn, dbi: c.MDB_dbi, k: anytype, comptime T: type) ?T { +// var key = c.MDB_val{ // .mv_size = @sizeOf(@TypeOf(k)), // .mv_data = @constCast(@ptrCast(&k)), // }; -// var val: lmdb.MDB_val = undefined; -// return switch (lmdb.mdb_get(txn, dbi, &key, &val)) { +// var val: c.MDB_val = undefined; +// return switch (c.mdb_get(txn, dbi, &key, &val)) { // 0 => @as(?*align(1) T, @alignCast(@ptrCast(val.mv_data))).?.*, // else => |err| { // std.debug.print("get err: {}\n", .{err}); @@ -356,16 +358,16 @@ test "cursor" { // }; // } -// pub fn put(txn: ?*lmdb.MDB_txn, dbi: lmdb.MDB_dbi, k: anytype, v: anytype) void { -// var key = lmdb.MDB_val{ +// pub fn put(txn: ?*c.MDB_txn, dbi: c.MDB_dbi, k: anytype, v: anytype) void { +// var key = c.MDB_val{ // .mv_size = @sizeOf(@TypeOf(k)), // .mv_data = @constCast(@ptrCast(&k)), // }; -// var val = lmdb.MDB_val{ +// var val = c.MDB_val{ // .mv_size = @sizeOf(@TypeOf(v)), // .mv_data = @constCast(@ptrCast(&v)), // }; -// switch (lmdb.mdb_put(txn, dbi, &key, &val, 0)) { +// switch (c.mdb_put(txn, dbi, &key, &val, 0)) { // 0 => {}, // else => |err| { // std.debug.print("put err: {}\n", .{err}); @@ -373,12 +375,12 @@ test "cursor" { // } // } -// pub fn del(txn: ?*lmdb.MDB_txn, dbi: lmdb.MDB_dbi, k: anytype) void { -// var key = lmdb.MDB_val{ +// pub fn del(txn: ?*c.MDB_txn, dbi: c.MDB_dbi, k: anytype) void { +// var key = c.MDB_val{ // .mv_size = @sizeOf(@TypeOf(k)), // .mv_data = @constCast(@ptrCast(&k)), // }; -// switch (lmdb.mdb_del(txn, dbi, &key, null)) { +// switch (c.mdb_del(txn, dbi, &key, null)) { // 0 => {}, // else => |err| { // std.debug.print("del err: {}\n", .{err}); @@ -386,15 +388,15 @@ test "cursor" { // } // } -// pub fn has(txn: ?*lmdb.MDB_txn, dbi: lmdb.MDB_dbi, k: anytype) bool { -// var key = lmdb.MDB_val{ +// pub fn has(txn: ?*c.MDB_txn, dbi: c.MDB_dbi, k: anytype) bool { +// var key = c.MDB_val{ // .mv_size = @sizeOf(@TypeOf(k)), // .mv_data = @constCast(@ptrCast(&k)), // }; -// var val: lmdb.MDB_val = undefined; -// return switch (lmdb.mdb_get(txn, dbi, &key, &val)) { +// var val: c.MDB_val = undefined; +// return switch (c.mdb_get(txn, dbi, &key, &val)) { // 0 => true, -// lmdb.MDB_NOTFOUND => false, +// c.MDB_NOTFOUND => false, // else => |err| { // std.debug.print("has err: {}\n", .{err}); // return false; |
