3 from pysqlite2 import dbapi2 as db
4 from cStringIO import StringIO
10 def be32(output, val):
11 output.write(struct.pack('>I', val))
14 def __init__(self, output):
16 self._pos = output.tell()
17 be32(output, 0xFFFFFFFF)
19 def set(self, val=None):
21 val = self._output.tell()
23 pos = self._output.tell()
24 self._output.seek(self._pos)
25 be32(self._output, val)
26 self._output.seek(pos)
31 regdb = db.connect('regulatory.sqlite')
32 cursor = regdb.cursor()
36 # struct regdb_file_header
39 reg_country_ptr = PTR(output)
41 # add number of countries
42 cursor.execute('SELECT COUNT(*) FROM reg_country;')
43 be32(output, cursor.fetchone()[0])
46 # just to make sure db scheme isn't bad
47 cursor.execute('''SELECT power_rule_id,
53 max_eirp_ptp_mbm FROM power_rule;''')
56 power_rules[power_rule_id] = output.tell()
57 # struct regdb_file_power_rule
58 output.write(struct.pack('>cxxxIIIII', str(pr[1]), *pr[2:]))
61 # just to make sure db scheme isn't bad
62 cursor.execute('''SELECT freq_range_id,
67 misc_restrictions FROM freq_range;''')
70 freq_ranges[freq_range_id] = output.tell()
71 # struct regdb_file_freq_range
72 output.write(struct.pack('>IIIII', *fr[1:]))
76 # just to make sure db scheme isn't bad
77 cursor.execute('SELECT reg_rule_id, freq_range_id, power_rule_id FROM reg_rule;')
78 for reg_rule in cursor:
79 reg_rule_id, freq_range_id, power_rule_id = reg_rule
80 reg_rules[reg_rule_id] = output.tell()
81 # struct regdb_file_reg_rule
82 output.write(struct.pack('>II', freq_ranges[freq_range_id], power_rules[power_rule_id]))
86 # just to make sure db scheme isn't bad
87 cursor.execute('SELECT entry_id, reg_collection_id, reg_rule_id FROM reg_rules_collection;')
89 entry_id, reg_collection_id, reg_rule_id = coll
90 l = collection_data.get(reg_collection_id, [])
92 collection_data[reg_collection_id] = l
94 reg_rules_collections = {}
96 for rc, l in collection_data.iteritems():
97 reg_rules_collections[rc] = output.tell()
98 # struct regdb_file_reg_rules_collection
101 be32(output, reg_rules[regrule])
103 # update country pointer now!
104 reg_country_ptr.set()
106 # just to make sure db scheme isn't bad
107 cursor.execute('SELECT reg_country_id, alpha2, reg_collection_id FROM reg_country;')
108 for country in cursor:
109 reg_country_id, alpha2, reg_collection_id = country
110 # struct regdb_file_reg_country
111 output.write(struct.pack('>ccxxI', str(alpha2[0]), str(alpha2[1]), reg_rules_collections[reg_collection_id]))
113 outfile = open('regulatory.bin', 'w')
114 outfile.write(output.getvalue())