[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