blob: e38dc91571505ed004a9f26db8260e5f742729d1 [file] [log] [blame]
mbligh8e1ab172007-09-13 17:29:56 +00001import sqlite, re, os, sys
mblighd5c33db2006-10-08 21:34:16 +00002
3class db:
mbligh8e1ab172007-09-13 17:29:56 +00004 def __init__(self, debug = False):
5 self.debug = debug
mbligh9bb92fe2007-09-12 15:54:23 +00006 if not os.path.exists('tko_db'):
7 os.system('sqlite tko_db < create_db')
mblighd5c33db2006-10-08 21:34:16 +00008 self.con = sqlite.connect('tko_db')
9 self.cur = self.con.cursor()
10
mbligh8e1ab172007-09-13 17:29:56 +000011 # if not present, insert statuses
12 self.status_idx = {}
13 self.status_word = {}
14 for s in ['NOSTATUS', 'ERROR', 'ABORT', 'FAIL', 'WARN', 'GOOD']:
15 idx = self.get_status(s)
16 if not idx:
17 self.insert('status', {'word' : s})
18 idx = self.get_status(s)
19 self.status_idx[s] = idx
20 self.status_word[idx] = s
21
22
23 def get_status(self, word):
24 rows = self.select('status_idx', 'status', {'word' : word})
25 if rows:
26 return rows[0][0]
27 else:
28 return None
29
30
31 def dprint(self, value):
32 if self.debug:
33 sys.stderr.write('SQL: ' + str(value) + '\n')
34
mblighd5c33db2006-10-08 21:34:16 +000035
mbligh53d14252007-09-12 16:33:14 +000036 def select(self, fields, table, where):
mbligh608c3252007-08-31 13:53:00 +000037 """\
38 select fields from table where {dictionary}
39 """
mbligh53d14252007-09-12 16:33:14 +000040 cmd = 'select %s from %s' % (fields, table)
mbligh8e1ab172007-09-13 17:29:56 +000041 values = []
mbligh608c3252007-08-31 13:53:00 +000042
mbligh53d14252007-09-12 16:33:14 +000043 if where:
44 keys = [field + '=%s' for field in where.keys()]
45 values = [where[field] for field in where.keys()]
46
mbligh8e1ab172007-09-13 17:29:56 +000047 cmd = cmd + ' where ' + ' and '.join(keys)
mbligh53d14252007-09-12 16:33:14 +000048
mbligh8e1ab172007-09-13 17:29:56 +000049 self.dprint('%s %s' % (cmd,values))
mbligh608c3252007-08-31 13:53:00 +000050 self.cur.execute(cmd, values)
mblighd5c33db2006-10-08 21:34:16 +000051 return self.cur.fetchall()
52
mbligh056d0d32006-10-08 22:31:10 +000053
mbligh608c3252007-08-31 13:53:00 +000054 def insert(self, table, data):
55 """\
56 'insert into table (keys) values (%s ... %s)', values
57
58 data:
59 dictionary of fields and data
60 """
61 fields = data.keys()
62 refs = ['%s' for field in fields]
63 values = [data[field] for field in fields]
64 cmd = 'insert into %s (%s) values (%s)' % \
65 (table, ','.join(fields), ','.join(refs))
mbligh53d14252007-09-12 16:33:14 +000066
mbligh8e1ab172007-09-13 17:29:56 +000067 self.dprint('%s %s' % (cmd,values))
mbligh608c3252007-08-31 13:53:00 +000068 self.cur.execute(cmd, values)
69 self.con.commit()
70
71
mbligh056d0d32006-10-08 22:31:10 +000072 def insert_job(self, tag, job):
mbligh8e1ab172007-09-13 17:29:56 +000073 self.insert('jobs', {'tag':tag, 'machine':job.machine})
mbligh608c3252007-08-31 13:53:00 +000074 job.index = self.find_job(tag)
75 for test in job.tests:
76 self.insert_test(job, test)
77
mbligh237bed32007-09-05 13:05:57 +000078
mbligh608c3252007-08-31 13:53:00 +000079 def insert_test(self, job, test):
mbligh8e1ab172007-09-13 17:29:56 +000080 kver = self.insert_kernel(test.kernel)
mbligh608c3252007-08-31 13:53:00 +000081 data = {'job_idx':job.index, 'test':test.testname,
mbligh8e1ab172007-09-13 17:29:56 +000082 'subdir':test.dir, 'kernel_idx':kver,
83 'status':self.status_idx[test.status],
84 'reason':test.reason, 'machine':test.machine }
mbligh608c3252007-08-31 13:53:00 +000085 self.insert('tests', data)
mblighe9cf9d42007-08-31 08:56:00 +000086
87
mbligh9bb92fe2007-09-12 15:54:23 +000088 def lookup_kernel(self, kernel):
89 rows = self.select('kernel_idx', 'kernels',
90 {'kernel_hash':kernel.kernel_hash})
mbligh237bed32007-09-05 13:05:57 +000091 if rows:
92 return rows[0][0]
93 else:
94 return None
mblighe9cf9d42007-08-31 08:56:00 +000095
96
mbligh8e1ab172007-09-13 17:29:56 +000097 def insert_kernel(self, kernel):
mbligh9bb92fe2007-09-12 15:54:23 +000098 kver = self.lookup_kernel(kernel)
mbligh237bed32007-09-05 13:05:57 +000099 if kver:
100 return kver
mbligh9bb92fe2007-09-12 15:54:23 +0000101 self.insert('kernels', {'base':kernel.base,
102 'kernel_hash':kernel.kernel_hash,
103 'printable':kernel.base})
104 # WARNING - incorrectly shoving base into printable here.
105 kver = self.lookup_kernel(kernel)
mbligh237bed32007-09-05 13:05:57 +0000106 for patch in kernel.patches:
107 self.insert_patch(kver, patch)
108 return kver
109
110
111 def insert_patch(self, kver, patch):
112 print patch.reference
113 name = os.path.basename(patch.reference)[:80]
mbligh9bb92fe2007-09-12 15:54:23 +0000114 self.insert('patches', {'kernel_idx': kver,
mbligh237bed32007-09-05 13:05:57 +0000115 'name':name,
116 'url':patch.reference,
117 'hash':patch.hash})
mbligh056d0d32006-10-08 22:31:10 +0000118
119
120 def find_job(self, tag):
mbligh608c3252007-08-31 13:53:00 +0000121 rows = self.select('job_idx', 'jobs', {'tag': tag})
122 if rows:
123 return rows[0][0]
124 else:
125 return None