
    i                    :   d dl mZmZ d dlZd dlmZmZmZ d dlm	Z	m
Z
 d dlZd dlZd dlZd dlZd dlZd dlmZmZmZmZ d dlZd dlZd dlZdej        v r	d dlmZmZ nd dlmZmZ d dlmZmZm Z m!Z! d d	l"m#Z# d d
l$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7m8Z8 d dl9m:Z:  ej;        e<          Z= e7            Z>dZ? e:            Z@	 d dlAZA	 d dlAmBZC n# eD$ r eAZCY nw xY w	 eCjE         eCjF         n1# eG$ r)  eDdH                     eIeC                              w xY wd ZJd ZKeJeKfe@d<    e7eJeK          Z?n# eD$ r Y nw xY w	 d dlLZLd ZFeLjE        eFfe@d<   n# eD$ r Y nw xY wdej        d         jM        cZNZOdZPd ZQdZRdZS ejT        d          ZU ejT        d          ZV G d deW          ZX G d deW          ZYe G d d eX                      ZZ G d! d"eY          Z[e G d# d$eX                      Z\ G d% d&eY          Z]e G d' d(eX                      Z^ G d) d*eW          Z_ej`        eja        fZb G d+ d,ec          Zd G d- d.ed          Ze G d/ d0ed          Zf G d1 d2ec          Zg G d3 d4ec          Zh G d5 d6ed          Zi G d7 d8eW          Zj G d9 d:eW          Zkd; Zld<Zm G d= d>eW          Zn G d? d@eW          Zo G dA dBeW          Zp G dC dDeW          Zq G dE dFe          Zr G dG dHeW          Zs G dI dJeW          ZtdS )K    )defaultdictdequeN)wrapspartialtotal_ordering)heappushheappop)ThreadEventRLock	Conditionzgevent.monkey)QueueEmpty)ConsistencyLevelAuthenticationFailedOperationTimedOutProtocolVersion)
int32_pack)ReadyMessageAuthenticateMessageOptionsMessageStartupMessageErrorMessageCredentialsMessageQueryMessageResultMessageProtocolHandlerInvalidRequestExceptionSupportedMessageAuthResponseMessageAuthChallengeMessageAuthSuccessMessageProtocolExceptionRegisterMessageReviseRequestMessage)SegmentCodecCrcException)OrderedDict)blockzlz4 not imported correctly. Imported object should have .compress and and .decompress attributes but does not. Please file a bug report on JIRA. (Imported object was {lz4_block}))	lz4_blockc                 t    t          t          |                     t          j        |           dd          z   S )N   )r   lenr*   compressbytss    f/Users/user/workspace/sujinbaek/cqa-test-app/venv/lib/python3.11/site-packages/cassandra/connection.pylz4_compressr2   W   s/    #d))$$y'9$'?'?'CCC    c                 R    t          j        | dd d         | dd          z             S )N   r,   )r*   
decompressr/   s    r1   lz4_decompressr8   [   s*    #DBK$qrr($:;;;r3   lz4c                 :    | dk    rdS t          j        |           S )N  )snappyr7   r/   s    r1   r7   r7   h   s!    6>>2 &&&r3   r=   zApache Cassandra Python Driver	cassandra      z>BbBiz>BhBic                   p    e Zd ZdZed             Zed             Zed             Zed             Zd Z	dS )EndPointzD
    Represents the information to connect to a cassandra node.
    c                     t                      )zq
        The IP address of the node. This is the RPC address the driver uses when connecting to the node
        NotImplementedErrorselfs    r1   addresszEndPoint.address       
 "###r3   c                     t                      )z'
        The port of the node.
        rD   rF   s    r1   portzEndPoint.port   rI   r3   c                     dS )z8
        SSL options specific to this endpoint.
        N rF   s    r1   ssl_optionszEndPoint.ssl_options   s	    
 tr3   c                     t           j        S )z4
        The socket family of the endpoint.
        )socket	AF_UNSPECrF   s    r1   socket_familyzEndPoint.socket_family   s    
 r3   c                     t                      )zl
        Resolve the endpoint to an address/port. This is called
        only on socket connection.
        rD   rF   s    r1   resolvezEndPoint.resolve   rI   r3   N)
__name__
__module____qualname____doc__propertyrH   rK   rN   rR   rT   rM   r3   r1   rB   rB   z   s          $ $ X$ $ $ X$   X     X $ $ $ $ $r3   rB   c                       e Zd ZdZd Zd ZdS )EndPointFactoryNc                     || _         | S )zJ
        This is called by the cluster during its initialization.
        )cluster)rG   r]   s     r1   	configurezEndPointFactory.configure   s     r3   c                     t                      )z=
        Create an EndPoint from a system.peers row.
        rD   )rG   rows     r1   createzEndPointFactory.create   s     "###r3   )rU   rV   rW   r]   r^   ra   rM   r3   r1   r[   r[      s7        G  $ $ $ $ $r3   r[   c                   j    e Zd ZdZddZed             Zed             Zd Zd Z	d Z
d	 Zd
 Zd ZdS )DefaultEndPointzN
    Default EndPoint implementation, basically just an address and port.
    R#  c                 "    || _         || _        d S N_address_port)rG   rH   rK   s      r1   __init__zDefaultEndPoint.__init__   s    


r3   c                     | j         S rf   )rh   rF   s    r1   rH   zDefaultEndPoint.address   s
    }r3   c                     | j         S rf   ri   rF   s    r1   rK   zDefaultEndPoint.port   
    zr3   c                     | j         | j        fS rf   rg   rF   s    r1   rT   zDefaultEndPoint.resolve   s    }dj((r3   c                 l    t          |t                    o| j        |j        k    o| j        |j        k    S rf   )
isinstancerc   rH   rK   rG   others     r1   __eq__zDefaultEndPoint.__eq__   s9    %11 I|u},I15ej1H	Ir3   c                 8    t          | j        | j        f          S rf   )hashrH   rK   rF   s    r1   __hash__zDefaultEndPoint.__hash__   s    T\49-...r3   c                 >    | j         | j        f|j         |j        fk     S rf   )rH   rK   rr   s     r1   __lt__zDefaultEndPoint.__lt__   s    di(EM5:+FFFr3   c                 >    t          d| j        | j        fz            S )Nz%s:%d)strrH   rK   rF   s    r1   __str__zDefaultEndPoint.__str__   s    7dlDI66777r3   c                 :    d| j         j        | j        | j        fz  S )Nz<%s: %s:%d>)	__class__rU   rH   rK   rF   s    r1   __repr__zDefaultEndPoint.__repr__   s     7tyQQQr3   N)rd   )rU   rV   rW   rX   rj   rY   rH   rK   rT   rt   rw   ry   r|   r   rM   r3   r1   rc   rc      s               X   X) ) )I I I/ / /G G G8 8 8R R R R Rr3   rc   c                   "    e Zd ZdZ	 ddZd ZdS )DefaultEndPointFactoryNc                     || _         d S rf   )rK   )rG   rK   s     r1   rj   zDefaultEndPointFactory.__init__   s    			r3   c                     ddl m} |                    |          }|                    |          }|| j        r| j        nd}t          | j        j                            |          |          S )Nr   )	_NodeInford   )	cassandra.metadatar   get_broadcast_rpc_addressget_broadcast_rpc_portrK   rc   r]   address_translator	translate)rG   r`   r   addrrK   s        r1   ra   zDefaultEndPointFactory.create   s~    00000022377//44< $	3499tD L+55d;;  	r3   rf   )rU   rV   rW   rK   rj   ra   rM   r3   r1   r   r      sA        D
       r3   r   c                       e Zd ZdZddZed             Zed             Zed             Zd Z	d	 Z
d
 Zd Zd Zd Zd ZdS )SniEndPointz"SNI Proxy EndPoint implementation.rd   r   c                 ^    || _         || _        d | _        || _        || _        d|i| _        d S )Nserver_hostname)_proxy_address_index_resolved_addressri   _server_name_ssl_options)rG   proxy_addressserver_namerK   
init_indexs        r1   rj   zSniEndPoint.__init__   s;    + !%
'.<r3   c                     | j         S rf   )r   rF   s    r1   rH   zSniEndPoint.address  s    ""r3   c                     | j         S rf   rm   rF   s    r1   rK   zSniEndPoint.port  rn   r3   c                     | j         S rf   )r   rF   s    r1   rN   zSniEndPoint.ssl_options	  s      r3   c                 V   	 |                                  }n=# t          j        $ r+ t                              d| j        | j        fz              w xY wt          d |D                       | j        t          |          z           | _
        | xj        dz  c_        | j
        | j        fS )Nz6Could not resolve sni proxy hostname "%s" with port %dc              3   2   K   | ]}|d          d         V  dS )r,   r   NrM   ).0r   s     r1   	<genexpr>z&SniEndPoint.resolve.<locals>.<genexpr>  s*      'R'RtQ
'R'R'R'R'R'Rr3      )_resolve_proxy_addressesrP   gaierrorlogdebugr   ri   sortedr   r-   r   )rG   resolved_addressess     r1   rT   zSniEndPoint.resolve  s    	!%!>!>!@!@ 	 	 	II %(,(;TZ'HI J J J	 "('R'R?Q'R'R'R!R!RSWS^adewaxaxSx!yq%tz11s	    :Ac                 l    t          j        | j        | j        t           j        t           j                  S rf   )rP   getaddrinfor   ri   rQ   SOCK_STREAMrF   s    r1   r   z$SniEndPoint._resolve_proxy_addresses  s.    !$"5tz"("2F4FH H 	Hr3   c                     t          |t                    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S rf   )rq   r   rH   rK   r   rr   s     r1   rt   zSniEndPoint.__eq__  sI    5+.. 8-826)uz2I8!U%77	9r3   c                 D    t          | j        | j        | j        f          S rf   )rv   rH   rK   r   rF   s    r1   rw   zSniEndPoint.__hash__$  s    T\49d.?@AAAr3   c                 V    | j         | j        | j        f|j         |j        | j        fk     S rf   )rH   rK   r   rr   s     r1   ry   zSniEndPoint.__lt__'  s/    ty$*;<
D,=>? 	@r3   c                 J    t          d| j        | j        | j        fz            S )Nz%s:%d:%s)r{   rH   rK   r   rF   s    r1   r|   zSniEndPoint.__str__+  s#    :ty$:K LLMMMr3   c                 F    d| j         j        | j        | j        | j        fz  S )Nz<%s: %s:%d:%s>)r~   rU   rH   rK   r   rF   s    r1   r   zSniEndPoint.__repr__.  s,    4>#:#'<D<M#O O 	Or3   N)rd   r   )rU   rV   rW   rX   rj   rY   rH   rK   rN   rT   r   rt   rw   ry   r|   r   rM   r3   r1   r   r      s        ,,= = = = # # X#   X ! ! X!2 2 2H H H9 9 9
B B B@ @ @N N NO O O O Or3   r   c                        e Zd Zd Zd Zd ZdS )SniEndPointFactoryc                 0    || _         || _        d| _        d S )Nr6   )r   ri   _init_index)rG   r   rK   s      r1   rj   zSniEndPointFactory.__init__5  s!    +
 r3   c                     |                     d          }|t          d          | xj        dz  c_        t          | j        t          |          | j        | j                  S )Nhost_idz$No host_id to create the SniEndPointr   )get
ValueErrorr   r   r   r{   ri   )rG   r`   r   s      r1   ra   zSniEndPointFactory.create?  s]    '')$$?CDDDA4.Gdj$JZ[[[r3   c                 d    | xj         dz  c_         t          | j        || j        | j                   S )Nr   )r   r   r   ri   )rG   snis     r1   create_from_sniz"SniEndPointFactory.create_from_sniG  s2    A4.TZAQRRRr3   N)rU   rV   rW   rj   ra   r   rM   r3   r1   r   r   3  sI          \ \ \S S S S Sr3   r   c                   ~    e Zd ZdZd Zed             Zed             Zed             Zd Z	d Z
d Zd	 Zd
 Zd ZdS )UnixSocketEndPointz.
    Unix Socket EndPoint implementation.
    c                     || _         d S rf   _unix_socket_path)rG   unix_socket_paths     r1   rj   zUnixSocketEndPoint.__init__R  s    !1r3   c                     | j         S rf   r   rF   s    r1   rH   zUnixSocketEndPoint.addressU      %%r3   c                     d S rf   rM   rF   s    r1   rK   zUnixSocketEndPoint.portY  s    tr3   c                     t           j        S rf   )rP   AF_UNIXrF   s    r1   rR   z UnixSocketEndPoint.socket_family]  s
    ~r3   c                     | j         d fS rf   )rH   rF   s    r1   rT   zUnixSocketEndPoint.resolvea  s    |T!!r3   c                 L    t          |t                    o| j        |j        k    S rf   )rq   r   r   rr   s     r1   rt   zUnixSocketEndPoint.__eq__d  s*    5"455 B&%*AA	Cr3   c                 *    t          | j                  S rf   )rv   r   rF   s    r1   rw   zUnixSocketEndPoint.__hash__h  s    D*+++r3   c                 "    | j         |j         k     S rf   r   rr   s     r1   ry   zUnixSocketEndPoint.__lt__k  s    %(???r3   c                 ,    t          | j                  S rf   )r{   r   rF   s    r1   r|   zUnixSocketEndPoint.__str__n  s    411444r3   c                 2    d| j         j        d| j        dS )N<: >)r~   rU   r   rF   s    r1   r   zUnixSocketEndPoint.__repr__q  s#     !^444d6L6L6LMMr3   N)rU   rV   rW   rX   rj   rY   rH   rK   rR   rT   rt   rw   ry   r|   r   rM   r3   r1   r   r   L  s         2 2 2 & & X&   X   X" " "C C C, , ,@ @ @5 5 5N N N N Nr3   r   c                        e Zd Zd Zd Zd ZdS )_Framec                 Z    || _         || _        || _        || _        || _        || _        d S rf   )versionflagsstreamopcodebody_offsetend_pos)rG   r   r   r   r   r   r   s          r1   rj   z_Frame.__init__v  s1    
&r3   c                     t          |t                    r`| j        |j        k    oO| j        |j        k    o?| j        |j        k    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S t          S rf   )	rq   r   r   r   r   r   r   r   NotImplementedrr   s     r1   rt   z_Frame.__eq__~  s    eV$$ 	3LEM1 2J%+-2K5</2 K5</2 $(99	2
 LEM13 r3   c           	          d                     | j        | j        | j        | j        | j        | j        | j        z
            S )NzEver({0}); flags({1:04b}); stream({2}); op({3}); offset({4}); len({5}))formatr   r   r   r   r   r   rF   s    r1   r|   z_Frame.__str__  sr    V]]^b^jlplvx|  yD  FJ  FQ  SW  Sc  ei  eq  tx  tD  eD  E  E  	Er3   N)rU   rV   rW   rj   rt   r|   rM   r3   r1   r   r   u  sF            E E E E Er3   r   c                   0    e Zd ZdZddZed             ZdS )ConnectionExceptionz
    An unrecoverable error was hit when attempting to use a connection,
    or the connection was already closed or defunct.
    Nc                 J    t                               | |           || _        d S rf   )	Exceptionrj   endpoint)rG   messager   s      r1   rj   zConnectionException.__init__  s#    4))) r3   c                     | j         j        S rf   r   rH   rF   s    r1   hostzConnectionException.host      }$$r3   rf   )rU   rV   rW   rX   rj   rY   r   rM   r3   r1   r   r     sM         
! ! ! ! % % X% % %r3   r   c                       e Zd ZdZdS )ConnectionShutdownzQ
    Raised when a connection has been marked as defunct or has been closed.
    NrU   rV   rW   rX   rM   r3   r1   r   r               	Dr3   r   c                   "     e Zd ZdZ fdZ xZS )ProtocolVersionUnsupportedzM
    Server rejected startup message due to unsupported protocol version
    c                 v    d||fz  }t          t          |                               ||           || _        d S )Nz&Unsupported protocol version on %s: %d)superr   rj   startup_version)rG   r   r   msgr~   s       r1   rj   z#ProtocolVersionUnsupported.__init__  sA    6(O9TT($//88hGGG.r3   )rU   rV   rW   rX   rj   __classcell__)r~   s   @r1   r   r     sB         / / / / / / / / /r3   r   c                       e Zd ZdZdS )ConnectionBusyz
    An attempt was made to send a message through a :class:`.Connection` that
    was already at the max number of in-flight operations.
    Nr   rM   r3   r1   r   r     s          	Dr3   r   c                       e Zd ZdZdS )ProtocolErrorzL
    Communication did not match the protocol that this driver expects.
    Nr   rM   r3   r1   r   r     r   r3   r   c                       e Zd ZdS )CrcMismatchExceptionNrU   rV   rW   rM   r3   r1   r   r     s        Dr3   r   c                   *    e Zd ZdZdZ	 dZ	 dZ	 d ZdS )ContinuousPagingStatez_
     A class for specifying continuous paging state, only supported starting with DSE_V2.
    Nc                 0    || _         d| _        || _        d S Nr   )num_pages_requestednum_pages_receivedmax_queue_size)rG   r   s     r1   rj   zContinuousPagingState.__init__  s     #1 "#,r3   )rU   rV   rW   rX   r   r   r   rj   rM   r3   r1   r   r     sS            N- - - - -r3   r   c                   J    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S )ContinuousPagingSessionc                     || _         || _        || _        || _        t	                      | _        d| _        t                      | _        || _	        d| _
        d S NF)	stream_iddecoderrow_factory
connectionr   
_condition_stopr   _page_queue_statereleased)rG   r   r  r  r  states         r1   rj   z ContinuousPagingSession.__init__  sO    "&$#++
 77r3   c                     t          |t                    r|                     |           d S t          |t                    r|                     |           d S d S rf   )rq   r   on_pager   on_errorrG   results     r1   
on_messagez"ContinuousPagingSession.on_message  s`    fm,, 	"LL     -- 	"MM&!!!!!	" 	"r3   c                 F   | j         5  | j        r| j        xj        dz  c_        | j                            |j        |j        d f           | xj        |j        z  c_        | j         	                                 d d d            n# 1 swxY w Y   |j        r	d| _
        d S d S )Nr   T)r  r  r   r  
appendleftcolumn_namesparsed_rowsr  continuous_paging_lastnotifyr  r  s     r1   r  zContinuousPagingSession.on_page  s    _ 	% 	%{ 4..!3..'')<f>PRV(WXXXJJ&77JJO""$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% ( 	! DMMM	! 	!s   A2BB
B
c                 `   t          |t                    r|                                }t                              d|| j                   | j        5  | j                            d d |f           d| _	        | j        
                                 d d d            n# 1 swxY w Y   d| _        d S )NzGot error %s for session %sT)rq   r   to_exceptionr   r   r   r  r  r  r  r  r  )rG   errors     r1   r  z ContinuousPagingSession.on_error  s    e\** 	)&&((E		/GGG_ 	% 	%''tU(;<<<DJO""$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%
 s   >BB #B c              #     K   	 | j                                          	 | j        s0| j        s)| j                             d           | j        s| j        )| j        r| j                                        \  }}}|r||                                  | j                                          |                     ||          D ]}|V  | j                                          | j        | j        rn	 	 | j                                          d S # t          $ r Y d S w xY w# 	 | j                                          w # t          $ r Y w w xY wxY w)NT   timeout)
r  acquirer  r  waitpopmaybe_request_morereleaser  RuntimeError)rG   namesrowserrr`   s        r1   resultszContinuousPagingSession.results  s     	O##%%%* 44: 4O(((333 * 44: 4& .'+'7';';'='=$E4 "!	++---O++---#//t<< " "!				O++--- & . :  '')))))    ''))))    sB   C,D 2D 
DDE
 D:9E
:
EE
EE
c           	      \   | j         sd S | j         j        }| j         j        | j         j        z
  }|t	          | j                  z
  |z
  }t                              d| j        | j	        j
        || j         j        | j         j        |           ||dz  k    r|                     |           d S d S )NzYSession %s from %s, space in CP queue: %s, requested: %s, received: %s, num_in_flight: %s   )r  r   r   r   r-   r  r   r   r   r  r   update_next_pages)rG   r   num_in_flightspace_in_queues       r1   r   z*ContinuousPagingSession.maybe_request_more  s    { 	F37$+:XX'#d.>*?*??-O		m.$/"6Hg+0-	A 	A 	A ^a///"">22222 0/r3   c                 :   	 | j         xj        |z  c_        t                              d| j        | j        j                   | j        j        5  | j                            t          t          j
        j        | j        |          | j                                        | j                   d d d            d S # 1 swxY w Y   d S # t          $ rK}t                              d| j        | j        j                   |                     |           Y d }~d S d }~ww xY w)Nz,Updating backpressure for session %s from %s)
next_pageszLFailed to update backpressure for session %s from %s, connection is shutdown)r  r   r   r   r   r  r   locksend_msgr%   RevisionTypePAGING_BACKPRESSUREget_request_id_on_backpressure_responser   r  )rG   num_next_pagesexs      r1   r)  z)ContinuousPagingSession.update_next_pages-  s   	K++~=++IIDdnVZVeVjkkk% I I(()=>R>_>s>BnIW*Y *Y *Y *.)G)G)I)I)-)G	I I II I I I I I I I I I I I I I I I I I " 	 	 	IIdndo&:< < <MM"	s>   AC AB8+C 8B<<C ?B< C 
DA DDc           	      >   t          |t                    r"t                              d| j                   d S t                              d| j        | j        j        t          |d          r|	                                n|           | 
                    |           d S )Nz'Paging session %s backpressure updated.z7Failed updating backpressure for session %s from %s: %sr  )rq   r   r   r   r   r  r  r   hasattrr  r  rG   responses     r1   r3  z1ContinuousPagingSession._on_backpressure_response<  s    h.. 	$II?PPPPPIIOQUQ_aeapau18>1R1R`h++---X`b b bMM(#####r3   c                 R   	 t                               d| j        | j        j                   | j        j        5  | j                            t          t          j        j	        | j                  | j        
                                | j                   d d d            n# 1 swxY w Y   n;# t          $ r. t                               d| j        | j        j                   Y nw xY w| j        5  d| _        | j                                         d d d            d S # 1 swxY w Y   d S )Nz#Canceling paging session %s from %sz;Failed to cancel session %s from %s, connection is shutdownT)r   r   r   r  r   r.  r/  r%   r0  PAGING_CANCELr2  _on_cancel_responser   r  r  r  rF   s    r1   cancelzContinuousPagingSession.cancelD  s   		<II;T^T_Mabbb% C C(()=>R>_>m>Bn*N *N)-)G)G)I)I)-)AC C CC C C C C C C C C C C C C C C
 " 	< 	< 	<IISndo&:< < < < <	< _ 	% 	%DJO""$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%sG   7B, AB B,  B$$B, 'B$(B, ,5C$#C$.!DD #D c           	          t          |t                    r!t                              d| j                   nPt                              d| j        | j        j        t          |d          r|	                                n|           d| _
        d S )NzPaging session %s canceled.z1Failed canceling streaming session %s from %s: %sr  T)rq   r   r   r   r   r  r  r   r7  r  r  r8  s     r1   r<  z+ContinuousPagingSession._on_cancel_responseT  s    h.. 	bII3T^DDDDIII4>[_[j[o18>1R1R`h++---X`b b br3   N)rU   rV   rW   rj   r  r  r  r&  r   r)  r3  r=  r<  rM   r3   r1   r   r     s        	 	 	" " "	! 	! 	!    23 3 3  $ $ $% % %     r3   r   c                 <     t                      fd            }|S )Nc                 x    	  | g|R i |S # t           $ r }|                     |           Y d }~d S d }~ww xY wrf   )r   defunct)rG   argskwargsexcfs       r1   wrapperz!defunct_on_error.<locals>.wrapper_  sk    	1T+D+++F+++ 	 	 	LL	s    
949)r   )rE  rF  s   ` r1   defunct_on_errorrG  ]  s3    
1XX    X
 Nr3   z3.0.0c                       e Zd ZdZdZdZdZdZd Ze	d             Z
e	d             Zd Ze	d             Ze	d	             Zd
 Zd Zd Zd ZdS )_ConnectionIOBufferz
    Abstraction class to ease the use of the different connection io buffers. With
    protocol V5 and checksumming, the data is read, validated and copied to another
    cql frame buffer.
    NFc                 h    t          j                    | _        t          j        |          | _        d S rf   )ioBytesIO
_io_bufferweakrefproxy_connection)rG   r  s     r1   rj   z_ConnectionIOBuffer.__init__v  s'    *,,"=44r3   c                     | j         S rf   )rM  rF   s    r1   	io_bufferz_ConnectionIOBuffer.io_bufferz  s
    r3   c                 ,    | j         r| j        n| j        S rf   )is_checksumming_enabled_cql_frame_bufferrM  rF   s    r1   cql_frame_bufferz$_ConnectionIOBuffer.cql_frame_buffer~  s    )-)E t%%O	r3   c                 ^    |                                   t          j                    | _        d S rf   )reset_io_bufferrK  rL  rU  rF   s    r1   set_checksumming_bufferz+_ConnectionIOBuffer.set_checksumming_buffer  s(    !#r3   c                     | j         j        S rf   )rP  _is_checksumming_enabledrF   s    r1   rT  z+_ConnectionIOBuffer.is_checksumming_enabled  s    88r3   c                     | j         S rf   )_segment_consumedrF   s    r1   has_consumed_segmentz(_ConnectionIOBuffer.has_consumed_segment  r   r3   c                 4    | j                                         S rf   )rR  tellrF   s    r1   readable_io_bytesz%_ConnectionIOBuffer.readable_io_bytes  s    ~""$$$r3   c                 4    | j                                         S rf   )rV  r`  rF   s    r1   readable_cql_frame_bytesz,_ConnectionIOBuffer.readable_cql_frame_bytes  s    $))+++r3   c                     t          j        | j                                                  | _        | j                            dd           d S Nr   r(  )rK  rL  rM  readseekrF   s    r1   rX  z#_ConnectionIOBuffer.reset_io_buffer  s?    *T_%9%9%;%;<<Q"""""r3   c                     | j         rMt          j        | j                                                  | _        | j                            dd           d S |                                  d S re  )rT  rK  rL  rU  rf  rg  rX  rF   s    r1   reset_cql_frame_bufferz*_ConnectionIOBuffer.reset_cql_frame_buffer  se    ' 	#%'Z0F0K0K0M0M%N%ND""''1-----  """""r3   )rU   rV   rW   rX   rM  rU  rP  r]  rj   rY   rR  rV  rY  rT  r^  ra  rc  rX  ri  rM   r3   r1   rI  rI  k  s         
 JK5 5 5   X   X. . . 9 9 X9 ' ' X'% % %, , ,# # ## # # # #r3   rI  c                      e Zd ZdZdZdZdZdZej	        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ez  d	z  ZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%e&Z'dZ(dZ)dZ*dZ+e,d
             Z-dddddddej	        dddddddfdZ.e,d             Z/e,d             Z0e1d             Z2e1d             Z3e1d             Z4e1d             Z5d Z6d Z7d Z8d Z9d Z:d Z;d Z<d Z=d Z>d Z?d Z@d ZAd  ZBd! ZCeDjE        eDjF        dfd"ZGd8d#ZHd$ ZId8d%ZJd8d&ZKd' ZLeMd(             ZNeMd)             ZOd* ZPeMd+             ZQd, ZRd- ZSeMd.             ZTeMd/             ZUeMd9d0            ZVeMd:d1            ZWeMd2             ZXd3 ZYd4 ZZe,d5             Z[d6 Z\d7 Z]e]Z^dS );
Connectiond   i   NFTr   i   r5   r,   c                     | j         j        S rf   )rM  rR  rF   s    r1   _iobufzConnection._iobuf  s     ((r3   z	127.0.0.1rd   c                 v   t          |t                    r|nt          ||          | _        || _        |r|                                ni | _        || _        || _        || _	        || _
        || _        |	| _        |
| _        || _        || _        || _        t#          t$                    | _        i | _        t+          |           | _        i | _        d| _        t%                      | _        || _        |r'| j                            | j        j        pi            n| j        j        r| j        j        | _        | j        s | j        r|                                 | _        |dk    r^t;          | j        dz
  d          | _        t;          d| j                  }tA          tC          |                    | _"        |dz
  | _#        nOt;          | j        d          | _        tA          tC          | j        dz                       | _"        | j        | _#        tI                      | _%        tM                      | _'        d S )NTr5   r   i  i,  r?   )(rq   rB   rc   r   authenticatorcopyrN   ssl_contextsockoptscompressioncql_versionprotocol_versionis_control_connectionuser_type_mapconnect_timeoutallow_beta_protocol_version
no_compactr   set_push_watchers	_requestsrI  rM  _continuous_paging_sessions_socket_writableorphaned_request_ids_on_orphaned_stream_releasedupdate_build_ssl_context_from_optionsminmax_in_flightmax_request_idr   rangerequest_idshighest_request_idr   r.  r   connected_event)rG   r   rK   rp  rN   rs  rt  ru  rv  rw  rx  ry  rz  r{  rr  on_orphaned_stream_releasedinitial_sizes                    r1   rj   zConnection.__init__  s    !+4 : :[PTVZ@[@[*1<D;++---"& && 0%:"*.+F($)#..-d33+-( $$'EE!,G) 	9##DM$=$CDDDD]& 	9#}8D  	FD$4 	F#CCEEDq  "%d&81&<m"L"LD sD$677L$U<%8%899D&2Q&6D##"%d&8,"G"GD$U4+>+B%C%CDDD&*&9D#GG	$wwr3   c                     | j         j        S rf   r   rF   s    r1   r   zConnection.host5  r   r3   c                     | j         j        S rf   )r   rK   rF   s    r1   rK   zConnection.port9  s    }!!r3   c                     dS )z
        Called once by Cluster.connect().  This should be used by implementations
        to set up any resources that will be shared across connections.
        NrM   clss    r1   initialize_reactorzConnection.initialize_reactor=  	     	r3   c                     dS )z|
        Called after a forking.  This should clean up any remaining reactor state
        from the parent process.
        NrM   r  s    r1   handle_forkzConnection.handle_forkE  r  r3   c                     t                      rf   rD   )r  r  callbacks      r1   create_timerzConnection.create_timerM  s    !###r3   c                    t          j                     }||d<    | |g|R i |}t          j                     |z
  }|j                            ||z
             |j        r#|j        rt          ||j                  |j        |j                                        s&|                                 t          d|z            |S )z
        A factory function which returns connections which have
        succeeded in connecting and are ready for service (or
        raises an exception otherwise).
        ry  z*Timed out creating connection (%s seconds))
timer  r  
last_erroris_unsupported_proto_versionr   rv  is_setcloser   )r  r   r  rB  rC  startconnelapseds           r1   factoryzConnection.factoryQ  s     	$+ !s8-d---f--)++%!!'G"3444? 	0 R04;PQQQ/!%,,.. 	JJLLL#$PSZ$Z[[[Kr3   c                     g d} fd|D             }|                     dd           pt          j        }|                     dd           pt          j        }t          j        t          |                    }t          |                     dd                    |_        t          |          |_        |                     dd           }|                     d	d           }|r|	                    ||           |                     d
d           }|r|
                    |           |                     dd           }	|	r|                    |	           |S )N)ssl_version	cert_reqscheck_hostnamekeyfilecertfileca_certsciphersc                 Z    i | ]'}|j         v |j                             |d           (S rf   rN   r   r   krG   s     r1   
<dictcomp>z>Connection._build_ssl_context_from_options.<locals>.<dictcomp>k  =    hhhARSW[WgRgRg$"&&q$//RgRgRgr3   r  r  )protocolr  Fr  r  r  r  )r   sslPROTOCOL_TLS_CLIENTCERT_REQUIRED
SSLContextintboolr  optionsload_cert_chainload_verify_locationsset_ciphers)
rG   ssl_context_opt_namesoptsr  r  rvr  r  r  r  s
   `         r1   r  z*Connection._build_ssl_context_from_optionsg  sO    !} | |hhhh9Nhhh hh}d33Ns7NHH[$//D33D	^S%5%5666 *:E!B!BCC^^
88J--((9d++ 	2x11188J-- 	/$$X...((9d++ 	$NN7###	r3   c                      g d} fd|D             } j         j        rd|vr j        j        }||d<     j         j         j        fi |S )N)server_sidedo_handshake_on_connectsuppress_ragged_eofsr   c                 Z    i | ]'}|j         v |j                             |d           (S rf   r  r  s     r1   r  z8Connection._wrap_socket_from_context.<locals>.<dictcomp>  r  r3   r   )rr  r  r   rH   wrap_socket_socket)rG   wrap_socket_opt_namesr  r   s   `   r1   _wrap_socket_from_contextz$Connection._wrap_socket_from_context  s|     !v u uhhhh9Nhhh
 + 	60A0M0M"m3O&5D"#+t+DLAADAAAr3   c                 :    | j                             |           d S rf   )r  connect)rG   sockaddrs     r1   _initiate_connectionzConnection._initiate_connection  s    X&&&&&r3   c                     d S rf   rM   rF   s    r1   _validate_hostnamezConnection._validate_hostname  s    r3   c                 \   | j                                         \  }}t          t          d          r6| j         j        t          j        k    rt          j        t          j        dd |fgS t          j        ||| j         j        t          j                  }|st          d| j                   |S )Nr   r   z$getaddrinfo returned empty list for )	r   rT   r7  rP   rR   r   r   r   r   )rG   rH   rK   	addressess       r1   _get_socket_addressesz Connection._get_socket_addresses  s    --//69%% 	L$-*E*W*W^V%7D'JKK&wdm6QSYSeff	 	c%%RVR_R_&abbbr3   c                    d }|                                  }|D ]\  }}}}}	 | j                            |||          | _        | j        r|                                 | _        | j                            | j                   |                     |           | j                            d            | j	        r| 
                                 d } nE# t          j        $ r3}| j        r | j                                         d | _        |}Y d }~d }~ww xY w|r1t          j        |j        dd |D             d|j        p|          | j        r| j        D ]}	 | j        j        |	  d S d S )NzTried connecting to c                     g | ]
}|d          S )r,   rM   )r   as     r1   
<listcomp>z.Connection._connect_socket.<locals>.<listcomp>  s     9 9 9!1 9 9 9r3   z. Last error: )r  _socket_implrP   r  rr  r  
settimeoutry  r  _check_hostnamer  r  r  errnostrerrorrs  
setsockopt)
rG   sockerrr  afsocktypeproto_r  r%  rB  s
             r1   _connect_socketzConnection._connect_socket  s   ..00	2; 	 	.R5!X#077HeLL# D#'#A#A#C#CDL''(<===))(333''--- ' .++---<   < (L&&(((#'DL	  	Y,w}} 9 9y 9 9 9 9 97;K;Vw;V/X Y Y Y = 	/ / /''...	/ 	// /s   B,CD)DDc                 0    | j         r| j         | _        d S d S rf   )_compressor
compressorrF   s    r1   _enable_compressionzConnection._enable_compression  s%     	/".DOOO	/ 	/r3   c                     | j                                          d| _        | j        rt          nt
          | _        t                              dt          |                      d S )NTz2Enabling protocol checksumming on connection (%s).)
rM  rY  r[  r  segment_codec_lz4segment_codec_no_compression_segment_codecr   r   idrF   s    r1   _enable_checksummingzConnection._enable_checksumming  sU    //111(,%37?d//Hd		F4QQQQQr3   c                     t                      rf   rD   rF   s    r1   r  zConnection.close  s    !###r3   c                 J   | j         5  | j        s| j        r	 d d d            d S d| _        d d d            n# 1 swxY w Y   t          j                    }t          |          r1t                              dt          |           | j	        |           n/t                              dt          |           | j	        |           || _
        |                                  |                     |           |                     |           | j                                         |S )NTz!Defuncting connection (%s) to %s:exc_infoz$Defuncting connection (%s) to %s: %s)r.  
is_defunct	is_closedsysr  anyr   r   r  r   r  r  error_all_cp_sessionserror_all_requestsr  r|  )rG   rD  r  s      r1   rA  zConnection.defunct  sy   Y 	# 	# $. 	# 	# 	# 	# 	# 	# 	# 	# #DO	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#
 <>>x== 	4II9hh  B B B B II<hhs4 4 4 

""3'''$$$  """
s   88<<c                     t          | j                                                  }|D ]"}| j        |                             |           #d S rf   )listr  keysr  )rG   rD  
stream_idsr   s       r1   r  z Connection.error_all_cp_sessions  sZ    $:??AABB
# 	F 	FI,Y7@@EEEE	F 	Fr3   c                      j         5   j        i  _        d d d            n# 1 swxY w Y   sd S t          t          |                     fd                                d         \  }}} |           sd S fd}t                    t          j        k     r |             d S t          |          }d|_	        |
                                 d S )Nc                     	  |            d S # t           $ r4 t                              dt                    j        d           Y d S w xY w)Nz]Ignoring unhandled exception while erroring requests for a failed connection (%s) to host %s:Tr  )r   r   warningr  r   )cbnew_excrG   s    r1   try_callbackz3Connection.error_all_requests.<locals>.try_callback  s~    D7 D D D AtHHdmd  D D D D D DDs    :AAr   c                  T                                     D ]\  } }} |            d S rf   )values)r  r  requestsr  s     r1   err_all_callbacksz8Connection.error_all_requests.<locals>.err_all_callbacks  s?    $OO-- ! !AqR    ! !r3   )targetT)r.  r~  r   r{   popitemr-   rk  CALLBACK_ERR_THREAD_THRESHOLDr
   daemonr  )	rG   rD  r  r  r  tr  r  r  s	   `     @@@r1   r  zConnection.error_all_requests  sf   Y 	  	 ~HDN	  	  	  	  	  	  	  	  	  	  	  	  	  	  	   	F$SXX..	D 	D 	D 	D 	D 	D ##%%a(AqR 	F
	! 	! 	! 	! 	! 	! x==:CCC /000AAHGGIIIIIs   '++c                     	 | j                                         S # t          $ r( | j        dz   }|| j        k    sJ || _        | j        cY S w xY w)z>
        This must be called while self.lock is held.
        r   )r  popleft
IndexErrorr  r  )rG   new_request_ids     r1   r2  zConnection.get_request_id  so    	+#++--- 	+ 	+ 	+!4q8N!T%88888&4D#****	+s    /AAc                     t                               d|           | j                            |j        g           D ]=}	  ||j                   # t          $ r t                               d           Y :w xY wd S )NzMessage pushed from server: %rz'Pushed event handler errored, ignoring:)r   r   r}  r   
event_type
event_argsr   	exception)rG   r9  r  s      r1   handle_pushedzConnection.handle_pushed'  s    		2H===%))(*=rBB 	I 	IBI8&'''' I I IGHHHHHI	I 	Is   A$A76A7c                    | j         rt          d| j        z            | j        rt          d| j        z            | j        st          d| j        z            |||f| j        |<    |||| j        | j        | j	                  }| j
        rBt          j                    }| j                            ||           |                                }|                     |           t#          |          S )NzConnection to %s is defunctzConnection to %s is closedzConnection %s is overloaded)r  rz  )r  r   r   r  r  r   r~  rv  r  rz  r[  rK  rL  r  encodegetvaluepushr-   )rG   r   
request_idr  encoderr  result_metadatabuffers           r1   r/  zConnection.send_msg/  s   ? 	P$%BT]%RSSS^ 	P$%ADM%QRRR& 	P !>!NOOO ')'?%Cz"gc:t'<262RT T T ( 	$Z\\F&&vs333//##C		#3xxr3   c                 .     | j         |fd|i|d         S )Nr  r   )wait_for_responses)rG   r   r  rC  s       r1   wait_for_responsezConnection.wait_for_responseE  s'    &t&sFFGFvFFqIIr3   c           
           j         s j        rt          d d          |                    d          }|                    dd          }t	           t          |          |          }d}	 t          |          |z
  } j        5  t          | j         j	        z
  dz             } fdt          |          D             }	 xj	        |z  c_	        d	d	d	           n# 1 swxY w Y   t          |	          D ]<\  }
}                     |||
z            |t          |j        ||
z   
                     =||z  }|t          |          k    rn1||dz  }|dk    rt                      t!          j        d           	 |                    |          S # t          $ r  t&          $ r}                     |            d	}~ww xY w)a;  
        Returns a list of (success, response) tuples.  If success
        is False, response will be an Exception.  Otherwise, response
        will be the normal query response.

        If fail_on_error was left as True and one of the requests
        failed, the corresponding Exception will be raised.
        zConnection z is already closedr  fail_on_errorTr   r   c                 8    g | ]}                                 S rM   )r2  )r   r  rG   s     r1   r  z1Connection.wait_for_responses.<locals>.<listcomp>]  s%    OOOt2244OOOr3   N)index{Gz?g        )r  r  r   r   ResponseWaiterr-   r.  r  r  	in_flightr  	enumerater/  r   got_responser   r  sleepdeliverr   rA  )rG   msgsrC  r  r  waitermessages_sentneeded	availabler  ir  rD  s   `            r1   r  zConnection.wait_for_responsesH  sT    > 	ST_ 	S$$$$$%QRRR**Y''

?D99c$ii?? 	!YY.F , ,(;dn(Lq(PQQ	OOOOeI>N>NOOO)+, , , , , , , , , , , , , , ,
 "+;!7!7 U U:d=1#45(%f&9QRARSSSU U U U Y&MD		))&tOG#~~/111
4   )	!,	>>'***  	 	 	 	 	 	LL	s+   AC  C$'C$F G+GGc                     | j         |                             |           |                     t          |g          |           dS )z=
        Register a callback for a given event type.
        
event_listr  N)r}  addr  r$   )rG   r  r  register_timeouts       r1   register_watcherzConnection.register_watcherw  sZ     	J'++H555
|444$ 	 	& 	& 	& 	& 	&r3   c                     |                                 D ]%\  }}| j        |                             |           &|                     t	          |                                          |           dS )zS
        Register multiple callback/event type pairs, expressed as a dict.
        r/  r  N)itemsr}  r1  r  r$   r  )rG   type_callback_dictr2  r  r  s        r1   register_watcherszConnection.register_watchers  s     %7$<$<$>$> 	: 	: J
+//9999'9'>'>'@'@AAA$ 	 	& 	& 	& 	& 	&r3   c                 "    d| _         i | _        d S r   )rw  r}  rF   s    r1   control_conn_disposedz Connection.control_conn_disposed  s    %*" r3   c           	         | j         j                                        }t          |          }|r|d         t          z  }|t
          j        vrt          d|z            |dk    rt          nt          }|j
        dz   }||k    rO|                    |d          \  }}}}	|	dk     rt          d|	z            t          ||||||	|z             | _        |S )Nr   z?This version of the driver does not support protocol version %dr5   r   z!Received negative body length: %r)rM  rV  r  r-   PROTOCOL_VERSION_MASKr   SUPPORTED_VERSIONSr   frame_header_v3frame_header_v1_v2sizeunpack_fromr   _current_frame)
rG   bufposr   frame_headerheader_sizer   r   opbody_lens
             r1   _read_frame_headerzConnection._read_frame_header  s    o.7799#hh 	n!f44Go@@@#$eho$oppp.5ll??@RL&+a/Kk!!.:.F.FsA.N.N+vr8a<<'(Kh(VWWW&,WeVRV^alVl&m&m#
r3   c                 x   | j                                         }|| j        j        k    r	 | j         j                            d           | j                            | j         j                  }||j        k    rQ| j                            | j	        |          }d| j         _
        | j         j                            |j                   n-d| j         _
        | j         j                            d           d S d S # t          $ r'}t          t!          |          | j                  d }~ww xY wd| j         _
        d S )Nr   TF)rM  ra  r  header_length_with_crcrR  rg  decode_headersegment_lengthdecodern  r]  rV  writepayloadr'   r   r{   r   )rG   readable_bytessegment_headersegmentrD  s        r1   _process_segment_bufferz"Connection._process_segment_buffer  s3   ::<<T0GGGD)..q111!%!4!B!B4?C\!]!]!^%BBB"188nUUG8<DO5O4::7?KKKK 9>DO5O-22155555 LK   D D D*3s88T]CCCD 16DO---s   C
C: :
D+"D&&D+c                    	 | j         rF| j                                        r-|                                  | j                                         | j         r| j        j        sd S | j        s|                                 }n| j                                        }| j        r|| j        j	        k     r#| j         r| j                                        rd S | j        }| j        j
                            |j                   | j        j
                            |j	        |j        z
            }|                     ||           | j                                         d | _        `rf   )r[  rM  ra  rS  rX  r^  rA  rH  rc  r   rV  rg  r   rf  process_msgri  )rG   rC  framer   s       r1   process_io_bufferzConnection.process_io_buffer  sa   	+, 21R1R1T1T 2,,...//111, T_5Y  & A--//o>>@@& +#0C0K*K*K0 T_5V5V5X5X  
 +055e6GHHHo6;;EMEL]<]^^  ,,,66888&*#?	+r3   c           
         d| _         |j        }|dk     rd }t          j        }d }n|| j        v r| j        |         }|j        }|j        }d }nd}| j        5  || j        v r,| xj	        dz  c_	        | j        
                    |           d}d d d            n# 1 swxY w Y   |r| j        r|                                  	 | j                            |          \  }}}nJ# t          $ r= | j        5  | j                            |           d d d            n# 1 swxY w Y   Y d S w xY w	  ||j        | j        ||j        |j        || j        |          }	nm# t,          $ r`}
t.                              d|| j                                                   | ||
           |                     |
           Y d }
~
d S d }
~
ww xY w	 |dk    rwt9          |	t:                    rTd|	j        v rd| _        n.t.                               d| |	!                                           |                     |	           | ||	           n| "                    |	           n*# t,          $ r t.                              d           Y nw xY w|dk    rp|| j        v r+| j        |         j#        r| $                    |           d S d S | j        5  | j                            |           d d d            d S # 1 swxY w Y   d S d S )	NTr   Fr   z6Error decoding response from Cassandra. %s; buffer: %rzunsupported protocol versionz/Closing connection %s due to protocol error: %sz#Callback handler errored, ignoring:)%msg_receivedr   r   decode_messager  r  r  r.  r  r#  remover  r~  r  KeyErrorr  appendr   rx  r   r   decompressorr   r   r  rn  r  rA  rq   r#   r   r  r  summary_msgr  r   remove_continuous_paging_session)rG   headerbodyr   r  r  r  paging_sessionneed_notify_of_releaser9  rD  s              r1   rU  zConnection.process_msg  sN    M	q==H%4G"OOD<<<!%!A)!L)4(0"&).&Y 6 6 D$===!+188CCC15.	6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
 * 8d.O 8557779=9K9KI9V9V6Hg      ; ;(//	:::; ; ; ; ; ; ; ; ; ; ; ; ; ; ;FF
		wv~t/A9%|V]D$BSUdf fHH 	 	 	MM +,2DK4H4H4J4JL L L#LLFFFFF		AA~~h(9:: +59III<@99		"SUY[c[o[o[q[qrrrLL***'HX&&&""8,,, 	A 	A 	AMM?@@@@@	A >>D<<<3I>G E99)DDDDDE E Y 7 7$++I6667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 >s   6BB BC! !D(2DD(D	D( D	!D('D(,+E 
G"AF==GBI $J ?J K,,K03K0c                 @    t          |||| |          }|| j        |<   |S rf   )r   r  )rG   r   r  r  r	  sessions         r1   new_continuous_paging_sessionz(Connection.new_continuous_paging_session  s*    ))Wk4QVWW6=(3r3   c                    	 | j                             |           | j        5  t                              d|           | j                            |           d d d            d S # 1 swxY w Y   d S # t          $ r Y d S w xY w)Nz!Returning cp session stream id %s)r  r  r.  r   r   r  r]  r\  )rG   r   s     r1   r`  z+Connection.remove_continuous_paging_session"  s    	,00;;; 3 3		=yIII ''	2223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3  	 	 	DD	s4   !A3 6A&A3 &A**A3 -A*.A3 3
B Bc                     t                               dt          |           | j                   |                     t                      |                                 | j                   d S )Nz=Sending initial options message for new connection (%s) to %s)r   r   r  r   r/  r   r2  _handle_options_responserF   s    r1   _send_options_messagez Connection._send_options_message+  sX    		QSUVZS[S[]a]jkkkn&&(;(;(=(=t?\]]]]]r3   c                    | j         rd S t          |t                    sDt          |t                    r|t                              d|           t          d|          t                              dt          |           | j                   |j	        }|j
        d         }|j
                            dd g          d         | _        | j        r$| j        |vrt          d| j        d|          n|d         | _        d | _        d }| j        rPt#          t$                                                    t#          |          z  }t)          |          dk    r4t                              d	t$                                          |           nd }t          | j        t*                    r0| j        |vrt          d
| j        d| j                  | j        }n$t$                                          D ]
}||v r|} n|dk    r<t-          j        | j                  r#t                              d| j                   d }n!|| _        t$          |         \  | _        | _        |                     || j                   d S )Nz@Did not get expected SupportedMessage response; instead, got: %sz>Did not get expected SupportedMessage response; instead, got: z8Received options response on new connection (%s) from %sCOMPRESSIONPRODUCT_TYPEr   zcql_version zF is not supported by remote (w/ native protocol). Supported versions: zdNo available compression types supported on both ends. locally supported: %r. remotely supported: %rz The requested compression type (z.) is not supported by the Cassandra server at r=   z~Snappy compression is not supported with protocol version %s and checksumming. Consider installing lz4. Disabling compression.)r{  )r  rq   r   r   r   r  r   r  r   cql_versionsr  r   _product_typeru  r   r  rt  r|  locally_supported_compressionsr  r-   r{   r   has_checksumming_supportrv  _compression_typer^  _send_startup_messager{  )rG   options_responsesupported_cql_versionsremote_supported_compressionscompression_typeoverlapr  s          r1   rj  z#Connection._handle_options_response0  s   ? 	F*,<== 	A*,?@@ A&&		 -.>@ @ @))-=-=+@ A A A 			LT((DM	+ 	+ 	+!1!>(8(@(O%-599.4&QQRST 	9'===#m ''')?)?AB B B >  6a8D %	I9>>@@AA899:G7||q  		 K8==??79 9 9 9
 $( d.44 "'/LLL+m#///@A A A (,'7$$ <@@BB " "<</0,!E ( %00'@AVWW 1II ^_c_tv v v'+$$ .>D*67GH 8D$d&7 	""#3"PPPPPr3   c                 6   t                               d|            t          t          d}|r||d<   |rd|d<   t	          | j        |          }|                     ||                                 | j                   t                               d|            d S )	NzSending StartupMessage on %s)DRIVER_NAMEDRIVER_VERSIONrm  true
NO_COMPACT)
cqlversionr  r  zSent StartupMessage on %s)	r   r   r{  r|  r   ru  r/  r2  _handle_startup_response)rG   rt  r{  r  sms        r1   rt  z Connection._send_startup_messagey  s    		0$777*"02 2 	."-D 	(!'Dt'7FFFb$--//D4QRRR		-t44444r3   c                    | j         rd S t          |t                    r| j        r*t                              d| j        j        j                   t                              dt          |           | j
                   |                                  t          j        | j                  r|                                  | j                                         d S t          |t$                    rt                              dt          |           | j
        |j                   | j        2t                              d| j        d           t+          d          |                                  t          j        | j                  r|                                  t          | j        t,                    rrt                              d|            t/          | j                  }t1          | j        d	
          }|                     ||                                 |           d S t                              d|            |j        | j        _        | j                                        }|dn|}|                     t=          |          |                                 | j                   d S t          |t@                    rt                              dt          |           | j
        |!                                           |r,t+          d| j
        d|!                                          tE          d| j
        d|!                                          t          |tF                    r"t                              d| j
                   |d}t                              ||           tI          ||fz            )NzAn authentication challenge was not sent, this is suspicious because the driver expects authentication (configured authenticator = %s)z/Got ReadyMessage on new connection (%s) from %sz:Got AuthenticateMessage on new connection (%s) from %s: %sFailed to authenticate to z. If you are trying to connect to a DSE cluster, consider using TransitionalModePlainTextAuthProvider if DSE authentication is configured with transitional modez"Remote end requires authenticationz-Sending credentials-based auth response on %s)credsT)did_authenticater  z&Sending SASL-based auth response on %sr<   8Received ErrorMessage on new connection (%s) from %s: %sr   z'Failed to initialize new connection to z8Connection to %s was closed during the startup handshakez/Unexpected response during Connection setup: %r)%r  rq   r   rp  r   r  r~   rU   r   r  r   r  r   rr  rv  r  r  r|  r   r  r   r   dictr   r   r  r/  r2  server_authenticator_classinitial_responser    _handle_auth_responser   r_  r   r   r   )rG   startup_responser  cmr  r  r   s          r1   r  z#Connection._handle_startup_response  s   ? 	F&55 9	;! C M !.8AC C C
 IIGDSWS`aaa$$&&&78MNN ,))+++ $$&&&&&(*=>> +	;IIRhh/?/MO O O !)			Z^ZcZcZcf g g g ++OPPP$$&&&78MNN ,))+++$,d33 :		I4PPP'd.@AAA"4#@SWXXXb$"5"5"7"7HEEEEE		BDIII@P@^"=#'#5#F#F#H#H )9)A22GW 12BCCTEXEXEZEZ"8: : : : :(,77 	;IIPhh/?/K/K/M/MO O O G**]]]$4$@$@$B$B$BDE E E *)}}}&6&B&B&D&D&DFG G G (*<== 	;IIPSWS`bbb""CCIIc+,,,'7&9 9:::r3   c                    | j         rd S t          |t                    rht                              d|            | j                            |j                   | j        r| j        | _	        | j
                                         d S t          |t                    r}| j                            |j                  }t          |dn|          }t                              d|            |                     ||                                 | j                   d S t          |t&                    rmt                              dt)          |           | j        |                                           t/          d| j        d|                                          t          |t0                    r"t                              d| j                   |d}t                              || j        |           t5          || j        |fz            )	Nz(Connection %s successfully authenticatedr<   z"Responding to auth challenge on %sr  r  r   z=Connection to %s was closed during the authentication processz>Unexpected response during Connection authentication to %s: %r)r  rq   r"   r   r   rp  on_authentication_successtokenr  r  r  r|  r!   evaluate_challenge	challenger    r/  r2  r  r   r  r   r_  r   r   r  r   )rG   auth_responser9  r   s       r1   r  z Connection._handle_auth_response  s   ? 	Fm%788 	FII@$GGG889LMMM 3"&"2 $$&&&&&';<< 	F)<<]=TUUH%H,<bb(KKCII:DAAAMM#t2244d6PQQQQQ|44 	FIIPhh}/H/H/J/JL L L&& 9 9 ; ; ;=> > > '9:: 	FIIUW[WdeeeRCIIc4=-888t}m&D DEEEr3   c                    |r|| j         k    rd S t          d|dt          j                  }	 |                     |          }nb# t
          $ r}|                                d }~wt          $ r4}t          d|| j	                  }| 
                    |           |d }~ww xY wt          |t                    r	|| _         d S t          d|| j	                  }| 
                    |           |)NUSE ""queryconsistency_level Problem while setting keyspace: )keyspacer   r   ONEr  r   r  r   r   r   rA  rq   r   )rG   r  r  r  irerD  conn_excs          r1   set_keyspace_blockingz Connection.set_keyspace_blocking  s1    	8t}44F#;/?/CE E E		++E22FF& 	% 	% 	%""$$$ 	 	 	**8;=t}N NHLL"""N		 fm,, 	$DMMM**8>@$-Q QHLL"""Ns#   A 
B%A$$B%1/B  B%c                     	  j         5   j         j        k     r xj        dz  c_        	 ddd           n-	 ddd           n# 1 swxY w Y   t          j        d           br j        k    r  d           dS t          ddt          j                  } fd} 	                                } 
                    |||           dS )	a  
        Use this in order to avoid deadlocking the event loop thread.
        When the operation completes, `callback` will be called with
        two arguments: this connection and an Exception if an error
        occurred, otherwise :const:`None`.

        This method will always increment :attr:`.in_flight` attribute, even if
        it doesn't need to make a request, just to maintain an
        ":attr:`.in_flight` is incremented" invariant.
        Tr   NgMbP?r  r  r  c           	      0   t          | t                    r_         d            d S t          | t                    r  |                                            d S                      t          d| j                                       d S )Nr  )rq   r   r  r   r  rA  r   r   )r  r  r  rG   s    r1   process_resultz5Connection.set_keyspace_async.<locals>.process_result!  s    &-00 W (t$$$$$F$;<< Wv224455555t||,?,?<BFDdm-U -U  V  V W W W W Wr3   )r.  r#  r  r  r&  r  r   r   r  r2  r/  )rG   r  r  r  r  r  s   ```   r1   set_keyspace_asynczConnection.set_keyspace_async  su   ,	  >D$777NNa'NN      7               Ju	  	8t}44HT4   F#;/?/CE E E	W 	W 	W 	W 	W 	W 	W ((**
eZ88888s   "AAAc                     | j          S rf   rY  rF   s    r1   is_idlezConnection.is_idle1  s    $$$r3   c                     d| _         d S r   r  rF   s    r1   
reset_idlezConnection.reset_idle5  s    !r3   c                     d}| j         rd}n	| j        rd}d| j        j        dt	          |           d| j        |dS )Nr<   z
 (defunct)z	 (closed)r   (z) r   )r  r  r~   rU   r  r   )rG   statuss     r1   r|   zConnection.__str__8  sW    ? 	!!FF^ 	! F"&."9"9"92d8888T]]TZTZTZ[[r3   rf   r   )F)_rU   rV   rW   r  in_buffer_sizeout_buffer_sizeru  r{  r   MAX_SUPPORTEDrv  r  rt  rs  r  r^  r   rN   rr  r  r#  r  r  r  r  orphaned_threshold_reachedorphaned_thresholdr  r  r.  rx  rY  r  rw  signaled_errorrz  rA  r  rP   r  r  rp  r[  r  rY   rn  rj   r   rK   classmethodr  r  r  r  r  r  r  r  r  r  r  r  r  rA  r  r  r2  r  r   encode_messagerZ  r/  r  r  r3  r7  r9  rG  rH  rS  rW  rU  rg  r`  rk  rj  rt  r  r  r  r  r  r  r|   r   rM   r3   r1   rk  rk    s       $'!NOKJ&4HKJLHKKJ
 I M
 K 
   "'
 m+q0JIDML#( !N"'NGLOM$#' ) ) X) (d$!Dd!O4Qin#TW\in!t	:' :' :' :'x % % X% " " X"   [   [ $ $ [$   [*  6B B B ' ' '  
 
 
!/ !/ !/F/ / /R R R$ $ $  ,F F F
& & &P+ + +I I I 5D4R\k\z  MQ    ,J J J J- - -^& & & && & & &! ! !   " 6 6 6, +  +  +D A7 A7 A7F  
   ^ ^ ^ FQ FQ FQP 
5 
5 
5 
5 =; =; =; =;~ F F F:  229 29 29h % % X%" " "\ \ \ HHHr3   rk  c                   "    e Zd Zd Zd ZddZdS )r"  c                 z    || _         || _        || _        d | _        d g|z  | _        t                      | _        d S rf   )r  pendingr  r  	responsesr   event)rG   r  num_responsesr  s       r1   rj   zResponseWaiter.__init__E  s<    $$*
-/WW


r3   c                    | j         j        5  | j         xj        dz  c_        d d d            n# 1 swxY w Y   t          |t                    rYt          |d          r|                                }| j        r!|| _        | j	        
                                 n+d|f| j        |<   n| j        sd|f| j        |<   n
|| j        |<   | xj        dz  c_        | j        s| j	        
                                 d S d S )Nr   r  FT)r  r.  r#  rq   r   r7  r  r  r  r  r|  r  r  )rG   r9  r   s      r1   r%  zResponseWaiter.got_responseM  sO   _! 	+ 	+O%%*%%	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+h	** 	1x00 3#0022! :%

    ).(9u%%% 1)-x(8u%%(0u%| 	JNN	 	s   /33Nc                     | j                             |           | j        r| j        | j                                         st	                      | j        S )a  
        If fail_on_error was set to False, a list of (success, response)
        tuples will be returned.  If success is False, response will be
        an Exception.  Otherwise, response will be the normal query response.

        If fail_on_error was left as True and one of the requests
        failed, the corresponding Exception will be raised. Otherwise,
        the normal response will be returned.
        )r  r  r  r  r   r  rG   r  s     r1   r'  zResponseWaiter.deliverb  sT     	
   : 	"*""$$ 	"#%%%>!r3   rf   )rU   rV   rW   rj   r%  r'  rM   r3   r1   r"  r"  C  sF            *" " " " " "r3   r"  c                        e Zd Zd Zd Zd ZdS )HeartbeatFuturec                    d | _         t                      | _        || _        || _        t
                              dt          |          |j                   |j	        5  |j
        |j        k     rK|xj
        dz  c_
        |                    t                      |                                | j                   n-t!          d          | _         | j                                         d d d            d S # 1 swxY w Y   d S )Nz<Sending options message heartbeat on idle connection (%s) %sr   zIFailed to send heartbeat because connection 'in_flight' exceeds threshold)
_exceptionr   _eventr  ownerr   r   r  r   r.  r#  r  r/  r   r2  _options_callbackr   r|  )rG   r  r  s      r1   rj   zHeartbeatFuture.__init__v  s-   gg$
		PZ..*"5	7 	7 	7_ 	" 	"#j&???$$)$$##N$4$4j6O6O6Q6QSWSijjjj"+,w"x"x!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   B	C44C8;C8c                     | j                             |           | j                                         r| j        r| j        d S t	          d|d| j        j                  )Nz#Connection heartbeat timeout after z seconds)r  r  r  r  r   r  r   r  s     r1   r  zHeartbeatFuture.wait  sq    !!!; 	| &o%& & $#W^W^W^$`bfbqbz{{{r3   c                 <   t          |t                    r9t                              dt	          | j                  | j        j                   n4t          |t                    r|| _        nt          d|          | _        | j	        
                                 d S )Nz4Received options response on connection (%s) from %sz0Received unexpected response to OptionsMessage: )rq   r   r   r   r  r  r   r   r  r  r|  r8  s     r1   r  z!HeartbeatFuture._options_callback  s    h 011 	EIIL))4?+CE E E E ($788 E"*"5"59A7D #E #Er3   N)rU   rV   rW   rj   r  r  rM   r3   r1   r  r  u  sD        " " "| | |
 
 
 
 
r3   r  c                   B    e Zd Zd Z G d de          Zd Zd Zd ZdS )ConnectionHeartbeatc                     t          j        | d           || _        || _        || _        t                      | _        d| _        |                                  d S )NzConnection heartbeat)nameT)	r
   rj   	_interval_timeout_get_connection_holdersr   _shutdown_eventr  r  )rG   interval_secget_connection_holdersr  s       r1   rj   zConnectionHeartbeat.__init__  sR    #9::::%'=$$ww

r3   c                       e Zd ZdS )%ConnectionHeartbeat.ShutdownExceptionNr   rM   r3   r1   ShutdownExceptionr    s        r3   r  c           	      @   | j                             | j                   | j                                         sdt	          j                    }g }g }	 d |                                 D             D ]$\  }}|D ]}|                                  |j        s|j        s|j	        r	 |
                    t          ||                     Q# t          $ rP}t                              dt          |          |j                   |
                    |||f           Y d }~d }~ww xY w|                                 t                              dt          |          |j                   |                    |           |                                  &| j        }t	          j                    }|D ]}	|                                  |	j        }	 |	                    |           |j        5  |xj        dz  c_        d d d            n# 1 swxY w Y   |                                 ng# t          $ rZ}t                              dt          |          |j                   |
                    |	j        |	j        |f           Y d }~nd }~ww xY w| j        t	          j                    |z
  z
  }|D ]R\  }}}
|                                  |j        sd|_        |                    |
           |                    |           Sn7# | j        $ r Y n+t          $ r t                              dd           Y nw xY wt	          j                    |z
  }| j                             t=          | j        |z
  d	                     | j                                         bd S d S )
Nc                 :    g | ]}|                                 |fS rM   )get_connections)r   os     r1   r  z+ConnectionHeartbeat.run.<locals>.<listcomp>  s)    *l*l*lA,=,=,?,?+C*l*l*lr3   z9Failed sending heartbeat message on connection (%s) to %sz6Cannot send heartbeat message on connection (%s) to %sr   z*Heartbeat failed for connection (%s) to %sTzFailed connection heartbeatr  r!  )r  r  r  r  r  r  _raise_if_stoppedr  r  r  r]  r  r   r   r  r  r   r  r   return_connectionr  r  r.  r#  r  rw  shutdown_on_errorrA  r  r  max)rG   
start_timefuturesfailed_connectionsconnectionsr  r  er  rE  rD  r  s               r1   runzConnectionHeartbeat.run  sm   !!$.111&--// :	KJG!#2H*l*lTMiMiMkMk*l*l*l - -&K&1 @ @
..000 * 5 @9M @)1 8!V$+NN?:u3U3U$V$V$V$V'0 !V !V !V$'KK0k02:
@S%U %U %U$6$=$=z5RS>T$U$U$U$U$U$U$U$U!V
 !+ 5 5 7 7 7 7II&^&(nnj6IK K K "33J????**,,,, -!Y[[
  I IA**,,,!"J	Nw'_ 6 6&00A5006 6 6 6 6 6 6 6 6 6 6 6 6 6 6"--////$ N N N$P$&zNNJ4GI I I*111<!2LMMMMMMMMN
 #mty{{Z/GHGG.@ 8 8*Js**,,,%; 726/&&s+++++J77778 )    H H H		7$	GGGGGH ikkJ.G %%c$.7*BD&I&IJJJu &--// :	K :	K :	K :	K :	Ks   AL %#C	L 	
D#ADL D##B,L H),H	=H)	H	H)H	H)(L )
J3AJL JA7L 
L9%L98L9c                 `    | j                                          |                                  d S rf   )r  r|  joinrF   s    r1   stopzConnectionHeartbeat.stop  s(      """		r3   c                 `    | j                                         r|                                 d S rf   )r  r  r  rF   s    r1   r  z%ConnectionHeartbeat._raise_if_stopped  s5    &&(( 	+((***	+ 	+r3   N)	rU   rV   rW   rj   r   r  r  r  r  rM   r3   r1   r  r    s~              I   <K <K <K|  + + + + +r3   r  c                   *    e Zd ZdZd Zd Zd Zd ZdS )TimerFc                 J    t          j                     |z   | _        || _        d S rf   )r  endr  )rG   r  r  s      r1   rj   zTimer.__init__  s    9;;( r3   c                 "    | j         |j         k     S rf   )r  rr   s     r1   ry   zTimer.__lt__  s    x%)##r3   c                     d| _         d S )NT)canceledrF   s    r1   r=  zTimer.cancel  s    r3   c                 Z    | j         rdS || j        k    r|                                  dS dS )NTF)r  r  r  )rG   time_nows     r1   finishzTimer.finish  s5    = 	4txMMOOO4ur3   N)rU   rV   rW   r  rj   ry   r=  r  rM   r3   r1   r  r    sU        H! ! !$ $ $      r3   r  c                   6    e Zd Zd Zd Zd Zed             ZdS )TimerManagerc                 "    g | _         g | _        d S rf   )_queue_new_timersrF   s    r1   rj   zTimerManager.__init__
  s    r3   c                 H    | j                             |j        |f           dS )z?
        called from client thread with a Timer object
        N)r  r]  r  )rG   timers     r1   	add_timerzTimerManager.add_timer  s(     	E 233333r3   c                    | j         }| j        r-| j        }|r$t          ||                                           |$|rt	          j                    }|rl	 |d         d         }|                    |          rt          |           n|j        S n*# t          $ r t          
                    d           Y nw xY w|hdS dS dS )z
        run callbacks on all expired timers
        Called from the event thread
        :return: next end time, or None
        r   r   z,Exception while servicing timeout callback: N)r  r  r   r  r  r  r	   r  r   r   r  )rG   queue
new_timersnowr  s        r1   service_timeoutszTimerManager.service_timeouts  s     	2)J 2
 0 0111  2  
	R)++C RR!!HQKE||C(( )$y( ' ! R R RMM"PQQQQQR  R R R
	R 
	RR Rs   9B $B65B6c                 L    	 | j         d         d         S # t          $ r Y d S w xY wr   )r  r  rF   s    r1   next_timeoutzTimerManager.next_timeout,  s:    	;q>!$$ 	 	 	DD	s    
##N)rU   rV   rW   rj   r  r  rY   r  rM   r3   r1   r  r    s_          4 4 4R R R0   X  r3   r  )ucollectionsr   r   r  	functoolsr   r   r   heapqr   r	   rK  loggingrP   structr  	threadingr
   r   r   r   r  r  rN  modulesgevent.queuer   r   r  r>   r   r   r   r   cassandra.marshalr   cassandra.protocolr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   cassandra.segmentr&   r'   cassandra.utilr(   	getLoggerrU   r   r  r  rq  r9   r)   r*   ImportErrorr.   r7   AttributeErrorr   reprr2   r8   r=   __version__r{  r|  r;  HEADER_DIRECTION_FROM_CLIENTHEADER_DIRECTION_TO_CLIENTHEADER_DIRECTION_MASKStructr>  r=  objectrB   r[   rc   r   r   r   r   r   EAGAINEWOULDBLOCKNONBLOCKINGr   r   r   r   r   r   r   r   r   rG  DEFAULT_CQL_VERSIONrI  rk  r"  r  r  r  r  rM   r3   r1   <module>r     s  " + * * * * * * *  4 4 4 4 4 4 4 4 4 4 # # # # # # # # 				    



 5 5 5 5 5 5 5 5 5 5 5 5  



  ck!!)))))))))"""""""" ` ` ` ` ` ` ` ` ` ` ` ` ( ( ( ( ( (G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G 9 8 8 8 8 8 8 8 & & & & & & g!!+|~~  
 "- $CJJJ*******   				
 
 
 
k "6DDOO6<<	
 
 	

D D D< < < .:>,J"5)$\>BBE  	 	 	D	H
MMMM
' ' ' 17/L"8,,  	 	 	D	 ?K@X@d ^ # !  "V]7++ &-((&$ &$ &$ &$ &$v &$ &$ &$R$ $ $ $ $f $ $ $$ "R "R "R "R "Rh "R "R "RJ    _   4 :O :O :O :O :O( :O :O :OzS S S S S S S S2 %N %N %N %N %N %N %N %NPE E E E EV E E E. |U./% % % % %) % % %	 	 	 	 	, 	 	 	/ / / / /!4 / / /	 	 	 	 	Y 	 	 		 	 	 	 	I 	 	 		 	 	 	 	. 	 	 	- - - - -F - - -4~ ~ ~ ~ ~f ~ ~ ~B    3# 3# 3# 3# 3#& 3# 3# 3#l_ _ _ _ _ _ _ _D/" /" /" /" /"V /" /" /"d" " " " "f " " "JR+ R+ R+ R+ R+& R+ R+ R+j    F   2) ) ) ) )6 ) ) ) ) )sB   E C C('C(,C; ;.D)EEE& &E.-E.