From dd0919c900761bd76736ff790ca37f144e3de93d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Sat, 21 Feb 2009 01:18:24 +0100 Subject: Use pickle instead of DBM, as this would require additional python modules --- portato/db/sql.py | 65 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 25 deletions(-) (limited to 'portato/db/sql.py') diff --git a/portato/db/sql.py b/portato/db/sql.py index 66da0f3..cb252c1 100644 --- a/portato/db/sql.py +++ b/portato/db/sql.py @@ -17,7 +17,11 @@ try: except ImportError: from pysqlite2 import dbapi2 as sql -import anydbm +try: + import cPickle as pickle +except ImportError: + import pickle + import hashlib import os @@ -113,34 +117,45 @@ class SQLDatabase (Database): dbpath = os.path.join(SESSION_DIR, "portdirs.db") db_existed = os.path.exists(dbpath) - db = anydbm.open(dbpath, "c") - try: - if db_existed: - debug("portdirs.db already existant") - for key in set(db.keys())- set(hashes.keys()): - debug("Overlay '%s' has been removed", key) - del db[key] - changed = True - - for key in hashes.iterkeys(): - if key not in db.keys(): - debug("Overlay '%s' has been added.", key) - changed = True + if db_existed and "pickle" not in self.session: + debug("Removing old portdirs.db, as this looks like old DBM format. If it is not - well - no real harm ;)") + os.remove(dbpath) + db_existed = False - elif db[key] != hashes[key]: - debug("Overlay '%s' has been changed.", key) - changed = True - - db[key] = hashes[key] - else: - debug("portdirs.db not existant") + self.session["pickle"] = True # no need for a certain value + + if db_existed: + debug("portdirs.db already existant") + with open(dbpath, "rb") as dbfile: + db = pickle.load(dbfile) + + # the following could be simplified - losing the debug possibilities + # so we keep it as is :) + # there shouldn't be so much overlays, that this would result + # in performance loss + + for key in set(db.keys()) - set(hashes.keys()): + debug("Overlay '%s' has been removed", key) changed = True - for key in hashes.iterkeys(): - db[key] = hashes[key] + + for key in hashes.iterkeys(): + + if key not in db: + debug("Overlay '%s' has been added.", key) + changed = True - finally: - db.close() + elif db[key] != hashes[key]: + debug("Overlay '%s' has been changed.", key) + changed = True + + else: + debug("portdirs.db not existant") + changed = True + + if changed: + with open(dbpath, "wb") as dbfile: + db = pickle.dump(hashes, dbfile, protocol = -1) return changed -- cgit v1.2.3