]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/dbconn.py
Improve get_component_by_package_suite().
[dak.git] / daklib / dbconn.py
index e1e21d2b2b1f10a386dd42c50460287d7e6c8f4d..0156c8d4ea0fe0f0e2a959d4696132df5a6aa54d 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,24 +475,30 @@ def get_suites_binary_in(package, session=None):
 __all__.append('get_suites_binary_in')
 
 @session_wrapper
-def get_binary_from_name_suite(package, suitename, session=None):
-    ### For dak examine-package
-    ### XXX: Doesn't use object API yet
-
-    sql = """SELECT DISTINCT(b.package), b.version, c.name, su.suite_name
-             FROM binaries b, files fi, location l, component c, bin_associations ba, suite su
-             WHERE b.package='%(package)s'
-               AND b.file = fi.id
-               AND fi.location = l.id
-               AND l.component = c.id
-               AND ba.bin=b.id
-               AND ba.suite = su.id
-               AND su.suite_name %(suitename)s
-          ORDER BY b.version DESC"""
-
-    return session.execute(sql % {'package': package, 'suitename': suitename})
-
-__all__.append('get_binary_from_name_suite')
+def get_component_by_package_suite(package, suite_list, session=None):
+    '''
+    Returns the component name of the newest binary package in suite_list or
+    None if no package is found.
+
+    @type package: str
+    @param package: DBBinary package name to search for
+
+    @type suite_list: list of str
+    @param suite_list: list of suite_name items
+
+    @rtype: str or NoneType
+    @return: name of component or None
+    '''
+
+    binary = session.query(DBBinary).filter_by(package = package). \
+        join(DBBinary.suites).filter(Suite.suite_name.in_(suite_list)). \
+        order_by(desc(DBBinary.version)).first()
+    if binary is None:
+        return None
+    else:
+        return binary.get_component_name()
+
+__all__.append('get_component_by_package_suite')
 
 @session_wrapper
 def get_binary_components(package, suitename, arch, session=None):