U
    4JejS                  
   @  s8  U d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
 ddlmZmZmZ dZded< d	Zd
ed< egZded< zdd	lZdd eD ZdZW n ek
r   dZY nX ddlmZmZmZ zddlmZ ddlmZm Z m!Z!m"Z" ddl#m$Z$ zddl%m&Z& e'e& W n ek
r    Y nX e'e$ e(edr>ej)Zddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 i Z7ded< e2j8j	9 D ]\Z:Z;e;e7de: < qe2j<j	9 D ]\Z:Z;e;e7de: < qe2j=j>9 D ]\Z:Z;e;e7de: < qe,j?9 D ]\Z:Z;e;e7de: < qe,j@jA9 D ]\Z:Z;e;e7d e: < q$e,jBjC9 D ]\Z:Z;e;e7d!e: < qJe,jDjE9 D ]\Z:Z;e;e7d"e: < qpe.jFj	9 D ]\Z:Z;e;e7d#e: < qe.jj	9 D ]\Z:Z;e;e7d$e: < qe/jGjHjI9 D ]\Z:Z;e;e7d%e: < qe/jGjHjJ9 D ]\Z:Z;e;e7d&e: < qe/jGjK9 D ]\Z:Z;e;e7d'e: < q2e0jLj	9 D ]\Z:Z;e;e7d(e: < qXe0jMj	9 D ]\Z:Z;e;e7d)e: < q~e1jNjO9 D ]\Z:Z;e;e7d*e: < qe1jPjQ9 D ]\Z:Z;e;e7d+e: < qe1jRjS9 D ]\Z:Z;e;e7d,e: < qe3jTjUj	9 D ]\Z:Z;e;e7d-e: < qe4jVjW9 D ]\Z:Z;e;e7d.e: < q>eX ZYe!ZeYZ[eY\e j]^e+j_j` eY\e j]^e,j_j` eY\e j]^e-j_j` eY\e j]^e.j_j` eY\e j]^e/j_j` eY\e j]^e0j_j` eY\e j]^e1j_j` eY\e j]^e2j_j` eY\e j]^e3j_j` eY\e j]^e4j_j` eY\e j]^e5j_j` eY\e j]^e6j_j` d/d eD ZdZad	ZbG d0d1 d1ZcW nV eedeefk
r Zf z0dZaed	k	refnd2Zbesed3eb efW 5 d	Zf[fX Y nX d4d5d6d7d8d9Zgd:ed;< G d<d= d=ZhG d>d? d?Zid@dAdBdCdDZjd	S )Ez?Implementation of a helper class for MySQL X Protobuf messages.    )annotations)AnyDictListOptionalTupleTypeUnion   )MessageTypeProtobufMessageCextTypeProtobufMessageType))zMysqlx.ServerMessages.Type.OKz	Mysqlx.Ok)z Mysqlx.ServerMessages.Type.ERRORzMysqlx.Error)z,Mysqlx.ServerMessages.Type.CONN_CAPABILITIESzMysqlx.Connection.Capabilities)z5Mysqlx.ServerMessages.Type.SESS_AUTHENTICATE_CONTINUEz#Mysqlx.Session.AuthenticateContinue)z/Mysqlx.ServerMessages.Type.SESS_AUTHENTICATE_OKzMysqlx.Session.AuthenticateOk)z!Mysqlx.ServerMessages.Type.NOTICEzMysqlx.Notice.Frame)z5Mysqlx.ServerMessages.Type.RESULTSET_COLUMN_META_DATAzMysqlx.Resultset.ColumnMetaData)z(Mysqlx.ServerMessages.Type.RESULTSET_ROWzMysqlx.Resultset.Row)z/Mysqlx.ServerMessages.Type.RESULTSET_FETCH_DONEzMysqlx.Resultset.FetchDone)z4Mysqlx.ServerMessages.Type.RESULTSET_FETCH_SUSPENDEDzMysqlx.Resultset.FetchSuspended)z?Mysqlx.ServerMessages.Type.RESULTSET_FETCH_DONE_MORE_RESULTSETSz(Mysqlx.Resultset.FetchDoneMoreResultsets)z.Mysqlx.ServerMessages.Type.SQL_STMT_EXECUTE_OKzMysqlx.Sql.StmtExecuteOk)z?Mysqlx.ServerMessages.Type.RESULTSET_FETCH_DONE_MORE_OUT_PARAMSz'Mysqlx.Resultset.FetchDoneMoreOutParams)z&Mysqlx.ServerMessages.Type.COMPRESSIONzMysqlx.Connection.CompressionzTuple[Tuple[str, str], ...]_SERVER_MESSAGES_TUPLESNOptional[str]PROTOBUF_VERSIONzpList[Union[Type[List[Dict[str, Any]]], Type[RepeatedCompositeContainer], Type[RepeatedCompositeFieldContainer]]]PROTOBUF_REPEATED_TYPESc                 C  s    i | ]\}}t t||qS  )int	_mysqlxpb
enum_value.0keyvalr   r   </tmp/pip-unpacked-wheel-7_167w8m/mysqlx/protobuf/__init__.py
<dictcomp>d   s     r   TF)
BYTE_TYPESNUMERIC_TYPESencode_to_bytes)protobuf)descriptor_databasedescriptor_pb2descriptor_poolmessage_factory)RepeatedCompositeFieldContainer)RepeatedCompositeContainer__version__   )mysqlx_connection_pb2mysqlx_crud_pb2mysqlx_cursor_pb2mysqlx_datatypes_pb2mysqlx_expect_pb2mysqlx_expr_pb2mysqlx_notice_pb2
mysqlx_pb2mysqlx_prepare_pb2mysqlx_resultset_pb2mysqlx_session_pb2mysqlx_sql_pb2zDict[str, int]	_MESSAGESzMysqlx.ClientMessages.Type.zMysqlx.ServerMessages.Type.zMysqlx.Error.Severity.zMysqlx.Crud.DataModel.zMysqlx.Crud.Find.RowLock.zMysqlx.Crud.Order.Direction.z'Mysqlx.Crud.UpdateOperation.UpdateType.zMysqlx.Datatypes.Scalar.Type.zMysqlx.Datatypes.Any.Type.z0Mysqlx.Expect.Open.Condition.ConditionOperation.z!Mysqlx.Expect.Open.Condition.Key.z Mysqlx.Expect.Open.CtxOperation.zMysqlx.Expr.Expr.Type.z"Mysqlx.Expr.DocumentPathItem.Type.zMysqlx.Notice.Frame.Scope.zMysqlx.Notice.Warning.Level.z,Mysqlx.Notice.SessionStateChanged.Parameter.z)Mysqlx.Prepare.Prepare.OneOfMessage.Type.z*Mysqlx.Resultset.ColumnMetaData.FieldType.c                 C  s   i | ]\}}t | |qS r   r4   r   r   r   r   r     s      c                   @  s   e Zd ZU dZe Zded< edddddZ	edd	d
ddZ
edddddZedddddZeddddddZed	dddddZdS )_mysqlxpb_purez]This class implements the methods in pure Python used by the
        _mysqlxpb C++ extension.zmessage_factory.MessageFactoryfactorystrr   namereturnc                 C  s   t jt| }| S )zCreate new Protobuf message.

            Args:
                name (str): Message type name.

            Returns:
                object: Protobuf message.
            )r6   r7   ZGetPrototype_DESCRIPTOR_POOLZFindMessageTypeByName)r:   clsr   r   r   new_message  s    
z_mysqlxpb_pure.new_messager   )enum_keyr;   c                 C  s   t |  S )zReturn enum value.

            Args:
                enum_key (str): Enum key.

            Returns:
                int: enum value.
            r5   )r?   r   r   r   r   %  s    
z_mysqlxpb_pure.enum_valuebytesmsgr;   c                 C  s   |   S )zSerialize message.

            Args:
                msg (object): Protobuf message.

            Returns:
                bytes: Serialized message bytes string.
            )ZSerializeToStringrB   r   r   r   serialize_message1  s    
z _mysqlxpb_pure.serialize_messagec                 C  s   |   S )zSerialize partial message.

            Args:
                msg (object): Protobuf message.

            Returns:
                bytes: Serialized partial message bytes string.
            )ZSerializePartialToStringrC   r   r   r   serialize_partial_message=  s    
z(_mysqlxpb_pure.serialize_partial_messagemsg_type_namepayloadr;   c                 C  s   t | }|| |S )zSerialize partial message.

            Args:
                msg_type_name (str): Message type name.
                payload (bytes): Payload.

            Returns:
                object: Message parsed from string.
            )r6   r>   ParseFromString)rG   rH   rB   r   r   r   parse_messageI  s    

z_mysqlxpb_pure.parse_messagemsg_typerH   r;   c                 C  s4   t | }|std|  t|}|| |S )zParse server message message.

            Args:
                msg_type (int): Message type.
                payload (bytes): Payload.

            Returns:
                object: Server message parsed from string.
            zUnknown msg_type: )SERVER_MESSAGESget
ValueErrorr6   r>   rI   )rL   rH   rG   rB   r   r   r   parse_server_messageX  s    


z#_mysqlxpb_pure.parse_server_messageN)__name__
__module____qualname____doc__r#   ZMessageFactoryr7   __annotations__staticmethodr>   r   rD   rE   rJ   rP   r   r   r   r   r6     s   
r6   zProtobuf >=3.11.0 is requiredProtobuf is not available: )z-Mysqlx.Prepare.Prepare.OneOfMessage.Type.FINDfind)z/Mysqlx.Prepare.Prepare.OneOfMessage.Type.INSERTinsert)z/Mysqlx.Prepare.Prepare.OneOfMessage.Type.UPDATEupdate)z/Mysqlx.Prepare.Prepare.OneOfMessage.Type.DELETEdelete)z-Mysqlx.Prepare.Prepare.OneOfMessage.Type.STMTZstmt_execute)z$Mysqlx.ClientMessages.Type.CRUD_FINDz&Mysqlx.ClientMessages.Type.CRUD_INSERTz&Mysqlx.ClientMessages.Type.CRUD_UPDATEz&Mysqlx.ClientMessages.Type.CRUD_DELETEz+Mysqlx.ClientMessages.Type.SQL_STMT_EXECUTEzDict[str, Tuple[str, str]]CRUD_PREPARE_MAPPINGc                   @  s@   e Zd ZU dZereneZe Zde	d< e
dddddZdS )	ProtobufzProtobuf class acts as a container of the Protobuf message class.

    It allows the switch between the C extension and pure Python implementation
    message handlers, by patching the `mysqlxpb` class attribute.
    booluse_pureNone)r_   r;   c                 C  s>   | rt stdt | s&ts&td| r.tntt_| t_dS )zSets whether to use the C extension or pure Python implementation.

        Args:
            use_pure (bool): `True` to use pure Python implementation.
        rW   z-MySQL X Protobuf C extension is not availableN)	HAVE_PROTOBUFImportErrorHAVE_PROTOBUF_ERRORHAVE_MYSQLXPB_CEXTr6   r   r]   mysqlxpbr_   )r_   r   r   r   set_use_pure  s    zProtobuf.set_use_pureN)rQ   rR   rS   rT   rd   r   r6   re   r_   rU   rV   rf   r   r   r   r   r]     s
   
r]   c                   @  s4  e Zd ZdZd3ddddddZd	ddd
ddZd	ddddZd	ddd
ddZd	ddddZd4d	dddddZ	dddddZ
ddddZdddd Zddd!d"Zed	dd#d$Zed	ddd%d&d'Zed(d)dd*d+Zed)ddd,d-d.Zed	dd(d%d/d0Zed)dd(d,d1d2ZdS )5MessagezHelper class for interfacing with the MySQL X Protobuf extension.

    Args:
        msg_type_name (string): Protobuf type name.
        **kwargs: Arbitrary keyword arguments with values for the message.
    Nr   r   r`   )rG   kwargsr;   c                 K  s<   |rt j|nd | jd< | D ]\}}| || q"d S )N_msg)r]   re   r>   __dict__items__setattr__)selfrG   rh   r:   valuer   r   r   __init__  s    zMessage.__init__r8   )r:   rn   r;   c                 C  s   t jrt|tr$t| j|t| qt|ttfrBt| j|| qt|t	r`t
| j|| qt|trt
| j||  qt
| j|| n6t|trt|| j|< nt|tr| n|| j|< d S N)r]   r_   
isinstancer8   setattrri   r   r   r   listgetattrextendrg   Z	MergeFromget_messagerm   r:   rn   r   r   r   rl     s    



zMessage.__setattr__r9   c                 C  s>   zt js| j| n
t| j|W S  tk
r8   td Y nX d S rp   )r]   r_   ri   rt   KeyErrorAttributeErrorrm   r:   r   r   r   __getattr__  s
    zMessage.__getattr__c                 C  s   |  || d S rp   )rl   rw   r   r   r   __setitem__  s    zMessage.__setitem__c                 C  s
   |  |S rp   )r{   rz   r   r   r   __getitem__  s    zMessage.__getitem__)r:   defaultr;   c                 C  s*   t js| jd ||S t| jd ||S )a  Returns the value of an element of the message dictionary.

        Args:
            name (string): Key name.
            default (object): The default value if the key does not exists.

        Returns:
            object: The value of the provided key name.
        ri   )r]   r_   rj   rN   rt   )rm   r:   r~   r   r   r   rN     s    zMessage.getz3Union[ProtobufMessageType, ProtobufMessageCextType]rA   c                 C  s   || j d< dS )zdSets the message.

        Args:
            msg (dict): Dictionary representing a message.
        ri   Nrj   )rm   rB   r   r   r   set_message  s    zMessage.set_message)r;   c                 C  s
   | j d S )zReturns the dictionary representing a message containing parsed
        data.

        Returns:
            dict: The dictionary representing a message containing parsed data.
        ri   r   rm   r   r   r   rv     s    zMessage.get_messager@   c                 C  s   t j| jS )zSerializes a message to a string.

        Returns:
            str: A string representing a message containing parsed data.
        )r]   re   rD   ri   r   r   r   r   serialize_to_string  s    zMessage.serialize_to_stringc                 C  s   t j| jS )zSerializes the protocol message to a binary string.

        This method is similar to serialize_to_string but doesn't check if the
        message is initialized.

        Returns:
            str: A string representation of the partial message.
        )r]   re   rE   ri   r   r   r   r   serialize_partial_to_string  s    	z#Message.serialize_partial_to_stringc                 C  s   t js| jd S | jjjS )zstring: Message type name.Z_mysqlxpb_type_name)r]   r_   ri   
DESCRIPTORZ	full_namer   r   r   r   type  s    zMessage.typerF   c                 C  s   t j| |S )a>  Creates a new message, initialized with parsed data.

        Args:
            msg_type_name (string): Message type name.
            payload (string): Serialized message data.

        Returns:
            dict: The dictionary representing a message containing parsed data.

        .. versionadded:: 8.0.21
        )r]   re   rJ   )rG   rH   r   r   r   parse  s    zMessage.parser   r   c                 C  s   t jr|  S tt|  S )zReturns the size of the message in bytes.

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

        Returns:
            int: Size of the message in bytes.

        .. versionadded:: 8.0.21
        )r]   r_   ZByteSizelenr   r   rC   r   r   r   	byte_size&  s    
zMessage.byte_sizerK   c                 C  s   t j| |S )a  Creates a new server-side message, initialized with parsed data.

        Args:
            msg_type (int): Message type.
            payload (string): Serialized message data.

        Returns:
            dict: The dictionary representing a message containing parsed data.
        )r]   re   rP   )rL   rH   r   r   r   parse_from_server8  s    zMessage.parse_from_serverc                 C  s   |  }| tj|| |S )a  Creates a new message, initialized with parsed data and returns a
        :class:`mysqlx.protobuf.Message` object.

        Args:
            msg_type_name (string): Message type name.
            payload (string): Serialized message data.

        Returns:
            mysqlx.protobuf.Message: The Message representing a message
                                     containing parsed data.
        )r   r]   re   rJ   )r=   rG   rH   rB   r   r   r   from_messageG  s    zMessage.from_messagec                 C  s   |  }| tj|| |S )a  Creates a new server-side message, initialized with parsed data and
        returns a :class:`mysqlx.protobuf.Message` object.

        Args:
            msg_type (int): Message type.
            payload (string): Serialized message data.

        Returns:
            mysqlx.protobuf.Message: The Message representing a message
                                     containing parsed data.
        )r   r]   re   rP   )r=   rL   rH   rB   r   r   r   from_server_messageX  s    zMessage.from_server_message)N)N)rQ   rR   rS   rT   ro   rl   r{   r|   r}   rN   r   rv   r   r   propertyr   rV   r   r   r   classmethodr   r   r   r   r   r   rg     s.   	
	rg   r8   r   r9   c                 C  s   t j| S )zReturns the value of a MySQL X Protobuf enumerator.

    Args:
        name (string): MySQL X Protobuf numerator name.

    Returns:
        int: Value of the enumerator.
    )r]   re   r   )r:   r   r   r   mysqlxpb_enumj  s    	r   )krT   
__future__r   typingr   r   r   r   r   r   r	   typesr   r   r   r   rU   r   rs   r   r   rM   rd   rb   Zhelpersr   r   r   Zgoogler   Zgoogle.protobufr    r!   r"   r#   Z#google.protobuf.internal.containersr$   Zgoogle.protobuf.pyext._messager%   appendhasattrr&    r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   ZClientMessagesrk   r   r   ZServerMessagesErrorZSeverityZ	DataModelZFindZRowLockZOrderZ	DirectionZUpdateOperationZ
UpdateTypeZScalarZOpen	ConditionZConditionOperationZKeyZCtxOperationZExprZDocumentPathItemZFrameZScopeWarningZLevelZSessionStateChanged	ParameterZPrepareZOneOfMessageZColumnMetaDataZ	FieldTypeZDescriptorDatabaseZ_DESCRIPTOR_DBZDescriptorPoolr<   ZAddZFileDescriptorProtoZ
FromStringr   Zserialized_pbra   rc   r6   SyntaxError	TypeErrorerrr\   r]   rg   r   r   r   r   r   <module>   s,  $/


8
Z" H