Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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