[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