tiny.sql.Write
Defined in store.
API (9)
Actions
Public operations.
Fields and members
Public fields and members.
Source
Source: lib/sql/src/store.zig:162
zig
pub const Write = struct { store: *Store, snapshot_generation: u64, mutations: std.ArrayList(Mutation) = .empty, closed: bool = false, pub fn deinit(self: *Write) void { for (self.mutations.items) |*mutation| mutation.deinit(self.store.allocator); self.mutations.deinit(self.store.allocator); self.closed = true; } pub fn get(self: *const Write, key: []const u8) Error!?[]const u8 { if (self.closed) return error.TransactionClosed; if (self.localMutation(key)) |mutation| { if (mutation.deleted) return null; return mutation.value; } return self.store.getAt(key, self.snapshot_generation); } pub fn put(self: *Write, key: []const u8, value: []const u8) Error!void { if (self.closed) return error.TransactionClosed; const phase = trace.scope("write.put"); defer phase.end(); try self.setMutation(key, value, false); } pub fn delete(self: *Write, key: []const u8) Error!void { if (self.closed) return error.TransactionClosed; const phase = trace.scope("write.delete"); defer phase.end(); try self.setMutation(key, &.{}, true); } pub fn commit(self: *Write) Error!u64 { if (self.closed) return error.TransactionClosed; const phase = trace.scope("write.commit"); defer phase.end(); if (self.mutations.items.len == 0) { self.closed = true; return self.store.generation; } for (self.mutations.items) |mutation| { if (latestGenerationForKey(self.store, mutation.key)) |generation| { if (generation > self.snapshot_generation) return error.TransactionConflict; } } const next_generation = self.store.generation + 1; try self.store.versions.ensureTotalCapacity(self.store.allocator, self.store.versions.items.len + self.mutations.items.len); for (self.mutations.items) |mutation| { const insert_index = lowerBoundVersion(self.store.versions.items, mutation.key, next_generation); self.store.versions.insertAssumeCapacity(insert_index, .{ .key = mutation.key, .value = mutation.value, .generation = next_generation, .deleted = mutation.deleted, }); } std.debug.assert(versionsAreOrdered(self.store.versions.items)); self.store.generation = next_generation; self.mutations.clearRetainingCapacity(); self.closed = true; trace.progress("write.commit.complete"); return next_generation; } fn setMutation(self: *Write, key: []const u8, value: []const u8, deleted: bool) Error!void { if (self.localMutationIndex(key)) |index| { var mutation = &self.mutations.items[index]; if (!mutation.deleted) freeOwned(self.store.allocator, mutation.value); mutation.value = &.{}; if (!deleted) mutation.value = try self.store.allocator.dupe(u8, value); mutation.deleted = deleted; return; } const owned_key = try self.store.allocator.dupe(u8, key); errdefer freeOwned(self.store.allocator, owned_key); var owned_value: []u8 = &.{}; if (!deleted) owned_value = try self.store.allocator.dupe(u8, value); errdefer if (!deleted) freeOwned(self.store.allocator, owned_value); try self.mutations.append(self.store.allocator, .{ .key = owned_key, .value = owned_value, .deleted = deleted, }); std.mem.sort(Mutation, self.mutations.items, {}, mutationLessThan); } fn localMutation(self: *const Write, key: []const u8) ?Mutation { if (self.localMutationIndex(key)) |index| return self.mutations.items[index]; return null; } fn localMutationIndex(self: *const Write, key: []const u8) ?usize { var low: usize = 0; var high = self.mutations.items.len; while (low < high) { const mid = low + (high - low) / 2; switch (simd.order(Bytes, self.mutations.items[mid].key, key)) { .lt => low = mid + 1, .eq => return mid, .gt => high = mid, } } return null; }};Source: lib/sql/src/root.zig:53
zig
pub const Write = store.Write;Audit
| Definitions | 6 |
|---|---|
| Public names | 12 |
| Members | 4 |
| Version | 26.7.0 |
| Revision | daab053ee433 |