[__setitems__] check_uniqueness après pose des locks sur les nouvelles valeurs
sinon, il est possible d'avoir des valeurs non globalement unique
This commit is contained in:
parent
65207641ae
commit
9690a40a97
1 changed files with 12 additions and 9 deletions
21
objets.py
21
objets.py
|
@ -639,15 +639,7 @@ class CransLdapObject(object):
|
||||||
# qui est assez sensible.
|
# qui est assez sensible.
|
||||||
self._check_setitem(attr, attrs_before_verif)
|
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]
|
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
|
# On groupe les attributs précédents, et les nouveaux
|
||||||
mixed_attrs = attrs_before_verif + old_attrs
|
mixed_attrs = attrs_before_verif + old_attrs
|
||||||
|
@ -664,11 +656,22 @@ class CransLdapObject(object):
|
||||||
locked = []
|
locked = []
|
||||||
try:
|
try:
|
||||||
for attribut in attrs_before_verif:
|
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 attribut.unique and not attribut in self._modifs.get(attr, []) and not attribut in attribut.unique_exclue:
|
||||||
if not self.in_context:
|
if not self.in_context:
|
||||||
cranslib.deprecated.usage("Des locks ne devrait être ajoutés que dans un context manager", level=2)
|
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)
|
self.conn.lockholder.addlock(attr, str(attribut), self.lockId)
|
||||||
locked.append((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 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 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
|
# * 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
|
# L'objet n'existe pas dans la base ldap (resurection par exemple), donc pas de problème
|
||||||
except ldap.NO_SUCH_OBJECT:
|
except ldap.NO_SUCH_OBJECT:
|
||||||
pass
|
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
|
# 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
|
# on libère les locks pris jusque là et on propage l'erreur
|
||||||
# les anciens locks et self._modifs reste bien inchangés
|
# les anciens locks et self._modifs reste bien inchangés
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue