1import sqlite3 as sql 2import argparse 3 4 5 6parser = argparse.ArgumentParser() 7parser.add_argument('sqldb') 8parser.add_argument('-v', '--visual', action='store_true', default=False) 9parser.add_argument('-z', '--zoom', action='store', type=float, default=1) 10parser.add_argument('-p', '--period', action='store', default=333) 11 12args = parser.parse_args() 13 14sqldb = args.sqldb 15 16tick_per_cycle = int(args.period) 17cycle_per_line = int(100 * args.zoom) 18 19stages = ['f','d','r','D','i','a','g','e','b','w','c'] 20 21 22def non_stage(): 23 return '.' 24 25def stage(x): 26 return stages[x] 27 28def dump_visual(pos, records): 29 pos_start = pos[0] % cycle_per_line 30 line = '' 31 line += '[' + non_stage() * pos_start 32 pos_next = pos_start 33 last_index = 0 34 for i in range(1, len(pos)): 35 if (pos[i] == pos[last_index]) or pos[i] == 0: 36 continue 37 if pos[i] - pos[last_index] >= cycle_per_line - pos_next: 38 diff = cycle_per_line - pos_next 39 line += f'{stage(last_index)}' * diff + ']\n' 40 diff_line = ((pos[i] - pos[last_index]) - diff - 1) // cycle_per_line 41 if diff_line > 0: 42 line += '[' + f'{stage(last_index)}' * cycle_per_line + ']\n' 43 44 pos_next = pos[i] % cycle_per_line 45 line += '[' + f'{stage(last_index)}' * pos_next 46 else: 47 diff = pos[i] - pos[last_index] 48 pos_next = pos[i] % cycle_per_line 49 line += f'{stage(last_index)}' * diff 50 last_index = i 51 if cycle_per_line - pos_next == 0: 52 line += ']\n' 53 line += f'[{stage(i)}{non_stage() * (cycle_per_line - 1)}]\n' 54 else: 55 line += f'{stage(i)}' + non_stage() * (cycle_per_line - pos_next - 1) + ']' 56 line += str(records) 57 print(line) 58 59 60def dump_txt(pos, records): 61 for i in range(len(pos)): 62 print(f'{stage(i)}{pos[i]}', end=' ') 63 print(records) 64 65 66dump = dump_txt 67if args.visual: 68 dump = dump_visual 69 70with sql.connect(sqldb) as con: 71 cur = con.cursor() 72 cur.execute("SELECT * FROM LifeTimeCommitTrace") 73 col_name = [i[0] for i in cur.description] 74 col_name = col_name[1:] 75 col_name = [i.lower() for i in col_name] 76 rows = cur.fetchall() 77 for row in rows: 78 row = row[1:] 79 pos = [] 80 records = [] 81 i = 0 82 for val in row: 83 if col_name[i].startswith('at'): 84 pos.append(val//tick_per_cycle) 85 elif col_name[i].startswith('pc'): 86 if val < 0: 87 val = val + 1 << 64 88 records.append(hex(val)) 89 else: 90 records.append(val) 91 i += 1 92 dump(pos, records)