import struct MAGIC = b"FLATPX05" HEADER = struct.Struct("<8sIIIIQQQQQQQ") MAX_BLOCK = 8193 def read_varint(data, pos, end): value = 0 for shift in (0, 7, 14): if pos >= end: raise ValueError("truncated varint") byte = data[pos] pos += 1 value |= (byte & 127) << shift if not byte & 128: if value > MAX_BLOCK: raise ValueError("length overflow") return value, pos raise ValueError("varint overflow") def iter_new(data): magic, version, pages, r1, r2, roots, pagedata, size, *reserved = ( HEADER.unpack_from(data) ) if ( magic != MAGIC or version != 5 or r1 or r2 or any(reserved) or size != len(data) or roots != 80 + 4 * (pages + 1) ): raise ValueError("header") previous = None for i in range(pages): a, b = struct.unpack_from(" len(prev) or pos + 2 + suffix > start + keyend: raise ValueError("entry") posting = struct.unpack_from(" MAX_BLOCK or not key or key[0] not in (1, 2): raise ValueError("key namespace/length") if posting < keyend or posting + 4 > used: raise ValueError("posting offset") length = struct.unpack_from(" used: raise ValueError("posting length") if (j == 0 and key != first) or (previous is not None and key <= previous): raise ValueError("order") yield ( bytes(key), bytes(data[start + posting + 4 : start + posting + 4 + length]), ) previous = prev = key if pos != start + keyend: raise ValueError("key trailing")