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