def read_index(sections, idx, codec): table, cncx = OrderedDict(), CNCX([], codec) data = sections[idx].raw indx_header = parse_indx_header(data) indx_count = indx_header['count'] if indx_header['ncncx'] > 0: off = idx + indx_count + 1 cncx_records = [x.raw for x in sections[off:off+indx_header['ncncx']]] cncx = CNCX(cncx_records, codec) tag_section_start = indx_header['tagx'] control_byte_count, tags = parse_tagx_section(data[tag_section_start:]) read_variable_len_data(data, indx_header) index_headers = [] for i in range(idx + 1, idx + 1 + indx_count): # Index record data = sections[i].raw index_headers.append(parse_index_record(table, data, control_byte_count, tags, codec, indx_header['ordt_map'], strict=True)) read_variable_len_data(data, index_headers[-1]) return table, cncx, indx_header, index_headers
def __init__(self, records, index_header, cncx): self.alltext = None table = OrderedDict() tags = [TagX(x.tag, x.num_values, x.bitmask, x.eof) for x in index_header.tagx_entries] for record in records: raw = record.raw if raw[:4] != b'INDX': raise ValueError('Invalid Primary Index Record') parse_index_record(table, record.raw, index_header.tagx_control_byte_count, tags, index_header.index_encoding, {}, strict=True) self.indices = [] for ident, entry in iteritems(table): self.indices.append(IndexEntry(ident, entry, cncx))