Issue #18039: dbm.dump.open() now always creates a new database when the
flag has the value 'n'. Patch by Claudiu Popa.
This commit is contained in:
parent
4c4cde7829
commit
b398d33c65
@ -316,13 +316,18 @@ The module defines the following:
|
|||||||
dumbdbm database is created, files with :file:`.dat` and :file:`.dir` extensions
|
dumbdbm database is created, files with :file:`.dat` and :file:`.dir` extensions
|
||||||
are created.
|
are created.
|
||||||
|
|
||||||
The optional *flag* argument is currently ignored; the database is always opened
|
The optional *flag* argument supports only the semantics of ``'c'``
|
||||||
for update, and will be created if it does not exist.
|
and ``'n'`` values. Other values will default to database being always
|
||||||
|
opened for update, and will be created if it does not exist.
|
||||||
|
|
||||||
The optional *mode* argument is the Unix mode of the file, used only when the
|
The optional *mode* argument is the Unix mode of the file, used only when the
|
||||||
database has to be created. It defaults to octal ``0o666`` (and will be modified
|
database has to be created. It defaults to octal ``0o666`` (and will be modified
|
||||||
by the prevailing umask).
|
by the prevailing umask).
|
||||||
|
|
||||||
|
.. versionchanged:: 3.5
|
||||||
|
:func:`.open` always creates a new database when the flag has the value
|
||||||
|
``'n'``.
|
||||||
|
|
||||||
In addition to the methods provided by the
|
In addition to the methods provided by the
|
||||||
:class:`collections.abc.MutableMapping` class, :class:`dumbdbm` objects
|
:class:`collections.abc.MutableMapping` class, :class:`dumbdbm` objects
|
||||||
provide the following method:
|
provide the following method:
|
||||||
|
@ -44,7 +44,7 @@ class _Database(collections.MutableMapping):
|
|||||||
_os = _os # for _commit()
|
_os = _os # for _commit()
|
||||||
_io = _io # for _commit()
|
_io = _io # for _commit()
|
||||||
|
|
||||||
def __init__(self, filebasename, mode):
|
def __init__(self, filebasename, mode, flag='c'):
|
||||||
self._mode = mode
|
self._mode = mode
|
||||||
|
|
||||||
# The directory file is a text file. Each line looks like
|
# The directory file is a text file. Each line looks like
|
||||||
@ -64,6 +64,17 @@ class _Database(collections.MutableMapping):
|
|||||||
# The index is an in-memory dict, mirroring the directory file.
|
# The index is an in-memory dict, mirroring the directory file.
|
||||||
self._index = None # maps keys to (pos, siz) pairs
|
self._index = None # maps keys to (pos, siz) pairs
|
||||||
|
|
||||||
|
# Handle the creation
|
||||||
|
self._create(flag)
|
||||||
|
self._update()
|
||||||
|
|
||||||
|
def _create(self, flag):
|
||||||
|
if flag == 'n':
|
||||||
|
for filename in (self._datfile, self._bakfile, self._dirfile):
|
||||||
|
try:
|
||||||
|
_os.remove(filename)
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
# Mod by Jack: create data file if needed
|
# Mod by Jack: create data file if needed
|
||||||
try:
|
try:
|
||||||
f = _io.open(self._datfile, 'r', encoding="Latin-1")
|
f = _io.open(self._datfile, 'r', encoding="Latin-1")
|
||||||
@ -71,7 +82,6 @@ class _Database(collections.MutableMapping):
|
|||||||
f = _io.open(self._datfile, 'w', encoding="Latin-1")
|
f = _io.open(self._datfile, 'w', encoding="Latin-1")
|
||||||
self._chmod(self._datfile)
|
self._chmod(self._datfile)
|
||||||
f.close()
|
f.close()
|
||||||
self._update()
|
|
||||||
|
|
||||||
# Read directory file into the in-memory index dict.
|
# Read directory file into the in-memory index dict.
|
||||||
def _update(self):
|
def _update(self):
|
||||||
@ -266,20 +276,20 @@ class _Database(collections.MutableMapping):
|
|||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
|
|
||||||
def open(file, flag=None, mode=0o666):
|
def open(file, flag='c', mode=0o666):
|
||||||
"""Open the database file, filename, and return corresponding object.
|
"""Open the database file, filename, and return corresponding object.
|
||||||
|
|
||||||
The flag argument, used to control how the database is opened in the
|
The flag argument, used to control how the database is opened in the
|
||||||
other DBM implementations, is ignored in the dbm.dumb module; the
|
other DBM implementations, supports only the semantics of 'c' and 'n'
|
||||||
database is always opened for update, and will be created if it does
|
values. Other values will default to the semantics of 'c' value:
|
||||||
not exist.
|
the database will always opened for update and will be created if it
|
||||||
|
does not exist.
|
||||||
|
|
||||||
The optional mode argument is the UNIX mode of the file, used only when
|
The optional mode argument is the UNIX mode of the file, used only when
|
||||||
the database has to be created. It defaults to octal code 0o666 (and
|
the database has to be created. It defaults to octal code 0o666 (and
|
||||||
will be modified by the prevailing umask).
|
will be modified by the prevailing umask).
|
||||||
|
|
||||||
"""
|
"""
|
||||||
# flag argument is currently ignored
|
|
||||||
|
|
||||||
# Modify mode depending on the umask
|
# Modify mode depending on the umask
|
||||||
try:
|
try:
|
||||||
@ -290,5 +300,4 @@ def open(file, flag=None, mode=0o666):
|
|||||||
else:
|
else:
|
||||||
# Turn off any bits that are set in the umask
|
# Turn off any bits that are set in the umask
|
||||||
mode = mode & (~um)
|
mode = mode & (~um)
|
||||||
|
return _Database(file, mode, flag=flag)
|
||||||
return _Database(file, mode)
|
|
||||||
|
@ -217,6 +217,14 @@ class DumbDBMTestCase(unittest.TestCase):
|
|||||||
self.assertEqual(str(cm.exception),
|
self.assertEqual(str(cm.exception),
|
||||||
"DBM object has already been closed")
|
"DBM object has already been closed")
|
||||||
|
|
||||||
|
def test_create_new(self):
|
||||||
|
with dumbdbm.open(_fname, 'n') as f:
|
||||||
|
for k in self._dict:
|
||||||
|
f[k] = self._dict[k]
|
||||||
|
|
||||||
|
with dumbdbm.open(_fname, 'n') as f:
|
||||||
|
self.assertEqual(f.keys(), [])
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
_delete_files()
|
_delete_files()
|
||||||
|
|
||||||
|
@ -92,6 +92,9 @@ Core and Builtins
|
|||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #18039: dbm.dump.open() now always creates a new database when the
|
||||||
|
flag has the value 'n'. Patch by Claudiu Popa.
|
||||||
|
|
||||||
- Issue #21326: Add a new is_closed() method to asyncio.BaseEventLoop.
|
- Issue #21326: Add a new is_closed() method to asyncio.BaseEventLoop.
|
||||||
run_forever() and run_until_complete() methods of asyncio.BaseEventLoop now
|
run_forever() and run_until_complete() methods of asyncio.BaseEventLoop now
|
||||||
raise an exception if the event loop was closed.
|
raise an exception if the event loop was closed.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user