╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ event.zig ────────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
299 300 fn upsertBytes( 301 comptime DB: type, 302 comptime hash_kind: hash.HashKind, 303 map: DB.HashMap(.read_write), 304 key: hash.HashInt(hash_kind), 305 value: []const u8, 306 ) !void { 307 var existing_cursor_maybe = try map.getCursor(key); 308 if (existing_cursor_maybe) |*existing_cursor| { 309 if (try bytesEqual(DB, existing_cursor, value)) { 310 return; 311 } 312 } 313 314 var value_cursor = try map.putCursor(key); 315 var write_buffer: [1024]u8 = undefined; 316 var writer = try value_cursor.writer(&write_buffer); 317 try writer.interface.writeAll(value); 318 try writer.finish(); 319 } 320 321 fn bytesEqual( 322 comptime DB: type, 323 cursor: *DB.Cursor(.read_only), 324 value: []const u8, 325 ) !bool { 326 var read_buffer: [1024]u8 = undefined; 327 var reader = try cursor.reader(&read_buffer); 328 if (reader.size != value.len) { 329 return false; 330 } 331 332 var chunk_buffer: [1024]u8 = undefined; 333 var offset: usize = 0; 334 while (offset < value.len) { 335 const chunk_len = @min(chunk_buffer.len, value.len - offset); 336 try reader.interface.readSliceAll(chunk_buffer[0..chunk_len]); 337 if (!std.mem.eql(u8, chunk_buffer[0..chunk_len], value[offset .. offset + chunk_len])) { 338 return false; 339 } 340 offset += chunk_len; 341 } 342 343 return true; 344 } 345