1#!/usr/local/bin/python3.8 2 3''' 4Created on Apr 30, 2014 5 6@author: meiermark 7''' 8 9 10import mmap 11from collections import namedtuple 12 13FFindexEntry = namedtuple("FFindexEntry", "name, offset, length") 14 15 16def read_index(ffindex_filename): 17 entries = [] 18 19 fh = open(ffindex_filename) 20 for line in fh: 21 tokens = line.split("\t") 22 entries.append(FFindexEntry(tokens[0], int(tokens[1]), int(tokens[2]))) 23 fh.close() 24 25 return entries 26 27 28def read_data(ffdata_filename): 29 fh = open(ffdata_filename, "r") 30 data = mmap.mmap(fh.fileno(), 0, prot=mmap.PROT_READ) 31 fh.close() 32 return data 33 34 35def get_entry_by_name(name, index): 36 #TODO: bsearch 37 for entry in index: 38 if(name == entry.name): 39 return entry 40 return None 41 42 43def read_lines(entry, data): 44 lines = data[entry.offset:entry.offset + entry.length - 1].decode("utf-8").split("\n") 45 return lines 46 47 48def read_entry_data(entry, data): 49 return data[entry.offset:entry.offset + entry.length - 1] 50 51 52def write_entry(entries, data_fh, entry_name, offset, data): 53 data_fh.write(data[:-1]) 54 data_fh.write(bytearray(1)) 55 56 entry = FFindexEntry(entry_name, offset, len(data)) 57 entries.append(entry) 58 59 return offset + len(data) 60 61 62def write_entry_with_file(entries, data_fh, entry_name, offset, file_name): 63 with open(file_name, "rb") as fh: 64 data = bytearray(fh.read()) 65 return write_entry(entries, data_fh, entry_name, offset, data) 66 67 68def finish_db(entries, ffindex_filename, data_fh): 69 data_fh.close() 70 write_entries_to_db(entries, ffindex_filename) 71 72 73def write_entries_to_db(entries, ffindex_filename): 74 sorted(entries, key=lambda x: x.name) 75 index_fh = open(ffindex_filename, "w") 76 77 for entry in entries: 78 index_fh.write("{name:.64}\t{offset}\t{length}\n".format(name=entry.name, offset=entry.offset, length=entry.length)) 79 80 index_fh.close() 81 82 83def write_entry_to_file(entry, data, file): 84 lines = read_lines(entry, data) 85 86 fh = open(file, "w") 87 for line in lines: 88 fh.write(line+"\n") 89 fh.close() 90