From 7fffb0dbb1701d3b7dc3e055d68326951e0f9d7b Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Fri, 25 Oct 2024 18:02:56 +0200 Subject: [PATCH] hashindex: add NSIndex1 write support, fix iteritems to get the unit tests working, we better have write support for the borg 1.x format. iteritems grew support for the marker kwarg. --- src/borg/hashindex.pyx | 61 ++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/src/borg/hashindex.pyx b/src/borg/hashindex.pyx index 1d3808584..4725f617f 100644 --- a/src/borg/hashindex.pyx +++ b/src/borg/hashindex.pyx @@ -116,11 +116,16 @@ NSIndex1Entry = namedtuple('NSIndex1bEntry', 'segment offset') class NSIndex1: # legacy borg 1.x MAX_VALUE = 2**32 - 1 # borghash has the full uint32_t range + MAGIC = b"BORG_IDX" # borg 1.x + HEADER_FMT = "<8sIIBB" # magic, entries, buckets, ksize, vsize + VALUE_FMT = " borg 2 - self._read_fd_borg1(fd) - if magic == b"BORGHASH": # only for unit tests - self.ht = _borghash.HashTableNT.read(fd) + def _write_fd(self, fd): + used = len(self.ht) + header_bytes = struct.pack(self.HEADER_FMT, self.MAGIC, used, used, self.KEY_SIZE, self.VALUE_SIZE) + fd.write(header_bytes) + count = 0 + for key, _ in self.ht.iteritems(): + value = self.ht._get_raw(key) + fd.write(key) + fd.write(value) + count += 1 + assert count == used - def _read_fd_borg1(self, fd): - MAGIC = b"BORG_IDX" # borg 1.x - HEADER_FMT = "<8sIIBB" # magic, entries, buckets, ksize, vsize - header_size = struct.calcsize(HEADER_FMT) + def _read_fd(self, fd): + header_size = struct.calcsize(self.HEADER_FMT) header_bytes = fd.read(header_size) if len(header_bytes) < header_size: raise ValueError(f"Invalid file, file is too short (header).") - magic, entries, buckets, ksize, vsize = struct.unpack(HEADER_FMT, header_bytes) - if magic != MAGIC: - raise ValueError(f"Invalid file, magic {MAGIC.decode()} not found.") - VALUE_FMT = "