Make close() identical to __del__() for a dumbdbm database. Make
closing idempotent (it used to raise a nuisance exception on the 2nd close attempt). Bugfix candidate? Probably, but arguable.
This commit is contained in:
parent
4a4296ec29
commit
7a6c733c3b
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue