blob: 151d4d4a57657d3efbc5c180765b87e1bda944de [file] [log] [blame]
mbligh43f164b2007-09-25 18:10:28 +00001import MySQLdb, re, os, sys
mblighd5c33db2006-10-08 21:34:16 +00002
3class db:
mbligh728ff0a2007-09-27 17:05:12 +00004 def __init__(self, debug = False):
mbligh8e1ab172007-09-13 17:29:56 +00005 self.debug = debug
mbligh728ff0a2007-09-27 17:05:12 +00006
mblighb32cd432007-09-25 18:20:04 +00007 try:
mbligh728ff0a2007-09-27 17:05:12 +00008 db_prefs = open('.database', 'r')
9 host = db_prefs.readline().rstrip()
10 database = db_prefs.readline().rstrip()
11 except:
12 host = 'localhost'
13 database = 'tko'
14
15 try:
16 login = open('.priv_login', 'r')
mblighb32cd432007-09-25 18:20:04 +000017 user = login.readline().rstrip()
18 password = login.readline().rstrip()
mbligh95fca572007-09-27 17:11:00 +000019 except:
20 try:
21 login = open('.unpriv_login', 'r')
22 user = login.readline().rstrip()
23 password = login.readline().rstrip()
24 except:
25 user = 'nobody'
26 password = ''
mblighb32cd432007-09-25 18:20:04 +000027
28 self.con = MySQLdb.connect(host=host, user=user,
mbligh95fca572007-09-27 17:11:00 +000029 passwd=password, db=database)
mblighd5c33db2006-10-08 21:34:16 +000030 self.cur = self.con.cursor()
31
mbligh8e1ab172007-09-13 17:29:56 +000032 # if not present, insert statuses
33 self.status_idx = {}
34 self.status_word = {}
35 for s in ['NOSTATUS', 'ERROR', 'ABORT', 'FAIL', 'WARN', 'GOOD']:
36 idx = self.get_status(s)
37 if not idx:
38 self.insert('status', {'word' : s})
39 idx = self.get_status(s)
40 self.status_idx[s] = idx
41 self.status_word[idx] = s
42
43
44 def get_status(self, word):
45 rows = self.select('status_idx', 'status', {'word' : word})
46 if rows:
47 return rows[0][0]
48 else:
49 return None
50
51
52 def dprint(self, value):
53 if self.debug:
54 sys.stderr.write('SQL: ' + str(value) + '\n')
55
mblighd5c33db2006-10-08 21:34:16 +000056
mbligh31d29c42007-09-27 00:51:33 +000057 def select(self, fields, table, where, distinct = False):
mbligh608c3252007-08-31 13:53:00 +000058 """\
59 select fields from table where {dictionary}
60 """
mbligh31d29c42007-09-27 00:51:33 +000061 cmd = ['select']
62 if distinct:
63 cmd.append('distinct')
64 cmd += [fields, 'from', table]
mbligh608c3252007-08-31 13:53:00 +000065
mbligh31d29c42007-09-27 00:51:33 +000066 values = []
mbligh53d14252007-09-12 16:33:14 +000067 if where:
68 keys = [field + '=%s' for field in where.keys()]
69 values = [where[field] for field in where.keys()]
70
mbligh31d29c42007-09-27 00:51:33 +000071 cmd.append(' where ' + ' and '.join(keys))
mbligh53d14252007-09-12 16:33:14 +000072
mbligh31d29c42007-09-27 00:51:33 +000073 self.dprint('%s %s' % (' '.join(cmd),values))
74 self.cur.execute(' '.join(cmd), values)
mblighd5c33db2006-10-08 21:34:16 +000075 return self.cur.fetchall()
76
mbligh056d0d32006-10-08 22:31:10 +000077
mbligh608c3252007-08-31 13:53:00 +000078 def insert(self, table, data):
79 """\
80 'insert into table (keys) values (%s ... %s)', values
81
82 data:
83 dictionary of fields and data
84 """
85 fields = data.keys()
86 refs = ['%s' for field in fields]
87 values = [data[field] for field in fields]
88 cmd = 'insert into %s (%s) values (%s)' % \
89 (table, ','.join(fields), ','.join(refs))
mbligh53d14252007-09-12 16:33:14 +000090
mbligh8e1ab172007-09-13 17:29:56 +000091 self.dprint('%s %s' % (cmd,values))
mbligh608c3252007-08-31 13:53:00 +000092 self.cur.execute(cmd, values)
93 self.con.commit()
94
95
mbligh056d0d32006-10-08 22:31:10 +000096 def insert_job(self, tag, job):
mbligh8e1ab172007-09-13 17:29:56 +000097 self.insert('jobs', {'tag':tag, 'machine':job.machine})
mbligh608c3252007-08-31 13:53:00 +000098 job.index = self.find_job(tag)
99 for test in job.tests:
100 self.insert_test(job, test)
101
mbligh237bed32007-09-05 13:05:57 +0000102
mbligh608c3252007-08-31 13:53:00 +0000103 def insert_test(self, job, test):
mbligh8e1ab172007-09-13 17:29:56 +0000104 kver = self.insert_kernel(test.kernel)
mbligh608c3252007-08-31 13:53:00 +0000105 data = {'job_idx':job.index, 'test':test.testname,
mbligh2bd48872007-09-20 18:32:25 +0000106 'subdir':test.subdir, 'kernel_idx':kver,
mbligh8e1ab172007-09-13 17:29:56 +0000107 'status':self.status_idx[test.status],
108 'reason':test.reason, 'machine':test.machine }
mbligh608c3252007-08-31 13:53:00 +0000109 self.insert('tests', data)
mbligh2bd48872007-09-20 18:32:25 +0000110 test_idx = self.find_test(job.index, test.subdir)
111 data = { 'test_idx':test_idx }
112
113 for i in test.iterations:
114 data['iteration'] = i.index
115 for key in i.keyval:
116 data['attribute'] = key
117 data['value'] = i.keyval[key]
118 self.insert('iteration_result', data)
mblighe9cf9d42007-08-31 08:56:00 +0000119
120
mbligh9bb92fe2007-09-12 15:54:23 +0000121 def lookup_kernel(self, kernel):
122 rows = self.select('kernel_idx', 'kernels',
123 {'kernel_hash':kernel.kernel_hash})
mbligh237bed32007-09-05 13:05:57 +0000124 if rows:
125 return rows[0][0]
126 else:
127 return None
mblighe9cf9d42007-08-31 08:56:00 +0000128
129
mbligh8e1ab172007-09-13 17:29:56 +0000130 def insert_kernel(self, kernel):
mbligh9bb92fe2007-09-12 15:54:23 +0000131 kver = self.lookup_kernel(kernel)
mbligh237bed32007-09-05 13:05:57 +0000132 if kver:
133 return kver
mbligh9bb92fe2007-09-12 15:54:23 +0000134 self.insert('kernels', {'base':kernel.base,
mbligh95fca572007-09-27 17:11:00 +0000135 'kernel_hash':kernel.kernel_hash,
136 'printable':kernel.base})
mbligh9bb92fe2007-09-12 15:54:23 +0000137 # WARNING - incorrectly shoving base into printable here.
138 kver = self.lookup_kernel(kernel)
mbligh237bed32007-09-05 13:05:57 +0000139 for patch in kernel.patches:
140 self.insert_patch(kver, patch)
141 return kver
142
143
144 def insert_patch(self, kver, patch):
145 print patch.reference
146 name = os.path.basename(patch.reference)[:80]
mbligh9bb92fe2007-09-12 15:54:23 +0000147 self.insert('patches', {'kernel_idx': kver,
mbligh237bed32007-09-05 13:05:57 +0000148 'name':name,
149 'url':patch.reference,
150 'hash':patch.hash})
mbligh056d0d32006-10-08 22:31:10 +0000151
mbligh2bd48872007-09-20 18:32:25 +0000152 def find_test(self, job_idx, subdir):
153 where = { 'job_idx':job_idx , 'subdir':subdir }
154 rows = self.select('test_idx', 'tests', where)
155 if rows:
156 return rows[0][0]
157 else:
158 return None
159
mbligh056d0d32006-10-08 22:31:10 +0000160
161 def find_job(self, tag):
mbligh608c3252007-08-31 13:53:00 +0000162 rows = self.select('job_idx', 'jobs', {'tag': tag})
163 if rows:
164 return rows[0][0]
165 else:
166 return None