def _pack_data_records_unchecked(contents): f = BytesIO() for record in contents: record = record.encode("ascii") write_uleb128(len(record), f) f.write(record) return f.getvalue()
def write_block(self, level, first_record, last_record, payload, zpayload): if not (0 <= level < FIRST_EXTENSION_LEVEL): raise ZSError("invalid level %s" % (level,)) if level == 0: self._hasher.update(payload) block_offset = self._file.tell() block_contents = six.int2byte(level) + zpayload write_uleb128(len(block_contents), self._file) self._file.write(block_contents) self._file.write(encoded_crc64xz(block_contents)) total_block_length = self._file.tell() - block_offset self._spin(total_block_length, 1, False) if level >= len(self._level_entries): # First block we've seen at this level assert level == len(self._level_entries) self._level_entries.append([]) # This can only happen if all the previous levels just flushed. for i in range(level): assert not self._level_entries[i] entries = self._level_entries[level] entries.append((first_record, last_record, block_offset, total_block_length)) if len(entries) >= self._branching_factor: self._flush_index(level)
def raw_block(self, block_level, zpayload, bad_checksum=False, truncate_checksum=0): self.f.seek(0, 2) offset = self.f.tell() contents = int2byte(block_level) + zpayload write_uleb128(len(contents), self.f) self.f.write(contents) checksum = encoded_crc64xz(contents) if bad_checksum: checksum = b"\x00" * len(checksum) if truncate_checksum > 0: checksum = checksum[:-truncate_checksum] self.f.write(checksum) block_length = self.f.tell() - offset return offset, block_length
def _pack_index_records_unchecked(contents): f = BytesIO() for key, offset, length in zip(*contents): key = key.encode("ascii") write_uleb128(len(key), f) f.write(key) write_uleb128(offset, f) write_uleb128(length, f) return f.getvalue()