HEX
Server: Microsoft-IIS/10.0
System: Windows NT ITPWINWEBSVR22 10.0 build 20348 (Windows Server 2022) AMD64
User: www.conferencesearch.co.uk (0)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: D:/Python311/Lib/site-packages/mysqlx/__pycache__/protocol.cpython-311.pyc
�

�nc՜��~�dZddlZddlZddlZddlmZ	ddlZdZn
#e	$rdZYnwxYw	ddl
ZdZn
#e	$rdZYnwxYwddl
mZmZmZmZddlmZmZmZmZmZmZdd	lmZmZdd
lmZmZmZm Z m!Z!ddl"m#Z#dZ$ej%d
��Z&Gd�d��Z'Gd�d��Z(Gd�d��Z)Gd�d��Z*dS)z3Implementation of the X protocol for MySQL servers.�N)�BytesIOTF�)�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)�CRUD_PREPARE_MAPPING�PROTOBUF_REPEATED_TYPES�SERVER_MESSAGES�Message�
mysqlxpb_enum)�Columni��mysqlxc�$�eZdZdZd�Zd�Zd�ZdS)�
Compressorz�Implements compression/decompression using `zstd_stream`, `lz4_message`
    and `deflate_stream` algorithms.

    Args:
        algorithm (str): Compression algorithm.

    .. versionadded:: 8.0.21

    c��||_|dkr2tj��|_tj��|_dS|dkr2t
j��|_t
j��|_dSd|_d|_dS)N�zstd_stream�deflate_stream)	�
_algorithm�zstd�ZstdCompressor�_compressobj�ZstdDecompressor�_decompressobj�zlib�compressobj�
decompressobj��self�	algorithms  �1D:\Python311\Lib\site-packages\mysqlx/protocol.py�__init__zCompressor.__init__Zs���#����
�%�	'� $� 3� 5� 5�D��"&�"7�"9�"9�D����
�*�
*�	'� $� 0� 2� 2�D��"&�"4�"6�"6�D���� $�D��"&�D����c���|jdkr|j�|��S|jdkr{tj���5}|���}||�|��z
}||���z
}ddd��n#1swxYwY|S|j�|��}||j�tj	��z
}|S)z�Compresses data and returns it.

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

        Returns:
            bytes: Compressed data.
        r�lz4_messageN)
rr �compress�lz4�frame�LZ4FrameCompressor�begin�flushr#�Z_SYNC_FLUSH)r'�data�
compressor�
compresseds    r)r.zCompressor.compressfs"���?�m�+�	4��$�-�-�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�AB�B#�&B#c��|jdkr|j�|��S|jdkrMtj���5}|�|��}ddd��n#1swxYwY|S|j�|��}||j�tj��z
}|S)z�Decompresses 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.
        rr-N)	rr"�
decompressr/r0�LZ4FrameDecompressorr3r#r4)r'r5�decompressor�decompresseds    r)r9zCompressor.decompress}s����?�m�+�	8��&�1�1�$�7�7�7��?�m�+�	 ���/�/�1�1�
=�\�+�6�6�t�<�<��
=�
=�
=�
=�
=�
=�
=�
=�
=�
=�
=����
=�
=�
=�
=����*�5�5�d�;�;����+�1�1�$�2C�D�D�D���s�A1�1A5�8A5N)�__name__�
__module__�__qualname__�__doc__r*r.r9�r+r)rrOsK��������
'�
'�
'����.����r+rc�0�eZdZdZd�Zd�Zd�Zd�Zd�ZdS)�
MessageReaderz�Implements a Message Reader.

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

    .. versionadded:: 8.0.21
    c�>�||_d|_d|_g|_dS�N)�_stream�_compressor�_msg�
_msg_queue�r'�
socket_streams  r)r*zMessageReader.__init__�s#��$��������	�����r+c�t�|jr|j�d��Stjd|j�d����\}}|dkrt
d���|j�|dz
��}|tvrtd|�����|dkr|d	kr|�	��Stj||��}|d
kr�|d}t|j
�|d����}d}||kr~tjd|�d����\}}	|�|dz
��}
|j�tj|	|
����||d
zz
}||k�~|jr|j�d��ndS|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 mismatchrzUnknown message type: �r+��uncompressed_size�payload�N)rI�pop�struct�unpackrF�readrr�
ValueError�
_read_messager�from_server_messagerrGr9�append)r'�
frame_size�
frame_type�
frame_payload�	frame_msgrR�stream�bytes_processed�payload_size�msg_typerSs           r)rZzMessageReader._read_message�s����?�	*��?�&�&�q�)�)�)�!'��u�d�l�6G�6G��6J�6J�!K�!K��
�J����	�"�$���
���)�)�*�q�.�9�9�
��_�,�	D��B�j�B�B�C�C�C����	(�
�� 4�	(��%�%�'�'�'��/�
�M�J�J�	����		G� )�*=� >���T�-�8�8��9�9M�N�N�O�O�F��O�!�$5�5�
4�)/��u�f�k�k�!�n�n�)M�)M�&��h� �+�+�l�Q�&6�7�7����&�&�w�'B�8�W�'U�'U�V�V�V��<�!�#3�3��	"�$5�5�
4�
.2�_�F�4�?�&�&�q�)�)�)�$�F��r+c�X�|j�|j}d|_|S|���S)zgRead message.

        Returns:
            mysqlx.protobuf.Message: MySQL X Protobuf Message.
        N)rHrZ�r'�msgs  r)�read_messagezMessageReader.read_message�s3���9�	��)�C��D�I��J��!�!�#�#�#r+c�@�|j�td���||_dS)z�Push message.

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

        Raises:
            :class:`mysqlx.OperationalError`: If message push slot is full.
        NzMessage push slot is full)rHrrfs  r)�push_messagezMessageReader.push_message�s)���9�	@�"�#>�?�?�?���	�	�	r+c�6�|rt|��nd|_dS)z�Creates a :class:`mysqlx.protocol.Compressor` object based on the
        compression algorithm.

        Args:
            algorithm (str): Compression algorithm.

        .. versionadded:: 8.0.21

        N�rrGr&s  r)�set_compressionzMessageReader.set_compression�s$��5>�G�:�i�0�0�0�4����r+N)	r=r>r?r@r*rZrhrjrmrAr+r)rCrC�so�����������-�-�-�^
$�
$�
$����
H�
H�
H�
H�
Hr+rCc�$�eZdZdZd�Zd�Zd�ZdS)�
MessageWriterz�Implements a Message Writer.

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

    .. versionadded:: 8.0.21

    c�"�||_d|_dSrE)rFrGrJs  r)r*zMessageWriter.__init__s��$�������r+c���|�|��}|j�rh|tk�r\t|�����}tjd|dz|��}|j�d�||g����}td��}||d<|dz|d<td��}||d<d�t|�
����d	d
�t|�
����g��}	td��}
tjdt|	��dz|
��}|j
�d�||	g����d	St|�����}tjd|dz|��}|j
�d�||g����d	S)z�Write message.

        Args:
            msg_type (int): The message type.
            msg (mysqlx.protobuf.Message): MySQL X Protobuf Message.
        rMrr+zMysqlx.Connection.Compression�client_messagesrNrRrSN���z&Mysqlx.ClientMessages.Type.COMPRESSION)�	byte_sizerG�_COMPRESSION_THRESHOLDr�serialize_to_stringrV�packr.�joinr�serialize_partial_to_stringr�lenrF�sendall)r'rdrg�msg_size�msg_str�headerr7�msg_first_fields�msg_payload�output�msg_comp_ids           r)�
write_messagezMessageWriter.write_messages����=�=��%�%����	>��+A� A�	>�%�c�&=�&=�&?�&?�@�@�G��[���1��h�?�?�F��)�2�2�3�8�8�V�W�<M�3N�3N�O�O�J�&�'F�G�G��2:��.�/�4<�q�L��0�1�!�"A�B�B�K�%/�K�	�"��X�X�#�$4�$P�$P�$R�$R�S�S�����$�K�$K�$K�$M�$M�N�N�	���F�(�(P�Q�Q�K��[���F���a���E�E�F��L� � ����6�6�*:�!;�!;�<�<�<�<�<�%�c�&=�&=�&?�&?�@�@�G��[���1��h�?�?�F��L� � ����6�7�*;�!<�!<�=�=�=�=�=r+c�6�|rt|��nd|_dS)z�Creates a :class:`mysqlx.protocol.Compressor` object based on the
        compression algorithm.

        Args:
            algorithm (str): Compression algorithm.
        Nrlr&s  r)rmzMessageWriter.set_compression*s$��5>�G�:�i�0�0�0�4����r+N)r=r>r?r@r*r�rmrAr+r)roro�sQ�������� � � �#>�#>�#>�JH�H�H�H�Hr+roc�
�eZdZdZd�Zed���Zed���Zd�Z	d$d�Z
d�Zd	�Zd
�Z
d�Zd�Zd%d�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd&d�Zed���Zd�Zd�Zd�Z d�Z!d �Z"d!�Z#d"�Z$d&d#�Z%d
S)'�Protocolz�Implements 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|_dSrE)�_reader�_writer�_compression_algorithm�	_warnings)r'�reader�writers   r)r*zProtocol.__init__>s#��������&*��#�����r+c��|jS)zstr: The compresion algorithm.)r�)r's r)�compression_algorithmzProtocol.compression_algorithmDs
���*�*r+c�R�|jr|���|d<|jr-|d�|�����|jr-|d�|�����|jr|���|d<dSdS)z�Apply 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)rg�stmts  r)�
_apply_filterzProtocol._apply_filterIs����>�	4�"�1�1�3�3�C�
�O��=�	6���L���� 2� 2� 4� 4�5�5�5���	8��
�O�"�"�4�#4�#4�#6�#6�7�7�7��?�	9�'+���'8�'8�C�#�$�$�$�	9�	9r+c	�:�t|t��r5td|���}tdd|���}tdd|���St|t��rtddt	|�����St|t
��rD|d	krtddt
|�����Stddt|�����St|t��rst|��d
kr`|\}}td||�
|�����}td
|���g���}tdd
|���St|t��s7t|ttf��r�t|d	t��r�g}|D]�}	g}
|	���D]Q\}}td||�
|�����}|
�|������Rtd
|
���}tdd
|���}
|�|
�������td��}||d<tdd|���St|t��r{g}
|D]Q\}}td||�
|�����}|
�|������Rtd
|
���}tdd
|���}
|
SdS)z�Create any.

        Args:
            arg (object): Arbitrary object.

        Returns:
            mysqlx.protobuf.Message: MySQL X Protobuf Message.
        zMysqlx.Datatypes.Scalar.String)�valuezMysqlx.Datatypes.Scalar�)�type�v_string�Mysqlx.Datatypes.Anyr)r��scalarr��#Mysqlx.Datatypes.Object.ObjectField��keyr��Mysqlx.Datatypes.Object��fld�r��objzMysqlx.Datatypes.Arrayr��)r��arrayN)�
isinstance�strr�boolr
�intrr�tuplerz�_create_any�get_message�dict�list�itemsr\)r'�argr�r��arg_key�	arg_value�obj_fldr��array_valuesr��obj_fldsr��msg_obj�msg_anyrgs               r)r�zProtocol._create_anyZs}���c�3���	J��<�C�H�H�H�E��6�Q��O�O�O�F��1��&�I�I�I�I��c�4� � �	��&�Q�7H��7M�7M����
��c�3���	��Q�w�
��*��+�C�0�0�����
�&��0��5�5����
�
�c�5�!�!�	D�c�#�h�h�!�m�	D�!$��G�Y��5���&�&�y�1�1����G�
�3�'�:M�:M�:O�:O�9P�Q�Q�Q�C��1��s�C�C�C�C��c�4� � �	F��s�T�5�M�*�*�	F�/9�#�a�&�$�/G�/G�	F��L��
;�
;����"'�+�+�-�-�;�;�J�C��%�=��"�.�.�u�5�5����G�
�O�O�G�$7�$7�$9�$9�:�:�:�:�!�";��J�J�J��!�"8�q�g�N�N�N���#�#�G�$7�$7�$9�$9�:�:�:�:��2�3�3�C�'�C��L��1���E�E�E�E��c�4� � �	��H�!�
7�
7�
��U�!�9���*�*�5�1�1�����
���� 3� 3� 5� 5�6�6�6�6��7�X�F�F�F�G��4�1�'�J�J�J�G��N��tr+Tc����
���fd��
|���}|���}|��
fd�|D��St|��}|dgz}|t|��krtd���|���D]1\}}||vrtd|�����||}	�
|��||	<�2|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|�����S��|�����SrE)r
r�r�)r��	is_scalarr's ��r)�build_valuez/Protocol._get_binding_args.<locals>.build_value�sE����
9�#�E�*�*�6�6�8�8�8��#�#�E�*�*�6�6�8�8�8r+Nc�&��g|]
}�|����SrArA)�.0r�r�s  �r)�
<listcomp>z.Protocol._get_binding_args.<locals>.<listcomp>�s#���=�=�=�5�K�K��&�&�=�=�=r+z;The number of bind parameters and placeholders do not matchz*Unable to find placeholder for parameter: )�get_bindings�get_binding_maprzrr�)r'r�r��bindings�binding_map�count�args�namer��posr�s` `       @r)�_get_binding_argszProtocol._get_binding_args�s�����	9�	9�	9�	9�	9�	9�
�$�$�&�&���*�*�,�,���	>�=�=�=�=�H�=�=�=�=��K� � ����v�~���C��M�M�!�	�"�M���
�$�>�>�+�+�	+�	+�K�D�%��;�&�
�&�G��G�G�����d�#�C�#��E�*�*�D��I�I��r+c���|ddkr�tjd|d��}|j�|j��t
�d|j|j��|�|j	|j|j��dS|ddkrtjd|d��dS|ddk�rtjd	|d��}|d
td��kr'|�d�|d
D����dSt|d
tt����r|d
dn|d
}|d
td��kr%|�t!|d����dS|d
td��kr'|�t!|d����dSdSdS)z�Process frame.

        Args:
            msg (mysqlx.protobuf.Message): A MySQL X Protobuf Message.
            result (Result): A `Result` based type object.
        r�rzMysqlx.Notice.WarningrSz: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}tt|d��d�������3S)�v_octetsr�)r�decode)r�r�s  r)r�z+Protocol._process_frame.<locals>.<listcomp>�sL�����"�)�,�U�J�?�?���� �&�(�(���r+r�rz9Mysqlx.Notice.SessionStateChanged.Parameter.ROWS_AFFECTED�v_unsigned_intz?Mysqlx.Notice.SessionStateChanged.Parameter.GENERATED_INSERT_IDN)r�from_messager�r\rg�_LOGGER�warning�code�append_warning�levelr�set_generated_idsr�r�r�set_rows_affectedr�set_generated_insert_id)r'rg�result�warn_msg�sess_state_msg�sess_state_values      r)�_process_framezProtocol._process_frame�sX���v�;�!��-	��+�,C�S��^�T�T�H��N�!�!�(�,�/�/�/��O�O�L��
���
�
�
�

�!�!�(�.�(�-���N�N�N�N�N�
��[�A�
�$	�� �!G��Y��X�X�X�X�X�
��[�A�
�"	�$�1�3�S��^���N��g�&�-�T�+�+��
��(�(���&4�G�%<�	��������"�&�w�/��7N�1O�1O���1�N�7�+�A�.�.�(��0�!�"�'�*�m�O�/�/����,�,�(�)9�;K�L�L������$�G�,�
�U�1�1����2�2�(�)9�;K�L�L������A"	�"	�:�r+c��		|j���}nO#t$rB}t|�����}|rt|�d|����|�Yd}~nd}~wwxYw|jdkrt
|d|d���|jdkr/	|�||��n�#ttf$rY��wxYw|jdkrdS|jd	kr|�
d��nC|jd
kr|�d��n"|jdkr|�d��nn��>|S)z`Read message.

        Args:
            result (Result): A `Result` based type object.
        Tz	 reason: N�Mysqlx.Errorrgr��Mysqlx.Notice.FramezMysqlx.Sql.StmtExecuteOkzMysqlx.Resultset.FetchDonez(Mysqlx.Resultset.FetchDoneMoreResultsets�Mysqlx.Resultset.Row)
r�rh�RuntimeError�repr�get_warningsr�rr��AttributeError�KeyError�
set_closed�set_has_more_results�set_has_data)r'r�rg�err�warningss     r)rZzProtocol._read_messages���	�
M��l�/�/�1�1�����
M�
M�
M��� 3� 3� 5� 5�6�6���M�&�#�'B�'B��'B�'B�C�C��L�M�M�M�M�M�����
M�����x�>�)�
@�&�s�5�z�3�v�;�?�?�?��x�0�0�
���'�'��V�4�4�4�4��&��1�����H�������7�7�

��t���9�9�
��!�!�$�'�'�'�'���G�G�
��+�+�D�1�1�1�1���3�3�
��#�#�D�)�)�)���1	�2�
s&��
A)�8A$�$A)�B6�6C
�	C
c�|�||_|j�|��|j�|��dS)z�Sets 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�rmr�r&s  r)rmzProtocol.set_compression%s>��'0��#���$�$�Y�/�/�/���$�$�Y�/�/�/�/�/r+c�R�td��}|j�td��|��|j���}|jdkr$|j���}|jdk�$|jdkrt|d|d���|S)zkGet capabilities.

        Returns:
            mysqlx.protobuf.Message: MySQL X Protobuf Message.
        z!Mysqlx.Connection.CapabilitiesGetz/Mysqlx.ClientMessages.Type.CON_CAPABILITIES_GETr�r�rgr�)rr�r�rr�rhr�rrfs  r)�get_capabiliteszProtocol.get_capabilites3s����9�:�:����"�"��K�L�L��	
�	
�	
��l�'�'�)�)���h�/�/�	.��,�+�+�-�-�C��h�/�/�	.��8�~�%�	<�"�3�u�:�s�6�{�;�;�;��
r+c
�V�|sdStd��}|���D�]\}}td��}||d<t|t��r�|}g}|D]T}td||�||�����}	|�|	������Utd|���}
td	d
|
���}|���|d<n|�|��|d<|d
�|���g����
td��}||d
<|j�	td��|��	|���S#t$r}
|
j
dkr�Yd}
~
nd}
~
wwxYwdS)z�Set capabilities.

        Args:
            **kwargs: Arbitrary keyword arguments.

        Returns:
            mysqlx.protobuf.Message: MySQL X Protobuf Message.
        NzMysqlx.Connection.CapabilitieszMysqlx.Connection.Capabilityr�r�r�r�r�r�r�r�r��capabilitiesz!Mysqlx.Connection.CapabilitiesSetz/Mysqlx.ClientMessages.Type.CON_CAPABILITIES_SETi�)rr�r�r�r�r\r�r�r�r�r�read_okr�errno)r'�kwargsr�r�r��
capabilityr�r��itemr�r�r�rgr�s              r)�set_capabilitieszProtocol.set_capabilitiesGs����	��4��?�@�@�� �,�,�.�.�	L�	L�J�C�� �!?�@�@�J�!$�J�v���%��&�&�
>�����!�;�;�D�%�=� �"�.�.�u�T�{�;�;����G�
�O�O�G�$7�$7�$9�$9�:�:�:�:�!�";��J�J�J��!�"8�q�g�N�N�N��&-�&9�&9�&;�&;�
�7�#�#�&*�&6�&6�u�&=�&=�
�7�#���(�/�/��1G�1G�1I�1I�0J�K�K�K�K��9�:�:��*��N����"�"��K�L�L��	
�	
�	
�
	��<�<�>�>�!���	�	�	��y�D� �
��
�
�
�
�
�����	����
�ts�2F�
F&�F!�!F&Nc��td��}||d<|�||d<|�||d<|j�td��|��dS)z�Send 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�rr�r�r)r'�methodrrrgs     r)�send_auth_startzProtocol.send_auth_startwst���8�9�9��!��K���	)�(�C����	7�&6�C�"�#���"�"��N�O�O��	
�	
�	
�	
�	
r+c���|j���}|jdkr$|j���}|jdk�$|jdkrtd���|dS)z�Read 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�rhr�rrfs  r)�read_auth_continuezProtocol.read_auth_continue�s~���l�'�'�)�)���h�/�/�	.��,�+�+�-�-�C��h�/�/�	.��8�<�<�	� �P���
��;��r+c�x�td|���}|j�td��|��dS)zeSend authenticate continue.

        Args:
            auth_data (str): Authentication data.
        r	)rz5Mysqlx.ClientMessages.Type.SESS_AUTHENTICATE_CONTINUENr)r'rrgs   r)�send_auth_continuezProtocol.send_auth_continue�sJ���;�y�Q�Q�Q����"�"��Q�R�R��	
�	
�	
�	
�	
r+c��	|j���}|jdkrdS|jdkrt|j����F)z~Read authenticate OK.

        Raises:
            :class:`mysqlx.InterfaceError`: If message type is `Mysqlx.Error`.
        TzMysqlx.Session.AuthenticateOkr�N)r�rhr�rrgrfs  r)�read_auth_okzProtocol.read_auth_ok�sS��	.��,�+�+�-�-�C��x�:�:�
����x�>�)�
.�$�S�W�-�-�-�	.r+c�v�|j�r|jdkr�|jdkr|�|��\}}nZ|jdkr|�|��\}}n6|jdkr|�|��\}}ntd|�����t
|�����}td��}td��}td||�	��|d
<|jdkrtd||dz�	��|d<||d
<t|\}}	td��}
t|��|
d<||
|	<td��}|j|d<|
|d<|j�
td��|��	|���dS#t$r
}t |�d}~wwxYw)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.DeletezInvalid message type: z!Mysqlx.Expr.Expr.Type.PLACEHOLDERzMysqlx.Crud.LimitExprzMysqlx.Expr.Expr)r��position�	row_countr�offset�
limit_expr�#Mysqlx.Prepare.Prepare.OneOfMessager�zMysqlx.Prepare.Prepare�stmt_idr�z*Mysqlx.ClientMessages.Type.PREPARE_PREPAREN)�	has_limitr��
build_find�build_update�build_deleterYrzr�rrrrr�r�r�rr)
r'rdrgr��_r�placeholder�msg_limit_expr�
oneof_type�oneof_op�	msg_oneof�msg_preparer�s
             r)�send_prepare_preparezProtocol.send_prepare_prepare�s
���>�	/�c�h�*>�>�	/��x�-�-�
F�����.�.���3�3���1�1�
F��*�*�4�0�0���3�3���1�1�
F��*�*�4�0�0���3�3� �!D�(�!D�!D�E�E�E��4�,�,�.�.�/�/�H�'�(K�L�L�K�$�%<�=�=�N�*1�"��x�+�+�+�N�;�'��x�-�-�
�+2�&�[�8�a�<�,�,�,��x�(�!/�C���3�H�=��
�H��A�B�B�	�)�*�5�5�	�&��!�	�(���6�7�7��!%���I��'��F����"�"��F�G�G��	
�	
�	
�
	-��L�L�N�N�N�N�N���	-�	-�	-�#��,�����	-���s�F!�!
F8�+F3�3F8c��t|\}}td��}t|��|d<|||<td��}|j|d<|�|d���}|r|d�|��|jr�|d�|�|������	��|�|�
�����	��g��|j�td��|��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
        rr�zMysqlx.Prepare.ExecuterF�r�r�z*Mysqlx.ClientMessages.Type.PREPARE_EXECUTEN)
rrrrr�r�rr��get_limit_row_countr��get_limit_offsetr�r�)	r'rdrgr�r"r#r$�msg_executer�s	         r)�send_prepare_executezProtocol.send_prepare_execute�sC�� 4�H�=��
�H��A�B�B�	�)�*�5�5�	�&��!�	�(���6�7�7��!%���I���%�%�d�e�%�<�<���	-����&�&�t�,�,�,��>�	����&�&��$�$�T�%=�%=�%?�%?�@�@�L�L�N�N��$�$�T�%:�%:�%<�%<�=�=�I�I�K�K��
�
�
�	
��"�"��F�G�G��	
�	
�	
�	
�	
r+c��td��}||d<|j�td��|��|���dS)z�
        Send prepare deallocate statement.

        Args:
            stmt_id (int): Statement ID.

        .. versionadded:: 8.0.16
        zMysqlx.Prepare.Deallocaterz-Mysqlx.ClientMessages.Type.PREPARE_DEALLOCATEN)rr�r�rr�)r'r�msg_deallocs   r)�send_prepare_deallocatez Protocol.send_prepare_deallocatesX���9�:�:��!(��I����"�"��I�J�J��	
�	
�	
�	
�������r+c�N�|jrMtd��}|���|d<|jdkr|���|d<||d<|dk}|�||���}|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
        zMysqlx.Crud.Limitrrr�limit�+Mysqlx.ClientMessages.Type.SQL_STMT_EXECUTEr(r�N)rrr)r�r*r�r��send_msg)r'rdrgr��	msg_limitr�r�s       r)�send_msg_without_pszProtocol.send_msg_without_ps"s����>�	%�� 3�4�4�I�%)�%=�%=�%?�%?�I�k�"��x�-�-�
>�&*�&;�&;�&=�&=�	�(�#�$�C��L�� M�M�	��%�%�d�i�%�@�@���	%���K���t�$�$�$��
�
�h��$�$�$�$�$r+c�V�|j�t|��|��dS)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'rdrgs   r)r3zProtocol.send_msg9s*��	
��"�"�=��#:�#:�C�@�@�@�@�@r+c��t|���rdnd��}td|jj|jj���}td||���}|jr|���|d<|�||��|�	��rtd��|d	<n&|�
��rtd
��|d	<|jjdkr|jj|d<d
|fS)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_contentionr��r'r�r>r?rgs     r)rzProtocol.build_findEs'��#�� � �"�"�
/�,�,�.�
�
�
�
�$���!��;�#�
�
�
�
�
�(�Z�J�W�W�W����	;� $� 8� 8� :� :�C������3��%�%�%��!�!�#�#�	S�*�+T�U�U�C�	�N�N�
�
 �
 �
"�
"�	S�*�+Q�R�R�C�	�N���%��)�	@�%)�%9�%?�C�!�"�5�s�:�:r+c�&�t|���rdnd��}td|jj|jj���}td||���}|�||��|������D]t\}}td��}|j	|d<|j
|d	<|j�t|j��|d<|d�
|���g���ud|fS)
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
        r8r9r:r;rr=zMysqlx.Crud.UpdateOperation�	operation�sourceNr�z&Mysqlx.ClientMessages.Type.CRUD_UPDATE)rrCrrDr�r<r��get_update_opsr��update_typerMr�rr�r�)r'r�r>r?rgr�	update_oprLs        r)rzProtocol.build_updatems6��#�� � �"�"�
/�,�,�.�
�
�
�
�$���!��;�#�
�
�
�
�
� �Z�J�
�
�
��	
���3��%�%�%� �/�/�1�1�7�7�9�9�	?�	?�L�A�y�� =�>�>�I�%.�%:�I�k�"�"+�"2�I�h����
A�%/�	��%@�%@�	�'�"����#�#�Y�%:�%:�%<�%<�$=�>�>�>�>�7��<�<r+c���t|���rdnd��}td|jj|jj���}td||���}|�||��d|fS)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
        r8r9r:r;rr=z&Mysqlx.ClientMessages.Type.CRUD_DELETE)rrCrrDr�r<r�rJs     r)rzProtocol.build_delete�s���#�� � �"�"�
/�,�,�.�
�
�
�
�$���!��;�#�
�
�
�
�
� �Z�J�
�
�
��	
���3��%�%�%�7��<�<r+c�z�td||d���}|r�g}|���D]Q\}}td||�|�����}|�|������Rtd|���}	tdd	|	�
��}
|
���g|d<d|fS)
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
        zMysqlx.Sql.StmtExecuteF)�	namespacer��compact_metadatar�r�r�r�r�r�r�r�r2)rr�r�r\r�)r'rSr��fieldsrgr�r�r�r�r�r�s           r)�build_execute_statementz Protocol.build_execute_statement�s��� �$���"�	
�
�
���	2��H�$�l�l�n�n�
7�
7�
��U�!�9���*�*�5�1�1�����
���� 3� 3� 5� 5�6�6�6�6��7�X�F�F�F�G��4�1�'�J�J�J�G�"�.�.�0�0�1�C��K�<�c�A�Ar+c���t|���rdnd��}td|jj|jj���}td||���}t
|d��rm|jD]e}t||������	��}|d�
|���g���f|���D]�}td	��}t|t��rA|D]=}|d
�
t|�����g���>n;|d
�
t|�����g��|d�
|���g����t
|d��r|���|d
<d|fS)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
        r8r9r:r;rr=�_fieldsr@zMysqlx.Crud.Insert.TypedRow�field�row�	is_upsert�upsertz&Mysqlx.ClientMessages.Type.CRUD_INSERT)rrCrrDr�r<�hasattrrXr	�parse_table_insert_fieldr�r��
get_valuesr�r�rr[)	r�r>r?rgrY�exprr�rZ�vals	         r)�build_insertzProtocol.build_insert�s�� #�� � �"�"�
/�,�,�.�
�
�
�
�$���!��;�#�
�
�
�
�
� �Z�J�
�
�
���4��#�#�	?���
?�
?��!��t�0�0�2�2�2���*�*�,�,���L�!�(�(�$�*:�*:�*<�*<�)=�>�>�>�>��_�_�&�&�	3�	3�E��7�8�8�C��%��&�&�
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��%�%�	-� �N�N�,�,�C��M�7��<�<r+c�R�|�|��}|�td���dS)z�Close the result.

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

        Raises:
            :class:`mysqlx.OperationalError`: If message read is None.
        NzExpected to close the result)rZr�r'r�rgs   r)�close_resultzProtocol.close_results;��� � ��(�(���	C�"�#A�B�B�B�	C�	Cr+c��|�|��}|�dS|jdkr|S|j�|��dS)z\Read row.

        Args:
            result (Result): A `Result` based type object.
        Nr�)rZr�r�rjrds   r)�read_rowzProtocol.read_rowsT��� � ��(�(���	��4��8�-�-�	��J���!�!�#�&�&�&��tr+c�8�g}	|�|��}|�n�|jdkr|j�|��n�|jdkrt	d���t|d|d|d|d	|d
|d|d|�d
d��|�dd��|�dd��|�dd��|�d����}|�|����|S)z�Returns column metadata.

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

        Raises:
            :class:`mysqlx.InterfaceError`: If unexpected message.
        TNr�zMysqlx.Resultset.ColumnMetaDatazUnexpected msg typer��catalogr<�table�original_tabler��
original_name�length��	collationr�fractional_digits�flags��content_type)rZr�r�rjrr�getr\)r'r��columnsrg�cols     r)�get_column_metadatazProtocol.get_column_metadata&s+����	 ��$�$�V�,�,�C��
���x�1�1�
���)�)�#�.�.�.���x�<�<�
<�$�%:�;�;�;���F���I���H�
��G���$�%��F���O�$�����"�%�%�����Q�'�'����+�Q�/�/������$�$�����'�'�
�
�C�
�N�N�3����/	 �0�r+c���|j���}|jdkr td|d��|d����|jdkrtd���dS)	zeRead OK.

        Raises:
            :class:`mysqlx.InterfaceError`: If unexpected message.
        r�zMysqlx.Error: rgr�)r�z	Mysqlx.OkzUnexpected message encounteredNr
rfs  r)r�zProtocol.read_okJsv���l�'�'�)�)���8�~�%�	S� �!>�#�e�*�!>�!>�c�&�k�R�R�R�R��8�{�"�	C� �!A�B�B�B�	C�	Cr+c�t�td��}|j�td��|��dS)zSend connection close.zMysqlx.Connection.Closez$Mysqlx.ClientMessages.Type.CON_CLOSENrrfs  r)�send_connection_closezProtocol.send_connection_closeVsB���/�0�0����"�"��@�A�A�3�	
�	
�	
�	
�	
r+c�t�td��}|j�td��|��dS)zSend close.zMysqlx.Session.Closez%Mysqlx.ClientMessages.Type.SESS_CLOSENrrfs  r)�
send_closezProtocol.send_close]sB���,�-�-����"�"��A�B�B�C�	
�	
�	
�	
�	
r+c���td��}td��}||d<d|d<td��}|���g|d<|j�td��|��d	S)
zSend expectation.z3Mysqlx.Expect.Open.Condition.Key.EXPECT_FIELD_EXISTzMysqlx.Expect.Open.Condition�
condition_keyz6.1�condition_valuezMysqlx.Expect.Open�condz&Mysqlx.ClientMessages.Type.EXPECT_OPENN)rrr�r�r�)r'�cond_key�msg_oc�msg_eos    r)�send_expect_openzProtocol.send_expect_opends��� �!V�W�W���7�8�8��"*����$)�� �!��-�.�.�� �,�,�.�.�/��v����"�"��B�C�C�V�	
�	
�	
�	
�	
r+c�2�td��}|�>	|���|���d}n#t$rd}YnwxYw|rd|d<|j�t
d��|��|���|rdSdS)z�Send reset session message.

        Returns:
            boolean: ``True`` if the server will keep the session open,
                     otherwise ``False``.
        zMysqlx.Session.ResetNTF�	keep_openz%Mysqlx.ClientMessages.Type.SESS_RESET)rr�r�rr�r�r)r'r�rgs   r)�
send_resetzProtocol.send_resetrs����,�-�-���	"�
"��%�%�'�'�'������� �	�	��!�
"�
"�
"�!�	�	�	�
"�����	$�#�C�����"�"��A�B�B�C�	
�	
�	
�	
�������	��4��us�*>�A
�A
)T)NNrE)&r=r>r?r@r*�propertyr��staticmethodr�r�r�r�rZrmr�rrrr
rr&r,r/r5r3rrrrVrbrergrwr�rzr|r�r�rAr+r)r�r�4sR������������+�+��X�+��9�9��\�9� H�H�H�T(�(�(�(�T4�4�4�l���B0�0�0����(.�.�.�`
�
�
�
�& � � �&

�

�

�.�.�.�6-�6-�6-�p!
�!
�!
�F���"%�%�%�.
A�
A�
A�&;�&;�&;�P%=�%=�%=�N=�=�=�>#B�#B�#B�#B�J�0=�0=��\�0=�dC�C�C����"�"�"�H
C�
C�
C�
�
�
�
�
�
�
�
�
������r+r�)+r@�loggingrVr#�ior�	lz4.framer/�HAVE_LZ4�ImportError�	zstandardr�	HAVE_ZSTD�errorsrrrrr`r	r
rrr
r�helpersrr�protobufrrrrrr�rru�	getLoggerr�rrCror�rAr+r)�<module>r�s���::�9�����
�
�
�
�����������������H�H�������H�H�H�����������I�I�������I�I�I���������������������������������7�6�6�6�6�6�6�6�����������������������
�'�
�H�
%�
%��A�A�A�A�A�A�A�A�HaH�aH�aH�aH�aH�aH�aH�aH�H:H�:H�:H�:H�:H�:H�:H�:H�zW
�W
�W
�W
�W
�W
�W
�W
�W
�W
s��'�'�2�<�<