From 62ae679d9d152018d844d4d7945fbe6234b695fa Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Fri, 20 Feb 2009 15:12:40 +0100 Subject: In case the portdirs.db is not existing yet -- well - regenerate everything ;) --- portato/db/sql.py | 1 + 1 file changed, 1 insertion(+) (limited to 'portato/db') diff --git a/portato/db/sql.py b/portato/db/sql.py index bee8a4a..66da0f3 100644 --- a/portato/db/sql.py +++ b/portato/db/sql.py @@ -135,6 +135,7 @@ class SQLDatabase (Database): db[key] = hashes[key] else: debug("portdirs.db not existant") + changed = True for key in hashes.iterkeys(): db[key] = hashes[key] -- cgit v1.2.3-70-g09d2 From 8de1f4514cf29cee9d95de1b6e7c04b14dbe6a74 Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Sat, 21 Feb 2009 00:43:20 +0100 Subject: Fix small error --- portato/db/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'portato/db') diff --git a/portato/db/__init__.py b/portato/db/__init__.py index 2d056ea..f83659c 100644 --- a/portato/db/__init__.py +++ b/portato/db/__init__.py @@ -39,7 +39,7 @@ def Database(type): except ImportError: warning(_("Cannot load SQLDatabase.")) _TYPE = "dict" - return Database() + return Database(type) else: return SQLDatabase(SectionDict(_SESSION, "SQL")) -- cgit v1.2.3-70-g09d2 From dd0919c900761bd76736ff790ca37f144e3de93d Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann 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') 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-70-g09d2