def mark_changed(session, transaction_manager=zope_transaction.manager, keep_session=False): session_id = session assert _SESSION_STATE.get(session_id, None) is not STATUS_READONLY, ( "Session already registered as read only") join_transaction(session, STATUS_CHANGED, transaction_manager, keep_session) _SESSION_STATE[session_id] = STATUS_CHANGED
def mark_changed(session, transaction_manager=zope_transaction.manager, keep_session=False): session_id = session assert _SESSION_STATE.get(session_id, None) is not STATUS_READONLY, ( "Session already registered as read only") join_transaction(session, STATUS_CHANGED, transaction_manager, keep_session) _SESSION_STATE[session_id] = STATUS_CHANGED
def join_transaction(session, initial_state=STATUS_ACTIVE, transaction_manager=zope_transaction.manager, keep_session=False): if _SESSION_STATE.get(session, None) is None: if session.twophase: DataManager = AnyBlokTwoPhaseSessionDataManager else: DataManager = AnyBlokSessionDataManager DataManager(session, initial_state, transaction_manager, keep_session=keep_session)
def join_transaction(session, initial_state=STATUS_ACTIVE, transaction_manager=zope_transaction.manager, keep_session=False): if _SESSION_STATE.get(session, None) is None: if session.twophase: DataManager = AnyBlokTwoPhaseSessionDataManager else: DataManager = AnyBlokSessionDataManager DataManager(session, initial_state, transaction_manager, keep_session=keep_session)
def _session(request): engine = request.registry['sqlalchemy.engine'] session = Session(bind=engine) if request.path == '/account/_debug/counter': log.info('created session: sess=%r', session) _configure_noisy_session_logging(session) # If the request has a transaction manager, associate the session with it. try: tm = request.tm except AttributeError: pass else: if request.path == '/account/_debug/counter': log.info('registering session with tm: sess=%r, tm=%r', session, tm) trans = request.tm.get() trans.addBeforeCommitHook(log.info, args=('tm before commit',)) trans.addAfterCommitHook(lambda success, msg: log.info(msg, success), args=('tm after commit: success=%r',)) log.info('session state: %r', _SESSION_STATE.get(id(session), None)) zope.sqlalchemy.register(session, transaction_manager=tm) # pyramid_tm doesn't always close the database session for us. # # For example if an exception view accesses the session and causes a new # transaction to be opened, pyramid_tm won't close this connection because # pyramid_tm's transaction has already ended before exception views are # executed. # Connections opened by NewResponse and finished callbacks aren't closed by # pyramid_tm either. # # So add our own callback here to make sure db sessions are always closed. # # See: https://github.com/Pylons/pyramid_tm/issues/40 @request.add_finished_callback def close_the_sqlalchemy_session(request): if session.dirty: log.warn('closing a dirty session') request.sentry.captureMessage('closing a dirty session', stack=True, extra={ 'dirty': session.dirty, }) session.close() return session