]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/dbconn.py
Refactor do_newer_version() in cruft_report.py.
[dak.git] / daklib / dbconn.py
index 97b76e0aff970ba2275e428c0e0ef22783e2166a..d4b14293161a321a3630acae51e8bbf9c6deb741 100755 (executable)
@@ -53,7 +53,7 @@ from tempfile import mkstemp, mkdtemp
 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
@@ -453,6 +453,9 @@ class DBBinary(ORMObject):
         return ['package', 'version', 'maintainer', 'source',  'poolfile', \
             'binarytype']
 
+    def get_component_name(self):
+        return self.poolfile.location.component.component_name
+
 __all__.append('DBBinary')
 
 @session_wrapper
@@ -472,33 +475,37 @@ def get_suites_binary_in(package, session=None):
 __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')
 
 ################################################################################
 
@@ -1568,8 +1575,6 @@ __all__.append('get_dbchange')
 
 ################################################################################
 
-# 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