@@ -3,6 +3,7 @@ const Allocator = std.mem.Allocator;
3
3
4
4
const SearchResults = @import ("common.zig" ).SearchResults ;
5
5
6
+ const Change = @import ("change.zig" ).Change ;
6
7
const SegmentId = @import ("common.zig" ).SegmentId ;
7
8
8
9
const Deadline = @import ("utils/Deadline.zig" );
@@ -275,6 +276,32 @@ pub fn SegmentListManager(Segment: type) type {
275
276
276
277
return true ;
277
278
}
279
+
280
+ pub fn update (self : * Self , changes : []const Change , lock : * std.Thread.RwLock , preCommitFn : anytype , ctx : anytype ) ! bool {
281
+ var new_segment = try List .createSegment (self .allocator , self .options );
282
+ errdefer List .destroySegment (self .allocator , & new_segment );
283
+
284
+ try new_segment .value .build (changes );
285
+ errdefer new_segment .value .cleanup ();
286
+
287
+ self .update_lock .lock ();
288
+ defer self .update_lock .unlock ();
289
+
290
+ var new_segments_list = try self .segments .value .appendSegment (self .allocator , new_segment );
291
+ errdefer new_segments_list .deinit (self .allocator );
292
+
293
+ var new_segments = try SharedPtr (List ).create (self .allocator , new_segments_list );
294
+ defer new_segments .release (self .allocator , .{self .allocator });
295
+
296
+ try @call (.auto , preCommitFn , .{ ctx , new_segments .value });
297
+
298
+ lock .lock ();
299
+ defer lock .unlock ();
300
+
301
+ self .segments .swap (& new_segments );
302
+
303
+ return true ;
304
+ }
278
305
};
279
306
}
280
307
0 commit comments