mirror of
https://github.com/python/cpython.git
synced 2025-10-10 00:43:41 +00:00
Issue #21708: Deprecated dbm.dumb behavior that differs from common dbm
behavior: creating a database in 'r' and 'w' modes and modifying a database in 'r' mode.
This commit is contained in:
parent
9862b5194d
commit
0122ae9ac8
5 changed files with 57 additions and 1 deletions
|
@ -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)
|
||||
|
@ -80,6 +81,11 @@ class _Database(collections.MutableMapping):
|
|||
try:
|
||||
f = _io.open(self._datfile, 'r', encoding="Latin-1")
|
||||
except OSError:
|
||||
if flag not in ('c', 'n'):
|
||||
import warnings
|
||||
warnings.warn("The database file is missing, the "
|
||||
"semantics of the 'c' flag will be used.",
|
||||
DeprecationWarning, stacklevel=4)
|
||||
with _io.open(self._datfile, 'w', encoding="Latin-1") as f:
|
||||
self._chmod(self._datfile)
|
||||
else:
|
||||
|
@ -178,6 +184,10 @@ class _Database(collections.MutableMapping):
|
|||
f.write("%r, %r\n" % (key.decode("Latin-1"), pos_and_siz_pair))
|
||||
|
||||
def __setitem__(self, key, val):
|
||||
if self._readonly:
|
||||
import warnings
|
||||
warnings.warn('The database is opened for reading only',
|
||||
DeprecationWarning, stacklevel=2)
|
||||
if isinstance(key, str):
|
||||
key = key.encode('utf-8')
|
||||
elif not isinstance(key, (bytes, bytearray)):
|
||||
|
@ -212,6 +222,10 @@ class _Database(collections.MutableMapping):
|
|||
# (so that _commit() never gets called).
|
||||
|
||||
def __delitem__(self, key):
|
||||
if self._readonly:
|
||||
import warnings
|
||||
warnings.warn('The database is opened for reading only',
|
||||
DeprecationWarning, stacklevel=2)
|
||||
if isinstance(key, str):
|
||||
key = key.encode('utf-8')
|
||||
self._verify_open()
|
||||
|
@ -300,4 +314,8 @@ def open(file, flag='c', mode=0o666):
|
|||
else:
|
||||
# Turn off any bits that are set in the umask
|
||||
mode = mode & (~um)
|
||||
if flag not in ('r', 'w', 'c', 'n'):
|
||||
import warnings
|
||||
warnings.warn("Flag must be one of 'r', 'w', 'c', or 'n'",
|
||||
DeprecationWarning, stacklevel=2)
|
||||
return _Database(file, mode, flag=flag)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue