From 9690a40a97e786056e1339d5636e1427f47d20ae Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Thu, 11 Dec 2014 12:03:47 +0100 Subject: [PATCH] =?UTF-8?q?[=5F=5Fsetitems=5F=5F]=20check=5Funiqueness=20a?= =?UTF-8?q?pr=C3=A8s=20pose=20des=20locks=20sur=20les=20nouvelles=20valeur?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sinon, il est possible d'avoir des valeurs non globalement unique --- objets.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/objets.py b/objets.py index 62fb3d4..961f257 100644 --- a/objets.py +++ b/objets.py @@ -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