X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=daklib%2Fdbconn.py;h=0156c8d4ea0fe0f0e2a959d4696132df5a6aa54d;hb=463d5ef1536b2af10a0990c5d9ee56e9380a66a4;hp=94ab0d62f8e41750214a5c94e3bd59cd8846e413;hpb=2a3769b50958eeec3dc614183c64a209c4a456de;p=dak.git diff --git a/daklib/dbconn.py b/daklib/dbconn.py index 94ab0d62..0156c8d4 100755 --- a/daklib/dbconn.py +++ b/daklib/dbconn.py @@ -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 @@ -421,17 +421,6 @@ __all__.append('get_archive') ################################################################################ -class BinAssociation(object): - def __init__(self, *args, **kwargs): - pass - - def __repr__(self): - return '' % (self.ba_id, self.binary, self.suite) - -__all__.append('BinAssociation') - -################################################################################ - class BinContents(object): def __init__(self, *args, **kwargs): pass @@ -464,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 @@ -483,44 +475,30 @@ def get_suites_binary_in(package, session=None): __all__.append('get_suites_binary_in') @session_wrapper -def get_binaries_from_source_id(source_id, session=None): - """ - Returns list of DBBinary objects for given C{source_id} - - @type source_id: int - @param source_id: source_id to search for - - @type session: Session - @param session: Optional SQL session object (a temporary one will be - generated if not supplied) - - @rtype: list - @return: list of DBBinary objects for the given name (may be empty) - """ - - return session.query(DBBinary).filter_by(source_id=source_id).all() +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. -__all__.append('get_binaries_from_source_id') + @type package: str + @param package: DBBinary package name to search for -@session_wrapper -def get_binary_from_name_suite(package, suitename, session=None): - ### For dak examine-package - ### XXX: Doesn't use object API yet + @type suite_list: list of str + @param suite_list: list of suite_name items - 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""" + @rtype: str or NoneType + @return: name of component or None + ''' - return session.execute(sql % {'package': package, 'suitename': suitename}) + 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_binary_from_name_suite') +__all__.append('get_component_by_package_suite') @session_wrapper def get_binary_components(package, suitename, arch, session=None): @@ -880,9 +858,9 @@ __all__.append('ChangePendingSource') ################################################################################ -class Component(object): - def __init__(self, *args, **kwargs): - pass +class Component(ORMObject): + def __init__(self, component_name = None): + self.component_name = component_name def __eq__(self, val): if isinstance(val, str): @@ -896,8 +874,12 @@ class Component(object): # This signals to use the normal comparison operator return NotImplemented - def __repr__(self): - return '' % self.component_name + def properties(self): + return ['component_name', 'component_id', 'description', 'location', \ + 'meets_dfsg'] + + def not_null_constraints(self): + return ['component_name'] __all__.append('Component') @@ -1603,9 +1585,12 @@ __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): + def __init__(self, path = None, component = None): self.path = path + self.component = component # the column 'type' should go away, see comment at mapper self.archive_type = 'pool' @@ -2959,13 +2944,6 @@ class DBConn(object): properties = dict(archive_id = self.tbl_archive.c.id, archive_name = self.tbl_archive.c.name)) - mapper(BinAssociation, self.tbl_bin_associations, - properties = dict(ba_id = self.tbl_bin_associations.c.id, - suite_id = self.tbl_bin_associations.c.suite, - suite = relation(Suite), - binary_id = self.tbl_bin_associations.c.bin, - binary = relation(DBBinary))) - mapper(PendingBinContents, self.tbl_pending_bin_contents, properties = dict(contents_id =self.tbl_pending_bin_contents.c.id, filename = self.tbl_pending_bin_contents.c.filename, @@ -3014,9 +2992,7 @@ class DBConn(object): fingerprint = relation(Fingerprint), install_date = self.tbl_binaries.c.install_date, suites = relation(Suite, secondary=self.tbl_bin_associations, - backref=backref('binaries', lazy='dynamic')), - binassociations = relation(BinAssociation, - primaryjoin=(self.tbl_binaries.c.id==self.tbl_bin_associations.c.bin))), + backref=backref('binaries', lazy='dynamic'))), extension = validator) mapper(BinaryACL, self.tbl_binary_acl, @@ -3029,7 +3005,8 @@ class DBConn(object): mapper(Component, self.tbl_component, properties = dict(component_id = self.tbl_component.c.id, - component_name = self.tbl_component.c.name)) + component_name = self.tbl_component.c.name), + extension = validator) mapper(DBConfig, self.tbl_config, properties = dict(config_id = self.tbl_config.c.id)) @@ -3121,7 +3098,8 @@ class DBConn(object): mapper(Location, self.tbl_location, properties = dict(location_id = self.tbl_location.c.id, component_id = self.tbl_location.c.component, - component = relation(Component), + component = relation(Component, \ + backref=backref('location', uselist = False)), archive_id = self.tbl_location.c.archive, archive = relation(Archive), # FIXME: the 'type' column is old cruft and