X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fdbconn.py;h=aeffdcb328562582f4bea9c22b2788f436256e61;hb=b2d2d87ae436de26dacd15885c6e71309c869180;hp=1f8b32b8502a83ed0a173db30662715b7429a66b;hpb=737ef71b5505428933dc15f1172eaead7360239c;p=dak.git diff --git a/daklib/dbconn.py b/daklib/dbconn.py index 1f8b32b8..aeffdcb3 100755 --- a/daklib/dbconn.py +++ b/daklib/dbconn.py @@ -44,6 +44,7 @@ from sqlalchemy.orm import sessionmaker, mapper, relation # Don't remove this, we re-export the exceptions to scripts which import us from sqlalchemy.exc import * +from sqlalchemy.orm.exc import NoResultFound # Only import Config until Queue stuff is changed to store its config # in the database @@ -63,7 +64,7 @@ def session_wrapper(fn): session = kwargs.get('session') # No session specified as last argument or in kwargs, create one. - if session is None and len(args) == len(getargspec(fn)[0]) - 1: + if session is None and len(args) <= len(getargspec(fn)[0]) - 1: private_transaction = True kwargs['session'] = DBConn().session() @@ -74,6 +75,9 @@ def session_wrapper(fn): # We created a session; close it. kwargs['session'].close() + wrapped.__doc__ = fn.__doc__ + wrapped.func_name = fn.func_name + return wrapped ################################################################################ @@ -117,12 +121,10 @@ def get_architecture(architecture, session=None): q = session.query(Architecture).filter_by(arch_string=architecture) - if q.count() == 0: - ret = None - else: - ret = q.one() - - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_architecture') @@ -183,12 +185,10 @@ def get_archive(archive, session=None): q = session.query(Archive).filter_by(archive_name=archive) - if q.count() == 0: - ret = None - else: - ret = q.one() - - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_archive') @@ -226,9 +226,7 @@ def get_suites_binary_in(package, session=None): @return: list of Suite objects for the given package """ - ret = session.query(Suite).join(BinAssociation).join(DBBinary).filter_by(package=package).all() - - return ret + return session.query(Suite).join(BinAssociation).join(DBBinary).filter_by(package=package).all() __all__.append('get_suites_binary_in') @@ -250,12 +248,10 @@ def get_binary_from_id(id, session=None): q = session.query(DBBinary).filter_by(binary_id=id) - if q.count() == 0: - ret = None - else: - ret = q.one() - - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_binary_from_id') @@ -313,9 +309,7 @@ def get_binaries_from_source_id(source_id, session=None): @return: list of DBBinary objects for the given name (may be empty) """ - ret = session.query(DBBinary).filter_by(source_id=source_id).all() - - return ret + return session.query(DBBinary).filter_by(source_id=source_id).all() __all__.append('get_binaries_from_source_id') @@ -335,9 +329,7 @@ def get_binary_from_name_suite(package, suitename, session=None): AND su.suite_name=:suitename ORDER BY b.version DESC""" - ret = session.execute(sql, {'package': package, 'suitename': suitename}) - - return ret + return session.execute(sql, {'package': package, 'suitename': suitename}) __all__.append('get_binary_from_name_suite') @@ -354,9 +346,7 @@ def get_binary_components(package, suitename, arch, session=None): vals = {'package': package, 'suitename': suitename, 'arch': arch} - ret = session.execute(query, vals) - - return ret + return session.execute(query, vals) __all__.append('get_binary_components') @@ -400,12 +390,10 @@ def get_component(component, session=None): q = session.query(Component).filter_by(component_name=component) - if q.count() == 0: - ret = None - else: - ret = q.one() - - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_component') @@ -453,7 +441,10 @@ def get_or_set_contents_file_id(filename, session=None): privatetrans = True q = session.query(ContentFilename).filter_by(filename=filename) - if q.count() < 1: + + try: + ret = q.one().cafilename_id + except NoResultFound: cf = ContentFilename() cf.filename = filename session.add(cf) @@ -462,8 +453,6 @@ def get_or_set_contents_file_id(filename, session=None): else: session.flush() ret = cf.cafilename_id - else: - ret = q.one().cafilename_id if privatetrans: session.close() @@ -519,9 +508,7 @@ def get_contents(suite, overridetype, section=None, session=None): contents_q += " ORDER BY fn" - ret = session.execute(contents_q, vals) - - return ret + return session.execute(contents_q, vals) __all__.append('get_contents') @@ -558,7 +545,10 @@ def get_or_set_contents_path_id(filepath, session=None): privatetrans = True q = session.query(ContentFilepath).filter_by(filepath=filepath) - if q.count() < 1: + + try: + ret = q.one().cafilepath_id + except NoResultFound: cf = ContentFilepath() cf.filepath = filepath session.add(cf) @@ -567,8 +557,6 @@ def get_or_set_contents_path_id(filepath, session=None): else: session.flush() ret = cf.cafilepath_id - else: - ret = q.one().cafilepath_id if privatetrans: session.close() @@ -691,9 +679,7 @@ def get_dscfiles(dscfile_id=None, source_id=None, poolfile_id=None, session=None if poolfile_id is not None: q = q.filter_by(poolfile_id=poolfile_id) - ret = q.all() - - return ret + return q.all() __all__.append('get_dscfiles') @@ -771,12 +757,10 @@ def get_poolfile_by_id(file_id, session=None): q = session.query(PoolFile).filter_by(file_id=file_id) - if q.count() > 0: - ret = q.one() - else: - ret = None - - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_poolfile_by_id') @@ -802,9 +786,7 @@ def get_poolfile_by_name(filename, location_id=None, session=None): if location_id is not None: q = q.join(Location).filter_by(location_id=location_id) - ret = q.all() - - return ret + return q.all() __all__.append('get_poolfile_by_name') @@ -823,9 +805,7 @@ def get_poolfile_like_name(filename, session=None): # TODO: There must be a way of properly using bind parameters with %FOO% q = session.query(PoolFile).filter(PoolFile.filename.like('%%%s%%' % filename)) - ret = q.all() - - return ret + return q.all() __all__.append('get_poolfile_like_name') @@ -864,7 +844,10 @@ def get_or_set_fingerprint(fpr, session=None): privatetrans = True q = session.query(Fingerprint).filter_by(fingerprint=fpr) - if q.count() < 1: + + try: + ret = q.one() + except NoResultFound: fingerprint = Fingerprint() fingerprint.fingerprint = fpr session.add(fingerprint) @@ -873,8 +856,6 @@ def get_or_set_fingerprint(fpr, session=None): else: session.flush() ret = fingerprint - else: - ret = q.one() if privatetrans: session.close() @@ -968,12 +949,10 @@ def get_location(location, component=None, archive=None, session=None): if component is not None: q = q.join(Component).filter_by(component_name=component) - if q.count() < 1: - ret = None - else: - ret = q.one() - - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_location') @@ -1018,7 +997,9 @@ def get_or_set_maintainer(name, session=None): privatetrans = True q = session.query(Maintainer).filter_by(name=name) - if q.count() < 1: + try: + ret = q.one() + except NoResultFound: maintainer = Maintainer() maintainer.name = name session.add(maintainer) @@ -1027,8 +1008,6 @@ def get_or_set_maintainer(name, session=None): else: session.flush() ret = maintainer - else: - ret = q.one() if privatetrans: session.close() @@ -1096,9 +1075,7 @@ def has_new_comment(package, version, session=None): q = q.filter_by(package=package) q = q.filter_by(version=version) - ret = q.count() > 0 - - return ret + return bool(q.count() > 0) __all__.append('has_new_comment') @@ -1130,9 +1107,7 @@ def get_new_comments(package=None, version=None, comment_id=None, session=None): if version is not None: q = q.filter_by(version=version) if comment_id is not None: q = q.filter_by(comment_id=comment_id) - ret = q.all() - - return ret + return q.all() __all__.append('get_new_comments') @@ -1190,9 +1165,7 @@ def get_override(package, suite=None, component=None, overridetype=None, session if not isinstance(overridetype, list): overridetype = [overridetype] q = q.join(OverrideType).filter(OverrideType.overridetype.in_(overridetype)) - ret = q.all() - - return ret + return q.all() __all__.append('get_override') @@ -1226,12 +1199,10 @@ def get_override_type(override_type, session=None): q = session.query(OverrideType).filter_by(overridetype=override_type) - if q.count() == 0: - ret = None - else: - ret = q.one() - - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_override_type') @@ -1364,12 +1335,10 @@ def get_priority(priority, session=None): q = session.query(Priority).filter_by(priority=priority) - if q.count() == 0: - ret = None - else: - ret = q.one() - - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_priority') @@ -1460,6 +1429,7 @@ class Queue(object): # TODO: Move into database as above if conf.FindB("Dinstall::SecurityQueueBuild"): # Copy it since the original won't be readable by www-data + import utils utils.copy(src, dest) else: # Create a symlink to it @@ -1473,23 +1443,26 @@ class Queue(object): session.add(qb) - # If the .orig.tar.gz is in the pool, create a symlink to - # it (if one doesn't already exist) - if changes.orig_tar_id: - # Determine the .orig.tar.gz file name - for dsc_file in changes.dsc_files.keys(): - if dsc_file.endswith(".orig.tar.gz"): - filename = dsc_file - - dest = os.path.join(dest_dir, filename) + # If the .orig tarballs are in the pool, create a symlink to + # them (if one doesn't already exist) + for dsc_file in changes.dsc_files.keys(): + # Skip all files except orig tarballs + if not re_is_orig_source.match(dsc_file): + continue + # Skip orig files not identified in the pool + if not (changes.orig_files.has_key(dsc_file) and + changes.orig_files[dsc_file].has_key("id")): + continue + orig_file_id = changes.orig_files[dsc_file]["id"] + dest = os.path.join(dest_dir, dsc_file) # If it doesn't exist, create a symlink if not os.path.exists(dest): q = session.execute("SELECT l.path, f.filename FROM location l, files f WHERE f.id = :id and f.location = l.id", - {'id': changes.orig_tar_id}) + {'id': orig_file_id}) res = q.fetchone() if not res: - return "[INTERNAL ERROR] Couldn't find id %s in files table." % (changes.orig_tar_id) + return "[INTERNAL ERROR] Couldn't find id %s in files table." % (orig_file_id) src = os.path.join(res[0], res[1]) os.symlink(src, dest) @@ -1535,12 +1508,11 @@ def get_queue(queuename, session=None): """ q = session.query(Queue).filter_by(queue_name=queuename) - if q.count() == 0: - ret = None - else: - ret = q.one() - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_queue') @@ -1580,12 +1552,10 @@ def get_queue_build(filename, suite, session=None): q = session.query(QueueBuild).filter_by(filename=filename) q = q.join(Suite).filter_by(suite_name=suite) - if q.count() == 0: - ret = None - else: - ret = q.one() - - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_queue_build') @@ -1629,12 +1599,11 @@ def get_section(section, session=None): """ q = session.query(Section).filter_by(section=section) - if q.count() == 0: - ret = None - else: - ret = q.one() - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_section') @@ -1751,9 +1720,7 @@ def get_suites_source_in(source, session=None): @return: list of Suite objects for the given source """ - ret = session.query(Suite).join(SrcAssociation).join(DBSource).filter_by(source=source).all() - - return ret + return session.query(Suite).join(SrcAssociation).join(DBSource).filter_by(source=source).all() __all__.append('get_suites_source_in') @@ -1788,9 +1755,7 @@ def get_sources_from_name(source, version=None, dm_upload_allowed=None, session= if dm_upload_allowed is not None: q = q.filter_by(dm_upload_allowed=dm_upload_allowed) - ret = q.all() - - return ret + return q.all() __all__.append('get_sources_from_name') @@ -1817,13 +1782,10 @@ def get_source_in_suite(source, suite, session=None): q = q.join('source').filter_by(source=source) q = q.join('suite').filter_by(suite_name=suite) - if q.count() == 0: - ret = None - else: - # ???: Maybe we should just return the SrcAssociation object instead - ret = q.one().source - - return ret + try: + return q.one().source + except NoResultFound: + return None __all__.append('get_source_in_suite') @@ -1840,6 +1802,17 @@ __all__.append('SrcAssociation') ################################################################################ +class SrcFormat(object): + def __init__(self, *args, **kwargs): + pass + + def __repr__(self): + return '' % (self.format_name) + +__all__.append('SrcFormat') + +################################################################################ + class SrcUploader(object): def __init__(self, *args, **kwargs): pass @@ -1925,12 +1898,10 @@ def get_suite_architecture(suite, architecture, session=None): q = q.join(Architecture).filter_by(arch_string=architecture) q = q.join(Suite).filter_by(suite_name=suite) - if q.count() == 0: - ret = None - else: - ret = q.one() - - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_suite_architecture') @@ -1952,12 +1923,10 @@ def get_suite(suite, session=None): q = session.query(Suite).filter_by(suite_name=suite) - if q.count() == 0: - ret = None - else: - ret = q.one() - - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_suite') @@ -2008,14 +1977,48 @@ def get_suite_architectures(suite, skipsrc=False, skipall=False, session=None): q = q.order_by('arch_string') - ret = q.all() - - return ret + return q.all() __all__.append('get_suite_architectures') ################################################################################ +class SuiteSrcFormat(object): + def __init__(self, *args, **kwargs): + pass + + def __repr__(self): + return '' % (self.suite_id, self.src_format_id) + +__all__.append('SuiteSrcFormat') + +@session_wrapper +def get_suite_src_formats(suite, session=None): + """ + Returns list of allowed SrcFormat for C{suite}. + + @type suite: str + @param suite: Suite name to search for + + @type session: Session + @param session: Optional SQL session object (a temporary one will be + generated if not supplied) + + @rtype: list + @return: the list of allowed source formats for I{suite} + """ + + q = session.query(SrcFormat) + q = q.join(SuiteSrcFormat) + q = q.join(Suite).filter_by(suite_name=suite) + q = q.order_by('format_name') + + return q.all() + +__all__.append('get_suite_src_formats') + +################################################################################ + class Uid(object): def __init__(self, *args, **kwargs): pass @@ -2091,7 +2094,9 @@ def get_or_set_uid(uidname, session=None): q = session.query(Uid).filter_by(uid=uidname) - if q.count() < 1: + try: + ret = q.one() + except NoResultFound: uid = Uid() uid.uid = uidname session.add(uid) @@ -2100,8 +2105,6 @@ def get_or_set_uid(uidname, session=None): else: session.flush() ret = uid - else: - ret = q.one() if privatetrans: session.close() @@ -2115,12 +2118,10 @@ def get_uid_from_fingerprint(fpr, session=None): q = session.query(Uid) q = q.join(Fingerprint).filter_by(fingerprint=fpr) - if q.count() != 1: - ret = None - else: - ret = q.one() - - return ret + try: + return q.one() + except NoResultFound: + return None __all__.append('get_uid_from_fingerprint') @@ -2165,9 +2166,11 @@ class DBConn(Singleton): self.tbl_section = Table('section', self.db_meta, autoload=True) self.tbl_source = Table('source', self.db_meta, autoload=True) self.tbl_src_associations = Table('src_associations', self.db_meta, autoload=True) + self.tbl_src_format = Table('src_format', self.db_meta, autoload=True) self.tbl_src_uploaders = Table('src_uploaders', self.db_meta, autoload=True) self.tbl_suite = Table('suite', self.db_meta, autoload=True) self.tbl_suite_architectures = Table('suite_architectures', self.db_meta, autoload=True) + self.tbl_suite_src_formats = Table('suite_src_formats', self.db_meta, autoload=True) self.tbl_uid = Table('uid', self.db_meta, autoload=True) def __setupmappers(self): @@ -2329,6 +2332,10 @@ class DBConn(Singleton): source_id = self.tbl_src_associations.c.source, source = relation(DBSource))) + mapper(SrcFormat, self.tbl_src_format, + properties = dict(src_format_id = self.tbl_src_format.c.id, + format_name = self.tbl_src_format.c.format_name)) + mapper(SrcUploader, self.tbl_src_uploaders, properties = dict(uploader_id = self.tbl_src_uploaders.c.id, source_id = self.tbl_src_uploaders.c.source, @@ -2347,6 +2354,12 @@ class DBConn(Singleton): arch_id = self.tbl_suite_architectures.c.architecture, architecture = relation(Architecture))) + mapper(SuiteSrcFormat, self.tbl_suite_src_formats, + properties = dict(suite_id = self.tbl_suite_src_formats.c.suite, + suite = relation(Suite, backref='suitesrcformats'), + src_format_id = self.tbl_suite_src_formats.c.src_format, + src_format = relation(SrcFormat))) + mapper(Uid, self.tbl_uid, properties = dict(uid_id = self.tbl_uid.c.id, fingerprint = relation(Fingerprint)))