47 lines
1.4 KiB
Zig
47 lines
1.4 KiB
Zig
const std = @import("std");
|
|
const encode = @import("encode.zig");
|
|
|
|
const Allocator = std.mem.Allocator;
|
|
const Kind = encode.Kind;
|
|
|
|
pub const Op = struct {
|
|
kind: Kind,
|
|
key: []u8,
|
|
value: []u8,
|
|
};
|
|
|
|
pub const WriteBatch = struct {
|
|
allocator: Allocator,
|
|
ops: std.ArrayList(Op),
|
|
|
|
pub fn init(allocator: Allocator) WriteBatch {
|
|
return .{ .allocator = allocator, .ops = std.ArrayList(Op).init(allocator) };
|
|
}
|
|
|
|
pub fn deinit(self: *WriteBatch) void {
|
|
for (self.ops.items) |op| {
|
|
self.allocator.free(op.key);
|
|
self.allocator.free(op.value);
|
|
}
|
|
self.ops.deinit();
|
|
}
|
|
|
|
pub fn put(self: *WriteBatch, key: []const u8, value: []const u8) !void {
|
|
const keyCopy = try self.allocator.dupe(u8, key);
|
|
errdefer self.allocator.free(keyCopy);
|
|
const valueCopy = try self.allocator.dupe(u8, value);
|
|
try self.ops.append(.{ .kind = .value, .key = keyCopy, .value = valueCopy });
|
|
}
|
|
|
|
pub fn delete(self: *WriteBatch, key: []const u8) !void {
|
|
const keyCopy = try self.allocator.dupe(u8, key);
|
|
errdefer self.allocator.free(keyCopy);
|
|
const valueCopy = try self.allocator.dupe(u8, &.{});
|
|
try self.ops.append(.{ .kind = .tombstone, .key = keyCopy, .value = valueCopy });
|
|
}
|
|
|
|
pub fn count(self: *const WriteBatch) usize {
|
|
return self.ops.items.len;
|
|
}
|
|
};
|