Skip to documentation
SLOP

tiny.sql.Write

Reference tiny.sql Write

Defined in store.

API (9)

Actions

Public operations.

Fields and members

Public fields and members.

No direct callersNo direct callsstoreWrite
Static calls · unresolved targets: unknown · external targets: unknown.

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;
Called byCallsNo direct callersprivate sourcelib.sql.src.storelowerBoundVersionprivate sourcelib.sql.src.storeversionsAreOrderedtraceprogressWritecommit
Static calls · unresolved targets: 3 · external targets: 3.
Called byCallsNo direct callersprivate sourcelib.sql.src.store.WritesetMutationWritedelete
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallsNo direct callersStoregetAtprivate sourcelib.sql.src.store.WritelocalMutationWriteget
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sql.src.store.WritesetMutationWriteput
Static calls · unresolved targets: 0 · external targets: 2.

Audit

Definitions6
Public names12
Members4
Version26.7.0
Revisiondaab053ee433