[yum-cvs] yum/yum __init__.py,1.88,1.89 sqlitesack.py,1.7,1.8

Gijs Hollestelle gijs at login.linux.duke.edu
Wed Mar 2 16:51:22 UTC 2005


Update of /home/groups/yum/cvs/yum/yum
In directory login:/tmp/cvs-serv24920/yum

Modified Files:
	__init__.py sqlitesack.py 
Log Message:
Perform yum whatprovides queries that are not regular expressions by
using database queries instead of iterating over all packages.



Index: __init__.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/__init__.py,v
retrieving revision 1.88
retrieving revision 1.89
diff -u -r1.88 -r1.89
--- __init__.py	2 Mar 2005 07:27:59 -0000	1.88
+++ __init__.py	2 Mar 2005 16:51:20 -0000	1.89
@@ -978,7 +978,16 @@
                 raise Errors.MiscError, \
                  'Search Expression: %s is an invalid Regular Expression.\n' % arg
             
-            for po in self.pkgSack:
+            # If this is not a regular expression, only search in packages
+            # returned by pkgSack.searchAll
+            if restring.find('*') == restring.find('?') \
+              == restring.find('%') == -1 and \
+              hasattr(self.pkgSack,'searchAll'):
+                where = self.pkgSack.searchAll(restring)
+            else:
+                where = self.pkgSack
+
+            for po in where:
                 tmpvalues = []
                 for filetype in po.returnFileTypes():
                     for fn in po.returnFileEntries(ftype=filetype):

Index: sqlitesack.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/sqlitesack.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- sqlitesack.py	2 Mar 2005 14:28:13 -0000	1.7
+++ sqlitesack.py	2 Mar 2005 16:51:20 -0000	1.8
@@ -150,6 +150,46 @@
                 return result    
         return {}
             
+    # Search packages that either provide something containing name
+    # or provide a file containing name 
+    def searchAll(self,name):
+        # This should never be called with a name containing a %
+        assert(name.find('%') == -1)
+        result = []
+        quotename = name.replace("'","''")
+        for (rep,cache) in self.primarydb.items():
+            cur = cache.cursor()
+            cur.execute("select DISTINCT packages.pkgId from provides,packages where provides.name LIKE '%%%s%%' AND provides.pkgKey = packages.pkgKey" % quotename)
+            for ob in cur.fetchall():
+                pkg = self.getPackageDetails(ob['packages.pkgId'])
+                result.append((self.pc(pkg,rep)))
+
+        for (rep,cache) in self.filelistsdb.items():
+            cur = cache.cursor()
+            (dir,filename) = os.path.split(quotename)
+            # This query means:
+            # Either name is a substring of dirname or the directory part
+            # in name is a substring of dirname and the file part is part
+            # of filelist
+            cur.execute("select * from packages,filelist where \
+                (filelist.dirname LIKE '%%%s%%' \
+                OR (filelist.dirname LIKE '%%%s%%' AND\
+                filelist.filenames LIKE '%%%s%%'))\
+                AND (filelist.pkgKey = packages.pkgKey)" % (quotename,dir,filename))
+            for ob in cur.fetchall():
+                # Check if it is an actual match
+                # The query above can give false positives, when
+                # a package provides /foo/aaabar it will also match /foo/bar
+                real = False
+                for filename in ob['filelist.filenames'].split('/'):
+                    if (ob['filelist.dirname']+'/'+filename).find(name) != -1:
+                        real = True
+                if (not real):
+                    continue
+                pkg = self.getPackageDetails(ob['packages.pkgId'])
+                result.append((self.pc(pkg,rep)))
+        return result     
+    
     def returnObsoletes(self):
         obsoletes = {}
         for (rep,cache) in self.primarydb.items():




More information about the Yum-cvs-commits mailing list