summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael Collet <rco@openerp.com>2016-01-15 12:28:09 +0100
committerRaphael Collet <rco@openerp.com>2016-01-15 17:04:45 +0100
commit20cfdc460436529be5aa2b024bc8d5ea5046a294 (patch)
tree12686e451b4ab201fb8c01d7be529eb051e842ea
parentc4494b9868621c0bf8c6ac683bf7faab2f3b6f74 (diff)
[IMP] sql_db: add event handlers for post-commit and post-rollback
-rw-r--r--openerp/sql_db.py35
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