* 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): def txn_proc(proc, txn = None):
# can be used to txn protect a method automatically # can be used to txn protect a method automatically
assert dbenv
if not txn: if not txn:
autotxn = dbenv.txn_begin() if dbenv:
try: autotxn = dbenv.txn_begin()
retval = proc(autotxn) try:
except db.DBError, e: retval = proc(autotxn)
autotxn.abort() except db.DBError, e:
raise e autotxn.abort()
autotxn.commit() raise e
autotxn.commit()
else:
retval = proc(None)
return retval return retval
else: else:
return proc(txn) return proc(txn)
+8 -4
View File
@@ -43,7 +43,11 @@ class DBShelf:
""" """
def __init__(self, dbenv = None): def __init__(self, dbenv = None):
self.dbenv = dbenv 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 self.binary = 1
# it is better to explicitly close a shelf # it is better to explicitly close a shelf
@@ -68,7 +72,7 @@ class DBShelf:
raise e raise e
autotxn.commit() autotxn.commit()
else: # execute without transactions else: # execute without transactions
proc(None) retval = proc(None)
return retval return retval
else: else:
return proc(txn) return proc(txn)
@@ -102,13 +106,13 @@ class DBShelf:
def proc(txn): def proc(txn):
data = self.db.get(key) data = self.db.get(key)
return cPickle.loads(data) return cPickle.loads(data)
return self.txn_proc(proc, txn) return self.txn_proc(proc, None)
def __setitem__(self, key, value): def __setitem__(self, key, value):
# hyperdandik transactions # hyperdandik transactions
def proc(txn): def proc(txn):
self.db.put(key,data,txn) self.db.put(key,data,txn)
return self.txn_proc(proc, txn) return self.txn_proc(proc, None)
def __delitem__(self, key): def __delitem__(self, key):
txn = self.dbenv.txn_begin() txn = self.dbenv.txn_begin()
+2 -1
View File
@@ -65,6 +65,7 @@ def init_dbenv():
db.DB_CREATE) # allow db to create files db.DB_CREATE) # allow db to create files
ctx.dbenv.open(pisi.context.config.db_dir(), flags) ctx.dbenv.open(pisi.context.config.db_dir(), flags)
else: else:
ctx.ui.warning(_('Opening PİSİ database in read-only mode. Operations that require write access will fail.'))
ctx.dbenv = None ctx.dbenv = None
#def open(filename, flags='r', mode = 0644, filetype = db.DB_BTREE): #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 flags = db.DB_TRUNCATE | db.DB_CREATE
else: else:
raise Error, _("Flags should be one of 'r', 'w', 'c' or 'n' or use the bsddb.db.DB_* flags") 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 self.flags = flags
if self.flags & db.DB_RDONLY == 0: if self.flags & db.DB_RDONLY == 0:
flags |= db.DB_AUTO_COMMIT # use txn subsystem in write mode
self.lock() self.lock()
filename = os.path.realpath(filename) # we give absolute path due to dbenv filename = os.path.realpath(filename) # we give absolute path due to dbenv
#print 'opening', filename, filetype, flags, mode #print 'opening', filename, filetype, flags, mode