3
=hE$                 @   s(   d dl Z d dlZdZG dd deZdS )    Nu@  
                                                               - -----------------
                                                              | JSON OBJECT/ARRAY |
                                                               - -----------------
                                                                      |
 -------------------------------------------------------------------------
| TYPE | ELEMENT_COUNT | KEY-ENTRY(if object) | VALUE-ENTRY | KEY | VALUE |
 -------------------------------------------------------------------------
                               |                    |          |
                               |                    |     --------------
                   --------------------------       |    | UTF8MB4 DATA |
                  | KEY-OFFSET |  KEY-LENGTH |      |     --------------
                   --------------------------       |
                                                    |
                                         --------------------------------
                                         | TYPE | OFFSET/VALUE(if small) |
                                         --------------------------------

small 2 bytes   large 4 bytes
---------------------------------------------------
TYPE          1 byte
COUNT         2/4 bytes
SIZE          2/4 bytes
VALUE         VALUE/OBJECT/ARRAY
---------------------------------------------------

---------------------------------------------------
OBJECT VALUE = KEY_ENTRY + VALUE_ENTRY + KEY + VALUE  #KEY肯定是字符串, 所以不需要记录数据类型
ARRAY  VALUE = VALUE_ENTRY + VALUE #不需要KEY

KEY_ENTRY   = KEY_OFFSET(2/4bytes) + KEY_LNGTH(2 bytes)
VALUE_ENTRY = TYPE(1byte) + OFFSET(2/4 bytes)/VALUE  (如果类型是int,literal之类的,就直接是值了, 否则就走OFFSET)
---------------------------------------------------

c               @   sx   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dZ
dd Zdd ZdddZdd Zdd ZdS )jsonobc             C   s@   || _ || _d| _| jdks&| jdkr*dnd| _d| _d| _dS )u-   
		bdata = json data
		t 类型 json类型
		r         N    )bdatatoffsetssize_type_bdata)selfr   r    r   ;/root/work/ibd2sql-ibd2sql-v2.x/ibd2sql/utils/mysql_json.py__init__C   s    zjsonob.__init__c             C   sB   g }x2t | jD ]$}| j }| jd}|j||f qW || _dS )z
		read key-entry
		r   N)rangeelement_countread_littleappend	key_entry)r   r   xZ
key_offsetZ
key_lengthr   r   r   read_key_entryP   s    
zjsonob.read_key_entryc             C   s   g }xt | jD ]}| jd}d }|dk r4| j }nd|dkrt| j }|dkrRd}q|dkr`d}q|dkrnd }qd}n$|dkr|d	kr| j|}n| j }|j||f qW || _d S )
N   r   Tr   Fr          )r   r   r   read_inline_datar   value_entry)r   r   r   r   data_datar   r   r   read_value_entry\   s(    

zjsonob.read_value_entryc             C   sF   g }x6| j D ],}|j| j|d |d |d   j  qW || _d S )Nr   r   )r   r   r   decodekey)r   r!   r   r   r   r   read_key   s    ,zjsonob.read_keyc             C   s  g }x| j D ]}|d dkr`| j|d \}}|j| j|d | |d | |  j  q|d dkr|jtjd| j|d |d d  d  q|d dkr|jtj| j|d |d d  d	 q|d dkr|jtj| j|d |d d  d	 q|d d
kr@|jtj| j|d |d d  d	 q|d dkr||jtj| j|d |d d  d	dd q|d dkr| j	}tj| j|d | |d | |  d	}| j|d |d |  }t
||d }|j|j  q|j|d  qW || _d S )Nr      r      d      r   little	   
   F)signed   )r   read_varr   r   r    structunpackint
from_bytesr	   r   initvalue)r   r3   r   _ssizesr   Z_aar   r   r   
read_value   s.    ..***.*zjsonob.read_valuec             C   s~   t j| j||d  d}d}|d@ rr|d7 }| j||d  }t j|dd dd t j|dd d d }n|}||fS )u  
		读mysql的varchar的 记录长度的大小, 范围字节数量和大小
		如果第一bit是1 就表示要使用2字节表示:
			后面1字节表示 使用有多少个128字节, 然后加上前面1字节(除了第一bit)的数据(0-127) 就是最终数据
-----------------------------------------------------
| 1 bit flag | 7 bit data | if flag, 8 bit data*128 |
-----------------------------------------------------
		r   r(   r'   r      Nr8   )r0   r1   r   )r   r   r4   r5   _tr   r   r   r-      s    	2zjsonob.read_varc             C   s   | j  | _| j  | _| jt| jkr(d S | jdks<| jdkrd| _i | _| j  | j	  | j
  | j  dd t| j| jD | _n8| jdks| jdkrd| _g | _| j	  | j  | j| _| jS )	Nr   r   zJSON Objectc             S   s   i | ]\}}||qS r   r   ).0kvr   r   r   
<dictcomp>   s    zjsonob.init.<locals>.<dictcomp>r   r,   z
JSON Array)r   r   Z_sizelenr   r   r
   r   r   r   r"   r7   zipr!   r3   )r   r   r   r   r2      s&    

zjsonob.initNc             C   s(   |d kr| j n|}tj| j|d}|S )Nr(   )r	   r0   r1   read)r   r	   r6   r   r   r   r      s    zjsonob.read_littlec             C   s.   | j | j| j|  }|  j|7  _|| _|S )N)r   r   r   )r   nr9   r   r   r   r@      s    zjsonob.readc             C   s   | j |}tj|dS )Nbig)r@   r0   r1   )r   rA   r   r   r   r   	_read_int   s    
zjsonob._read_intTc             C   sP   | j |}|d d }|d| k r@| r@|d|> d @ d|  S |d|> d @ S )Nr&   r   r   )rC   )r   rA   is_unsignedr9   r4   r   r   r   	read_uint   s    
zjsonob.read_uintc             C   s   | j |dS )NF)rE   )r   rA   r   r   r   read_int   s    zjsonob.read_intc             C   s   d}d}|dkrd}nP|dkr(d}d}n>|dkr6d}n0|dkrHd}d}n|d	krVd}n|d
krfd}d}|rndnd}t j| j|d|d}|S )Nr   Tr   r   r   r'   r   r&   r)   r*   Fr(   )r+   )r0   r1   r@   )r   r   rA   rD   r+   Zrsr   r   r   r      s(    zjsonob.read_inline_data)N)T)__name__
__module____qualname__r   r   r   r"   r7   r-   r2   r   r@   rC   rE   rF   r   r   r   r   r   r   B   s   %

r   )r.   sys_objectr   r   r   r   r   <module>   s   $