
    "i                        d Z ddlZddlZddlZddlmZ 	 ddlZdZn# e	$ r dZY nw xY w	 ddl
ZdZn# e	$ r dZY nw xY wddlmZmZmZmZ ddlmZmZmZmZmZmZ dd	lmZmZ dd
lmZ ddlmZm Z m!Z!m"Z"m#Z# dZ$ ej%        d          Z& G d de'          Z( G d de'          Z) G d de'          Z* G d de'          Z+dS )z4Implementation of the X protocol for MySQL servers.
    N)BytesIOTF   )InterfaceErrorNotSupportedErrorOperationalErrorProgrammingError)
ExprParser
build_exprbuild_scalarbuild_bool_scalarbuild_int_scalarbuild_unsigned_int_scalar)encode_to_bytesget_item_or_attr)Column)CRUD_PREPARE_MAPPINGSERVER_MESSAGESPROTOBUF_REPEATED_TYPESMessagemysqlxpb_enumi  mysqlxc                   $    e Zd ZdZd Zd Zd ZdS )
CompressorzImplements compression/decompression using `zstd_stream`, `lz4_message`
    and `deflate_stream` algorithms.

    Args:
        algorithm (str): Compression algorithm.

    .. versionadded:: 8.0.21

    c                    || _         |dk    r2t          j                    | _        t          j                    | _        d S |dk    r2t          j                    | _        t          j                    | _        d S d | _        d | _        d S )Nzstd_streamdeflate_stream)	
_algorithmzstdZstdCompressor_compressobjZstdDecompressor_decompressobjzlibcompressobjdecompressobjself	algorithms     G/srv/django_bis/venv311/lib/python3.11/site-packages/mysqlx/protocol.py__init__zCompressor.__init__J   s    #%% $ 3 5 5D"&"7"9"9D*** $ 0 2 2D"&"4"6"6D $D"&D    c                    | j         dk    r| j                            |          S | j         dk    r{t          j                                        5 }|                                }||                    |          z  }||                                z  }ddd           n# 1 swxY w Y   |S | j                            |          }|| j                            t          j	                  z  }|S )zCompresses data and returns it.

        Args:
            data (str, bytes or buffer object): Data to be compressed.

        Returns:
            bytes: Compressed data.
        r   lz4_messageN)
r   r    compresslz4frameLZ4FrameCompressorbeginflushr#   Z_SYNC_FLUSH)r'   data
compressor
compresseds       r)   r.   zCompressor.compressV   s    ?m++$--d333?m++--// 1:'--//
j11$777
j..000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  &//55
d'--d.?@@@
s   ABB#&B#c                    | j         dk    r| j                            |          S | j         dk    rMt          j                                        5 }|                    |          }ddd           n# 1 swxY w Y   |S | j                            |          }|| j                            t          j                  z  }|S )zDecompresses a frame of data and returns it as a string of bytes.

        Args:
            data (str, bytes or buffer object): Data to be compressed.

        Returns:
            bytes: Decompresssed data.
        r   r-   N)	r   r"   
decompressr/   r0   LZ4FrameDecompressorr3   r#   r4   )r'   r5   decompressordecompresseds       r)   r9   zCompressor.decompressm   s     ?m++&11$777?m++//11 =\+66t<<= = = = = = = = = = = = = = = *55d;;+11$2CDDDs   A11A58A5N)__name__
__module____qualname____doc__r*   r.   r9    r+   r)   r   r   @   sK         
' 
' 
'  .    r+   r   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )MessageReaderzImplements a Message Reader.

    Args:
        socket_stream (mysqlx.connection.SocketStream): `SocketStream` object.

    .. versionadded:: 8.0.21
    c                 >    || _         d | _        d | _        g | _        d S N)_stream_compressor_msg
_msg_queuer'   socket_streams     r)   r*   zMessageReader.__init__   s#    $	r+   c                    | j         r| j                             d          S t          j        d| j                            d                    \  }}|dk    rt          d          | j                            |dz
            }|t          vr"t          d	                    |                    |dk    r|d	k    r| 
                                S t          j        ||          }|d
k    r|d         }t          | j                            |d                             }d}||k     r~t          j        d|                    d                    \  }}	|                    |dz
            }
| j                             t          j        |	|
                     ||dz   z  }||k     ~| j         r| j                             d          ndS |S )a  Reads X Protocol messages from the stream and returns a
        :class:`mysqlx.protobuf.Message` object.

        Raises:
            :class:`mysqlx.ProgrammingError`: If e connected server does not
                                              have the MySQL X protocol plugin
                                              enabled.

        Returns:
            mysqlx.protobuf.Message: MySQL X Protobuf Message.
        r   <LB   
   z[The connected server does not have the MySQL X protocol plugin enabled or protocol mismatchr   zUnknown message type: {}   r+      uncompressed_sizepayload   N)rI   popstructunpackrF   readr   r   
ValueErrorformat_read_messager   from_server_messager   rG   r9   append)r'   
frame_size
frame_typeframe_payload	frame_msgrR   streambytes_processedpayload_sizemsg_typerS   s              r)   r[   zMessageReader._read_message   s    ? 	*?&&q)))!'udl6G6G6J6J!K!K
J" $7 8 8 8 ))*q.99_,,7>>zJJKKK  4 4%%'''/
MJJ	 )*= >T-8899MNNOOFO!$555M%Q88 'h ++lQ&677&&/'BBD D D<!#33 "$555 .2_F4?&&q)))$Fr+   c                 X    | j         | j         }d| _         |S |                                 S )zgRead message.

        Returns:
            mysqlx.protobuf.Message: MySQL X Protobuf Message.
        N)rH   r[   r'   msgs     r)   read_messagezMessageReader.read_message   s1     9 )CDIJ!!###r+   c                 @    | j         t          d          || _         dS )zPush message.

        Args:
            msg (mysqlx.protobuf.Message): MySQL X Protobuf Message.

        Raises:
            :class:`mysqlx.OperationalError`: If message push slot is full.
        NzMessage push slot is full)rH   r   rg   s     r)   push_messagezMessageReader.push_message   s&     9 "#>???			r+   c                 6    |rt          |          nd| _        dS )zCreates a :class:`mysqlx.protocol.Compressor` object based on the
        compression algorithm.

        Args:
            algorithm (str): Compression algorithm.

        .. versionadded:: 8.0.21

        Nr   rG   r&   s     r)   set_compressionzMessageReader.set_compression   s$     5>G:i0004r+   N)	r=   r>   r?   r@   r*   r[   ri   rk   rn   rA   r+   r)   rC   rC      so           - - -^
$ 
$ 
$  
H 
H 
H 
H 
Hr+   rC   c                   $    e Zd ZdZd Zd Zd ZdS )MessageWriterzImplements a Message Writer.

    Args:
        socket_stream (mysqlx.connection.SocketStream): `SocketStream` object.

    .. versionadded:: 8.0.21

    c                 "    || _         d | _        d S rE   )rF   rG   rJ   s     r)   r*   zMessageWriter.__init__   s    $r+   c                    |                     |          }| j        rh|t          k    r\t          |                                          }t          j        d|dz   |          }| j                            d                    ||g                    }t          d          }||d<   |dz   |d<   t          d          }||d<   d                    t          |
                                          d	d
         t          |
                                          g          }	t          d          }
t          j        dt          |	          dz   |
          }| j                            d                    ||	g                     d	S t          |                                          }t          j        d|dz   |          }| j                            d                    ||g                     d	S )zWrite message.

        Args:
            msg_type (int): The message type.
            msg (mysqlx.protobuf.Message): MySQL X Protobuf Message.
        rM   r   r+   zMysqlx.Connection.Compressionclient_messagesrN   rR   rS   Nz&Mysqlx.ClientMessages.Type.COMPRESSION)	byte_sizerG   _COMPRESSION_THRESHOLDr   serialize_to_stringrV   packr.   joinr   serialize_partial_to_stringr   lenrF   sendall)r'   re   rh   msg_sizemsg_strheaderr7   msg_first_fieldsmsg_payloadoutputmsg_comp_ids              r)   write_messagezMessageWriter.write_message   s    ==%% 	>+A A A%c&=&=&?&?@@G[1h??F)22388VW<M3N3NOOJ&'FGG2:./4<qL01!"ABBK%/K	"XX 0 L L N NOOPSQSPST G G I IJJ  F FGG [FaEEFL  66*:!;!;<<<<<%c&=&=&?&?@@G[1h??FL  67*;!<!<=====r+   c                 6    |rt          |          nd| _        dS )zCreates a :class:`mysqlx.protocol.Compressor` object based on the
        compression algorithm.

        Args:
            algorithm (str): Compression algorithm.
        Nrm   r&   s     r)   rn   zMessageWriter.set_compression  s$     5>G:i0004r+   N)r=   r>   r?   r@   r*   r   rn   rA   r+   r)   rp   rp      sQ               >  >  >DH H H H Hr+   rp   c                       e Zd ZdZd Zed             Zd Zd Zd$dZ	d Z
d	 Zd
 Zd Zd Zd%dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd&dZd Zd Zd Zd Zd Z d  Z!d! Z"d" Z#d&d#Z$dS )'ProtocolzImplements the MySQL X Protocol.

    Args:
        read (mysqlx.protocol.MessageReader): A Message Reader object.
        writer (mysqlx.protocol.MessageWriter): A Message Writer object.

    .. versionchanged:: 8.0.21
    c                 >    || _         || _        d | _        g | _        d S rE   )_reader_writer_compression_algorithm	_warnings)r'   readerwriters      r)   r*   zProtocol.__init__(  s#    &*#r+   c                     | j         S )z'str: The compresion algorithm.
        )r   )r'   s    r)   compression_algorithmzProtocol.compression_algorithm.  s     **r+   c                 R   |j         r|                                |d<   |j        r-|d                             |                                           |j        r-|d                             |                                           |j        r|                                |d<   dS dS )zApply filter.

        Args:
            msg (mysqlx.protobuf.Message): The MySQL X Protobuf Message.
            stmt (Statement): A `Statement` based type object.
        criteriaordergroupinggrouping_criteriaN)		has_whereget_where_exprhas_sortextendget_sort_exprhas_group_byget_grouping
has_having
get_having)r'   rh   stmts      r)   _apply_filterzProtocol._apply_filter4  s     > 	4"1133C
O= 	6L 2 2 4 4555 	8
O""4#4#4#6#6777? 	9'+'8'8C#$$$	9 	9r+   c           	      :   t          |t                    r5t          d|          }t          dd|          }t          dd|          S t          |t                    rt          ddt	          |                    S t          |t
                    rD|d	k     rt          ddt          |                    S t          ddt          |                    S t          |t                    rst          |          d
k    r`|\  }}t          d|| 
                    |                    }t          d|                                g          }t          dd
|          S t          |t                    s7t          |t          t          f          rt          |d	         t                    rg }|D ]}	g }
|	                                D ]Q\  }}t          d|| 
                    |                    }|
                    |                                           Rt          d|
          }t          dd
|          }|                    |                                           t          d          }||d<   t          dd|          S t          |t                    r{g }
|D ]Q\  }}t          d|| 
                    |                    }|
                    |                                           Rt          d|
          }t          dd
|          }|S dS )zCreate any.

        Args:
            arg (object): Arbitrary object.

        Returns:
            mysqlx.protobuf.Message: MySQL X Protobuf Message.
        zMysqlx.Datatypes.Scalar.String)valuezMysqlx.Datatypes.Scalar   )typev_stringMysqlx.Datatypes.Anyr   )r   scalarr      #Mysqlx.Datatypes.Object.ObjectFieldkeyr   Mysqlx.Datatypes.Objectfldr   objzMysqlx.Datatypes.Arrayr      )r   arrayN)
isinstancestrr   boolr   intr   r   tupler{   _create_anyget_messagedictlistitemsr]   )r'   argr   r   arg_key	arg_valueobj_fldr   array_valuesr   obj_fldsr   msg_objmsg_anyrh   s                  r)   r   zProtocol._create_anyD  sq    c3 -	<CHHHE6QOOOF1&IIIIT"" )	1"3C"8"8: : : :S!! &	Qww5A&6s&;&;= = = =1";C"@"@B B B BU##  	CA!$GYC")1A1A)1L1LN N NG3&224457 7 7C1sCCCCT"" 	z#e}'E'E 	'1#a&$'?'?	L 	; 	;"'++-- ; ;JC%&K*-T5E5Ee5L5LN N NGOOG$7$7$9$9::::!";JJJ!"8qgNNN##G$7$7$9$9::::233C'CL1EEEET"" 	H! 7 7
U!"G&)1A1A%1H1HJ J J 3 3 5 566667XFFFG41'JJJGNtr+   Tc                    
  fd
|                                 }|                                }|
fd|D             S t          |          }|dgz  }|t          |          k    rt          d          |                                D ]A\  }}||vr"t          d                    |                    ||         }	 
|          ||	<   B|S )a  Returns the binding any/scalar.

        Args:
            stmt (Statement): A `Statement` based type object.
            is_scalar (bool): `True` to return scalar values.

        Raises:
            :class:`mysqlx.ProgrammingError`: If unable to find placeholder for
                                              parameter.

        Returns:
            list: A list of ``Any`` or ``Scalar`` objects.
        c                     r!t          |                                           n&                    |                                           S rE   )r   r   r   )r   	is_scalarr'   s    r)   <lambda>z,Protocol._get_binding_args.<locals>.<lambda>  sG    %DL$7$7$C$C$E$E$E"..u55AACC r+   Nc                 &    g | ]} |          S rA   rA   ).0r   build_values     r)   
<listcomp>z.Protocol._get_binding_args.<locals>.<listcomp>  s#    ===5KK&&===r+   z;The number of bind parameters and placeholders do not matchz-Unable to find placeholder for parameter: {0})get_bindingsget_binding_mapr{   r   r   rZ   )r'   r   r   bindingsbinding_mapcountargsnamer   posr   s   ` `       @r)   _get_binding_argszProtocol._get_binding_args~  s   D D D D D$$&&**,, ====H====K  v~CMM!!" $? @ @ @#>>++ 	+ 	+KD%;&&& (88>tF F Fd#C#E**DIIr+   c                    |d         dk    rt          j        d|d                   }| j                            |j                   t
                              d|j        |j                   |                    |j	        |j        |j                   dS |d         dk    rt          j        d|d                    dS |d         dk    rt          j        d	|d                   }|d
         t          d          k    r'|                    d |d         D                        dS t          |d         t          t                              r|d         d         n|d         }|d
         t          d          k    r%|                    t!          |d                     dS |d
         t          d          k    r'|                    t!          |d                     dS dS dS )zProcess frame.

        Args:
            msg (mysqlx.protobuf.Message): A MySQL X Protobuf Message.
            result (Result): A `Result` based type object.
        r   r   zMysqlx.Notice.WarningrS   z:Protocol.process_frame Received Warning Notice code %s: %sr   z$Mysqlx.Notice.SessionVariableChangedr   z!Mysqlx.Notice.SessionStateChangedparamzBMysqlx.Notice.SessionStateChanged.Parameter.GENERATED_DOCUMENT_IDSc                 n    g | ]2}t          t          |d           d                                          3S )v_octetsr   )r   decode)r   r   s     r)   r   z+Protocol._process_frame.<locals>.<listcomp>  sL     ; ; ; &(
;;WF FFLfhh; ; ;r+   r   r   z9Mysqlx.Notice.SessionStateChanged.Parameter.ROWS_AFFECTEDv_unsigned_intz?Mysqlx.Notice.SessionStateChanged.Parameter.GENERATED_INSERT_IDN)r   from_messager   r]   rh   _LOGGERwarningcodeappend_warninglevelr   set_generated_idsr   r   r   set_rows_affectedr   set_generated_insert_id)r'   rh   resultwarn_msgsess_state_msgsess_state_values         r)   _process_framezProtocol._process_frame  sn    v;!+,C,/	N< <HN!!(,///OO *+3=(,H H H!!(.(-NNNNN[A !G!$Y1 1 1 1 1[A$13S^E ENg&--+. +. . . ((; ;"0"9; ; ;< < < < < "."9"'(?"@"@B B$1>'#:1#=#= (0 ! "'*m(/) /) ) ) ,,()9;KLLN N N N N#G,.1/ 1/ / / 223C(*:4< 4< = = = = =/ (/ /r+   c                    	 	 | j                                         }n]# t          $ rP}t          |                                          }|r#t          d                    ||                    Y d}~nd}~ww xY w|j        dk    rt          |d         |d                   |j        dk    r	 |                     ||           nx#  Y xY w|j        dk    rdS |j        d	k    r|	                    d           nC|j        d
k    r|
                    d           n"|j        dk    r|                    d           nn<|S )z`Read message.

        Args:
            result (Result): A `Result` based type object.
        Tz{} reason: {}NMysqlx.Errorrh   r   Mysqlx.Notice.FramezMysqlx.Sql.StmtExecuteOkzMysqlx.Resultset.FetchDonez(Mysqlx.Resultset.FetchDoneMoreResultsetsMysqlx.Resultset.Row)r   ri   RuntimeErrorreprget_warningsrZ   r   r   r   
set_closedset_has_more_resultsset_has_data)r'   r   rh   errwarningss        r)   r[   zProtocol._read_message  s   	?l//11 ? ? ? 3 3 5 566 ?&'..sH==? ? ?? ? ? ? ??
 x>))&s5z3v;???222''V4444H777t999!!$''''GGG++D1111333##D)))3	4 
s!    
A7AA22A7-C Cc                 |    || _         | j                            |           | j                            |           dS )zSets the compression algorithm to be used by the compression
        object, for uplink and downlink.

        Args:
            algorithm (str): Algorithm to be used in compression/decompression.

        .. versionadded:: 8.0.21

        N)r   r   rn   r   r&   s     r)   rn   zProtocol.set_compression  s>     '0#$$Y///$$Y/////r+   c                 R   t          d          }| j                            t          d          |           | j                                        }|j        dk    r$| j                                        }|j        dk    $|j        dk    rt          |d         |d                   |S )zkGet capabilities.

        Returns:
            mysqlx.protobuf.Message: MySQL X Protobuf Message.
        z!Mysqlx.Connection.CapabilitiesGetz/Mysqlx.ClientMessages.Type.CON_CAPABILITIES_GETr   r   rh   r   )r   r   r   r   r   ri   r   r   rg   s     r)   get_capabiliteszProtocol.get_capabilites  s     9::""KLL	 	 	 l''))h///,++--C h/// 8~%%"3u:s6{;;;
r+   c           
      V   |sdS t          d          }|                                D ]\  }}t          d          }||d<   t          |t                    r|}g }|D ]T}t          d||                     ||                             }	|                    |	                                           Ut          d|          }
t          d	d
|
          }|                                |d<   n|                     |          |d<   |d                             |                                g           t          d          }||d<   | j        	                    t          d          |           	 |                                 S # t          $ r}|j        dk    r Y d}~nd}~ww xY wdS )zSet capabilities.

        Args:
            **kwargs: Arbitrary keyword arguments.

        Returns:
            mysqlx.protobuf.Message: MySQL X Protobuf Message.
        NzMysqlx.Connection.CapabilitieszMysqlx.Connection.Capabilityr   r   r   r   r   r   r   r   r   capabilitiesz!Mysqlx.Connection.CapabilitiesSetz/Mysqlx.ClientMessages.Type.CON_CAPABILITIES_SETi  )r   r   r   r   r   r]   r   r   r   r   r   read_okr   errno)r'   kwargsr   r   r   
capabilityr   r   itemr   r   r   rh   r   s                 r)   set_capabilitieszProtocol.set_capabilities  s     	F?@@ ,,.. 	L 	LJC !?@@J!$Jv%&& >! ; ;D%&K*.,0,<,<U4[,I,IK K KG OOG$7$7$9$9::::!";JJJ!"8qgNNN&-&9&9&;&;
7##&*&6&6u&=&=
7#(//1G1G1I1I0JKKKK9::*N""KLL	 	 		<<>>! 	 	 	 yD   !    	
 ts   2F 
F&F!!F&Nc                     t          d          }||d<   |||d<   |||d<   | j                            t          d          |           dS )zSend authenticate start.

        Args:
            method (str): Message method.
            auth_data (Optional[str]): Authentication data.
            initial_response (Optional[str]): Initial response.
        z Mysqlx.Session.AuthenticateStart	mech_nameN	auth_datainitial_responsez2Mysqlx.ClientMessages.Type.SESS_AUTHENTICATE_STARTr   r   r   r   )r'   methodr  r  rh   s        r)   send_auth_startzProtocol.send_auth_start=  sz     899!K (C'&6C"#""=@$B $BCF	H 	H 	H 	H 	Hr+   c                     | j                                         }|j        dk    r$| j                                         }|j        dk    $|j        dk    rt          d          |d         S )zRead authenticate continue.

        Raises:
            :class:`InterfaceError`: If the message type is not
                                     `Mysqlx.Session.AuthenticateContinue`

        Returns:
            str: The authentication data.
        r   #Mysqlx.Session.AuthenticateContinuez>Unexpected message encountered during authentication handshaker  )r   ri   r   r   rg   s     r)   read_auth_continuezProtocol.read_auth_continueN  sx     l''))h///,++--C h///8<<<  "< = = =;r+   c                 x    t          d|          }| j                            t          d          |           dS )zeSend authenticate continue.

        Args:
            auth_data (str): Authentication data.
        r	  )r  z5Mysqlx.ClientMessages.Type.SESS_AUTHENTICATE_CONTINUENr  )r'   r  rh   s      r)   send_auth_continuezProtocol.send_auth_continue`  s[     ; )+ + +""=C$E $EFI	K 	K 	K 	K 	Kr+   c                     	 | j                                         }|j        dk    rdS |j        dk    rt          |j                  F)z~Read authenticate OK.

        Raises:
            :class:`mysqlx.InterfaceError`: If message type is `Mysqlx.Error`.
        TzMysqlx.Session.AuthenticateOkr   N)r   ri   r   r   rh   rg   s     r)   read_auth_okzProtocol.read_auth_okk  sO    	.,++--Cx:::x>))$SW---	.r+   c                    |j         r|j        dk    r
|j        dk    r|                     |          \  }}nj|j        dk    r|                     |          \  }}nF|j        dk    r|                     |          \  }}n"t          d                    |                    t          |                                          }t          d          }t          d          }t          d||	          |d
<   |j        dk    rt          d||dz   	          |d<   ||d<   t          |         \  }}	t          d          }
t          |          |
d<   ||
|	<   t          d          }|j        |d<   |
|d<   | j                            t          d          |           	 |                                  dS # t           $ r t"          w xY w)a  
        Send prepare statement.

        Args:
            msg_type (str): Message ID string.
            msg (mysqlx.protobuf.Message): MySQL X Protobuf Message.
            stmt (Statement): A `Statement` based type object.

        Raises:
            :class:`mysqlx.NotSupportedError`: If prepared statements are not
                                               supported.

        .. versionadded:: 8.0.16
        Mysqlx.Crud.InsertMysqlx.Crud.FindMysqlx.Crud.UpdateMysqlx.Crud.DeletezInvalid message type: {}z!Mysqlx.Expr.Expr.Type.PLACEHOLDERzMysqlx.Crud.LimitExprzMysqlx.Expr.Expr)r   position	row_countr   offset
limit_expr#Mysqlx.Prepare.Prepare.OneOfMessager   zMysqlx.Prepare.Preparestmt_idr   z*Mysqlx.ClientMessages.Type.PREPARE_PREPAREN)	has_limitr   
build_findbuild_updatebuild_deleterY   rZ   r{   r   r   r   r   r  r   r   r   r   r   )r'   re   rh   r   _r  placeholdermsg_limit_expr
oneof_typeoneof_op	msg_oneofmsg_prepares               r)   send_prepare_preparezProtocol.send_prepare_preparex  s    > 	/ch*>>>x---..33111**40033111**40033 !;!B!B8!L!LMMM4,,..//H'(KLLK$%<==N*12D7B;C+E +E +EN;' x---+23E8C<DqL,J ,J ,Jx( !/C3H=
HABB	)*55	&!	(677!%I'F""FGG	 	 		$LLNNNNN 	$ 	$ 	$##	$s   F2 2Gc                    t           |         \  }}t          d          }t          |          |d<   |||<   t          d          }|j        |d<   |                     |d          }|r|d                             |           |j        r|d                             |                     |                                          	                                |                     |
                                          	                                g           | j                            t          d          |           d	S )
a  
        Send execute statement.

        Args:
            msg_type (str): Message ID string.
            msg (mysqlx.protobuf.Message): MySQL X Protobuf Message.
            stmt (Statement): A `Statement` based type object.

        .. versionadded:: 8.0.16
        r  r   zMysqlx.Prepare.Executer  Fr   r   z*Mysqlx.ClientMessages.Type.PREPARE_EXECUTEN)r   r   r   r  r   r   r  r   get_limit_row_countr   get_limit_offsetr   r   )	r'   re   rh   r   r!  r"  r#  msg_executer   s	            r)   send_prepare_executezProtocol.send_prepare_execute  sC     4H=
HABB	)*55	&!	(677!%I%%de%<< 	-&&t,,,> 	&&  !9!9!;!;<<HHJJ  !6!6!8!899EEGG(   
 	""FGG	 	 	 	 	r+   c                     t          d          }||d<   | j                            t          d          |           |                                  dS )z
        Send prepare deallocate statement.

        Args:
            stmt_id (int): Statement ID.

        .. versionadded:: 8.0.16
        zMysqlx.Prepare.Deallocater  z-Mysqlx.ClientMessages.Type.PREPARE_DEALLOCATEN)r   r   r   r   r   )r'   r  msg_deallocs      r)   send_prepare_deallocatez Protocol.send_prepare_deallocate  sX     9::!(I""IJJ	 	 	 	r+   c                 V   |j         rMt          d          }|                                |d<   |j        dk    r|                                |d<   ||d<   |dk    rdnd}|                     ||	          }|r|d
                             |           |                     ||           dS )a)  
        Send a message without prepared statements support.

        Args:
            msg_type (str): Message ID string.
            msg (mysqlx.protobuf.Message): MySQL X Protobuf Message.
            stmt (Statement): A `Statement` based type object.

        .. versionadded:: 8.0.16
        zMysqlx.Crud.Limitr  r  r  limit+Mysqlx.ClientMessages.Type.SQL_STMT_EXECUTEFTr'  r   N)r  r   r(  r   r)  r   r   send_msg)r'   re   rh   r   	msg_limitr   r   s          r)   send_msg_without_pszProtocol.send_msg_without_ps  s     > 	% 344I%)%=%=%?%?Ik"x---&*&;&;&=&=	(#$CLHHH E 	 %%di%@@ 	%Kt$$$h$$$$$r+   c                 V    | j                             t          |          |           dS )z
        Send a message.

        Args:
            msg_type (str): Message ID string.
            msg (mysqlx.protobuf.Message): MySQL X Protobuf Message.

        .. versionadded:: 8.0.16
        N)r   r   r   )r'   re   rh   s      r)   r2  zProtocol.send_msg  s*     	""=#:#:C@@@@@r+   c                    t          |                                rdnd          }t          d|j        j        |j        j                  }t          d||          }|j        r|                                |d<   |                     ||           |	                                rt          d          |d	<   n&|
                                rt          d
          |d	<   |j        dk    r
|j        |d<   d|fS )a  Build find/read message.

        Args:
            stmt (Statement): A :class:`mysqlx.ReadStatement` or
                              :class:`mysqlx.FindStatement` object.

        Returns:
            (tuple): Tuple containing:

                * `str`: Message ID string.
                * :class:`mysqlx.protobuf.Message`: MySQL X Protobuf Message.

        .. versionadded:: 8.0.16
        Mysqlx.Crud.DataModel.DOCUMENTMysqlx.Crud.DataModel.TABLEMysqlx.Crud.Collectionr   schemar  
data_model
collection
projectionz'Mysqlx.Crud.Find.RowLock.EXCLUSIVE_LOCKlockingz$Mysqlx.Crud.Find.RowLock.SHARED_LOCKr   locking_optionsz$Mysqlx.ClientMessages.Type.CRUD_FIND)r   is_doc_basedr   targetr   r;  has_projectionget_projection_exprr   is_lock_exclusiveis_lock_sharedlock_contentionr'   r   r=  r>  rh   s        r)   r  zProtocol.build_find  s0    #&*&7&7&9&9$A#C#C#@B B
 5"&+"2$(K$46 6 6
 (Z!+- - - 	; $ 8 8 : :C3%%%!!## 	FGHH 	NN  "" 	FDEE 	N !##%)%9C!"5s::r+   c                 &   t          |                                rdnd          }t          d|j        j        |j        j                  }t          d||          }|                     ||           |                                                                D ]t\  }}t          d          }|j	        |d<   |j
        |d	<   |j        t          |j                  |d<   |d                             |                                g           ud|fS )a  Build update message.

        Args:
            stmt (Statement): A :class:`mysqlx.ModifyStatement` or
                              :class:`mysqlx.UpdateStatement` object.

        Returns:
            (tuple): Tuple containing:

                * `str`: Message ID string.
                * :class:`mysqlx.protobuf.Message`: MySQL X Protobuf Message.

        .. versionadded:: 8.0.16
        r7  r8  r9  r:  r  r<  zMysqlx.Crud.UpdateOperation	operationsourceNr   z&Mysqlx.ClientMessages.Type.CRUD_UPDATE)r   rB  r   rC  r   r;  r   get_update_opsr   update_typerL  r   r
   r   r   )r'   r   r=  r>  rh   r  	update_oprK  s           r)   r  zProtocol.build_update+  s5    #&*&7&7&9&9$A#C#C#@B B
 5"&+"2$(K$46 6 6
 *z!+- - -3%%% //117799 	? 	?LAy =>>I%.%:Ik""+"2Ih*%/	%@%@	'"##Y%:%:%<%<$=>>>>7<<r+   c                     t          |                                rdnd          }t          d|j        j        |j        j                  }t          d||          }|                     ||           d|fS )a  Build delete message.

        Args:
            stmt (Statement): A :class:`mysqlx.DeleteStatement` or
                              :class:`mysqlx.RemoveStatement` object.

        Returns:
            (tuple): Tuple containing:

                * `str`: Message ID string.
                * :class:`mysqlx.protobuf.Message`: MySQL X Protobuf Message.

        .. versionadded:: 8.0.16
        r7  r8  r9  r:  r  r<  z&Mysqlx.ClientMessages.Type.CRUD_DELETE)r   rB  r   rC  r   r;  r   rI  s        r)   r  zProtocol.build_deleteM  s     #&*&7&7&9&9$A#C#C#@B B
 5DK<L$(K$46 6 6
*z!+- - -3%%%7<<r+   c                 z   t          d||d          }|rg }|                                D ]Q\  }}t          d||                     |                    }|                    |                                           Rt          d|          }	t          dd	|	
          }
|
                                g|d<   d|fS )a  Build execute statement.

        Args:
            namespace (str): The namespace.
            stmt (Statement): A `Statement` based type object.
            fields (Optional[dict]): The message fields.

        Returns:
            (tuple): Tuple containing:

                * `str`: Message ID string.
                * :class:`mysqlx.protobuf.Message`: MySQL X Protobuf Message.

        .. versionadded:: 8.0.16
        zMysqlx.Sql.StmtExecuteF)	namespacer   compact_metadatar   r   r   r   r   r   r   r   r1  )r   r   r   r]   r   )r'   rR  r   fieldsrh   r   r   r   r   r   r   s              r)   build_execute_statementz Protocol.build_execute_statementf  s      .)$',. . .  	2H$llnn 7 7
U!"G&)1A1A%1H1HJ J J 3 3 5 566667XFFFG41'JJJG"..001CK<cAAr+   c                    t          |                                rdnd          }t          d|j        j        |j        j                  }t          d||          }t          |d          rm|j        D ]e}t          ||                                           	                                }|d         
                    |                                g           f|                                D ]}t          d	          }t          |t                    rA|D ]=}	|d
         
                    t          |	                                          g           >n;|d
         
                    t          |                                          g           |d         
                    |                                g           t          |d          r|                                |d<   d|fS )a  Build insert statement.

        Args:
            stmt (Statement): A :class:`mysqlx.AddStatement` or
                              :class:`mysqlx.InsertStatement` object.

        Returns:
            (tuple): Tuple containing:

                * `str`: Message ID string.
                * :class:`mysqlx.protobuf.Message`: MySQL X Protobuf Message.

        .. versionadded:: 8.0.16
        r7  r8  r9  r:  r  r<  _fieldsr?  zMysqlx.Crud.Insert.TypedRowfieldrow	is_upsertupsertz&Mysqlx.ClientMessages.Type.CRUD_INSERT)r   rB  r   rC  r   r;  hasattrrW  r	   parse_table_insert_fieldr   r   
get_valuesr   r   r
   rZ  )
r'   r   r=  r>  rh   rX  exprr   rY  vals
             r)   build_insertzProtocol.build_insert  s    #&*&7&7&9&9$A#C#C#@B B
 5"&+"2$(K$46 6 6
 *z!+- - - 4## 	? ? ?!%T->->-@-@)@AA--// L!(($*:*:*<*<)=>>>>__&& 	3 	3E788C%&& G  I ICL''C)D)D)F)F(GHHHHI G##Z%6%6%B%B%D%D$EFFFJs00122224%% 	- NN,,CM7<<r+   c                 R    |                      |          }|t          d          dS )zClose the result.

        Args:
            result (Result): A `Result` based type object.

        Raises:
            :class:`mysqlx.OperationalError`: If message read is None.
        NzExpected to close the result)r[   r   r'   r   rh   s      r)   close_resultzProtocol.close_result  s2       ((?"#ABBB ?r+   c                     |                      |          }|dS |j        dk    r|S | j                            |           dS )z\Read row.

        Args:
            result (Result): A `Result` based type object.
        Nr   )r[   r   r   rk   rc  s      r)   read_rowzProtocol.read_row  sO       ((;48---J!!#&&&tr+   c                 8   g }	 |                      |          }|n|j        dk    r| j                            |           n|j        dk    rt	          d          t          |d         |d         |d         |d	         |d
         |d         |d         |                    dd          |                    dd          |                    dd          |                    dd          |                    d                    }|                    |           |S )zReturns column metadata.

        Args:
            result (Result): A `Result` based type object.

        Raises:
            :class:`mysqlx.InterfaceError`: If unexpected message.
        TNr   zMysqlx.Resultset.ColumnMetaDatazUnexpected msg typer   catalogr;  tableoriginal_tabler   original_namelength   	collationr   fractional_digitsflags   content_type)r[   r   r   rk   r   r   getr]   )r'   r   columnsrh   cols        r)   get_column_metadatazProtocol.get_column_metadata  s    	 $$V,,C{x111))#...x<<<$%:;;;Vc)nc(mWs+;'<Vc/&:2..a00!4a88"--002 2C NN3#	 $ r+   c                     | j                                         }|j        dk    r0t          d                    |d                   |d                   |j        dk    rt          d          dS )	zeRead OK.

        Raises:
            :class:`mysqlx.InterfaceError`: If unexpected message.
        r   zMysqlx.Error: {}rh   r   )r   z	Mysqlx.OkzUnexpected message encounteredN)r   ri   r   r   rZ   rg   s     r)   r   zProtocol.read_ok  s{     l''))8~%% !3!:!:3u:!F!F'*6{4 4 4 48{"" !ABBB #"r+   c                 t    t          d          }| j                            t          d          |           dS )zSend connection close.zMysqlx.Connection.Closez$Mysqlx.ClientMessages.Type.CON_CLOSENr  rg   s     r)   send_connection_closezProtocol.send_connection_close  sF    /00""=2$4 $458	: 	: 	: 	: 	:r+   c                 t    t          d          }| j                            t          d          |           dS )zSend close.zMysqlx.Session.Closez%Mysqlx.ClientMessages.Type.SESS_CLOSENr  rg   s     r)   
send_closezProtocol.send_close  sF    ,--""=3$5 $569	; 	; 	; 	; 	;r+   c                     t          d          }t          d          }||d<   d|d<   t          d          }|                                g|d<   | j                            t          d          |           d	S )
zSend expectation.z3Mysqlx.Expect.Open.Condition.Key.EXPECT_FIELD_EXISTzMysqlx.Expect.Open.Conditioncondition_keyz6.1condition_valuezMysqlx.Expect.Opencondz&Mysqlx.ClientMessages.Type.EXPECT_OPENN)r   r   r   r   r   )r'   cond_keymsg_ocmsg_eos       r)   send_expect_openzProtocol.send_expect_open  s     AC C788"*$) !-.. ,,../v""=4$6 $67=	? 	? 	? 	? 	?r+   c                 2   t          d          }|>	 |                                  |                                  d}n# t          $ r d}Y nw xY w|rd|d<   | j                            t          d          |           |                                  |rdS dS )zSend reset session message.

        Returns:
            boolean: ``True`` if the server will keep the session open,
                     otherwise ``False``.
        zMysqlx.Session.ResetNTF	keep_openz%Mysqlx.ClientMessages.Type.SESS_RESET)r   r  r   r   r   r   r   )r'   r  rh   s      r)   
send_resetzProtocol.send_reset  s     ,--"%%''' 		! " " "!			"  	$#C""=3$5 $569	; 	; 	; 	4us   *> AA)T)NNrE   )%r=   r>   r?   r@   r*   propertyr   r   r   r   r   r[   rn   r   r   r  r
  r  r  r%  r+  r.  r4  r2  r  r  r  rU  ra  rd  rf  rv  r   ry  r{  r  r  rA   r+   r)   r   r     s<           + + X+
9 9 9 8 8 8t" " " "H)= )= )=V     D0 0 0  &+ + +ZH H H H"     $	K 	K 	K. . .5$ 5$ 5$n  @   % % %2
A 
A 
A%; %; %;N =  =  =D= = =2B B B B<*= *= *=XC C C    <C C C: : :; ; ;? ? ?     r+   r   ),r@   loggingrV   r#   ior   	lz4.framer/   HAVE_LZ4ImportError	zstandardr   	HAVE_ZSTDerrorsr   r   r   r   r_  r	   r
   r   r   r   r   helpersr   r   r   r   protobufr   r   r   r   r   rv   	getLoggerr   objectr   rC   rp   r   rA   r+   r)   <module>r     s  :          HH   HHHII   III' ' ' ' ' ' ' ' ' ' ' '@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 6 6 6 6 6 6 6 6      H H H H H H H H H H H H H H  
'
H
%
%@ @ @ @ @ @ @ @F`H `H `H `H `HF `H `H `HF6H 6H 6H 6H 6HF 6H 6H 6HrI I I I Iv I I I I Is    ''2 <<