pop in master resize slave values

This commit is contained in:
2017-10-22 15:10:50 +02:00
parent 5a1987f2e6
commit 8e91f94379
3 changed files with 124 additions and 1 deletions

View File

@ -651,6 +651,9 @@ class MasterSlaves(OptionDescription):
def pop(self, opt, values, index):
for slave in self.getslaves(opt):
slave_path = slave.impl_getpath(values._getcontext())
slavelen = values._p_.get_max_length(slave_path, None)
# just for raise if needed
if not values.is_default_owner(slave, validate_properties=False,
validate_meta=False, index=index):
multi = values._get_cached_value(slave, validate=False,
@ -658,7 +661,12 @@ class MasterSlaves(OptionDescription):
)
if isinstance(multi, Exception):
raise multi
multi.pop(index, force=True)
if slavelen > index:
values._p_.resetvalue_index(slave_path, index)
if slavelen > index + 1:
for idx in xrange(index + 1, slavelen):
values._p_.reduce_index(slave_path, idx)
def getitem(self, values, opt, path, validate, force_permissive,
trusted_cached_properties, validate_properties,

View File

@ -92,6 +92,51 @@ class Values(Cache):
"""
return path in self._values[0]
def reduce_index(self, path, index):
"""
_values == ((path1, path2), ((idx1_1, idx1_2), None), ((value1_1, value1_2), value2), ((owner1_1, owner1_2), owner2))
"""
path_idx = self._values[0].index(path)
indexes = self._values[1][path_idx]
if index in indexes:
subidx = indexes.index(index)
values = list(self._values)
values_idx = list(values[1])
lvalues = list(values_idx[path_idx])
lvalues[subidx] = lvalues[subidx] - 1
values_idx[path_idx] = tuple(lvalues)
values[1] = tuple(values_idx)
self._values = tuple(values)
def resetvalue_index(self, path, index):
def _resetvalue(nb):
values_idx = list(values[nb])
del(values_idx[path_idx])
values[nb] = tuple(values_idx)
def _resetvalue_index(nb):
values_idx = list(values[nb])
lvalues = list(values_idx[path_idx])
del(lvalues[subidx])
values_idx[path_idx] = tuple(lvalues)
values[nb] = tuple(values_idx)
path_idx = self._values[0].index(path)
indexes = self._values[1][path_idx]
if index in indexes:
subidx = indexes.index(index)
values = list(self._values)
if len(values[1][path_idx]) == 1:
_resetvalue(0)
_resetvalue(1)
_resetvalue(2)
_resetvalue(3)
else:
_resetvalue_index(1)
_resetvalue_index(2)
_resetvalue_index(3)
self._values = tuple(values)
def resetvalue(self, path, session, commit):
"""remove value means delete value in storage
"""