1 |
commit: 6491db2bcdf9350a3cb9f974e590c8e08556a057 |
2 |
Author: Magnus Granberg <zorry <AT> gentoo <DOT> org> |
3 |
AuthorDate: Fri Apr 1 16:05:06 2011 +0000 |
4 |
Commit: Magnus Granberg <zorry <AT> gentoo <DOT> org> |
5 |
CommitDate: Fri Apr 1 16:05:06 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=dev/zorry.git;a=commit;h=6491db2b |
7 |
|
8 |
added the code for the portage hooks |
9 |
|
10 |
--- |
11 |
buildhost/portage_hook/buildhost_hook.py | 244 +++++++++++ |
12 |
buildhost/portage_hook/sqlbackend.py | 646 ++++++++++++++++++++++++++++++ |
13 |
2 files changed, 890 insertions(+), 0 deletions(-) |
14 |
|
15 |
diff --git a/buildhost/portage_hook/__init__.py b/buildhost/portage_hook/__init__.py |
16 |
new file mode 100644 |
17 |
index 0000000..e69de29 |
18 |
|
19 |
diff --git a/buildhost/portage_hook/buildhost_hook.py b/buildhost/portage_hook/buildhost_hook.py |
20 |
new file mode 100644 |
21 |
index 0000000..df24e12 |
22 |
--- /dev/null |
23 |
+++ b/buildhost/portage_hook/buildhost_hook.py |
24 |
@@ -0,0 +1,244 @@ |
25 |
+# -*- coding: utf-8 -*- |
26 |
+# written 2010 by Magnus Granberg <zorry@g.o> |
27 |
+# License: GPL-2 |
28 |
+ |
29 |
+"""core module""" |
30 |
+import sys |
31 |
+from StringIO import StringIO |
32 |
+import os |
33 |
+import re |
34 |
+import portage |
35 |
+import _emerge |
36 |
+import hashlib |
37 |
+import errno |
38 |
+import time |
39 |
+from xml.etree.ElementTree import ElementTree |
40 |
+ |
41 |
+class get_conf_settings(object): |
42 |
+ # open the /etc/buildhost/buildhost.conf file and get the needed |
43 |
+ # settings for the database |
44 |
+ def get_conf_settings_from_file(): |
45 |
+ configfile = "/etc/buildhost/buildhost.conf" |
46 |
+ open_conffile = open(configfile, 'r') |
47 |
+ dataLines = open_conffile.readlines() |
48 |
+ for line in dataLines: |
49 |
+ element = line.split('=') |
50 |
+ if element[0] == 'SQLBACKEND': # Databas backend (mysql) |
51 |
+ GetSqlBackend = element[1] |
52 |
+ if element[0] == 'SQLDB': # Database |
53 |
+ GetSqlDB = element[1] |
54 |
+ if element[0] == 'SQLHOST': # Host |
55 |
+ GetSqlHost = element[1] |
56 |
+ if element[0] == 'SQLUSER': # User |
57 |
+ GetSqlUser = element[1] |
58 |
+ if element[0] == 'SQLPASSWD': # Password |
59 |
+ GetSqlPasswd = element[1] |
60 |
+ if element[0] == 'BUILDCONFIG': # Buildhost root |
61 |
+ GetBuildConfig = element[1] |
62 |
+ open_conffile.close() |
63 |
+ return GetSqlBackend.rstrip('\n'), GetSqlDB.rstrip('\n'), GetSqlHost.rstrip('\n'), \ |
64 |
+ GetSqlUser.rstrip('\n'), GetSqlPasswd.rstrip('\n'), GetBuildConfig.rstrip('\n') |
65 |
+ |
66 |
+ Get_BuildHost_settings = get_conf_settings_from_file() |
67 |
+ SetSqlBackend = Get_BuildHost_settings[0] |
68 |
+ SetSqlDB = Get_BuildHost_settings[1] |
69 |
+ SetSqlHost = Get_BuildHost_settings[2] |
70 |
+ SetSqlUser = Get_BuildHost_settings[3] |
71 |
+ SetSqlPasswd = Get_BuildHost_settings[4] |
72 |
+ SetBuildConfig = Get_BuildHost_settings[5] |
73 |
+ |
74 |
+def init_sql_backend(): |
75 |
+ from sqlbackend import DatabaseConfig # import DatebaseConfig |
76 |
+ database = None |
77 |
+ |
78 |
+ # Setup the database backent to use mysql |
79 |
+ if DatabaseConfig.mode == 'pgsql': |
80 |
+ from sqlbackend import PgSQLPackageDB |
81 |
+ database = PgSQLPackageDB(DatabaseConfig.settings['sql_pgsql']) |
82 |
+ return database |
83 |
+ |
84 |
+def get_iuse(portdb, cpv): |
85 |
+ """Gets the current IUSE flags from the tree |
86 |
+ |
87 |
+ To be used when a gentoolkit package object is not needed |
88 |
+ @type: cpv: string |
89 |
+ @param cpv: cat/pkg-ver |
90 |
+ @rtype list |
91 |
+ @returns [] or the list of IUSE flags |
92 |
+ """ |
93 |
+ return portdb.aux_get(cpv, ["IUSE"])[0].split() |
94 |
+ |
95 |
+def reduce_flag(flag): |
96 |
+ """Absolute value function for a USE flag |
97 |
+ |
98 |
+ @type flag: string |
99 |
+ @param flag: the use flag to absolute. |
100 |
+ @rtype: string |
101 |
+ @return absolute USE flag |
102 |
+ """ |
103 |
+ if flag[0] in ["+","-"]: |
104 |
+ return flag[1:] |
105 |
+ else: |
106 |
+ return flag |
107 |
+ |
108 |
+ |
109 |
+def reduce_flags(the_list): |
110 |
+ """Absolute value function for a USE flag list |
111 |
+ |
112 |
+ @type the_list: list |
113 |
+ @param the_list: the use flags to absolute. |
114 |
+ @rtype: list |
115 |
+ @return absolute USE flags |
116 |
+ """ |
117 |
+ r=[] |
118 |
+ for member in the_list: |
119 |
+ r.append(reduce_flag(member)) |
120 |
+ return r |
121 |
+ |
122 |
+ |
123 |
+def filter_flags(settings, use, use_expand_hidden, usemasked, useforced): |
124 |
+ """Filter function to remove hidden or otherwise not normally |
125 |
+ visible USE flags from a list. |
126 |
+ |
127 |
+ @type use: list |
128 |
+ @param use: the USE flag list to be filtered. |
129 |
+ @type use_expand_hidden: list |
130 |
+ @param use_expand_hidden: list of flags hidden. |
131 |
+ @type usemasked: list |
132 |
+ @param usemasked: list of masked USE flags. |
133 |
+ @type useforced: list |
134 |
+ @param useforced: the forced USE flags. |
135 |
+ @rtype: list |
136 |
+ @return the filtered USE flags. |
137 |
+ """ |
138 |
+ # clean out some environment flags, since they will most probably |
139 |
+ # be confusing for the user |
140 |
+ for f in use_expand_hidden: |
141 |
+ f=f.lower() + "_" |
142 |
+ for x in use: |
143 |
+ if f in x: |
144 |
+ use.remove(x) |
145 |
+ # clean out any arch's |
146 |
+ archlist = settings["PORTAGE_ARCHLIST"].split() |
147 |
+ for a in use[:]: |
148 |
+ if a in archlist: |
149 |
+ use.remove(a) |
150 |
+ # dbl check if any from usemasked or useforced are still there |
151 |
+ masked = usemasked + useforced |
152 |
+ for a in use[:]: |
153 |
+ if a in masked: |
154 |
+ use.remove(a) |
155 |
+ return use |
156 |
+ |
157 |
+def get_all_cpv_use(settings, portdb, cpv): |
158 |
+ """Uses portage to determine final USE flags and settings for an emerge |
159 |
+ |
160 |
+ @type cpv: string |
161 |
+ @param cpv: eg cat/pkg-ver |
162 |
+ @rtype: lists |
163 |
+ @return use, use_expand_hidden, usemask, useforce |
164 |
+ """ |
165 |
+ use = None |
166 |
+ settings.unlock() |
167 |
+ try: |
168 |
+ settings.setcpv(cpv, use_cache=None, mydb=portdb) |
169 |
+ use = settings['PORTAGE_USE'].split() |
170 |
+ use_expand_hidden = settings["USE_EXPAND_HIDDEN"].split() |
171 |
+ usemask = list(settings.usemask) |
172 |
+ useforce = list(settings.useforce) |
173 |
+ except KeyError: |
174 |
+ settings.reset() |
175 |
+ settings.lock() |
176 |
+ return [], [], [], [] |
177 |
+ # reset cpv filter |
178 |
+ settings.reset() |
179 |
+ settings.lock() |
180 |
+ return use, use_expand_hidden, usemask, useforce |
181 |
+ |
182 |
+def get_flags(settings, portdb, cpv): |
183 |
+ """Retrieves all information needed to filter out hidden, masked, etc. |
184 |
+ USE flags for a given package. |
185 |
+ |
186 |
+ @type cpv: string |
187 |
+ @param cpv: eg. cat/pkg-ver |
188 |
+ @type final_setting: boolean |
189 |
+ @param final_setting: used to also determine the final |
190 |
+ enviroment USE flag settings and return them as well. |
191 |
+ @rtype: list or list, list |
192 |
+ @return IUSE or IUSE, final_flags |
193 |
+ """ |
194 |
+ final_use, use_expand_hidden, usemasked, useforced = get_all_cpv_use(settings, portdb, cpv) |
195 |
+ iuse_flags = filter_flags(settings, get_iuse(portdb, cpv), use_expand_hidden, usemasked, useforced) |
196 |
+ #flags = filter_flags(use_flags, use_expand_hidden, usemasked, useforced) |
197 |
+ final_flags = filter_flags(settings, final_use, use_expand_hidden, usemasked, useforced) |
198 |
+ return iuse_flags, final_flags |
199 |
+ |
200 |
+def get_log_text(filename): |
201 |
+ """Return the log contents as a list""" |
202 |
+ try: |
203 |
+ logfile = open(filename) |
204 |
+ except IOError, oe: |
205 |
+ if oe.errno not in (errno.ENOENT, ): |
206 |
+ raise |
207 |
+ return None |
208 |
+ text = [] |
209 |
+ dataLines = logfile.readlines() |
210 |
+ for i in dataLines: |
211 |
+ text.append(i) |
212 |
+ return text |
213 |
+ |
214 |
+def add_new_ebuild_buildquery_db(database, settings, build_dict, ebuild_version_checksum_tree, config_profile): |
215 |
+ portdb = portage.portdbapi(mysettings=settings) |
216 |
+ message = None |
217 |
+ cpv = build_dict['cpv'] |
218 |
+ iuse_flags_list, final_use_list = get_flags(settings, portdb, cpv) |
219 |
+ iuse = [] |
220 |
+ for iuse_line in iuse_flags_list: |
221 |
+ iuse.append(reduce_flag(iuse_line)) |
222 |
+ iuse_flags_list2 = list(set(iuse)) |
223 |
+ use_enable = build_dict['build_useflags'] |
224 |
+ use_disable = list(set(iuse_flags_list2).difference(set(use_enable))) |
225 |
+ use_flagsDict = {} |
226 |
+ for x in use_enable: |
227 |
+ use_flagsDict[x] = True |
228 |
+ for x in use_disable: |
229 |
+ use_flagsDict[x] = False |
230 |
+ for u, s in use_flagsDict.iteritems(): |
231 |
+ use_flags_list.append(u) |
232 |
+ use_enable_list.append(s) |
233 |
+ ebuild_id = database.get_ebuild_id_db(build_dict, ebuild_version_checksum_tree) |
234 |
+ database.add_new_package_buildqueue(ebuild_id, config_profile, use_flags_list, use_enable_list, message) |
235 |
+ return |
236 |
+def get_buillog_info(settings, mode): |
237 |
+ logfile_text = get_log_text(settings.get("PORTAGE_LOG_FILE")) |
238 |
+def get_build_dict_db(settings, database, config_profile): |
239 |
+ categories = settings['CATEGORY'] |
240 |
+ package = settings['PN'] |
241 |
+ ebuild_version = settings['PVR'] |
242 |
+ cpv = categories + "/" + package + "-" + ebuild_version |
243 |
+ package_id = database.have_package_db(categories, package) |
244 |
+ build_dict = {} |
245 |
+ build_dict['ebuild_version'] = ebuild_version |
246 |
+ build_dict['package_id'] = package_id |
247 |
+ build_dict['cpv'] = cpv |
248 |
+ build_dict['build_useflags'] = settings.get('PORTAGE_BUILT_USE') |
249 |
+ pkgdir = os.path.join(settings['PORTDIR'], categories + "/" + package) |
250 |
+ ebuild_version_checksum_tree = portage.checksum.sha256hash(pkgdir+ "/" + package + "-" + ebuild_version + ".ebuild")[0] |
251 |
+ queue_id = database.check_revision(build_dict, config_profile, ebuild_version_checksum_tree) |
252 |
+ if queue_id is None: |
253 |
+ add_new_ebuild_buildquery_db(database, settings, build_dict, ebuild_version_checksum_tree, config_profile) |
254 |
+ queue_id = database.check_revision(build_dict, config_profile, ebuild_version_checksum_tree) |
255 |
+ build_dict = database.get_package_to_build(config_profile, queue_id) |
256 |
+ return build_dict |
257 |
+ |
258 |
+def main_hook(settings, mode): |
259 |
+ # Main |
260 |
+ get_conf_settings.__init__ # Init settings from the configfile |
261 |
+ database = init_sql_backend() # Init the Database |
262 |
+ config_profile = get_conf_settings.SetBuildConfig |
263 |
+ build_dict = get_build_dict_db(settings, database, config_profile) |
264 |
+ build_log_dict = get_buildlog_info(settings, mode) |
265 |
+ print settings.get("PORTAGE_LOG_FILE") |
266 |
+ print settings['PORTAGE_USE'], settings['PORTAGE_BUILDDIR'] |
267 |
+ print build_dict |
268 |
+ |
269 |
\ No newline at end of file |
270 |
|
271 |
diff --git a/buildhost/portage_hook/sqlbackend.py b/buildhost/portage_hook/sqlbackend.py |
272 |
new file mode 100644 |
273 |
index 0000000..399aaa5 |
274 |
--- /dev/null |
275 |
+++ b/buildhost/portage_hook/sqlbackend.py |
276 |
@@ -0,0 +1,646 @@ |
277 |
+# -*- coding: utf-8 -*- |
278 |
+ |
279 |
+import sys, os, re |
280 |
+ |
281 |
+class DBStateError(Exception): |
282 |
+ """If the DB is in a state that is not expected, we raise this.""" |
283 |
+ def __init__(self, value): |
284 |
+ Exception.__init__(self) |
285 |
+ self.value = value |
286 |
+ def __str__(self): |
287 |
+ return repr(self.value) |
288 |
+ |
289 |
+class DatabaseConfig(object): |
290 |
+ # No touchy |
291 |
+ from core import get_conf_settings |
292 |
+ settings = {} |
293 |
+ mode = get_conf_settings.SetSqlBackend |
294 |
+ |
295 |
+ # Settings for MySQL. You need to create one users in |
296 |
+ # your MySQL database. |
297 |
+ # The user needs: |
298 |
+ # DELETE, INSERT, UPDATE, SELECT |
299 |
+ # Do NOT change these, set the values in the config file /etc/buildhost/buildhost.conf |
300 |
+ settings['sql_pgsql'] = {} |
301 |
+ # settings['sql_pgsql']['charset'] = 'utf8' |
302 |
+ settings['sql_pgsql']['host'] = get_conf_settings.SetSqlHost |
303 |
+ settings['sql_pgsql']['database'] = get_conf_settings.SetSqlDB |
304 |
+ settings['sql_pgsql']['user'] = get_conf_settings.SetSqlUser |
305 |
+ settings['sql_pgsql']['password'] = get_conf_settings.SetSqlPasswd |
306 |
+ |
307 |
+class SQLPackageDatabase(object): |
308 |
+ """we have to store our stuff somewhere |
309 |
+ |
310 |
+ subclass and redefine init to provide |
311 |
+ at least self.cursor""" |
312 |
+ |
313 |
+ # These are set by subclasses |
314 |
+ db = None |
315 |
+ cursor = None |
316 |
+ syntax_placeholder = None |
317 |
+ syntax_autoincrement = None |
318 |
+ |
319 |
+ sql = {} |
320 |
+ |
321 |
+ def get_default_config(self, config_profile): |
322 |
+ cursor = self.conn.cursor() |
323 |
+ sqlQ = "SELECT make_conf_checksum FROM configs WHERE active = 'True' AND id = %s AND updateing = 'False'" |
324 |
+ cursor.execute(sqlQ, (config_profile,)) |
325 |
+ return cursor.fetchone() |
326 |
+ |
327 |
+ def get_package_to_build(self, config_profile, queue_id): |
328 |
+ cursor = self.conn.cursor() |
329 |
+ print queue_id, config_profile |
330 |
+ # get what to build |
331 |
+ sqlQ1 = "SELECT ebuild_id, post_message FROM buildqueue WHERE config = %s AND extract(epoch from (NOW()) - timestamp) > 7200 AND queue_id = %s" |
332 |
+ # get use flags to use |
333 |
+ sqlQ2 = "SELECT useflag, enabled FROM ebuildqueuedwithuses WHERE queue_id = %s" |
334 |
+ # get ebuild version (v) and package id |
335 |
+ sqlQ3 = 'SELECT ebuild_version, package_id, ebuild_checksum FROM ebuilds WHERE id = %s' |
336 |
+ # get categoriy and package (c, p) |
337 |
+ sqlQ4 ='SELECT category, package_name FROM packages WHERE package_id = %s' |
338 |
+ build_dict = {} |
339 |
+ build_useflags_dict = {} |
340 |
+ cursor.execute(sqlQ1, (config_profile, queue_id)) |
341 |
+ entries = cursor.fetchone() |
342 |
+ print entries |
343 |
+ if entries is None: |
344 |
+ build_dict['ebuild_id'] = None |
345 |
+ build_dict['post_message'] = None |
346 |
+ return build_dict |
347 |
+ build_dict['queue_id'] = queue_id |
348 |
+ ebuild_id = entries[0] |
349 |
+ build_dict['ebuild_id'] = ebuild_id |
350 |
+ build_dict['post_message'] = entries[1] |
351 |
+ cursor.execute(sqlQ2, (queue_id,)) |
352 |
+ entries = cursor.fetchall() |
353 |
+ if entries == []: |
354 |
+ build_useflags = None |
355 |
+ else: |
356 |
+ build_useflags = entries |
357 |
+ cursor.execute(sqlQ3, (ebuild_id,)) |
358 |
+ entries = cursor.fetchall()[0] |
359 |
+ build_dict['ebuild_version'] = entries[0] |
360 |
+ build_dict['package_id'] = entries[1] |
361 |
+ build_dict['ebuild_checksum'] = entries[2] |
362 |
+ cursor.execute(sqlQ4, (entries[1],)) |
363 |
+ entries = cursor.fetchall()[0] |
364 |
+ build_dict['categories'] = entries[0] |
365 |
+ build_dict['package'] = entries[1] |
366 |
+ if build_useflags is None: |
367 |
+ build_dict['build_useflags'] = None |
368 |
+ else: |
369 |
+ for x in build_useflags: |
370 |
+ build_useflags_dict[x[0]] = x[1] |
371 |
+ build_dict['build_useflags'] = build_useflags_dict |
372 |
+ print "build_dict", build_dict |
373 |
+ return build_dict |
374 |
+ |
375 |
+ def check_revision(self, build_dict, config_profile, ebuild_version_checksum_tree): |
376 |
+ cursor = self.conn.cursor() |
377 |
+ sqlQ1 = 'SELECT id FROM ebuilds WHERE ebuild_version = %s AND ebuild_checksum = %s AND package_id = %s' |
378 |
+ sqlQ2 = 'SELECT queue_id FROM buildqueue WHERE ebuild_id = %s AND config = %s' |
379 |
+ sqlQ3 = "SELECT useflag FROM ebuildqueuedwithuses WHERE queue_id = %s AND enabled = 'True'" |
380 |
+ cursor.execute(sqlQ1, (build_dict['ebuild_version'], ebuild_version_checksum_tree, build_dict['package_id'])) |
381 |
+ ebuild_id = cursor.fetchone()[0] |
382 |
+ print ebuild_id |
383 |
+ if ebuild_id is None: |
384 |
+ return None |
385 |
+ cursor.execute(sqlQ2, (ebuild_id, config_profile)) |
386 |
+ queue_id_list = cursor.fetchall() |
387 |
+ if queue_id_list is None: |
388 |
+ return None |
389 |
+ for queue_id in queue_id_list: |
390 |
+ cursor.execute(sqlQ3, (queue_id,)) |
391 |
+ entries = cursor.fetchall() |
392 |
+ if entries == []: |
393 |
+ build_useflags = None |
394 |
+ else: |
395 |
+ build_useflags = entries |
396 |
+ print build_useflags, build_dict['build_useflags'] |
397 |
+ if build_useflags is build_dict['build_useflags']: |
398 |
+ print queue_id[0] |
399 |
+ return queue_id[0] |
400 |
+ return None |
401 |
+ |
402 |
+ def get_config_list_all(self): |
403 |
+ cursor = self.conn.cursor() |
404 |
+ sqlQ = 'SELECT id FROM configs' |
405 |
+ cursor.execute(sqlQ) |
406 |
+ return cursor.fetchall() |
407 |
+ |
408 |
+ def update__make_conf(self, configsDict): |
409 |
+ cursor = self.conn.cursor() |
410 |
+ |
411 |
+ sqlQ = 'UPDATE configs SET make_conf_checksum = %s, make_conf_text = %s, active = %s, config_error = %s WHERE id = %s' |
412 |
+ for k, v in configsDict.iteritems(): |
413 |
+ params = [v['make_conf_checksum_tree'], v['make_conf_text'], v['active'], v['config_error'], k] |
414 |
+ cursor.execute(sqlQ, params) |
415 |
+ self.conn.commit() |
416 |
+ |
417 |
+ def have_package_db(self, categories, package): |
418 |
+ cursor = self.conn.cursor() |
419 |
+ |
420 |
+ sqlQ ='SELECT package_id FROM packages WHERE category = %s AND package_name = %s' |
421 |
+ params = categories, package |
422 |
+ cursor.execute(sqlQ, params) |
423 |
+ return cursor.fetchone() |
424 |
+ |
425 |
+ def get_categories_db(self): |
426 |
+ cursor = self.conn.cursor() |
427 |
+ sqlQ =' SELECT category FROM categories' |
428 |
+ cursor.execute(sqlQ) |
429 |
+ return cursor.fetchall() |
430 |
+ |
431 |
+ def get_categories_checksum_db(self, categories): |
432 |
+ cursor = self.conn.cursor() |
433 |
+ sqlQ =' SELECT metadata_xml_checksum FROM categories_meta WHERE category = %s' |
434 |
+ cursor.execute(sqlQ, (categories,)) |
435 |
+ return cursor.fetchone() |
436 |
+ |
437 |
+ def add_new_categories_meta_sql(self, categories, categories_metadata_xml_checksum_tree, categories_metadata_xml_text_tree): |
438 |
+ cursor = self.conn.cursor() |
439 |
+ sqlQ = 'INSERT INTO categories_meta (category, metadata_xml_checksum, metadata_xml_text) VALUES ( %s, %s, %s )' |
440 |
+ params = categories, categories_metadata_xml_checksum_tree, categories_metadata_xml_text_tree |
441 |
+ cursor.execute(sqlQ, params) |
442 |
+ self.conn.commit() |
443 |
+ |
444 |
+ def update_categories_meta_sql(self, categories, categories_metadata_xml_checksum_tree, categories_metadata_xml_text_tree): |
445 |
+ cursor = self.conn.cursor() |
446 |
+ sqlQ ='UPDATE categories_meta SET metadata_xml_checksum = %s, metadata_xml_text = %s WHERE category = %s' |
447 |
+ params = (categories_metadata_xml_checksum_tree, categories_metadata_xml_text_tree, categories) |
448 |
+ cursor.execute(sqlQ, params) |
449 |
+ self.conn.commit() |
450 |
+ |
451 |
+ def add_new_manifest_sql(self, package_id, get_manifest_text, manifest_checksum_tree): |
452 |
+ cursor = self.conn.cursor() |
453 |
+ sqlQ = 'INSERT INTO manifest (package_id, manifest, checksum) VALUES ( %s, %s, %s )' |
454 |
+ params = package_id, get_manifest_text, manifest_checksum_tree |
455 |
+ cursor.execute(sqlQ, params) |
456 |
+ self.conn.commit() |
457 |
+ |
458 |
+ def add_new_package_metadata(self, package_id, package_metadataDict): |
459 |
+ cursor = self.conn.cursor() |
460 |
+ sqlQ = 'SELECT changelog_checksum FROM packages_meta WHERE package_id = %s' |
461 |
+ cursor.execute(sqlQ, (package_id,)) |
462 |
+ if cursor.fetchone() is None: |
463 |
+ sqlQ = 'INSERT INTO packages_meta (package_id, changelog_text, changelog_checksum, metadata_text, metadata_checksum) VALUES ( %s, %s, %s, %s, %s )' |
464 |
+ for k, v in package_metadataDict.iteritems(): |
465 |
+ params = package_id, v['changelog_text'], v['changelog_checksum'], v[' metadata_xml_text'], v['metadata_xml_checksum'] |
466 |
+ cursor.execute(sqlQ, params) |
467 |
+ self.conn.commit() |
468 |
+ |
469 |
+ def update_new_package_metadata(self, package_id, package_metadataDict): |
470 |
+ cursor = self.conn.cursor() |
471 |
+ sqlQ = 'SELECT changelog_checksum, metadata_checksum FROM packages_meta WHERE package_id = %s' |
472 |
+ cursor.execute(sqlQ, package_id) |
473 |
+ entries = cursor.fetchone() |
474 |
+ changelog_checksum_db = entries[0] |
475 |
+ metadata_checksum_db = entries[1] |
476 |
+ for k, v in package_metadataDict.iteritems(): |
477 |
+ if changelog_checksum_db != v['changelog_checksum']: |
478 |
+ sqlQ = 'UPDATE packages_meta SET changelog_text = %s, changelog_checksum = %s WHERE package_id = %s' |
479 |
+ params = v['changelog_text'], v['changelog_checksum'], package_id |
480 |
+ cursor.execute(sqlQ, params) |
481 |
+ if metadata_checksum_db != v['metadata_xml_checksum']: |
482 |
+ sqlQ = 'UPDATE packages_meta SET metadata_text = %s, metadata_checksum = %s WHERE package_id = %s' |
483 |
+ params = v[' metadata_xml_text'], v['metadata_xml_checksum'], package_id |
484 |
+ cursor.execute(sqlQ, params) |
485 |
+ self.conn.commit() |
486 |
+ |
487 |
+ def get_manifest_db(self, package_id): |
488 |
+ cursor = self.conn.cursor() |
489 |
+ sqlQ = 'SELECT checksum FROM manifest WHERE package_id = %s' |
490 |
+ cursor.execute(sqlQ, package_id) |
491 |
+ return cursor.fetchone() |
492 |
+ |
493 |
+ def update_manifest_sql(self, package_id, get_manifest_text, manifest_checksum_tree): |
494 |
+ cursor = self.conn.cursor() |
495 |
+ sqlQ = 'UPDATE manifest SET checksum = %s, manifest = %s WHERE package_id = %s' |
496 |
+ params = (manifest_checksum_tree, get_manifest_text, package_id) |
497 |
+ cursor.execute(sqlQ, params) |
498 |
+ self.conn.commit() |
499 |
+ |
500 |
+ def add_new_metadata(self, metadataDict): |
501 |
+ for k, v in metadataDict.iteritems(): |
502 |
+ cursor = self.conn.cursor() |
503 |
+ sqlQ = 'SELECT updaterestrictions( %s, %s )' |
504 |
+ params = k, v['restrictions'] |
505 |
+ cursor.execute(sqlQ, params) |
506 |
+ sqlQ = 'SELECT updatekeywords( %s, %s )' |
507 |
+ params = k, v['keyword'] |
508 |
+ cursor.execute(sqlQ, params) |
509 |
+ sqlQ = 'SELECT updateiuse( %s, %s )' |
510 |
+ params = k, v['iuse'] |
511 |
+ cursor.execute(sqlQ, params) |
512 |
+ self.conn.commit() |
513 |
+ |
514 |
+ def add_new_package_sql(self, packageDict): |
515 |
+ #lets have a new cursor for each metod as per best practice |
516 |
+ cursor = self.conn.cursor() |
517 |
+ sqlQ="SELECT insert_ebuild( %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, 'True')" |
518 |
+ ebuild_id_list = [] |
519 |
+ package_id_list = [] |
520 |
+ for k, v in packageDict.iteritems(): |
521 |
+ params = [v['categories'], v['package'], v['ebuild_version_tree'], v['ebuild_version_revision'], v['ebuild_version_checksum_tree'], |
522 |
+ v['ebuild_version_text'], v['ebuild_version_metadata_tree'][0], v['ebuild_version_metadata_tree'][1], |
523 |
+ v['ebuild_version_metadata_tree'][12], v['ebuild_version_metadata_tree'][2], v['ebuild_version_metadata_tree'][3], |
524 |
+ v['ebuild_version_metadata_tree'][5],v['ebuild_version_metadata_tree'][6], v['ebuild_version_metadata_tree'][7], |
525 |
+ v['ebuild_version_metadata_tree'][9], v['ebuild_version_metadata_tree'][11], |
526 |
+ v['ebuild_version_metadata_tree'][13],v['ebuild_version_metadata_tree'][14], v['ebuild_version_metadata_tree'][15], |
527 |
+ v['ebuild_version_metadata_tree'][16]] |
528 |
+ cursor.execute(sqlQ, params) |
529 |
+ mid = cursor.fetchone() |
530 |
+ mid=mid[0] |
531 |
+ ebuild_id_list.append(mid[1]) |
532 |
+ package_id_list.append(mid[0]) |
533 |
+ self.conn.commit() |
534 |
+ # add_new_metadata(metadataDict) |
535 |
+ return ebuild_id_list, package_id_list |
536 |
+ |
537 |
+ def add_new_ebuild_sql(packageDict, new_ebuild_list): |
538 |
+ #lets have a new cursor for each metod as per best practice |
539 |
+ cursor = self.conn.cursor() |
540 |
+ sqlQ="SELECT insert_ebuild( %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, 'True')" |
541 |
+ ebuild_id_list = [] |
542 |
+ package_id_list = [] |
543 |
+ for k, v in packageDict.iteritems(): |
544 |
+ for x in new_ebuild_list: |
545 |
+ if x == v['ebuild_version_tree']: |
546 |
+ params = [v['categories'], v['package'], v['ebuild_version_tree'], v['ebuild_version_revision'], v['ebuild_version_checksum_tree'], |
547 |
+ v['ebuild_version_text'], v['ebuild_version_metadata_tree'][0], v['ebuild_version_metadata_tree'][1], |
548 |
+ v['ebuild_version_metadata_tree'][12], v['ebuild_version_metadata_tree'][2], v['ebuild_version_metadata_tree'][3], |
549 |
+ v['ebuild_version_metadata_tree'][5],v['ebuild_version_metadata_tree'][6], v['ebuild_version_metadata_tree'][7], |
550 |
+ v['ebuild_version_metadata_tree'][9], v['ebuild_version_metadata_tree'][11], |
551 |
+ v['ebuild_version_metadata_tree'][13],v['ebuild_version_metadata_tree'][14], v['ebuild_version_metadata_tree'][15], |
552 |
+ v['ebuild_version_metadata_tree'][16]] |
553 |
+ cursor.execute(sqlQ, params) |
554 |
+ mid = cursor.fetchone() |
555 |
+ mid=mid[0] |
556 |
+ ebuild_id_list.append(mid[1]) |
557 |
+ package_id_list.append(mid[0]) |
558 |
+ self.conn.commit() |
559 |
+ # add_new_metadata(metadataDict) |
560 |
+ return ebuild_id_list, package_id_list |
561 |
+ |
562 |
+ def update_active_ebuild(self, package_id, ebuild_version_tree): |
563 |
+ cursor = self.conn.cursor() |
564 |
+ sqlQ ="UPDATE ebuilds SET active = 'False', timestamp = now() WHERE package_id = %s AND ebuild_version = %s AND active = 'True'" |
565 |
+ cursor.execute(sqlQ, (package_id, ebuild_version_tree)) |
566 |
+ self.conn.commit() |
567 |
+ |
568 |
+ def get_ebuild_id_db(build_dict, ebuild_version_checksum_tree): |
569 |
+ cursor = self.conn.cursor() |
570 |
+ sqlQ = 'SELECT id FROM ebuilds WHERE ebuild_version = %s AND ebuild_checksum = %s AND package_id = %s' |
571 |
+ cursor.execute(sqlQ, (build_dict['ebuild_version'], ebuild_version_checksum_tree, build_dict['package_id'])) |
572 |
+ ebuild_id = cursor.fetchone()[0] |
573 |
+ print ebuild_id |
574 |
+ if ebuild_id is None: |
575 |
+ return None |
576 |
+ return ebuild_id |
577 |
+ |
578 |
+ sql['SELECT_get_cpv_from_ebuild_id'] = """ |
579 |
+ SELECT category, ebuild_name, ebuild_version |
580 |
+ FROM packages |
581 |
+ WHERE id = %s |
582 |
+ """ |
583 |
+ def get_cpv_from_ebuild_id(self, ebuild_id): |
584 |
+ cursor = self.conn.cursor() |
585 |
+ sqlQ = 'SELECT package_id FROM ebuild WHERE id = %s' |
586 |
+ self.cursor.execute(sql, ebuild_id) |
587 |
+ entries = self.cursor.fetchone() |
588 |
+ return entries |
589 |
+ |
590 |
+ def get_cp_from_package_id(self, package_id): |
591 |
+ cursor = self.conn.cursor() |
592 |
+ sqlQ = "SELECT ARRAY_TO_STRING(ARRAY[category, package_name] , '/') AS cp FROM packages WHERE package_id = %s" |
593 |
+ cursor.execute(sqlQ, (package_id,)) |
594 |
+ return cursor.fetchone() |
595 |
+ |
596 |
+ sql['SELECT_get_keyword_id_db'] = """ |
597 |
+ SELECT id_keyword |
598 |
+ FROM keywords |
599 |
+ WHERE ARCH = %s AND stable = %s |
600 |
+ """ |
601 |
+ def get_keyword_id_db(self, arch, stable): |
602 |
+ sql = self.sql['SELECT_get_keyword_id_db'] |
603 |
+ self.cursor.execute(sql, (arch, stable)) |
604 |
+ entries = self.cursor.fetchone() |
605 |
+ return entries |
606 |
+ |
607 |
+ sql['INSERT_add_new_keywords'] = """ |
608 |
+ INSERT INTO keywordsToEbuild |
609 |
+ (ebuild_id, id_keyword) |
610 |
+ VALUES ( %s, %s ) |
611 |
+ """ |
612 |
+ def add_new_keywords(self, ebuild_id, keyword_id): |
613 |
+ sql = self.sql['INSERT_add_new_keywords'] |
614 |
+ self.cursor.execute(sql, (ebuild_id, keyword_id)) |
615 |
+ self.db.commit() |
616 |
+ |
617 |
+ sql['SELECT_have_package_buildqueue'] = """ |
618 |
+ SELECT useflags |
619 |
+ FROM buildqueue |
620 |
+ WHERE ebuild_id = %s AND config_id = %s |
621 |
+ """ |
622 |
+ def have_package_buildqueue(self, ebuild_id, config_id): |
623 |
+ sql = self.sql['SELECT_have_package_buildqueue'] |
624 |
+ params = (ebuild_id[0], config_id) |
625 |
+ self.cursor.execute(sql, params) |
626 |
+ entries = self.cursor.fetchone() |
627 |
+ return entries |
628 |
+ |
629 |
+ def add_new_package_buildqueue(self, ebuild_id, config_id, iuse_flags_list, use_enable, message): |
630 |
+ cursor = self.conn.cursor() |
631 |
+ sqlQ="SELECT insert_buildqueue( %s, %s, %s, %s, %s )" |
632 |
+ if not iuse_flags_list: |
633 |
+ iuse_flags_list=None |
634 |
+ use_enable=None |
635 |
+ params = ebuild_id, unicode(config_id), iuse_flags_list, use_enable, message |
636 |
+ cursor.execute(sqlQ, params) |
637 |
+ self.conn.commit() |
638 |
+ |
639 |
+ sql['SELECT_get_package_id'] = """ |
640 |
+ SELECT package_id |
641 |
+ FROM packages |
642 |
+ WHERE category = %s AND package_name = %s |
643 |
+ """ |
644 |
+ sql['SELECT_get_ebuild_checksum'] = """ |
645 |
+ SELECT ebuild_checksum |
646 |
+ FROM ebuild |
647 |
+ WHERE package_id = %s AND ebuild_version = %s |
648 |
+ """ |
649 |
+ def get_ebuild_checksum(self, package_id, ebuild_version_tree): |
650 |
+ cursor = self.conn.cursor() |
651 |
+ sqlQ = 'SELECT ebuild_checksum FROM ebuilds WHERE package_id = %s AND ebuild_version = %s AND active = TRUE' |
652 |
+ cursor.execute(sqlQ, (package_id, ebuild_version_tree)) |
653 |
+ entries = cursor.fetchone() |
654 |
+ if entries is None: |
655 |
+ return None |
656 |
+ return entries[0] |
657 |
+ |
658 |
+ sql['UPDATE_update_ebuild_db'] = """ |
659 |
+ UPDATE packages |
660 |
+ SET ebuild_checksum = %s, ebuild_text = %s, |
661 |
+ depend = %s, rdepend = %s, pdepend = %s, slot = %s, src_url = %s, homepage = %s, license = %s, |
662 |
+ description = %s, keywords = %s, inherited = %s, iuse = %s, required_use = %s, provide = %s, |
663 |
+ eapi = %s, properties = %s, defined_phases = %s |
664 |
+ WHERE ebuild_id = %s |
665 |
+ """ |
666 |
+ def update_ebuild_sql(self, ebuild_id, ebuild_version_checksum_tree, |
667 |
+ ebuild_version_metadata_tree, ebuild_version_text): |
668 |
+ sql = self.sql['UPDATE_update_ebuild_db'] |
669 |
+ params = (ebuild_version_checksum_tree[0], |
670 |
+ ebuild_version_text, ebuild_version_metadata_tree[0], ebuild_version_metadata_tree[1], |
671 |
+ ebuild_version_metadata_tree[12], ebuild_version_metadata_tree[2], ebuild_version_metadata_tree[3], |
672 |
+ ebuild_version_metadata_tree[5], ebuild_version_metadata_tree[6], ebuild_version_metadata_tree[7], |
673 |
+ ebuild_version_metadata_tree[9], ebuild_version_metadata_tree[10], ebuild_version_metadata_tree[11], |
674 |
+ ebuild_version_metadata_tree[13], ebuild_version_metadata_tree[14], ebuild_version_metadata_tree[15], |
675 |
+ ebuild_version_metadata_tree[16], ebuild_id) |
676 |
+ self.cursor.execute(sql, params) |
677 |
+ self.db.commit() |
678 |
+ |
679 |
+ sql['SELECT_cp_all_db'] = """ |
680 |
+ SELECT CONCAT_WS('/',categories, package) |
681 |
+ FROM package |
682 |
+ WHERE active = '1' |
683 |
+ """ |
684 |
+ def cp_all_db(self): |
685 |
+ cursor = self.conn.cursor() |
686 |
+ sqlQ = "SELECT package_id FROM packages" |
687 |
+ cursor.execute(sqlQ) |
688 |
+ return cursor.fetchall() |
689 |
+ |
690 |
+ def add_old_package(self, old_package_list): |
691 |
+ cursor = self.conn.cursor() |
692 |
+ mark_old_list = [] |
693 |
+ sqlQ = "UPDATE ebuilds SET active = 'FALSE', timestamp = NOW() WHERE package_id = %s AND active = 'TRUE' RETURNING package_id" |
694 |
+ for old_package in old_package_list: |
695 |
+ cursor.execute(sqlQ, (old_package[0],)) |
696 |
+ entries = cursor.fetchone() |
697 |
+ if entries is not None: |
698 |
+ mark_old_list.append(entries[0]) |
699 |
+ self.conn.commit() |
700 |
+ return mark_old_list |
701 |
+ |
702 |
+ sql['UPDATE_add_old_categories'] = """ |
703 |
+ UPDATE categories |
704 |
+ SET active = '0' |
705 |
+ WHERE categories = %s |
706 |
+ """ |
707 |
+ def get_old_categories(self, categories_line): |
708 |
+ cursor = self.conn.cursor() |
709 |
+ sqlQ = "SELECT package_name FROM packages WHERE category = %s" |
710 |
+ cursor.execute(sqlQ (categories_line)) |
711 |
+ return cursor.fetchone() |
712 |
+ |
713 |
+ def del_old_categories(self, real_old_categoriess): |
714 |
+ cursor = self.conn.cursor() |
715 |
+ sqlQ = 'DELETE FROM categories categories_meta WHERE category = %s' |
716 |
+ cursor.execute(sqlQ (real_old_categories)) |
717 |
+ self.conn.commit() |
718 |
+ |
719 |
+ def add_old_ebuild(self, package_id, old_ebuild_list): |
720 |
+ cursor = self.conn.cursor() |
721 |
+ sqlQ1 = "UPDATE ebuilds SET active = 'FALSE' WHERE package_id = %s AND ebuild_version = %s" |
722 |
+ sqlQ2 = "SELECT id FROM ebuilds WHERE package_id = %s AND ebuild_version = %s AND active = 'TRUE'" |
723 |
+ sqlQ3 = "SELECT queue_id FROM buildqueue WHERE ebuild_id = %s" |
724 |
+ sqlQ4 = 'DELETE FROM ebuildqueuedwithuses buildqueue WHERE queue_id = %s' |
725 |
+ for old_ebuild in old_ebuild_list: |
726 |
+ cursor.execute(sqlQ2, (package_id, old_ebuild[0])) |
727 |
+ ebuild_id_list = cursor.fetchall() |
728 |
+ if ebuild_id_list is not None: |
729 |
+ for ebuild_id in ebuild_id_list: |
730 |
+ cursor.execute(sqlQ3, (ebuild_id)) |
731 |
+ queue_id_list = cursor.fetchall() |
732 |
+ if queue_id_list is not None: |
733 |
+ for queue_id in queue_id_list: |
734 |
+ cursor.execute(sqlQ4, (queue_id)) |
735 |
+ cursor.execute(sqlQ1, (package_id, old_ebuild[0])) |
736 |
+ self.conn.commit() |
737 |
+ |
738 |
+ sql['SELECT_cp_all_old_db'] = """ |
739 |
+ SELECT CONCAT_WS('/',categories, package) |
740 |
+ FROM package |
741 |
+ WHERE active = '0' AND DATEDIFF(NOW(), timestamp) > 60 |
742 |
+ """ |
743 |
+ def cp_all_old_db(self, old_package_id_list): |
744 |
+ cursor = self.conn.cursor() |
745 |
+ old_package_list = [] |
746 |
+ for old_package in old_package_id_list: |
747 |
+ sqlQ = "SELECT package_id FROM ebuilds WHERE package_id = %s AND active = 'FALSE' AND date_part('days', NOW() - timestamp) < 60" |
748 |
+ cursor.execute(sqlQ, old_package) |
749 |
+ entries = cursor.fetchone() |
750 |
+ if entries is None: |
751 |
+ old_package_list.append(old_package) |
752 |
+ return old_package_list |
753 |
+ |
754 |
+ sql['DELETE_del_old_ebuild'] = """ |
755 |
+ DELETE FROM ebuild |
756 |
+ WHERE categories = %s AND package = %s AND active = '0' AND DATEDIFF(NOW(), timestamp) > 60 |
757 |
+ """ |
758 |
+ def del_old_ebuild(self, ebuild_old_list_db): |
759 |
+ cursor = self.conn.cursor() |
760 |
+ sqlQ1 ='SELECT id FROM ebuilds WHERE ebuild_version = %s' |
761 |
+ sqlQ2 = 'SELECT build_id FROM buildlog WHERE ebuild_id = %s' |
762 |
+ sqlQ3 = 'DELETE FROM qa_problems repoman_problems ebuildbuildwithuses WHERE build_id = %s' |
763 |
+ sqlQ4 = 'DELETE FROM ebuildhaveskeywords ebuildhavesiuses ebuildhavesrestrictions buildlog WHERE ebuild_id = %s' |
764 |
+ for ebuild_version in ebuild_old_list_db: |
765 |
+ cursor.execute(sqlQ1, (ebuild_version)) |
766 |
+ ebuild_id_list = cursor.fetchall() |
767 |
+ for ebuild_id in ebuild_id_list: |
768 |
+ cursor.execute(sqlQ2, ebuild_id) |
769 |
+ build_id_list = cursor.fetchall() |
770 |
+ for build_id in build_id_list: |
771 |
+ cursor.execute(sqlQ3, build_id) |
772 |
+ cursor.execute(sqlQ4, ebuild_id) |
773 |
+ self.conn.commit() |
774 |
+ |
775 |
+ sql['DELETE_del_old_package'] = """ |
776 |
+ DELETE FROM package |
777 |
+ WHERE categories = %s AND package = %s AND active = '0' AND DATEDIFF(NOW(), timestamp) > 60 |
778 |
+ """ |
779 |
+ def del_old_package(self, package_id_list): |
780 |
+ cursor = self.conn.cursor() |
781 |
+ sqlQ1 = 'SELECT id FROM ebuilds WHERE package_id = %s' |
782 |
+ sqlQ2 = 'SELECT build_id FROM buildlog WHERE ebuild_id = %s' |
783 |
+ sqlQ3 = 'DELETE FROM qa_problems, repoman_problems, ebuildbuildwithuses WHERE build_id = %s' |
784 |
+ sqlQ4 = 'DELETE FROM ebuildhaveskeywords, ebuildhavesiuses, ebuildhavesrestrictions, buildlog WHERE ebuild_id = %s' |
785 |
+ sqlQ5 = 'DELETE FROM ebuilds, manifest, package_meta, packages WHERE package_id = %s' |
786 |
+ for package_id in package_id_list: |
787 |
+ cursor.execute(sqlQ1, package_id) |
788 |
+ ebuild_id_list = cursor.fetchall() |
789 |
+ for ebuild_id in ebuild_id_list: |
790 |
+ cursor.execute(sqlQ2, ebuild_id) |
791 |
+ build_id_list = cursor.fetchall() |
792 |
+ for build_id in build_id_list: |
793 |
+ cursor.execute(sqlQ3, build_id) |
794 |
+ cursor.execute(sqlQ4, ebuild_id) |
795 |
+ cursor.execute(sqlQ5, package_id) |
796 |
+ self.conn.commit() |
797 |
+ |
798 |
+ sql['DELETE_del_old_categories'] = """ |
799 |
+ DELETE FROM categories |
800 |
+ WHERE categories = %s AND active = '0' AND DATEDIFF(NOW(), timestamp) > 60 |
801 |
+ """ |
802 |
+ def del_old_package(self, categories): |
803 |
+ sql = self.sql['DELETE_del_old_categories'] |
804 |
+ self.cursor.execute(sql, (categories)) |
805 |
+ self.db.commit() |
806 |
+ |
807 |
+ def cp_list_db(self, package_id): |
808 |
+ cursor = self.conn.cursor() |
809 |
+ sqlQ = "SELECT ebuild_version FROM ebuilds WHERE active = 'TRUE' AND package_id = %s" |
810 |
+ cursor.execute(sqlQ, (package_id)) |
811 |
+ return cursor.fetchall() |
812 |
+ |
813 |
+ def cp_list_old_db(self, package_id): |
814 |
+ cursor = self.conn.cursor() |
815 |
+ sqlQ ="SELECT id, ebuild_version FROM ebuilds WHERE active = 'FALSE' AND package_id = %s AND date_part('days', NOW() - timestamp) > 60" |
816 |
+ cursor.execute(sqlQ, package_id) |
817 |
+ return cursor.fetchall() |
818 |
+ |
819 |
+ def add_qa_repoman(self, ebuild_id_list, qa_error, packageDict, config_id): |
820 |
+ ebuild_i = 0 |
821 |
+ cursor = self.conn.cursor() |
822 |
+ for k, v in packageDict.iteritems(): |
823 |
+ ebuild_id = ebuild_id_list[ebuild_i] |
824 |
+ sqlQ = 'INSERT INTO buildlog (ebuild_id, config, error_summary, timestamp ) VALUES ( %s, %s, %s, now() ) RETURNING build_id' |
825 |
+ if v['ebuild_error'] != [] or qa_error != []: |
826 |
+ if v['ebuild_error'] != [] or qa_error == []: |
827 |
+ summary = "Repoman" |
828 |
+ elif v['ebuild_error'] == [] or qa_error != []: |
829 |
+ summary = "QA" |
830 |
+ else: |
831 |
+ summary = "QA:Repoman" |
832 |
+ params = (ebuild_id, config_id, summary) |
833 |
+ cursor.execute(sqlQ, params) |
834 |
+ build_id = cursor.fetchone() |
835 |
+ if v['ebuild_error'] != []: |
836 |
+ sqlQ = 'INSERT INTO repoman_problems (problem, build_id ) VALUES ( %s, %s )' |
837 |
+ for x in v['ebuild_error']: |
838 |
+ params = (x, build_id) |
839 |
+ cursor.execute(sqlQ, params) |
840 |
+ if qa_error != []: |
841 |
+ sqlQ = 'INSERT INTO qa_problems (problem, build_id ) VALUES ( %s, %s )' |
842 |
+ for x in qa_error: |
843 |
+ params = (x, build_id) |
844 |
+ cursor.execute(sqlQ, params) |
845 |
+ ebuild_i = ebuild_i +1 |
846 |
+ self.conn.commit() |
847 |
+ |
848 |
+ sql['SELECT_qa_repoman'] = """ |
849 |
+ SELECT categories, package, ebuild_version, qa, repoman, config, hosts |
850 |
+ FROM buildlog |
851 |
+ WHERE ebuild = %sAND build = '' AND config_id = %s |
852 |
+ """ |
853 |
+ def get_qa_repoman(self, ebuild_id, config_id): |
854 |
+ sql = self.sql['SELECT_qa_repoman'] |
855 |
+ params = (ebuild_id, config_id) |
856 |
+ self.cursor.execute(sql, params) |
857 |
+ entries = self.cursor.fetchall() |
858 |
+ return entries |
859 |
+ |
860 |
+ sql['DELETE_del_qa_repoman'] = """ |
861 |
+ DELETE FROM buildlog |
862 |
+ WHERE ebuild_id AND build = '' AND config_id = %s |
863 |
+ """ |
864 |
+ def del_qa_repoman(self, ebuild_id, config_id): |
865 |
+ sql = self.sql['DELETE_del_qa_repoman'] |
866 |
+ self.cursor.execute(sql, (ebuild_id, config_id)) |
867 |
+ self.db.commit() |
868 |
+ |
869 |
+ sql['UPDATE_update_qa_repoman'] = """ |
870 |
+ UPDATE buildlog |
871 |
+ SET qa = %s, repoman = %s |
872 |
+ WHERE ebuild_id = %s AND build = '' AND config_id = %s |
873 |
+ """ |
874 |
+ def update_qa_repoman(self, ebuild_id, qa_error, repoman_error, config_id): |
875 |
+ sql = self.sql['UPDATE_update_qa_repoman'] |
876 |
+ self.cursor.execute(sql, (qa_error, repoman_error, ebuild_id, config_id)) |
877 |
+ self.db.commit() |
878 |
+ |
879 |
+ def get_arch_db(self): |
880 |
+ cursor = self.conn.cursor() |
881 |
+ sqlQ = 'SELECT keyword FROM keywords WHERE keyword = %s' |
882 |
+ cursor.execute(sqlQ, ('ppc',)) |
883 |
+ return cursor.fetchone() |
884 |
+ |
885 |
+ def add_new_arch_db(self, arch_list): |
886 |
+ cursor = self.conn.cursor() |
887 |
+ sqlQ = 'INSERT INTO keywords (keyword) VALUES ( %s )' |
888 |
+ for arch in arch_list: |
889 |
+ cursor.execute(sqlQ, (arch,)) |
890 |
+ self.conn.commit() |
891 |
+ |
892 |
+ sql['INSERT_add_new_restriction_db'] = """ |
893 |
+ INSERT INTO ebuildHavesRestrictions |
894 |
+ (ebuild_id, restriction) |
895 |
+ VALUES ( %s, %s ) |
896 |
+ """ |
897 |
+ |
898 |
+ def closeconnection(self): |
899 |
+ self.conn.close() |
900 |
+ |
901 |
+class PgSQLPackageDB(SQLPackageDatabase): |
902 |
+ """override for MySQL backend""" |
903 |
+ |
904 |
+ syntax_placeholder = "%s" |
905 |
+ |
906 |
+ def __init__(self, config=None): |
907 |
+ # Do not complain about correct usage of ** magic |
908 |
+ # pylint: disable-msg=W0142 |
909 |
+ SQLPackageDatabase.__init__(self) |
910 |
+ |
911 |
+ if config is None or 'database' not in config: |
912 |
+ print "No configuration available!" |
913 |
+ sys.exit(1) |
914 |
+ |
915 |
+ try: |
916 |
+ import psycopg2 |
917 |
+ except ImportError: |
918 |
+ print "Please install a recent version of dev-python/psycopg for Python" |
919 |
+ sys.exit(1) |
920 |
+ |
921 |
+ self.conn = psycopg2.connect(**config) |
922 |
+ |