U Yzf_ s@sdZddlZddlZddlmZddlmZmZmZm Z ddl m Z m Z ddl mZddlmZmZdd l mZmZd ZGd d d eZdS) z,Implements the MySQL Client/Server protocol N)Decimal) FieldFlag ServerCmd FieldType ClientFlag)errorsutils)get_auth_plugin)PY2 struct_unpack) DatabaseError get_exception c @seZdZdZddZddZdFd d Zd dZdGddZdHddZ dIddZ dJddZ ddZ ddZ ddZdKdd Zd!d"ZdLd$d%ZdMd&d'Zd(d)Zd*d+Zd,d-Zd.d/ZdNd0d1ZdOd2d3Zd4d5Zd6d7Zd8d9Zd:d;Zdsz1MySQLProtocol.make_conn_attrs..rr)sumr$keysvaluesr%r&r)rr9 attr_nameZconn_attrs_lenZconn_attrs_packetrr@rr5ys      zMySQLProtocol.make_conn_attrscCs"t|t|t|dS)z Make a SSL authentication packetsr int4store int2store)rr7rr8rrr make_auth_sslszMySQLProtocol.make_auth_sslcCst|}|dk r||7}|S)z(Make a MySQL packet containing a commandN)r int1store)rcommandZargumentdatarrr make_commands zMySQLProtocol.make_commandrcCst|t|S)z0Make a MySQL packet with Fetch Statement command)r rG)r statement_idrowsrrrmake_stmt_fetchszMySQLProtocol.make_stmt_fetchc Csz|d} |p|d}Wn6ttfk rN} ztd| W5d} ~ XYnX|sXd}z|d} Wntk r~|} YnXtdjt | dt j | } | | |||||| |7} | | ||7} | td |7} |tj@r| |dd 7} | S) z0Make a MySQL packet with the Change User commandr(r'r.Nr/rz td|dttj|dddd\}|d <td |dd \|d <}}|d <|d<}}|d |d <|d d}t||}d}|tj @r |rt d|dnd} |d| }|| d}|ddkr |dd}|tj @rjd|kr@|d  dr@d|}|d<ntj|dd\}|d<|dd|d<nd|d<|||d<||d<|S)zParse a MySQL Handshake-packetvrrrrAFsz2MySQLProtocol.parse_statistics..:rwr\z{0} ({1}:{2}).)splitrr r`intrr!) rr;Z with_headererrmsgrcpairspairZlblvalrrrparse_statistics;s*   zMySQLProtocol.parse_statisticsc Csg}d}d}d}|s||kr q|}|dr|ddg} |}|drn| |dd|}qH| |ddttd| }n>|ddkr|ddkr||}d}nd}t|dd}|dkr|dk r||n|dkr |dkr t||d7}q||fS) zRead MySQL text result Reads all or given number of rows from the socket. Returns a tuple with 2 elements: a list with all rows and the EOF packet. Nrsrfr/rur) recvrbappendr Zread_lc_string_list bytearrayjoinr{r) rsockversionrnrOeofZrowdatair;Zdatasrrrread_text_resultVs4       zMySQLProtocol.read_text_resultcCs|dtjkrd}d}nL|dtjkr0d}d}n4|dtjtjfkrNd}d}n|dtjkrdd}d}|d tj@rz|}||d t ||d |d fS) z%Parse an integer from a binary packetr@r~|dqBqB|dtjtjtjtjtj fkr| ||\}} || qB|dtj tj fkr| ||\}} || qB|dtjtjtjfkr |||\}} || qB|dtjkrL|||\}} || qBt|\}} || |qBt|S) z(Parse values from a binary result packetrrwrZcSsg|] }t|qSr)r)r>rrrrrAsz6MySQLProtocol._parse_binary_values..rNr)r$ enumeraterrrrrrrrrrFLOATrDATETIMEDATE TIMESTAMPrTIMErr rjr`tuple) rfieldsr;r7Znull_bitmap_length null_bitmaprDposrrrrr_parse_binary_valuess: $     z"MySQLProtocol._parse_binary_valuesc Csg}d}d}d}|dk rq||kr$q|} | ddkrH|| }d}n&| ddkrnd}||| dd|}|dkr|dk r||n|dkr|dkrt| |d7}q||fS)zwRead MySQL binary protocol result Reads all or given number of binary resultset rows from the socket. NrrfrurTr)rr{rrr) rrcolumnsrnr7rOrrDrr;rrrread_binary_results*     z MySQLProtocol.read_binary_resultcCs|ddkstdi}zht|ddd\}|d<t|d\}|d<t|d\}|d <|d d}t|d\}|d <Wntk rtdYnX|S) z'Parse a MySQL Binary Protocol OK packetrfrzFailed parsing Binary OK packetrTNrNrwZ num_columnsZ num_paramsrrh)rr r Zread_intrk)rr;Zok_pktrrrparse_binary_prepare_oks   z%MySQLProtocol.parse_binary_prepare_okcCsd}d}|dkrX|dkr$d}tj}q|dkr8d}tj}q|dkrLd}tj}qd }tj}nJd }|d krpd }tj}n2|d krd}tj}n|dkrd}tj}n tj}d}t||||fS)z0Prepare an integer for the MySQL binary protocolNriririrrrirQlrzi}|r|rt|t|krdtd t|D]^\} } || }d}|dkr|| dd| d>O<| ttjt|qln| |kr|| drtj }ntj }nt |t r| |\} }}| | nt |trptrD| tt||n"||}| tt||tj}nBt |tr| tt||tj }ntrt |tr||}| tt||tj}nt |tr| ttt||t||tj}nt |tr@| td |tj}nrt |tjtjfrn||\} }| | nDt |tjtjfr| |\} }| | nt!d j"|j#j$d | t|t|qlt%|t|t%|d&d d|Dtd}| D]}||7}q| D]}||7}q"|S)z6Make a MySQL packet with the Statement Execute commandrrrrZr/Zutf8mb4rNzTFailed executing prepared statement: data values does not match number of parametersrz:MySQL binary protocol can not handle '{classname}' objects) classnamecSsg|]}td|qS)B)r%r&)r>bitrrrrAsz3MySQLProtocol.make_stmt_execute..)'r$rr rrr rJrZNULLZBLOBSTRINGrrrr"r Zlc_intrZVARCHARbytesunicoderZDECIMALfloatr%r&rrrrrrrr2r! __class____name__rGr)rrNrL parametersrsZlong_data_usedr7Ziteration_countrrDtypesrrrprrrr;Za_typeZa_valuerrrmake_stmt_executes                  zMySQLProtocol.make_stmt_executecCsZ|ddkstdtj|dddd\}}|rL|dd krL|dd}|d |fS) z&Parse a MySQL AuthSwitchRequest-packetrfruz'Failed parsing AuthSwitchRequest packetrTNrrVr[rr)rr r r_r`)rr;Z plugin_namerrrparse_auth_switch_requests  z'MySQLProtocol.parse_auth_switch_requestcCs"|ddkstd|ddS)z!Parse a MySQL AuthMoreData-packetrfrz"Failed parsing AuthMoreData packetrTN)rr )rr;rrrparse_auth_more_datas  z"MySQLProtocol.parse_auth_more_data) NNNr,rr-FNN)r,rr-)N)r)NNNr,rFN)r\)T)r)r\)rr\)rrrNr)!r __module__ __qualname____doc__rr+r<r5rIrMrPrRrerlrortr{rrrrrrrrrrrrrrrrrrrrr.sb (    $0   %  !"-  \ r)rr%rdecimalr constantsrrrrr=rr Zauthenticationr Zcatch23r r r rr^objectrrrrrs