U
    /ec                     @  s   d dl mZ d dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
mZ dddd	d
ZdddddZG dd deeef ZG dd deeef ZG dd de	e ZdS )    )annotationsN)IterableIterator)	ItemsView
ValuesView)ZictBasestrbyteskeyreturnc                 C  s
   |  dS Nzutf-8)encoder    r   -/tmp/pip-unpacked-wheel-z3s6s24u/zict/lmdb.py_encode_key   s    r   c                 C  s
   |  dS r   )decoder   r   r   r   _decode_key   s    r   c                      s   e Zd ZdZd*ddd fddZdd	d
ddZdd	ddddZddd
ddZddddZddddZ	ddddZ
ddd d!d"Zddd
d#d$Zd%dd&d'Zddd(d)Z  ZS )+LMDBa  Mutable Mapping interface to a LMDB database.

    Keys must be strings, values must be bytes

    Parameters
    ----------
    directory: str
    map_size: int
        On Linux and MacOS, maximum size of the database file on disk.
        Defaults to 1 TiB on 64 bit systems and 1 GiB on 32 bit ones.

        On Windows, preallocated total size of the database file on disk. Defaults to
        10 MiB to encourage explicitly setting it.

    Notes
    -----
    None of this class is thread-safe - not even normally trivial methods such as
    ``__len__ `` or ``__contains__``.

    Examples
    --------
    >>> z = LMDB('/tmp/somedir/')  # doctest: +SKIP
    >>> z['x'] = b'123'  # doctest: +SKIP
    >>> z['x']  # doctest: +SKIP
    b'123'
    Nzstr | pathlib.Pathz
int | None)	directorymap_sizec                   sX   dd l }t   |d kr:tjdkr6tdtjd }nd}|jt|d|ddd| _	d S )	Nr   win32l           i   TF)subdirr   syncZwritemap)
lmdbsuper__init__sysplatformminmaxsizeopenr   db)selfr   r   r   	__class__r   r   r   2   s    

zLMDB.__init__r   r	   r
   c              	   C  sJ   t |tst|| j }|t|}W 5 Q R X |d krFt||S N)
isinstancer   KeyErrorr$   begingetr   )r%   r   txnvaluer   r   r   __getitem__D   s    
zLMDB.__getitem__None)r   r.   r   c              	   C  sR   t |tst|t |ts$t|| jjdd}|t|| W 5 Q R X d S NT)write)r)   r   	TypeErrorr	   r$   r+   putr   )r%   r   r.   r-   r   r   r   __setitem__M   s    

zLMDB.__setitem__objectboolc              
   C  sB   t |tsdS | j  }| t|W  5 Q R  S Q R X d S NF)r)   r   r$   r+   cursorZset_keyr   r%   r   r-   r   r   r   __contains__U   s    
zLMDB.__contains__zIterator[str]r   c                 C  s&   | j   }dd |jdddD S )Nc                 s  s   | ]}t |V  qd S r(   r   ).0kr   r   r   	<genexpr>]   s     z LMDB.__iter__.<locals>.<genexpr>TFkeysvalues)r$   r+   r9   iternextr%   r9   r   r   r   __iter__[   s    zLMDB.__iter__zItemsView[str, bytes]c                 C  s   t | S r(   )LMDBItemsViewr%   r   r   r   items_   s    z
LMDB.itemszValuesView[bytes]c                 C  s   t | S r(   )LMDBValuesViewrH   r   r   r   rC   b   s    zLMDB.valueszIterable[tuple[str, bytes]])rI   r   c              	   C  s   g }|D ]>\}}t |ts"t|t |ts4t||t||f q| jjdd6}| 	|\}}||  krt
|ksn tW 5 Q R X d S r1   )r)   r   r3   r	   appendr   r$   r+   r9   ZputmultilenAssertionError)r%   rI   Z	items_encr   r.   r-   consumedaddedr   r   r   
_do_updatee   s    

zLMDB._do_updatec              	   C  sF   t |tst|| jjdd}|t|s8t|W 5 Q R X d S r1   )r)   r   r*   r$   r+   deleter   r:   r   r   r   __delitem__s   s
    
zLMDB.__delitem__intc                 C  s   | j  d S )Nentries)r$   statrH   r   r   r   __len__z   s    zLMDB.__len__c                 C  s   | j   d S r(   )r$   closerH   r   r   r   rW   }   s    z
LMDB.close)N)__name__
__module____qualname____doc__r   r/   r5   r;   rF   rI   rC   rP   rR   rV   rW   __classcell__r   r   r&   r   r      s   	r   c                   @  s8   e Zd ZU ded< dZdddddZd	d
ddZdS )rG   r   _mappingr   r6   r7   )itemr   c                 C  s:   |\}}z| j | }W n tk
r,   Y dS X ||kS d S r8   )r]   r*   )r%   r^   r   r.   vr   r   r   r;      s    zLMDBItemsView.__contains__zIterator[tuple[str, bytes]]r<   c                 C  s(   | j j  }dd |jdddD S )Nc                 s  s   | ]\}}t ||fV  qd S r(   r=   )r>   r?   r_   r   r   r   r@      s     z)LMDBItemsView.__iter__.<locals>.<genexpr>TrA   r]   r$   r+   r9   rD   rE   r   r   r   rF      s    zLMDBItemsView.__iter__NrX   rY   rZ   __annotations__	__slots__r;   rF   r   r   r   r   rG      s   
rG   c                   @  s8   e Zd ZU ded< dZdddddZd	d
ddZdS )rJ   r   r]   r   r6   r7   )r.   r   c                   s   t  fdd| D S )Nc                 3  s   | ]} |kV  qd S r(   r   )r>   r_   r.   r   r   r@      s     z.LMDBValuesView.__contains__.<locals>.<genexpr>)any)r%   r.   r   rd   r   r;      s    zLMDBValuesView.__contains__zIterator[bytes]r<   c                 C  s   | j j  }|jdddS )NFTrA   r`   rE   r   r   r   rF      s    zLMDBValuesView.__iter__Nra   r   r   r   r   rJ      s   
rJ   )
__future__r   pathlibr   collections.abcr   r   typingr   r   Zzict.commonr   r   r   r   r	   r   rG   rJ   r   r   r   r   <module>   s   k