Commit 5e5a0998 authored by Julien Muchembled's avatar Julien Muchembled

HBTreeFolder2: make sure _setOb does not overwrite a leaf at root tree

parent 7edac20b
...@@ -308,25 +308,17 @@ class HBTreeFolder2Base (Persistent): ...@@ -308,25 +308,17 @@ class HBTreeFolder2Base (Persistent):
if type(object) is OOBTree: if type(object) is OOBTree:
raise ValueError('HBTreeFolder2 can not store OOBTree objects') raise ValueError('HBTreeFolder2 can not store OOBTree objects')
htree = self._htree htree = self._htree
id_list = self.hashId(id) for sub_id in self.hashId(id)[:-1]:
for idx in xrange(len(id_list) - 1): try:
sub_id = id_list[idx] htree = htree[sub_id]
if not htree.has_key(sub_id): except KeyError:
# Create a new level htree[sub_id] = htree = OOBTree()
htree[sub_id] = OOBTree() continue
if isinstance(sub_id, (int, long)): if type(htree) is not OOBTree:
tree_id = 0 assert self._htree[sub_id] is htree, (htree, id)
for id in id_list[:idx+1]: raise KeyError('There is already an item whose id is %r' % sub_id)
tree_id = tree_id + id * MAX_OBJECT_PER_LEVEL
else:
tree_id = H_SEPARATOR.join(id_list[:idx+1])
htree = htree[sub_id]
# set object in subtree
ob_id = id_list[-1]
if htree.has_key(id): if htree.has_key(id):
raise KeyError('There is already an item named "%s".' % id) raise KeyError('There is already an item named %r.' % id)
htree[id] = object htree[id] = object
self._count.change(1) self._count.change(1)
......
...@@ -47,6 +47,8 @@ class HBTreeFolder2Tests(ERP5TypeTestCase): ...@@ -47,6 +47,8 @@ class HBTreeFolder2Tests(ERP5TypeTestCase):
f._setOb(id, ff) f._setOb(id, ff)
f._getOb(id) f._getOb(id)
for id in "a-a", "b", "c-a": for id in "a-a", "b", "c-a":
if id != "c-a":
self.assertRaises(KeyError, f._setOb, id, ff)
self.assertRaises(KeyError, f._getOb, id) self.assertRaises(KeyError, f._getOb, id)
self.assertRaises(KeyError, f._delOb, id) self.assertRaises(KeyError, f._delOb, id)
self.assertEqual(len(f), 1 + len(ok)) self.assertEqual(len(f), 1 + len(ok))
......
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