3
=h@                 @   sh   d dl mZ d dlmZ d dlmZ d dlmZ d dlZd dlZd Z	dZ
dZdZd	ZG d
d deZdS )    )PAGE)
FIRST_BLOB)B2UINT6)B2UINT7N            c               @   s   e Zd ZdZdd Zdd ZdEddZd	d
 ZdFddZdGddZ	dHddZ
dIddZdd ZdJddZdKddZdLd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d0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDS )MINDEXa  
	init_index INPUT:
		table:
		idxid:
		colid_list:
		null_count:
		pg:
		page_type:
		disable_extra_pages:
		decode:
		row_format:
		replace:
		complete:
		multi: # for sql
		fields_terminated: # for load data
		fields_enclosed:
		lines_terminated:

	USAGE:
	init_index: init index obj
	init_data : init data for next page
	get_sql   : return sql list # only for pk leaf
	get_data  : return data # for load data
	get_all_rows : return all rows list[dict]
	c          
      s(  |d  _ |d  _|d  _|d  _d _d _d _d _d _i  _	d|kr\|d nd	 _
d
|krr|d
 nd _d|kr|d nd	 _d|kr|d nd	 _d|kr|d nd	 _d|kr|d nd _d|kr|d nd _d|kr|d nd _ j j _ j j j d  _ j jdkr6 j j j n j _ j j j d  _ jrh j rhdnd _  jd j j  j j  j j d j j  j j  j j 7  _ jr  jddj fdd j jD  d  7  _  jd!7  _ jr j _ n j! _  jd"kr$ j" _#nJ jd#krD j$ _# j j% _n* jd$krZ j& _#n jd%krn j' _# j jd&kr j( _) jd'kr j* _+ j, _- j. _/d( _n: jd)krƈ j* _+n$ jd*kr j0 _1 j2 _3 j4 _5d+ _6d,|kr$|d, dkr$ j jd-k r$ j* _+d. _6d S )/Ntableidxidpg	page_typec   x   r   disable_extra_pagesFdecodeTreplacecompletemultifields_terminated	fields_enclosed lines_terminated

colid_listi8  
null_countzREPLACE zINSERT zINTO .(,c                s$   g | ]\}} j j|  j j qS  )r   	_enclosed).0colname
coldefault)selfr!   </root/work/ibd2sql-ibd2sql-v2.x/ibd2sql/innodb_page/index.py
<listcomp>I   s    z$INDEX.init_index.<locals>.<listcomp>)z VALUES PK_LEAFPK_NON_LEAFKEY_LEAFZKEY_NON_LEAFi8 	REDUNDANTe   ZCOMPACT
COMPRESSEDi@  POST_ANTELOPEi8 iC  )7r   r   r   r   foffsetoffset_offsetoffset_start
offset_end
rec_headerr   r   r   r   r   r   r   r   
row_formatindexr   mysql_version_idpkcolid_list_pkr   sqlprer"   schemanamejoincolumn_order_get_sql_multiget_sql_get_sql_single_read_row_pk_leaf	_read_row_read_row_pk_non_leafZpk_null_count_read_row_key_leaf_read_row_key_non_leaf_read_row_count_read_row_version_read_extra_column_with_768_read_extra_column_read_rec_header_old_read_rec_header_new_read_nullbitmask_varsize_old_read_nullbitmask_varsize_new_get_all_rows_compressedget_all_rows_read_extra_20_compressed_read_extra_20_read_trx_id_rollptr_compressed_read_trx_id_rollptroff_page_flag)r&   kwargsr!   )r&   r'   
init_index(   sp    




$B.



&zINDEX.init_indexc             C   s   || _ | j| _| j| _d S )N)datar1   r2   r3   )r&   rZ   r!   r!   r'   	init_dataq   s    zINDEX.init_dataFc             C   st   g }xj| j |D ]\}|d }d}x8| jjD ],\}}|||kr@|n
|| d  | j 7 }q*W |j|d d  qW |S )NrZ   r   r   )rR   r   r@   r   append)r&   deletedZ	data_listrZ   vr$   r%   r!   r!   r'   get_datav   s    (zINDEX.get_datac             C   s   d S )Nr!   )r&   r!   r!   r'   rB      s    zINDEX.get_sqlc             C   s   g }xv| j |D ]h}|d }d}x6| jjD ]*\}}|||kr@|n
|| d  d7 }q*W |j| j d|d d  d qW |S )NrZ   r   r    r   r   r)   r\   )rR   r   r@   r]   r<   )r&   r^   Zsql_listrZ   r_   r$   r%   r!   r!   r'   rC      s    &$zINDEX._get_sql_singlec             C   s   | j  }xn| j|D ]`}|d }d}x6| jjD ]*\}}|||krD|n
|| d  d7 }q.W |d|d d  d7 }qW |d d gS )	NrZ   r   r    r   r   z),r\   r\   )r<   rR   r   r@   )r&   r^   sqlrZ   r_   r$   r%   r!   r!   r'   rA      s    &zINDEX._get_sql_multic             C   s   g }d}|rpt jd| jdd d }|| _|| _t jd| jdd d d@ t jd| jdd d  d	 }nt jd| jdd d d	 }x\t|D ]P}| j  | jd
 dkr| j \}}|j	||| jd d | jd  | _| _qW |S )Nr   z>H,   .   *   i  6   8   r   REC_TYPEr   REC_INFO_DELETED)rZ   pageidr^   REC_NEXT)
structunpackrZ   r2   r3   rangerN   r6   rE   r]   )r&   r^   all_rowZ	row_countZdeleted_offset_rowri   r!   r!   r'   rR      s    >zINDEX.get_all_rowsc                s  g }t jd jdd d d@ }t jd jdd d }tj }|j jdd  }|jd	d
 } jd d }|t jdd
dd7 }| jd(d  7 }|t jddddddddd	7 }|d7 }|t jddddddddddddd7 }|||d  7 }t|}	||j	7 } j}
| _d _
t| _ j
 _g }x:t|D ].}t jd jdd d@ }|j|dg q:W xBt|| d D ].}t jd jdd d@ }|j|dg q~W |j } jdkr fdd t|d D  _d _d}d}xt|d D ] } j
 _|| \}}|d!|d
   d"|   _
 j
|	krt||d#krNd
nd7 }d}  j|d#krld
nd7  _|r  j
|7  _
||krq j
 _dd||dkrdnddd jd)krdnd
 j
| d%	 _ j \}}|j|| jd& d' qW |
 _|S )*Nz>Hrd   rb   r   i  re   rf   ^      r   z>BBBr   z>8Bi   n   f   m   u      z>12B   s   p   r   r.   r   i?  FTr*   c                s   g | ]} j d qS )   )_read_compressed_end)r#   x)r&   r!   r'   r(      s    z2INDEX._get_all_rows_compressed.<locals>.<listcomp>   r}   >   r,   )	REC_INFO_INSTANTREC_INFO_VERSIONrh   REC_INFO_MIN_RECREC_N_OWNEDREC_HEAP_NOrg   rj   is_compressedrh   )rZ   ri   r^   )r*   r,   )rk   rl   rZ   zlibdecompressobj
decompressfindpacklenunused_datar2   r5   r4   rm   r~   r]   sortr   trxid_rollptrZc_offsetr3   r6   rE   )r&   r^   rn   Zn_densen_recsdctoffsetrZ   Zcompressed_offsetZold_dataZpage_diriZslotjro   Zhave_compressedZhave_compressed_offsetr   r2   Z
is_deletedrp   ri   r!   )r&   r'   rQ      sv    &


zINDEX._get_all_rows_compressedc             C   s$   | j d}|dkr || j d7 }|S )Nr      )_read_compressed_start)r&   Zb1r!   r!   r'   _read_id_comprssed   s    
zINDEX._read_id_comprssedTc             C   s   g }g }d}d}d}| j d r*d}d}d}d}	xx|D ]p}
tj|| j|d }||@ rZd	nd
}|d |@ }|}||	8 }|}	| jj|
 d dkrq4|j| |j| q4W ||fS )Nz>Hr   i   	REC_SHORTz>Br      r   TFr>   	DB_TRX_IDDB_ROLL_PTR)r   r   )r6   rk   rl   read_reverser   columnr]   )r&   r   r   
compressed	null_list	size_listZsize_null_formatZsize_null_sizeZnmaskZ
lastoffsetcolidZ	size_nullZisnullvsizetr!   r!   r'   rO      s,    


z#INDEX._read_nullbitmask_varsize_oldc             C   s  g }g }d}| j d }|rB|dkr<tj| j|d d dnd}n&|dkrdtj| j|d d dnd}d}x|D ]}| jj| }	|	d }
d}|	d r|d	|> @ rd
nd}|d	7 }|rd}
n|	d rf|	d r<tjd|r| jd	n| jd	d }|t	kr6tjd|r| jd	n| jd	d |d d  }
n|}
n*|rXtjd| jd	d n| jd	d }
|j
| |j
|
 qtW ||fS )Nr   r         bigsizeFis_nullabler   TZis_varZis_bigz>Br      )r6   int
from_bytesr   r   r   r   rk   rl   REC_N_FIELDS_ONE_BYTE_MAXr]   )r&   r   r   r   r   r   Z	nullvaluenr   colr   nullZtsizer!   r!   r'   rP   
  s6    
(&

$
4*
z#INDEX._read_nullbitmask_varsize_newc             C   s   d S )Nr!   )r&   r   r   r   r!   r!   r'   $_read_nullbitmask_varsize_compressed,  s    z*INDEX._read_nullbitmask_varsize_compressedc             C   s(   | j }| jd}| jd}| j|||S )N   r   )r2   read_read_trx_id_format)r&   r2   trxidrollptrr!   r!   r'   rV   /  s    

zINDEX._read_trx_id_rollptrc             C   s&   t ||ddt||d dddS )Nr   )rZ   r2   r   r   )r   r   )r   r   )r&   r   r   r2   r!   r!   r'   r   5  s    zINDEX._read_trx_id_formatc             C   s8   | j }| jjd}|d d }|dd }| j||dS )Nr   r   r}   )r5   r   popr   )r&   r2   rZ   r   r   r!   r!   r'   rU   C  s
    z%INDEX._read_trx_id_rollptr_compressedc             C   s   d S )Nr!   )r&   r!   r!   r'   rE   J  s    zINDEX._read_rowc                s   | j  }| jj| jj| d  }| jj| d }| j||\ | j| jj fddtt| jjD fddtt| jjD }|j| j	  | j
dkr| jj| d dd  n| jj| d }|j| j|  |dfS )	Nr   r   c                s   g | ]} j d qS )r   )r   )r#   ro   )r   r!   r'   r(   S  s    z+INDEX._read_row_pk_leaf.<locals>.<listcomp>c                s   g | ]} j d qS )r   )r   )r#   ro   )r   r!   r'   r(   S  s    r-   r   r   )rJ   r   r:   ZpkmrrP   _read_fieldrm   r   updaterV   r7   )r&   Zrow_versionr   r   rp   Zthe_rest_of_fieldr!   )r   r   r'   rD   M  s    F2zINDEX._read_row_pk_leafc             C   sB   | j | jj| j\}}| j| jj||}|tjd| jdd fS )Nz>L   r   )rP   r   r:   r   r   rk   rl   r   )r&   r   r   rp   r!   r!   r'   rF   Y  s    zINDEX._read_row_pk_non_leafc             C   s4   | j | j| jj | j\}}| j| j||}|dfS )Nr   )rP   r   r   r:   r   r   )r&   r   r   rp   r!   r!   r'   rG   _  s    zINDEX._read_row_key_leafc             C   s>   | j | j| j\}}| j| j||}|tjd| jdd fS )Nz>Lr   r   )rP   r;   r   r   rk   rl   r   )r&   r   r   rp   r!   r!   r'   rH   e  s    zINDEX._read_row_key_non_leafc             C   s   i }x|D ]}| j j| }|d }|jd}|jd}	| j}
d }|	rJd}n.|| jkrn| jrdd}d}	qx| j }n
| j|}|	s| jr|d |f|d  }nd|j	  }||
|d||< q
W |S )	Nr>   r   r   Tr   args0x)rZ   zoffset:r   )
r   r   r   r2   rW   r   rL   r   r   hex)r&   r   r   r   rp   r   r   r$   r   r   r2   rZ   r!   r!   r'   r   l  s0    





zINDEX._read_fieldc             C   s.   | j d s| j d r*tjd| jdd S dS )Nr   r   z>Br   r   )r6   rk   rl   r   )r&   r!   r!   r'   rJ     s    zINDEX._read_row_versionc             C   sZ   d}| j d rVtjd| jdd }|dkrRtjd| jdd }||d d  }|}|S )Nr   r   z>Br   r   r   )r6   rk   rl   r   )r&   rdatat1t2r!   r!   r'   rI     s    
zINDEX._read_row_countc             C   s   | j d}tjd|\}}| jdd dkr0tnt}| jdkrBt}|dkrNt}|d@ dkr^d	nd
|d@ dkrpd	nd
|d@ dkrd	nd
|d@ dkrd	nd
|d@ d? |d@ d? |d@ d? |d@ dkrd	nd
||d	d| _	d S )Nr   z>LH@   B   s     r.   r   l        TFi   @i    i   i      i  ry   i  r   )r   r   rh   r   r   r   ZREC_N_FIELDSr   rg   rj   r   )
r   rk   rl   rZ   REC_STATUS_ORDINARYREC_STATUS_NODE_PTRr2   REC_STATUS_INFIMUMREC_STATUS_SUPREMUMr6   )r&   rZ   recrec_nextrg   r!   r!   r'   rM     s$    




zINDEX._read_rec_header_oldc          
   C   s   | j d}tjd|\}}}|d> | }|d@ dkr8dnd|d@ dkrJdnd|d	@ dkr\dnd|d
@ dkrndnd|d@ d? |d@ d? |d@ || j d dd	| _d S )Nr   z>HBhr   i   r   TFi  @ i    i   i      i  r   r   )	r   r   rh   r   r   r   rg   rj   r   )r   rk   rl   r3   r6   )r&   rZ   Zrec1Zrec2r   r   r!   r!   r'   rN     s    


zINDEX._read_rec_header_newc             C   s   | j d| j  S )Ni   )r   _read_extra_column_1)r&   r!   r!   r'   rK     s    z!INDEX._read_extra_column_with_768c             C   s   | j  S )N)r   )r&   r!   r!   r'   rL     s    zINDEX._read_extra_columnc             C   s   t jd| j \}}}}d}| jjdkr6t| j|}nHxF| jj|}t jd|dd \}}||dd|  7 }|dkr8P q8W |S )Nz>3LQ    i8  z>LL&   rc   l    )rk   rl   rT   r   r9   r   r   r   )r&   SPACE_IDPAGENOBLOB_HEADER	REAL_SIZErZ   Z_ndatar!   r!   r'   r     s    zINDEX._read_extra_column_1c             C   s
   | j dS )N   )r   )r&   r!   r!   r'   rT     s    zINDEX._read_extra_20c             C   s
   | j dS )Nr   )r~   )r&   r!   r!   r'   rS     s    zINDEX._read_extra_20_compressedc             C   s(   | j | j| j|  }|  j|7  _|S )N)rZ   r4   )r&   r   rZ   r!   r!   r'   r     s    zINDEX._read_compressed_startc             C   s(   | j | j| | j }|  j|8  _|S )N)rZ   r5   )r&   r   rZ   r!   r!   r'   r~     s    zINDEX._read_compressed_endN)F)F)F)F)F)T)T)T)$__name__
__module____qualname____doc__rY   r[   r`   rB   rC   rA   rR   rQ   r   rO   rP   r   rV   r   rU   rE   rD   rF   rG   rH   r   rJ   rI   rM   rN   rK   rL   r   rT   rS   r   r~   r!   r!   r!   r'   r
      sB   I







A

"

r
   )ibd2sql.innodb_page.pager   ibd2sql.innodb_page.lobr   ibd2sql.utils.b2datar   r   rk   r   r   r   r   r   r   r
   r!   r!   r!   r'   <module>   s   