[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