[yum-cvs] yum/yum sqlitecache.py,1.14,1.15 sqlitesack.py,1.50,1.51
Jeremy Katz
katzj at linux.duke.edu
Tue Dec 5 20:55:00 UTC 2006
Update of /home/groups/yum/cvs/yum/yum
In directory login1.linux.duke.edu:/tmp/cvs-serv25284/yum
Modified Files:
sqlitecache.py sqlitesack.py
Log Message:
support newer versions of pysqlite as included in python 2.5 and standalone
the bulk of this is:
a) converting to use qmark instead of pyformat for queries
(http://www.python.org/dev/peps/pep-0249/ for DB-API info)
b) doing on-the-fly conversion to pyformat if we're still using old
pysqlite.
since with this version of yum, I'd expect most people to move to new
python or at least new pysqlite, things are done in the direction that's
faster for the new stuff.
if we decide to require python2.5 or pysqlite 2.x for yum 3.2, then this
can be simplified a bit
Index: sqlitecache.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/sqlitecache.py,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- sqlitecache.py 5 Dec 2006 00:40:51 -0000 1.14
+++ sqlitecache.py 5 Dec 2006 20:54:58 -0000 1.15
@@ -19,7 +19,10 @@
# - Add support for multiple checksums per rpm (not required)
import os
-import sqlite
+try:
+ import sqlite3 as sqlite
+except ImportError:
+ import sqlite
import time
import mdparser
import logging
@@ -31,6 +34,9 @@
# to be re-generated
dbversion = '9'
+from sqlutils import executeSQL
+
+
class RepodataParserSqlite:
def __init__(self, storedir, repoid, callback=None):
self.storedir = storedir
@@ -50,8 +56,10 @@
"""Load cache from filename, check if it is valid and that dbversion
matches the required dbversion"""
db = sqlite.connect(filename)
+ if sqlite.version_info[0] > 1:
+ db.row_factory = sqlite.Row
cur = db.cursor()
- cur.execute("select * from db_info")
+ executeSQL(cur, "select * from db_info")
info = cur.fetchone()
# If info is not in there this is an incompelete cache file
# (this could happen when the user hits ctrl-c or kills yum
@@ -114,18 +122,18 @@
cur = db.cursor()
self.createDbInfo(cur)
# This table is needed to match pkgKeys to pkgIds
- cur.execute("""CREATE TABLE packages(
+ executeSQL(cur, """CREATE TABLE packages(
pkgKey INTEGER PRIMARY KEY,
pkgId TEXT)
""")
- cur.execute("""CREATE TABLE filelist(
+ executeSQL(cur, """CREATE TABLE filelist(
pkgKey INTEGER,
dirname TEXT,
filenames TEXT,
filetypes TEXT)
""")
- cur.execute("CREATE INDEX keyfile ON filelist (pkgKey)")
- cur.execute("CREATE INDEX pkgId ON packages (pkgId)")
+ executeSQL(cur, "CREATE INDEX keyfile ON filelist (pkgKey)")
+ executeSQL(cur, "CREATE INDEX pkgId ON packages (pkgId)")
def createTablesOther(self,db):
"""Create the required tables for other.xml.gz metadata in the sqlite
@@ -133,18 +141,18 @@
cur = db.cursor()
self.createDbInfo(cur)
# This table is needed to match pkgKeys to pkgIds
- cur.execute("""CREATE TABLE packages(
+ executeSQL(cur, """CREATE TABLE packages(
pkgKey INTEGER PRIMARY KEY,
pkgId TEXT)
""")
- cur.execute("""CREATE TABLE changelog(
+ executeSQL(cur, """CREATE TABLE changelog(
pkgKey INTEGER,
author TEXT,
date TEXT,
changelog TEXT)
""")
- cur.execute("CREATE INDEX keychange ON changelog (pkgKey)")
- cur.execute("CREATE INDEX pkgId ON packages (pkgId)")
+ executeSQL(cur, "CREATE INDEX keychange ON changelog (pkgKey)")
+ executeSQL(cur, "CREATE INDEX pkgId ON packages (pkgId)")
def createTablesPrimary(self,db):
"""Create the required tables for primary metadata in the sqlite
@@ -162,7 +170,7 @@
cols.append('%s TEXT' % col)
q += ',\n'.join(cols) + ')'
- cur.execute(q)
+ executeSQL(cur, q)
# Create requires, provides, conflicts and obsoletes tables
# to store prco data
@@ -170,7 +178,7 @@
extraCol = ""
if t == 'requires':
extraCol= ", pre BOOL DEFAULT FALSE"
- cur.execute("""CREATE TABLE %s (
+ executeSQL(cur, """CREATE TABLE %s (
name TEXT,
flags TEXT,
epoch TEXT,
@@ -179,20 +187,20 @@
pkgKey TEXT %s)
""" % (t, extraCol))
# Create the files table to hold all the file information
- cur.execute("""CREATE TABLE files (
+ executeSQL(cur, """CREATE TABLE files (
name TEXT,
type TEXT,
pkgKey TEXT)
""")
# Create indexes for faster searching
- cur.execute("CREATE INDEX packagename ON packages (name)")
- cur.execute("CREATE INDEX providesname ON provides (name)")
- cur.execute("CREATE INDEX packageId ON packages (pkgId)")
+ executeSQL(cur, "CREATE INDEX packagename ON packages (name)")
+ executeSQL(cur, "CREATE INDEX providesname ON provides (name)")
+ executeSQL(cur, "CREATE INDEX packageId ON packages (pkgId)")
db.commit()
def createDbInfo(self,cur):
# Create the db_info table, this contains sqlite cache metadata
- cur.execute("""CREATE TABLE db_info (
+ executeSQL(cur, """CREATE TABLE db_info (
dbversion TEXT,
checksum TEXT)
""")
@@ -235,10 +243,14 @@
# Try to create the databse in filename, or use in memory when
# this fails
try:
- db = sqlite.connect(filename)
+ db = sqlite.connect(filename)
+ if sqlite.version_info[0] > 1:
+ db.row_factory = sqlite.Row
except IOError:
self.verbose_logger.log(logginglevels.INFO_1, "Warning could not create sqlite cache file, using in memory cache instead")
db = sqlite.connect(":memory:")
+ if sqlite.version_info[0] > 1:
+ db.row_factory = sqlite.Row
# The file has been created, now create the tables and indexes
if (cachetype == 'primary'):
@@ -328,10 +340,10 @@
# We start be removing the old db_info, as it is no longer valid
cur = db.cursor()
- cur.execute("DELETE FROM db_info")
+ executeSQL(cur, "DELETE FROM db_info")
# First create a list of all pkgIds that are in the database now
- cur.execute("SELECT pkgId, pkgKey from packages")
+ executeSQL(cur, "SELECT pkgId, pkgKey from packages")
currentpkgs = {}
for pkg in cur.fetchall():
currentpkgs[pkg['pkgId']] = pkg['pkgKey']
@@ -377,11 +389,12 @@
if not all_pkgIds.has_key(pkgId):
delcount += 1
delpkgs.append(str(pkgKey))
- delpkgs = "("+",".join(delpkgs)+")"
- for table in deltables:
- cur.execute("DELETE FROM "+table+ " where pkgKey in %s" % delpkgs)
+ if len(delpkgs) > 0:
+ delpkgs = "("+",".join(delpkgs)+")"
+ for table in deltables:
+ executeSQL(cur, "DELETE FROM "+table+ " where pkgKey in %s" %(delpkgs,))
- cur.execute("INSERT into db_info (dbversion,checksum) VALUES (%s,%s)",
+ executeSQL(cur, "INSERT into db_info (dbversion,checksum) VALUES (?,?)",
(dbversion,checksum))
db.commit()
self.verbose_logger.log(logginglevels.INFO_2, "Added %s new packages, deleted %s old in %.2f seconds",
Index: sqlitesack.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/sqlitesack.py,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -r1.50 -r1.51
--- sqlitesack.py 23 Nov 2006 02:24:50 -0000 1.50
+++ sqlitesack.py 5 Dec 2006 20:54:58 -0000 1.51
@@ -27,6 +27,8 @@
import Errors
import misc
+from sqlutils import executeSQL
+
# Simple subclass of YumAvailablePackage that can load 'simple headers' from
# the database when they are requested
class YumAvailablePackageSqlite(YumAvailablePackage):
@@ -61,9 +63,8 @@
dbname = db2simplemap[varname]
cache = self.sack.primarydb[self.repo]
c = cache.cursor()
- query = "select %s from packages where pkgId = '%s'" % (dbname,
- self.pkgId)
- c.execute(query)
+ executeSQL(c, "select %s from packages where pkgId = ?" %(dbname,),
+ (self.pkgID,))
r = c.fetchone()
setattr(self, varname, r[0])
@@ -73,8 +74,7 @@
if not self._checksums:
cache = self.sack.primarydb[self.repo]
c = cache.cursor()
- query = "select checksum_type, checksum_value from packages where pkgId = '%s'" % self.pkgId
- c.execute(query)
+ executeSQL(c, "select checksum_type, checksum_value from packages where pkgId = ?", (self.pkgId,))
for ob in c.fetchall():
self._checksums.append((ob['checksum_type'], ob['checksum_value'], True))
@@ -93,11 +93,11 @@
self.sack.populate(self.repo, with='filelists')
cache = self.sack.filelistsdb[self.repo]
cur = cache.cursor()
- cur.execute("select filelist.dirname as dirname, "
+ executeSQL(cur, "select filelist.dirname as dirname, "
"filelist.filetypes as filetypes, "
"filelist.filenames as filenames from packages,filelist "
- "where packages.pkgId = %s and "
- "packages.pkgKey = filelist.pkgKey", self.pkgId)
+ "where packages.pkgId = ? and "
+ "packages.pkgKey = filelist.pkgKey", (self.pkgId,))
for ob in cur.fetchall():
dirname = ob['dirname']
filetypes = decodefiletypelist(ob['filetypes'])
@@ -123,11 +123,11 @@
return
cache = self.sack.otherdb[self.repo]
cur = cache.cursor()
- cur.execute("select changelog.date as date, "
+ executeSQL(cur, "select changelog.date as date, "
"changelog.author as author, "
"changelog.changelog as changelog "
- "from packages,changelog where packages.pkgId = %s "
- "and packages.pkgKey = changelog.pkgKey", self.pkgId)
+ "from packages,changelog where packages.pkgId = ? "
+ "and packages.pkgKey = changelog.pkgKey", (self.pkgId,))
for ob in cur.fetchall():
result.append( (ob['date'], ob['author'], ob['changelog']) )
self._changelog = result
@@ -156,7 +156,7 @@
"packages.pkgKey = %s.pkgKey" % (prcotype, prcotype,
prcotype, prcotype, prcotype, prcotype, self.pkgId,
prcotype)
- cur.execute(query)
+ executeSQL(cur, query)
for ob in cur.fetchall():
self.prco[prcotype].append((ob['name'], ob['flags'],
(ob['epoch'], ob['version'],
@@ -220,10 +220,9 @@
# 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 as pkgId from provides,packages where provides.name LIKE '%%%s%%' AND provides.pkgKey = packages.pkgKey" % quotename)
+ executeSQL(cur, "select DISTINCT packages.pkgId as pkgId from provides,packages where provides.name LIKE ? AND provides.pkgKey = packages.pkgKey", (quotename,))
for ob in cur.fetchall():
if (self.excludes[rep].has_key(ob['pkgId'])):
continue
@@ -237,15 +236,15 @@
# 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 packages.pkgId as pkgId,\
+ executeSQL(cur, "select packages.pkgId as pkgId,\
filelist.dirname as dirname,\
filelist.filetypes as filetypes,\
filelist.filenames as filenames \
from packages,filelist where \
- (filelist.dirname LIKE '%%%s%%' \
- OR (filelist.dirname LIKE '%%%s%%' AND\
- filelist.filenames LIKE '%%%s%%'))\
- AND (filelist.pkgKey = packages.pkgKey)" % (quotename,dirname,filename))
+ (filelist.dirname LIKE '?' \
+ OR (filelist.dirname LIKE '?' AND\
+ filelist.filenames LIKE '?'))\
+ AND (filelist.pkgKey = packages.pkgKey)", (quotename,dirname,filename))
# cull the results for false positives
for ob in cur.fetchall():
@@ -268,7 +267,7 @@
obsoletes = {}
for (rep,cache) in self.primarydb.items():
cur = cache.cursor()
- cur.execute("select packages.name as name,\
+ executeSQL(cur, "select packages.name as name,\
packages.pkgId as pkgId,\
packages.arch as arch, packages.epoch as epoch,\
packages.release as release, packages.version as version,\
@@ -295,7 +294,7 @@
def getPackageDetails(self,pkgId):
for (rep,cache) in self.primarydb.items():
cur = cache.cursor()
- cur.execute("select * from packages where pkgId = %s",pkgId)
+ executeSQL(cur, "select * from packages where pkgId = ?", (pkgId,))
for ob in cur.fetchall():
pkg = self.db2class(ob)
return pkg
@@ -305,10 +304,10 @@
results = []
for (rep,cache) in self.primarydb.items():
cur = cache.cursor()
- cur.execute("select * from %s where name = %s" , (prcotype, name))
+ executeSQL(cur, "select * from %s where name=?" %(prcotype,), (name,))
prcos = cur.fetchall()
for res in prcos:
- cur.execute("select * from packages where pkgKey = %s" , (res['pkgKey']))
+ executeSQL(cur, "select * from packages where pkgKey = ?" , (res['pkgKey'],))
for x in cur.fetchall():
pkg = self.db2class(x)
if (self.excludes[rep].has_key(pkg.pkgId)):
@@ -318,11 +317,11 @@
# that it matches
pkg.prco = {prcotype:
[
- { 'name': res.name,
- 'flags': res.flags,
- 'rel': res.release,
- 'ver': res.version,
- 'epoch': res.epoch
+ { 'name': res['name'],
+ 'flags': res['flags'],
+ 'rel': res['release'],
+ 'ver': res['version'],
+ 'epoch': res['epoch']
}
]
}
@@ -336,10 +335,10 @@
# If it is a filename, search the primary.xml file info
for (rep,cache) in self.primarydb.items():
cur = cache.cursor()
- cur.execute("select * from files where name = %s" , (name))
+ executeSQL(cur, "select * from files where name = ?" , (name,))
files = cur.fetchall()
for res in files:
- cur.execute("select * from packages where pkgKey = %s" , (res['pkgKey']))
+ executeSQL(cur, "select * from packages where pkgKey = ?" , (res['pkgKey'],))
for x in cur.fetchall():
pkg = self.db2class(x)
if (self.excludes[rep].has_key(pkg.pkgId)):
@@ -363,21 +362,21 @@
cur = cache.cursor()
(dirname,filename) = os.path.split(name)
if name.find('%') == -1: # no %'s in the thing safe to LIKE
- cur.execute("select packages.pkgId as pkgId,\
+ executeSQL(cur, "select packages.pkgId as pkgId,\
filelist.dirname as dirname,\
filelist.filetypes as filetypes,\
filelist.filenames as filenames \
from packages,filelist where \
- (filelist.dirname LIKE '%%%s%%' \
- OR (filelist.dirname LIKE '%%%s%%' AND\
- filelist.filenames LIKE '%%%s%%'))\
- AND (filelist.pkgKey = packages.pkgKey)" % (name,dirname,filename))
+ (filelist.dirname LIKE '?' \
+ OR (filelist.dirname LIKE '?' AND\
+ filelist.filenames LIKE '?'))\
+ AND (filelist.pkgKey = packages.pkgKey)", (name,dirname,filename))
else:
- cur.execute("select packages.pkgId as pkgId,\
+ executeSQL(cur, "select packages.pkgId as pkgId,\
filelist.dirname as dirname,\
filelist.filetypes as filetypes,\
filelist.filenames as filenames \
- from filelist,packages where dirname = %s AND filelist.pkgKey = packages.pkgKey" , (dirname))
+ from filelist,packages where dirname = ? AND filelist.pkgKey = packages.pkgKey" , (dirname,))
files = cur.fetchall()
@@ -421,21 +420,21 @@
class tmpObject:
pass
y = tmpObject()
- y.nevra = (db.name,db.epoch,db.version,db.release,db.arch)
+ y.nevra = (db['name'],db['epoch'],db['version'],db['release'],db['arch'])
y.sack = self
- y.pkgId = db.pkgId
+ y.pkgId = db['pkgId']
if (nevra_only):
return y
- y.hdrange = {'start': db.rpm_header_start,'end': db.rpm_header_end}
- y.location = {'href': db.location_href,'value': '', 'base': db.location_base}
- y.checksum = {'pkgid': 'YES','type': db.checksum_type,
- 'value': db.checksum_value }
- y.time = {'build': db.time_build, 'file': db.time_file }
- y.size = {'package': db.size_package, 'archive': db.size_archive, 'installed': db.size_installed }
- y.info = {'summary': db.summary, 'description': db['description'],
- 'packager': db.rpm_packager, 'group': db.rpm_group,
- 'buildhost': db.rpm_buildhost, 'sourcerpm': db.rpm_sourcerpm,
- 'url': db.url, 'vendor': db.rpm_vendor, 'license': db.rpm_license }
+ y.hdrange = {'start': db['rpm_header_start'],'end': db['rpm_header_end']}
+ y.location = {'href': db['location_href'],'value': '', 'base': db['location_base']}
+ y.checksum = {'pkgid': 'YES','type': db['checksum_type'],
+ 'value': db['checksum_value'] }
+ y.time = {'build': db['time_build'], 'file': db['time_file'] }
+ y.size = {'package': db['size_package'], 'archive': db['size_archive'], 'installed': db['size_installed'] }
+ y.info = {'summary': db['summary'], 'description': db['description'],
+ 'packager': db['rpm_packager'], 'group': db['rpm_group'],
+ 'buildhost': db['rpm_buildhost'], 'sourcerpm': db['rpm_sourcerpm'],
+ 'url': db['url'], 'vendor': db['rpm_vendor'], 'license': db['rpm_license'] }
return y
def simplePkgList(self):
@@ -448,11 +447,11 @@
simplelist = []
for (rep,cache) in self.primarydb.items():
cur = cache.cursor()
- cur.execute("select pkgId,name,epoch,version,release,arch from packages")
+ executeSQL(cur, "select pkgId,name,epoch,version,release,arch from packages")
for pkg in cur.fetchall():
- if (self.excludes[rep].has_key(pkg.pkgId)):
+ if (self.excludes[rep].has_key(pkg['pkgId'])):
continue
- simplelist.append((pkg.name, pkg.arch, pkg.epoch, pkg.version, pkg.release))
+ simplelist.append((pkg['name'], pkg['arch'], pkg['epoch'], pkg['version'], pkg['release']))
self.pkglist = simplelist
return simplelist
@@ -468,9 +467,9 @@
allpkg = []
for (rep,cache) in self.primarydb.items():
cur = cache.cursor()
- cur.execute("select pkgId,name,epoch,version,release,arch from packages where name=%s and arch=%s",naTup)
+ executeSQL(cur, "select pkgId,name,epoch,version,release,arch from packages where name=? and arch=?",naTup)
for x in cur.fetchall():
- if (self.excludes[rep].has_key(x.pkgId)):
+ if (self.excludes[rep].has_key(x['pkgId'])):
continue
allpkg.append(self.pc(rep,self.db2class(x,True)))
@@ -489,9 +488,9 @@
allpkg = []
for (rep,cache) in self.primarydb.items():
cur = cache.cursor()
- cur.execute("select pkgId,name,epoch,version,release,arch from packages where name=%s", name)
+ executeSQL(cur, "select pkgId,name,epoch,version,release,arch from packages where name=?", (name,))
for x in cur.fetchall():
- if (self.excludes[rep].has_key(x.pkgId)):
+ if (self.excludes[rep].has_key(x['pkgId'])):
continue
allpkg.append(self.pc(rep,self.db2class(x,True)))
@@ -506,9 +505,9 @@
for (repo,cache) in self.primarydb.items():
if (repoid == None or repoid == repo.id):
cur = cache.cursor()
- cur.execute("select pkgId,name,epoch,version,release,arch from packages")
+ executeSQL(cur, "select pkgId,name,epoch,version,release,arch from packages")
for x in cur.fetchall():
- if (self.excludes[repo].has_key(x.pkgId)):
+ if (self.excludes[repo].has_key(x['pkgId'])):
continue
returnList.append(self.pc(repo,self.db2class(x,True)))
return returnList
@@ -538,10 +537,10 @@
# Search all repositories
for (rep,cache) in self.primarydb.items():
cur = cache.cursor()
- #cur.execute("select * from packages WHERE name = %s AND epoch = %s AND version = %s AND release = %s AND arch = %s" , (name,epoch,ver,rel,arch))
- cur.execute(q)
+ #executeSQL(cur, "select * from packages WHERE name = %s AND epoch = %s AND version = %s AND release = %s AND arch = %s" , (name,epoch,ver,rel,arch))
+ executeSQL(cur, q)
for x in cur.fetchall():
- if (self.excludes[rep].has_key(x.pkgId)):
+ if (self.excludes[rep].has_key(x['pkgId'])):
continue
returnList.append(self.pc(rep,self.db2class(x)))
return returnList
@@ -556,7 +555,7 @@
querystring = tmpstring[:last]
for (rep, cache) in self.primarydb.items():
cur = cache.cursor()
- cur.execute(querystring)
+ executeSQL(cur, querystring)
for x in cur.fetchall():
obj = self.pc(rep,self.db2class(x))
self.delPackage(obj)
More information about the Yum-cvs-commits
mailing list