
    i                        d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
mZ 	 ddlZdZ	 ddlZdZ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' ddl(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= dZ> G d d      Z? G d d      Z@ G d d      ZA G d d      ZBy# e$ r dZY w xY w# e$ r dZY w xY w)z3Implementation of the X protocol for MySQL servers.    N)BytesIO)AnyDictListOptionalTupleUnionTF   )InterfaceErrorNotSupportedErrorOperationalErrorProgrammingError)
ExprParserbuild_bool_scalar
build_exprbuild_int_scalarbuild_scalarbuild_unsigned_int_scalar)encode_to_bytesget_item_or_attr)logger)CRUD_PREPARE_MAPPINGSERVER_MESSAGESMessagemysqlxpb_enum)Column)
AddStatementDeleteStatementFilterableStatementFindStatementInsertStatementModifyStatementReadStatementRemoveStatementSqlStatementUpdateStatement)
ColumnTypeMessageTypeProtobufMessageCextTypeProtobufMessageTypeResultBaseType
SocketTypeStatementType
StrOrBytesi  c                   @    e Zd ZdZdeddfdZdedefdZdedefdZ	y)	
CompressorzImplements compression/decompression using `zstd_stream`, `lz4_message`
    and `deflate_stream` algorithms.

    Args:
        algorithm (str): Compression algorithm.

    .. versionadded:: 8.0.21

    	algorithmreturnNc                    || _         d | _        d | _        |dk(  r3t        j                         | _        t        j
                         | _        y |dk(  r3t        j                         | _        t        j                         | _        y y )Nzstd_streamdeflate_stream)	
_algorithm_compressobj_decompressobjzstdZstdCompressorZstdDecompressorzlibcompressobjdecompressobjselfr1   s     a/var/www/catia.catastroantioquia-mas.com/valormas/lib/python3.12/site-packages/mysqlx/protocol.py__init__zCompressor.__init__j   ss    (!%#'% $ 3 3 5D"&"7"7"9D** $ 0 0 2D"&"4"4"6D +    datac                    | j                   dk(  r| j                  j                  |      S | j                   dk(  r`t        j                  j                         5 }|j                         }||j                  |      z  }||j                         z  }ddd       |S | j                  j                  |      }|| j                  j                  t        j                        z  }|S # 1 sw Y   S xY w)zCompresses data and returns it.

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

        Returns:
            bytes: Compressed data.
        r4   lz4_messageN)
r6   r7   compresslz4frameLZ4FrameCompressorbeginflushr<   Z_SYNC_FLUSH)r@   rD   
compressor
compresseds       rA   rG   zCompressor.compressv   s     ??m+$$--d33??m+--/ 1:'--/
j11$77
j..00
1  &&//5
d''--d.?.?@@
1 s   8C##C-c                    | j                   dk(  r| j                  j                  |      S | j                   dk(  r:t        j                  j                         5 }|j                  |      }ddd       |S | j                  j                  |      }|| j                  j                  t        j                        z  }|S # 1 sw Y   S xY w)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.
        r4   rF   N)	r6   r8   
decompressrH   rI   LZ4FrameDecompressorrL   r<   rM   )r@   rD   decompressordecompresseds       rA   rQ   zCompressor.decompress   s     ??m+&&11$77??m+//1 =\+66t<= **55d;++11$2C2CDD=s   B==C)
__name__
__module____qualname____doc__strrB   r.   bytesrG   rQ    rC   rA   r0   r0   _   s@    
7# 
7$ 
7Z E .z e rC   r0   c                   X    e Zd ZdZdeddfdZdefdZdefdZdeddfd	Z	d
e
ddfdZy)MessageReaderzImplements a Message Reader.

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

    .. versionadded:: 8.0.21
    socket_streamr2   Nc                 <    || _         d | _        d | _        g | _        y N)_stream_compressor_msg
_msg_queuer@   r^   s     rA   rB   zMessageReader.__init__   s    #015!%	)+rC   c                 T   | j                   r| j                   j                  d      S t        j                  d| j                  j                  d            \  }}|dk(  rt        d      | j                  j                  |dz
        }|t        vrt        d|       |dk(  r|d	k(  r| j                         S t        j                  ||      }|d
k(  r|d   }t        | j                  j                  |d               }d}||k  ryt        j                  d|j                  d            \  }}	|j                  |dz
        }
| j                   j                  t        j                  |	|
             ||dz   z  }||k  ry| j                   r| j                   j                  d      S 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:    rC      uncompressed_sizepayload   N)rd   popstructunpackra   readr   r   
ValueError_read_messager   from_server_messager   rb   rQ   append)r@   
frame_size
frame_typeframe_payload	frame_msgrl   streambytes_processedpayload_sizemsg_typerm   s              rA   rt   zMessageReader._read_message   s    ????&&q))!'udll6G6G6J!K
J"$  ))*q.9_,5j\BCC  4%%''//
MJ	 )*= >T--8899MNOFO!$55)/ufkk!n)M&h ++lQ&67&&w'B'B8W'UV<!#33	 "$55
 .2__4??&&q)F$FrC   c                 d    | j                   | j                   }d| _         |S | j                         S )zgRead message.

        Returns:
            mysqlx.protobuf.Message: MySQL X Protobuf Message.
        N)rc   rt   r@   msgs     rA   read_messagezMessageReader.read_message   s2     99 ))CDIJ!!##rC   r   c                 @    | j                   t        d      || _         y)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)rc   r   r   s     rA   push_messagezMessageReader.push_message   s!     99 "#>??	rC   r1   c                 8    |rt        |      | _        yd| _        y)zCreates a :class:`mysqlx.protocol.Compressor` object based on the
        compression algorithm.

        Args:
            algorithm (str): Compression algorithm.

        .. versionadded:: 8.0.21

        Nr0   rb   r?   s     rA   set_compressionzMessageReader.set_compression   s     5>:i04rC   )rU   rV   rW   rX   r,   rB   r(   rt   r   r   rY   r   r[   rC   rA   r]   r]      s\    ,j ,T ,-{ -^
$k 
$  
H 
H 
HrC   r]   c                   D    e Zd ZdZdeddfdZdededdfdZd	e	ddfd
Z
y)MessageWriterzImplements a Message Writer.

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

    .. versionadded:: 8.0.21

    r^   r2   Nc                      || _         d | _        y r`   )ra   rb   re   s     rA   rB   zMessageWriter.__init__  s    #015rC   r~   r   c                 ^   |j                  |      }| j                  r0|t        kD  r&t        |j	                               }t        j                  d|dz   |      }| j                  j                  dj                  ||g            }t        d      }||d<   |dz   |d<   t        d      }||d<   dj                  t        |j                               d	d
 t        |j                               g      }	t        d      }
t        j                  dt        |	      dz   |
      }| j                  j                  dj                  ||	g             y	t        |j	                               }t        j                  d|dz   |      }| j                  j                  dj                  ||g             y	)zWrite message.

        Args:
            msg_type (int): The message type.
            msg (mysqlx.protobuf.Message): MySQL X Protobuf Message.
        rg   r
   rC   zMysqlx.Connection.Compressionclient_messagesrh   rl   rm   Nz&Mysqlx.ClientMessages.Type.COMPRESSION)	byte_sizerb   _COMPRESSION_THRESHOLDr   serialize_to_stringrp   packrG   joinr   serialize_partial_to_stringr   lenra   sendall)r@   r~   r   msg_sizemsg_strheaderrO   msg_first_fieldsmsg_payloadoutputmsg_comp_ids              rA   write_messagezMessageWriter.write_message  s    ==%+A A%c&=&=&?@G[[1h?F))22388VW<M3NOJ&'FG2:./4<qL01!"ABK%/K	"XX#$4$P$P$RS $K$K$K$MN	F ((PQK[[FaEFLL  66*:!;<%c&=&=&?@G[[1h?FLL  67*;!<=rC   r1   c                 8    |rt        |      | _        yd| _        y)zCreates a :class:`mysqlx.protocol.Compressor` object based on the
        compression algorithm.

        Args:
            algorithm (str): Compression algorithm.
        Nr   r?   s     rA   r   zMessageWriter.set_compression:  s     5>:i04rC   )rU   rV   rW   rX   r,   rB   intr(   r   rY   r   r[   rC   rA   r   r     sK    6j 6T 6#>c #> #> #>JH H HrC   r   c                   0   e Zd ZdZdededdfdZedee	   fd       Z
eded	eddfd
       Zdedee   fdZ	 d5d	eeef   dedeed   eeeef      f   fdZdededdfdZdedee   fdZde	ddfdZdefdZdeddfdZ	 	 d6de	dee	   dee	   ddfdZdefdZ de	ddfdZ!d7dZ"de	ded	ee#e$e%e&e'e(f   ddfdZ)de	ded	eddfd Z*d!e+ddfd"Z,de	ded	eeef   ddfd#Z-de	deddfd$Z.d	ee#e&f   de/e	ef   fd%Z0d	ee%e(f   de/e	ef   fd&Z1d	ee$e'f   de/e	ef   fd'Z2	 d8d(e	d	ee	e3f   d)ee4e	ef      de/e	ef   fd*Z5ed	ee6e7f   de/e	ef   fd+       Z8deddfd,Z9dedee   fd-Z:dedee;   fd.Z<d7d/Z=d7d0Z>d7d1Z?d7d2Z@d8d3ee   defd4ZAy)9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
    readerwriterr2   Nc                 <    || _         || _        d | _        g | _        y r`   )_reader_writer_compression_algorithm	_warnings)r@   r   r   s      rA   rB   zProtocol.__init__N  s    &,&,59#$&rC   c                     | j                   S )zstr: The compresion algorithm.)r   )r@   s    rA   compression_algorithmzProtocol.compression_algorithmT  s     ***rC   r   stmtc                 :   |j                   r|j                         | d<   |j                  r"| d   j                  |j	                                |j
                  r"| d   j                  |j                                |j                  r|j                         | d<   yy)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   r   s     rA   _apply_filterzProtocol._apply_filterY  s     >>"113C
O==L 2 2 45
O""4#4#4#67??'+'8C#$ rC   argc           	         t        |t              r)t        d|      }t        dd|      }t        dd|      S t        |t              rt        ddt	        |            S t        |t
              r3|d	k  rt        ddt        |            S t        ddt        |            S t        |t              rZt        |      d
k(  rL|\  }}t        d|| j                  |            }t        d|j                         g      }t        dd
|      S t        |t              s)t        |t        t        f      rt        |d	   t              rg }|D ]  }	g }
|	j                         D ]A  \  }}t        d|| j                  |            }|
j                  |j                                C t        d|
      }t        dd
|      }|j                  |j                                 t        d      }||d<   t        dd|      S t        |t              reg }
|D ]A  \  }}t        d|| j                  |            }|
j                  |j                                C t        d|
      }t        dd
|      }|S y)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)
isinstancerY   r   boolr   r   r   r   tupler   _create_anyget_messagedictlistitemsrv   )r@   r   r   r   arg_key	arg_valueobj_fldr   array_valuesr   obj_fldsr   msg_objmsg_anyr   s                  rA   r   zProtocol._create_anyj  sv    c3<CHE6QOF1&IIc4 &Q7H7M  c3Qw*+C0 
 &05 
 c5!c#h!m!$GY5&&y1G
 3':M:M:O9PQC1sCCc4 sT5M*z#a&$/GL ;"'++- ;JC%="..u5G
 OOG$7$7$9:; "";J!"8qgN##G$7$7$9:; 23C'CL1EEc4 H! 7
U!9**51
  3 3 567 7XFG41'JGNrC   	is_scalarc                     dt         dt        t        t        f   f fd}|j	                         }|j                         }||D cg c]
  } ||       c}S t        |      }|dgz  }|t        |      k7  rt        d      |j                         D ]'  \  }	}|	|vrt        d|	       ||	   }
 ||      ||
<   ) |S c c}w )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.
        r   r2   c                 x    rt        |       j                         S j                  |       j                         S r`   )r   r   r   )r   r   r@   s    rA   build_valuez/Protocol._get_binding_args.<locals>.build_value  s6     #E*6688##E*6688rC   Nz;The number of bind parameters and placeholders do not matchz*Unable to find placeholder for parameter: )	r   r	   r*   r)   get_bindingsget_binding_mapr   r   r   )r@   r   r   r   bindingsbinding_mapr   countargsnameposs   ` `        rA   _get_binding_argszProtocol._get_binding_args  s    "	9	9&(??@	9 $$&**, 4<=5K&==K 4&.CM!"M  $>>+ 	+KD%;&&@G  d#C#E*DI	+  >s   	Cresultc                 b   |d   dk(  rt        j                  d|d         }| j                  j                  |j                         t        j                  d|j                  |j                         |j                  |j                  |j                  |j                         y|d   dk(  rt        j                  d|d          y|d   dk(  rt        j                  d	|d         }|d
   t        d      k(  rE|j                  |d   D cg c]&  }t        t        |d      d      j                         ( c}       y|d   j                         }|d
   t        d      k(  r|j                  t        |d             y|d
   t        d      k(  r|j!                  t        |d             yyyc c}w )zProcess frame.

        Args:
            msg (mysqlx.protobuf.Message): A MySQL X Protobuf Message.
            result (Result): A `Result` based type object.
        r   r
   zMysqlx.Notice.Warningrm   z:Protocol.process_frame Received Warning Notice code %s: %sr   z$Mysqlx.Notice.SessionVariableChangedr   z!Mysqlx.Notice.SessionStateChangedparamzBMysqlx.Notice.SessionStateChanged.Parameter.GENERATED_DOCUMENT_IDSr   v_octetsz9Mysqlx.Notice.SessionStateChanged.Parameter.ROWS_AFFECTEDv_unsigned_intz?Mysqlx.Notice.SessionStateChanged.Parameter.GENERATED_INSERT_IDN)r   from_messager   rv   r   r   warningcodeappend_warninglevelr   set_generated_idsr   decodero   set_rows_affectedset_generated_insert_id)r@   r   r   warn_msgsess_state_msgr   sess_state_values          rA   _process_framezProtocol._process_frame  s    v;!++,CS^THNN!!(,,/NNL
 !!(..(--N[A  !GYX[A$113S^N g&-T+  ((
 &4G%<	 " ),UJ? &(# $2'#:#>#>#@ !'*mO/  ,,()9;KL $G,U1  22()9;KL/ s   
+F,c                 d   	 	 | j                   j                         }j
                  dk(  rt        |d   |d         |j
                  dk(  r	 | j                  ||       nx|j
                  dk(  ry|j
                  d	k(  r|j                  d       nG|j
                  d
k(  r|j                  d       n&|j
                  dk(  r|j                  d       	 |S 	 |S # t        $ r6}t        |j	                               }|rt        | d|       |Y d}~d}~ww xY w# t        t        f$ r Y -w xY w)z`Read message.

        Args:
            result (Result): A `Result` based type object.
        Tz	 reason: NMysqlx.Errorr   r   Mysqlx.Notice.FramezMysqlx.Sql.StmtExecuteOkzMysqlx.Resultset.FetchDonez(Mysqlx.Resultset.FetchDoneMoreResultsetsMysqlx.Resultset.Row)r   r   RuntimeErrorreprget_warningsr   r   r   AttributeErrorKeyError
set_closedset_has_more_resultsset_has_data)r@   r   r   errwarningss        rA   rt   zProtocol._read_message  s?    Mll//1
 xx>)&s5z3v;??xx00''V4 7799!!$'GG++D133##D) 
 
3    M 3 3 56&#iz'BCL M '1 s)   C D 	D#,DDD/.D/r1   c                 ~    || _         | j                  j                  |       | j                  j                  |       y)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   r   r   r?   s     rA   r   zProtocol.set_compression3  s0     '0#$$Y/$$Y/rC   c                 N   t        d      }| j                  j                  t        d      |       | j                  j                         }|j                  dk(  r*| j                  j                         }|j                  dk(  r*|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   r   r   )r   r   r   r   r   r   r   r   r   s     rA   get_capabiliteszProtocol.get_capabilitesA  s     9:""KL	
 ll'')hh//,,++-C hh// 88~%"3u:s6{;;
rC   kwargsc           
         |syt        d      }|j                         D ]  \  }}t        d      }||d<   t        |t              ry|}g }|D ]A  }t        d|| j	                  ||               }	|j                  |	j                                C t        d|      }
t        d	d
|
      }|j                         |d<   n| j	                  |      |d<   |d   j                  |j                         g        t        d      }||d<   | j                  j                  t        d      |       	 | j                         S # t        $ r}|j                  dk7  r Y d}~yd}~ww xY w)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   rv   r   r   r   r   r   read_okr   errno)r@   r  r  r   r   
capabilityr   r   itemr   r   r   r   r  s                 rA   set_capabilitieszProtocol.set_capabilitiesU  su    ?@ ,,. 	LJC !?@J!$Jv%&! ;D%= "..uT{;G
 OOG$7$7$9:; "";J!"8qgN&-&9&9&;
7#&*&6&6u&=
7#(//1G1G1I0JK'	L( 9:*N""KL	

	<<>! 	 yyD  !	s   -D= =	E EE method	auth_datainitial_responsec                     t        d      }||d<   |||d<   |||d<   | j                  j                  t        d      |       y)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_nameNr  r  z2Mysqlx.ClientMessages.Type.SESS_AUTHENTICATE_STARTr   r   r   r   )r@   r  r  r  r   s        rA   send_auth_startzProtocol.send_auth_start  sX     89!K (C'&6C"#""NO	
rC   c                     | j                   j                         }|j                  dk(  r*| j                   j                         }|j                  dk(  r*|j                  dk7  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   r   r   r   r   s     rA   read_auth_continuezProtocol.read_auth_continue  sn     ll'')hh//,,++-C hh//88<< P  ;rC   c                 h    t        d|      }| j                  j                  t        d      |       y)zeSend authenticate continue.

        Args:
            auth_data (str): Authentication data.
        r  )r  z5Mysqlx.ClientMessages.Type.SESS_AUTHENTICATE_CONTINUENr  )r@   r  r   s      rA   send_auth_continuezProtocol.send_auth_continue  s/     ;yQ""QR	
rC   c                     	 | j                   j                         }|j                  dk(  ry|j                  dk(  rt        |j                        O)z~Read authenticate OK.

        Raises:
            :class:`mysqlx.InterfaceError`: If message type is `Mysqlx.Error`.
        zMysqlx.Session.AuthenticateOkr   N)r   r   r   r   r   r   s     rA   read_auth_okzProtocol.read_auth_ok  sI     ,,++-Cxx::xx>)$SWW-- rC   r~   c                 ,   |j                   r|j                  dk7  r|j                  dk(  r| j                  |      \  }}nV|j                  dk(  r| j                  |      \  }}n2|j                  dk(  r| j	                  |      \  }}nt        d|       t        |j                               }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                  j                  t        d      |       	 | j                          y# t        $ r}t         |d}~w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_deleters   r   r   r   r   r   r.  r   r   r  r   r   )r@   r~   r   r   _r)  placeholdermsg_limit_expr
oneof_typeoneof_op	msg_oneofmsg_preparer  s                rA   send_prepare_preparezProtocol.send_prepare_prepare  s   6 >>chh*>>xx--.311**40311**403 #9(!DEE4,,./H'(KLK$%<=N*1"x+N;' xx--+2&[8a<,x( !/C3H=
HAB	)*5	&!	(67!%I'F""FG	

	-LLN 	-#,	-s   -E> >	FFFc                    t         |   \  }}t        d      }t        |      |d<   |||<   t        d      }|j                  |d<   | j	                  |d      }|r|d   j                  |       |j                  rl|d   j                  | j                  |j                               j                         | j                  |j                               j                         g       | j                  j                  t        d      |       y	)
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@   r~   r   r   r6  r7  r8  msg_executer   s	            rA   send_prepare_executezProtocol.send_prepare_execute  s      4H=
HAB	)*5	&!	(67!%I%%de%<&&t,>>&&$$T%=%=%?@LLN$$T%:%:%<=IIK 	""FG	
rC   r.  c                     t        d      }||d<   | j                  j                  t        d      |       | j	                          y)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      rA   send_prepare_deallocatez Protocol.send_prepare_deallocate2  sB     9:!(I""IJ	
 	rC   c                 &   |j                   rEt        d      }|j                         |d<   |j                  dk(  r|j	                         |d<   ||d<   |dk7  }| j                  ||      }|r|d   j                  |       | j                  ||       y	)
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_EXECUTEr<  r   N)r/  r   r=  r   r>  r   r   send_msg)r@   r~   r   r   	msg_limitr   r   s          rA   send_msg_without_pszProtocol.send_msg_without_psC  s      >> 34I%)%=%=%?Ik"xx--&*&;&;&=	(#$CL MM	%%di%@Kt$h$rC   c                 N    | j                   j                  t        |      |       y)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@   r~   r   s      rA   rG  zProtocol.send_msg_  s     	""=#:C@rC   c                    t        |j                         rdnd      }t        d|j                  j                  |j
                  j                        }t        d||      }|j                  r|j                         |d<   | j                  ||       |j                         rt        d      |d	<   n|j                         rt        d
      |d	<   |j                  j                  dkD  r|j                  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   rP  has_projectionget_projection_exprr   is_lock_exclusiveis_lock_sharedlock_contentionr   r@   r   rR  rS  r   s        rA   r0  zProtocol.build_findk  s    " #  " -.


 $!!;;##


 (ZJW $ 8 8 :C3%!!#*+TUC	N  "*+QRC	N%%)%)%9%9%?%?C!"5s::rC   c                    t        |j                         rdnd      }t        d|j                  j                  |j
                  j                        }t        d||      }| j                  ||       |j                         j                         D ]u  \  }}t        d      }|j                  |d<   |j                  |d	<   |j                  t        |j                        |d
<   |d   j                  |j                         g       w d|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
        rL  rM  rN  rO  r'  rQ  zMysqlx.Crud.UpdateOperation	operationsourcer   z&Mysqlx.ClientMessages.Type.CRUD_UPDATE)r   rW  r   rX  r   rP  r   get_update_opsr   update_typera  r   r   r   r   )r@   r   rR  rS  r   r3  	update_opr`  s           rA   r1  zProtocol.build_update  s	   " #  " -.


 $!!;;##


  ZJ
 	3% //1779 	?LAy =>I%.%:%:Ik""+"2"2Ih*%/	%@	'"##Y%:%:%<$=>	? 8<<rC   c                     t        |j                         rdnd      }t        d|j                  j                  |j
                  j                        }t        d||      }| j                  ||       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
        rL  rM  rN  rO  r(  rQ  z&Mysqlx.ClientMessages.Type.CRUD_DELETE)r   rW  r   rX  r   rP  r   r^  s        rA   r2  zProtocol.build_delete  s{    " #  " -.


 $!!;;##


  ZJ
 	3%7<<rC   	namespacefieldsc                 6   t        d||d      }|rg }|j                         D ]A  \  }}t        d|| j                  |            }|j                  |j	                                C t        d|      }	t        dd	|	
      }
|
j	                         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)rf  r   compact_metadatar   r   r   r   r   r   r   r   rF  )r   r   r   rv   r   )r@   rf  r   rg  r   r   r   r   r   r   r   s              rA   build_execute_statementz Protocol.build_execute_statement  s    * $"	
 H$lln 7
U!9**51
  3 3 567 7XFG41'JG"..01CK<cAArC   c                 B   t        | j                         rdnd      }t        d| j                  j                  | j
                  j                        }t        d||      }t        | d      r]| j                  D ]N  }t        || j                                j                         }|d   j                  |j                         g       P | j                         D ]  }t        d	      }t        |t              r4|D ].  }|d
   j                  t        |      j                         g       0 n,|d
   j                  t        |      j                         g       |d   j                  |j                         g        t        | d      r| j!                         |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
        rL  rM  rN  rO  r%  rQ  _fieldsrT  zMysqlx.Crud.Insert.TypedRowfieldrow	is_upsertupsertz&Mysqlx.ClientMessages.Type.CRUD_INSERT)r   rW  r   rX  r   rP  hasattrrl  r   parse_table_insert_fieldr   r   
get_valuesr   r   r   ro  )	r   rR  rS  r   rm  exprr   rn  vals	            rA   build_insertzProtocol.build_insert	  s   $ #  " -.


 $!!;;##


  ZJ
 4# ?!t0022**,  L!(($*:*:*<)=>	? __& 	3E78C%&  ICL''C)D)D)F(GHI G##Z%6%B%B%D$EFJs012	3 4% NN,CM7<<rC   c                 @    | j                  |      }|t        d      y)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)rt   r   r@   r   r   s      rA   close_resultzProtocol.close_result>  s*       (?"#ABB rC   c                     | j                  |      }|y|j                  dk(  r|S | j                  j                  |       y)z\Read row.

        Args:
            result (Result): A `Result` based type object.
        Nr   )rt   r   r   r   rx  s      rA   read_rowzProtocol.read_rowK  sC       (;88--J!!#&rC   c                    g }	 | j                  |      }|	 |S |j                  dk(  r| j                  j                  |       	 |S |j                  dk7  rt	        d      t        |d   |d   |d   |d   |d   |d	   |d
   |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  d            }|j                  |       )zReturns column metadata.

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

        Raises:
            :class:`mysqlx.InterfaceError`: If unexpected message.
        r   zMysqlx.Resultset.ColumnMetaDatazUnexpected msg typer   catalogrP  tableoriginal_tabler   original_namelength   	collationr   fractional_digitsflags   content_type)rt   r   r   r   r   r   getrv   )r@   r   columnsr   cols        rA   get_column_metadatazProtocol.get_column_metadataY  s    $$V,C{* ) xx11))#.$ # xx<<$%:;;FIHG$%FO$"%Q'+Q/$'C NN3/ rC   c                     | j                   j                         }|j                  dk(  rt        d|d    |d         |j                  dk7  rt        d      y)	zeRead OK.

        Raises:
            :class:`mysqlx.InterfaceError`: If unexpected message.
        r   zMysqlx.Error: r   r   )r  z	Mysqlx.OkzUnexpected message encounteredNr  r   s     rA   r  zProtocol.read_ok}  s[     ll'')88~% >#e*!>c&kRR88{" !ABB #rC   c                 d    t        d      }| j                  j                  t        d      |       y)zSend connection close.zMysqlx.Connection.Closez$Mysqlx.ClientMessages.Type.CON_CLOSENr  r   s     rA   send_connection_closezProtocol.send_connection_close  s*    /0""@A3	
rC   c                 d    t        d      }| j                  j                  t        d      |       y)zSend close.zMysqlx.Session.Closez%Mysqlx.ClientMessages.Type.SESS_CLOSENr  r   s     rA   
send_closezProtocol.send_close  s*    ,-""ABC	
rC   c                     t        d      }t        d      }||d<   d|d<   t        d      }|j                         g|d<   | j                  j	                  t        d      |       y	)
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       rA   send_expect_openzProtocol.send_expect_open  sj     !VW78"*$) !-. ,,./v""BCV	
rC   	keep_openc                    t        d      }|#	 | j                          | j                          d}|rd|d<   | j                  j                  t        d      |       | j                          |ryy# t        $ r d}Y Mw xY w)zSend reset session message.

        Returns:
            boolean: ``True`` if the server will keep the session open,
                     otherwise ``False``.
        zMysqlx.Session.ResetTFr  z%Mysqlx.ClientMessages.Type.SESS_RESET)r   r  r  r   r   r   r   )r@   r  r   s      rA   
send_resetzProtocol.send_reset  s     ,-"%%' 	 #C""ABC	
 	 " "!	"s   "A1 1A?>A?)T)NN)r2   Nr`   )BrU   rV   rW   rX   r]   r   rB   propertyr   rY   r   staticmethodr(   r   r   r   r   r	   r%   r   r   r*   r)   r   r+   r   rt   r   r  r  r  rZ   r  r!  r#  r    r   r"   r#   r$   r&   r:  r@  r   rC  rI  rG  r   r0  r1  r2  r-   r   rj  r   r!   rv  ry  r{  r'   r  r  r  r  r  r  r[   rC   rA   r   r   D  s   '} 'm ' ' +x} + + 9; 9.A 9d 9 9 Hs Hx'< HV QU,-|;<,IM,	tDz4&9;R&R STT	U,\.+ .~ .$ .`N x7L B0 0 0 (. . .f $(*.	

 C=
 #3-	

 

0 E  &

C 

D 

.B-B- B- 
	B- 
B-H#
#
"-#
5H#
	#
Js t "%% % '56	%
 
%8
A 
A; 
A4 
A(;-67(;	sK	 (;T'=/?:;'=	sK	 '=R=/?:;=	sK	 =J ,0	(B(B C&'(B c3h(	(B
 
sK	 (BT 2=L/122=	sK	 2= 2=hC> Cd C~ (;2G ". "T*=M "H
C


HTN d rC   r   )CrX   rp   r<   ior   typingr   r   r   r   r   r	   	lz4.framerH   HAVE_LZ4ImportError	zstandardr9   	HAVE_ZSTDerrorsr   r   r   r   rt  r   r   r   r   r   r   helpersr   r   r   protobufr   r   r   r   r   r   	statementr   r   r   r    r!   r"   r#   r$   r%   r&   typesr'   r(   r)   r*   r+   r,   r-   r.   r   r0   r]   r   r   r[   rC   rA   <module>r     s   : :    : :HI   7  S S   	 	 	  A AHaH aHH:H :Hzz zw  H  Is"   C C CCCC