Commit 141c28af authored by Jason Madden's avatar Jason Madden

Fix setting _p_changed for small pure-Python BTrees.

parent b49be3c9
...@@ -16,3 +16,4 @@ coverage.xml ...@@ -16,3 +16,4 @@ coverage.xml
*.egg *.egg
dist dist
.eggs/ .eggs/
.dir-locals.el
...@@ -883,11 +883,16 @@ class _Tree(_Base): ...@@ -883,11 +883,16 @@ class _Tree(_Base):
max_size = self.max_leaf_size max_size = self.max_leaf_size
if child.size > max_size: if child.size > max_size:
self._grow(child, index) self._grow(child, index)
elif (grew is not None and
child.__class__ is self._bucket_type and # If a BTree contains only a single bucket, BTree.__getstate__()
len(data) == 1 and # includes the bucket's entire state, and the bucket doesn't get
child._p_oid is None # an oid of its own. So if we have a single oid-less bucket that
): # changed, it's *our* oid that should be marked as changed -- the
# bucket doesn't have one.
if (grew is not None and
child.__class__ is self._bucket_type and
len(data) == 1 and
child._p_oid is None):
self._p_changed = 1 self._p_changed = 1
return result return result
......
...@@ -768,7 +768,6 @@ class MappingBase(Base): ...@@ -768,7 +768,6 @@ class MappingBase(Base):
# Too many arguments. # Too many arguments.
self.assertRaises(TypeError, t.pop, 1, 2, 3) self.assertRaises(TypeError, t.pop, 1, 2, 3)
class BTreeTests(MappingBase): class BTreeTests(MappingBase):
# Tests common to all BTrees # Tests common to all BTrees
...@@ -1091,6 +1090,35 @@ class BTreeTests(MappingBase): ...@@ -1091,6 +1090,35 @@ class BTreeTests(MappingBase):
self.assertEqual(str(v), str(k[0])) self.assertEqual(str(v), str(k[0]))
self._checkIt(t) self._checkIt(t)
def testAddTwoSetsChanged(self):
# A bug in the BTree Python implementation once
# caused adding a second item to a tree to fail
# to set _p_changed (adding the first item sets it because
# the _firstbucket gets set, but the second item only grew the
# existing bucket)
t = self._makeOne()
# Note that for the property to actually hold, we have to fake a
# _p_jar and _p_oid
t._p_oid = b'\0\0\0\0\0'
class Jar(object):
def __init__(self):
self._cache = self
self.registered = None
def mru(self, arg):
pass
def readCurrent(self, arg):
pass
def register(self, arg):
self.registered = arg
t._p_jar = Jar()
t[1] = 3
t._p_changed = False
t._p_jar.registered = None
t[2] = 4
self.assertTrue(t._p_changed)
self.assertEqual(t, t._p_jar.registered)
class NormalSetTests(Base): class NormalSetTests(Base):
# Test common to all set types # Test common to all set types
......
...@@ -7,6 +7,9 @@ ...@@ -7,6 +7,9 @@
- Suppress testing 64-bit values in OLBTrees on 32 bit machines. - Suppress testing 64-bit values in OLBTrees on 32 bit machines.
See: https://github.com/zopefoundation/BTrees/issues/9 See: https://github.com/zopefoundation/BTrees/issues/9
- Fix _p_changed for small pure-Python BTrees.
See https://github.com/zopefoundation/BTrees/issues/10
4.1.1 (2014-12-27) 4.1.1 (2014-12-27)
------------------ ------------------
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment