
    BR<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'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> dZ? G d d      Z@ G d d      ZA G d d      ZB G d d      ZCy# 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PROTOBUF_REPEATED_TYPES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selfr2   s     P/var/www/html/delta-backend/venv/lib/python3.12/site-packages/mysqlx/protocol.py__init__zCompressor.__init__p   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.
        r5   lz4_messageN)
r7   r8   compresslz4frameLZ4FrameCompressorbeginflushr=   Z_SYNC_FLUSH)rA   rE   
compressor
compresseds       rB   rH   zCompressor.compress|   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.
        r5   rG   N)	r7   r9   
decompressrI   rJ   LZ4FrameDecompressorrM   r=   rN   )rA   rE   decompressordecompresseds       rB   rR   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__strrC   r/   bytesrH   rR    rD   rB   r1   r1   e   s@    
7# 
7$ 
7Z E .z e rD   r1   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_streamr3   Nc                 <    || _         d | _        d | _        g | _        y N)_stream_compressor_msg
_msg_queuerA   r_   s     rB   rC   zMessageReader.__init__   s    #015!%	)+rD   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:    rD      uncompressed_sizepayload   N)re   popstructunpackrb   readr   r   
ValueError_read_messager   from_server_messager   rc   rR   append)rA   
frame_size
frame_typeframe_payload	frame_msgrm   streambytes_processedpayload_sizemsg_typern   s              rB   ru   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rD   c                 d    | j                   | j                   }d| _         |S | j                         S )zgRead message.

        Returns:
            mysqlx.protobuf.Message: MySQL X Protobuf Message.
        N)rd   ru   rA   msgs     rB   read_messagezMessageReader.read_message   s2     99 ))CDIJ!!##rD   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)rd   r   r   s     rB   push_messagezMessageReader.push_message   s!     99 "#>??	rD   r2   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r1   rc   r@   s     rB   set_compressionzMessageReader.set_compression   s     5>:i04rD   )rV   rW   rX   rY   r-   rC   r)   ru   r   r   rZ   r   r\   rD   rB   r^   r^      s\    ,j ,T ,-{ -^
$k 
$  
H 
H 
HrD   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_   r3   Nc                      || _         d | _        y ra   )rb   rc   rf   s     rB   rC   zMessageWriter.__init__  s    #015rD   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.
        rh   r
   rD   zMysqlx.Connection.Compressionclient_messagesri   rm   rn   Nz&Mysqlx.ClientMessages.Type.COMPRESSION)	byte_sizerc   _COMPRESSION_THRESHOLDr   serialize_to_stringrq   packrH   joinr   serialize_partial_to_stringr   lenrb   sendall)rA   r   r   msg_sizemsg_strheaderrP   msg_first_fieldsmsg_payloadoutputmsg_comp_ids              rB   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*;!<=rD   r2   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     rB   r   zMessageWriter.set_compression@  s     5>:i04rD   )rV   rW   rX   rY   r-   rC   intr)   r   rZ   r   r\   rD   rB   r   r     sK    6j 6T 6#>c #> #> #>JH H HrD   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writerr3   Nc                 <    || _         || _        d | _        g | _        y ra   )_reader_writer_compression_algorithm	_warnings)rA   r   r   s      rB   rC   zProtocol.__init__T  s    &,&,59#$&rD   c                     | j                   S )zstr: The compresion algorithm.)r   )rA   s    rB   compression_algorithmzProtocol.compression_algorithmZ  s     ***rD   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     rB   _apply_filterzProtocol._apply_filter_  s     >>"113C
O==L 2 2 45
O""4#4#4#67??'+'8C#$ rD   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)
isinstancerZ   r   boolr   r   r   r   tupler   _create_anyget_messagedictlistitemsrw   )rA   r   r   r   arg_key	arg_valueobj_fldr   array_valuesr   obj_fldsr   msg_objmsg_anyr   s                  rB   r   zProtocol._create_anyp  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rD   	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   r3   c                 x    rt        |       j                         S j                  |       j                         S ra   )r   r   r   )r   r   rA   s    rB   build_valuez/Protocol._get_binding_args.<locals>.build_value  s6     #E*6688##E*6688rD   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   )rA   r   r   r   bindingsbinding_mapr   countargsnameposs   ` `        rB   _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                    |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t        |d   t        t                     r|d   d   n|d   }|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.Warningrn   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_octetsr   z9Mysqlx.Notice.SessionStateChanged.Parameter.ROWS_AFFECTEDv_unsigned_intz?Mysqlx.Notice.SessionStateChanged.Parameter.GENERATED_INSERT_IDN)r   from_messager   rw   r   r   warningcodeappend_warninglevelr   set_generated_idsr   decoder   r   r   set_rows_affectedset_generated_insert_id)rA   r   r   warn_msgsess_state_msgr   sess_state_values          rB   _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? &(# "&w/7N1O #7+A. (0 ! "'*mO/  ,,()9;KL $G,U1  22()9;KL; s   
+G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)rA   r   r   errwarningss        rB   ru   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/r2   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     rB   r   zProtocol.set_compression?  s0     '0#$$Y/$$Y/rD   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     rB   get_capabiliteszProtocol.get_capabilitesM  s     9:""KL	
 ll'')hh//,,++-C hh// 88~%"3u:s6{;;
rD   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   rw   r   r   r   r   r   read_okr   errno)rA   r  r  r   r   
capabilityr   r   itemr   r   r   r   r	  s                 rB   set_capabilitieszProtocol.set_capabilitiesa  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   )rA   r  r  r  r   s        rB   send_auth_startzProtocol.send_auth_start  sX     89!K (C'&6C"#""NO	
rD   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     rB   read_auth_continuezProtocol.read_auth_continue  sn     ll'')hh//,,++-C hh//88<< P  ;rD   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  )rA   r  r   s      rB   send_auth_continuezProtocol.send_auth_continue  s/     ;yQ""QR	
rD   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     rB   read_auth_okzProtocol.read_auth_ok  sI     ,,++-Cxx::xx>)$SWW-- rD   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_deletert   r   r   r   r   r   r/  r   r   r  r   r   )rA   r   r   r   _r*  placeholdermsg_limit_expr
oneof_typeoneof_op	msg_oneofmsg_preparer	  s                rB   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   r0  r   get_limit_row_countr   get_limit_offsetr   r   )	rA   r   r   r   r7  r8  r9  msg_executer   s	            rB   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	
rD   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  )rA   r/  msg_deallocs      rB   send_prepare_deallocatez Protocol.send_prepare_deallocate>  sB     9:!(I""IJ	
 	rD   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)r0  r   r>  r   r?  r   r   send_msg)rA   r   r   r   	msg_limitr   r   s          rB   send_msg_without_pszProtocol.send_msg_without_psO  s      >> 34I%)%=%=%?Ik"xx--&*&;&;&=	(#$CL MM	%%di%@Kt$h$rD   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   )rA   r   r   s      rB   rH  zProtocol.send_msgk  s     	""=#:C@rD   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   rQ  has_projectionget_projection_exprr   is_lock_exclusiveis_lock_sharedlock_contentionr   rA   r   rS  rT  r   s        rB   r1  zProtocol.build_findw  s    " #  " -.


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


 (ZJW $ 8 8 :C3%!!#*+TUC	N  "*+QRC	N%%)%)%9%9%?%?C!"5s::rD   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
        rM  rN  rO  rP  r(  rR  zMysqlx.Crud.UpdateOperation	operationsourcer   z&Mysqlx.ClientMessages.Type.CRUD_UPDATE)r   rX  r   rY  r   rQ  r   get_update_opsr   update_typerb  r   r   r   r   )rA   r   rS  rT  r   r4  	update_opra  s           rB   r2  zProtocol.build_update  s	   " #  " -.


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


  ZJ
 	3% //1779 	?LAy =>I%.%:%:Ik""+"2"2Ih*%/	%@	'"##Y%:%:%<$=>	? 8<<rD   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
        rM  rN  rO  rP  r)  rR  z&Mysqlx.ClientMessages.Type.CRUD_DELETE)r   rX  r   rY  r   rQ  r   r_  s        rB   r3  zProtocol.build_delete  s{    " #  " -.


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


  ZJ
 	3%7<<rD   	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)rg  r   compact_metadatar   r   r   r   r   r   r   r   rG  )r   r   r   rw   r   )rA   rg  r   rh  r   r   r   r   r   r   r   s              rB   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ArD   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
        rM  rN  rO  rP  r&  rR  _fieldsrU  zMysqlx.Crud.Insert.TypedRowfieldrow	is_upsertupsertz&Mysqlx.ClientMessages.Type.CRUD_INSERT)r   rX  r   rY  r   rQ  hasattrrm  r   parse_table_insert_fieldr   r   
get_valuesr   r   r   rp  )	r   rS  rT  r   rn  exprr   ro  vals	            rB   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<<rD   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)ru   r   rA   r   r   s      rB   close_resultzProtocol.close_resultJ  s*       (?"#ABB rD   c                     | j                  |      }|y|j                  dk(  r|S | j                  j                  |       y)z\Read row.

        Args:
            result (Result): A `Result` based type object.
        Nr   )ru   r   r   r   ry  s      rB   read_rowzProtocol.read_rowW  sC       (;88--J!!#&rD   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   catalogrQ  tableoriginal_tabler   original_namelength   	collationr   fractional_digitsflags   content_type)ru   r   r   r   r   r   getrw   )rA   r   columnsr   cols        rB   get_column_metadatazProtocol.get_column_metadatae  s    $$V,C{* ) xx11))#.$ # xx<<$%:;;FIHG$%FO$"%Q'+Q/$'C NN3/ rD   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     rB   r  zProtocol.read_ok  s[     ll'')88~% >#e*!>c&kRR88{" !ABB #rD   c                 d    t        d      }| j                  j                  t        d      |       y)zSend connection close.zMysqlx.Connection.Closez$Mysqlx.ClientMessages.Type.CON_CLOSENr  r   s     rB   send_connection_closezProtocol.send_connection_close  s*    /0""@A3	
rD   c                 d    t        d      }| j                  j                  t        d      |       y)zSend close.zMysqlx.Session.Closez%Mysqlx.ClientMessages.Type.SESS_CLOSENr  r   s     rB   
send_closezProtocol.send_close  s*    ,-""ABC	
rD   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   )rA   cond_keymsg_ocmsg_eos       rB   send_expect_openzProtocol.send_expect_open  sj     !VW78"*$) !-. ,,./v""BCV	
rD   	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   )rA   r  r   s      rB   
send_resetzProtocol.send_reset  s     ,-"%%' 	 #C""ABC	
 	 " "!	"s   "A1 1A?>A?)T)NN)r3   Nra   )BrV   rW   rX   rY   r^   r   rC   propertyr   rZ   r   staticmethodr)   r    r   r   r   r	   r&   r   r   r+   r*   r   r,   r   ru   r   r  r  r  r[   r   r"  r$  r!   r   r#   r$   r%   r'   r;  rA  r   rD  rJ  rH  r   r1  r2  r3  r.   r   rk  r   r"   rw  rz  r|  r(   r  r  r  r  r  r  r\   rD   rB   r   r   J  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,\4+ 4~ 4$ 4l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 rD   r   )DrY   rq   r=   ior   typingr   r   r   r   r   r	   	lz4.framerI   HAVE_LZ4ImportError	zstandardr:   	HAVE_ZSTDerrorsr   r   r   r   ru  r   r   r   r   r   r   helpersr   r   r   protobufr   r   r   r   r   r   r   	statementr   r   r    r!   r"   r#   r$   r%   r&   r'   typesr(   r)   r*   r+   r,   r-   r.   r/   r   r1   r^   r   r   r\   rD   rB   <module>r     s   : :    : :HI   7     	 	 	  A AHaH aHH:H :Hz@ @C	  H  Is"   C C CCCC