* fix: workaround bsddb3 idiocies, make read-only mode really work
This commit is contained in:
+10
-8
@@ -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
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user