B
    ©0H[f  ã               @   sh   d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	 i Z
i Zi Zedd„ ƒZG dd	„ d	eƒZdS )
z$Thread-safe in-memory cache backend.é    N)Úcontextmanager)ÚDEFAULT_TIMEOUTÚ	BaseCache)ÚRWLockc               c   s
   dV  dS )z,A context manager that does nothing special.N© r   r   r   úeC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\core\cache\backends\locmem.pyÚdummy   s    r   c               @   s„   e Zd Zdd„ Zedfdd„Zddd„Zefd	d
„Zedfdd„Zddd„Z	ddd„Z
dd„ Zdd„ Zdd„ Zddd„Zdd„ ZdS ) ÚLocMemCachec             C   s<   t  | |¡ t |i ¡| _t |i ¡| _t |tƒ ¡| _d S )N)	r   Ú__init__Ú_cachesÚ
setdefaultÚ_cacheÚ_expire_infoÚ_locksr   Ú_lock)ÚselfÚnameÚparamsr   r   r   r
      s    zLocMemCache.__init__Nc          	   C   s\   | j ||d�}|  |¡ t |tj¡}| j ¡ �" |  |¡rN|  |||¡ dS dS Q R X d S )N)ÚversionTF)	Úmake_keyÚvalidate_keyÚpickleÚdumpsÚHIGHEST_PROTOCOLr   ÚwriterÚ_has_expiredÚ_set)r   ÚkeyÚvalueÚtimeoutr   Úpickledr   r   r   Úadd   s    

zLocMemCache.addTc          	   C   sÈ   | j ||d�}|  |¡ d }|r*| j ¡ ntƒ � |  |¡sF| j| }W d Q R X |d k	rzy
t |¡S  tj	k
rx   |S X |rˆ| j 
¡ ntƒ �0 y| j|= | j|= W n tk
r¸   Y nX |S Q R X d S )N)r   )r   r   r   Úreaderr   r   r   r   ÚloadsÚPickleErrorr   r   ÚKeyError)r   r   Údefaultr   Úacquire_lockr    r   r   r   Úget'   s$    


zLocMemCache.getc             C   s6   t | jƒ| jkr|  ¡  || j|< |  |¡| j|< d S )N)Úlenr   Z_max_entriesÚ_cullZget_backend_timeoutr   )r   r   r   r   r   r   r   r   <   s    
zLocMemCache._setc          	   C   sN   | j ||d�}|  |¡ t |tj¡}| j ¡ � |  |||¡ W d Q R X d S )N)r   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r    r   r   r   ÚsetB   s
    
zLocMemCache.seté   c          	   C   sl   | j  ¡ �X | j||dd�}|d kr0td| ƒ‚|| }| j||d�}t |tj¡}|| j|< W d Q R X |S )NF)r   r'   zKey '%s' not found)r   )	r   r   r(   Ú
ValueErrorr   r   r   r   r   )r   r   Údeltar   r   Z	new_valuer    r   r   r   ÚincrI   s    zLocMemCache.incrc          	   C   s€   | j ||d�}|  |¡ | j ¡ � |  |¡s2dS W d Q R X | j ¡ �0 y| j|= | j|= W n tk
rp   Y nX dS Q R X d S )N)r   TF)	r   r   r   r"   r   r   r   r   r%   )r   r   r   r   r   r   Úhas_keyT   s    

zLocMemCache.has_keyc             C   s*   | j  |d¡}|d ks"|t ¡ kr&dS dS )NéÿÿÿÿFT)r   r(   Útime)r   r   Úexpr   r   r   r   c   s    zLocMemCache._has_expiredc                sH   ˆ j dkrˆ  ¡  n0‡ fdd„tˆ jƒD ƒ}x|D ]}ˆ  |¡ q2W d S )Nr   c                s"   g | ]\}}|ˆ j  d kr|‘qS )r   )Ú_cull_frequency)Ú.0ÚiÚk)r   r   r   ú
<listcomp>m   s    z%LocMemCache._cull.<locals>.<listcomp>)r4   ÚclearÚ	enumerater   Ú_delete)r   Zdoomedr7   r   )r   r   r*   i   s
    


zLocMemCache._cullc             C   sH   y| j |= W n tk
r    Y nX y| j|= W n tk
rB   Y nX d S )N)r   r%   r   )r   r   r   r   r   r;   q   s    zLocMemCache._deletec          	   C   s<   | j ||d�}|  |¡ | j ¡ � |  |¡ W d Q R X d S )N)r   )r   r   r   r   r;   )r   r   r   r   r   r   Údelete{   s    
zLocMemCache.deletec             C   s   | j  ¡  | j ¡  d S )N)r   r9   r   )r   r   r   r   r9   �   s    
zLocMemCache.clear)NNT)r,   N)N)N)Ú__name__Ú
__module__Ú__qualname__r
   r   r!   r(   r   r+   r/   r0   r   r*   r;   r<   r9   r   r   r   r   r	      s   





r	   )Ú__doc__r   r2   Ú
contextlibr   Zdjango.core.cache.backends.baser   r   Zdjango.utils.synchr   r   r   r   r   r	   r   r   r   r   Ú<module>   s   