13 from collections
import OrderedDict
19 DB_LOCATION =
'db/bll_db.db'
20 CREATE_TABLES_SCRIPT =
'db/sql/init/create_tables.sql'
21 INSERT_DATA_SCRIPT =
'db/sql/init/insert_data.sql'
22 UPDATE_SCRIPT_DIR =
'db/sql/updates/'
29 tables_exist = os.path.exists(BLLDatabase.DB_LOCATION)
32 super(BLLDatabase, self).
__init__(BLLDatabase.DB_LOCATION)
36 logging.info(
'No database found - creating one...')
54 for name
in os.listdir(BLLDatabase.UPDATE_SCRIPT_DIR):
56 match = re.match(
'^update-(\d+)\.sql$', name)
58 script_num = int(match.groups()[0])
61 if script_num > int(settings.LAST_UPDATE_SCRIPT_NUM):
62 filenames[script_num] = name
66 nums = filenames.keys()
70 logging.info(
"Executing script: '%s'" % (filenames[key]))
71 sql_file = open(
'%s%s' % (BLLDatabase.UPDATE_SCRIPT_DIR, filenames[key]),
'r')
74 self.cursor.executescript(sql)
77 new_update_num = nums[-1]
78 self.cursor.execute(
'UPDATE settings SET val=? WHERE code_name=?', [new_update_num,
'LAST_UPDATE_SCRIPT_NUM'])
83 except sqlite3.OperationalError
as err:
84 logging.error(
'Error executing update script:\n%s' % (err))
92 rows = self.
select(
'speaker_types',
'id code_name'.split())
93 ids, code_names = zip(*rows)
95 return Enum(code_names, ids)
102 return Enum([
'NA',
'NEAR',
'FAR'])
109 return Enum([
'MEDIA',
'OVERLAPPING',
'NON_VERBAL_NOISE'])
115 rows = self.
select(
'combo_groups',
'id code_name'.split())
116 ids, code_names = zip(*rows)
118 return Enum(code_names, ids)
124 rows = self.
select(
'common_regexs',
'code_name regex'.split())
125 code_names, regexs = zip(*rows)
127 return Enum(code_names, regexs)
135 for i
in range(len(groups)):
136 rows = self.
select(
'combo_options',
'id code_name'.split(),
'combo_group_id=?', [groups[i]],
'id ASC')
137 ids, code_names = zip(*rows)
138 options[groups[i]] =
Enum(code_names, ids)
147 rows = self.
select(
'settings',
'code_name val'.split())
148 (names, vals) = zip(*rows)
149 settings =
Enum(names, vals)
182 rows = self.
select(
'transcriber_codes',
'id code trans_index display_desc speaker_type_id'.split())
187 for i
in range(BLLDatabase.NUM_TRANS_CODES):
188 options_dicts.append(OrderedDict())
199 cur_dict = options_dicts[cur_row[2] - 1]
200 cur_dict[cur_row[1]] = code_info
204 for i
in range(BLLDatabase.NUM_TRANS_CODES):
212 codes.append(new_code)
221 rows = self.
select(
'lena_notes_codes',
'id code speaker_type_id display_desc'.split())
231 cur_row[1] ==
'VOC' or cur_row[1] ==
'FAN',
235 codes[cur_row[1]] = code_info
244 rows = self.
select(
'speaker_codes',
'id code speaker_type_id display_desc distance is_linkable is_media is_nonverbal_noise is_overlapping'.split())
253 props.append(props_enum.MEDIA)
255 props.append(props_enum.NON_VERBAL_NOISE)
257 props.append(props_enum.OVERLAPPING)
268 codes[cur_row[1]] = code_info
277 DB_DATETIME_FMT =
'%Y-%m-%d %H:%M:%S'
282 LENA_NOTES_CODES =
None
289 SPEAKER_DISTANCES =
None
317 groups = db.select_enum(
'combo_groups')
318 rows = db.select(
'combo_options',
'id code_name combo_group_id disp_desc hidden'.split(),
None, [],
'id ASC')
322 group_id = cur_row[2]
324 if not group_id
in options:
325 options[group_id] = {}
334 DBConstants.TRANS_CODES = db.select_codes(
'transcriber_codes')
335 DBConstants.LENA_NOTES_CODES = db.select_codes(
'lena_notes_codes')
336 DBConstants.SPEAKER_CODES = db.select_codes(
'speaker_codes')
338 DBConstants.SPEAKER_TYPES = db.select_enum(
'speaker_types')
339 DBConstants.SPEAKER_DISTANCES = db.select_enum(
'speaker_distances')
340 DBConstants.SPEAKER_PROPS = db.select_enum(
'speaker_props')
341 DBConstants.COMMON_REGEXS = db.select_enum(
'common_regexs')
342 DBConstants.SETTINGS = db.select_enum(
'settings')
344 DBConstants.COMBO_GROUPS = db.select_enum(
'combo_groups')
345 DBConstants.COMBO_OPTIONS = db.select_enum(
'combo_options')