B
    Ñš[ø>  ã               @   sŠ  d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z
 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZmZ ddlmZ ddlmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ej'j(ej)fej'j*ej+fej'j,ej-fej'j.ej/fej'j0e
j1fej'j2ejfej'j3ej4fej'j5ej6fej'j7ej8fej'j9ej:fej'j;ej<fgZ=ddd„Z>G dd„ de?ƒZ@G dd„ de?ƒZAdS )z3Implementation of the X protocol for MySQL servers.é    Né   )Ú
mysqlx_pb2)Úmysqlx_session_pb2)Úmysqlx_sql_pb2)Úmysqlx_notice_pb2)Úmysqlx_datatypes_pb2)Úmysqlx_resultset_pb2)Úmysqlx_crud_pb2)Úmysqlx_expr_pb2)Úmysqlx_connection_pb2)ÚColumnMetaData)ÚSTRING_TYPESÚ	INT_TYPES)ÚDbDoc)ÚInterfaceErrorÚOperationalErrorÚProgrammingError)Ú
ExprParserÚbuild_null_scalarÚbuild_string_scalarÚbuild_bool_scalarÚbuild_double_scalarÚbuild_int_scalarúutf-8c             C   s   t | tƒr| S |  |¡S )N)Ú
isinstanceÚbytesÚencode)ÚvalueÚencoding© r   ú“C:\Users\HIRONO~1\AppData\Local\Temp\pip-install-ioykiiwb\mysql-connector-python-rf\mysql_connector_python_rf-2.2.2.data\purelib\mysqlx\protocol.pyÚencode_to_bytes@   s    r!   c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚMessageReaderWriterc             C   s   || _ d | _d S )N)Ú_streamÚ_msg)ÚselfZsocket_streamr   r   r    Ú__init__E   s    zMessageReaderWriter.__init__c             C   s   | j d k	rtdƒ‚|| _ d S )NzMessage push slot is full)r$   r   )r%   Úmsgr   r   r    Úpush_messageI   s    
z MessageReaderWriter.push_messagec             C   s"   | j d k	r| j }d | _ |S |  ¡ S )N)r$   Ú_read_message)r%   Úmr   r   r    Úread_messageN   s
    
z MessageReaderWriter.read_messagec             C   sp   | j  d¡}t d|¡\}}| j  |d ¡}x0tD ](}|d |kr2|d ƒ }| |¡ |S q2W td |¡ƒ‚d S )Né   z<LBr   r   zUnknown msg_type: {0})r#   ÚreadÚstructÚunpackÚ_SERVER_MESSAGESÚParseFromStringÚ
ValueErrorÚformat)r%   ÚhdrZmsg_lenZmsg_typeÚpayloadZ	msg_tupler'   r   r   r    r)   U   s    


z!MessageReaderWriter._read_messagec             C   s8   |  ¡ }t dt|ƒd |¡}| j d ||g¡¡ d S )Nz<LBr   ó    )ZSerializeToStringr.   ÚpackÚlenr#   ÚsendallÚjoin)r%   Zmsg_idr'   Zmsg_strÚheaderr   r   r    Úwrite_messageb   s    z!MessageReaderWriter.write_messageN)Ú__name__Ú
__module__Ú__qualname__r&   r(   r+   r)   r<   r   r   r   r    r"   D   s
   r"   c               @   sÌ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1S )2ÚProtocolc             C   s   || _ || _d | _d S )N)Ú_readerÚ_writerÚ_message)r%   Zreader_writerr   r   r    r&   i   s    zProtocol.__init__c             C   s$   t  ¡ }| j tjj|¡ | j ¡ S )N)	ÚMySQLxConnectionZCapabilitiesGetrB   r<   ÚMySQLxÚClientMessagesZCON_CAPABILITIES_GETrA   r+   )r%   r'   r   r   r    Úget_capabilitesn   s    zProtocol.get_capabilitesc             K   s`   t  ¡ }x<| ¡ D ]0\}}|  |¡}t j||d�}|jj |g¡ qW | j t	j
j|¡ |  ¡ S )N)Únamer   )rD   ZCapabilitiesSetÚitemsÚ_create_anyZ
CapabilityZcapabilitiesÚextendrB   r<   rE   rF   ZCON_CAPABILITIES_SETÚread_ok)r%   Úkwargsr'   Úkeyr   Z
capabilityr   r   r    Úset_capabilitiest   s    
zProtocol.set_capabilitiesc             C   s"   t j|d�}| j tjj|¡ d S )N)Z	mech_name)ÚMySQLxSessionZAuthenticateStartrB   r<   rE   rF   ZSESS_AUTHENTICATE_START)r%   Úmethodr'   r   r   r    Úsend_auth_start€   s    zProtocol.send_auth_startc             C   s$   | j  ¡ }t|tjƒstdƒ‚|jS )Nz>Unexpected message encountered during authentication handshake)rA   r+   r   rP   ÚAuthenticateContinuer   Ú	auth_data)r%   r'   r   r   r    Úread_auth_continue…   s    
zProtocol.read_auth_continuec             C   s&   t jt|ƒd�}| j tjj|¡ d S )N)rT   )rP   rS   r!   rB   r<   rE   rF   ÚSESS_AUTHENTICATE_CONTINUE)r%   Údatar'   r   r   r    Úsend_auth_continueŒ   s    zProtocol.send_auth_continuec             C   s8   x2| j  ¡ }t|tjƒrP t|tjƒrt|jƒ‚qW d S )N)	rA   r+   r   rP   ÚAuthenticateOkrE   ÚErrorr   r'   )r%   r'   r   r   r    Úread_auth_ok’   s    
zProtocol.read_auth_okc             C   sj   t |jƒ}|d g }xP|jD ]F}|d }||jkr@td |¡ƒ‚|j| }|  |d |j ¡||< qW |S )NrH   z-Unable to find placeholder for parameter: {0}r   )r8   Z_binding_mapZ	_bindingsr   r3   Úarg_object_to_scalarÚ
_doc_based)r%   Ú	statementÚcountZscalarsZbindingrH   Úposr   r   r    Úget_binding_scalarsš   s    




zProtocol.get_binding_scalarsc             C   s†   |j r|j |j¡ |jr,|j |  |¡¡ |jrF|j	|j
_|j|j
_|jrZ|j |j¡ |jrn|j |j¡ |jr‚|j |j¡ d S )N)Z
_has_whereZcriteriaÚCopyFromZ_where_exprZ_has_bindingsÚargsrK   ra   Z
_has_limitZ_limit_row_countÚlimitZ	row_countZ_limit_offsetÚoffsetZ	_has_sortÚorderZ
_sort_exprZ_has_group_byÚgroupingZ	_groupingZ_has_havingZgrouping_criteriaZ_having)r%   Úmessager^   r   r   r    Ú_apply_filter¨   s    

zProtocol._apply_filterc             C   sd   t j|jrt jnt jt j|jj|jjd�d�}|j	rB|j
 |j¡ |  ||¡ | j tjj|¡ d S )N)rH   Úschema)Ú
data_modelÚ
collection)Ú
MySQLxCrudZFindr]   ÚDOCUMENTÚTABLEÚ
CollectionÚtargetrH   rj   Z_has_projectionÚ
projectionrK   Z_projection_exprri   rB   r<   rE   rF   Z	CRUD_FIND)r%   ÚstmtÚfindr   r   r    Ú	send_find·   s    
zProtocol.send_findc             C   s¤   t j|jrt jnt jt j|jj|jjd�d�}|  	||¡ xR|j
D ]H}t j|j|jd�}|jd k	r||j |  |j|j ¡¡ |j |g¡ qBW | j tjj|¡ d S )N)rH   rj   )rk   rl   )Ú	operationÚsource)rm   ZUpdater]   rn   ro   rp   rq   rH   rj   ri   Z_update_opsZUpdateOperationZupdate_typerw   r   rb   Úarg_object_to_exprrv   rK   rB   r<   rE   rF   ZCRUD_UPDATE)r%   r^   ÚupdateZ	update_opZopexprr   r   r    Úsend_updateÂ   s    

zProtocol.send_updatec             C   sP   t j|jrt jnt jt j|jj|jjd�d�}|  	||¡ | j
 tjj|¡ d S )N)rH   rj   )rk   rl   )rm   ZDeleter]   rn   ro   rp   rq   rH   rj   ri   rB   r<   rE   rF   ZCRUD_DELETE)r%   rs   Údeleter   r   r    Úsend_deleteÓ   s    
zProtocol.send_deletec             C   sP   t j|t|ƒdd�}x$|D ]}|  |¡}|j |g¡ qW | j tj	j
|¡ d S )NF)Ú	namespacers   Zcompact_metadata)Ú	MySQLxSQLZStmtExecuter!   rJ   rc   rK   rB   r<   rE   rF   ZSQL_STMT_EXECUTE)r%   r}   rs   rc   Úargr   r   r   r    Úsend_execute_statementÜ   s    

zProtocol.send_execute_statementc             C   sø   t j|jrt jnt jt j|jj|jjd�d�}t	|dƒrdx*|j
D ] }|j t||j ƒ ¡ g¡ q@W x||jD ]r}t j ¡ }t|tƒr²xJ|D ]"}|  ||j ¡}|j |g¡ qŠW n|  ||j ¡}|j |g¡ |j |g¡ qlW | j tjj|¡ d S )N)rH   rj   )rk   rl   Ú_fields)rm   ZInsertr]   rn   ro   rp   rq   rH   rj   Úhasattrr�   rr   rK   r   Zparse_table_insert_fieldZ_valuesZTypedRowr   Úlistrx   ÚfieldÚrowrB   r<   rE   rF   ZCRUD_INSERT)r%   r^   Úinsertr„   r   r…   ÚvalÚobjr   r   r    Úsend_insertæ   s&    




zProtocol.send_insertc             C   st   t |tƒr8tjjt|ƒd�}tjd|d�}tjd|d�S t |tƒrTtjdt|ƒd�S t |t	ƒrptjdt
|ƒd�S d S )N)r   é   )ÚtypeZv_stringr   )r‹   Úscalar)r   r   ÚMySQLxDatatypesZScalarÚStringr!   ZAnyÚboolr   r   r   )r%   r   r‡   rŒ   r   r   r    rJ   þ   s    


zProtocol._create_anyc             C   s   |   |¡}|d k	rtdƒ‚d S )NzExpected to close the result)r)   r   )r%   Úrsr'   r   r   r    Úclose_result	  s    
zProtocol.close_resultc             C   s6   |   |¡}|d krd S t|tjƒr&|S | j |¡ d S )N)r)   r   ÚMySQLxResultsetÚRowrA   r(   )r%   r�   r'   r   r   r    Úread_row  s    
zProtocol.read_rowc             C   s®   |j dkr:t ¡ }| |j¡ |j t|j|j|j	ƒ¡ np|j dkrZt 
¡ }| |j¡ nP|j dkrªt ¡ }| |j¡ |jtjjkr’|jj|_n|jtjjkrª|jj|_d S )Nr   é   é   )r‹   ÚMySQLxNoticeÚWarningr1   r5   Ú	_warningsÚappendÚlevelÚcoder'   ZSessionVariableChangedZSessionStateChangedÚparamZROWS_AFFECTEDr   Zv_unsigned_intZ_rows_affectedZGENERATED_INSERT_IDZ_generated_id)r%   r'   r�   Z
warningMsgZ
sessVarMsgZsessStateMsgr   r   r    Ú_process_frame  s"    




zProtocol._process_framec             C   s€   xz| j  ¡ }t|tjƒr$t|jƒ‚qt|tjƒr>|  	||¡ qt|t
jƒrNd S t|tjƒrbd|_qt|tjƒrvd|_qP qW |S )NT)rA   r+   r   rE   rZ   r   r'   r—   ÚFramerž   r~   ÚStmtExecuteOkr’   Ú	FetchDoneÚ_closedÚFetchDoneMoreResultsetsZ_has_more_results)r%   r�   r'   r   r   r    r)   *  s    
zProtocol._read_messagec             C   s�   g }x†|   |¡}|d krP t|tjƒr4| j |¡ P t|tjƒsHtdƒ‚t|j|j	|j
|j|j|j|j|j|j|j|j|jƒ}| |¡ qW |S )NzUnexpected msg type)r)   r   r’   r“   rA   r(   r   r   r‹   Úcatalogrj   ÚtableZoriginal_tablerH   Úoriginal_nameÚlengthZ	collationZfractional_digitsÚflagsÚcontent_typerš   )r%   r�   Úcolumnsr'   Úcolr   r   r    Úget_column_metadata;  s"    
zProtocol.get_column_metadatac             C   s  |d krt jt jjtƒ d�S t|tƒr<t jt jjt|ƒd�S t|tƒr\t jt jjt|ƒd�S t|t	ƒr|t jt jjt
|ƒd�S t|tƒrÖy0t||ƒ ¡ }| ¡ r´t jt jjt|ƒd�S |S    t jt jjt|ƒd�S n&t|tƒ� rüt jt jjtt|ƒƒd�S td t|ƒ¡ƒ‚d S )N)r‹   ÚliteralzUnsupported type: {0})Ú
MySQLxExprZExprÚLITERALr   r   r�   r   r   r   Úfloatr   r   r   ÚexprZhas_identifierr   r   Ústrr   r3   r‹   )r%   r   Úallow_relationalZ
expressionr   r   r    rx   N  s4    











zProtocol.arg_object_to_exprc             C   s   |   ||¡jS )N)rx   r­   )r%   r   r³   r   r   r    r\   j  s    zProtocol.arg_object_to_scalarc             C   s8   | j  ¡ }t|tjƒr t|jƒ‚t|tjƒs4tdƒ‚d S )NzUnexpected message encountered)rA   r+   r   rE   rZ   r   r'   ÚOk)r%   r'   r   r   r    rL   m  s
    

zProtocol.read_okc             C   s   t  ¡ }| j tjj|¡ d S )N)rP   ÚCloserB   r<   rE   rF   Z
SESS_CLOSE)r%   r'   r   r   r    Ú
send_closeu  s    zProtocol.send_closeN)r=   r>   r?   r&   rG   rO   rR   rU   rX   r[   ra   ri   ru   rz   r|   r€   r‰   rJ   r‘   r”   rž   r)   r¬   rx   r\   rL   r¶   r   r   r   r    r@   h   s0   	
	r@   )r   )BÚ__doc__r.   Zprotobufr   rE   r   rP   r   r~   r   r—   r   r�   r   r’   r	   rm   r
   r®   r   rD   Úresultr   Úcompatr   r   Zdbdocr   Úerrorsr   r   r   r±   r   r   r   r   r   r   ZServerMessagesrV   rS   ZSESS_AUTHENTICATE_OKrY   ZSQL_STMT_EXECUTE_OKr    ÚERRORrZ   ZNOTICErŸ   ZRESULTSET_COLUMN_META_DATAZRESULTSET_ROWr“   ZRESULTSET_FETCH_DONEr¡   Z$RESULTSET_FETCH_DONE_MORE_RESULTSETSr£   ÚOKr´   ZCONN_CAPABILITIESZCapabilitiesr0   r!   Úobjectr"   r@   r   r   r   r    Ú<module>   sB    
$