[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