[yum-git] yum/rpmsack.py

James Antill james at linux.duke.edu
Mon Mar 24 06:36:36 UTC 2008


 yum/rpmsack.py |   44 +++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 41 insertions(+), 3 deletions(-)

New commits:
commit 6daa211d5e1af47e09a75a9a94a391c17055cc87
Author: James Antill <james at and.org>
Date:   Mon Mar 24 02:17:33 2008 -0400

     Huge memory decrease, by using sqlitesack algo. on installed rpm packages.
    
    . Add RPMInstalledPackage() class
    . Drop the header, after reading "core" data like name/version/etc.
    . Reload header, using po.idx if we need anything weird (Ie. depsolving)
    
     search ustr
     -----------
     Before:  1.6563 Peak[336.28MB] Size[336.28MB] RSS[116.11MB]
     After:   1.6043 Peak[268.40MB] Size[268.40MB] RSS[ 48.41MB]
    
     list ustr
     ---------
     Before:  1.7527 Peak[338.85MB] Size[338.10MB] RSS[117.94MB]
     After:   1.6412 Peak[270.32MB] Size[270.32MB] RSS[ 49.96MB]
    
     provides ustr
     -------------
     Before:  0.8444 Peak[250.99MB] Size[250.99MB] RSS[30.87MB]
     After:   0.8489 Peak[250.99MB] Size[250.99MB] RSS[30.88MB]
    
     list updates
     ------------
     Before:  3.9209 Peak[388.59MB] Size[388.59MB] RSS[168.45MB]
     After:   3.8675 Peak[320.07MB] Size[320.07MB] RSS[ 99.94MB]
    
     update (Fed-8 to rawhide)
     -------------------------
     Before: 48.0007 Peak[526.92MB] Size[517.16MB] RSS[296.41MB]
     After:  48.6470 Peak[527.20MB] Size[518.20MB] RSS[297.44MB]

diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 58e6b4b..a8ad67a 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -24,6 +24,46 @@ import Errors
 from packages import YumInstalledPackage
 from packageSack import PackageSackBase
 
+class RPMInstalledPackage(YumInstalledPackage):
+
+    def __init__(self, rpmhdr, index, rpmdb):
+        hdr = {}
+        for key in ['name', 'arch', 'epoch', 'version', 'release',
+                    'summary', 'description', 'size',
+                    rpm.RPMTAG_SHA1HEADER]:
+            hdr[key] = rpmhdr[key]
+        YumInstalledPackage.__init__(self, hdr)
+
+        # NOTE: We keep summary/description/url because it doesn't add much
+        # and "yum search" uses them all.
+        self.url       = rpmhdr['url']
+        # Also keep sourcerpm for pirut/etc.
+        self.sourcerpm = rpmhdr['sourcerpm']
+
+        self.idx   = index
+        self.rpmdb = rpmdb
+
+        self._has_hdr = False
+        del self.hdr
+
+    def __getattr__(self, varname):
+        # Note that we can't use hasattr(self, 'hdr') or we'll recurse
+        if self._has_hdr:
+            return self.hdr[thing]
+
+        ts = self.rpmdb.readOnlyTS()
+        mi = ts.dbMatch(0, self.idx)
+        hdr = mi.next()
+
+        self._has_hdr = True
+        self.hdr = val = hdr
+
+        if varname != 'hdr':   # This is very unusual, for anything it does
+            val = hdr[varname] # happen for it might be worth adding at __init__
+
+        return val
+
+
 class RPMDBPackageSack(PackageSackBase):
     '''
     Represent rpmdb as a packagesack
@@ -299,9 +339,7 @@ class RPMDBPackageSack(PackageSackBase):
     def _makePackageObject(self, hdr, index):
         if self._idx2pkg.has_key(index):
             return self._idx2pkg[index]
-        po = YumInstalledPackage(hdr)
-        po.idx = index
-        po.rpmdb = self
+        po = RPMInstalledPackage(hdr, index, self)
         self._idx2pkg[index] = po
         self._name2pkg.setdefault(po.name, []).append(po)
         self._tup2pkg[po.pkgtup] = po



More information about the Yum-cvs-commits mailing list