aboutsummaryrefslogtreecommitdiff
path: root/src/storage/image-manager/root.zig
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2025-11-20 06:56:43 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2025-11-20 06:56:43 +0100
commitefb92a00185963a763217d4bedce7a1591c6dc22 (patch)
tree0ac7d86154b286195819de06decdbd850561bdcb /src/storage/image-manager/root.zig
parentf6b7fe33ee7c08761f3403ca77b7530dbb2763df (diff)
image: implement removing
Diffstat (limited to 'src/storage/image-manager/root.zig')
-rw-r--r--src/storage/image-manager/root.zig34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/storage/image-manager/root.zig b/src/storage/image-manager/root.zig
index 4188b88..c99ac00 100644
--- a/src/storage/image-manager/root.zig
+++ b/src/storage/image-manager/root.zig
@@ -103,3 +103,37 @@ pub fn first_by_timestamp(self: *Self) memora.locked.Shared(?*Timestamp) {
.rw_lock = &self.rw_lock,
};
}
+
+pub fn delete(self: *Self, storage: *Storage, id: []const u8) !void {
+ self.rw_lock.lock();
+ defer self.rw_lock.unlock();
+
+ const index = index: {
+ for (self.items.items, 0..) |image, index| {
+ if (std.mem.eql(u8, image.id, id)) {
+ break :index index;
+ }
+ }
+ break :index null;
+ };
+
+ if (index) |idx| {
+ try self.items.items[idx].delete(storage);
+ const old_index = self.items.items.len - 1;
+ _ = self.items.swapRemove(idx);
+
+ var current: ?*Timestamp = if (self.timestamp_order.first) |c| @fieldParentPtr("node", c) else null;
+
+ while (current) |c| {
+ if (c.index == idx) {
+ self.timestamp_order.remove(&c.node);
+ storage.allocator.destroy(c);
+ } else if (c.index == old_index) {
+ c.index = idx;
+ break;
+ }
+
+ current = c.next();
+ }
+ }
+}