3
=h3k                 @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
T ddddd	d
dddZdIdJdKdLdMdNdOdPdQdRdSdTdUdWdYdZd[d\d^d`dbdddedfdgdhdjdldmd@ZdAdB ZdCdD ZG dEdF dFeZG dGdH dHeZdS )n    N)COLLATIONS_DICT)jsonob)*geometryZpointZ
linestringZpolygonZ
multipointZmultilinestringZmultipolygonZgeometrycollection)r                        tinyintr   r   smallintr   intr	   floatr
   double   r   	timestamp   bigint	   	mediumint
   date   time   datetime   year   varchar   bit   json   decimal   enum   set   tinyblob   
mediumblob      longblob      blob   char   )r   r   r   r	   r
   r   r   r   r   r0   r3      r    r   r"   r$   r   r                                    c             C   sX   g }xN|D ]F\}}| d||  d d|| |  d  @ || | ? }|j | q
W |S )Nr   r   )append)datanZrule1Zrdata1startcountt rK   6/root/work/ibd2sql-ibd2sql-v2.x/ibd2sql/frm/frm2sdi.pyINNODB_TIMESPLIT<   s
    4rM   c             C   sZ   t | }dt| d }tj|| }d}x,t|D ] }||| || d d > 7 }q2W |S )N>Br   r   r   )lenstrstructunpackrange)bdatarG   ZsntdatardataxrK   rK   rL   BDATA2INTBDD   s     rY   c               @   s.   e Zd Zdd Zdd Zdd Zddd	Zd
S )DATA_BUFFERc             C   s"   t || _|| _d| _| j| _d S )Nr   )rP   sizerF   offset_offset)selfrF   rK   rK   rL   __init__N   s    
zDATA_BUFFER.__init__c             C   s<   | j | | jkrdS | j| j | j |  }|  j |7  _ |S )N    )r\   r[   rF   )r^   rG   rF   rK   rK   rL   readT   s
    zDATA_BUFFER.readc             C   sR   | j |}|d krd S dd |D }d}x$t|D ]}||| |d > 7 }q2W |S )Nc             S   s   g | ]}|qS rK   rK   ).0rX   rK   rK   rL   
<listcomp>_   s    z(DATA_BUFFER.read_int.<locals>.<listcomp>r   r   )ra   rT   )r^   rG   rF   rV   rW   rX   rK   rK   rL   read_int[   s    
zDATA_BUFFER.read_intr   c             C   s
   || _ d S )N)r\   )r^   r\   actionrK   rK   rL   seeke   s    zDATA_BUFFER.seekN)r   )__name__
__module____qualname__r_   ra   rd   rf   rK   rK   rK   rL   rZ   M   s   
rZ   c               @   sl   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S )MYSQLFRMc          	   C   s   || _ t|jddkr&|jdd	 nd| _|jdd
 jdd | _t|d}|j }W d Q R X t|| _d| _	d| _
d | _d | _d | _d | _d | _d | _d | _| j  | j  | j  | j  | j  | j  | j  d S )N/r   Z	NO_DBNAMEr   z.frmr   rbF)filenamerP   splitschema
table_nameopenra   rZ   rF   pack_recordHAVE_PRIMARYFRM_TYPE
FRM_HEADERKEYSDEFAULT_VALUEENGINE_DATACOMMENTCOLUMNS_read_frm_type_read_frm_header
_read_keys_read_default_value_read_engine_data_read_comment_read_columns)r^   ro   frF   rK   rK   rL   r_   l   s,    &
zMYSQLFRM.__init__c             C   s   | j j|S )N)rF   rd   )r^   rG   rK   rK   rL   rd      s    zMYSQLFRM.read_intc             C   s   | j j|S )N)rF   ra   )r^   rG   rK   rK   rL   ra      s    zMYSQLFRM.readc             C   s8   | j jdd | jd| _| jdkr4td| j d S )Nr   r   i  u    仅支持table类型, 当前为:)rF   rf   rd   rv   
ValueError)r^   rK   rK   rL   r}      s    
zMYSQLFRM._read_frm_typec             C   s  | j jdd | jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jdd| _| jd dk rtd| jd  | jd	 d
kr>tdtjd	  | jd | jd  | jd  }|| jd  d | jd  }|| _d S )Nr   r   r   r	   )frm_versionlegacy_db_type_0io_size_1lengthtmp_key_length
rec_lengthZcreate_info_max_rowsZcreate_info_min_rows_2Zkey_info_lengthcreate_info_table_optionZ_3Zavg_row_lengthdefault_table_charsetZ_4row_typecharset_leftZstats_sample_pagesZstats_auto_recalcZ_5
key_lengthmysql_version_idZ
extra_sizeZextra_rec_buf_lengthZdefault_part_db_typekey_block_sizer   r   z"frm_version require >= 9, current:r   r3   z only support innodb. current is:r   r   r   )rF   rf   rd   rw   r   Zelfrecord_offset)r^   r   rK   rK   rL   r~      sH    zMYSQLFRM._read_frm_headerc          
   C   s  | j j| jd d | jd}|d@ rR|d@ | jdd> B }| jd}| jd}n| jd}| jd	}g }xt|D ]}d
| jd| jd| jd| jd| jdg d
d}xPt|d D ]@}|d j| jdd@ | jd| jd| jd| jdd qW |j| qtW | jd}xft|D ]Z}d}	x&| jd}
|
|krBP n|	|
7 }	q*W |	j || d< || d dkr d| _q W | jd}x.t|D ]"}| j| jdj || d< qW |||d| _	d S )Nr   r   r         r   r   r   r	    )nameflagsr   user_defined_key_parts	algorithmZ
block_size	key_partscommentr   r   i?  )fieldnrr\   key_typeZkey_part_flagr   r`   r   PRIMARYTr   )keysr   key)
rF   rf   rw   rd   rT   rE   ra   decoderu   rx   )r^   r   r   _INDEXikey_infoj
terminatorZidxnamer   rK   rK   rL   r      sV    







"zMYSQLFRM._read_keysc             C   s:   | j j| jd | jd  d t| j j| jd | _d S )Nr   r   r   r   )rF   rf   rw   rZ   ra   ry   )r^   rK   rK   rL   r      s    zMYSQLFRM._read_default_valuec             C   sr   | j j| jd | jd  | jd  d | jd}| jd}| j|j }| jd}| j|j }||d| _d S )Nr   r   r   r   r   r	   )engine_name	partition)rF   rf   rw   rd   ra   r   rz   )r^   r   Z
engine_lenr   Zpartition_lenr   rK   rK   rL   r      s    (


zMYSQLFRM._read_engine_datac             C   s   | j j| jd d | jd}|dk r8| j|j | _nF| j j| jd | jd  | jd  d d | jd	}| j|j | _d S )
N.   r   r   rD   r   r   r   r"   r   )rF   rf   r   rd   ra   r   r{   rw   )r^   Zcomment_sizerK   rK   rL   r     s    
,
zMYSQLFRM._read_commentc             C   s   | j j| jd d | jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jdg d| _d}| jd}d}d}d}xt| jd	 D ]}|| jd
 kr|d7 }d}| j jd | j jd}x|dkr| j jd}qW |d7 }n|d7 }| jdd || jd
 d   }| jd}	| j|	d d! j }
||	7 }| jd j||
dd d qW xt| jd	 D ]}| jd| jd| jdg| jd| jd| jd| jd| jd| jd| jd| jd| jdd
| jd | d< | jd | d d dks>| jd | d d dkrd| _	qW | j|d }xFt| jd	 D ]4}| j| jd | d d j | jd | d< qhW xt| jd	 D ]}| jd | d d d"krd}| jd}g }xH| jd}|dkrP n*||kr|j|j  d}qn||7 }qW || jd | d< qW | j
d d@ dkr\dnd| _| jj| jd d | j d | _xt| jd	 D ]}|| jd	 d k r| jj| jd |d  d d | jd | d d  | jd | d < n"| jj | jjd  | jd | d < qW d S )#Ni  r   r   r   r
   r   )fieldsposr   Zn_lengthZinterval_countZinterval_partsZ
int_lengthr   null_fieldscomment_lengthZgcol_screen_lengthr   fields_per_screenfield*   r   r   r       r   r   r   )ordinal_positionr   r   metadata)
r   field_lengthrecpos	pack_flagunireg_typeZcharset_lowZinterval_nr
field_typecollation_idr   r   r   r=   r   r   r   r<   r`       elementsr   r   r   r   default_binrn   )r<   r=   )rF   rf   r   rd   r|   ra   rT   r   rE   rt   rw   Znull_bit_posry   default_value_null_bitmaskr\   )r^   ZNAMESIZEr   Zscreens_readZcol_in_screenZfields_per_screen_nr   Z_terminatorr   Znamesizer   Z
_filednamerV   r   elementZedatarK   rK   rL   r     s    


 

84



"HzMYSQLFRM._read_columnsc       9   *      s  d}d}d}| j d jdr&d}d}nL| j d jdr@d}d}n2| j d jdrZd}d}n| j d jd	rrd}d
}| j d jddkrd}g }| jd d@ dkrdnd|}
x*tt| jd D 
]}| jd | }t|d d  d }|d d }	|d d }
t|d d  d }|dkr |n|	}|d d }d}d}d}d}d}d}|d d dkrr|	d }|
d? d@ }d}|d}kr|	dkr|	d }d}n |dkr|	dkr|	d }d}|dkrt|d d~krdnd}d t|d  }n0|d!krt|d d
 d }d t|d  }d}|d d d@ dksH|d d# d$krNd}n@|d d d@ dkr|d7 }| jd|> @ dkrdnd}nd}d%}d&}|dks|dkr||d( }t|}|dkrt	t
j|d+|
d@ dkrdndd,}q|d-krtjd.|d }q|d/kr*tjd0|d }q|dkrNtjd1tjt|}q|d"krht|d2 }q|d$kr$tt|d3d d4ddgdd"gd$d)gdd-gg\}}}}|dkrt|dd3 nd&}|dkrd5nd& | d5t|jd d5t|jd |dkrd6t| nd& }|}q|dkr8tt|d3d- d7ddgdd8gdd-gd!d-gd9d/gd:d/gg\}}}} }!}"|d-krt|d-d3 nd&}t
|d; }t
|d; }|dkrd5nd& | d5t|jd d5t|jd d<t| jd d=t|!jd d=t|"jd |d-kr(d6t| nd& }|}q|dkrtt|d3d d4ddgddgd>d/gdd/gg\}} }!}"|dkrt|dd3 nd&}|dkrd5nd& t| jd d=t|!jd d=t|"jd |dkrd6t| nd& }|}q|d'krPt|| }#t|}$td?d@ |#D td?d@ |$D  }%t||#|$}q|dkrn|d t| }q|d!krt|}&d}'d&}(x<|d D ]0})d|'> |&@ r|(|d |) dA 7 }(|'d7 }'qW |(d3d }n|d d dkr|dCkr|d d d@ dkrtt|}nf|dkrTttdd3 tjdD|d3d d j }&tj|&}n&t	t
j|d+|
d@ dkrpdndd,}nN|	dEkrdnd}*|d( }+t
j|+d3|* d+dd,},|+|*d3 }|d3|, j }tj |j }t|d d  d }-|d d d$kr"|dCkr"|d d d@ dkr"dF}-|d d dBkrX|dCkrX|d d d@ dkrXdG}-|d'kr| r|-dH| dA| dI7 }-n|dkr|-dHdAj!dJd@ |d D  dI7 }-n|dkr|dkr|-dH| dI7 }-nr|dk	r|-dH|	t
t"t| dK   dI7 }-nB|dk	r$|-dH|	 dI7 }-n&|dk	rJ|-|
d@ dk	rBdLnd& 7 }-|
d@ dk	rd|-j#dMdN}-d&}.|d d# dk	rdO}.d}d&}/|d d# dk	rdO}/d}|d d dBk	r|d( j j$ }|dPk	r|d
k	rt%| }-dQ}|j&|dR |t|d d  d |
dS@ 
rdnd|
d)@ 
rdnd|
d@ 
r.dnd|d d# d$k
rFdnddd|dT |	|dk
rb|n|	|||||||dd|||
rd&n||.|/|dU d&d&|dVd&d&d|-d|k
rg ndWd@ t'|d ddXD |ddY& qW t| dQd&dddg ddd&dd&dd&ddd&dd&dZ}0| j(s< d7  d[ddd/ d\}1|1j)|0 |j&|1  d7  d]ddd/ d\}1|1j)|0 |j&|1  d7  d^d*dd
 d\}1|1j)|0 |j&|1 g }2d}3| j(s|2j&d_dddd&d`ddd fdad@t D db
 xtt| j*dc D ]}| j*dc | }4|4dR d_krdnd|4dd d@  r2dkr2dn&|4dd de@ rFd)n|4dd df@ rXd-|2j&|4dR d&d| j(rv|d n|d |4dU dgdddhfdid@t'|4dj ddXD dk qW | j(rt|2d d }3|2d d j&|3d dlddt|d dm |2d d j&|3d dlddt|d dm g }5x$|2d d D ]})|5j&|)dn  q4W t|2d d }6xFtt|D ]6})|)|5krj|6d7 }6|2d d j&|6dldd|)dm qjW | j+do| jdp  dq| j, drg | jds d> | jdt  || j-t.j.j/ jdu||dhd&g d|2t.j.j/ jdud| jdv | j d | j d d|g | jdw dkr<dn| jdw | j0d&dd&| j d | j d |dkrldnddx}7|7dydz| jdv dzd{}8tj|8S )u    返回json格式的sdi信息 r   r   z PARTITION BY HASH r   r   z PARTITION BY KEY z PARTITION BY LIST r   z PARTITION BY RANGE r   z
SUBPARTITION BY r   r   r   r   r   r   r   r   zinterval_count=0Tr;   r&   Fr   r   r   r   r0   r*   r   zinterval_count=r,   r    r   r   r`   r   r(   r   r	   r   little)	byteordersignedr
   r   r   dz%Y-%m-%d %H:%M:%Sil  Nr.   -.(   r$      "   r9    :r3   c             S   s   g | ]}|d  qS )r   rK   )rb   rX   rK   rK   rL   rc     s    z*MYSQLFRM._get_sdi_json.<locals>.<listcomp>,rC   r"   z<BrD   Z	varbinaryZbinary()c             S   s   g | ]}t |qS rK   )repr)rb   itemrK   rK   rL   rc     s    ZMAXLENz	 unsignedr5   textZCURRENT_TIMESTAMPr8   ?   r   i   r   r   ztable_id=123456789c             S   s(   g | ] \}}t j|j j |d qS ))r   index)base64	b64encodeencoder   )rb   eindexZenamerK   rK   rL   rc   O  s    )rH   )&r   typeZ	type_nameis_nullableis_zerofillis_unsignedis_auto_incrementZ
is_virtualhiddenr   char_lengthbytesnumeric_precisionnumeric_scalenumeric_scale_nulldatetime_precisiondatetime_precision_nullhas_no_defaultdefault_value_nullsrs_id_nullZsrs_iddefault_valuedefault_value_utf8_nulldefault_value_utf8default_optionupdate_optionr   generation_expressionZgeneration_expression_utf8optionsse_private_dataengine_attributesecondary_engine_attributeZ
column_keycolumn_type_utf8r   r   Zis_explicit_collation)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z	DB_ROW_ID)r   r   r   r   r   Z	DB_TRX_IDZDB_ROLL_PTRr   zroot=3c          	      s8   g | ]0}|d  ddd|dk r(| d  n|d dqS )r   l    r   Tr   )r   r   orderr   
column_opxrK   )rb   r   )current_ordinal_positionrK   rL   rc     s   )
r   r   Zis_generatedr   r   r   r   r   
is_visibler   r   r   i   r   z!root=3;space_id=0;table_id=0;id=0ZInnoDBc                s8   g | ]0\}}| d kr|d nddd|d d dqS )r
   r   l    r   Fr   r   )r   r   r   r   r   rK   )rb   r   Zekey)r   rK   rL   rc     s   r   )r   r   r   r   r   r   r   r   r   enginer   l    )r   r   r   r   r   r   zkey_block_size=r   z;pack_record=z*;stats_auto_recalc=0;stats_sample_pages=0;r   r   z%Y%m%d%H%M%Sr   r   )r   r   Zcheck_constraintsr   columnsr   ZcreatedZdefault_partitioningZdefault_subpartitioningr   r   Zforeign_keysr   indexesZlast_alteredZ#last_checked_for_upgrade_version_idr   Zpartition_expressionZpartition_expression_utf8Z is_explicit_partition_expressionpartition_typeZ
partitions
row_format
schema_refr   Zse_private_idr   Zsubpartition_expressionZsubpartition_expression_utf8subpartition_typeZTablei8 )	dd_objectZdd_object_typeZ
dd_versionZmysqld_version_idZsdi_versionrn   )r   r      i @  i   )r(   r*   r,   )r   r   r	   r   r   rn   )r   rC   )r*   r,   )r   r   r   )r"   )r$   )r   r   r   r	   r   r   )r(   r,   )r*   r,   )1rz   
startswithfindrw   rT   rP   r|   COL_TYPEr   r   r   
from_bytesrR   rS   r   strftime	localtimerY   rM   rQ   zfillmap_decimalsum	B2DECIMALhexr   rU   initr%   dumpsr   r   r   joinr   replacerstripSPATIAL_DICTrE   	enumerateru   updaterx   rr   rt   r{   r   nowrq   )9r^   r   Zpartition_type2r   ZCOLUMNZnull_bitmask_addsr   Zcolr   r   r   Ztype_default_sizeZdefault_sizer   r   r   r   r   r   r   r   r   r   r   Zdatasizer   r   monthdayZjingdurW   Z
year_monthhourminutesecondp1p2psizeZ_tdataZ_snZ_sdatarX   Z	_sizesizeZ_default_valueZ_default_value_sizer   r   r   Z
syscol_optZ_tcr   ZPKCidxZ_have_columnZ_current_idxr  ddrK   )r   r   rL   _get_sdi_jsont  s   

(
*




&T
6
&^
$

2
*(22
&
&



&







 
zMYSQLFRM._get_sdi_jsonc             C   sh   | j  j }t|}tj|}t|}dd d dd  d dd  tjd|| | dd
|   }|S )u    返回page 格式的sdi信息 r   r.   s   EG   s   Hia  z>LLi @  i  i4>  )r!  r   rP   zlibcompressrR   pack)r^   sdidata
dunzip_lendzip_lenZrsdidatarK   rK   rL   get_sdi_page  s    
>zMYSQLFRM.get_sdi_pageN)rg   rh   ri   r_   rd   ra   r}   r~   r   r   r   r   r   r!  r)  rK   rK   rK   rL   rj   k   s   );a   rj   )r   r   r   )r   r   r   )r   r	   r	   )r   r	   r
   )r   r   r   )r   r	   r   )r   r   r   )r   r   r   )r   r	   r   )r   r   r   )r   r   r   )r   r   r    )r   r   r   rn   )r!   rn   r"   rm   )r#   rm   r$   )r   r	   r   )r   r   r   )r   r   r   rn   )r%   rn   r&   rn   )r'   rn   r(   rn   )r)   rn   r*   rn   )r+   rn   r,   )r-   r   r.   )r/   r0   r1   )r2   r3   r4   )r5   r   r6   rn   )r!   rn   r"   rn   )r7   rn   r"   )r   r3   r8   )rR   r   r   r%   r#  r   Zibd2sql.utils.collationsr   Zibd2sql.utils.mysql_jsonr   ibd2sql.utils.b2datar  r  rM   rY   objectrZ   rj   rK   rK   rK   rL   <module>   sb   	