Commit 9690a40a authored by Valentin Samir's avatar Valentin Samir

[__setitems__] check_uniqueness après pose des locks sur les nouvelles valeurs

sinon, il est possible d'avoir des valeurs non globalement unique
parent 65207641
......@@ -639,15 +639,7 @@ class CransLdapObject(object):
# qui est assez sensible.
self._check_setitem(attr, attrs_before_verif)
# Vérification que (attr, value) est localement unique et
# si attr doit être globalement unique, l'unicité globale
# Dans ce cas, on ne tiens pas compte de old_attrs cas ils
# vont être effacé si le setitem réussi
old_attrs = self[attr]
for attribut in attrs_before_verif:
if attrs_before_verif.count(attribut) > 1:
raise ValueError("%s en double\n(%s)" % (attribut.legend if attribut.legend else attr, attribut))
attribut.check_uniqueness(old_attrs)
# On groupe les attributs précédents, et les nouveaux
mixed_attrs = attrs_before_verif + old_attrs
......@@ -664,11 +656,22 @@ class CransLdapObject(object):
locked = []
try:
for attribut in attrs_before_verif:
# Vérification que (attr, value) est localement unique
if attrs_before_verif.count(attribut) > 1:
raise ValueError("%s en double\n(%s)" % (attribut.legend if attribut.legend else attr, attribut))
# On lock les nouvelles valeurs globalement unique
if attribut.unique and not attribut in self._modifs.get(attr, []) and not attribut in attribut.unique_exclue:
if not self.in_context:
cranslib.deprecated.usage("Des locks ne devrait être ajoutés que dans un context manager", level=2)
self.conn.lockholder.addlock(attr, str(attribut), self.lockId)
locked.append((attr, str(attribut), self.lockId))
# si attr doit être globalement unique, vérification de l'unicité globale
# Dans ce cas, on ne tiens pas compte de old_attrs cas ils
# vont être effacé si le setitem réussi
attribut.check_uniqueness(old_attrs)
# On lock si l'attribut ne supporte pas les modifications concurrente (comme pour le solde) si :
# * on effectue réellement un modification sur l'attribut
# * on a pas déjà effectuer un modification qui nous a déjà fait acquérir le lock
......@@ -684,7 +687,7 @@ class CransLdapObject(object):
# L'objet n'existe pas dans la base ldap (resurection par exemple), donc pas de problème
except ldap.NO_SUCH_OBJECT:
pass
except ldap_locks.LockError:
except (ldap_locks.LockError, ValueError, attributs.UniquenessError):
# Si on ne parvient pas à prendre le lock pour l'une des valeurs
# on libère les locks pris jusque là et on propage l'erreur
# les anciens locks et self._modifs reste bien inchangés
......
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