[yum-git] 2 commits - cli.py yum/__init__.py yum/packageSack.py yum/rpmsack.py yum/sqlitesack.py

James Antill james at linux.duke.edu
Wed Jan 23 20:55:42 UTC 2008


 cli.py             |    2 -
 yum/__init__.py    |   18 +++++++--------
 yum/packageSack.py |   38 +++++++++++++++++----------------
 yum/rpmsack.py     |    4 +--
 yum/sqlitesack.py  |   61 +++++++++++++++++++++++++++++++++++++++++------------
 5 files changed, 80 insertions(+), 43 deletions(-)

New commits:
commit e9e1271747e59e88c8999baed2308bb8d26d429a
Author: James Antill <james at and.org>
Date:   Wed Jan 23 15:55:30 2008 -0500

    Add the patterns arg to the other list/info commands

diff --git a/yum/__init__.py b/yum/__init__.py
index cb271b4..8b198da 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1245,15 +1245,15 @@ class YumBase(depsolve.Depsolve):
 
         # installed only
         elif pkgnarrow == 'installed':
-            installed = self.rpmdb.returnPackages()
+            installed = self.rpmdb.returnPackages(patterns=patterns)
         
         # available in a repository
         elif pkgnarrow == 'available':
 
             if self.conf.showdupesfromrepos:
-                avail = self.pkgSack.returnPackages()
+                avail = self.pkgSack.returnPackages(patterns=patterns)
             else:
-                avail = self.pkgSack.returnNewestByNameArch()
+                avail = self.pkgSack.returnNewestByNameArch(patterns=patterns)
             
             self.rpmdb._make_header_dict()
             for pkg in avail:
@@ -1265,7 +1265,7 @@ class YumBase(depsolve.Depsolve):
         elif pkgnarrow == 'extras':
             # we must compare the installed set versus the repo set
             # anything installed but not in a repo is an extra
-            avail = self.pkgSack.simplePkgList()
+            avail = self.pkgSack.simplePkgList(patterns=patterns)
             for po in self.rpmdb:
                 if po.pkgtup not in avail:
                     extras.append(po)
@@ -1288,9 +1288,9 @@ class YumBase(depsolve.Depsolve):
             recentlimit = now-(self.conf.recent*86400)
             ftimehash = {}
             if self.conf.showdupesfromrepos:
-                avail = self.pkgSack.returnPackages()
+                avail = self.pkgSack.returnPackages(patterns=patterns)
             else:
-                avail = self.pkgSack.returnNewestByNameArch()
+                avail = self.pkgSack.returnNewestByNameArch(patterns=patterns)
             
             for po in avail:
                 ftime = int(po.filetime)
diff --git a/yum/packageSack.py b/yum/packageSack.py
index d9a95b7..316485b 100644
--- a/yum/packageSack.py
+++ b/yum/packageSack.py
@@ -143,7 +143,7 @@ class PackageSackBase(object):
            be compared to each other for highest version"""
         raise NotImplementedError()
 
-    def simplePkgList(self):
+    def simplePkgList(self, patterns=None):
         """returns a list of pkg tuples (n, a, e, v, r)"""
         raise NotImplementedError()
 
@@ -346,9 +346,9 @@ class MetaSack(PackageSackBase):
         bestofeach.addList(self._computeAggregateListResult("returnNewestByName", name))
         return bestofeach.returnNewestByName(name)
         
-    def simplePkgList(self):
+    def simplePkgList(self, patterns=None):
         """returns a list of pkg tuples (n, a, e, v, r)"""
-        return self._computeAggregateListResult("simplePkgList")
+        return self._computeAggregateListResult("simplePkgList", patterns)
 
     def printPackages(self):
         for sack in self.sacks.values():
commit 41ee72ec08dd7fce2aa2d2523163e650ab49921a
Author: James Antill <james at and.org>
Date:   Wed Jan 23 15:23:10 2008 -0500

    Move the SQL all the way down for list/info commands too.

diff --git a/cli.py b/cli.py
index 62e433b..ea43e5b 100644
--- a/cli.py
+++ b/cli.py
@@ -637,7 +637,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
             if extcmds[0] in special:
                 pkgnarrow = extcmds.pop(0)
             
-        ypl = self.doPackageLists(pkgnarrow=pkgnarrow)
+        ypl = self.doPackageLists(pkgnarrow=pkgnarrow, patterns=extcmds)
         
         # rework the list output code to know about:
         # obsoletes output
diff --git a/yum/__init__.py b/yum/__init__.py
index 403a3a4..cb271b4 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1198,7 +1198,7 @@ class YumBase(depsolve.Depsolve):
         msg = '%d %s files removed' % (removed, filetype)
         return 0, [msg]
 
-    def doPackageLists(self, pkgnarrow='all'):
+    def doPackageLists(self, pkgnarrow='all', patterns=None):
         """generates lists of packages, un-reduced, based on pkgnarrow option"""
         
         ygh = misc.GenericHolder()
@@ -1219,9 +1219,9 @@ class YumBase(depsolve.Depsolve):
             installed = dinst.values()
                         
             if self.conf.showdupesfromrepos:
-                avail = self.pkgSack.returnPackages()
+                avail = self.pkgSack.returnPackages(patterns=patterns)
             else:
-                avail = self.pkgSack.returnNewestByNameArch()
+                avail = self.pkgSack.returnNewestByNameArch(patterns=patterns)
             
             for pkg in avail:
                 if not dinst.has_key(pkg.pkgtup):
diff --git a/yum/packageSack.py b/yum/packageSack.py
index b5d3aa8..d9a95b7 100644
--- a/yum/packageSack.py
+++ b/yum/packageSack.py
@@ -126,11 +126,11 @@ class PackageSackBase(object):
         """delete a pkgobject"""
         raise NotImplementedError()
 
-    def returnPackages(self):
+    def returnPackages(self, patterns=None):
         """return list of all packages"""
         raise NotImplementedError()
 
-    def returnNewestByNameArch(self, naTup=None):
+    def returnNewestByNameArch(self, naTup=None, patterns=None):
         """return list of newest packages based on name, arch matching
            this means(in name.arch form): foo.i386 and foo.noarch are not
            compared to each other for highest version only foo.i386 and
@@ -318,21 +318,23 @@ class MetaSack(PackageSackBase):
         obj.repo.sack.delPackage(obj)
 
 
-    def returnPackages(self, repoid=None):
+    def returnPackages(self, repoid=None, patterns=None):
         """return list of all packages, takes optional repoid"""
         if not repoid:
-            return self._computeAggregateListResult("returnPackages")
-        return self.sacks[repoid].returnPackages()
+            return self._computeAggregateListResult("returnPackages",
+                                                    None, patterns)
+        return self.sacks[repoid].returnPackages(patterns=patterns)
 
-    def returnNewestByNameArch(self, naTup=None):
+    def returnNewestByNameArch(self, naTup=None, patterns=None):
         """return list of newest packages based on name, arch matching
            this means(in name.arch form): foo.i386 and foo.noarch are not
            compared to each other for highest version only foo.i386 and
            foo.i386 will be compared"""
         bestofeach = ListPackageSack()
-        bestofeach.addList(self._computeAggregateListResult("returnNewestByNameArch", naTup))
+        calr = self._computeAggregateListResult
+        bestofeach.addList(calr("returnNewestByNameArch", naTup, patterns))
         
-        return bestofeach.returnNewestByNameArch(naTup)
+        return bestofeach.returnNewestByNameArch(naTup, patterns)
         
         
     def returnNewestByName(self, name=None):
@@ -680,7 +682,7 @@ class PackageSack(PackageSackBase):
         if self.indexesBuilt: 
             self._delPackageFromIndex(obj)
         
-    def returnPackages(self, repoid=None):
+    def returnPackages(self, repoid=None, patterns=None):
         """return list of all packages, takes optional repoid"""
         returnList = []
         if repoid is None:
@@ -695,7 +697,7 @@ class PackageSack(PackageSackBase):
         
         return returnList
 
-    def returnNewestByNameArch(self, naTup=None):
+    def returnNewestByNameArch(self, naTup=None, patterns=None):
         """return list of newest packages based on name, arch matching
            this means(in name.arch form): foo.i386 and foo.noarch are not 
            compared to each other for highest version only foo.i386 and 
@@ -709,7 +711,7 @@ class PackageSack(PackageSackBase):
             if (not where):
                 raise PackageSackError, 'No Package Matching %s.%s' % naTup
         else:
-            where = self.returnPackages()
+            where = self.returnPackages(patterns=patterns)
 
         for pkg in where:
             if not highdict.has_key((pkg.name, pkg.arch)):
@@ -727,12 +729,12 @@ class PackageSack(PackageSackBase):
         
         return highdict.values()
         
-    def returnNewestByName(self, name=None):
+    def returnNewestByName(self, name=None, patterns=None):
         """return list of newest packages based on name matching
            this means(in name.arch form): foo.i386 and foo.noarch will
            be compared to each other for highest version"""
         highdict = {}
-        for pkg in self.returnPackages():
+        for pkg in self.returnPackages(patterns=patterns):
             if not highdict.has_key(pkg.name):
                 highdict[pkg.name] = []
                 highdict[pkg.name].append(pkg)
@@ -757,11 +759,11 @@ class PackageSack(PackageSackBase):
 
         return returnlist
            
-    def simplePkgList(self):
+    def simplePkgList(self, patterns=None):
         """returns a list of pkg tuples (n, a, e, v, r) optionally from a single repoid"""
         
         # Don't cache due to excludes
-        return [pkg.pkgtup for pkg in self.returnPackages()]
+        return [pkg.pkgtup for pkg in self.returnPackages(patterns=patterns)]
                        
     def printPackages(self):
         for pkg in self.returnPackages():
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 9e049c6..c715764 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -178,7 +178,7 @@ class RPMDBPackageSack(PackageSackBase):
 
     installed = PackageSackBase.contains
 
-    def returnNewestByNameArch(self, naTup=None):
+    def returnNewestByNameArch(self, naTup=None, patterns=None):
 
         #FIXME - should this (or any packagesack) be returning tuples?
         if not naTup:
@@ -206,7 +206,7 @@ class RPMDBPackageSack(PackageSackBase):
 
         return misc.newestInList(allpkg)
 
-    def returnPackages(self, repoid=None):
+    def returnPackages(self, repoid=None, patterns=None):
         return [ self._makePackageObject(hdr, idx)
             for hdr, idx in self._all_packages() ]
 
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 405d2c6..0c53da9 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -758,12 +758,13 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
         return y
 
     @catchSqliteException
-    def returnNewestByNameArch(self, naTup=None):
+    def returnNewestByNameArch(self, naTup=None, patterns=None):
 
         # If naTup is set do it from the database otherwise use our parent's
         # returnNewestByNameArch
         if (not naTup):
-            return yumRepo.YumPackageSack.returnNewestByNameArch(self, naTup)
+            return yumRepo.YumPackageSack.returnNewestByNameArch(self, naTup,
+                                                                 patterns)
 
         # First find all packages that fulfill naTup
         allpkg = []
@@ -833,16 +834,32 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
         return exactmatch, matched, unmatched
 
     @catchSqliteException
-    def _buildPkgObjList(self, repoid=None):
+    def _buildPkgObjList(self, repoid=None, patterns=None):
         """Builds a list of packages, only containing nevra information. No
            excludes are done at this stage. """
+
+        if patterns is None:
+            patterns = []
         
         returnList = []        
         for (repo,cache) in self.primarydb.items():
             if (repoid == None or repoid == repo.id):
                 cur = cache.cursor()
-                
-                executeSQL(cur, "select pkgId, pkgKey, name,epoch,version,release,arch from packages")
+
+                qsql = """select pkgId, pkgKey, name,epoch,version,release,arch 
+                          from packages"""
+
+                pat_sqls = []
+                pat_data = []
+                for pattern in patterns:
+                    for field in ['name', 'sql_nameArch', 'sql_nameVerRelArch',
+                                  'sql_nameVer', 'sql_nameVerRel',
+                                  'sql_envra', 'sql_nevra']:
+                        pat_sqls.append("%s GLOB ?" % field)
+                        pat_data.append(pattern)
+                if pat_sqls:
+                    qsql = _FULL_PARSE_QUERY_BEG + " OR ".join(pat_sqls)
+                executeSQL(cur, qsql, pat_data)
                 for x in cur:
                     if self._key2pkg.get(repo, {}).has_key(x['pkgKey']):
                         po = self._key2pkg[repo][x['pkgKey']]
@@ -850,12 +867,15 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
                         po = self.pc(repo,x)
                         self._key2pkg.setdefault(repo, {})[po.pkgKey] = po
                     returnList.append(po)
-        self.pkgobjlist = returnList
+        if not patterns:
+            self.pkgobjlist = returnList
+        return returnList
                 
-    def returnPackages(self, repoid=None):
+    def returnPackages(self, repoid=None, patterns=None):
         """Returns a list of packages, only containing nevra information. The
-           packages are processed for excludes. """
-        
+           packages are processed for excludes. Note that patterns is just
+           a hint, we are free it ignore it. """
+
         # Skip unused repos completely, Eg. *-source
         skip_all = True
         for repo in self.added:
@@ -865,11 +885,13 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
         if skip_all:
             return []
 
-        returnList = []        
-        if not hasattr(self, 'pkgobjlist'):
-            self._buildPkgObjList(repoid)
+        if hasattr(self, 'pkgobjlist'):
+            pkgobjlist = self.pkgobjlist
+        else:
+            pkgobjlist = self._buildPkgObjList(repoid, patterns)
 
-        for po in self.pkgobjlist:
+        returnList = []
+        for po in pkgobjlist:
             if self._pkgExcluded(po):
                 continue
             returnList.append(po)
@@ -978,3 +1000,16 @@ where name %(op)s '%(q)s'
    or epoch || ':' || name || '-' || version || '-' || release || '.' || arch %(op)s '%(q)s'
    or name || '-' || epoch || ':' || version || '-' || release || '.' || arch %(op)s '%(q)s'
 """
+
+# This is roughly the same as above, and used by _buildPkgObjList()
+_FULL_PARSE_QUERY_BEG = """
+SELECT pkgId,pkgKey,name,epoch,version,release,arch,
+  name || '.' || arch AS sql_nameArch,
+  name || '-' || version || '-' || release || '.' || arch AS sql_nameVerRelArch,
+  name || '-' || version AS sql_nameVer,
+  name || '-' || version || '-' || release AS sql_nameVerRel,
+  epoch || ':' || name || '-' || version || '-' || release || '.' || arch AS sql_envra,
+  name || '-' || epoch || ':' || version || '-' || release || '.' || arch AS sql_nevra
+  FROM packages
+  WHERE
+"""



More information about the Yum-cvs-commits mailing list