Issue #28847: dbm.dumb now supports reading read-only files and no longer

writes the index file when it is not changed.
This commit is contained in:
Serhiy Storchaka 2016-12-07 10:56:39 +02:00
parent e503126074
commit 028ace1ccb
4 changed files with 28 additions and 5 deletions

View file

@ -47,6 +47,7 @@ class _Database(collections.MutableMapping):
def __init__(self, filebasename, mode, flag='c'):
self._mode = mode
self._readonly = (flag == 'r')
# The directory file is a text file. Each line looks like
# "%r, (%d, %d)\n" % (key, pos, siz)
@ -91,8 +92,9 @@ class _Database(collections.MutableMapping):
try:
f = _io.open(self._dirfile, 'r', encoding="Latin-1")
except OSError:
pass
self._modified = not self._readonly
else:
self._modified = False
with f:
for line in f:
line = line.rstrip()
@ -107,7 +109,7 @@ class _Database(collections.MutableMapping):
# CAUTION: It's vital that _commit() succeed, and _commit() can
# be called from __del__(). Therefore we must never reference a
# global in this routine.
if self._index is None:
if self._index is None or not self._modified:
return # nothing to do
try:
@ -187,6 +189,7 @@ class _Database(collections.MutableMapping):
elif not isinstance(val, (bytes, bytearray)):
raise TypeError("values must be bytes or strings")
self._verify_open()
self._modified = True
if key not in self._index:
self._addkey(key, self._addval(val))
else:
@ -215,6 +218,7 @@ class _Database(collections.MutableMapping):
if isinstance(key, str):
key = key.encode('utf-8')
self._verify_open()
self._modified = True
# The blocks used by the associated value are lost.
del self._index[key]
# XXX It's unclear why we do a _commit() here (the code always