U
    °[ÖeŠ  ã                   @   s„   d Z ddlZddlmZmZmZmZmZ zddlZW n e	k
rL   dZY nX ddl
mZ ddlmZ ddlmZ G dd„ dƒZdS )	zl
maxminddb.decoder
~~~~~~~~~~~~~~~~~

This package contains code for decoding the MaxMind DB data section.

é    N)ÚcastÚDictÚListÚTupleÚUnion©ÚInvalidDatabaseError)Ú
FileBuffer)ÚRecordc                   @   sÂ  e Zd ZdZd*eedef eeddœdd„Z	eee
ee ef d	œd
d„Zeee
eef d	œdd„Zeee
eef d	œdd„Zeee
eef d	œdd„Zeee
eef d	œdd„Zeee
eef d	œdd„Zeee
eeef ef d	œdd„Zeee
eef d	œdd„Zeee
eef d	œdd„Zeee
eef d	œdd„ZeeeeeeeeeeeeedœZee
eef dœd d!„Zee
eef dœd"d#„Zeeedd$œd%d&„ƒZeeee
eef d'œd(d)„ZdS )+ÚDecoderz.Decoder for the data section of the MaxMind DBr   Fz	mmap.mmapN)Údatabase_bufferÚpointer_baseÚpointer_testÚreturnc                 C   s   || _ || _|| _dS )a  Created a Decoder for a MaxMind DB

        Arguments:
        database_buffer -- an mmap'd MaxMind DB file.
        pointer_base -- the base number to use when decoding a pointer
        pointer_test -- used for internal unit testing of pointer code
        N)Ú_pointer_testÚ_bufferÚ_pointer_base)Úselfr   r   r   © r   úS/var/www/html/services/stratfitenv/lib/python3.8/site-packages/maxminddb/decoder.pyÚ__init__   s    zDecoder.__init__)ÚsizeÚoffsetr   c                 C   s2   g }t |ƒD ]}|  |¡\}}| |¡ q||fS ©N)ÚrangeÚdecodeÚappend)r   r   r   ÚarrayÚ_Úvaluer   r   r   Ú_decode_array,   s
    zDecoder._decode_arrayc                 C   s   |dk|fS )Nr   r   )r   r   r   r   r   r   Ú_decode_boolean3   s    zDecoder._decode_booleanc                 C   s   || }| j ||… |fS r   )r   ©r   r   r   Ú
new_offsetr   r   r   Ú_decode_bytes8   s    zDecoder._decode_bytesc                 C   s8   |   |d¡ || }| j||… }t d|¡\}||fS )Né   s   !d©Ú_verify_sizer   ÚstructÚunpack©r   r   r   r#   Zpacked_bytesr   r   r   r   Ú_decode_double<   s
    zDecoder._decode_doublec                 C   s8   |   |d¡ || }| j||… }t d|¡\}||fS )Né   s   !fr&   r*   r   r   r   Ú_decode_floatC   s
    zDecoder._decode_floatc                 C   sP   |dkrd|fS || }| j ||… }|dkr:| dd¡}t d|¡\}||fS )Nr   r,   ó    s   !i)r   Úrjustr(   r)   r*   r   r   r   Ú_decode_int32J   s    zDecoder._decode_int32c                 C   sD   i }t |ƒD ].}|  |¡\}}|  |¡\}}||tt|ƒ< q||fS r   )r   r   r   Ústr)r   r   r   Ú	containerr   Úkeyr   r   r   r   Ú_decode_mapU   s    zDecoder._decode_mapc           	      C   s  |d? d }| j ||| … }|| }|dkrXt|d@ gƒ| }t d|¡d | j }n†|dkr’dt|d@ gƒ | }t d|¡d d	 | j }nL|dkrÈt|d@ gƒ| }t d|¡d d
 | j }nt d|¡d | j }| jrì||fS |  |¡\}}||fS )Né   é   é   ó   !Hr   é   r.   ó   !Ii   i  )r   Úbytesr(   r)   r   r   r   )	r   r   r   Zpointer_sizeÚbufr#   Zpointerr   r   r   r   r   Ú_decode_pointer]   s"    zDecoder._decode_pointerc                 C   s&   || }| j ||… }t |d¡|fS )NÚbig)r   ÚintÚ
from_bytes)r   r   r   r#   Z
uint_bytesr   r   r   Ú_decode_uintt   s    zDecoder._decode_uintc                 C   s    || }| j ||…  d¡|fS )Nzutf-8)r   r   r"   r   r   r   Ú_decode_utf8_stringy   s    zDecoder._decode_utf8_string)r6   r9   r5   r,   é   é   r7   r%   é	   é
   é   é   é   )r   r   c              
   C   sŽ   |d }| j | }|d? }|s,|  |¡\}}z| j| }W n4 tk
rn } ztd|› dƒ|‚W 5 d}~X Y nX |  |||¡\}}|| ||ƒS )z“Decode a section of the data section starting at offset

        Arguments:
        offset -- the location of the data structure to decode
        r6   rC   zUnexpected type number (z) encounteredN)r   Ú_read_extendedÚ_type_decoderÚKeyErrorr   Ú_size_from_ctrl_byte)r   r   r#   Ú	ctrl_byteÚtype_numÚdecoderÚexr   r   r   r   r      s    

ÿþzDecoder.decodec                 C   s6   | j | }|d }|dk r*td|› dƒ‚||d fS )Nr7   z^Something went horribly wrong in the decoder. An extended type resolved to a type number < 8 (ú)r6   )r   r   )r   r   Z	next_byterO   r   r   r   rJ   ¤   s    

ÿzDecoder._read_extended)ÚexpectedÚactualr   c                 C   s   | |krt dƒ‚d S )NzXThe MaxMind DB file's data section contains bad data (unknown data type or corrupt data)r   )rS   rT   r   r   r   r'   ®   s    ÿzDecoder._verify_size)rN   r   rO   r   c                 C   s²   |d@ }|dks|dk r ||fS |dkrBd| j |  }||d fS |dkr||d }| j ||… }dt d|¡d  }||fS |d	 }| j ||… }t d
d| ¡d d }||fS )Né   r6   é   é   r9   i  r8   r   r5   r:   r.   i )r   r(   r)   )r   rN   r   rO   r   r#   Z
size_bytesr   r   r   rM   ¶   s    zDecoder._size_from_ctrl_byte)r   F) Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r	   r;   r?   Úboolr   r   r   r
   r    r!   r$   Úfloatr+   r-   r0   r   r1   r4   r=   rA   rB   rK   r   rJ   Ústaticmethodr'   rM   r   r   r   r   r      sZ     üû 
þ"ó
  
þr   )r[   r(   Útypingr   r   r   r   r   ÚmmapÚImportErrorZmaxminddb.errorsr   Zmaxminddb.filer	   Zmaxminddb.typesr
   r   r   r   r   r   Ú<module>   s   
