[Yum-devel] [PATCH 2/9] Add simpleVersion() results to the rpmdb-cache
James Antill
james at and.org
Sun Nov 8 20:26:36 UTC 2009
---
yum/rpmsack.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 58 insertions(+), 0 deletions(-)
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 38de623..b0f2094 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -97,6 +97,9 @@ class RPMDBPackageSack(PackageSackBase):
rpm.RPMTAG_OBSOLETEFLAGS)
}
+ # Do we want to cache rpmdb data in a file, for later use?
+ __cache_rpmdb__ = True
+
def __init__(self, root='/', cachedir=None):
self.root = root
self._idx2pkg = {}
@@ -110,6 +113,7 @@ class RPMDBPackageSack(PackageSackBase):
if cachedir is None:
cachedir = misc.getCacheDir()
self._cachedir = cachedir + "/rpmdb-cache/"
+ self._have_cached_rpmdbv_data = None
self.ts = None
self.auto_close = False # this forces a self.ts.close() after
# most operations so it doesn't leave
@@ -155,6 +159,7 @@ class RPMDBPackageSack(PackageSackBase):
'conflicts' : { },
'obsoletes' : { },
}
+ self._have_cached_rpmdbv_data = None
def readOnlyTS(self):
if not self.ts:
@@ -379,6 +384,51 @@ class RPMDBPackageSack(PackageSackBase):
ret.append(self._makePackageObject(hdr, mi.instance()))
return ret
+ def _get_cached_simpleVersion_main(self):
+ """ Return the cached string of the main rpmdbv. """
+ if self._have_cached_rpmdbv_data is not None:
+ return self._have_cached_rpmdbv_data
+
+ if not self.__cache_rpmdb__:
+ return None
+
+ # This test is "obvious" and the only thing to come out of:
+ # http://lists.rpm.org/pipermail/rpm-maint/2007-November/001719.html
+ # ...if anything gets implemented, we should change.
+ rpmdbvfname = self._cachedir + "/version"
+ rpmdbfname = "/var/lib/rpm/Packages"
+
+ if os.path.exists(rpmdbvfname) and os.path.exists(rpmdbfname):
+ # See if rpmdb has "changed" ...
+ nmtime = os.path.getmtime(rpmdbvfname)
+ omtime = os.path.getmtime(rpmdbfname)
+ if omtime <= nmtime:
+ rpmdbv = open(rpmdbvfname).readline()[:-1]
+ self._have_cached_rpmdbv_data = rpmdbv
+ return self._have_cached_rpmdbv_data
+
+ def _put_cached_simpleVersion_main(self, rpmdbv):
+ self._have_cached_rpmdbv_data = str(rpmdbv)
+
+ if not self.__cache_rpmdb__:
+ return
+
+ rpmdbvfname = self._cachedir + "/version"
+ if not os.access(self._cachedir, os.W_OK):
+ if os.path.exists(self._cachedir):
+ return
+
+ try:
+ os.makedirs(self._cachedir)
+ except (IOError, OSError), e:
+ return
+
+ fo = open(rpmdbvfname + ".tmp", "w")
+ fo.write(self._have_cached_rpmdbv_data)
+ fo.write('\n')
+ fo.close()
+ os.rename(rpmdbvfname + ".tmp", rpmdbvfname)
+
def simpleVersion(self, main_only=False, groups={}):
""" Return a simple version for all installed packages. """
def _up_revs(irepos, repoid, rev, pkg, csum):
@@ -389,6 +439,11 @@ class RPMDBPackageSack(PackageSackBase):
rpsv = irevs.setdefault(rev, PackageSackVersion())
rpsv.update(pkg, csum)
+ if main_only and not groups:
+ rpmdbv = self._get_cached_simpleVersion_main()
+ if rpmdbv is not None:
+ return [rpmdbv, {}]
+
main = PackageSackVersion()
irepos = {}
main_grps = {}
@@ -422,6 +477,9 @@ class RPMDBPackageSack(PackageSackBase):
if pkg.name in groups[group]:
_up_revs(irepos_grps[group], repoid, rev, pkg, csum)
+ if self._have_cached_rpmdbv_data is None:
+ self._put_cached_simpleVersion_main(main)
+
if groups:
return [main, irepos, main_grps, irepos_grps]
return [main, irepos]
--
1.6.2.5
More information about the Yum-devel
mailing list