B
    X[\j                 @   sp   d dl mZmZmZ d dlZd dlZddlmZ ejdkrLdd Z	dd	 Z
nd
d Z	dd	 Z
G dd deZdS )    )absolute_importdivisionprint_functionN   )ZictBase)   c             C   s
   |  dS )Nlatin1)encode)key r   (lib/python3.7/site-packages/zict/lmdb.py_encode_key
   s    r   c             C   s
   |  dS )Nr   )decode)r
   r   r   r   _decode_key   s    r   c             C   s   | S )Nr   )r
   r   r   r   r      s    c             C   s   | S )Nr   )r
   r   r   r   r      s    c               @   sp   e Zd 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 Zdd Zdd Zdd Zdd ZdS )LMDBa=   Mutable Mapping interface to a LMDB database.

    Keys must be strings, values must be bytes

    Parameters
    ----------
    directory: string

    Examples
    --------
    >>> z = LMDB('/tmp/somedir/')  # doctest: +SKIP
    >>> z['x'] = b'123'  # doctest: +SKIP
    >>> z['x']  # doctest: +SKIP
    b'123'
    c             C   s@   dd l }tjdkrdnd}tjd}|j|d|d|d| _d S )	Nr   l        l        i   ZlinuxTF)Zsubdirmap_sizesyncwritemap)lmdbsysmaxsizeplatform
startswithopendb)selfZ	directoryr   r   r   r   r   r   __init__(   s    zLMDB.__init__c          	   C   s8   | j  }|t|}W d Q R X |d kr4t||S )N)r   begingetr   KeyError)r   r
   txnvaluer   r   r   __getitem__7   s
    zLMDB.__getitem__c          	   C   s.   | j jdd}|t|| W d Q R X d S )NT)write)r   r   Zputr   )r   r
   r!   r    r   r   r   __setitem__>   s    zLMDB.__setitem__c          	   C   s(   | j  }| t|S Q R X d S )N)r   r   cursorZset_keyr   )r   r
   r    r   r   r   __contains__B   s    zLMDB.__contains__c             C   s&   | j   }dd |jdddD S )Nc             s   s   | ]\}}t ||fV  qd S )N)r   ).0kvr   r   r   	<genexpr>H   s   zLMDB.items.<locals>.<genexpr>T)keysvalues)r   r   r%   iternext)r   r%   r   r   r   itemsF   s    z
LMDB.itemsc             C   s&   | j   }dd |jdddD S )Nc             s   s   | ]}t |V  qd S )N)r   )r'   r(   r   r   r   r*   M   s   zLMDB.keys.<locals>.<genexpr>TF)r+   r,   )r   r   r%   r-   )r   r%   r   r   r   r+   K   s    z	LMDB.keysc             C   s   | j   }|jdddS )NFT)r+   r,   )r   r   r%   r-   )r   r%   r   r   r   r,   P   s    zLMDB.valuesc          	   C   s\   dd |D }| j jdd6}| |\}}||  krHt|ksNn tW d Q R X d S )Nc             S   s   g | ]\}}t ||fqS r   )r   )r'   r(   r)   r   r   r   
<listcomp>V   s    z#LMDB._do_update.<locals>.<listcomp>T)r#   )r   r   r%   ZputmultilenAssertionError)r   r.   r    consumedZaddedr   r   r   
_do_updateT   s    zLMDB._do_updatec             C   s   |   S )N)r+   )r   r   r   r   __iter__[   s    zLMDB.__iter__c          	   C   s4   | j jdd}|t|s&t|W d Q R X d S )NT)r#   )r   r   deleter   r   )r   r
   r    r   r   r   __delitem__^   s    zLMDB.__delitem__c             C   s   | j  d S )Nentries)r   stat)r   r   r   r   __len__c   s    zLMDB.__len__c             C   s   | j   d S )N)r   close)r   r   r   r   r:   f   s    z
LMDB.closeN)__name__
__module____qualname____doc__r   r"   r$   r&   r.   r+   r,   r3   r4   r6   r9   r:   r   r   r   r   r      s   r   )Z
__future__r   r   r   osr   commonr   version_infor   r   r   r   r   r   r   <module>   s   

