[yum-cvs] yum/yum rpmsack.py,1.2,1.3
Seth Vidal
skvidal at linux.duke.edu
Wed Jun 28 05:07:36 UTC 2006
Update of /home/groups/yum/cvs/yum/yum
In directory login1.linux.duke.edu:/tmp/cvs-serv32141
Modified Files:
rpmsack.py
Log Message:
make it a bit more packagesack-y and track some data we don't need to
re-opening the rpmdb for.
Index: rpmsack.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/rpmsack.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- rpmsack.py 27 Jun 2006 04:40:23 -0000 1.2
+++ rpmsack.py 28 Jun 2006 05:07:34 -0000 1.3
@@ -1,17 +1,34 @@
#!/usr/bin/python -tt
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Library General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# represent rpmdb as a packagesack
+# starts up
+# buildIndexes() populates the lookup lists
+# pkglist and tuples point to match iterator indexes for quick access
import rpm
+from Errors import PackageSackError
from rpmUtils import miscutils
import misc
from packages import YumInstalledPackage
class RPMDBPackageSack:
- def __init__(self, rootdir='/'):
+ def __init__(self, ts):
self.excludes = {}
- self.ts = rpm.TransactionSet(rootdir)
- self.ts.setVSFlags((rpm._RPMVSF_NOSIGNATURES | rpm._RPMVSF_NODIGESTS))
-
+ self.ts = ts
self.dep_table = { 'requires' : (rpm.RPMTAG_REQUIRENAME,
rpm.RPMTAG_REQUIREVERSION,
rpm.RPMTAG_REQUIREFLAGS),
@@ -27,8 +44,31 @@
}
def buildIndexes(self):
- # We don't need these
- return
+ self.match_on_index = 1
+ self.header_indexes = {}
+
+ try:
+ # we need the find a known index so we can test if
+ # rpm/rpm-python allows us to grab packages by db index.
+ mi = self.ts.dbMatch()
+ hdr = mi.next()
+ known_index = mi.instance()
+ mi = self.ts.dbMatch(0, known_index)
+ hdr = mi.next()
+ except (TypeError, StopIteration), e:
+ raise PackageSackError, "Match Iterators not supported, upgrade rpmlib"
+
+ mi = self.ts.dbMatch()
+ for hdr in mi:
+ pkgtuple = self._hdr2pkgTuple(hdr)
+ if not self.header_indexes.has_key(pkgtuple):
+ self.header_indexes[pkgtuple] = []
+ else:
+ continue
+ self.header_indexes[pkgtuple].append(mi.instance())
+
+ self.pkglist = self.header_indexes.keys()
+ del mi
def _checkIndexes(self, failure='error'):
return
@@ -36,9 +76,6 @@
def delPackage(self, obj):
self.excludes[obj.pkgId] = 1
- def delPackageById(self, pkgId):
- self.excludes[pkgId] = 1
-
def searchAll(self, name, query_type='like'):
result = {}
@@ -102,7 +139,7 @@
}
result.append(pkg)
- # If it's not a porvides or filename, we are done
+ # If it's not a provides or filename, we are done
if prcotype != 'provides' or name[0] != '/':
return result
@@ -123,7 +160,7 @@
return self.searchPrco(name, 'conflicts')
def simplePkgList(self, repoid=None):
- return self.returnPackages()
+ return self.pkglist
def returnNewestByNameArch(self, naTup=None):
if not naTup:
@@ -153,9 +190,18 @@
return misc.newestInList(allpkg)
def returnPackages(self, repoid=None):
- return self.mi2list(self.ts.dbMatch())
+ all = []
+ for pkg in self.header_indexes.keys():
+ some = self.indexes2list(self.header_indexes[pkg])
+ all.extend(some)
+ return all
def searchNevra(self, name=None, epoch=None, ver=None, rel=None, arch=None):
+
+ if name and epoch and ver and rel and arch:
+ indexes = self.header_indexes[(n,a,e,v,r)]
+ return self.indexes2list(indexes)
+
mi = self.ts.dbMatch()
if name:
mi.pattern(rpm.RPMTAG_NAME, rpm.RPMMIRE_STRCMP, name)
@@ -170,12 +216,18 @@
return self.mi2list(mi)
+ def packagesByTuple(self, pkgtup):
+ """return a list of package objects by (n,a,e,v,r) tuple"""
+ (n,a,e,v,r) = pkgtup
+ return self.searchNevra(name=n, arch=a, epoch=e, ver=v, rel=r)
+
def excludeArchs(self, archlist):
- for arch in archlist:
- mi = self.ts.dbMatch()
- mi.pattern(rpm.RPMTAG_ARCH, rpm.RPMMIRE_STRCMP, arch)
- for hdr in mi:
- self.delPackageById(hdr[rpm.RPMTAG_SHA1HEADER])
+ pass
+# for arch in archlist:
+# mi = self.ts.dbMatch()
+# mi.pattern(rpm.RPMTAG_ARCH, rpm.RPMMIRE_STRCMP, arch)
+# for hdr in mi:
+# self.delPackageById(hdr[rpm.RPMTAG_SHA1HEADER])
@@ -208,47 +260,6 @@
return deps
- def hdr2class(self, hdr, nevra_only=False):
- class tmpObject:
- pass
- y = tmpObject()
- y.nevra = (hdr[rpm.RPMTAG_NAME],
- hdr[rpm.RPMTAG_EPOCH],
- hdr[rpm.RPMTAG_VERSION],
- hdr[rpm.RPMTAG_RELEASE],
- hdr[rpm.RPMTAG_ARCH])
- y.sack = self
- y.pkgId = hdr[rpm.RPMTAG_SHA1HEADER]
-
- if nevra_only:
- return y
-
- y.hdrange = {'start' : hdr[rpm.RPMTAG_],
- 'end' : hdr[rpm.RPMTAG_]}
- y.location = {'href' : hdr[rpm.RPMTAG_],
- 'value' : '',
- 'base' : hdr[rpm.RPMTAG_]}
- y.checksum = {'pkgid' : 'YES',
- 'type' : hdr[rpm.RPMTAG_],
- 'value' : hdr[rpm.RPMTAG_]}
- y.time = {'build' : hdr[rpm.RPMTAG_BUILDTIME],
- 'file' : hdr[rpm.RPMTAG_]}
- y.size = {'package' : hdr[rpm.RPMTAG_SIZE],
- 'archive' : hdr[rpm.RPMTAG_ARCHIVESIZE],
- 'installed' : hdr[rpm.RPMTAG_]}
- y.info = {'summary' : hdr[rpm.RPMTAG_SUMMARY],
- 'description' : hdr[rpm.RPMTAG_DESCRIPTION],
- 'packager' : hdr[rpm.RPMTAG_PACKAGER],
- 'group' : hdr[rpm.RPMTAG_GROUP],
- 'buildhost' : hdr[rpm.RPMTAG_BUILDHOST],
- 'sourcerpm' : hdr[rpm.RPMTAG_SOURCERPM],
- 'url' : hdr[rpm.RPMTAG_URL],
- 'vendor' : hdr[rpm.RPMTAG_VENDOR],
- 'license' : hdr[rpm.RPMTAG_LICENSE]}
-
- return y
-
-
def mi2list(self, mi):
returnList = []
for hdr in mi:
@@ -263,22 +274,44 @@
hdr[rpm.RPMTAG_RELEASE],
hdr[rpm.RPMTAG_ARCH])
+ def hdrByindex(self, index):
+ mi = self.ts.dbMatch(0, index)
+ hdr = mi.next()
+ return hdr
+
+ def indexes2list(self, indexlist):
+
+ """return YumInstalledPackage objects in a list for each index in the list"""
+ all = []
+ for idx in indexlist:
+ hdr = self.hdrByindex(idx)
+ all.append(YumInstalledPackage(hdr))
+
+ return all
+
+ def _hdr2pkgTuple(self, hdr):
+ name = hdr['name']
+ arch = hdr['arch']
+ ver = str(hdr['version']) # convert these to strings to be sure
+ rel = str(hdr['release'])
+ epoch = hdr['epoch']
+ if epoch is None:
+ epoch = '0'
+ else:
+ epoch = str(epoch)
+
+ return (name, arch, epoch, ver, rel)
+
+
def main():
- sack = RPMDBPackageSack()
- #pkgs = sack.returnPackages()
- pkgs = sack.searchNevra(name="kernel-default", rel='6')
- #pkgs = sack.returnNewestByNameArch(("kernel-default", "i586"))
- #pkgs = sack.returnNewestByName(("yum"))
-
- ## ret = sack.searchProvides("zmd")
- ## print ret
- ## ret = sack.searchRequires("zmd")
- ## print ret
+ ts = rpm.TransactionSet('/')
+ ts.setVSFlags((rpm._RPMVSF_NOSIGNATURES | rpm._RPMVSF_NODIGESTS))
+
+ sack = RPMDBPackageSack(ts)
+ sack.buildIndexes()
- for p in pkgs:
+ for p in sack.returnPackages():
print p
- #sack.getFiles(p[0])
- #print sack.getChangelog(p[0])
if __name__ == '__main__':
main()
More information about the Yum-cvs-commits
mailing list