894 DeprecationWarning, stacklevel=2) |
894 DeprecationWarning, stacklevel=2) |
895 rset = self._execute(self, rql, kwargs, build_descr) |
895 rset = self._execute(self, rql, kwargs, build_descr) |
896 rset.req = self |
896 rset.req = self |
897 self._session_timestamp.touch() |
897 self._session_timestamp.touch() |
898 return rset |
898 return rset |
|
899 |
|
900 def rollback(self, free_cnxset=True, reset_pool=None): |
|
901 """rollback the current transaction""" |
|
902 if reset_pool is not None: |
|
903 warn('[3.13] use free_cnxset argument instead for reset_pool', |
|
904 DeprecationWarning, stacklevel=2) |
|
905 free_cnxset = reset_pool |
|
906 cnxset = self.cnxset |
|
907 if cnxset is None: |
|
908 self.clear() |
|
909 self._session_timestamp.touch() |
|
910 self.debug('rollback transaction %s done (no db activity)', self.connectionid) |
|
911 return |
|
912 try: |
|
913 # by default, operations are executed with security turned off |
|
914 with self.security_enabled(False, False): |
|
915 while self.pending_operations: |
|
916 try: |
|
917 operation = self.pending_operations.pop(0) |
|
918 operation.handle_event('rollback_event') |
|
919 except BaseException: |
|
920 self.critical('rollback error', exc_info=sys.exc_info()) |
|
921 continue |
|
922 cnxset.rollback() |
|
923 self.debug('rollback for connectionid %s done', self.connectionid) |
|
924 finally: |
|
925 self._session_timestamp.touch() |
|
926 if free_cnxset: |
|
927 self.free_cnxset(ignoremode=True) |
|
928 self.clear() |
899 |
929 |
900 # resource accessors ###################################################### |
930 # resource accessors ###################################################### |
901 |
931 |
902 def system_sql(self, sql, args=None, rollback_on_failure=True): |
932 def system_sql(self, sql, args=None, rollback_on_failure=True): |
903 """return a sql cursor on the system database""" |
933 """return a sql cursor on the system database""" |
1436 self._touch() |
1466 self._touch() |
1437 if free_cnxset: |
1467 if free_cnxset: |
1438 self.free_cnxset(ignoremode=True) |
1468 self.free_cnxset(ignoremode=True) |
1439 self._clear_thread_data(free_cnxset) |
1469 self._clear_thread_data(free_cnxset) |
1440 |
1470 |
1441 def rollback(self, free_cnxset=True, reset_pool=None): |
1471 def rollback(self, free_cnxset=True, **kwargs): |
1442 """rollback the current session's transaction""" |
1472 """rollback the current session's transaction""" |
1443 if reset_pool is not None: |
|
1444 warn('[3.13] use free_cnxset argument instead for reset_pool', |
|
1445 DeprecationWarning, stacklevel=2) |
|
1446 free_cnxset = reset_pool |
|
1447 # don't use self.cnxset, rollback may be called with _closed == True |
|
1448 cnxset = self._cnx.cnxset |
|
1449 if cnxset is None: |
|
1450 self._clear_thread_data() |
|
1451 self._touch() |
|
1452 self.debug('rollback session %s done (no db activity)', self.id) |
|
1453 return |
|
1454 try: |
1473 try: |
1455 # by default, operations are executed with security turned off |
1474 return self._cnx.rollback(free_cnxset, **kwargs) |
1456 with self.security_enabled(False, False): |
|
1457 while self.pending_operations: |
|
1458 try: |
|
1459 operation = self.pending_operations.pop(0) |
|
1460 operation.handle_event('rollback_event') |
|
1461 except BaseException: |
|
1462 self.critical('rollback error', exc_info=sys.exc_info()) |
|
1463 continue |
|
1464 cnxset.rollback() |
|
1465 self.debug('rollback for session %s done', self.id) |
|
1466 finally: |
1475 finally: |
1467 self._touch() |
|
1468 if free_cnxset: |
|
1469 self.free_cnxset(ignoremode=True) |
|
1470 self._clear_thread_data(free_cnxset) |
1476 self._clear_thread_data(free_cnxset) |
1471 |
1477 |
1472 def close(self): |
1478 def close(self): |
1473 # do not close connections set on session close, since they are shared now |
1479 # do not close connections set on session close, since they are shared now |
1474 tracker = self._cnxset_tracker |
1480 tracker = self._cnxset_tracker |