* fix: workaround bsddb3 idiocies, make read-only mode really work

This commit is contained in:
Eray Özkural
2005-12-11 13:03:53 +00:00
parent 8db012f1d6
commit d7f8abd414
3 changed files with 20 additions and 13 deletions
+10 -8
View File
@@ -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)
+8 -4
View File
@@ -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()
+2 -1
View File
@@ -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