diff -r e33ff287f082 -r 4a39f3f1f1d9 server/session.py --- a/server/session.py Thu Jun 27 11:20:46 2013 +0200 +++ b/server/session.py Thu Jun 27 11:21:09 2013 +0200 @@ -897,6 +897,36 @@ self._session_timestamp.touch() return rset + def rollback(self, free_cnxset=True, reset_pool=None): + """rollback the current transaction""" + if reset_pool is not None: + warn('[3.13] use free_cnxset argument instead for reset_pool', + DeprecationWarning, stacklevel=2) + free_cnxset = reset_pool + cnxset = self.cnxset + if cnxset is None: + self.clear() + self._session_timestamp.touch() + self.debug('rollback transaction %s done (no db activity)', self.connectionid) + return + try: + # by default, operations are executed with security turned off + with self.security_enabled(False, False): + while self.pending_operations: + try: + operation = self.pending_operations.pop(0) + operation.handle_event('rollback_event') + except BaseException: + self.critical('rollback error', exc_info=sys.exc_info()) + continue + cnxset.rollback() + self.debug('rollback for connectionid %s done', self.connectionid) + finally: + self._session_timestamp.touch() + if free_cnxset: + self.free_cnxset(ignoremode=True) + self.clear() + # resource accessors ###################################################### def system_sql(self, sql, args=None, rollback_on_failure=True): @@ -1438,35 +1468,11 @@ self.free_cnxset(ignoremode=True) self._clear_thread_data(free_cnxset) - def rollback(self, free_cnxset=True, reset_pool=None): + def rollback(self, free_cnxset=True, **kwargs): """rollback the current session's transaction""" - if reset_pool is not None: - warn('[3.13] use free_cnxset argument instead for reset_pool', - DeprecationWarning, stacklevel=2) - free_cnxset = reset_pool - # don't use self.cnxset, rollback may be called with _closed == True - cnxset = self._cnx.cnxset - if cnxset is None: - self._clear_thread_data() - self._touch() - self.debug('rollback session %s done (no db activity)', self.id) - return try: - # by default, operations are executed with security turned off - with self.security_enabled(False, False): - while self.pending_operations: - try: - operation = self.pending_operations.pop(0) - operation.handle_event('rollback_event') - except BaseException: - self.critical('rollback error', exc_info=sys.exc_info()) - continue - cnxset.rollback() - self.debug('rollback for session %s done', self.id) + return self._cnx.rollback(free_cnxset, **kwargs) finally: - self._touch() - if free_cnxset: - self.free_cnxset(ignoremode=True) self._clear_thread_data(free_cnxset) def close(self):