summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/dumbdbm.py10
-rw-r--r--Lib/test/test_dumbdbm.py7
-rw-r--r--Misc/NEWS3
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')
diff --git a/Misc/NEWS b/Misc/NEWS
index 0f329df..9b9b567 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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