[yum-git] 7 commits - yum/sqlitesack.py
James Antill
james at linux.duke.edu
Wed Feb 13 14:22:25 UTC 2008
yum/sqlitesack.py | 94 ++++++++++++++++++++++++++++++++----------------------
1 file changed, 56 insertions(+), 38 deletions(-)
New commits:
commit 005519ee5153437c53b9c2e78a89d78e62b8602c
Author: James Antill <james at and.org>
Date: Wed Feb 13 09:14:10 2008 -0500
Fix bracket typo
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index e78b470..f541fb5 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -202,7 +202,7 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
if isinstance(self.prco[prcotype], tuple):
sql = "SELECT name, version, release, epoch, flags " \
"FROM %s WHERE pkgKey = ?" % prcotype
- cur = self._sql_MD('primary', sql, (self.pkgKey,)))
+ cur = self._sql_MD('primary', sql, (self.pkgKey,))
self.prco[prcotype] = [ ]
for ob in cur:
prco_set = (ob['name'], ob['flags'],
commit 402765ec693e3e7c7bdd0a7148ffe34f1c9bf58a
Author: James Antill <james at and.org>
Date: Wed Feb 13 00:46:12 2008 -0500
Add check for filelists/primary pkgId corruption before using filelists
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 3f51032..e78b470 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -170,6 +170,8 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
"SELECT date, author, changelog " \
"FROM changelog JOIN packages USING(pkgKey) " \
"WHERE pkgId = ?", (self.pkgId,))
+ # Check count(pkgId) here, the same way we do in searchFiles()?
+ # Failure mode is much less of a problem.
for ob in cur:
result.append( (ob['date'], ob['author'], ob['changelog']) )
self._changelog = result
@@ -405,6 +407,14 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
for (repo,cache) in self.primarydb.items():
self.populate(repo, mdtype='filelists')
+ # Check to make sure the DB data matches, this should always pass but
+ # we've had weird errors. So check it for a bit.
+ for repo in self.filelistsdb:
+ pri_pkgs = self._sql_MD_pkg_num('primary', repo)
+ fil_pkgs = self._sql_MD_pkg_num('filelists', repo)
+ if pri_pkgs != fil_pkgs:
+ raise Errors.RepoError
+
for (rep,cache) in self.filelistsdb.items():
cur = cache.cursor()
commit bb001618adf847ffe322c99c1e8df69bbd0c1bd0
Author: James Antill <james at and.org>
Date: Wed Feb 13 00:38:09 2008 -0500
Cleanup __len__, and fix for multi repos per. sack
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index b4aa8db..3f51032 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -243,7 +243,11 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
executeSQL(cur, sql, *args)
return cur
- @catchSqliteException
+ def _sql_MD_pkg_num(self, MD, repo):
+ """ Give a count of pkgIds in the given repo DB """
+ sql = "SELECT count(pkgId) FROM packages"
+ return self._sql_MD('primary', repo, sql).fetchone()[0]
+
def __len__(self):
# First check if everything is excluded
all_excluded = True
@@ -259,11 +263,12 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
exclude_num += len(self.excludes[repo])
if hasattr(self, 'pkgobjlist'):
return len(self.pkgobjlist) - exclude_num
- for (rep,cache) in self.primarydb.items():
- cur = cache.cursor() # Does all repos, just using a cache
- executeSQL(cur, "select count(pkgId) from packages")
- return cur.fetchone()[0] - exclude_num
- return 0
+
+ pkg_num = 0
+ sql = "SELECT count(pkgId) FROM packages"
+ for repo in self.primarydb:
+ pkg_num += self._sql_MD_pkg_num('primary', repo)
+ return pkg_num - exclude_num
@catchSqliteException
def close(self):
commit 250ba8473369bf0e1cc151d4725a91487d9ed9b2
Author: James Antill <james at and.org>
Date: Wed Feb 13 00:32:29 2008 -0500
Minor cleanup using helper
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 07ec976..b4aa8db 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -329,8 +329,9 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
if not self._key2pkg.has_key(repo):
self._key2pkg[repo] = {}
if not self._key2pkg[repo].has_key(pkgKey):
- cur = self.primarydb[repo].cursor()
- executeSQL(cur, "select pkgKey, pkgId, name, epoch, version, release from packages where pkgKey = ?", (pkgKey,))
+ sql = "SELECT pkgKey, pkgId, name, epoch, version, release " \
+ "FROM packages WHERE pkgKey = ?"
+ cur = self._sql_MD('primary', repo, sql, (pkgKey,))
po = self.pc(repo, cur.fetchone())
self._key2pkg[repo][pkgKey] = po
return self._key2pkg[repo][pkgKey]
commit c115764d78f80eebeecb6368ee2d4e34dccae682
Author: James Antill <james at and.org>
Date: Wed Feb 13 00:23:48 2008 -0500
Add an SQL helper function to the YumSqlitePackageSack
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 1d3979b..07ec976 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -235,6 +235,15 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
self._key2pkg = {}
@catchSqliteException
+ def _sql_MD(self, MD, repo, sql, *args):
+ """ Exec SQL against an MD of the repo, return a cursor. """
+
+ cache = getattr(self, MD + 'db')[repo]
+ cur = cache.cursor()
+ executeSQL(cur, sql, *args)
+ return cur
+
+ @catchSqliteException
def __len__(self):
# First check if everything is excluded
all_excluded = True
commit 33fee2d180c16830c3e8f582da083d550a7ff780
Author: James Antill <james at and.org>
Date: Tue Feb 12 18:18:36 2008 -0500
Use the YumAvailablePackage SQL helper, minor cleanup.
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index fa9a972..1d3979b 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -122,16 +122,13 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
dbname = varname
if db2simplemap.has_key(varname):
dbname = db2simplemap[varname]
- cache = self.sack.primarydb[self.repo]
- c = cache.cursor()
- executeSQL(c, "select %s from packages where pkgId = ?" %(dbname,),
- (self.pkgId,))
- r = c.fetchone()
+ r = self._sql_MD('primary',
+ "SELECT %s FROM packages WHERE pkgId = ?" % dbname,
+ (self.pkgId,)).fetchone()
setattr(self, varname, r[0])
return r[0]
- @catchSqliteException
def _loadFiles(self):
if self._loadedfiles:
return self._files
@@ -140,13 +137,10 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
#FIXME - this should be try, excepting
self.sack.populate(self.repo, mdtype='filelists')
- cache = self.sack.filelistsdb[self.repo]
- cur = cache.cursor()
- executeSQL(cur, "select filelist.dirname as dirname, "
- "filelist.filetypes as filetypes, "
- "filelist.filenames as filenames from filelist,packages "
- "where packages.pkgId = ? and "
- "packages.pkgKey = filelist.pkgKey", (self.pkgId,))
+ cur = self._sql_MD('filelists',
+ "SELECT dirname, filetypes, filenames " \
+ "FROM filelist JOIN packages USING(pkgKey) " \
+ "WHERE packages.pkgId = ?", (self.pkgId,))
for ob in cur:
dirname = ob['dirname']
filetypes = decodefiletypelist(ob['filetypes'])
@@ -163,7 +157,6 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
return self._files
- @catchSqliteException
def _loadChangelog(self):
result = []
if not self._changelog:
@@ -173,13 +166,10 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
except Errors.RepoError:
self._changelog = result
return
- cache = self.sack.otherdb[self.repo]
- cur = cache.cursor()
- executeSQL(cur, "select changelog.date as date, "
- "changelog.author as author, "
- "changelog.changelog as changelog "
- "from changelog,packages where packages.pkgId = ? "
- "and packages.pkgKey = changelog.pkgKey", (self.pkgId,))
+ cur = self._sql_MD('other',
+ "SELECT date, author, changelog " \
+ "FROM changelog JOIN packages USING(pkgKey) " \
+ "WHERE pkgId = ?", (self.pkgId,))
for ob in cur:
result.append( (ob['date'], ob['author'], ob['changelog']) )
self._changelog = result
@@ -201,21 +191,16 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
self._loadFiles()
return RpmBase.returnFileTypes(self)
- @catchSqliteException
def simpleFiles(self, ftype='file'):
- cache = self.sack.primarydb[self.repo]
- cur = cache.cursor()
- executeSQL(cur, "select files.name as fname from files where files.pkgKey = ? and files.type= ?", (self.pkgKey, ftype))
+ sql = "SELECT name as fname FROM files WHERE pkgKey = ? and type = ?"
+ cur = self._sql_MD('primary', sql, (self.pkgKey, ftype))
return map(lambda x: x['fname'], cur)
- @catchSqliteException
def returnPrco(self, prcotype, printable=False):
if isinstance(self.prco[prcotype], tuple):
- cache = self.sack.primarydb[self.repo]
- cur = cache.cursor()
- query = "select name, version, release, epoch, flags from %s "\
- "where pkgKey = '%s'" % (prcotype, self.pkgKey)
- executeSQL(cur, query)
+ sql = "SELECT name, version, release, epoch, flags " \
+ "FROM %s WHERE pkgKey = ?" % prcotype
+ cur = self._sql_MD('primary', sql, (self.pkgKey,)))
self.prco[prcotype] = [ ]
for ob in cur:
prco_set = (ob['name'], ob['flags'],
commit 446d8560e3144c8ab4157ba4e74063f62b05a028
Author: James Antill <james at and.org>
Date: Tue Feb 12 17:54:56 2008 -0500
Add an SQL helper function to the YumAvailablePackage
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 2f12921..fa9a972 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -92,6 +92,14 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
pass
@catchSqliteException
+ def _sql_MD(self, MD, sql, *args):
+ """ Exec SQL against an MD of the repo, return a cursor. """
+
+ cache = getattr(self.sack, MD + 'db')[self.repo]
+ cur = cache.cursor()
+ executeSQL(cur, sql, *args)
+ return cur
+
def __getattr__(self, varname):
db2simplemap = { 'packagesize' : 'size_package',
'archivesize' : 'size_archive',
More information about the Yum-cvs-commits
mailing list