Travaux sur les locks, ajout de context manager pour les cransLdapObject

D'une façon général, on s'assure que tous les locks concernant un cransLdapObject
sont bien mis avec l'identifiant de lock cransLdapObject.lockId.
Avant d'entrer dans le context manager du cransLdapObject, on fait bien attention
d'intercepter les exceptions pouvant être levée pour libérer les locks potentiellement
déjà posés avant de propager l'exception.

Si on essayer d'appeler une methode d'enregistrement (.save() .delete() .create()) sans
utiliser un context manager, on affiche un warning sur stderr.

À terme ça serait bien de n'utiliser que des context manager pour être sûr qu'on ne
laisse pas de lock traîner dans la base de donnée.

Il faut bien sûr faire attention de bien ajouter les lock avec l'identifiant cransLdapObject.lockId
puisqu'on se base là dessus pour les libérer.

Si on a utiliser une context manager, en en sortant, on rend le cransLdapObject read only
(de façon douce en modifiant le cransLdapObject.mode et de façon force en changeant les methodes
save create delete pour lever l'exception EnvironmentError("Hors du context, impossible de faire des écritures"))
This commit is contained in:
Valentin Samir 2014-02-24 14:48:03 +01:00
parent 63b9f89b6f
commit 9aa0de6539
2 changed files with 51 additions and 21 deletions

View file

@ -372,18 +372,20 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
données encodées.'''
# Ajout des locks, on instancie les attributs qui ne sont pas
# des id, ceux-ci étant déjà lockés.
for key, values in uldif.iteritems():
attribs = [attributs.attrify(val, key, self) for val in values]
for attribut in attribs:
if attribut.unique:
self.lockholder.addlock(key, str(attribut))
Id=None
try:
return objets.new_cransldapobject(self, dn, 'rw', uldif)
except ldap_locks.LockError:
obj = objets.new_cransldapobject(self, dn, 'rw', uldif)
Id = obj.lockId
for key, values in uldif.iteritems():
attribs = [attributs.attrify(val, key, self) for val in values]
for attribut in attribs:
self.lockholder.removelock(key, str(attribut))
if attribut.unique:
self.lockholder.addlock(key, str(attribut), Id=Id)
return obj
except ldap_locks.LockError:
# On supprime seulement les locks que l'on vient de poser
if Id is not None:
self.lockholder.purge(Id)
raise
def _find_id(self, attr, realm=None):