diff options
| author | Raphael Collet <rco@openerp.com> | 2016-01-15 12:28:09 +0100 |
|---|---|---|
| committer | Raphael Collet <rco@openerp.com> | 2016-01-15 17:04:45 +0100 |
| commit | 20cfdc460436529be5aa2b024bc8d5ea5046a294 (patch) | |
| tree | 12686e451b4ab201fb8c01d7be529eb051e842ea | |
| parent | c4494b9868621c0bf8c6ac683bf7faab2f3b6f74 (diff) | |
[IMP] sql_db: add event handlers for post-commit and post-rollback
| -rw-r--r-- | openerp/sql_db.py | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/openerp/sql_db.py b/openerp/sql_db.py index ea34aac9295..749af2376c0 100644 --- a/openerp/sql_db.py +++ b/openerp/sql_db.py @@ -173,6 +173,9 @@ class Cursor(object): self.cache = {} + # event handlers, see method after() below + self._event_handlers = {'commit': [], 'rollback': []} + def __build_dict(self, row): return {d.name: row[i] for i, d in enumerate(self._obj.description)} def dictfetchone(self): @@ -338,16 +341,44 @@ class Cursor(object): self._cnx.set_isolation_level(isolation_level) @check + def after(self, event, func): + """ Register an event handler. + + :param event: the event, either `'commit'` or `'rollback'` + :param func: a callable object, called with no argument after the + event occurs + + Be careful when coding an event handler, since any operation on the + cursor that was just committed/rolled back will take place in the + next transaction that has already begun, and may still be rolled + back or committed independently. You may consider the use of a + dedicated temporary cursor to do some database operation. + """ + self._event_handlers[event].append(func) + + def _pop_event_handlers(self): + # return the current handlers, and reset them on self + result = self._event_handlers + self._event_handlers = {'commit': [], 'rollback': []} + return result + + @check def commit(self): """ Perform an SQL `COMMIT` """ - return self._cnx.commit() + result = self._cnx.commit() + for func in self._pop_event_handlers()['commit']: + func() + return result @check def rollback(self): """ Perform an SQL `ROLLBACK` """ - return self._cnx.rollback() + result = self._cnx.rollback() + for func in self._pop_event_handlers()['rollback']: + func() + return result def __enter__(self): """ Using the cursor as a contextmanager automatically commits and |
