Gentoo Archives: gentoo-commits

From: Magnus Granberg <zorry@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] dev/zorry:master commit in: buildhost/portage_hook/
Date: Fri, 01 Apr 2011 16:43:15
Message-Id: 6491db2bcdf9350a3cb9f974e590c8e08556a057.zorry@gentoo
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 +