diff options
-rw-r--r-- | Lib/bsddb/__init__.py | 4 | ||||
-rwxr-xr-x | Lib/test/test_bsddb.py | 16 |
2 files changed, 20 insertions, 0 deletions
diff --git a/Lib/bsddb/__init__.py b/Lib/bsddb/__init__.py index df50bce..26e41b1 100644 --- a/Lib/bsddb/__init__.py +++ b/Lib/bsddb/__init__.py @@ -266,12 +266,16 @@ class _DBWithCursor(_iter_mixin): def first(self): self._checkOpen() + # fix 1725856: don't needlessly try to restore our cursor position + self.saved_dbc_key = None self._checkCursor() rv = _DeadlockWrap(self.dbc.first) return rv def last(self): self._checkOpen() + # fix 1725856: don't needlessly try to restore our cursor position + self.saved_dbc_key = None self._checkCursor() rv = _DeadlockWrap(self.dbc.last) return rv diff --git a/Lib/test/test_bsddb.py b/Lib/test/test_bsddb.py index 2da40453..dfee3dc 100755 --- a/Lib/test/test_bsddb.py +++ b/Lib/test/test_bsddb.py @@ -131,6 +131,22 @@ class TestBSDDB(unittest.TestCase): items.append(self.f.previous()) self.assertSetEquals(items, self.d.items()) + def test_first_while_deleting(self): + # Test for bug 1725856 + self.assert_(len(self.d) >= 2, "test requires >=2 items") + for _ in self.d: + key = self.f.first()[0] + del self.f[key] + self.assertEqual(0, len(self.f), "expected empty db after test") + + def test_last_while_deleting(self): + # Test for bug 1725856's evil twin + self.assert_(len(self.d) >= 2, "test requires >=2 items") + for _ in self.d: + key = self.f.last()[0] + del self.f[key] + self.assertEqual(0, len(self.f), "expected empty db after test") + def test_set_location(self): self.assertEqual(self.f.set_location('e'), ('e', self.d['e'])) |