
    Ii	                      S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKrS SKJrJrJrJrJrJrJrJrJr  S SKJr  S SKJrJr  S SKJr  S SKJ r   S SK!J"r"J#r#  S S	K$J%r%J&r&J'r'J(r(J)r)  S S
K*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4J5r5J6r6  S SK7J8r8J9r9  S SK:J;r;J<r<J=r=  S SK>J?r?J@r@JArAJBrB  S SKCJDrDJErE  S SKFJGrG  S SKHJIrI  S SKJJKrK  S SKLJMrM  S SKNJOrO  S SKPJQrQ  S SKRJSrSJTrT  \(       aT  S SKJUrU  S SKVJWrW  S SKXJYrY  S SKJZrZ  S SK[J\r\J]r]  S SK^J_r_J`r`Jara  S SKbJcrcJdrd  S SKeJfrf  S SKgJhrh  S SKJJiri  S S KjJkrkJlrlJmrm  S S!KnJoro   S S"KpJqrqJrrrJsrsJprp  SES# jrtS%rvS&rwS'rxS(ry\
R                  S):X  aG   S SK{r|S* r} \|R                  " \|R                  S+5       r\}" \S,S-5      r\}" \S.S/5      rSSS5        S0 rO
SFS1 jrSGS2 jr  SH         SIS3 jjrSJS4 jrSKS5 jrSLS6 jr " S7 S85      r " S9 S:5      rSMS; jr      SNS< jr " S= S>\45      r " S? S@5      r " SA SB5      r " SC SD5      rg! \u a    SES$ jrt Nf = f! \u a    S SK|r| Nf = f! , (       d  f       N= f! \ a    S-rS/r Nf = f)O    )annotationsN)	TYPE_CHECKINGAnyAsyncGeneratorMappingMutableMappingNoReturnOptionalSequenceUnion)DEFAULT_CODEC_OPTIONS)_csothelpers_shared)_validate_session_write_concern)_handle_reauth)commandreceive_message)MAX_BSON_SIZEMAX_MESSAGE_SIZEMAX_WIRE_VERSIONMAX_WRITE_BATCH_SIZEORDERED_TYPES)AutoReconnectConfigurationErrorConnectionFailureDocumentTooLargeExecutionTimeoutInvalidOperationNetworkTimeoutNotPrimaryErrorOperationFailurePyMongoErrorWaitQueueTimeoutError_CertificateError)HelloHelloCompat)_ACondition_ALock_create_lock)_CONNECTION_LOGGER_ConnectionStatusMessage
_debug_log _verbose_connection_error_reason)ConnectionCheckOutFailedReasonConnectionClosedReason)async_sendall)PoolOptions)ReadPreference)_add_to_command)SERVER_TYPE)SocketChecker)HAS_SNISSLError)CodecOptions)ObjectId)_AuthContext)AsyncClientSession)AsyncMongoClient_MongoClientErrorHandler)SnappyContextZlibContextZstdContext)_OpMsg_OpReply)_sslConn)ReadConcern)_ServerMode)ClusterTime_Address_CollationIn)WriteConcern)F_GETFDF_SETFD
FD_CLOEXECfcntlc                T    [        U [        5      n[        U [        U[        -  5        g)z8Set the close-on-exec flag on the given file descriptor.N)rM   rJ   rK   rL   )fdflagss     ?/venv/lib/python3.13/site-packages/pymongo/asynchronous/pool.py_set_non_inheritable_non_atomicrR   l   s    b'"b'5:-.    c                    g)z6Dummy function for platforms that don't provide fcntl.N )rO   s    rQ   rR   rR   u   s    rS   Fx   
   	   win32c                z     [         R                  " X5      u  p4[        U5      $ ! [        [        4 a    Us $ f = fN)winregQueryValueExintOSError
ValueError)keynamedefaultvalue_s        rQ   _queryrf      s>    	**35HEu:$ 	 N	s   "% ::z2SYSTEM\CurrentControlSet\Services\Tcpip\ParametersKeepAliveTimei m KeepAliveInterval  c                    [        [        [        S-  5      n[        [        [        S-  5      nU[        :  d
  U[        :  a#  U R                  [        R                  SX45        g g )Nri      )min_WINDOWS_TCP_IDLE_MS_MAX_TCP_KEEPIDLE_WINDOWS_TCP_INTERVAL_MS_MAX_TCP_KEEPINTVLioctlsocketSIO_KEEPALIVE_VALS)sockidle_msinterval_mss      rQ   _set_keepalive_timesrw      sX    *,=,DE24F4MN))[;S-SJJv001g2KL .TrS   c                    [        [        U5      (       aX  [        [        U5      n U R                  [        R                  U5      nXB:  a!  U R                  [        R                  X25        g g g ! [         a     g f = fr[   )hasattrrr   getattr
getsockoptIPPROTO_TCP
setsockoptr_   )rt   
tcp_option	max_valuesockoptrc   s        rQ   _set_tcp_optionr      sp    6:&&fj1G //&*<*<gF&OOF$6$6K ' '  s   AA/ /
A<;A<c                j    [        U S[        5        [        U S[        5        [        U S[        5        g )NTCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNT)r   rn   rp   _MAX_TCP_KEEPCNT)rt   s    rQ   rw   rw      s)    n.?@o/ABm-=>rS   c                :   U u  pEUb  SXEU4-  nOU SU 3nU(       a  X&-   nSU;  a  U[        U5      -  n[        U[        R                  5      (       a  [	        U5      Ue[        U[
        5      (       a  S[        U5      ;   a  [	        U5      Ue[        U5      Ue)z9Convert a socket.error to ConnectionFailure and raise it.z	%s:%d: %s: zconfigured timeouts	timed out)format_timeout_details
isinstancerr   timeoutr   r7   strr   )addresserror
msg_prefixtimeout_detailshostportmsgs          rQ   _raise_connection_failurer      s     JDT//b C'%o66%((S!u,	E8	$	$E
)B
 S!u,C e+rS   c                   #    U(       a  U[         R                  " 5       -
  OS nU R                  U5      I S h  vN $  N7fr[   )time	monotonicwait)	conditiondeadliner   s      rQ   
_cond_waitr      s/     -5h))4G((((s   6?=?c                    0 n[         R                  " 5       nU R                  nU R                  nU(       a  US-  US'   U(       a  U(       d  US-  US'   U(       a  US-  US'   U$ )Nri   	timeoutMSsocketTimeoutMSconnectTimeoutMS)r   get_timeoutsocket_timeoutconnect_timeout)optionsdetailsr   r   r   s        rQ   _get_timeout_detailsr      si    G!G++N--O&~g%3d%:!"&5&<"#NrS   c                r    SnU (       a-  US-  nS H  nX ;   d  M
  USU SX    S3-  nM     US S nUS-  nU$ )	N z (configured timeouts:)r   r   r    r   zms,)rU   )r   resultr   s      rQ   r   r      s^    F**KG!AgYb)9(:#>> L #MrS   c                  <    \ rS rSrSS jrSS jr\SS j5       rSrg)	_CancellationContext   c                    SU l         g NF
_cancelledselfs    rQ   __init___CancellationContext.__init__   s	    rS   c                    SU l         g)zCancel this context.TNr   r   s    rQ   cancel_CancellationContext.cancel   s	    rS   c                    U R                   $ )zWas cancel called?r   r   s    rQ   	cancelled_CancellationContext.cancelled   s     rS   r   NreturnNoner   bool)	__name__
__module____qualname____firstlineno__r   r   propertyr   __static_attributes__rU   rS   rQ   r   r      s        rS   r   c                  *   \ rS rSrSr        S&S jrS'S jr      S(S jrS)S jrS)S jr	S)S jr
S*S	 jrS+S
 jr        S,S jrS*S jr\\R"                  \SSSSSSSSSSSS4                                 S-S jj5       rS.S jrS/S jrS0S jrS1S jr        S2S jrS3S4S jjr      S5S jrS6S jrS)S jrS7S jr        S8S jrS9S jrS)S jr S:S jr!S;S jr"S<S  jr#S=S! jr$S=S" jr%S>S# jr&S?S$ jr'S%r(g)@AsyncConnection   zStore a connection with some metadata.

:param conn: a raw connection object
:param pool: a Pool instance
:param address: the server's (host, port)
:param id: the id of this socket in it's pool
c                   [         R                  " U5      U l        Xl        X0l        X@l        SU l        [        R                  " 5       U l	        SU l
        SU l        [        U l        [        U l        [         U l        [$        U l        SU l        SU l        SU l        SU l        UR0                  R2                  U l        UR6                  U l        UR8                  U l        UR0                  R:                  U l        S U l        [A        5       U l!        S U l"        S U l#        S U l$        URJ                  U l&        U RL                  RO                  5       U l(        SU l)        [U        5       U l+        UR0                  U l        SU l,        S U l-        S U l.        SU l/        SU l0        SU l1        U R0                  Rd                  U l3        SU l4        URj                  U l5        [        R                  " 5       U l6        g )NFg        )7weakrefrefpool_refconnr   idclosedr   r   last_checkin_timeperformed_handshakeis_writabler   max_wire_versionr   max_bson_sizer   max_message_sizer   max_write_batch_sizesupports_sessionshello_ok	is_mongosop_msg_enabledopts_event_listeners	listenersenabled_for_cmapenabled_for_logging_compression_settingscompression_settingscompression_contextr5   socket_checkeroidc_token_gen_idnegotiated_mechsauth_ctxgenpool_genget_overall
generationreadyr   cancel_contextmore_to_come
service_idserver_connection_id
pinned_txnpinned_cursoractiver   last_timeoutconnect_rtt
_client_idcreation_time)r   r   poolr   r   s        rQ   r   AsyncConnection.__init__	  s     D)	!%!1#( !& 0* 0$8!!&##33 $ 5 5#'#;#; $(II$C$C!Y] -:_045904 --335
4H4JII	"'.237!  " II44//!^^-rS   c                f    XR                   :X  a  gXl         U R                  R                  U5        g)z?Cache last timeout to avoid duplicate calls to conn.settimeout.N)r   r   
settimeout)r   r   s     rQ   set_conn_timeout AsyncConnection.set_conn_timeout<  s)    '''#		W%rS   c                   [         R                  " 5       nUc7  U R                  (       d%  U R                  U R                  R
                  5        g [         R                  " 5       nUc  U R                  nX4-
  nUS:  aI  [        U R                  5      n[        U5      nSUS SUS SU 3n[        USSUSS.U R                  5      eUb  [        US-  5      US	'   U R                  U5        U$ )
Nr   z5operation would exceed time limit, remaining timeout:z.5fz <= network round trip time:r   2   okerrmsgcoderi   	maxTimeMS)r   	remainingr   r   r   r   get_rttr   r   r   r   r   r^   )	r   clientcmdr   rttmax_time_msr   	formattedr  s	            rQ   apply_timeoutAsyncConnection.apply_timeoutC  s     //#?$$%%dii&>&>?mmo;""Cm?2499=O.?ILWUXMYuvyz}u~~  AJ  @K  LF"FB7%%	  ?";#56Cg&rS   c                8    SU l         U R                  (       a   eg NT)r   r   r   s    rQ   pin_txnAsyncConnection.pin_txnb  s    %%%%%rS   c                8    SU l         U R                  (       a   eg r  )r   r   r   s    rQ   
pin_cursorAsyncConnection.pin_cursorf  s    !??""?rS   c                   #    U R                  5       nU(       a  UR                  U 5      I S h  vN   g U R                  [        R                  5        g  N%7fr[   )r   checkin
close_connr/   STALE)r   r   s     rQ   unpinAsyncConnection.unpinj  s=     }},,t$$$OO2889 %s   ,AA&Ac                    U R                   R                  (       d,  U R                  (       d  U R                   R                  (       a  SU l        [
        R                  S0$ [
        R                  SSS0$ )NTrk   helloOk)r   
server_apir   load_balancedr   r&   CMD
LEGACY_CMDr   s    rQ   	hello_cmdAsyncConnection.hello_cmdq  sO     994==DII4K4K"&DOOQ''**Ay$??rS   c                D   #    U R                  S S S 5      I S h  vN $  N7fr[   )_hellor   s    rQ   helloAsyncConnection.helloz  s     [[tT2222s     c                  #    U R                  5       nU R                  (       + nSnU(       ak  SU l        U R                  R                  US'   U R                  (       a  U R                  R
                  US'   U R                  R                  (       a  SUS'   ObUb_  X$S'   Uc   e[        US-  5      US'   SnU R                  R                  (       a(  U R                  U R                  R                  U-   5        U(       d  Ub  XS	'   U R                  R                  nU(       a  UR                  S
:X  a0  UR                  (       a  UR                  S-   UR                  -   US'   SSKJn  UR                   R#                  XpR$                  5      n	U	(       a  U	R'                  5       n
U
b  XS'   OS n	U(       a  [(        R*                  " 5       nU R-                  SUSUS9I S h  vN nU(       a  [(        R*                  " 5       W-
  U l        [1        XS9nUR2                  U l        UR4                  U l        UR6                  U l        UR8                  U l        UR:                  U l        UR<                  S L=(       a    UR>                  U l         UR<                  U l        URB                  U l!        URD                  [F        RH                  [F        RJ                  [F        RL                  [F        RN                  [F        RP                  4;   U l)        URD                  [F        RT                  :H  U l+        URD                  [F        RX                  :H  U l-        U(       a<  U R                  (       a+  U R                  R]                  UR
                  5      nXl/        SU l0        URb                  U l2        U(       a  URf                  U l4        U	(       a,  U	Rk                  U5        U	Rm                  5       (       a  Xl7        U R                  R                  (       aW  URp                  (       d  [s        S5      eURp                  U l8        U Rt                  Rw                  U Rp                  5      U l<        U$  GN7f)NFTr	  compressionloadBalancedtopologyVersionri   maxAwaitTimeMSz$clusterTimeDEFAULT.saslSupportedMechsr   authspeculativeAuthenticateadmin)publish_eventsexhaust_allowed)	awaitablez`Driver attempted to initialize in load balancing mode, but the server does not support this mode)=r#  r   r   metadatar   compressorsr   r^   r   r   _credentials	mechanismusernamesourcepymongo.asynchronousr2  r:   from_credentialsr   speculate_commandr   r   r   r   r%   r   r   r   r   r   logical_session_timeout_minutesis_readabler   r   server_typer4   	RSPrimaryRSSecondary	RSArbiterRSOtherRSGhostis_repl
Standaloneis_standaloneMongosr   get_compression_contextr   r   connection_idr   sasl_supported_mechsr   parse_responsespeculate_succeededr   r   r   r   getr   )r   cluster_timetopology_versionheartbeat_frequencyr
  performing_handshaker7  credsr2  r   speculative_authenticatestartdocr'  ctxs                  rQ   r&  AsyncConnection._hello}  s     nn#'#;#;;	'+D$ II..CM((%)%>%>%J%JM"yy&&&*N#)%5!"&222$'(;d(B$CC !Iyy((%%dii&?&?BU&UV#(@".		&&)+,1LL3,>,O()1((99%NH+3+E+E+G(+75M12HNN$ELL#eU^L__#~~/%7Dc/ ,, % 6 6"00 % 6 6$)$>$>!11=S%BSBS 	 ?D>c>c,((!!##!!-
 
 #..+2H2HH**k.@.@@D$=$=++CCEDUDUVC'*$"$)$7$7!$)$>$>D!##E*++-- (99""##(A  $..DO"mm//@DOW `s   G Q1"Q.#JQ1c                   #    U R                  S 5      I S h  vN nUR                  U l        UR                  5       nUS   n[        R                  " X0R
                  5        U$  NL7fNr   )r   r   unpack_responser   _check_command_responser   )r   replyunpacked_docsresponse_docs       rQ   _next_replyAsyncConnection._next_reply  s]     **400!..--/$Q'..|=R=RS 1s   A&A$AA&TNFc                  #    U R                  X5        [        X5      n[        U[        5      (       d  [	        U5      nUb  UR
                  (       d  U
b  [        S5      eU R                  U5        U(       a  UR                  X-X05        U R                  X+U5        U(       a  U R                  OSn[        U=(       a    UR
                  (       + 5      nU R                  (       a  U R                  U5         [        U UUU R                  UUUUUUU R                   UU R"                  UU	U
U R$                  U R                  UUUUS9I Sh  vN $  N! [&        [(        4 a    e [*         a  nU R-                  U5         SnAgSnAff = f7f)a  Execute a command or raise an error.

:param dbname: name of the database on which to run the command
:param spec: a command document as a dict, SON, or mapping object
:param read_preference: a read preference
:param codec_options: a CodecOptions instance
:param check: raise OperationFailure if there are errors
:param allowable_errors: errors to ignore if `check` is True
:param read_concern: The read concern for this command.
:param write_concern: The write concern for this command.
:param parse_write_concern_error: Whether to parse the
    ``writeConcernError`` field in the command response.
:param collation: The collation for this command.
:param session: optional AsyncClientSession instance.
:param client: optional AsyncMongoClient for gossipping $clusterTime.
:param retryable_write: True if this command is a retryable write.
:param publish_events: Should we publish events for this command?
:param user_fields: Response fields that should be decoded
    using the TypeDecoders from codec_options, passed to
    bson._decode_all_selective.
Nz3Collation is unsupported for unacknowledged writes.)parse_write_concern_error	collationcompression_ctx
use_op_msgunacknowledgeduser_fieldsr6  write_concern)validate_sessionr   r   r   dictacknowledgedr   add_server_api	_apply_tosend_cluster_timer   r   r   _raise_if_not_writabler   r   r   r   r   r!   r    BaseExceptionr   )r   dbnamespecread_preferencecodec_optionscheckallowable_errorsread_concernrm  rg  rh  sessionr	  retryable_writer5  rl  r6  r   rk  r   s                       rQ   r   AsyncConnection.command  sn    R 	f.1'I $..:D%)C)CyGX$%Z[[D!d_Ktf5&4DNN$	mNM4N4N0NO''7	2  ""*C# $ 8 8..-' /+-   0 !/2 	 	2**511	2sC   C5F
8AE EE F
E F,F=F
FF
c                  #    U R                   b(  X R                   :  a  [        SX R                   4-  5      e [        U R                  U5      I Sh  vN   g N! [         a  nU R                  U5         SnAgSnAff = f7f)zmSend a raw BSON message or raise ConnectionFailure.

If a network exception is raised, the socket is closed.
NzfBSON document too large (%d bytes) - the connected server supports BSON document sizes up to %d bytes.)r   r   r0   r   ru  r   )r   messagemax_doc_sizer   s       rQ   send_messageAsyncConnection.send_message8  s{     
 )l=O=O.O"?BNPbPbAcd 
	2		7333 	2**511	2s@   6BA AA BA 
A?$A:5B:A??Bc                   #     [        XU R                  5      I Sh  vN $  N! [         a  nU R                  U5         SnAgSnAff = f7f)zjReceive a raw BSON message or raise ConnectionFailure.

If any exception is raised, the socket is closed.
N)r   r   ru  r   )r   
request_idr   s      rQ   r   AsyncConnection.receive_messageH  sC     
	2(4;P;PQQQQ 	2**511	2s5   A$ "$ A$ 
A	AAA		Ac                V    U(       a"  U R                   (       d  [        SSSSS.5      egg)zNRaise NotPrimaryError on unacknowledged write if this socket is not
writable.
znot primaryr   i{'  r  N)r   r    )r   rk  s     rQ   rt  &AsyncConnection._raise_if_not_writableR  s+     $"2"2!-]\a1bcc #3>rS   c                d   #    U R                  S5        U R                  X5      I Sh  vN   g N7f)zSend unack OP_MSG.

Can raise ConnectionFailure or InvalidDocument.

:param msg: bytes, an OP_MSG message.
:param max_doc_size: size in bytes of the largest document in `msg`.
TN)rt  r  )r   r   r  s      rQ   unack_writeAsyncConnection.unack_writeZ  s)      	##D)222s   &0.0c                   #    U R                  US5      I Sh  vN   U R                  U5      I Sh  vN nUR                  U5      n[        R                  " XPR
                  5        U$  NP N97f)zSend "insert" etc. command, returning response as a dict.

Can raise ConnectionFailure or OperationFailure.

:param request_id: an int.
:param msg: bytes, the command message.
r   N)r  r   command_responser   r`  r   )r   r  r   ry  ra  r   s         rQ   write_commandAsyncConnection.write_commande  sc      Q'''**:66''6 	..v7L7LM 	(6s   A-A)A-A+8A-+A-c           
       #    U(       a  U R                   (       a  SU l        SU l        U R                  (       GdA  U R                  R                  nU(       a  SSKJn  UR                  X US9I Sh  vN   SU l        [        R                  " 5       U R                  -
  nU R                  (       a@  U R                  c   eU R                  R                  U R                  U R                  U5        U R                   (       az  ["        R$                  " [&        R(                  5      (       aP  [+        ["        U R,                  [.        R0                  U R                  S   U R                  S   U R                  US9  gggg GN7f)	zXAuthenticate to the server if needed.

Can raise ConnectionFailure or OperationFailure.
NFr   r1  )reauthenticateTrk   clientIdr  
serverHost
serverPortdriverConnectionId
durationMS)r   r   r   r   r:  r>  r2  authenticater   r   r   r   r   publish_connection_readyr   r   r   r*   isEnabledForloggingDEBUGr,   r   r+   
CONN_READY)r   r  rW  r2  durations        rQ   r  AsyncConnection.authenticatew  s     '' $DJzzzII**E5''N'SSSDJ~~'$*<*<<H$$~~11177dggxX'',>,K,KGMM,Z,Z&!__4??#||A#||A'+ww' -[' 
 Ts   A/F 1E=2DF c                H    U(       a  UR                   ULa  [        S5      egg)zsValidate this session before use with client.

Raises error if the client is not the one that created the session.
z>Can only use session with the AsyncMongoClient that started itN)_clientr   )r   r	  r}  s      rQ   rn   AsyncConnection.validate_session  s-     f,&T  - rS   c                $   U R                   (       a  gU R                  5         U(       a  U R                  (       a@  U R                  c   eU R                  R	                  U R
                  U R                  U5        U R                  (       a  [        R                  " [        R                  5      (       aZ  [        [        U R                  [        R                  U R
                  S   U R
                  S   U R                  [!        U5      US9  gggg)z$Close this connection with a reason.Nr   rk   r  r  r  r  r  reasonr   )r   _close_connr   r   publish_connection_closedr   r   r   r*   r  r  r  r,   r   r+   CONN_CLOSEDr-   )r   r  s     rQ   r  AsyncConnection.close_conn  s    ;;$$~~11188twwPVW'',>,K,KGMM,Z,Z&!__4@@#||A#||A'+ww;FC 	 -['	 rS   c                    U R                   (       a  gSU l         U R                  R                  5          U R                  R	                  5         g! [
         a     gf = f)zClose this connection.NT)r   r   r   r   close	Exceptionr   s    rQ   r  AsyncConnection._close_conn  sJ    ;;""$	IIOO 		s   A 
AAc                L    U R                   R                  U R                  5      $ )z?Return True if we know socket has been closed, False otherwise.)r   socket_closedr   r   s    rQ   conn_closedAsyncConnection.conn_closed  s    ""00;;rS   c                6    U(       a  UR                  X5        gg)zAdd $clusterTime.N)_send_cluster_time)r   r   r}  r	  s       rQ   rs  !AsyncConnection.send_cluster_time  s     %%g7 rS   c                z    U R                   R                  (       a   [        XR                   R                  5        gg)zAdd server_api parameters.N)r   r  r3   )r   r   s     rQ   rq  AsyncConnection.add_server_api  s&    99GYY%9%9:  rS   c                8    [         R                  " 5       U l        g r[   r   r   r   r   s    rQ   update_last_checkin_time(AsyncConnection.update_last_checkin_time  s    !%!1rS   c                    Xl         g r[   )r   )r   r   s     rQ   update_is_writable"AsyncConnection.update_is_writable  s    &rS   c                F    [         R                  " 5       U R                  -
  $ )z9Seconds since this socket was last checked into its pool.r  r   s    rQ   idle_time_seconds!AsyncConnection.idle_time_seconds  s    ~~$"8"888rS   c                   U R                   (       a  S nO[        R                  nU R                  U5        [	        U[
        [        [        45      (       a*  [        U R                  5      n[        U R                  XS9  g e )Nr   )r   r/   ERRORr  r   IOErrorr_   r7   r   r   r   r   )r   r   r  r   s       rQ   r   )AsyncConnection._raise_connection_failure  sZ      ::F+11Fegw9::*4995G%dllESrS   c                4    U R                   UR                   :H  $ r[   )r   r   others     rQ   __eq__AsyncConnection.__eq__  s    yyEJJ&&rS   c                    X:X  + $ r[   rU   r  s     rQ   __ne__AsyncConnection.__ne__  s      rS   c                ,    [        U R                  5      $ r[   )hashr   r   s    rQ   __hash__AsyncConnection.__hash__  s    DIIrS   c                    SR                  [        U R                  5      U R                  =(       a    S=(       d    S[	        U 5      5      $ )NzAsyncConnection({}){} at {}z CLOSEDr   )formatreprr   r   r   r   s    rQ   __repr__AsyncConnection.__repr__
  s8    ,33OKK%I+tH
 	
rS   )+r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rI  rK  r   r   r   r   rA  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   Union[socket.socket, _sslConn]r   Poolr   ztuple[str, int]r   r^   )r   Optional[float]r   r   )r	  r<   r
  z"Optional[MutableMapping[str, Any]]r   r  r   )r   dict[str, Any])r   r%   )rS  zOptional[ClusterTime]rT  zOptional[Any]rU  Optional[int]r   zHello[dict[str, Any]])"rv  r   rw  MutableMapping[str, Any]rx  rE   ry  r8   rz  r   r{  z#Optional[Sequence[Union[str, int]]]r|  zOptional[ReadConcern]rm  zOptional[WriteConcern]rg  r   rh  zOptional[_CollationIn]r}  Optional[AsyncClientSession]r	  Optional[AsyncMongoClient]r~  r   r5  r   rl  zOptional[Mapping[str, Any]]r6  r   r   r  )r  bytesr  r^   r   r   )r  r  r   zUnion[_OpReply, _OpMsg])rk  r   r   r   )r   r  r  r^   r   r   )r  r^   r   r  ry  r8   r   r  )F)r  r   r   r   )r	  r  r}  r  r   r   )r  Optional[str]r   r   r   )r   r  r}  r  r	  r  r   r   )r   r  r   r   )r   r   r   r   )r   float)r   ru  r   r	   )r  r   r   r   r   r^   )r   r   ))r   r   r   r   __doc__r   r   r  r  r  r  r#  r'  r&  rd  r   r2   PRIMARYr   r   r  r   rt  r  r  r  rn  r  r  r  rs  rq  r  r  r  r   r  r  r  r  r   rU   rS   rQ   r   r      se   1.21.:>1.IX1.^a1.f&&-O	>&#:@3W+W (W +	W
 
Wr 
 (6'='=&;@D.204*/,004-1 %#37 %#W2W2 'W2 %	W2
 $W2 W2 >W2 ,W2 .W2 $(W2 *W2 .W2 +W2 W2 W2  1!W2" #W2$ 
%W2 W2r2 2d	3$):F	$ D0;W	*<8)8 .8 +	8
 
8;
2'98'!
rS   r   c           
     "   U u  p#UR                  S5      (       aq  [        [        S5      (       d  [        S5      e[        R                  " [        R                  5      n[        UR                  5       5         UR                  U5        U$ [        R                  n[        R                  (       a  US:w  a  [        R                  nSn[        R                  " X#U[        R                  5       GH  nUu  ppn [        R                  " X[        [        SS5      -  U
5      n[        UR                  5       5         UR!                  [        R"                  [        R$                  S5        [&        R(                  " 5       nUc  UR*                  nOUS::  a  [        R,                  " S	5      eUR/                  U5        UR!                  [        R0                  [        R2                  S
5        [5        U5        UR                  U5        Us  $    Ub  Ue[        S5      e! [         a    UR                  5         e f = f! [         a    [        R                  " XU
5      n GN?f = f! [         a  nUnUR                  5          SnAGM  SnAff = f)zGiven (host, port) and PoolOptions, connect and return a socket object.

Can raise socket.error.

This is a modified version of create_connection from CPython >= 2.7.
z.sockAF_UNIXz-UNIX-sockets are not supported on this system	localhostNSOCK_CLOEXECr   rk   r   Tzgetaddrinfo failed)endswithry   rr   r   r  rR   filenoconnectr_   r  AF_INEThas_ipv6	AF_UNSPECgetaddrinfoSOCK_STREAMrz   r}   r|   TCP_NODELAYr   r  r   r   r   
SOL_SOCKETSO_KEEPALIVErw   )r   r   r   r   rt   familyerrresafsocktypeprotodummysar   es                  rQ   _create_connectionr    s    JD }}Wvy))#$STT}}V^^,'6	LLK ^^F4;.!!
C!!$ff6H6HI),&eB	6==PQ0R%RTYZD 	(6	OOF..0B0BAFoo'G!11Ann[11OOG$OOF--v/B/BDI &LLK3 J< 	 *++c  	JJL	&  	6 ==u5D	6&  	CJJLL	s7   9H :)H>=CI&H;>!I#"I#&
J0J		Jc           	       #    [        X5      nUR                  nUc  UR                  UR                  5        U$ U S   n [        (       a  [
        (       a  UR                  X$S9nO[        US5      (       a  UR                  X$S9I Sh  vN nO[        R                  " 5       nUR                  S[        R                  " UR                  X$S95      I Sh  vN nO[
        (       a  UR                  U5      nOf[        US5      (       a  UR                  U5      I Sh  vN nO;[        R                  " 5       nUR                  SUR                  U5      I Sh  vN n UR(                  (       aF  UR*                  (       d5  UR,                  (       d$   [.        R0                  " WR3                  5       US9  WR                  UR                  5        U$  GNJ N N N! [         a    UR                  5         e [         ["        4 a0  nUR                  5         [%        U5      n['        XSUS9   SnANSnAff = f! [         a    WR                  5         e f = f7f)zGiven (host, port) and PoolOptions, return a configured socket.

Can raise socket.error, ConnectionFailure, or _CertificateError.

Sets socket's SSL and timeout options.
Nr   )server_hostnamea_wrap_socketzSSL handshake failed: r  )hostname)r  _ssl_contextr   r   r6   _IS_SYNCwrap_socketry   r  asyncioget_running_looprun_in_executor	functoolspartialr$   r  r_   r7   r   r   verify_modecheck_hostnametls_allow_invalid_hostnamessslmatch_hostnamegetpeercert)	r   r   rt   ssl_contextr   ssl_sockloopexcr   s	            rQ   _configured_socketr  Y  s     g/D&&K../1:D#c 7x&2242N;88%0%>%>t%>%ZZH"335D%)%9%9!))+*A*A4^&  H
 x&2248;88%0%>%>t%DDH"335D%)%9%9$@W@WY]%^^H 	**33	x335E
 ../OQ  [   E  _ 

 	X c

 'w/!'0HZabc ! 	NN	s   =I %G %I&#G 	G
G IAG GG IG 8I9%G GG #I$5G GG 4I#H9 6IG G G G *H6&H1,I1H66I9IIc                      \ rS rSrSrSrg)_PoolClosedErrori  zRInternal error raised when a thread tries to get a connection from a
closed pool.
rU   N)r   r   r   r   r  r   rU   rS   rQ   r  r    s    rS   r  c                  F    \ rS rSrS	S jrS
S jrSS jrSS jrSS jrSr	g)_PoolGenerationi  c                P    [         R                  " [        5      U l        SU l        g r^  )collectionsdefaultdictr^   _generations_generationr   s    rQ   r   _PoolGeneration.__init__  s    1<1H1H1MrS   c                >    Uc  U R                   $ U R                  U   $ )z,Get the generation for the given service_id.r  r  r   r   s     rQ   rR  _PoolGeneration.get  s%    ###  ,,rS   c                    U R                   $ )z"Get the Pool's overall generation.)r  r   s    rQ   r   _PoolGeneration.get_overall  s    rS   c                    U =R                   S-  sl         Uc+  U R                   H  nU R                  U==   S-  ss'   M     gU R                  U==   S-  ss'   g)z2Increment the generation for the given service_id.rk   Nr!  r"  s     rQ   inc_PoolGeneration.inc  sW    A"//
!!*-2- 0 j)Q.)rS   c                (    XR                  U5      :g  $ )z?Return if the given generation for a given service_id is stale.)rR  r   r   r   s      rQ   stale_PoolGeneration.stale  s    hhz***rS   r!  Nr   )r   Optional[ObjectId]r   r^   r  )r   r-  r   r   r   r^   r   r-  r   r   )
r   r   r   r   r   rR  r   r'  r+  r   rU   rS   rQ   r  r    s    - /+rS   r  c                       \ rS rSrSrSrSrSrg)	PoolStatei  rk         rU   N)r   r   r   r   PAUSEDREADYCLOSEDr   rU   rS   rQ   r0  r0    s    FEFrS   r0  c                  R   \ rS rSr  S       SS jjrSS jr\SS j5       r   S         SS jjrSS jr	 S     SS jjr
SS	 jrSS
 jrSS jrS S jrS!S"S jjr\R"                   S!   S#S jj5       rS$S jr S!     S%S jjrS&S jrS'S jrS(S jrSS jrSrg))r  i  Nc                4   UR                   (       a  [        R                  U l        O[        R                  U l        SU l        [        R                  " 5       U l        [        5       U l
        [        5       n[        U5      U l        SU l        SU l        SU l        [#        5       U l        [&        R(                  " 5       U l        Xl        X l        X0l        U R0                  =(       a?    U R.                  R2                  SL=(       a     U R.                  R2                  R4                  U l        U R0                  U l        [9        [:        R<                  " U5      5      U l        SU l         U R.                  RB                  U l!        U RB                  (       d  [E        S5      U l!        [9        [:        R<                  " U5      5      U l#        U R.                  RH                  U l%        SU l&        X@l'        U R4                  (       a]  U R.                  R2                  c   eU R.                  R2                  RQ                  U R,                  U R.                  RR                  5        U R6                  (       a  [T        RV                  " [X        RZ                  5      (       a[  []        [T        4U RN                  [^        R`                  U R,                  S   U R,                  S   S.U R.                  RR                  D6  SU l1        [        5       U l2        SU l3        SU l4        g)z
:param address: a (hostname, port) tuple
:param options: a PoolOptions instance
:param handshake: whether to call hello for each new AsyncConnection
rk   r   Ninfr  r  r  r  )5pause_enabledr0  r3  stater4  _check_interval_secondsr  dequeconnssetactive_contextsr)   r(   lockactive_socketsnext_connection_idr   r  r   osgetpidpidr   r   	handshaker   r   r   r'   	threading	Condition	size_condrequestsmax_pool_sizer  _max_connecting_condmax_connecting_max_connecting_pendingr   publish_pool_creatednon_default_optionsr*   r  r  r  r,   r+   POOL_CREATEDoperation_count_Pool__pinned_socketsncursorsntxns)r   r   r   rG  	client_id_locks         rQ   r   Pool.__init__  sB      "))DJ"DJ ()$ )4(9(9(;
:=%5M	"#+/
 #$99;	" NN <		**$6<		**;; 	
 $(>> 
 %Y%8%8%?@!YY44!!!&uD %0	0C0CE0J$K!#yy77#  99--999II&&;;dii;; ##(:(G(G(V(V"0==<<?<<? ))// %& 7:e
rS   c           	       #    U R                    IS h  vN   U R                  [        R                  :w  a  [        R                  U l        U R                  (       aH  U R
                  R                  c   eU R
                  R                  R                  U R                  5        U R                  (       al  [        R                  " [        R                  5      (       aC  [        [        U R                  [         R"                  U R                  S   U R                  S   S9  S S S 5      IS h  vN   g  GN N! , IS h  vN  (       d  f       g = f7f)Nr   rk   r9  )rA  r;  r0  r4  r   r   r   publish_pool_readyr   r   r*   r  r  r  r,   r   r+   
POOL_READYr   s    rQ   r   
Pool.ready!  s     999zzY__,&__
((9955AAAII..AA$,,O++0B0O0OPWP]P]0^0^*!% 8 C C#'<<?#'<<? 99999sE   ED2ED
D7!E,D5-E5E7E=E >E
Ec                <    U R                   [        R                  :H  $ r[   )r;  r0  r5  r   s    rQ   r   Pool.closed2  s    zzY----rS   c           	     \  #    U R                   nU R                   IS h  vN   U R                  (       a   S S S 5      IS h  vN   g U R                  R                  (       aC  U(       a<  U R                  R
                  (       d!  U R                   [        R                  soPl         U R                  R                  U5        [        R                  " 5       nU R                  U:w  a  X`l        SU l        SU l        Uc'  U R                  [         R"                  " 5       sopl        Oy[         R"                  " 5       n[         R"                  " 5       n	U R                   H7  n
U
R$                  U:X  a  UR'                  U
5        M&  U	R'                  U
5        M9     UnXl        U(       a  [        R(                  U l         U R*                  R-                  5         U R                  R-                  5         U(       a#  U R.                   H  nUR1                  5         M     S S S 5      IS h  vN   U R                  R2                  nU(       a  W H"  n
U
R5                  [6        R8                  5        M$     U R:                  (       a   Uc   eUR=                  U R>                  5        U R@                  (       an  [B        RD                  " [F        RH                  5      (       aD  [K        [B        U RL                  [N        R8                  U R>                  S   U R>                  S   S9  g g g U[        R                  :w  a  U R:                  (       a   Uc   eURQ                  U R>                  UUS9  U R@                  (       am  [B        RD                  " [F        RH                  5      (       aD  [K        [B        U RL                  [N        RR                  U R>                  S   U R>                  S   US9  W H"  n
U
R5                  [6        RT                  5        M$     g  GN GN GN! , IS h  vN  (       d  f       GN= f7f)Nr   rk   r9  )r   interrupt_connections)r  r  r  r  	serviceId)+r;  rJ  r   r   r:  r   r0  r3  r   r'  rD  rE  rF  rB  rT  r>  r  r=  r   appendr5  rM  
notify_allr@  r   r   r  r/   POOL_CLOSEDr   publish_pool_closedr   r   r*   r  r  r  r,   r   r+   publish_pool_clearedPOOL_CLEAREDr  )r   r  pauser   rb  	old_statenewpidsocketsdiscardkeepr   contextr   s                rQ   _resetPool._reset6  s     JJ	>>>{{ ">> yy&&59P9P(,

I4D4D%	:HHLL$YY[Fxx6!!&'#'($!&*jj+2C2C2E#-8->->-@*5*;*;*= JJD*4t,D)	 '
 "!
&--
%%002NN%%'$#33GNN$  4? ">D II..	  6 B BC  $$ ,,,--dll;'',>,K,KGMM,Z,Z&!__4@@#||A#||A -[' I,,,(($00022#-.C 3 
 ++0B0O0OPWP]P]0^0^*!% 8 E E#'<<?#'<<?",   6 < <=  M ">>>>sc   P,PP,PP,PP,GPP,!P"G'P,P,P,P)PP)$P,c                   #    Xl         U R                   ISh  vN   U R                   H  nUR                  U R                   5        M      SSS5      ISh  vN   g NC N! , ISh  vN  (       d  f       g= f7f)zHUpdates the is_writable attribute on all sockets currently in the
Pool.
N)r   rA  r>  r  )r   r   _sockets      rQ   r  Pool.update_is_writable  sG      '999::**4+;+;< & 99999sD   A;AA;/A!A;AA;A;!A8'A*(A84A;c                @   #    U R                  SXS9I S h  vN   g  N7f)NF)r  r   rb  rq  )r   r   rb  s      rQ   reset
Pool.reset  s'      kkJ  
 	
 	
   c                @   #    U R                  SSS9I S h  vN   g  N7f)NF)r  rj  rw  r   s    rQ   reset_without_pausePool.reset_without_pause  s     kkUk333rz  c                >   #    U R                  SS9I S h  vN   g  N7f)NT)r  rw  r   s    rQ   r  
Pool.close  s     kkk%%%s   c                8    U R                   R                  X5      $ r[   )r   r+  r*  s      rQ   stale_generationPool.stale_generation  s    xx~~c..rS   c           	       #    U R                    ISh  vN   U R                  [        R                  :w  a   SSS5      ISh  vN   gSSS5      ISh  vN   U R                  R
                  b  U R                    ISh  vN   U R                  (       a  U R                  S   R                  5       U R                  R
                  :  a  U R                  R                  5       nUR                  [        R                  5        U R                  (       a7  U R                  S   R                  5       U R                  R
                  :  a  M  SSS5      ISh  vN    U R                   ISh  vN   [        U R                  5      U R                  -   U R                  R                  :  a   SSS5      ISh  vN   gU R                   U R                  R                  :  a   SSS5      ISh  vN   gU =R                   S-  sl        SSS5      ISh  vN   Sn U R"                   ISh  vN   U R$                  U R&                  :  a   SSS5      ISh  vN   U(       aT  U R"                   ISh  vN   U =R$                  S-  sl        U R"                  R)                  5         SSS5      ISh  vN   U R                   ISh  vN   U =R                   S-  sl        U R                  R)                  5         SSS5      ISh  vN   gU =R$                  S-  sl        SnSSS5      ISh  vN   U R+                  5       I Sh  vN nU R                    ISh  vN   U R,                  R/                  5       U:w  a  UR                  [        R0                  5         SSS5      ISh  vN   U(       aT  U R"                   ISh  vN   U =R$                  S-  sl        U R"                  R)                  5         SSS5      ISh  vN   U R                   ISh  vN   U =R                   S-  sl        U R                  R)                  5         SSS5      ISh  vN   gU R                  R3                  U5        U R4                  R7                  UR8                  5        SSS5      ISh  vN   U(       aT  U R"                   ISh  vN   U =R$                  S-  sl        U R"                  R)                  5         SSS5      ISh  vN   U R                   ISh  vN   U =R                   S-  sl        U R                  R)                  5         SSS5      ISh  vN   GM   GNL GN  GN! , ISh  vN  (       d  f       GN(= f GN GN0! , ISh  vN  (       d  f       GNF= f GN8 GN GN GN! , ISh  vN  (       d  f       GN= f GN GNx GN_ GN#! , ISh  vN  (       d  f       GN9= f GN, GN! , ISh  vN  (       d  f       g= f GN! , ISh  vN  (       d  f       GN= f GN GN GN GNu GN9! , ISh  vN  (       d  f       GNO= f GNB GN! , ISh  vN  (       d  f       g= f GN! , ISh  vN  (       d  f       GN= f GN GN! , ISh  vN  (       d  f       GN= f GN GNe! , ISh  vN  (       d  f       GN{= f! U(       aq  U R"                   ISh  vN    U =R$                  S-  sl        U R"                  R)                  5         SSS5      ISh  vN    O! , ISh  vN  (       d  f       O= fU R                   ISh  vN    U =R                   S-  sl        U R                  R)                  5         SSS5      ISh  vN    f ! , ISh  vN  (       d  f       f = f= f7f)zRemoves stale sockets then adds new ones if pool is too small and
has not been reset. The `reference_generation` argument specifies the
`generation` at the point in time this operation was requested on the
pool.
Nr   Trk   F)rA  r;  r0  r4  r   max_idle_time_secondsr>  r  popr  r/   IDLErJ  lenrB  min_pool_sizerK  rM  rP  rO  notifyr  r   r   r  
appendleftr@  rn  r   )r   reference_generationr   incrementeds       rQ   remove_stale_socketsPool.remove_stale_sockets  s     999zzY__, 9999 99**6yyyJJ

288:TYY=\=\\::>>+DOO$:$?$?@	 JJ

288:TYY=\=\\ !y ~~~tzz?T%8%88DII<S<SS &~~ ==DII$;$;; &~~ " &~  K,444 }}(<(<<	 54" #888*1188:  98  >>>MMQ&MNN))+ *>>% MMQ&M"&K 54 "\\^+999 xx++-1EE(>(D(DE %9 #888*1188:  98  >>>MMQ&MNN))+ *>> JJ))$/((001D1DE %9 #888*1188:  98  >>>MMQ&MNN))+ *>C  9999
 !yyy &~~~~ 5&  9888 *>>>/ 5444 ,$  9888 *>>> %999  9888 *>>> #888*1188:  988888  >>>MMQ&MNN))+ *>>>>>s)  _U_ U(_U"_U%+_?V _CV	_V_,V$-_0<V0,_7V'8_=%V0"_-V*._3V0_V-_[ +W,[ /X[ W[ _2W3_60W&_1W2_W2_
0W8:_W5_X"[ -X.[ X0[ X3[ ?Y=[ (X6)[ -_X9_0X?8_X<_Y_0Y _Y_A Y=[ (Y:)[ -_Z_0Z8_Z_Z9_0Z?_Z<_"_%_(V .U1/V ;	__	V!VV!	_'_*_-_0W6V97W_[ [ __W/W W/*	_5_8X>X?X_[ X-XX-(	[ 3[ 6[ 9_<_?YYY	__ Y7&Y)'Y73_:[ =ZZZ[ __Z6$Z'%Z61	_<_?[[[__2[5
3_70\9'_2\53_9]?] ]_#]&
$_(0^*_#^&$_*_0^31_=__c                  #    U R                    ISh  vN   U R                  nU =R                  S-  sl        SSS5      ISh  vN   U R                  R                  nU R                  (       a!  Uc   eUR                  U R                  W5        U R                  (       am  [        R                  " [        R                  5      (       aD  [        [        U R                  [        R                  U R                  S   U R                  S   WS9   [!        U R                  U R                  5      I Sh  vN n[;        X@U R                  W5      nU R                    ISh  vN   U R<                  R?                  UR@                  5        SSS5      ISh  vN    U RB                  (       a)  URE                  5       I Sh  vN   URF                  U l#        U(       a  URI                  USS9  URK                  5       I Sh  vN   U$  GN GN! , ISh  vN  (       d  f       GN= f N! ["         Ga5  nU R                  (       a0  Uc   eUR%                  U R                  W[&        R(                  5        U R                  (       a  [        R                  " [        R                  5      (       ak  [        [        U R                  [        R*                  U R                  S   U R                  S   W[-        [&        R(                  5      [&        R(                  S9  [/        U[0        [2        [4        45      (       a)  [7        U R                  5      n[9        U R                  XVS9  e SnAff = f GN GN! , ISh  vN  (       d  f       GN= f GN GN! ["         a!    URM                  [&        R(                  5        e f = f7f)	zConnect to Mongo and return a new AsyncConnection.

Can raise ConnectionFailure.

Note that the pool does not keep a reference to the socket -- you
must call checkin() when you're done with it.
Nrk   r   r  r  r  r  r  r  r  F)completed_handshake)'rA  rC  r   r   r   publish_connection_createdr   r   r*   r  r  r  r,   r   r+   CONN_CREATEDr  ru  r  r/   r  r  r-   r   r  r_   r7   r   r   r   r@  addr   rG  r'  r   contribute_socketr  r  )r   handlerconn_idr   rt   r   r   r   s           rQ   r  Pool.connect  s     999--G##q(# 9 II..	  (((00wG##(:(G(G(V(V"0==<<?<<?#*	+DLL$))DDD0 t4<<A999  $$T%8%89 9
	~~jjl""#'#3#3 ))$E)J##%%%
 u 999& E 	$$ ,,,33LL'+A+G+G '',>,K,KGMM,Z,Z&!__4@@#||A#||A'.;<R<X<XY066	 %'7H!=>>.tyy9)$,,W+	0 999 #
 & 	OO2889	s   O HO "HO HC
O #H( 3H&4H( 8'O M+ O #&M1	O M.O $N >N??N >N?N O O H#HH#O &H( (M(3D0M##M((O .O 1N	7M:8N	O N N +N==O c           
    :  #    U R                   R                  n[        R                  " 5       nU R                  (       a   Uc   eUR                  U R                  5        U R                  (       al  [        R                  " [        R                  5      (       aC  [        [        U R                  [        R                  U R                  S   U R                  S   S9  U R!                  X1S9I Sh  vN n[        R                  " 5       U-
  nU R                  (       a,  Uc   eUR#                  U R                  UR$                  U5        U R                  (       ax  [        R                  " [        R                  5      (       aO  [        [        U R                  [        R&                  U R                  S   U R                  S   UR$                  US9   U R(                   ISh  vN   U R*                  R-                  UR.                  5        SSS5      ISh  vN   U7v   UR2                  (       aV  U R(                   ISh  vN   U R@                  R-                  U5        U =RB                  S-  sl!        SSS5      ISh  vN   gUR4                  (       aV  U R(                   ISh  vN   U R@                  R-                  U5        U =RD                  S-  sl"        SSS5      ISh  vN   gUR<                  (       a  U R?                  U5      I Sh  vN   gg GN- GN< GN
! , ISh  vN  (       d  f       GN = f! [0         a    UR2                  =(       d    UR4                  nU(       a2  [6        R8                  " 5       u  pxn	UR;                  Xx5      I Sh  vN    U(       d+  UR<                  (       a  U R?                  U5      I Sh  vN    e f = f GN GNY! , ISh  vN  (       d  f       g= f GNO GN! , ISh  vN  (       d  f       g= f GN7f)a  Get a connection from the pool. Use with a "with" statement.

Returns a :class:`AsyncConnection` object wrapping a connected
:class:`socket.socket`.

This method should always be used in a with-statement::

    with pool.get_conn() as connection:
        connection.send_message(msg)
        data = connection.receive_message(op_code, request_id)

Can raise ConnectionFailure or OperationFailure.

:param handler: A _MongoClientErrorHandler.
Nr   rk   r9  r  r  )#r   r   r   r   r   $publish_connection_check_out_startedr   r   r*   r  r  r  r,   r   r+   CHECKOUT_STARTED	_get_connpublish_connection_checked_outr   CHECKOUT_SUCCEEDEDrA  r@  r  r   ru  r   r   sysexc_infohandler   r  rU  rW  rV  )
r   r  r   checkout_started_timer   r  pinnedexc_typeexc_valre   s
             rQ   checkoutPool.checkout  s    & II..	 $ 0  (((::4<<H##(:(G(G(V(V"0AA<<?<<? ^^$9^KK>>#&;;  (((44T\\477HU##(:(G(G(V(V"0CC<<?<<?#'77#	yyy$$(()<)<= !yJ ??yyy%%))$/

a
 !yy yyy%%))$/" !yy [[,,t$$$ U L" !yyy  	
 __:(:(:F (+||~$1nnX777dkkll4(((	 !yyy !yyy %s  C,P.L/C"PL? "L#L? &&L$L? L!	L? !!POP1O7PO&P)O8*P-1O>P)O;**PPPL? !L? $L<*L-+L<7L? ?AON1OOOPPO5$O'%O51P;P>PPPPc                   U R                   [        R                  :w  GaK  U(       Ga  [        R                  " 5       U-
  nU R
                  (       aX  U R                  R                  c   eU R                  R                  R                  U R                  [        R                  U5        U R                  (       a}  [        R                  " [        R                   5      (       aT  [#        [        U R$                  [&        R(                  U R                  S   U R                  S   S[        R                  US9  [+        U R                  5      n[-        U R                  [/        S5      US9  g g )Nr   rk   <An error occurred while trying to establish a new connectionr  r  r  r  r  r   r  zconnection pool pausedr  )r;  r0  r4  r   r   r   r   r   #publish_connection_check_out_failedr   r.   
CONN_ERRORr   r*   r  r  r  r,   r   r+   CHECKOUT_FAILEDr   r   r   )r   r  
emit_eventr  r   s        rQ   _raise_if_not_readyPool._raise_if_not_readyk  s   ::(>>+.CC((9955AAAII..RR&D&O&OQY ++0B0O0OPWP]P]0^0^*!% 8 H H#'<<?#'<<?]<GG#+	 +4995G%m,DEW^+ )rS   c                  #    U R                   [        R                  " 5       :w  a  U R                  5       I Sh  vN   U R                  (       Ga  [
        R                  " 5       U-
  nU R                  (       aX  U R                  R                  c   eU R                  R                  R                  U R                  [        R                  U5        U R                  (       a}  [        R                   " ["        R$                  5      (       aT  ['        [        U R(                  [*        R,                  U R                  S   U R                  S   S[        R                  US9  [/        S5      eU R0                   ISh  vN   U =R2                  S-  sl        SSS5      ISh  vN   [4        R6                  " 5       (       a  [4        R8                  " 5       nOJU R                  R:                  (       a-  [
        R                  " 5       U R                  R:                  -   nOSnU R<                   ISh  vN   U R?                  USS9  U R@                  U RB                  :  d  [E        U R<                  U5      I Sh  vN (       dE  U R@                  U RB                  :  a  U R<                  RG                  5         U RI                  U5        U R?                  USS9  U R@                  U RB                  :  d  M  U =R@                  S-  sl         SSS5      ISh  vN   SnS	nS	n U R0                   ISh  vN   U =RJ                  S-  sl%        SnSSS5      ISh  vN   UGc  U RL                   ISh  vN   U R?                  US	S9  U RN                  (       d  U RP                  U RR                  :  d  [E        U RL                  U5      I Sh  vN (       dX  U RN                  (       d  U RP                  U RR                  :  a  U RL                  RG                  5         SnU RI                  U5        U R?                  US	S9  U RN                  (       d  U RP                  U RR                  :  d  M   U RN                  RU                  5       nSSS5      ISh  vN   U(       a  U RY                  U5      (       a  SnGMY  Ol U R[                  US
9I Sh  vN nU RL                   ISh  vN   U =RP                  S-  sl(        U RL                  RG                  5         SSS5      ISh  vN   Uc  GM  SUl3        U$  GN GN GN! , ISh  vN  (       d  f       GN= f GN$ GN GNG! , ISh  vN  (       d  f       GN]= f GNI GN%! , ISh  vN  (       d  f       GN;= f GN* GN! [V         a    U =RP                  S-  sl(         GN?f = f GN8! , ISh  vN  (       d  f       GNN= f GN GN	 N! , ISh  vN  (       d  f       N= f! U RL                   ISh  vN    U =RP                  S-  sl(        U RL                  RG                  5         SSS5      ISh  vN    f ! , ISh  vN  (       d  f       f = f= f! [\         Ga    U(       a  UR_                  [`        Rb                  5        U R<                   ISh  vN    U =R@                  S-  sl         U(       a  U =RJ                  S-  sl%        U R<                  RG                  5         SSS5      ISh  vN    O! , ISh  vN  (       d  f       O= fU(       Gd  [
        R                  " 5       U-
  nU R                  (       aX  U R                  R                  c   eU R                  R                  R                  U R                  [        Rd                  U5        U R                  (       a}  [        R                   " ["        R$                  5      (       aT  ['        [        U R(                  [*        R,                  U R                  S   U R                  S   S[        Rd                  US9  e f = f7f)z=Get or create a AsyncConnection. Can raise ConnectionFailure.Nr   rk   zConnection pool was closedr  z?Attempted to check out a connection from closed connection poolT)r  Fr  r  )4rF  rD  rE  r|  r   r   r   r   r   r   r  r   r.   rf  r   r*   r  r  r  r,   r   r+   r  r  rA  rT  r   r   get_deadlinewait_queue_timeoutrJ  r  rK  rL  r   r  _raise_wait_queue_timeoutrB  rM  r>  rP  rO  popleft
IndexError	_perishedr  ru  r  r/   r  r  r   )r   r  r  r  r   r   r  emitted_events           rQ   r  Pool._get_conn  s     88ryy{"**,,,;;;~~'*??H$$yy11===		**NNLL"@"L"Lh '',>,K,KGMM,Z,Z&!__4DD#||A#||A78DD'	 #Q  999  A%  9 ))+HYY))~~'$))*F*FFHH>>>$$%:t$L}}t'9'99'AAA }}t'9'99--/223HI(()>4(P }}t'9'99 MMQM "> >	yyy##q(#" !y ,  444,,-Bu,U#zzT]]T=Q=Q-Q%/0I0I8%TTT  $zzT]]T=Q=Q-Q $ 9 9 @ @ B,0M ::;PQ001FSX0Y  $zzT]]T=Q=Q-Q+#zz113 54  ~~d++#  ,?%)\\'\%BB#'#<#<#< MMQ.M 55<<> $=#<7 ,x i -0 999 " B ">>>" !yyy 5  U & +*+ 5444,  C#<#<#<#<4#<#<#< MMQ.M 55<<> $=#<#<#<#<#<  	 6 < <=~~~"''1,'%%'	 &~~~~~ !>>+.CC((9955AAAII..RR&D&O&OQY ++0B0O0OPWP]P]0^0^*!% 8 H H#'<<?#'<<?]<GG#+	 9	sv  7aT.E a:T1;a>T7aT4 Ba.U/a2AU6U7A8U1UaU
aY8 -U6.Y8 1U<	Y8 U9Y8 -V.Y8 1AWVBW&V Y8 W'Y8 4X W!X Y8 W$Y8 0W)Y8 W'Y8 %
a1a4a7U=U >U
	aUaU3!U$"U3.a6Y8 9Y8 <VVV	Y8 WW <W?W  WY8 WWWY8 !X $Y8 'Y8 )X /W20X <Y8 Y5X
Y50Y	Y5YY5Y2!Y$"Y2.Y55Y8 8Aa9Z<:a>A\
a\a\3	"\%#\3	/D aac                	  #    UR                   nUR                  nSUl        SUl         SUl        U R                  R	                  U5        U R
                  R                  nU R                   ISh  vN   U R                  R	                  UR                  5        SSS5      ISh  vN   U R                  (       a+  Uc   eUR                  U R                  UR                  5        U R                  (       aw  [        R                   " ["        R$                  5      (       aN  ['        [        U R(                  [*        R,                  U R                  S   U R                  S   UR                  S9  U R.                  [0        R2                  " 5       :w  a  U R5                  5       I Sh  vN   GOU R6                  (       a!  UR9                  [:        R<                  5        GOUR6                  (       a  U R                  (       a:  Uc   eUR?                  U R                  UR                  [:        R@                  5        U R                  (       a  [        R                   " ["        R$                  5      (       au  ['        [        U R(                  [*        RB                  U R                  S   U R                  S   UR                  [E        [:        R@                  5      [:        R@                  S9  OU R                   ISh  vN   U RG                  URH                  URJ                  5      (       a   UR9                  [:        RL                  5        OiURO                  5         URQ                  [S        U RT                  5      5        U RV                  RY                  U5        U RZ                  R]                  5         SSS5      ISh  vN   U R^                   ISh  vN   U(       a  U =R`                  S-  sl0        OU(       a  U =Rb                  S-  sl1        U =Rd                  S-  sl2        U =Rf                  S-  sl3        U =Rh                  S-  sl4        U R^                  R]                  5         SSS5      ISh  vN   g GN
 GN! , ISh  vN  (       d  f       GN= f GN GN N! , ISh  vN  (       d  f       N= f N NJ! , ISh  vN  (       d  f       g= f7f)zvReturn the connection to the pool, or if it's closed discard it.

:param conn: The connection to check into the pool.
FNr   rk   r  r  )5r   r   r   rU  rn  r   r   rA  r@  r   r   publish_connection_checked_inr   r   r   r*   r  r  r  r,   r   r+   	CHECKEDINrF  rD  rE  r|  r   r  r/   rf  r  r  r  r-   r  r   r   r  r  r  r   r   r>  r  rM  r  rJ  rW  rV  rK  rB  rT  )r   r   txncursorr   s        rQ   r  Pool.checkin  s    
 oo##"%%d+II..	999  (()<)<= 9  (((33DLL$''J##(:(G(G(V(V"0::<<?<<?#'77 88ryy{"**,,,{{ 6 B BC(($00077dgg/E/K/K ++0B0O0OPWP]P]0^0^*!% 8 D D#'<<?#'<<?+/77?@V@\@\]4::	  999 ,,T__dooNN(>(D(DE557//T5E5E0FG

--d31188: %9 >>>

a
"MMQM1$  A% NN!!# ">>e 999 -. %999 ">>>s   A/S1Q;2S5&RS&Q>'C>S%R&ES:R;S>B5R$3S>R"?SR>SBS*S5S 6S>SRR
R	SS"S$R;*R-+R;7S SSS	SSc                   UR                  5       nU R                  R                  b9  X R                  R                  :  a   UR                  [        R
                  5        gU R                  bT  U R                  S:X  d  X R                  :  a5  UR                  5       (       a   UR                  [        R                  5        gU R                  UR                  UR                  5      (       a   UR                  [        R                  5        gg)aY  Return True and close the connection if it is "perished".

This side-effecty function checks if this socket has been idle for
for longer than the max idle time, or if the socket has been closed by
some external network error, or if the socket's generation is outdated.

Checking sockets lets us avoid seeing *some*
:class:`~pymongo.errors.AutoReconnect` exceptions on server
hiccups, etc. We only check if the socket was closed by an external
error if it has been > 1 second since the socket was checked into the
pool, to keep performance reasonable - we can't avoid AutoReconnects
completely anyway.
Tr   F)r  r   r  r  r/   r  r<  r  r  r  r   r   r  )r   r   r  s      rQ   r  Pool._perishedK  s     !224 II++7!II$C$CCOO2778''3((A-1BEaEa1a!! 6 < <=  $//BBOO2889rS   c                   U R                   R                  n[        R                  " 5       U-
  nU R                  (       a0  Uc   eUR                  U R                  [        R                  U5        U R                  (       a}  [        R                  " [        R                  5      (       aT  [        [        U R                  [         R"                  U R                  S   U R                  S   S[        R                  US9  [$        R&                  " 5       =(       d    U R                   R(                  nU R                   R*                  (       al  U R,                  U R.                  -
  U R0                  -
  n[3        SR5                  U R                   R6                  U R.                  U R0                  UU5      5      e[3        SU R                   R6                   SU 35      e)Nr   rk   zBWait queue timeout elapsed without a connection becoming availabler  zTimeout waiting for connection from the connection pool. maxPoolSize: {}, connections in use by cursors: {}, connections in use by transactions: {}, connections in use by other operations: {}, timeout: {}zMTimed out while checking out a connection from connection pool. maxPoolSize: z, timeout: )r   r   r   r   r   r  r   r.   TIMEOUTr   r*   r  r  r  r,   r   r+   r  r   r   r  r   rB  rV  rW  r#   r  rL  )r   r  r   r  r   	other_opss         rQ   r  Pool._raise_wait_queue_timeouto  sp   II..	>>#&;;  (((99<DDh ##(:(G(G(V(V"0@@<<?<<?[4<<#	 ##%E)E)E99""++dmm;djjHI'7 8>vII++MMJJ8	  $ II334KyJ
 	
rS   c                L    U R                    H  nUR                  S 5        M     g r[   )r>  r  )r   r   s     rQ   __del__Pool.__del__  s     JJDOOD! rS   )__pinned_socketsr<  r   rO  rM  rP  r@  rB  r   r>  r   r   r   rG  r   rA  rL  rV  rC  rW  rT  r   rF  rK  rJ  r;  )TN)r   rG   r   r1   rG  r   rX  r-  r   r   )TNF)
r  r   rj  r   r   r-  rb  r   r   r   )r   zOptional[bool]r   r   r   )r   r-  rb  r   r   r   r.  )r  r^   r   r   r[   )r  "Optional[_MongoClientErrorHandler]r   r   )r  r  r   z%AsyncGenerator[AsyncConnection, None])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   rq  r  rx  r|  r  r  r  r  
contextlibasynccontextmanagerr  r  r  r  r  r  r  r   rU   rS   rQ   r  r    sX   
 (,TT T 	T
 &Tl" . . )-&+O>O> O> '	O>
  $O> 
O>b= TY
,
LP
	
4&/7,rBH ##<@K%9K%	.K% $K%Z6 [_|%*|5W|	||F$P"H%
N"rS   r  )rO   r^   r   r   )rt   socket.socketr~   r   r   r^   r   r   )rt   r  r   r   )NN)
r   r   r   r  r   r  r   Optional[dict[str, float]]r   r	   )r   r'   r   r  r   r   )r   r1   r   zdict[str, float])r   r  r   r   )r   rG   r   r1   r   r  )r   rG   r   r1   r   r  )
__future__r   r  r  r  r	  r  rD  rr   r  r  rH  r   r   typingr   r   r   r   r   r	   r
   r   r   bsonr   pymongor   r   #pymongo.asynchronous.client_sessionr   pymongo.asynchronous.helpersr   pymongo.asynchronous.networkr   r   pymongo.commonr   r   r   r   r   pymongo.errorsr   r   r   r   r   r   r   r    r!   r"   r#   r$   pymongo.hellor%   r&   pymongo.lockr'   r(   r)   pymongo.loggerr*   r+   r,   r-   pymongo.monitoringr.   r/   pymongo.network_layerr0   pymongo.pool_optionsr1   pymongo.read_preferencesr2   pymongo.server_apir3   pymongo.server_typer4   pymongo.socket_checkerr5   pymongo.ssl_supportr6   r7   r8   bson.objectidr9   pymongo.asynchronous.authr:   r;   !pymongo.asynchronous.mongo_clientr<   r=   pymongo.compression_supportr>   r?   r@   pymongo.messagerA   rB   pymongo.pyopenssl_contextrC   pymongo.read_concernrD   rE   pymongo.typingsrF   rG   rH   pymongo.write_concernrI   rM   rJ   rK   rL   rR   ImportErrorr  rn   rp   r   platform_winregr\   rf   OpenKeyHKEY_LOCAL_MACHINEra   rm   ro   r_   rw   r   r   r   r   r   r   r   r  r  r  r  r0  r  rU   rS   rQ   <module>r     ss   #      	  
 
   
 
 
 ' ) O 7 A     - : :  0 , 3 . + 0 1!&6F\ 
 1204CC2E99/    <<7 
(^^%%'\
#)##H '-c3F'M$	
M? !%26	,,, , 0	,
 ,:)
	 O
 O
dD,NAA +A#AH| + +> Q" Q"s  EE	E"  
 

  (  '#' 	(sT   H0 1I 9I" I+I" 0H>=H>
II
II" I" "
I/.I/