diff options
-rw-r--r-- | Lib/dumbdbm.py | 10 | ||||
-rw-r--r-- | Lib/test/test_dumbdbm.py | 7 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
3 files changed, 15 insertions, 5 deletions
diff --git a/Lib/dumbdbm.py b/Lib/dumbdbm.py index 1475361..7b4ddb0 100644 --- a/Lib/dumbdbm.py +++ b/Lib/dumbdbm.py @@ -92,6 +92,9 @@ class _Database(UserDict.DictMixin): # 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: + return # nothing to do + try: self._os.unlink(self._bakfile) except self._os.error: @@ -204,12 +207,9 @@ class _Database(UserDict.DictMixin): def close(self): self._commit() - self._index = None - self._datfile = self._dirfile = self._bakfile = None + self._index = self._datfile = self._dirfile = self._bakfile = None - def __del__(self): - if self._index is not None: - self._commit() + __del__ = close diff --git a/Lib/test/test_dumbdbm.py b/Lib/test/test_dumbdbm.py index 08474f7..12df673 100644 --- a/Lib/test/test_dumbdbm.py +++ b/Lib/test/test_dumbdbm.py @@ -38,6 +38,13 @@ class DumbDBMTestCase(unittest.TestCase): self.read_helper(f) f.close() + def test_close_twice(self): + f = dumbdbm.open(_fname) + f['a'] = 'b' + self.assertEqual(f['a'], 'b') + f.close() + f.close() + def test_dumbdbm_modification(self): self.init_db() f = dumbdbm.open(_fname, 'w') @@ -38,6 +38,9 @@ Extension modules Library ------- +- Closing a dumbdbm database more than once is now harmless (it used to + raise a nuisance exception on the second close). + - It's vital that a dumbdbm database be closed properly, else the on-disk data and directory files can be left in mutually inconsistent states. dumbdbm.py's _Database.__del__() method attempted to close |