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"))
C'est un peu moche comme on s'est efforcé que dans lc_ldap tout soit un unicode et que
unicode n'a pas de sens pour un objet binaire. Avec le champ python_type = str sur les
attributs bianire, ça a tout de même l'air d'aller.
En effet, python n'aime pas que les objets multables soient utilisé dans des sets
ou comme clef de dictionnaire, du coup, on va essayer de ne pas le contrarier.
De toute façon, c'est logique vu que la valeur du hash change si on édite l'objet.
Au lieu d'être obligé de faire à chaque fois obj[attr] = obj[attr] + [val]
on peut faire directement obj[attr].append(val).
Si on affecte obj[attr] à une variable (l=obj[attr])
et que l'on modifie la variable (l.append(val)), a la fois la variable et obj[attr] sont modifié
et maintenue à jour.
Attention toutefois :
l1 = obj[attr]
l2 = obj[attr]
l1 == l2 <=> True
l1.append(val)
l1 == obj[attr] <=> True
l1 == l2 <=> False
l2 == obj[attr] <=> False
et l2.append(val) lèvera une exception.
possibilité de fournir une valeur du bon type python à un attribut
test booléen sur s'attribut propagée à sa valeur.
Le teste d'égalité sur un attribut peut se faire avec la sérialisation de
l'attribut ou le type python qui le représente.
Le teste d'égalité sur les cransLdapObjet se fait sur le dn et ses attributs.
De plus, on peut aussi le testé avec un chaine de caractère :
"host=freebox.crans.org" == MachineCrans(...) renvoie True ssi
MachineCrans(...) a l'attribut host, qu'il est globalement unique et vaut
freebox.crans.org
vala vala
Ça permet d'utiliser des fonctions générique sur les machines lc_ldap
pour s'occuper aussi du multicast. Notamment dans /usr/scripts/gestion/gen_confs/bind2.py
où cela nous permet de générer gratuirement la zone tv.crans.org et son reverse.
* Quand on modifie un attribut qui devrait en modifier d'autres, on peut
invoquer check_changes pour voir ce qui devrait être changé, puis
validate_changes pour rendre ces changements effectifs. Il ne reste plus
qu'à appeler save pour enregistrer le tout.
* Correction de petits problèmes sur les locks : quand save réussissait,
ils n'étaient pas virés.