╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ event.zig ────────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
602 if (try value_cursor.readUint() == value) { 603 return; 604 } 605 } 606 607 try map.put(key, .{ .uint = value }); 608 }, 609 .signed => { 610 if (try map.getCursor(key)) |value_cursor| { 611 if (try value_cursor.readInt() == value) { 612 return; 613 } 614 } 615 616 try map.put(key, .{ .int = value }); 617 }, 618 }, 619 .bool => { 620 const bytes = if (value) "true" else "false"; 621 if (try map.getCursor(key)) |value_cursor| { 622 var buffer: [5]u8 = undefined; 623 const existing = try value_cursor.readBytesObject(&buffer); 624 if (existing.format_tag != null and 625 std.mem.eql(u8, &existing.format_tag.?, "bl") and 626 std.mem.eql(u8, existing.value, bytes)) 627 { 628 return; 629 } 630 } 631 632 try map.put(key, .{ .bytes_object = .{ .value = bytes, .format_tag = "bl".* } }); 633 }, 634 else => @compileError("unsupported upsert field type: " ++ @typeName(Field)), 635 } 636 } 637 638 fn upsertBytes( 639 comptime DB: type, 640 comptime hash_kind: hash.HashKind, 641 map: DB.HashMap(.read_write), 642 key: hash.HashInt(hash_kind), 643 value: []const u8, 644 ) !void { 645 var existing_cursor_maybe = try map.getCursor(key); 646 if (existing_cursor_maybe) |*existing_cursor| { 647 if (try bytesEqual(DB, existing_cursor, value)) { 648 return; 649 } 650 } 651 652 var value_cursor = try map.putCursor(key); 653 var write_buffer: [1024]u8 = undefined; 654 var writer = try value_cursor.writer(&write_buffer); 655 try writer.interface.writeAll(value); 656 try writer.finish(); 657 } 658 659 fn bytesEqual( 660 comptime DB: type, 661 cursor: *DB.Cursor(.read_only), 662 value: []const u8, 663 ) !bool { 664 var read_buffer: [1024]u8 = undefined; 665 var reader = try cursor.reader(&read_buffer); 666 if (reader.size != value.len) { 667 return false; 668 } 669 670 var chunk_buffer: [1024]u8 = undefined; 671 var offset: usize = 0; 672 while (offset < value.len) { 673 const chunk_len = @min(chunk_buffer.len, value.len - offset); 674 try reader.interface.readSliceAll(chunk_buffer[0..chunk_len]); 675 if (!std.mem.eql(u8, chunk_buffer[0..chunk_len], value[offset .. offset + chunk_len])) { 676 return false; 677 } 678 offset += chunk_len; 679 } 680 681 return true; 682 } 683