Fix #11491. When dbm.open was called with a file which already exists and

the "flag" argument is "n", dbm.error was being raised. As documented,
dbm.open(...,flag='n') will now "Always create a new, empty database,
open for reading and writing", regardless of a previous file existing.
This commit is contained in:
briancurtin 2011-03-14 16:03:54 -04:00
parent d9a7c4b8e5
commit 525c25d42f
4 changed files with 16 additions and 3 deletions

View File

@ -67,10 +67,10 @@ def open(file, flag = 'r', mode = 0o666):
if not _defaultmod: if not _defaultmod:
raise ImportError("no dbm clone found; tried %s" % _names) raise ImportError("no dbm clone found; tried %s" % _names)
# guess the type of an existing database # guess the type of an existing database, if not creating a new one
result = whichdb(file) result = whichdb(file) if 'n' not in flag else None
if result is None: if result is None:
# db doesn't exist # db doesn't exist or 'n' flag was specified to create a new db
if 'c' in flag or 'n' in flag: if 'c' in flag or 'n' in flag:
# file doesn't exist and the new flag was used so use default type # file doesn't exist and the new flag was used so use default type
mod = _defaultmod mod = _defaultmod

View File

@ -70,6 +70,14 @@ class AnyDBMTestCase(unittest.TestCase):
self.read_helper(f) self.read_helper(f)
f.close() f.close()
def test_anydbm_creation_n_file_exists_with_invalid_contents(self):
with open(_fname, "w") as w:
pass # create an empty file
f = dbm.open(_fname, 'n')
self.addCleanup(f.close)
self.assertEqual(len(f), 0)
def test_anydbm_modification(self): def test_anydbm_modification(self):
self.init_db() self.init_db()
f = dbm.open(_fname, 'c') f = dbm.open(_fname, 'c')

View File

@ -169,6 +169,7 @@ Benjamin Collar
Jeffery Collins Jeffery Collins
Robert Collins Robert Collins
Paul Colomiets Paul Colomiets
Denver Coneybeare
Geremy Condra Geremy Condra
Juan José Conti Juan José Conti
Matt Conway Matt Conway

View File

@ -34,6 +34,10 @@ Core and Builtins
Library Library
------- -------
- Issue #11491: dbm.error is no longer raised when dbm.open is called with
the "n" as the flag argument and the file exists. The behavior matches
the documentation and general logic.
- Issue #11131: Fix sign of zero in decimal.Decimal plus and minus - Issue #11131: Fix sign of zero in decimal.Decimal plus and minus
operations when the rounding mode is ROUND_FLOOR. operations when the rounding mode is ROUND_FLOOR.