17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Une transaction respecte donc le modèle de code suivant :<br />

Code transactionnel<br />

begin_transaction()<br />

try:<br />

...<br />

except:<br />

rollback_transaction()<br />

raise<br />

else:<br />

commit_transaction()<br />

<strong>Programmation</strong> orientée objet<br />

CHAPITRE 14<br />

La limite de couverture de begin_transaction() est relativement floue et dépend<br />

fortement du contexte : quelles sont et où sont les données à sauvegarder pendant la<br />

transaction ?<br />

Ce problème dépend entièrement du contexte, et l’implémentation proposée ci-dessous<br />

place la granularité des transactions au niveau des classes : chaque méthode peut devenir<br />

transactionnelle, et les attributs de l’objet sont les cibles de la sauvegarde.<br />

L’implémentation la plus souple dans ce cas consiste à créer un decorator de classe pour<br />

rendre transparente la transaction : chaque méthode transactionnelle peut être annotée<br />

avec le decorator, qui se charge alors de sauvegarder l’état de l’objet et d’exécuter la<br />

méthode. En cas de levée d’exception, un rollback est automatiquement effectué.<br />

Memento<br />

import copy<br />

def get_memento(objet):<br />

""" récupère l'état d'un objet """<br />

return copy.deepcopy(objet.__dict__)<br />

def set_memento(objet, etat):<br />

""" restore un objet """<br />

objet.__dict__.clear()<br />

objet.__dict__.update(etat)<br />

def transaction(methode):<br />

""" decorator de classe "transaction"<br />

rend les méthodes transactionnelles<br />

"""<br />

def capsule(objet, *args, **kw):<br />

etat = get_memento(objet)<br />

try:<br />

return methode(objet, *args, **kw)<br />

511

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!