Kaydet (Commit) b398d33c authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

Issue #18039: dbm.dump.open() now always creates a new database when the

flag has the value 'n'.  Patch by Claudiu Popa.
üst 4c4cde78
...@@ -316,13 +316,18 @@ The module defines the following: ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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 ...@@ -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.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment