U
    !Jj4                     @  s   d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ ddlmZ dd	lm	Z	 dd
lm
Z
 ddlmZ ddlmZ ddlmZ ejrddlmZ ddlmZ G dd deje	 ZdS )    )annotationsN)Any)Optional)Type)Union   )ConnectionPoolEntry)Pool)PoolProxiedConnection)PoolResetState   )event)util)Engine)DBAPIConnectionc                   @  s  e Zd ZdZdZeZede	dddddd	Z
e	d
dddddZddddddZddddddZdddddddZddddddZeddd gd!d" ddd#dd$d%d&Zddd'dd(d)d*Zddd'dd(d+d,Zddddd-d.Zddddd/d0Zddd1d2d3Zd4S )5
PoolEventsa  Available events for :class:`_pool.Pool`.

    The methods here define the name of an event as well
    as the names of members that are passed to listener
    functions.

    When using an :class:`.Engine` object created via :func:`_sa.create_engine`
    (or indirectly via :func:`.create_async_engine`), :class:`.PoolEvents`
    listeners are expected to be registered in terms of the :class:`.Engine`,
    which will direct the listeners to the :class:`.Pool` contained within::

        from sqlalchemy import create_engine
        from sqlalchemy import event

        engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test")


        @event.listens_for(engine, "checkout")
        def my_on_checkout(dbapi_conn, connection_rec, connection_proxy):
            "handle an on checkout event"

    :class:`.PoolEvents` may also be registered with the :class:`_pool.Pool`
    class, with the :class:`.Engine` class, as well as with instances of
    :class:`_pool.Pool`.

    .. tip::

        Registering :class:`.PoolEvents` with the :class:`.Engine`, if present,
        is recommended since the :meth:`.Engine.dispose` method will carry
        along event listeners from the old pool to the new pool.

    ZSomeEngineOrPoolzsqlalchemy.enginez-Union[Pool, Type[Pool], Engine, Type[Engine]]strz!Optional[Union[Pool, Type[Pool]]])target
identifierreturnc                 C  sv   t jstjjj}t|tr<t||r(t	S t|t	s6t
|S n6t||rL|jS t|t	rZ|S t|drn|  nd S d S )N_no_async_engine_events)typingTYPE_CHECKINGr   Z	preloadedenginer   
isinstancetype
issubclassr	   AssertionErrorpoolhasattrr   )clsr   r   r    r!   w/var/www/api.dyntland.com/public_html/python_social_comments/venv/lib/python3.8/site-packages/sqlalchemy/pool/events.py_accept_with@   s    






zPoolEvents._accept_withzevent._EventKey[Pool]r   None)	event_keykwr   c                 K  s$   |j }|d|j |jf | d S )NZasyncio)Zdispatch_target
setdefaultZ_is_asyncioZbase_listen)r    r%   r&   r   r!   r!   r"   _listenY   s    zPoolEvents._listenr   r   )dbapi_connectionconnection_recordr   c                 C  s   dS )a  Called at the moment a particular DBAPI connection is first
        created for a given :class:`_pool.Pool`.

        This event allows one to capture the point directly after which
        the DBAPI module-level ``.connect()`` method has been used in order
        to produce a new DBAPI connection.

        :param dbapi_connection: a DBAPI connection.
         The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.

        :param connection_record: the :class:`.ConnectionPoolEntry` managing
         the DBAPI connection.

        Nr!   selfr)   r*   r!   r!   r"   connecte   s    zPoolEvents.connectc                 C  s   dS )a)  Called exactly once for the first time a DBAPI connection is
        checked out from a particular :class:`_pool.Pool`.

        The rationale for :meth:`_events.PoolEvents.first_connect`
        is to determine
        information about a particular series of database connections based
        on the settings used for all connections.  Since a particular
        :class:`_pool.Pool`
        refers to a single "creator" function (which in terms
        of a :class:`_engine.Engine`
        refers to the URL and connection options used),
        it is typically valid to make observations about a single connection
        that can be safely assumed to be valid about all subsequent
        connections, such as the database version, the server and client
        encoding settings, collation settings, and many others.

        :param dbapi_connection: a DBAPI connection.
         The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.

        :param connection_record: the :class:`.ConnectionPoolEntry` managing
         the DBAPI connection.

        Nr!   r+   r!   r!   r"   first_connecty   s    zPoolEvents.first_connectr
   )r)   r*   connection_proxyr   c                 C  s   dS )a  Called when a connection is retrieved from the Pool.

        :param dbapi_connection: a DBAPI connection.
         The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.

        :param connection_record: the :class:`.ConnectionPoolEntry` managing
         the DBAPI connection.

        :param connection_proxy: the :class:`.PoolProxiedConnection` object
          which will proxy the public interface of the DBAPI connection for the
          lifespan of the checkout.

        If you raise a :class:`~sqlalchemy.exc.DisconnectionError`, the current
        connection will be disposed and a fresh connection retrieved.
        Processing of all checkout listeners will abort and restart
        using the new connection.

        .. seealso:: :meth:`_events.ConnectionEvents.engine_connect`
           - a similar event
           which occurs upon creation of a new :class:`_engine.Connection`.

        Nr!   )r,   r)   r*   r/   r!   r!   r"   checkout   s    zPoolEvents.checkoutzOptional[DBAPIConnection]c                 C  s   dS )a  Called when a connection returns to the pool.

        Note that the connection may be closed, and may be None if the
        connection has been invalidated.  ``checkin`` will not be called
        for detached connections.  (They do not return to the pool.)

        :param dbapi_connection: a DBAPI connection.
         The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.

        :param connection_record: the :class:`.ConnectionPoolEntry` managing
         the DBAPI connection.

        Nr!   r+   r!   r!   r"   checkin   s    zPoolEvents.checkinz2.0r)   r*   c                 C  s   | |fS )Nr!   )r)   r*   reset_stater!   r!   r"   <lambda>   s    zPoolEvents.<lambda>r   )r)   r*   r2   r   c                 C  s   dS )a  Called before the "reset" action occurs for a pooled connection.

        This event represents
        when the ``rollback()`` method is called on the DBAPI connection
        before it is returned to the pool or discarded.
        A custom "reset" strategy may be implemented using this event hook,
        which may also be combined with disabling the default "reset"
        behavior using the :paramref:`_pool.Pool.reset_on_return` parameter.

        The primary difference between the :meth:`_events.PoolEvents.reset` and
        :meth:`_events.PoolEvents.checkin` events are that
        :meth:`_events.PoolEvents.reset` is called not just for pooled
        connections that are being returned to the pool, but also for
        connections that were detached using the
        :meth:`_engine.Connection.detach` method as well as asyncio connections
        that are being discarded due to garbage collection taking place on
        connections before the connection was checked in.

        Note that the event **is not** invoked for connections that were
        invalidated using :meth:`_engine.Connection.invalidate`.    These
        events may be intercepted using the :meth:`.PoolEvents.soft_invalidate`
        and :meth:`.PoolEvents.invalidate` event hooks, and all "connection
        close" events may be intercepted using :meth:`.PoolEvents.close`.

        The :meth:`_events.PoolEvents.reset` event is usually followed by the
        :meth:`_events.PoolEvents.checkin` event, except in those
        cases where the connection is discarded immediately after reset.

        :param dbapi_connection: a DBAPI connection.
         The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.

        :param connection_record: the :class:`.ConnectionPoolEntry` managing
         the DBAPI connection.

        :param reset_state: :class:`.PoolResetState` instance which provides
         information about the circumstances under which the connection
         is being reset.

         .. versionadded:: 2.0

        .. seealso::

            :ref:`pool_reset_on_return`

            :meth:`_events.ConnectionEvents.rollback`

            :meth:`_events.ConnectionEvents.commit`

        Nr!   )r,   r)   r*   r2   r!   r!   r"   reset   s    zPoolEvents.resetzOptional[BaseException])r)   r*   	exceptionr   c                 C  s   dS )a!  Called when a DBAPI connection is to be "invalidated".

        This event is called any time the
        :meth:`.ConnectionPoolEntry.invalidate` method is invoked, either from
        API usage or via "auto-invalidation", without the ``soft`` flag.

        The event occurs before a final attempt to call ``.close()`` on the
        connection occurs.

        :param dbapi_connection: a DBAPI connection.
         The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.

        :param connection_record: the :class:`.ConnectionPoolEntry` managing
         the DBAPI connection.

        :param exception: the exception object corresponding to the reason
         for this invalidation, if any.  May be ``None``.

        .. seealso::

            :ref:`pool_connection_invalidation`

        Nr!   r,   r)   r*   r5   r!   r!   r"   
invalidate  s    zPoolEvents.invalidatec                 C  s   dS )aN  Called when a DBAPI connection is to be "soft invalidated".

        This event is called any time the
        :meth:`.ConnectionPoolEntry.invalidate`
        method is invoked with the ``soft`` flag.

        Soft invalidation refers to when the connection record that tracks
        this connection will force a reconnect after the current connection
        is checked in.   It does not actively close the dbapi_connection
        at the point at which it is called.

        :param dbapi_connection: a DBAPI connection.
         The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.

        :param connection_record: the :class:`.ConnectionPoolEntry` managing
         the DBAPI connection.

        :param exception: the exception object corresponding to the reason
         for this invalidation, if any.  May be ``None``.

        Nr!   r6   r!   r!   r"   soft_invalidate$  s    zPoolEvents.soft_invalidatec                 C  s   dS )a  Called when a DBAPI connection is closed.

        The event is emitted before the close occurs.

        The close of a connection can fail; typically this is because
        the connection is already closed.  If the close operation fails,
        the connection is discarded.

        The :meth:`.close` event corresponds to a connection that's still
        associated with the pool. To intercept close events for detached
        connections use :meth:`.close_detached`.

        :param dbapi_connection: a DBAPI connection.
         The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.

        :param connection_record: the :class:`.ConnectionPoolEntry` managing
         the DBAPI connection.

        Nr!   r+   r!   r!   r"   close@  s    zPoolEvents.closec                 C  s   dS )a  Called when a DBAPI connection is "detached" from a pool.

        This event is emitted after the detach occurs.  The connection
        is no longer associated with the given connection record.

        :param dbapi_connection: a DBAPI connection.
         The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.

        :param connection_record: the :class:`.ConnectionPoolEntry` managing
         the DBAPI connection.

        Nr!   r+   r!   r!   r"   detachY  s    zPoolEvents.detach)r)   r   c                 C  s   dS )a  Called when a detached DBAPI connection is closed.

        The event is emitted before the close occurs.

        The close of a connection can fail; typically this is because
        the connection is already closed.  If the close operation fails,
        the connection is discarded.

        :param dbapi_connection: a DBAPI connection.
         The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.

        Nr!   )r,   r)   r!   r!   r"   close_detachedk  s    zPoolEvents.close_detachedN)__name__
__module____qualname____doc__Z_target_class_docr	   Z_dispatch_targetr   Zpreload_moduleclassmethodr#   r(   r-   r.   r0   r1   r   Z_legacy_signaturer4   r7   r8   r9   r:   r;   r!   r!   r!   r"   r      s.   !8r   )
__future__r   r   r   r   r   r   baser   r	   r
   r    r   r   r   r   r   Zengine.interfacesr   ZEventsr   r!   r!   r!   r"   <module>   s   