diff -ruN yum-2.4.3.orig/yum/repos.py yum-2.4.3/yum/repos.py --- yum-2.4.3.orig/yum/repos.py 2007-05-09 22:28:50.000000000 +0200 +++ yum-2.4.3/yum/repos.py 2007-05-09 22:41:22.000000000 +0200 @@ -95,26 +95,16 @@ self.callback = None # progress callback used for populateSack() for importing the xml files self.cache = 0 # Check to see if we can import sqlite stuff - try: - import sqlitecache - import sqlitesack - except ImportError: + try: + import storagefactory + self.storage = storagefactory.GetStorage() + except Errors.YumBaseError, ImportError: self.sqlite = False + self.pkgSack = YumPackageSack(YumAvailablePackage) else: + self.pkgSack = self.storage.GetPackageSack() self.sqlite = True - self.sqlitecache = sqlitecache - - self._selectSackType() - - def _selectSackType(self): - if (self.sqlite): - import sqlitecache - import sqlitesack - self.pkgSack = sqlitesack.YumSqlitePackageSack(sqlitesack.YumAvailablePackageSqlite) - else: - self.pkgSack = YumPackageSack(YumAvailablePackage) - def __str__(self): return str(self.repos.keys()) @@ -266,7 +256,7 @@ for repo in myrepos: if not hasattr(repo, 'cacheHandler'): if (self.sqlite): - repo.cacheHandler = self.sqlitecache.RepodataParserSqlite( + repo.cacheHandler = self.storage.GetCacheHandler( storedir=repo.cachedir, repoid=repo.id, callback=callback, diff -ruN yum-2.4.3.orig/yum/storagefactory.py yum-2.4.3/yum/storagefactory.py --- yum-2.4.3.orig/yum/storagefactory.py 1970-01-01 01:00:00.000000000 +0100 +++ yum-2.4.3/yum/storagefactory.py 2007-05-09 22:34:35.000000000 +0200 @@ -0,0 +1,88 @@ +#!/usr/bin/python -tt +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Library General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Copyright 2004 Duke University + +import Errors + +class Storage: + + def __init__(self): + pass + + def Name(self): + pass + + def GetCacheHandler(self, storedir, repoid, callback): + pass + + def GetPackageSack(self): + pass + +class StorageSqlite(Storage): + + def __init__(self): + import sqlitecache + import sqlitesack + + self.sqlitecache = sqlitecache + self.sqlitesack = sqlitesack + + def Name(self): + return "sqlite" + + def GetCacheHandler(self, storedir, repoid, callback): + return self.sqlitecache.RepodataParserSqlite(storedir, repoid, callback) + + def GetPackageSack(self): + return self.sqlitesack.YumSqlitePackageSack(self.sqlitesack.YumAvailablePackageSqlite) + + +class StorageSqliteC(Storage): + def __init__(self): + import sqlitecachec + import sqlitesack + + self.sqlitecache = sqlitecachec + self.sqlitesack = sqlitesack + + def Name(self): + return "sqlite-c" + + def GetCacheHandler(self, storedir, repoid, callback): + return self.sqlitecache.RepodataParserSqlite(storedir, repoid, callback) + + def GetPackageSack(self): + return self.sqlitesack.YumSqlitePackageSack(self.sqlitesack.YumAvailablePackageSqlite) + + +def GetStorage(): + storage = None + + # Try to load storages, prefering the fastest one. + + try: + storage = StorageSqliteC() + return storage + except ImportError: + pass + + try: + storage = StorageSqlite() + return storage + except ImportError: + pass + + raise Errors.YumBaseError, 'Could not find any working storages.' +