* smart constructor that falls back to read-only access when there
aren't sufficient permissions
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user