
    h                        d Z ddlmZ ddlmZ ddlmZ  edd      Z eg g g g g       Z G d de	      Z
 G d	 d
e
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Zd Zd Zd Z eg d      Z G d de	      Z G d de      Z G d de      Z G d de      Z G d d e	      Z G d! d"e      Z G d# d$e      Z G d% d&e      Z G d' d(e	      Z G d) d*e	      Z G d+ d,e	      Z G d- d.e      Z  G d/ d0e      Z! G d1 d2e      Z" G d3 d4e	      Z# G d5 d6e	      Z$ G d7 d8e      Z% G d9 d:e      Z& G d; d<e	      Z' G d= d>e'      Z( G d? d@e'      Z) G dA dBe'      Z* G dC dDe	      Z+ G dE dFe+      Z, G dG dHe+      Z- G dI dJe+      Z. G dK dLe	      Z/ G dM dNe/      Z0 G dO dPe/      Z1 G dQ dRe/      Z2 G dS dTe	      Z3yU)Va  Tools to monitor driver events.

.. versionadded:: 3.1

.. attention:: Starting in PyMongo 3.11, the monitoring classes outlined below
    are included in the PyMongo distribution under the
    :mod:`~pymongo.event_loggers` submodule.

Use :func:`register` to register global listeners for specific events.
Listeners must inherit from one of the abstract classes below and implement
the correct functions for that class.

For example, a simple command logger might be implemented like this::

    import logging

    from pymongo import monitoring

    class CommandLogger(monitoring.CommandListener):

        def started(self, event):
            logging.info("Command {0.command_name} with request id "
                         "{0.request_id} started on server "
                         "{0.connection_id}".format(event))

        def succeeded(self, event):
            logging.info("Command {0.command_name} with request id "
                         "{0.request_id} on server {0.connection_id} "
                         "succeeded in {0.duration_micros} "
                         "microseconds".format(event))

        def failed(self, event):
            logging.info("Command {0.command_name} with request id "
                         "{0.request_id} on server {0.connection_id} "
                         "failed in {0.duration_micros} "
                         "microseconds".format(event))

    monitoring.register(CommandLogger())

Server discovery and monitoring events are also available. For example::

    class ServerLogger(monitoring.ServerListener):

        def opened(self, event):
            logging.info("Server {0.server_address} added to topology "
                         "{0.topology_id}".format(event))

        def description_changed(self, event):
            previous_server_type = event.previous_description.server_type
            new_server_type = event.new_description.server_type
            if new_server_type != previous_server_type:
                # server_type_name was added in PyMongo 3.4
                logging.info(
                    "Server {0.server_address} changed type from "
                    "{0.previous_description.server_type_name} to "
                    "{0.new_description.server_type_name}".format(event))

        def closed(self, event):
            logging.warning("Server {0.server_address} removed from topology "
                            "{0.topology_id}".format(event))


    class HeartbeatLogger(monitoring.ServerHeartbeatListener):

        def started(self, event):
            logging.info("Heartbeat sent to server "
                         "{0.connection_id}".format(event))

        def succeeded(self, event):
            # The reply.document attribute was added in PyMongo 3.4.
            logging.info("Heartbeat to server {0.connection_id} "
                         "succeeded with reply "
                         "{0.reply.document}".format(event))

        def failed(self, event):
            logging.warning("Heartbeat to server {0.connection_id} "
                            "failed with error {0.reply}".format(event))

    class TopologyLogger(monitoring.TopologyListener):

        def opened(self, event):
            logging.info("Topology with id {0.topology_id} "
                         "opened".format(event))

        def description_changed(self, event):
            logging.info("Topology description updated for "
                         "topology id {0.topology_id}".format(event))
            previous_topology_type = event.previous_description.topology_type
            new_topology_type = event.new_description.topology_type
            if new_topology_type != previous_topology_type:
                # topology_type_name was added in PyMongo 3.4
                logging.info(
                    "Topology {0.topology_id} changed type from "
                    "{0.previous_description.topology_type_name} to "
                    "{0.new_description.topology_type_name}".format(event))
            # The has_writable_server and has_readable_server methods
            # were added in PyMongo 3.4.
            if not event.new_description.has_writable_server():
                logging.warning("No writable servers available.")
            if not event.new_description.has_readable_server():
                logging.warning("No readable servers available.")

        def closed(self, event):
            logging.info("Topology with id {0.topology_id} "
                         "closed".format(event))

Connection monitoring and pooling events are also available. For example::

    class ConnectionPoolLogger(ConnectionPoolListener):

        def pool_created(self, event):
            logging.info("[pool {0.address}] pool created".format(event))

        def pool_cleared(self, event):
            logging.info("[pool {0.address}] pool cleared".format(event))

        def pool_closed(self, event):
            logging.info("[pool {0.address}] pool closed".format(event))

        def connection_created(self, event):
            logging.info("[pool {0.address}][conn #{0.connection_id}] "
                         "connection created".format(event))

        def connection_ready(self, event):
            logging.info("[pool {0.address}][conn #{0.connection_id}] "
                         "connection setup succeeded".format(event))

        def connection_closed(self, event):
            logging.info("[pool {0.address}][conn #{0.connection_id}] "
                         "connection closed, reason: "
                         "{0.reason}".format(event))

        def connection_check_out_started(self, event):
            logging.info("[pool {0.address}] connection check out "
                         "started".format(event))

        def connection_check_out_failed(self, event):
            logging.info("[pool {0.address}] connection check out "
                         "failed, reason: {0.reason}".format(event))

        def connection_checked_out(self, event):
            logging.info("[pool {0.address}][conn #{0.connection_id}] "
                         "connection checked out of pool".format(event))

        def connection_checked_in(self, event):
            logging.info("[pool {0.address}][conn #{0.connection_id}] "
                         "connection checked into pool".format(event))


Event listeners can also be registered per instance of
:class:`~pymongo.mongo_client.MongoClient`::

    client = MongoClient(event_listeners=[CommandLogger()])

Note that previously registered global listeners are automatically included
when configuring per client event listeners. Registering a new global listener
will not add that listener to existing client instances.

.. note:: Events are delivered **synchronously**. Application threads block
  waiting for event handlers (e.g. :meth:`~CommandListener.started`) to
  return. Care must be taken to ensure that your event handlers are efficient
  enough to not adversely affect overall application performance.

.. warning:: The command documents published through this API are *not* copies.
  If you intend to modify them in any way you must copy them in your event
  handler first.
    )
namedtuple)abc)_handle_exception	Listeners)command_listenersserver_listenersserver_heartbeat_listenerstopology_listenerscmap_listenersc                       e Zd ZdZy)_EventListenerz,Abstract base class for all event listeners.N)__name__
__module____qualname____doc__     U/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/pymongo/monitoring.pyr   r      s    6r   r   c                   "    e Zd ZdZd Zd Zd Zy)CommandListenerzAbstract base class for command listeners.

    Handles `CommandStartedEvent`, `CommandSucceededEvent`,
    and `CommandFailedEvent`.
    c                     t         )zAbstract method to handle a `CommandStartedEvent`.

        :Parameters:
          - `event`: An instance of :class:`CommandStartedEvent`.
        NotImplementedErrorselfevents     r   startedzCommandListener.started   
     "!r   c                     t         )zAbstract method to handle a `CommandSucceededEvent`.

        :Parameters:
          - `event`: An instance of :class:`CommandSucceededEvent`.
        r   r   s     r   	succeededzCommandListener.succeeded   r   r   c                     t         )zAbstract method to handle a `CommandFailedEvent`.

        :Parameters:
          - `event`: An instance of :class:`CommandFailedEvent`.
        r   r   s     r   failedzCommandListener.failed   r   r   Nr   r   r   r   r   r    r"   r   r   r   r   r      s    """r   r   c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)ConnectionPoolListenera-  Abstract base class for connection pool listeners.

    Handles all of the connection pool events defined in the Connection
    Monitoring and Pooling Specification:
    :class:`PoolCreatedEvent`, :class:`PoolClearedEvent`,
    :class:`PoolClosedEvent`, :class:`ConnectionCreatedEvent`,
    :class:`ConnectionReadyEvent`, :class:`ConnectionClosedEvent`,
    :class:`ConnectionCheckOutStartedEvent`,
    :class:`ConnectionCheckOutFailedEvent`,
    :class:`ConnectionCheckedOutEvent`,
    and :class:`ConnectionCheckedInEvent`.

    .. versionadded:: 3.9
    c                     t         )zAbstract method to handle a :class:`PoolCreatedEvent`.

        Emitted when a Connection Pool is created.

        :Parameters:
          - `event`: An instance of :class:`PoolCreatedEvent`.
        r   r   s     r   pool_createdz#ConnectionPoolListener.pool_created   
     "!r   c                     t         )zAbstract method to handle a `PoolClearedEvent`.

        Emitted when a Connection Pool is cleared.

        :Parameters:
          - `event`: An instance of :class:`PoolClearedEvent`.
        r   r   s     r   pool_clearedz#ConnectionPoolListener.pool_cleared  r(   r   c                     t         )zAbstract method to handle a `PoolClosedEvent`.

        Emitted when a Connection Pool is closed.

        :Parameters:
          - `event`: An instance of :class:`PoolClosedEvent`.
        r   r   s     r   pool_closedz"ConnectionPoolListener.pool_closed  r(   r   c                     t         )zAbstract method to handle a :class:`ConnectionCreatedEvent`.

        Emitted when a Connection Pool creates a Connection object.

        :Parameters:
          - `event`: An instance of :class:`ConnectionCreatedEvent`.
        r   r   s     r   connection_createdz)ConnectionPoolListener.connection_created  r(   r   c                     t         )zAbstract method to handle a :class:`ConnectionReadyEvent`.

        Emitted when a Connection has finished its setup, and is now ready to
        use.

        :Parameters:
          - `event`: An instance of :class:`ConnectionReadyEvent`.
        r   r   s     r   connection_readyz'ConnectionPoolListener.connection_ready   
     "!r   c                     t         )zAbstract method to handle a :class:`ConnectionClosedEvent`.

        Emitted when a Connection Pool closes a Connection.

        :Parameters:
          - `event`: An instance of :class:`ConnectionClosedEvent`.
        r   r   s     r   connection_closedz(ConnectionPoolListener.connection_closed+  r(   r   c                     t         )zAbstract method to handle a :class:`ConnectionCheckOutStartedEvent`.

        Emitted when the driver starts attempting to check out a connection.

        :Parameters:
          - `event`: An instance of :class:`ConnectionCheckOutStartedEvent`.
        r   r   s     r   connection_check_out_startedz3ConnectionPoolListener.connection_check_out_started5  r(   r   c                     t         )zAbstract method to handle a :class:`ConnectionCheckOutFailedEvent`.

        Emitted when the driver's attempt to check out a connection fails.

        :Parameters:
          - `event`: An instance of :class:`ConnectionCheckOutFailedEvent`.
        r   r   s     r   connection_check_out_failedz2ConnectionPoolListener.connection_check_out_failed?  r(   r   c                     t         )zAbstract method to handle a :class:`ConnectionCheckedOutEvent`.

        Emitted when the driver successfully checks out a Connection.

        :Parameters:
          - `event`: An instance of :class:`ConnectionCheckedOutEvent`.
        r   r   s     r   connection_checked_outz-ConnectionPoolListener.connection_checked_outI  r(   r   c                     t         )a  Abstract method to handle a :class:`ConnectionCheckedInEvent`.

        Emitted when the driver checks in a Connection back to the Connection
        Pool.

        :Parameters:
          - `event`: An instance of :class:`ConnectionCheckedInEvent`.
        r   r   s     r   connection_checked_inz,ConnectionPoolListener.connection_checked_inS  r1   r   N)r   r   r   r   r'   r*   r,   r.   r0   r3   r5   r7   r9   r;   r   r   r   r%   r%      s9    """"	"""""	"r   r%   c                   "    e Zd ZdZd Zd Zd Zy)ServerHeartbeatListenerzAbstract base class for server heartbeat listeners.

    Handles `ServerHeartbeatStartedEvent`, `ServerHeartbeatSucceededEvent`,
    and `ServerHeartbeatFailedEvent`.

    .. versionadded:: 3.3
    c                     t         )zAbstract method to handle a `ServerHeartbeatStartedEvent`.

        :Parameters:
          - `event`: An instance of :class:`ServerHeartbeatStartedEvent`.
        r   r   s     r   r   zServerHeartbeatListener.startedh  r   r   c                     t         )zAbstract method to handle a `ServerHeartbeatSucceededEvent`.

        :Parameters:
          - `event`: An instance of :class:`ServerHeartbeatSucceededEvent`.
        r   r   s     r   r    z!ServerHeartbeatListener.succeededp  r   r   c                     t         )zAbstract method to handle a `ServerHeartbeatFailedEvent`.

        :Parameters:
          - `event`: An instance of :class:`ServerHeartbeatFailedEvent`.
        r   r   s     r   r"   zServerHeartbeatListener.failedx  r   r   Nr#   r   r   r   r=   r=   _  s    """r   r=   c                   "    e Zd ZdZd Zd Zd Zy)TopologyListenerzAbstract base class for topology monitoring listeners.
    Handles `TopologyOpenedEvent`, `TopologyDescriptionChangedEvent`, and
    `TopologyClosedEvent`.

    .. versionadded:: 3.3
    c                     t         )zAbstract method to handle a `TopologyOpenedEvent`.

        :Parameters:
          - `event`: An instance of :class:`TopologyOpenedEvent`.
        r   r   s     r   openedzTopologyListener.opened  r   r   c                     t         )zAbstract method to handle a `TopologyDescriptionChangedEvent`.

        :Parameters:
          - `event`: An instance of :class:`TopologyDescriptionChangedEvent`.
        r   r   s     r   description_changedz$TopologyListener.description_changed  r   r   c                     t         )zAbstract method to handle a `TopologyClosedEvent`.

        :Parameters:
          - `event`: An instance of :class:`TopologyClosedEvent`.
        r   r   s     r   closedzTopologyListener.closed  r   r   Nr   r   r   r   rD   rF   rH   r   r   r   rB   rB         """r   rB   c                   "    e Zd ZdZd Zd Zd Zy)ServerListenerzAbstract base class for server listeners.
    Handles `ServerOpeningEvent`, `ServerDescriptionChangedEvent`, and
    `ServerClosedEvent`.

    .. versionadded:: 3.3
    c                     t         )zAbstract method to handle a `ServerOpeningEvent`.

        :Parameters:
          - `event`: An instance of :class:`ServerOpeningEvent`.
        r   r   s     r   rD   zServerListener.opened  r   r   c                     t         )zAbstract method to handle a `ServerDescriptionChangedEvent`.

        :Parameters:
          - `event`: An instance of :class:`ServerDescriptionChangedEvent`.
        r   r   s     r   rF   z"ServerListener.description_changed  r   r   c                     t         )zAbstract method to handle a `ServerClosedEvent`.

        :Parameters:
          - `event`: An instance of :class:`ServerClosedEvent`.
        r   r   s     r   rH   zServerListener.closed  r   r   NrI   r   r   r   rL   rL     rJ   r   rL   c                 :    t        | j                         dz        S )z'Convert duration 'dur' to microseconds.g    .A)inttotal_seconds)durs    r   
_to_microsrT     s    s  "T)**r   c                     t        |t        j                        st        | d      |D ]!  }t        |t              rt        d| d       |S )zValidate event listenersz must be a list or tupleListeners for x must be either a CommandListener, ServerHeartbeatListener, ServerListener, TopologyListener, or ConnectionPoolListener.)
isinstancer   Sequence	TypeErrorr   )option	listenerslisteners      r   _validate_event_listenersr^     s\    i.@AA C(N3 :@B C CC r   c                    t        | t              st        d| d      t        | t              rt        j
                  j                  |        t        | t              rt        j                  j                  |        t        | t              rt        j                  j                  |        t        | t              rt        j                  j                  |        t        | t              r t        j                  j                  |        yy)a   Register a global event listener.

    :Parameters:
      - `listener`: A subclasses of :class:`CommandListener`,
        :class:`ServerHeartbeatListener`, :class:`ServerListener`,
        :class:`TopologyListener`, or :class:`ConnectionPoolListener`.
    rV   rW   N)rX   r   rZ   r   
_LISTENERSr   appendr=   r	   rL   r   rB   r
   r%   r   )r]   s    r   registerrb     s     h/ 6>@ A 	A (O,$$++H5(34--44X>(N+##**84(,-%%,,X6(23!!((2 4r   )	authenticate	saslstartsaslcontinuegetnonce
createuser
updateusercopydbgetnoncecopydbsaslstartcopydbc                   Z    e Zd ZdZdZd Zed        Zed        Zed        Z	ed        Z
y)	_CommandEventzBase class for command events.)
__cmd_name	__rqst_id	__conn_id__op_idc                 <    || _         || _        || _        || _        y N)_CommandEvent__cmd_name_CommandEvent__rqst_id_CommandEvent__conn_id_CommandEvent__op_id)r   command_name
request_idconnection_idoperation_ids        r   __init__z_CommandEvent.__init__  s    &#&#r   c                     | j                   S )zThe command name.)rt   r   s    r   rx   z_CommandEvent.command_name        r   c                     | j                   S )z"The request id for this operation.)ru   r~   s    r   ry   z_CommandEvent.request_id       ~~r   c                     | j                   S )z@The address (host, port) of the server this command was sent to.)rv   r~   s    r   rz   z_CommandEvent.connection_id
  r   r   c                     | j                   S )z(An id for this series of events or None.)rw   r~   s    r   r{   z_CommandEvent.operation_id       ||r   N)r   r   r   r   	__slots__r|   propertyrx   ry   rz   r{   r   r   r   rm   rm     s_    (CI$        r   rm   c                   L     e Zd ZdZdZ fdZed        Zed        Zd Z	 xZ
S )CommandStartedEventa  Event published when a command starts.

    :Parameters:
      - `command`: The command document.
      - `database_name`: The name of the database this command was run against.
      - `request_id`: The request id for this operation.
      - `connection_id`: The address (host, port) of the server this command
        was sent to.
      - `operation_id`: An optional identifier for a series of related events.
    )__cmd__dbc                     |st        |d      t        t        |            }t        t        |   |g|  |j                         t        v ri | _        || _	        y || _        || _	        y )Nz is not a valid command)

ValueErrornextitersuperr   r|   lower_SENSITIVE_COMMANDS_CommandStartedEvent__cmd_CommandStartedEvent__db)r   commanddatabase_nameargsrx   	__class__s        r   r|   zCommandStartedEvent.__init__"  si    GEFFDM*!41,FF#66DJ "	 !DJ!	r   c                     | j                   S )zThe command document.)r   r~   s    r   r   zCommandStartedEvent.command.  s     zzr   c                     | j                   S )z6The name of the database this command was run against.)r   r~   s    r   r   z!CommandStartedEvent.database_name3  s     yyr   c                     d| j                   j                  d| j                  d| j                  d| j                  d| j
                  dS )N< z db: z, command: , operation_id: >)r   r   rz   r   rx   r{   r~   s    r   __repr__zCommandStartedEvent.__repr__8  s:    NN##T%7%79K9Kt002 	2r   )r   r   r   r   r   r|   r   r   r   r   __classcell__r   s   @r   r   r     sA    	 "I
"    2r   r   c                   L     e Zd ZdZdZ fdZed        Zed        Zd Z	 xZ
S )CommandSucceededEventa  Event published when a command succeeds.

    :Parameters:
      - `duration`: The command duration as a datetime.timedelta.
      - `reply`: The server reply document.
      - `command_name`: The command name.
      - `request_id`: The request id for this operation.
      - `connection_id`: The address (host, port) of the server this command
        was sent to.
      - `operation_id`: An optional identifier for a series of related events.
    )__duration_micros__replyc                     t         t        |   ||||       t        |      | _        |j                         t        v ri | _        y || _        y rs   )r   r   r|   rT   '_CommandSucceededEvent__duration_microsr   r   _CommandSucceededEvent__reply)r   durationreplyrx   ry   rz   r{   r   s          r   r|   zCommandSucceededEvent.__init__L  sJ    #T3*m\	C!+H!5#66DL DLr   c                     | j                   S z/The duration of this operation in microseconds.)r   r~   s    r   duration_microsz%CommandSucceededEvent.duration_microsV       %%%r   c                     | j                   S z/The server failure document for this operation.)r   r~   s    r   r   zCommandSucceededEvent.reply[  r   r   c                     d| j                   j                  d| j                  d| j                  d| j                  d| j
                  dS )Nr   r   
 command: r   , duration_micros: r   )r   r   rz   rx   r{   r   r~   s    r   r   zCommandSucceededEvent.__repr__`  s<    NN##T%7%7t00$2F2FH 	Hr   )r   r   r   r   r   r|   r   r   r   r   r   r   s   @r   r   r   >  sB    
 1I! & &  Hr   r   c                   L     e Zd ZdZdZ fdZed        Zed        Zd Z	 xZ
S )CommandFailedEventa  Event published when a command fails.

    :Parameters:
      - `duration`: The command duration as a datetime.timedelta.
      - `failure`: The server reply document.
      - `command_name`: The command name.
      - `request_id`: The request id for this operation.
      - `connection_id`: The address (host, port) of the server this command
        was sent to.
      - `operation_id`: An optional identifier for a series of related events.
    )r   	__failurec                 T    t        t        | 
  |  t        |      | _        || _        y rs   )r   r   r|   rT   $_CommandFailedEvent__duration_micros_CommandFailedEvent__failure)r   r   failurer   r   s       r   r|   zCommandFailedEvent.__init__t  s'     $0$7!+H!5 r   c                     | j                   S r   )r   r~   s    r   r   z"CommandFailedEvent.duration_microsy  r   r   c                     | j                   S r   )r   r~   s    r   r   zCommandFailedEvent.failure~  r   r   c                     d| j                   j                  d| j                  d| j                  d| j                  d| j
                  d| j                  dS )Nr   r   r   r   r   z, failure: r   )r   r   rz   rx   r{   r   r   r~   s    r   r   zCommandFailedEvent.__repr__  sD     ''););T=N=N!!4#7#7G	Hr   )r   r   r   r   r   r|   r   r   r   r   r   r   s   @r   r   r   f  sB    
 3I!
 & &  Hr   r   c                   0    e Zd ZdZdZd Zed        Zd Zy)
_PoolEventzBase class for pool events.	__addressc                     || _         y rs   _PoolEvent__addressr   addresss     r   r|   z_PoolEvent.__init__  	     r   c                     | j                   S )zbThe address (host, port) pair of the server the pool is attempting
        to connect to.
        r   r~   s    r   r   z_PoolEvent.address      
 ~~r   c                 N    | j                   j                  d| j                  dS N())r   r   r   r~   s    r   r   z_PoolEvent.__repr__      >>22DNNCCr   N	r   r   r   r   r   r|   r   r   r   r   r   r   r   r     s)    %I!  Dr   r   c                   <     e Zd ZdZdZ fdZed        Zd Z xZ	S )PoolCreatedEventzPublished when a Connection Pool is created.

    :Parameters:
     - `address`: The address (host, port) pair of the server this Pool is
       attempting to connect to.

    .. versionadded:: 3.9
    )	__optionsc                 :    t         t        |   |       || _        y rs   )r   r   r|   _PoolCreatedEvent__options)r   r   optionsr   s      r   r|   zPoolCreatedEvent.__init__  s    .w7 r   c                     | j                   S )zLAny non-default pool options that were set on this Connection Pool.
        )r   r~   s    r   r   zPoolCreatedEvent.options  s     ~~r   c                 h    | j                   j                  d| j                  d| j                  dS Nr   z, r   )r   r   r   r   r~   s    r   r   zPoolCreatedEvent.__repr__  s'    NN##T\\4>>C 	Cr   )
r   r   r   r   r   r|   r   r   r   r   r   s   @r   r   r     s.     I!  
Cr   r   c                       e Zd ZdZdZy)PoolClearedEventzPublished when a Connection Pool is cleared.

    :Parameters:
     - `address`: The address (host, port) pair of the server this Pool is
       attempting to connect to.

    .. versionadded:: 3.9
    r   Nr   r   r   r   r   r   r   r   r   r          Ir   r   c                       e Zd ZdZdZy)PoolClosedEventzPublished when a Connection Pool is closed.

    :Parameters:
     - `address`: The address (host, port) pair of the server this Pool is
       attempting to connect to.

    .. versionadded:: 3.9
    r   Nr   r   r   r   r   r     r   r   r   c                   &    e Zd ZdZdZ	 dZ	 dZ	 dZy)ConnectionClosedReasonzqAn enum that defines values for `reason` on a
    :class:`ConnectionClosedEvent`.

    .. versionadded:: 3.9
    staleidleerror
poolClosedN)r   r   r   r   STALEIDLEERRORPOOL_CLOSEDr   r   r   r   r     s-     EFD EIKEr   r   c                        e Zd ZdZdZ	 dZ	 dZy)ConnectionCheckOutFailedReasonzyAn enum that defines values for `reason` on a
    :class:`ConnectionCheckOutFailedEvent`.

    .. versionadded:: 3.9
    timeoutr   connectionErrorN)r   r   r   r   TIMEOUTr   
CONN_ERRORr   r   r   r   r     s#     GJKM"Jr   r   c                   @    e Zd ZdZdZd Zed        Zed        Zd Z	y)_ConnectionEventz.Private base class for some connection events.)r   __connection_idc                      || _         || _        y rs   )_ConnectionEvent__address_ConnectionEvent__connection_id)r   r   rz   s      r   r|   z_ConnectionEvent.__init__  s     ,r   c                     | j                   S ziThe address (host, port) pair of the server this connection is
        attempting to connect to.
        )r   r~   s    r   r   z_ConnectionEvent.address  r   r   c                     | j                   S )zThe ID of the Connection.)r   r~   s    r   rz   z_ConnectionEvent.connection_id  s     ###r   c                 h    | j                   j                  d| j                  d| j                  dS r   )r   r   r   r   r~   s    r   r   z_ConnectionEvent.__repr__  s)    NN##T^^T5I5IK 	Kr   N)
r   r   r   r   r   r|   r   r   rz   r   r   r   r   r   r     s=    80I-   $ $Kr   r   c                       e Zd ZdZdZy)ConnectionCreatedEventa  Published when a Connection Pool creates a Connection object.

    NOTE: This connection is not ready for use until the
    :class:`ConnectionReadyEvent` is published.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.
     - `connection_id`: The integer ID of the Connection in this Pool.

    .. versionadded:: 3.9
    r   Nr   r   r   r   r   r     s     Ir   r   c                       e Zd ZdZdZy)ConnectionReadyEventa3  Published when a Connection has finished its setup, and is ready to use.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.
     - `connection_id`: The integer ID of the Connection in this Pool.

    .. versionadded:: 3.9
    r   Nr   r   r   r   r   r           Ir   r   c                   <     e Zd ZdZdZ fdZed        Zd Z xZ	S )ConnectionClosedEventaV  Published when a Connection is closed.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.
     - `connection_id`: The integer ID of the Connection in this Pool.
     - `reason`: A reason explaining why this connection was closed.

    .. versionadded:: 3.9
    )__reasonc                 <    t         t        |   ||       || _        y rs   )r   r   r|   _ConnectionClosedEvent__reason)r   r   rz   reasonr   s       r   r|   zConnectionClosedEvent.__init__:  s    #T3G]Kr   c                     | j                   S )zA reason explaining why this connection was closed.

        The reason must be one of the strings from the
        :class:`ConnectionClosedReason` enum.
        )r  r~   s    r   r  zConnectionClosedEvent.reason>       }}r   c                     | j                   j                  d| j                  d| j                  d| j                  dS r   )r   r   r   rz   r  r~   s    r   r   zConnectionClosedEvent.__repr__G  s.    NN##T\\43E3EMM 	r   )
r   r   r   r   r   r|   r   r  r   r   r   s   @r   r   r   -  s-    	 I  r   r   c                   0    e Zd ZdZdZd Zed        Zd Zy)ConnectionCheckOutStartedEventzPublished when the driver starts attempting to check out a connection.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.

    .. versionadded:: 3.9
    r   c                     || _         y rs   (_ConnectionCheckOutStartedEvent__addressr   s     r   r|   z'ConnectionCheckOutStartedEvent.__init__X  r   r   c                     | j                   S r   r
  r~   s    r   r   z&ConnectionCheckOutStartedEvent.address[  r   r   c                 N    | j                   j                  d| j                  dS r   )r   r   r  r~   s    r   r   z'ConnectionCheckOutStartedEvent.__repr__b  r   r   Nr   r   r   r   r  r  M  s-     I!  Dr   r  c                   @    e Zd ZdZdZd Zed        Zed        Zd Z	y)ConnectionCheckOutFailedEventa.  Published when the driver's attempt to check out a connection fails.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.
     - `reason`: A reason explaining why connection check out failed.

    .. versionadded:: 3.9
    )r   r   c                      || _         || _        y rs   )'_ConnectionCheckOutFailedEvent__address&_ConnectionCheckOutFailedEvent__reason)r   r   r  s      r   r|   z&ConnectionCheckOutFailedEvent.__init__r  s     r   c                     | j                   S r   )r  r~   s    r   r   z%ConnectionCheckOutFailedEvent.addressv  r   r   c                     | j                   S )zA reason explaining why connection check out failed.

        The reason must be one of the strings from the
        :class:`ConnectionCheckOutFailedReason` enum.
        )r  r~   s    r   r  z$ConnectionCheckOutFailedEvent.reason}  r  r   c                 h    | j                   j                  d| j                  d| j                  dS r   )r   r   r  r  r~   s    r   r   z&ConnectionCheckOutFailedEvent.__repr__  s'    NN##T^^T]]D 	Dr   N)
r   r   r   r   r   r|   r   r   r  r   r   r   r   r  r  f  sA     *I    Dr   r  c                       e Zd ZdZdZy)ConnectionCheckedOutEventa*  Published when the driver successfully checks out a Connection.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.
     - `connection_id`: The integer ID of the Connection in this Pool.

    .. versionadded:: 3.9
    r   Nr   r   r   r   r  r    r   r   r  c                       e Zd ZdZdZy)ConnectionCheckedInEventa*  Published when the driver checks in a Connection into the Pool.

    :Parameters:
     - `address`: The address (host, port) pair of the server this
       Connection is attempting to connect to.
     - `connection_id`: The integer ID of the Connection in this Pool.

    .. versionadded:: 3.9
    r   Nr   r   r   r   r  r    r   r   r  c                   @    e Zd ZdZdZd Zed        Zed        Zd Z	y)_ServerEventzBase class for server events.)__server_address__topology_idc                      || _         || _        y rs   )_ServerEvent__server_address_ServerEvent__topology_id)r   server_addresstopology_ids      r   r|   z_ServerEvent.__init__  s     .(r   c                     | j                   S )z+The address (host, port) pair of the server)r  r~   s    r   r!  z_ServerEvent.server_address  s     $$$r   c                     | j                   S z>A unique identifier for the topology this server is a part of.)r   r~   s    r   r"  z_ServerEvent.topology_id       !!!r   c                 j    d| j                   j                  d| j                  d| j                  dS )Nr   r    topology_id: r   )r   r   r!  r"  r~   s    r   r   z_ServerEvent.__repr__  s+    NN##T%8%8$:J:JL 	Lr   N)
r   r   r   r   r   r|   r   r!  r"  r   r   r   r   r  r    s=    '5I) % % " "Lr   r  c                   L     e Zd ZdZdZ fdZed        Zed        Zd Z	 xZ
S )ServerDescriptionChangedEventzJPublished when server description changes.

    .. versionadded:: 3.3
    __previous_description__new_descriptionc                 B    t        t        | 
  |  || _        || _        y rs   )r   r*  r|   4_ServerDescriptionChangedEvent__previous_description/_ServerDescriptionChangedEvent__new_descriptionr   previous_descriptionnew_descriptionr   r   s       r   r|   z&ServerDescriptionChangedEvent.__init__  s#    +T;TB&:#!0r   c                     | j                   S )zLThe previous
        :class:`~pymongo.server_description.ServerDescription`.)r/  r~   s    r   r2  z2ServerDescriptionChangedEvent.previous_description       ***r   c                     | j                   S )zGThe new
        :class:`~pymongo.server_description.ServerDescription`.)r0  r~   s    r   r3  z-ServerDescriptionChangedEvent.new_description       %%%r   c           	          d| j                   j                  d| j                  d| j                  d| j                  d	S )Nr   r    changed from: , to: r   )r   r   r!  r2  r3  r~   s    r   r   z&ServerDescriptionChangedEvent.__repr__  s2    NN##T%8%8%%t';';= 	=r   r   r   r   r   r   r|   r   r2  r3  r   r   r   s   @r   r*  r*    B    
 @I1
 + +
 & &
=r   r*  c                       e Zd ZdZdZy)ServerOpeningEventzEPublished when server is initialized.

    .. versionadded:: 3.3
    r   Nr   r   r   r   r>  r>        
 Ir   r>  c                       e Zd ZdZdZy)ServerClosedEventz@Published when server is closed.

    .. versionadded:: 3.3
    r   Nr   r   r   r   rA  rA    r?  r   rA  c                   0    e Zd ZdZdZd Zed        Zd Zy)TopologyEventz+Base class for topology description events.r  c                     || _         y rs   _TopologyEvent__topology_id)r   r"  s     r   r|   zTopologyEvent.__init__  s
    (r   c                     | j                   S r%  rE  r~   s    r   r"  zTopologyEvent.topology_id  r&  r   c                 P    d| j                   j                  d| j                  dS )Nr   r(  r   )r   r   r"  r~   s    r   r   zTopologyEvent.__repr__  s!    NN##T%5%57 	7r   N)	r   r   r   r   r   r|   r   r"  r   r   r   r   rC  rC    s(    5 I) " "7r   rC  c                   L     e Zd ZdZdZ fdZed        Zed        Zd Z	 xZ
S )TopologyDescriptionChangedEventzPPublished when the topology description changes.

    .. versionadded:: 3.3
    r+  c                 B    t        t        | 
  |  || _        || _        y rs   )r   rJ  r|   6_TopologyDescriptionChangedEvent__previous_description1_TopologyDescriptionChangedEvent__new_descriptionr1  s       r   r|   z(TopologyDescriptionChangedEvent.__init__  s#    -t=tD&:#!0r   c                     | j                   S )zPThe previous
        :class:`~pymongo.topology_description.TopologyDescription`.)rL  r~   s    r   r2  z4TopologyDescriptionChangedEvent.previous_description  r5  r   c                     | j                   S )zKThe new
        :class:`~pymongo.topology_description.TopologyDescription`.)rM  r~   s    r   r3  z/TopologyDescriptionChangedEvent.new_description  r7  r   c           	          d| j                   j                  d| j                  d| j                  d| j                  d	S )Nr   r(  r9  r:  r   )r   r   r"  r2  r3  r~   s    r   r   z(TopologyDescriptionChangedEvent.__repr__  s2    NN##T%5%5%%t';';= 	=r   r;  r   s   @r   rJ  rJ     r<  r   rJ  c                       e Zd ZdZdZy)TopologyOpenedEventzKPublished when the topology is initialized.

    .. versionadded:: 3.3
    r   Nr   r   r   r   rR  rR    r?  r   rR  c                       e Zd ZdZdZy)TopologyClosedEventzFPublished when the topology is closed.

    .. versionadded:: 3.3
    r   Nr   r   r   r   rT  rT  (  r?  r   rT  c                   0    e Zd ZdZdZd Zed        Zd Zy)_ServerHeartbeatEventz'Base class for server heartbeat events.r   c                     || _         y rs   $_ServerHeartbeatEvent__connection_id)r   rz   s     r   r|   z_ServerHeartbeatEvent.__init__6  s
    ,r   c                     | j                   S )zJThe address (host, port) of the server this heartbeat was sent
        to.rX  r~   s    r   rz   z#_ServerHeartbeatEvent.connection_id9  s     ###r   c                 P    d| j                   j                  d| j                  dS )Nr   r   r   )r   r   rz   r~   s    r   r   z_ServerHeartbeatEvent.__repr__?  s     NN33T5G5GHHr   N)	r   r   r   r   r   r|   r   rz   r   r   r   r   rV  rV  1  s)    1"I- $ $
Ir   rV  c                       e Zd ZdZdZy)ServerHeartbeatStartedEventzFPublished when a heartbeat is started.

    .. versionadded:: 3.3
    r   Nr   r   r   r   r]  r]  C  r?  r   r]  c                   ^     e Zd ZdZdZd fd	Zed        Zed        Zed        Z	d Z
 xZS )	ServerHeartbeatSucceededEventzIFired when the server heartbeat succeeds.

    .. versionadded:: 3.3
    
__durationr   	__awaitedc                 V    t         t        |   |       || _        || _        || _        y rs   )r   r_  r|   (_ServerHeartbeatSucceededEvent__duration%_ServerHeartbeatSucceededEvent__reply'_ServerHeartbeatSucceededEvent__awaitedr   r   r   rz   awaitedr   s        r   r|   z&ServerHeartbeatSucceededEvent.__init__T  s(    +T;MJ" r   c                     | j                   S z/The duration of this heartbeat in microseconds.)rd  r~   s    r   r   z&ServerHeartbeatSucceededEvent.durationZ  r   r   c                     | j                   S )z3An instance of :class:`~pymongo.ismaster.IsMaster`.)re  r~   s    r   r   z#ServerHeartbeatSucceededEvent.reply_  r   r   c                     | j                   S zWhether the heartbeat was awaited.

        If true, then :meth:`duration` reflects the sum of the round trip time
        to the server and the time that the server waited before sending a
        response.
        )rf  r~   s    r   rh  z%ServerHeartbeatSucceededEvent.awaitedd       ~~r   c                     d| j                   j                  d| j                  d| j                  d| j                  d| j
                  dS Nr   r   z duration: z, awaited: z	, reply: r   r   r   rz   r   rh  r   r~   s    r   r   z&ServerHeartbeatSucceededEvent.__repr__n  4    NN##T%7%7MM4<<5 	5r   Fr   r   r   r   r   r|   r   r   r   rh  r   r   r   s   @r   r_  r_  L  sU    
 7I!      5r   r_  c                   ^     e Zd ZdZdZd fd	Zed        Zed        Zed        Z	d Z
 xZS )	ServerHeartbeatFailedEventzxFired when the server heartbeat fails, either with an "ok: 0"
    or a socket exception.

    .. versionadded:: 3.3
    r`  c                 V    t         t        |   |       || _        || _        || _        y rs   )r   rv  r|   %_ServerHeartbeatFailedEvent__duration"_ServerHeartbeatFailedEvent__reply$_ServerHeartbeatFailedEvent__awaitedrg  s        r   r|   z#ServerHeartbeatFailedEvent.__init__}  s(    ($8G" r   c                     | j                   S rj  )rx  r~   s    r   r   z#ServerHeartbeatFailedEvent.duration  r   r   c                     | j                   S )zA subclass of :exc:`Exception`.)ry  r~   s    r   r   z ServerHeartbeatFailedEvent.reply  r   r   c                     | j                   S rm  )rz  r~   s    r   rh  z"ServerHeartbeatFailedEvent.awaited  rn  r   c                     d| j                   j                  d| j                  d| j                  d| j                  d| j
                  dS rp  rq  r~   s    r   r   z#ServerHeartbeatFailedEvent.__repr__  rr  r   rs  rt  r   s   @r   rv  rv  t  sU     7I!      5r   rv  c                       e Zd ZdZd Zed        Zed        Zed        Zed        Z	ed        Z
d Z	 d d
Z	 d dZ	 d dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!y	)!_EventListenerszConfigure event listeners for a client instance.

    Any event listeners registered globally are included by default.

    :Parameters:
      - `listeners`: A list of event listeners.
    c                    t         j                  d d  | _        t         j                  d d  | _        t         j
                  }|d d  | _        t         j                  d d  | _        t         j                  d d  | _
        ||D ]  }t        |t              r| j                  j                  |       t        |t              r| j                  j                  |       t        |t              r| j                  j                  |       t        |t               r| j                  j                  |       t        |t"              s| j                  j                  |        t%        | j                        | _        t%        | j                        | _        t%        | j                        | _        t%        | j                        | _        t%        | j                        | _        y rs   )r`   r   "_EventListeners__command_listenersr   !_EventListeners__server_listenersr	   +_EventListeners__server_heartbeat_listenersr
   #_EventListeners__topology_listenersr   _EventListeners__cmap_listenersrX   r   ra   rL   r=   rB   r%   bool%_EventListeners__enabled_for_commands#_EventListeners__enabled_for_server-_EventListeners__enabled_for_server_heartbeat%_EventListeners__enabled_for_topology!_EventListeners__enabled_for_cmap)r   r\   lsts      r   r|   z_EventListeners.__init__  sw   #-#?#?#B ","="=a"@33,/F)$.$A$A!$D! * 9 9! <   
6c?3,,33C8c>2++2237c#:;55<<SAc#34--44S9c#9:))005
6 '+4+C+C&D#$()@)@$A!.2--//+&*4+D+D&E#"&t'<'<"=r   c                     | j                   S )z-Are any CommandListener instances registered?)r  r~   s    r   enabled_for_commandsz$_EventListeners.enabled_for_commands       ***r   c                     | j                   S )z,Are any ServerListener instances registered?)r  r~   s    r   enabled_for_serverz"_EventListeners.enabled_for_server  s     (((r   c                     | j                   S )z5Are any ServerHeartbeatListener instances registered?)r  r~   s    r   enabled_for_server_heartbeatz,_EventListeners.enabled_for_server_heartbeat  s     222r   c                     | j                   S )z.Are any TopologyListener instances registered?)r  r~   s    r   enabled_for_topologyz$_EventListeners.enabled_for_topology  r  r   c                     | j                   S )z4Are any ConnectionPoolListener instances registered?)r  r~   s    r   enabled_for_cmapz _EventListeners.enabled_for_cmap  s     &&&r   c                 v    | j                   dd | j                  dd | j                  dd | j                  dd fS )z#List of registered event listeners.N)r  r  r  r  r~   s    r   event_listenersz_EventListeners.event_listeners  sD    ((+11!4''*))!,. 	.r   Nc                     ||}t        |||||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)a  Publish a CommandStartedEvent to all command listeners.

        :Parameters:
          - `command`: The command document.
          - `database_name`: The name of the database this command was run
            against.
          - `request_id`: The request id for this operation.
          - `connection_id`: The address (host, port) of the server this
            command was sent to.
          - `op_id`: The (optional) operation id for this operation.
        N)r   r  r   	Exceptionr   )r   r   r   ry   rz   op_idr   
subscribers           r   publish_command_startz%_EventListeners.publish_command_start  sc     =E#]JuF22 	$J$""5)	$  $!#$s   8AAc                     ||}t        ||||||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)a  Publish a CommandSucceededEvent to all command listeners.

        :Parameters:
          - `duration`: The command duration as a datetime.timedelta.
          - `reply`: The server reply document.
          - `command_name`: The command name.
          - `request_id`: The request id for this operation.
          - `connection_id`: The address (host, port) of the server this
            command was sent to.
          - `op_id`: The (optional) operation id for this operation.
        N)r   r  r    r  r   )	r   r   r   rx   ry   rz   r  r   r  s	            r   publish_command_successz'_EventListeners.publish_command_success  se     =E%e\:}eM22 	$J$$$U+	$  $!#$   9AAc                     ||}t        ||||||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)a  Publish a CommandFailedEvent to all command listeners.

        :Parameters:
          - `duration`: The command duration as a datetime.timedelta.
          - `failure`: The server reply document or failure description
            document.
          - `command_name`: The command name.
          - `request_id`: The request id for this operation.
          - `connection_id`: The address (host, port) of the server this
            command was sent to.
          - `op_id`: The (optional) operation id for this operation.
        N)r   r  r"   r  r   )	r   r   r   rx   ry   rz   r  r   r  s	            r   publish_command_failurez'_EventListeners.publish_command_failure  se     =E"g|ZO22 	$J$!!%(	$  $!#$r  c                     t        |      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)zPublish a ServerHeartbeatStartedEvent to all server heartbeat
        listeners.

        :Parameters:
         - `connection_id`: The address (host, port) pair of the connection.
        N)r]  r  r   r  r   )r   rz   r   r  s       r    publish_server_heartbeat_startedz0_EventListeners.publish_server_heartbeat_started%  sM     ,M:;; 	$J$""5)	$  $!#$   0AAc                     t        ||||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)a  Publish a ServerHeartbeatSucceededEvent to all server heartbeat
        listeners.

        :Parameters:
         - `connection_id`: The address (host, port) pair of the connection.
         - `duration`: The execution time of the event in the highest possible
            resolution for the platform.
         - `reply`: The command reply.
         - `awaited`: True if the response was awaited.
         N)r_  r  r    r  r   r   rz   r   r   rh  r   r  s          r   "publish_server_heartbeat_succeededz2_EventListeners.publish_server_heartbeat_succeeded3  sV     .h}.57;; 	$J$$$U+	$  $!#$   3A	A	c                     t        ||||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)a  Publish a ServerHeartbeatFailedEvent to all server heartbeat
        listeners.

        :Parameters:
         - `connection_id`: The address (host, port) pair of the connection.
         - `duration`: The execution time of the event in the highest possible
            resolution for the platform.
         - `reply`: The command reply.
         - `awaited`: True if the response was awaited.
         N)rv  r  r"   r  r   r  s          r   publish_server_heartbeat_failedz/_EventListeners.publish_server_heartbeat_failedG  sV     +8UM+24;; 	$J$!!%(	$  $!#$r  c                     t        ||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)a  Publish a ServerOpeningEvent to all server listeners.

        :Parameters:
         - `server_address`: The address (host, port) pair of the server.
         - `topology_id`: A unique identifier for the topology this server
           is a part of.
        N)r>  r  rD   r  r   r   r!  r"  r   r  s        r   publish_server_openedz%_EventListeners.publish_server_opened[  sO     #>;?11 	$J$!!%(	$  $!#$   1AAc                     t        ||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)a  Publish a ServerClosedEvent to all server listeners.

        :Parameters:
         - `server_address`: The address (host, port) pair of the server.
         - `topology_id`: A unique identifier for the topology this server
           is a part of.
        N)rA  r  rH   r  r   r  s        r   publish_server_closedz%_EventListeners.publish_server_closedj  sO     ".+>11 	$J$!!%(	$  $!#$r  c                     t        ||||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)a  Publish a ServerDescriptionChangedEvent to all server listeners.

        :Parameters:
         - `previous_description`: The previous server description.
         - `server_address`: The address (host, port) pair of the server.
         - `new_description`: The new server description.
         - `topology_id`: A unique identifier for the topology this server
           is a part of.
        N)r*  r  rF   r  r   )r   r2  r3  r!  r"  r   r  s          r   "publish_server_description_changedz2_EventListeners.publish_server_description_changedy  sZ     ..B.=~.9; 11 	$J$..u5	$  $!#$r  c                     t        |      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)zPublish a TopologyOpenedEvent to all topology listeners.

        :Parameters:
         - `topology_id`: A unique identifier for the topology this server
           is a part of.
        N)rR  r  rD   r  r   r   r"  r   r  s       r   publish_topology_openedz'_EventListeners.publish_topology_opened  M     $K033 	$J$!!%(	$  $!#$r  c                     t        |      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)zPublish a TopologyClosedEvent to all topology listeners.

        :Parameters:
         - `topology_id`: A unique identifier for the topology this server
           is a part of.
        N)rT  r  rH   r  r   r  s       r   publish_topology_closedz'_EventListeners.publish_topology_closed  r  r  c                     t        |||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)aI  Publish a TopologyDescriptionChangedEvent to all topology listeners.

        :Parameters:
         - `previous_description`: The previous topology description.
         - `new_description`: The new topology description.
         - `topology_id`: A unique identifier for the topology this server
           is a part of.
        N)rJ  r  rF   r  r   )r   r2  r3  r"  r   r  s         r   $publish_topology_description_changedz4_EventListeners.publish_topology_description_changed  sV     00D0?N33 	$J$..u5	$  $!#$   2AAc                     t        ||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)zCPublish a :class:`PoolCreatedEvent` to all pool listeners.
        N)r   r  r'   r  r   )r   r   r   r   r  s        r   publish_pool_createdz$_EventListeners.publish_pool_created  sO     !'2// 	$J$''.	$  $!#$r  c                     t        |      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)zCPublish a :class:`PoolClearedEvent` to all pool listeners.
        N)r   r  r*   r  r   r   r   r   r  s       r   publish_pool_clearedz$_EventListeners.publish_pool_cleared  sM     !)// 	$J$''.	$  $!#$r  c                     t        |      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)zBPublish a :class:`PoolClosedEvent` to all pool listeners.
        N)r   r  r,   r  r   r  s       r   publish_pool_closedz#_EventListeners.publish_pool_closed  sM      (// 	$J$&&u-	$  $!#$r  c                     t        ||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)zWPublish a :class:`ConnectionCreatedEvent` to all connection
        listeners.
        N)r   r  r.   r  r   r   r   rz   r   r  s        r   publish_connection_createdz*_EventListeners.publish_connection_created  sO     'w>// 	$J$--e4	$  $!#$r  c                     t        ||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)zMPublish a :class:`ConnectionReadyEvent` to all connection listeners.
        N)r   r  r0   r  r   r  s        r   publish_connection_readyz(_EventListeners.publish_connection_ready  sO     %Wm<// 	$J$++E2	$  $!#$r  c                     t        |||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)zVPublish a :class:`ConnectionClosedEvent` to all connection
        listeners.
        N)r   r  r3   r  r   )r   r   rz   r  r   r  s         r   publish_connection_closedz)_EventListeners.publish_connection_closed  sQ     &g}fE// 	$J$,,U3	$  $!#$r  c                     t        |      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)z_Publish a :class:`ConnectionCheckOutStartedEvent` to all connection
        listeners.
        N)r  r  r5   r  r   r  s       r   $publish_connection_check_out_startedz4_EventListeners.publish_connection_check_out_started  sM     /w7// 	$J$77>	$  $!#$r  c                     t        ||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)z^Publish a :class:`ConnectionCheckOutFailedEvent` to all connection
        listeners.
        N)r  r  r5   r  r   )r   r   r  r   r  s        r   #publish_connection_check_out_failedz3_EventListeners.publish_connection_check_out_failed  sO     .gv>// 	$J$77>	$  $!#$r  c                     t        ||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)zZPublish a :class:`ConnectionCheckedOutEvent` to all connection
        listeners.
        N)r  r  r9   r  r   r  s        r   publish_connection_checked_outz._EventListeners.publish_connection_checked_out  sO     *'=A// 	$J$11%8	$  $!#$r  c                     t        ||      }| j                  D ]  }	 |j                  |        y# t        $ r t	                Y -w xY w)zYPublish a :class:`ConnectionCheckedInEvent` to all connection
        listeners.
        N)r  r  r;   r  r   r  s        r   publish_connection_checked_inz-_EventListeners.publish_connection_checked_in  sO     )-@// 	$J$007	$  $!#$r  rs   )"r   r   r   r   r|   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r  r    s    >4 + + ) ) 3 3 + + ' '. @D$0 BF$0 BF$0$$($($$$*$$$$$$$	$$	$	$	$	$	$r   r  N)4r   collectionsr   bson.py3compatr   pymongo.helpersr   
_Listenersr`   objectr   r   r%   r=   rB   rL   rT   r^   rb   setr   rm   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r*  r>  rA  rC  rJ  rR  rT  rV  r]  r_  rv  r  r   r   r   <module>r     sH  fP #  -+,

 BB+
7V 7"n "@t"^ t"n"n "D"~ "B"^ "B+

36 BC 
F @&2- &2R%HM %HP"H "HJD D$Cz C4	z 		j 	FV F*V &Kv K2-  
+ 
, @DV D2"DF "DJ
 0 

/ 
L6 L0=L =>  7F 7$=m =>- - IF I$"7 %5$9 %5P&5!6 &5RG$f G$r   