3
K^>                 @   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 | j|S )N)
isinstancebytesencode)valueencoding r   V/tmp/pip-unpacked-wheel-jty9dxb9/mysql_connector-2.2.9.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 | j S )N)r$   _read_message)r%   mr   r   r    read_messageN   s
    
z MessageReaderWriter.read_messagec             C   sp   | j jd}tjd|\}}| j j|d }x0tD ](}|d |kr2|d  }|j| |S q2W tdj|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   |j  }tjdt|d |}| jjdj||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 }| jjtj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 j }x<|j D ]0\}}| j|}t j||d}|jjj|g qW | jjt	j
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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 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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 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||j| }| 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 |jr,|jj| j| |jrF|j	|j
_|j|j
_|jrZ|jj|j |jrn|jj|j |jr|j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 | 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}| j	|| xR|j
D ]H}t j|j|jd}|jd k	r||jj| j|j|j  |jj|g qBW | j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	|| | j
jtjj| d S )N)rH   rj   )rk   rl   )rm   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|}|jj|g qW | j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jt||j j g q@W x||jD ]r}t jj }t|trxJ|D ]"}| j||j }|jj|g qW n| j||j }|jj|g |jj|g qlW | j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   | j |}|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   | j |}|d krd S t|tjr&|S | j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|j |jjt|j|j|j	 np|j dkrZtj
 }|j|j nP|j dkrtj }|j|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 j }t|tjr$t|jqt|tjr>| j	|| 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| j |}|d krP t|tjr4| jj| P t|tjsHtdt|j|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ry0t||j }|j rt jt jjt|dS |S    t jt jjt|dS n&t|t rt jt jjtt|dS tdjt|d S )N)r   literalzUnsupported type: {0})
MySQLxExpr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 ||jS )N)rx   r   )r%   r   r   r   r   r    r\   j  s    zProtocol.arg_object_to_scalarc             C   s8   | j 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 }| j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    
$