From d7f8abd414b1ff579f5e59f036cc3dc7fb42e982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20=C3=96zkural?= Date: Sun, 11 Dec 2005 13:03:53 +0000 Subject: [PATCH] * fix: workaround bsddb3 idiocies, make read-only mode really work --- pisi/context.py | 18 ++++++++++-------- pisi/dbshelve.py | 12 ++++++++---- pisi/lockeddbshelve.py | 3 ++- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/pisi/context.py b/pisi/context.py index dc8da1b8..84a80195 100644 --- a/pisi/context.py +++ b/pisi/context.py @@ -46,15 +46,17 @@ import bsddb3.db as db def txn_proc(proc, txn = None): # can be used to txn protect a method automatically - assert dbenv if not txn: - autotxn = dbenv.txn_begin() - try: - retval = proc(autotxn) - except db.DBError, e: - autotxn.abort() - raise e - autotxn.commit() + if dbenv: + autotxn = dbenv.txn_begin() + try: + retval = proc(autotxn) + except db.DBError, e: + autotxn.abort() + raise e + autotxn.commit() + else: + retval = proc(None) return retval else: return proc(txn) diff --git a/pisi/dbshelve.py b/pisi/dbshelve.py index 4de5c7c1..e701173b 100644 --- a/pisi/dbshelve.py +++ b/pisi/dbshelve.py @@ -43,7 +43,11 @@ class DBShelf: """ def __init__(self, dbenv = None): self.dbenv = dbenv - self.db = dbobj.DB(dbenv) + # how lame is bsddb3? + if self.dbenv: + self.db = dbobj.DB(dbenv) + else: + self.db = db.DB(None) self.binary = 1 # it is better to explicitly close a shelf @@ -68,7 +72,7 @@ class DBShelf: raise e autotxn.commit() else: # execute without transactions - proc(None) + retval = proc(None) return retval else: return proc(txn) @@ -102,13 +106,13 @@ class DBShelf: def proc(txn): data = self.db.get(key) return cPickle.loads(data) - return self.txn_proc(proc, txn) + return self.txn_proc(proc, None) def __setitem__(self, key, value): # hyperdandik transactions def proc(txn): self.db.put(key,data,txn) - return self.txn_proc(proc, txn) + return self.txn_proc(proc, None) def __delitem__(self, key): txn = self.dbenv.txn_begin() diff --git a/pisi/lockeddbshelve.py b/pisi/lockeddbshelve.py index 39140ee2..dbe3fb2d 100644 --- a/pisi/lockeddbshelve.py +++ b/pisi/lockeddbshelve.py @@ -65,6 +65,7 @@ def init_dbenv(): db.DB_CREATE) # allow db to create files ctx.dbenv.open(pisi.context.config.db_dir(), flags) else: + ctx.ui.warning(_('Opening PİSİ database in read-only mode. Operations that require write access will fail.')) ctx.dbenv = None #def open(filename, flags='r', mode = 0644, filetype = db.DB_BTREE): @@ -112,9 +113,9 @@ class LockedDBShelf(shelve.DBShelf): flags = db.DB_TRUNCATE | db.DB_CREATE else: raise Error, _("Flags should be one of 'r', 'w', 'c' or 'n' or use the bsddb.db.DB_* flags") - flags |= db.DB_AUTO_COMMIT self.flags = flags if self.flags & db.DB_RDONLY == 0: + flags |= db.DB_AUTO_COMMIT # use txn subsystem in write mode self.lock() filename = os.path.realpath(filename) # we give absolute path due to dbenv #print 'opening', filename, filetype, flags, mode