blob: a4d2bc6bf3766f881d1fec3048be4c23fd70130b [file] [log] [blame]
mbligh97894452007-10-05 15:10:33 +00001import MySQLdb, re, os, sys, types
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
mbligha218d112007-10-03 20:15:09 +00006
7 path = os.path.dirname(os.path.abspath(sys.argv[0]))
mblighb32cd432007-09-25 18:20:04 +00008 try:
mbligha218d112007-10-03 20:15:09 +00009 file = os.path.join(path, '.database')
10 db_prefs = open(path, 'r')
mbligh728ff0a2007-09-27 17:05:12 +000011 host = db_prefs.readline().rstrip()
12 database = db_prefs.readline().rstrip()
13 except:
14 host = 'localhost'
15 database = 'tko'
16
17 try:
mbligha218d112007-10-03 20:15:09 +000018 file = os.path.join(path, '.priv_login')
19 login = open(file, 'r')
mblighb32cd432007-09-25 18:20:04 +000020 user = login.readline().rstrip()
21 password = login.readline().rstrip()
mbligh95fca572007-09-27 17:11:00 +000022 except:
23 try:
mbligha218d112007-10-03 20:15:09 +000024 file = os.path.join(path, '.unpriv_login')
25 login = open(path, 'r')
mbligh95fca572007-09-27 17:11:00 +000026 user = login.readline().rstrip()
27 password = login.readline().rstrip()
28 except:
29 user = 'nobody'
30 password = ''
mblighb32cd432007-09-25 18:20:04 +000031
32 self.con = MySQLdb.connect(host=host, user=user,
mbligh95fca572007-09-27 17:11:00 +000033 passwd=password, db=database)
mblighd5c33db2006-10-08 21:34:16 +000034 self.cur = self.con.cursor()
35
mbligh8e1ab172007-09-13 17:29:56 +000036 # if not present, insert statuses
37 self.status_idx = {}
38 self.status_word = {}
mblighc82f2462007-10-02 19:19:17 +000039 status_rows = self.select('status_idx, word', 'status', None)
40 for s in status_rows:
mbligh97894452007-10-05 15:10:33 +000041 self.status_idx[s[1]] = s[0]
mblighc82f2462007-10-02 19:19:17 +000042 self.status_word[s[0]] = s[1]
mbligh048e1c92007-10-07 00:10:33 +000043
44 dir = os.path.abspath(os.path.dirname(sys.argv[0]))
45 machine_map = os.path.join(dir, 'machines')
46 if os.path.exists(machine_map):
47 self.machine_map = machine_map
48 self.machine_group = {}
49
mbligh8e1ab172007-09-13 17:29:56 +000050
mbligh8e1ab172007-09-13 17:29:56 +000051 def dprint(self, value):
52 if self.debug:
53 sys.stderr.write('SQL: ' + str(value) + '\n')
54
mblighd5c33db2006-10-08 21:34:16 +000055
mbligh31d29c42007-09-27 00:51:33 +000056 def select(self, fields, table, where, distinct = False):
mbligh608c3252007-08-31 13:53:00 +000057 """\
58 select fields from table where {dictionary}
59 """
mbligh31d29c42007-09-27 00:51:33 +000060 cmd = ['select']
61 if distinct:
62 cmd.append('distinct')
63 cmd += [fields, 'from', table]
mbligh608c3252007-08-31 13:53:00 +000064
mbligh31d29c42007-09-27 00:51:33 +000065 values = []
mbligh414c69e2007-10-05 15:13:06 +000066 if where and isinstance(where, types.DictionaryType):
mbligh53d14252007-09-12 16:33:14 +000067 keys = [field + '=%s' for field in where.keys()]
68 values = [where[field] for field in where.keys()]
69
mbligh31d29c42007-09-27 00:51:33 +000070 cmd.append(' where ' + ' and '.join(keys))
mbligh414c69e2007-10-05 15:13:06 +000071 elif where and isinstance(where, types.StringTypes):
72 cmd.append(' where ' + where)
mbligh53d14252007-09-12 16:33:14 +000073
mbligh31d29c42007-09-27 00:51:33 +000074 self.dprint('%s %s' % (' '.join(cmd),values))
75 self.cur.execute(' '.join(cmd), values)
mblighd5c33db2006-10-08 21:34:16 +000076 return self.cur.fetchall()
77
mbligh056d0d32006-10-08 22:31:10 +000078
mbligh414c69e2007-10-05 15:13:06 +000079 def select_sql(self, fields, table, sql, values):
80 """\
81 select fields from table "sql"
82 """
83 cmd = 'select %s from %s %s' % (fields, table, sql)
84 self.dprint(cmd)
85 self.cur.execute(cmd, values)
86 return self.cur.fetchall()
87
88
mbligh608c3252007-08-31 13:53:00 +000089 def insert(self, table, data):
90 """\
91 'insert into table (keys) values (%s ... %s)', values
92
93 data:
94 dictionary of fields and data
95 """
96 fields = data.keys()
97 refs = ['%s' for field in fields]
98 values = [data[field] for field in fields]
99 cmd = 'insert into %s (%s) values (%s)' % \
100 (table, ','.join(fields), ','.join(refs))
mbligh53d14252007-09-12 16:33:14 +0000101
mbligh8e1ab172007-09-13 17:29:56 +0000102 self.dprint('%s %s' % (cmd,values))
mbligh608c3252007-08-31 13:53:00 +0000103 self.cur.execute(cmd, values)
104 self.con.commit()
105
106
mbligh414c69e2007-10-05 15:13:06 +0000107 def update(self, table, data, where):
108 """\
109 'update table set data values (%s ... %s) where ...'
110
111 data:
112 dictionary of fields and data
113 """
114 cmd = 'update %s ' % table
115 fields = data.keys()
116 data_refs = [field + '=%s' for field in fields]
117 data_values = [data[field] for field in fields]
118 cmd += ' set ' + ' and '.join(data_refs)
119
120 where_keys = [field + '=%s' for field in where.keys()]
121 where_values = [where[field] for field in where.keys()]
122 cmd += ' where ' + ' and '.join(where_keys)
123
124 print '%s %s' % (cmd, data_values + where_values)
125 self.cur.execute(cmd, data_values + where_values)
126 self.con.commit()
127
128
mbligh056d0d32006-10-08 22:31:10 +0000129 def insert_job(self, tag, job):
mbligh2aaeb672007-10-01 14:54:18 +0000130 job.machine_idx = self.lookup_machine(job.machine)
131 if not job.machine_idx:
132 job.machine_idx = self.insert_machine(job.machine)
133 self.insert('jobs', {'tag':tag, 'machine_idx':job.machine_idx})
mbligh608c3252007-08-31 13:53:00 +0000134 job.index = self.find_job(tag)
135 for test in job.tests:
136 self.insert_test(job, test)
137
mbligh237bed32007-09-05 13:05:57 +0000138
mbligh608c3252007-08-31 13:53:00 +0000139 def insert_test(self, job, test):
mbligh8e1ab172007-09-13 17:29:56 +0000140 kver = self.insert_kernel(test.kernel)
mbligh608c3252007-08-31 13:53:00 +0000141 data = {'job_idx':job.index, 'test':test.testname,
mbligh2bd48872007-09-20 18:32:25 +0000142 'subdir':test.subdir, 'kernel_idx':kver,
mbligh8e1ab172007-09-13 17:29:56 +0000143 'status':self.status_idx[test.status],
mbligh2aaeb672007-10-01 14:54:18 +0000144 'reason':test.reason, 'machine_idx':job.machine_idx }
mbligh608c3252007-08-31 13:53:00 +0000145 self.insert('tests', data)
mbligh2bd48872007-09-20 18:32:25 +0000146 test_idx = self.find_test(job.index, test.subdir)
147 data = { 'test_idx':test_idx }
148
149 for i in test.iterations:
150 data['iteration'] = i.index
151 for key in i.keyval:
152 data['attribute'] = key
153 data['value'] = i.keyval[key]
154 self.insert('iteration_result', data)
mblighe9cf9d42007-08-31 08:56:00 +0000155
156
mbligh048e1c92007-10-07 00:10:33 +0000157 def read_machine_map(self):
158 self.machine_group = {}
159 for line in open(self.machine_map, 'r').readlines():
160 (machine, group) = line.split()
161 self.machine_group[machine] = group
162
163
164 def insert_machine(self, hostname, group = None):
165 if self.machine_map and not self.machine_group:
166 self.read_machine_map()
167
168 if not group:
169 group = self.machine_group.get(hostname, hostname)
170
171 self.insert('machines', { 'hostname' : hostname ,
172 'machine_group' : group })
mbligh2aaeb672007-10-01 14:54:18 +0000173 return self.lookup_machine(hostname)
174
175
176 def lookup_machine(self, hostname):
177 where = { 'hostname' : hostname }
178 rows = self.select('machine_idx', 'machines', where)
179 if rows:
180 return rows[0][0]
181 else:
182 return None
183
184
mbligh9bb92fe2007-09-12 15:54:23 +0000185 def lookup_kernel(self, kernel):
186 rows = self.select('kernel_idx', 'kernels',
mbligh048e1c92007-10-07 00:10:33 +0000187 {'kernel_hash':kernel.kernel_hash})
mbligh237bed32007-09-05 13:05:57 +0000188 if rows:
189 return rows[0][0]
190 else:
191 return None
mblighe9cf9d42007-08-31 08:56:00 +0000192
193
mbligh8e1ab172007-09-13 17:29:56 +0000194 def insert_kernel(self, kernel):
mbligh9bb92fe2007-09-12 15:54:23 +0000195 kver = self.lookup_kernel(kernel)
mbligh237bed32007-09-05 13:05:57 +0000196 if kver:
197 return kver
mbligh9bb92fe2007-09-12 15:54:23 +0000198 self.insert('kernels', {'base':kernel.base,
mbligh95fca572007-09-27 17:11:00 +0000199 'kernel_hash':kernel.kernel_hash,
200 'printable':kernel.base})
mbligh9bb92fe2007-09-12 15:54:23 +0000201 # WARNING - incorrectly shoving base into printable here.
202 kver = self.lookup_kernel(kernel)
mbligh237bed32007-09-05 13:05:57 +0000203 for patch in kernel.patches:
204 self.insert_patch(kver, patch)
205 return kver
206
207
208 def insert_patch(self, kver, patch):
209 print patch.reference
210 name = os.path.basename(patch.reference)[:80]
mbligh9bb92fe2007-09-12 15:54:23 +0000211 self.insert('patches', {'kernel_idx': kver,
mbligh237bed32007-09-05 13:05:57 +0000212 'name':name,
213 'url':patch.reference,
214 'hash':patch.hash})
mbligh056d0d32006-10-08 22:31:10 +0000215
mbligh048e1c92007-10-07 00:10:33 +0000216
mbligh2bd48872007-09-20 18:32:25 +0000217 def find_test(self, job_idx, subdir):
218 where = { 'job_idx':job_idx , 'subdir':subdir }
219 rows = self.select('test_idx', 'tests', where)
220 if rows:
221 return rows[0][0]
222 else:
223 return None
224
mbligh056d0d32006-10-08 22:31:10 +0000225
226 def find_job(self, tag):
mbligh608c3252007-08-31 13:53:00 +0000227 rows = self.select('job_idx', 'jobs', {'tag': tag})
228 if rows:
229 return rows[0][0]
230 else:
231 return None