o
    jG                     @   s  d dl mZmZ d dlmZ d dlZd dlmZ d dlm	Z	 d dl
mZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ dd dd dZG dd dejZd ZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+d Z,i eded!ed!ed"ed#ed$e d%e!d&e"d$e#de$de%de&de'de(d'e)d$e*d(e+d)e,diZ-d*Z.d+Z/d,Z0e.d-e/d.e0d/iZ1G d0d1 d1Z2dS )2    )INTERNAL_TO_NAMENAME_TO_ATTRTYP)OrderedDictN)unpack)ESENT_DB_HEADER)
ESENT_PAGE	PAGEFLAGSWELLKNOWNPAGENO)readbranchentry)readleafentry)ESENT_DATA_DEFINITION_HEADER)#ESENT_CATALOG_DATA_DEFINITION_ENTRYCATALOG_TYPE    )	TableDataFatherDataPageNumberCurrentPageData
CurrentTagc                   @   s    e Zd ZdZdZdZdZdZdS )TAGGED_DATA_TYPE            
   N)__name__
__module____qualname__VARIABLE_SIZE
COMPRESSEDSTOREDMULTI_VALUE	WHO_KNOWS r"   r"   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aesedb/eesentdb.pyr      s    r   r   r      r            r   	   r                           )r   B)r   z<h)r   z<l)r   z<Q)r   z<f)r   z<d)r   z<L)r.   16s)r   z<Hi  iN  i  zutf-16leasciicp1252c                   @   s   e Zd Zd!ddZdd Zd"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dZd#defdd ZdS )$ESENT_DB    c                 C   s*   || _ || _d | _d | _t | _d | _d S N)_ESENT_DB__pageSize_ESENT_DB__DB_ESENT_DB__DBHeader_ESENT_DB__totalPagesr   _ESENT_DB__tables_ESENT_DB__currentTable)selfdbfilepageSizer"   r"   r#   __init__T   s   
zESENT_DB.__init__c              
      s   zJ|  dI d H \}}|d ur|t|| _| jj| _| jddI d H  | j I d H }|| j d | _	| 
tjjI d H \}}|d urI|W dS  tya } z
d |fW  Y d }~S d }~ww )Nr   r   TN)get_pager   
from_bytesr:   PageSizer8   r9   seektellr;   parse_catalogr	   CATALOGvalue	Exception)r>   
mainHeadererrpos_er"   r"   r#   parse\   s$   
zESENT_DB.parseFc           
   
      s   zb| j |d | j dI d H  | j | jI d H }t|| jk r=| jt| }| j |I d H }||7 }t|| jk s"|dkrJ|du rJ|d fW S t| j}||I d H \}}|d ur_||d fW S  tyy }	 z
d |	fW  Y d }	~	S d }	~	ww )Nr   r   F)r9   rG   r8   readlenr   r:   rL   )
r>   pagenoforce_parsedata	remainingtpagerP   rN   rQ   r"   r"   r#   rD   r   s(   


zESENT_DB.get_pagec           
   
      s   z^|  |I d H \}}|d ur|| |I d H \}}|d ur"|td|jjD ]3}||\}}|jjtj@ dkr\t	||I d H \}}|d urK|| 
|jI d H \}}|d ur\|q)W dS  tyu }	 z
d |	fW  Y d }	~	S d }	~	ww Nr   r   rC   )rD   
parse_pagerangerecordFirstAvailablePageTagget_tag	PageFlagsr   LEAFr
   rI   ChildPageNumberrL   )
r>   rU   rZ   rN   rP   iflagsrW   branchEntryrQ   r"   r"   r#   rI      s.   zESENT_DB.parse_catalogc              
      s   zPt d|jjD ]E}||\}}|jjtj@ dkrN|jjtj@ dkr%q	|jjtj@ dkr/q	|jjtj	@ dkr9q	t
||I d H \}}|d urI|| | q	W dS  tyg } z
d |fW  Y d }~S d }~ww r[   )r]   r^   r_   r`   ra   r   rb   
SPACE_TREEINDEX
LONG_VALUEr   _ESENT_DB__addItemrL   )r>   rZ   tagnore   rW   lerN   rQ   r"   r"   r#   r\      s*   
zESENT_DB.parse_pagec                 C   st   t |j}|jdkr|jd }n|j}tj|j|jd  d d ddd}|j|jd  d| d  d | }|S )N   r   littleF	byteordersigned)r   rE   	EntryDataLastVariableDataTypeintVariableSizeOffset)r>   entrydataDefinitionHeader
numEntriesitemLenitemNamer"   r"   r#   __parseItemName   s   
$$zESENT_DB.__parseItemNamec                 C   s  t |j}t|j|jd  }| |}|jtjkrBt	 | j
|< || j
| _t	 | j
| _t	 | j
| _t	 | j
| _|| _d S |jtjkrg|| j
| j j|< || j
| j j| _|| j
| j j| _d S |jtjkrx|| j
| j j|< d S |jtjkr| | d S td|d  )NzUnknown type 0x%xType)r   rE   rr   r   _len_ESENT_DB__parseItemNamer|   r   TABLEr   r<   
TableEntryColumnsIndexes
LongValuesr=   COLUMNHeaderRecordrh   ri   _ESENT_DB__addLongValuerL   )r>   rv   rw   catalogEntryrz   r"   r"   r#   	__addItem   s&   

zESENT_DB.__addItemc                 C   sf   t |j}tj|j|jd  d d ddd}|j|jd  dd  d | }|| j| j j|< d S )Nr   rn   Fro   r'   )r   rE   rr   rt   ru   r<   r=   r   )r>   rv   rw   lvLenlvNamer"   r"   r#   __addLongValue   s   $ zESENT_DB.__addLongValuec              
      sh  zt |tdur| }|| jv r| j| j}t|j}t|j|j	d  }|j
}d}|du r| |I d H \}}|d urB||jjdkrJd}td|jjD ])}	||	\}
}|jjtj@ dkrxt|
|I d H \}}|d urs||j} nd} |du s2t}| j| |d< |j
|d< ||d< d|d< |d fW S td	 ty } z
d |fW  Y d }~S d }~ww )
NTFr   r   r   r   r   r   zTable not found!)
isinstancebytesencoder<   r   r   rE   rr   r   r}   r   rD   r^   r_   r]   r`   ra   r   rb   r
   rc   TABLE_CURSORrL   )r>   	tablenamerv   rw   r   pageNumdonerZ   rN   rd   re   rW   rf   cursorrQ   r"   r"   r#   
open_table   sL   


zESENT_DB.open_tablec              
      s   z`|d }|d |j jkrW dS ||d \}}|j jtj@ dkr_|j jtj@ dkr0td|j jtj@ dkr=td|j jtj	@ dkrJtdt
||I d H \}}|d urZ||d fW S W dS  tyw } z
d |fW  Y d }~S d }~ww )Nr   r   NNr   zFLAGS_SPACE_TREE > 0zFLAGS_INDEX > 0zFLAGS_LONG_VALUE > 0)r^   r_   r`   ra   r   rb   rg   rL   rh   ri   r   )r>   r   rZ   re   rW   	leafEntryrN   rQ   r"   r"   r#   __get_next_tag  s,   
zESENT_DB.__get_next_tagc              
      s   z2|  |I d H \}}|d ur|d}	 | |I d H \}}|d ur%||d u r*n|d7 }q|d fW S  tyI } z
d |fW  Y d }~S d }~ww )Nr   Tr   )r   _ESENT_DB__next_row_ctrrL   )r>   
table_namer   rN   ctrresrQ   r"   r"   r#   
get_rowcnt-  s&   
zESENT_DB.get_rowcntc              
      s   zM|d  d7  < |  |I d H \}}|d ur||d u rL|d }|jjdkr+W dS | |jjI d H \|d< }|d ur?|d|d< | |I d H W S W dS  tyd } z
d |fW  Y d }~S d }~ww )Nr   r   r   r   r   rC   )_ESENT_DB__get_next_tagr^   NextPageNumberrD   r   rL   )r>   r   tagrN   rZ   rQ   r"   r"   r#   __next_row_ctrA  s(   zESENT_DB.__next_row_ctrNc              
      s   zd|d  d7  < |  |I d H \}}|d ur||d u rN|d }|jjdkr+W dS | |jjI d H \|d< }|d ur?|d|d< | j||dI d H W S | ||j|I d H \}}|d ura||d fW S  ty{ } z
d |fW  Y d }~S d }~ww )Nr   r   r   r   r   )
filter_col)r   r^   r   rD   get_next_row_ESENT_DB__tag_to_recordrr   rL   )r>   r   r   r   rN   rZ   r   rQ   r"   r"   r#   r   Z  s.   
zESENT_DB.get_next_rowr   c           (   
      s.  z}t  }t  }d}t|}|jd d }d}	t|}
|j}|j}|d j}d }d}t|	 D ]G}|d ur>||vr>q2|d urJ|}t
|| }|| j}|j|jkri||d  d |j ||< ||j7 }nd|j  k ru|jkrn nB|jd d }tj|||d  d  d d ddd}|d	@ r|	}d ||< n||| d  d ||	  }|||< |||	 7 }|}	nA|jd
kr|du r|| |
k r|| }| j}tj||d d  d d dddd@ | | }	 tj||d  d d ddd}|d7 }tj||d  d d dddd@ }| jjdkr)| jjdkr)| jjdkr)d}ntj||d  d d dddd@ }|d7 }||k rF|}||
|f||< ||krSnqt|	 d }tdt|D ](}|| \}}}t| | d \}} } ||| |f||< t|	 | }qcd}|j|v r|| ||j d  }!||j d }"||j d dkrt||!|!d  }#|!d7 }!|"d8 }"nd}#|#tj@ rd ||< n*|#tj@ r||!d  d |" f||< n||!d  d |" ||< n	d ||< nd ||< t|| tu r|| d ||< q2|jtks|jtkrS|| d urR|j t!vr-t"d|d  t!|j  }$z|| #|$||< W q2 t"yQ   || #|$d||< Y q2w q2t$|j }%|| d urz|%d u rk|| ||< q2|%d }&t%|&|| d ||< q2|d fW S  t"y }' z
d |'fW  Y d }'~'S d }'~'ww )NFrm   r   r   r   r   rn   ro   i      i?  Ti   r/   r6   i @  zUnknown codepage 0x%xCodePagereplace)&r   r   rE   rs   rT   r}   ru   r   listkeysboolr   
IdentifierLastFixedSize
SpaceUsagert   r8   r:   VersionFileFormatRevisionrF   r]   itemsordr   r   r    typetuple
ColumnTypeJET_coltypTextJET_coltypLongTextr   StringCodePagesrL   decodeColumnTypeSizer   )(r>   r   r   r   r^   taggedItemstaggedItemsParsedrw   variableDataBytesProcessedprevItemLentagLenfixedSizeOffsetvariableSizeOffsetcolumnsprev_column_nameprev_column_mandatorycolumncolumnRecordindexry   	itemValueendOfVSfirstOffsetTagtaggedIdentifiertaggedOffsetflagsPresentprevKeyrd   offset0lengthre   offsetrP   
offsetItemitemSizeitemFlagstringDecoder
unpackData	unpackStrrQ   r"   r"   r#   __tag_to_recordx  s   


(
0 $*$








zESENT_DB.__tag_to_record)r6   )Fr7   )r   r   r   rA   rR   rD   rI   r\   r~   rj   r   r   r   r   r   r   dictr   r"   r"   r"   r#   r5   S   s    

/
r5   )3aesedb.security.constantsr   r   collectionsr   enumstructr   aesedb.structures.headerr   aesedb.structures.pager   r   r	   aesedb.structures.branchentryr
   aesedb.structures.leafentryr   &aesedb.structures.datadefinitionheaderr   %aesedb.structures.catalogdatadefentryr   r   r   IntFlagr   JET_coltypNilJET_coltypBitJET_coltypUnsignedByteJET_coltypShortJET_coltypLongJET_coltypCurrencyJET_coltypIEEESingleJET_coltypIEEEDoubleJET_coltypDateTimeJET_coltypBinaryr   JET_coltypLongBinaryr   JET_coltypSLVJET_coltypUnsignedLongJET_coltypLongLongJET_coltypGUIDJET_coltypUnsignedShortJET_coltypMaxr   CODEPAGE_UNICODECODEPAGE_ASCIICODEPAGE_WESTERNr   r5   r"   r"   r"   r#   <module>   s    	
