* smart constructor that falls back to read-only access when there

aren't sufficient permissions
This commit is contained in:
Eray Özkural
2005-10-24 19:06:33 +00:00
parent 5fd8c62d56
commit df7be7b557
+8 -2
View File
@@ -30,17 +30,23 @@ class Error(pisi.Error):
class LockedDBShelf(shelve.DBShelf): class LockedDBShelf(shelve.DBShelf):
"""A simple wrapper to implement locking for bsddb's dbshelf""" """A simple wrapper to implement locking for bsddb's dbshelf"""
def __init__(self, dbname, flags=db.DB_CREATE, mode=0660, def __init__(self, dbname, mode=0660,
filetype=db.DB_HASH, dbenv=None): filetype=db.DB_HASH, dbenv=None):
shelve.DBShelf.__init__(self, dbenv) shelve.DBShelf.__init__(self, dbenv)
filename = os.path.join( pisi.context.config.db_dir(), dbname + '.bdb') filename = os.path.join( pisi.context.config.db_dir(), dbname + '.bdb')
if os.access(os.path.dirname(filename), os.W_OK):
flags = 'w'
elif os.access(filename, os.R_OK):
flags = 'r'
else:
raise Error(_('Cannot attain read or write access to database %s') % dbname)
self.open(filename, dbname, filetype, flags, mode) self.open(filename, dbname, filetype, flags, mode)
def __del__(self): def __del__(self):
# superclass does something funky, we don't need that # superclass does something funky, we don't need that
pass pass
def open(self, filename, dbname, filetype, flags, mode): def open(self, filename, dbname, filetype, flags=db.DB_CREATE, mode=0660):
self.filename = filename self.filename = filename
self.closed = False self.closed = False
#print 'open', filename #print 'open', filename