blob: 32b02b4f89d94201dfd4d9fa6fa5acefaddd8e9f [file] [log] [blame]
mbligh43f164b2007-09-25 18:10:28 +00001import MySQLdb, re, os, sys
mblighd5c33db2006-10-08 21:34:16 +00002
3class db:
mblighb32cd432007-09-25 18:20:04 +00004 def __init__(self, database='tko', host='localhost', debug = False):
mbligh8e1ab172007-09-13 17:29:56 +00005 self.debug = debug
mblighb32cd432007-09-25 18:20:04 +00006
7 try:
8 login = open('.login', 'r')
9 user = login.readline().rstrip()
10 password = login.readline().rstrip()
11 except:
12 user = 'nobody'
13 password = ''
14
15 self.con = MySQLdb.connect(host=host, user=user,
16 passwd=password, db=database)
mblighd5c33db2006-10-08 21:34:16 +000017 self.cur = self.con.cursor()
18
mbligh8e1ab172007-09-13 17:29:56 +000019 # if not present, insert statuses
20 self.status_idx = {}
21 self.status_word = {}
22 for s in ['NOSTATUS', 'ERROR', 'ABORT', 'FAIL', 'WARN', 'GOOD']:
23 idx = self.get_status(s)
24 if not idx:
25 self.insert('status', {'word' : s})
26 idx = self.get_status(s)
27 self.status_idx[s] = idx
28 self.status_word[idx] = s
29
30
31 def get_status(self, word):
32 rows = self.select('status_idx', 'status', {'word' : word})
33 if rows:
34 return rows[0][0]
35 else:
36 return None
37
38
39 def dprint(self, value):
40 if self.debug:
41 sys.stderr.write('SQL: ' + str(value) + '\n')
42
mblighd5c33db2006-10-08 21:34:16 +000043
mbligh31d29c42007-09-27 00:51:33 +000044 def select(self, fields, table, where, distinct = False):
mbligh608c3252007-08-31 13:53:00 +000045 """\
46 select fields from table where {dictionary}
47 """
mbligh31d29c42007-09-27 00:51:33 +000048 cmd = ['select']
49 if distinct:
50 cmd.append('distinct')
51 cmd += [fields, 'from', table]
mbligh608c3252007-08-31 13:53:00 +000052
mbligh31d29c42007-09-27 00:51:33 +000053 values = []
mbligh53d14252007-09-12 16:33:14 +000054 if where:
55 keys = [field + '=%s' for field in where.keys()]
56 values = [where[field] for field in where.keys()]
57
mbligh31d29c42007-09-27 00:51:33 +000058 cmd.append(' where ' + ' and '.join(keys))
mbligh53d14252007-09-12 16:33:14 +000059
mbligh31d29c42007-09-27 00:51:33 +000060 self.dprint('%s %s' % (' '.join(cmd),values))
61 self.cur.execute(' '.join(cmd), values)
mblighd5c33db2006-10-08 21:34:16 +000062 return self.cur.fetchall()
63
mbligh056d0d32006-10-08 22:31:10 +000064
mbligh608c3252007-08-31 13:53:00 +000065 def insert(self, table, data):
66 """\
67 'insert into table (keys) values (%s ... %s)', values
68
69 data:
70 dictionary of fields and data
71 """
72 fields = data.keys()
73 refs = ['%s' for field in fields]
74 values = [data[field] for field in fields]
75 cmd = 'insert into %s (%s) values (%s)' % \
76 (table, ','.join(fields), ','.join(refs))
mbligh53d14252007-09-12 16:33:14 +000077
mbligh8e1ab172007-09-13 17:29:56 +000078 self.dprint('%s %s' % (cmd,values))
mbligh608c3252007-08-31 13:53:00 +000079 self.cur.execute(cmd, values)
80 self.con.commit()
81
82
mbligh056d0d32006-10-08 22:31:10 +000083 def insert_job(self, tag, job):
mbligh8e1ab172007-09-13 17:29:56 +000084 self.insert('jobs', {'tag':tag, 'machine':job.machine})
mbligh608c3252007-08-31 13:53:00 +000085 job.index = self.find_job(tag)
86 for test in job.tests:
87 self.insert_test(job, test)
88
mbligh237bed32007-09-05 13:05:57 +000089
mbligh608c3252007-08-31 13:53:00 +000090 def insert_test(self, job, test):
mbligh8e1ab172007-09-13 17:29:56 +000091 kver = self.insert_kernel(test.kernel)
mbligh608c3252007-08-31 13:53:00 +000092 data = {'job_idx':job.index, 'test':test.testname,
mbligh2bd48872007-09-20 18:32:25 +000093 'subdir':test.subdir, 'kernel_idx':kver,
mbligh8e1ab172007-09-13 17:29:56 +000094 'status':self.status_idx[test.status],
95 'reason':test.reason, 'machine':test.machine }
mbligh608c3252007-08-31 13:53:00 +000096 self.insert('tests', data)
mbligh2bd48872007-09-20 18:32:25 +000097 test_idx = self.find_test(job.index, test.subdir)
98 data = { 'test_idx':test_idx }
99
100 for i in test.iterations:
101 data['iteration'] = i.index
102 for key in i.keyval:
103 data['attribute'] = key
104 data['value'] = i.keyval[key]
105 self.insert('iteration_result', data)
mblighe9cf9d42007-08-31 08:56:00 +0000106
107
mbligh9bb92fe2007-09-12 15:54:23 +0000108 def lookup_kernel(self, kernel):
109 rows = self.select('kernel_idx', 'kernels',
110 {'kernel_hash':kernel.kernel_hash})
mbligh237bed32007-09-05 13:05:57 +0000111 if rows:
112 return rows[0][0]
113 else:
114 return None
mblighe9cf9d42007-08-31 08:56:00 +0000115
116
mbligh8e1ab172007-09-13 17:29:56 +0000117 def insert_kernel(self, kernel):
mbligh9bb92fe2007-09-12 15:54:23 +0000118 kver = self.lookup_kernel(kernel)
mbligh237bed32007-09-05 13:05:57 +0000119 if kver:
120 return kver
mbligh9bb92fe2007-09-12 15:54:23 +0000121 self.insert('kernels', {'base':kernel.base,
122 'kernel_hash':kernel.kernel_hash,
123 'printable':kernel.base})
124 # WARNING - incorrectly shoving base into printable here.
125 kver = self.lookup_kernel(kernel)
mbligh237bed32007-09-05 13:05:57 +0000126 for patch in kernel.patches:
127 self.insert_patch(kver, patch)
128 return kver
129
130
131 def insert_patch(self, kver, patch):
132 print patch.reference
133 name = os.path.basename(patch.reference)[:80]
mbligh9bb92fe2007-09-12 15:54:23 +0000134 self.insert('patches', {'kernel_idx': kver,
mbligh237bed32007-09-05 13:05:57 +0000135 'name':name,
136 'url':patch.reference,
137 'hash':patch.hash})
mbligh056d0d32006-10-08 22:31:10 +0000138
mbligh2bd48872007-09-20 18:32:25 +0000139 def find_test(self, job_idx, subdir):
140 where = { 'job_idx':job_idx , 'subdir':subdir }
141 rows = self.select('test_idx', 'tests', where)
142 if rows:
143 return rows[0][0]
144 else:
145 return None
146
mbligh056d0d32006-10-08 22:31:10 +0000147
148 def find_job(self, tag):
mbligh608c3252007-08-31 13:53:00 +0000149 rows = self.select('job_idx', 'jobs', {'tag': tag})
150 if rows:
151 return rows[0][0]
152 else:
153 return None