blob: 3322118a7216961c49c776a627acafd8371e90a1 [file] [log] [blame]
mbligh8e1ab172007-09-13 17:29:56 +00001import sqlite, re, os, sys
mblighd5c33db2006-10-08 21:34:16 +00002
mblighbfec5222007-09-14 16:58:57 +00003tko_db = '/home/mbligh/autotest/tko/tko_db'
4
mblighd5c33db2006-10-08 21:34:16 +00005class db:
mbligh8e1ab172007-09-13 17:29:56 +00006 def __init__(self, debug = False):
7 self.debug = debug
mblighbfec5222007-09-14 16:58:57 +00008 if not os.path.exists(tko_db):
mbligh9bb92fe2007-09-12 15:54:23 +00009 os.system('sqlite tko_db < create_db')
mblighbfec5222007-09-14 16:58:57 +000010 self.con = sqlite.connect(tko_db)
mblighd5c33db2006-10-08 21:34:16 +000011 self.cur = self.con.cursor()
12
mbligh8e1ab172007-09-13 17:29:56 +000013 # if not present, insert statuses
14 self.status_idx = {}
15 self.status_word = {}
16 for s in ['NOSTATUS', 'ERROR', 'ABORT', 'FAIL', 'WARN', 'GOOD']:
17 idx = self.get_status(s)
18 if not idx:
19 self.insert('status', {'word' : s})
20 idx = self.get_status(s)
21 self.status_idx[s] = idx
22 self.status_word[idx] = s
23
24
25 def get_status(self, word):
26 rows = self.select('status_idx', 'status', {'word' : word})
27 if rows:
28 return rows[0][0]
29 else:
30 return None
31
32
33 def dprint(self, value):
34 if self.debug:
35 sys.stderr.write('SQL: ' + str(value) + '\n')
36
mblighd5c33db2006-10-08 21:34:16 +000037
mbligh53d14252007-09-12 16:33:14 +000038 def select(self, fields, table, where):
mbligh608c3252007-08-31 13:53:00 +000039 """\
40 select fields from table where {dictionary}
41 """
mbligh53d14252007-09-12 16:33:14 +000042 cmd = 'select %s from %s' % (fields, table)
mbligh8e1ab172007-09-13 17:29:56 +000043 values = []
mbligh608c3252007-08-31 13:53:00 +000044
mbligh53d14252007-09-12 16:33:14 +000045 if where:
46 keys = [field + '=%s' for field in where.keys()]
47 values = [where[field] for field in where.keys()]
48
mbligh8e1ab172007-09-13 17:29:56 +000049 cmd = cmd + ' where ' + ' and '.join(keys)
mbligh53d14252007-09-12 16:33:14 +000050
mbligh8e1ab172007-09-13 17:29:56 +000051 self.dprint('%s %s' % (cmd,values))
mbligh608c3252007-08-31 13:53:00 +000052 self.cur.execute(cmd, values)
mblighd5c33db2006-10-08 21:34:16 +000053 return self.cur.fetchall()
54
mbligh056d0d32006-10-08 22:31:10 +000055
mbligh608c3252007-08-31 13:53:00 +000056 def insert(self, table, data):
57 """\
58 'insert into table (keys) values (%s ... %s)', values
59
60 data:
61 dictionary of fields and data
62 """
63 fields = data.keys()
64 refs = ['%s' for field in fields]
65 values = [data[field] for field in fields]
66 cmd = 'insert into %s (%s) values (%s)' % \
67 (table, ','.join(fields), ','.join(refs))
mbligh53d14252007-09-12 16:33:14 +000068
mbligh8e1ab172007-09-13 17:29:56 +000069 self.dprint('%s %s' % (cmd,values))
mbligh608c3252007-08-31 13:53:00 +000070 self.cur.execute(cmd, values)
71 self.con.commit()
72
73
mbligh056d0d32006-10-08 22:31:10 +000074 def insert_job(self, tag, job):
mbligh8e1ab172007-09-13 17:29:56 +000075 self.insert('jobs', {'tag':tag, 'machine':job.machine})
mbligh608c3252007-08-31 13:53:00 +000076 job.index = self.find_job(tag)
77 for test in job.tests:
78 self.insert_test(job, test)
79
mbligh237bed32007-09-05 13:05:57 +000080
mbligh608c3252007-08-31 13:53:00 +000081 def insert_test(self, job, test):
mbligh8e1ab172007-09-13 17:29:56 +000082 kver = self.insert_kernel(test.kernel)
mbligh608c3252007-08-31 13:53:00 +000083 data = {'job_idx':job.index, 'test':test.testname,
mbligh2bd48872007-09-20 18:32:25 +000084 'subdir':test.subdir, 'kernel_idx':kver,
mbligh8e1ab172007-09-13 17:29:56 +000085 'status':self.status_idx[test.status],
86 'reason':test.reason, 'machine':test.machine }
mbligh608c3252007-08-31 13:53:00 +000087 self.insert('tests', data)
mbligh2bd48872007-09-20 18:32:25 +000088 test_idx = self.find_test(job.index, test.subdir)
89 data = { 'test_idx':test_idx }
90
91 for i in test.iterations:
92 data['iteration'] = i.index
93 for key in i.keyval:
94 data['attribute'] = key
95 data['value'] = i.keyval[key]
96 self.insert('iteration_result', data)
mblighe9cf9d42007-08-31 08:56:00 +000097
98
mbligh9bb92fe2007-09-12 15:54:23 +000099 def lookup_kernel(self, kernel):
100 rows = self.select('kernel_idx', 'kernels',
101 {'kernel_hash':kernel.kernel_hash})
mbligh237bed32007-09-05 13:05:57 +0000102 if rows:
103 return rows[0][0]
104 else:
105 return None
mblighe9cf9d42007-08-31 08:56:00 +0000106
107
mbligh8e1ab172007-09-13 17:29:56 +0000108 def insert_kernel(self, kernel):
mbligh9bb92fe2007-09-12 15:54:23 +0000109 kver = self.lookup_kernel(kernel)
mbligh237bed32007-09-05 13:05:57 +0000110 if kver:
111 return kver
mbligh9bb92fe2007-09-12 15:54:23 +0000112 self.insert('kernels', {'base':kernel.base,
113 'kernel_hash':kernel.kernel_hash,
114 'printable':kernel.base})
115 # WARNING - incorrectly shoving base into printable here.
116 kver = self.lookup_kernel(kernel)
mbligh237bed32007-09-05 13:05:57 +0000117 for patch in kernel.patches:
118 self.insert_patch(kver, patch)
119 return kver
120
121
122 def insert_patch(self, kver, patch):
123 print patch.reference
124 name = os.path.basename(patch.reference)[:80]
mbligh9bb92fe2007-09-12 15:54:23 +0000125 self.insert('patches', {'kernel_idx': kver,
mbligh237bed32007-09-05 13:05:57 +0000126 'name':name,
127 'url':patch.reference,
128 'hash':patch.hash})
mbligh056d0d32006-10-08 22:31:10 +0000129
mbligh2bd48872007-09-20 18:32:25 +0000130 def find_test(self, job_idx, subdir):
131 where = { 'job_idx':job_idx , 'subdir':subdir }
132 rows = self.select('test_idx', 'tests', where)
133 if rows:
134 return rows[0][0]
135 else:
136 return None
137
mbligh056d0d32006-10-08 22:31:10 +0000138
139 def find_job(self, tag):
mbligh608c3252007-08-31 13:53:00 +0000140 rows = self.select('job_idx', 'jobs', {'tag': tag})
141 if rows:
142 return rows[0][0]
143 else:
144 return None