3
=ÕÇh	  ã               @   s\   d dl Z d dlmZ d dlmZ d dlmZ dZdZdZ	dd	„ Z
d
d„ ZG dd„ deƒZdS )é    N)Úcrc32c)ÚGET_XDES_SIZE_COUNT)Úaes_ecb256_decryptéo   és   é   c             C   sÆ   | d@ d? dkrdnd| d@ d? > }| d@ d? dkr8|nd| d@ d? > }| d@ d? dkr\dnd	}| d@ d? | d@ d? | d
@ d? | d@ d? | d@ d? | d@ d? | d@ d? | d@ d? | d@ d? |||dœS )NiÀ  é   r   i @  i   é   r   FTé    é   i   é
   i   é   i   é   i    é   é   )ÚPOST_ANTELOPEZ	ZIP_SSIZEZATOMIC_BLOBSZ
PAGE_SSIZEZDATA_DIRÚSHAREDZ	TEMPORARYÚ
ENCRYPTIONÚSDIÚlogical_sizeÚphysical_sizeÚ
compressed© )Úflagsr   r   r   r   r   ú:/root/work/ibd2sql-ibd2sql-v2.x/ibd2sql/innodb_page/fsp.pyÚGET_FSP_STATUS_FROM_FLAGS
   s    $$








r   c       
      C   sÜ   | dd… }t jd| dd… ƒd }d}|dkr8|d7 }| ||d … jƒ }|d7 }|d| d
 t|ƒ  d }t|| ||d … ƒ}|d7 }tj|ƒ}t jd| ||d … ƒd }	|dd… |dd… ||||	||	kdœS )ze
	INPUT:
		data: encryption_data(115 bytes)
		kd: keyring file data dict
	RETURN:
		dict(key,iv...)
	Né   z>Lé   r   s   lCBé   é$   Z	INNODBKeyú-Úkeyr
   é   é0   )r!   ÚivÚmagicÚserver_uuidÚ
checksum_1Ú
checksum_2Ústatusz
INNODBKey-é@   r*   )ÚstructÚunpackÚdecodeÚstrr   r   Zcalculate_crc32c)
ÚdataÚkdr%   Zmaster_key_idÚoffsetr&   Z
master_keyZkey_infor'   r(   r   r   r   ÚPARSE_ENCRYPTION_INFO   s    
r2   c               @   s6   e Zd Zddd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚFSPr   r   c             C   s€   || _ || _|dkrt|ƒn|| _t| jƒ\| _| _| j| | _| jƒ  | jƒ  | j	ƒ  | j
ƒ  tjd|dd… ƒ\| _| _d S )Nr   z>2Lé   é   )Úcompression_ratior/   ÚlenÚ	PAGE_SIZEr   Ú	XDES_SIZEÚ
XDES_COUNTÚinit_space_headerÚ	init_xdesÚinit_encryptionÚinit_sdir+   r,   ÚFIL_PAGE_PREVÚFIL_PAGE_NEXT)Úselfr/   Ú	page_sizer6   r   r   r   Ú__init__4   s    zFSP.__init__c             C   sÂ   | j dd… }tjd|d d… ƒ\| _| _| _| _| _| _tjd|dd… ƒ| _	tjd|dd	… ƒ| _
tjd|d	d
… ƒ| _tjd|d
d… ƒ| _tjd|dd… ƒ| _tjd|dd… ƒ| _d S )Né&   ép   z>6Lr   r   z>LLHLHé   é(   é8   éH   z>QéP   é`   é–   rF   )r/   r+   r,   ÚFSP_SPACE_IDÚFSP_NOT_USEDÚFSP_SIZEÚFSP_FREE_LIMITÚFSP_SPACE_FLAGSÚFSP_FRAG_N_USEDZFSP_FREEZFSP_FREE_FRAGZFSP_FULL_FRAGZ
FSP_SEG_IDZFSP_SEG_INODES_FULLZFSP_SEG_INODES_FREE)rA   r/   r   r   r   r;   B   s    ,zFSP.init_space_headerc             C   sN   g | _ xBt| jƒD ]4}| j j| jd|| j  d|| j  | j … ƒ qW d S )NrL   )ZxdesÚranger:   Úappendr/   r9   )rA   Úir   r   r   r<   M   s    zFSP.init_xdesc             C   s@   d| j | j  }| j||t … | _| jdd kr6dnd| _d S )NrL   ó    r   FT)r:   r9   r/   ÚINFO_MAX_SIZEÚencryption_infoÚ
encryption)rA   r1   r   r   r   r=   R   s    zFSP.init_encryptionc             C   s:   d| j | j  d }tjd| j||d … ƒ\| _| _d S )NrL   r   z>LLr4   )r:   r9   r+   r,   r/   ÚSDI_VERSIONÚSDI_PAGE_NO)rA   r1   r   r   r   r>   W   s    zFSP.init_sdiN)r   r   )Ú__name__Ú
__module__Ú__qualname__rC   r;   r<   r=   r>   r   r   r   r   r3   3   s
   
r3   )r+   Úibd2sql.utilsr   Zibd2sql.innodb_page.xdesr   Zibd2sql.utils.aesr   Ú	INFO_SIZErW   rZ   r   r2   Úobjectr3   r   r   r   r   Ú<module>   s   