From 4da60e84d28d780f1552acabdee1728cfeba7fa0 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Fri, 6 May 2011 11:50:40 +0200 Subject: [PATCH] [entropy.db] EntropyRepositoryBase: add extended=True support to retrieveReverseDependencies() --- libraries/entropy/db/__init__.py | 112 +++++++++++++++++++++++-------- libraries/entropy/db/skel.py | 12 +++- 2 files changed, 95 insertions(+), 29 deletions(-) diff --git a/libraries/entropy/db/__init__.py b/libraries/entropy/db/__init__.py index 99ee38902..cc85145c8 100644 --- a/libraries/entropy/db/__init__.py +++ b/libraries/entropy/db/__init__.py @@ -3547,7 +3547,7 @@ class EntropyRepository(EntropyRepositoryBase): return flags def retrieveReverseDependencies(self, package_id, atoms = False, - key_slot = False, exclude_deptypes = None): + key_slot = False, exclude_deptypes = None, extended = False): """ Reimplemented from EntropyRepositoryBase. """ @@ -3571,40 +3571,98 @@ class EntropyRepository(EntropyRepositoryBase): dep_type,) if atoms: - cur = self._cursor().execute(""" - SELECT baseinfo.atom FROM dependencies, baseinfo - WHERE baseinfo.idpackage = dependencies.idpackage %s AND - dependencies.iddependency IN ( %s )""" % ( - excluded_deptypes_query, dep_ids_str,)) - result = self._cur2frozenset(cur) - elif key_slot: - if self._isBaseinfoExtrainfo2010(): + if extended: cur = self._cursor().execute(""" - SELECT baseinfo.category || "/" || baseinfo.name, baseinfo.slot - FROM baseinfo, dependencies + SELECT baseinfo.atom, dependenciesreference.dependency + FROM dependencies, baseinfo, dependenciesreference + WHERE baseinfo.idpackage = dependencies.idpackage %s AND + dependencies.iddependency = + dependenciesreference.iddependency AND + dependencies.iddependency IN ( %s )""" % ( + excluded_deptypes_query, dep_ids_str,)) + result = tuple(cur) + else: + cur = self._cursor().execute(""" + SELECT baseinfo.atom FROM dependencies, baseinfo WHERE baseinfo.idpackage = dependencies.idpackage %s AND dependencies.iddependency IN ( %s )""" % ( excluded_deptypes_query, dep_ids_str,)) + result = self._cur2frozenset(cur) + elif key_slot: + if self._isBaseinfoExtrainfo2010(): + if extended: + cur = self._cursor().execute(""" + SELECT baseinfo.category || "/" || baseinfo.name, + baseinfo.slot, dependenciesreference.dependency + FROM baseinfo, dependencies, dependenciesreference + WHERE baseinfo.idpackage = dependencies.idpackage %s AND + dependencies.iddependency = + dependenciesreference.iddependency AND + dependencies.iddependency IN ( %s )""" % ( + excluded_deptypes_query, dep_ids_str,)) + else: + cur = self._cursor().execute(""" + SELECT baseinfo.category || "/" || baseinfo.name, + baseinfo.slot + FROM baseinfo, dependencies + WHERE baseinfo.idpackage = dependencies.idpackage %s AND + dependencies.iddependency IN ( %s )""" % ( + excluded_deptypes_query, dep_ids_str,)) else: - cur = self._cursor().execute(""" - SELECT categories.category || "/" || baseinfo.name,baseinfo.slot - FROM baseinfo, categories, dependencies - WHERE baseinfo.idpackage = dependencies.idpackage AND - categories.idcategory = baseinfo.idcategory %s AND - dependencies.iddependency IN ( %s )""" % ( - excluded_deptypes_query, dep_ids_str,)) + if extended: + cur = self._cursor().execute(""" + SELECT categories.category || "/" || baseinfo.name, + baseinfo.slot, dependenciesreference.dependency + FROM baseinfo, categories, + dependencies, dependenciesreference + WHERE baseinfo.idpackage = dependencies.idpackage AND + dependencies.iddependency = + dependenciesreference.iddependency AND + categories.idcategory = baseinfo.idcategory %s AND + dependencies.iddependency IN ( %s )""" % ( + excluded_deptypes_query, dep_ids_str,)) + else: + cur = self._cursor().execute(""" + SELECT categories.category || "/" || baseinfo.name, + baseinfo.slot + FROM baseinfo, categories, dependencies + WHERE baseinfo.idpackage = dependencies.idpackage AND + categories.idcategory = baseinfo.idcategory %s AND + dependencies.iddependency IN ( %s )""" % ( + excluded_deptypes_query, dep_ids_str,)) result = tuple(cur) elif excluded_deptypes_query: - cur = self._cursor().execute(""" - SELECT dependencies.idpackage FROM dependencies - WHERE %s AND dependencies.iddependency IN ( %s )""" % ( - excluded_deptypes_query.lstrip("AND "), dep_ids_str,)) - result = self._cur2frozenset(cur) + if extended: + cur = self._cursor().execute(""" + SELECT dependencies.idpackage, dependenciesreference.dependency + FROM dependencies, dependenciesreference + WHERE %s AND + dependencies.iddependency = + dependenciesreference.iddependency AND + dependencies.iddependency IN ( %s )""" % ( + excluded_deptypes_query.lstrip("AND "), dep_ids_str,)) + result = tuple(cur) + else: + cur = self._cursor().execute(""" + SELECT dependencies.idpackage FROM dependencies + WHERE %s AND dependencies.iddependency IN ( %s )""" % ( + excluded_deptypes_query.lstrip("AND "), dep_ids_str,)) + result = self._cur2frozenset(cur) else: - cur = self._cursor().execute(""" - SELECT dependencies.idpackage FROM dependencies - WHERE dependencies.iddependency IN ( %s )""" % (dep_ids_str,)) - result = self._cur2frozenset(cur) + if extended: + cur = self._cursor().execute(""" + SELECT dependencies.idpackage, dependenciesreference.dependency + FROM dependencies, dependenciesreference + WHERE + dependencies.iddependency = + dependenciesreference.iddependency AND + dependencies.iddependency IN ( %s )""" % (dep_ids_str,)) + result = tuple(cur) + else: + cur = self._cursor().execute(""" + SELECT dependencies.idpackage FROM dependencies + WHERE dependencies.iddependency IN ( %s )""" % (dep_ids_str,)) + result = self._cur2frozenset(cur) # avoid python3.x memleak del cached diff --git a/libraries/entropy/db/skel.py b/libraries/entropy/db/skel.py index 39d404ddf..ebb6f87fa 100644 --- a/libraries/entropy/db/skel.py +++ b/libraries/entropy/db/skel.py @@ -2732,7 +2732,7 @@ class EntropyRepositoryBase(TextInterface, EntropyRepositoryPluginStore): raise NotImplementedError() def retrieveReverseDependencies(self, package_id, atoms = False, - key_slot = False, exclude_deptypes = None): + key_slot = False, exclude_deptypes = None, extended = False): """ Return reverse (or inverse) dependencies for given package. @@ -2747,7 +2747,15 @@ class EntropyRepositoryBase(TextInterface, EntropyRepositoryPluginStore): data. Please see etpConst['dependency_type_ids'] for valid values. Anything != int will raise AttributeError @type exclude_deptypes: iterable of ints - @return: reverse dependency list (tuple) + @keyword extended: if True, the original dependency string will + be returned along with the rest of information. So, if data + returned would be a list of package identifiers (int), + if extended = True this method will return a list of tuples + composed by (package_id, dep_string). Same for atoms = True and + key_slot = True. + @type extended: bool + @return: reverse dependency list (tuple) (or list of lists in case + of extended = True) @rtype: tuple or frozenset @raise AttributeError: if exclude_deptypes contains illegal values """