from inspect import getargspec
import sqlalchemy
-from sqlalchemy import create_engine, Table, MetaData, Column, Integer
+from sqlalchemy import create_engine, Table, MetaData, Column, Integer, desc
from sqlalchemy.orm import sessionmaker, mapper, relation, object_session, \
backref, MapperExtension, EXT_CONTINUE
from sqlalchemy import types as sqltypes
return ['package', 'version', 'maintainer', 'source', 'poolfile', \
'binarytype']
+ def get_component_name(self):
+ return self.poolfile.location.component.component_name
+
__all__.append('DBBinary')
@session_wrapper
__all__.append('get_suites_binary_in')
@session_wrapper
-def get_component_by_package_suite(package, suite_list, session=None):
- ### For dak examine-package
+def get_component_by_package_suite(package, suite_list, arch_list=[], session=None):
+ '''
+ Returns the component name of the newest binary package in suite_list or
+ None if no package is found. The result can be optionally filtered by a list
+ of architecture names.
- return session.query(Component.component_name). \
- join(Component.location, Location.files, PoolFile.binary). \
- filter_by(package = package). \
- join(DBBinary.suites).filter(Suite.suite_name.in_(suite_list)). \
- limit(1).scalar()
+ @type package: str
+ @param package: DBBinary package name to search for
-__all__.append('get_component_by_package_suite')
+ @type suite_list: list of str
+ @param suite_list: list of suite_name items
-@session_wrapper
-def get_binary_components(package, suitename, arch, session=None):
- # Check for packages that have moved from one component to another
- query = """SELECT c.name FROM binaries b, bin_associations ba, suite s, location l, component c, architecture a, files f
- WHERE b.package=:package AND s.suite_name=:suitename
- AND (a.arch_string = :arch OR a.arch_string = 'all')
- AND ba.bin = b.id AND ba.suite = s.id AND b.architecture = a.id
- AND f.location = l.id
- AND l.component = c.id
- AND b.file = f.id"""
+ @type arch_list: list of str
+ @param arch_list: optional list of arch_string items that defaults to []
- vals = {'package': package, 'suitename': suitename, 'arch': arch}
+ @rtype: str or NoneType
+ @return: name of component or None
+ '''
- return session.execute(query, vals)
+ q = session.query(DBBinary).filter_by(package = package). \
+ join(DBBinary.suites).filter(Suite.suite_name.in_(suite_list))
+ if len(arch_list) > 0:
+ q = q.join(DBBinary.architecture). \
+ filter(Architecture.arch_string.in_(arch_list))
+ binary = q.order_by(desc(DBBinary.version)).first()
+ if binary is None:
+ return None
+ else:
+ return binary.get_component_name()
-__all__.append('get_binary_components')
+__all__.append('get_component_by_package_suite')
################################################################################
################################################################################
-# TODO: Why do we have a separate Location class? Can't it be fully integrated
-# into class Component?
class Location(ORMObject):
def __init__(self, path = None, component = None):
self.path = path