Deal with gpg-pubkey filtering and auto_close centrally,
eliminating the possibility of accidentally leaving zombie rpmdb
iterators behind and also reducing code duplication.
---
yum/rpmsack.py | 70 ++++++++++++--------------------------------------------
1 files changed, 15 insertions(+), 55 deletions(-)
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 24e1d5d..227ed89 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -378,54 +378,36 @@ class RPMDBPackageSack(PackageSackBase):
pass
def searchAll(self, name, query_type='like'):
- ts = self.readOnlyTS()
result = {}
# check provides
tag = self.DEP_TABLE['provides'][0]
- mi = ts.dbMatch()
- mi.pattern(tag, rpm.RPMMIRE_GLOB, name)
- for hdr in mi:
- if hdr['name'] == 'gpg-pubkey':
- continue
- pkg = self._makePackageObject(hdr, mi.instance())
+ mi = self._get_packages(patterns=[(tag, rpm.RPMMIRE_GLOB, name)])
+ for hdr, idx in mi:
+ pkg = self._makePackageObject(hdr, idx)
result.setdefault(pkg.pkgid, pkg)
- del mi
fileresults = self.searchFiles(name)
for pkg in fileresults:
result.setdefault(pkg.pkgid, pkg)
- if self.auto_close:
- self.ts.close()
-
return result.values()
def searchFiles(self, name):
"""search the filelists in the rpms for anything matching name"""
- ts = self.readOnlyTS()
result = {}
name = os.path.normpath(name)
- mi = ts.dbMatch('basenames', name)
# Note that globs can't be done. As of 4.8.1:
# mi.pattern('basenames', rpm.RPMMIRE_GLOB, name)
# ...produces no results.
- for hdr in mi:
- if hdr['name'] == 'gpg-pubkey':
- continue
- pkg = self._makePackageObject(hdr, mi.instance())
+ for hdr, idx in self._get_packages('basenames', name):
+ pkg = self._makePackageObject(hdr, idx)
result.setdefault(pkg.pkgid, pkg)
- del mi
-
- result = result.values()
- if self.auto_close:
- self.ts.close()
-
- return result
+ return result.values()
def searchPrco(self, name, prcotype):
@@ -438,21 +420,15 @@ class RPMDBPackageSack(PackageSackBase):
if misc.re_glob(n):
glob = True
- ts = self.readOnlyTS()
result = {}
tag = self.DEP_TABLE[prcotype][0]
- mi = ts.dbMatch(tag, misc.to_utf8(n))
- for hdr in mi:
- if hdr['name'] == 'gpg-pubkey':
- continue
- po = self._makePackageObject(hdr, mi.instance())
+ for hdr, idx in self._get_packages(tag, misc.to_utf8(n)):
+ po = self._makePackageObject(hdr, idx)
if not glob:
if po.checkPrco(prcotype, (n, f, (e,v,r))):
result[po.pkgid] = po
else:
result[po.pkgid] = po
- del mi
-
# If it's not a provides or filename, we are done
if prcotype == 'provides' and name[0] == '/':
@@ -463,9 +439,6 @@ class RPMDBPackageSack(PackageSackBase):
result = result.values()
self._cache[prcotype][name] = result
- if self.auto_close:
- self.ts.close()
-
return result
def searchProvides(self, name):
@@ -636,18 +609,13 @@ class RPMDBPackageSack(PackageSackBase):
if self._cached_conflicts_data is None:
result = {}
- ts = self.readOnlyTS()
- mi = ts.dbMatch('conflictname')
-
- for hdr in mi:
- if hdr['name'] == 'gpg-pubkey': # Just in case...
- continue
+ for hdr, idx in self._get_packages('conflictname'):
if not hdr[rpm.RPMTAG_CONFLICTNAME]:
# Pre. rpm-4.9.x the above dbMatch() does nothing.
continue
- po = self._makePackageObject(hdr, mi.instance())
+ po = self._makePackageObject(hdr, idx)
result[po.pkgid] = po
if po._has_hdr:
continue # Unlikely, but, meh...
@@ -659,9 +627,6 @@ class RPMDBPackageSack(PackageSackBase):
del po.hdr
self._cached_conflicts_data = result.values()
- if self.auto_close:
- self.ts.close()
-
return self._cached_conflicts_data
def _write_conflicts_new(self, pkgs, rpmdbv):
@@ -1233,18 +1198,16 @@ class RPMDBPackageSack(PackageSackBase):
ts = self.readOnlyTS()
if name is not None:
- mi = ts.dbMatch('name', name)
+ mi = self._get_packages('name', name)
elif arch is not None:
- mi = ts.dbMatch('arch', arch)
+ mi = self._get_packages('arch', arch)
else:
- mi = ts.dbMatch()
+ mi = self._get_packages()
self._completely_loaded = True
done = False
- for hdr in mi:
- if hdr['name'] == 'gpg-pubkey':
- continue
- po = self._makePackageObject(hdr, mi.instance())
+ for hdr, idx in mi:
+ po = self._makePackageObject(hdr, idx)
# We create POs out of all matching names, even if we don't return
# them.
self._pkgnames_loaded.add(po.name)
@@ -1256,9 +1219,6 @@ class RPMDBPackageSack(PackageSackBase):
else:
ret.append(po)
- if self.auto_close:
- self.ts.close()
-
if not done and name is not None:
self._pkgname_fails.add(name)
--
1.7.4
_______________________________________________
Yum-devel mailing list
[email protected]
http://lists.baseurl.org/mailman/listinfo/yum-devel