
 X                 @   s   d  Z  d d l Z d d l m Z d d l m Z m Z d d l m Z y d d l	 m
 Z Wn e k
 r| d d l Z Yn Xi  Z i  Z i  Z e d d    Z Gd	 d
   d
 e  Z d S)z$Thread-safe in-memory cache backend.    N)contextmanager)DEFAULT_TIMEOUT	BaseCache)RWLock)cPicklec               c   s	   d Vd S)z,A context manager that does nothing special.N r   r   r   O/home/ubuntu/projects/ifolica/build/django/django/core/cache/backends/locmem.pydummy   s    r	   c               @   s   e  Z d  Z d d   Z e d d d  Z d d d d d  Z e d	 d
  Z e d d d  Z d 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   sV   t  j |  |  t j | i   |  _ t j | i   |  _ t j | 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 | } |  j |  t j | t j  } |  j j   / |  j |  rm |  j | | |  d Sd SWd  QXd  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 | } |  j |  d  } | r= |  j j   n t   $ |  j |  sf |  j | } n  Wd  QX| d  k	 r y t j |  SWq t j	 k
 r | SYq Xn  | r |  j j
   n t   6 y |  j | =|  j | =Wn t k
 r Yn X| SWd  QXd  S)Nr   )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   sL   t  |  j  |  j k r% |  j   n  | |  j | <|  j |  |  j | <d  S)N)lenr   Z_max_entries_cullZget_backend_timeoutr   )r   r   r   r    r   r   r   r   B   s    zLocMemCache._setc             C   sd   |  j  | d | } |  j |  t j | t j  } |  j j    |  j | | |  Wd  QXd  S)Nr   )r   r   r   r   r   r   r   r   )r   r   r   r    r   r!   r   r   r   setH   s
    zLocMemCache.set   c             C   s   |  j  j    |  j | d | d d } | d  k rJ t d |   n  | | } |  j | d | } t j | t j  } | |  j | <Wd  QX| S)Nr   r(   FzKey '%s' not found)	r   r   r)   
ValueErrorr   r   r   r   r   )r   r   deltar   r   Z	new_valuer!   r   r   r   incrO   s    
zLocMemCache.incrc             C   s   |  j  | d | } |  j |  |  j j    |  j |  sE d SWd  QX|  j j   6 y |  j | =|  j | =Wn t k
 r Yn Xd SWd  QXd  S)Nr   TF)	r   r   r   r#   r   r   r   r   r&   )r   r   r   r   r   r   has_keyZ   s    

zLocMemCache.has_keyc             C   s;   |  j  j | d  } | d  k s3 | t j   k r7 d Sd S)Nr-   FT)r   r)   time)r   r   expr   r   r   r   i   s    zLocMemCache._has_expiredc                s`     j  d k r   j   n@   f d d   t   j  D } x | D] }   j |  qE Wd  S)Nr   c                s/   g  |  ]% \ } } |   j  d  k r |  q S)r   )_cull_frequency).0ik)r   r   r   
<listcomp>s   s   	 z%LocMemCache._cull.<locals>.<listcomp>)r5   clear	enumerater   _delete)r   Zdoomedr8   r   )r   r   r+   o   s
    "zLocMemCache._cullc             C   sJ   y |  j  | =Wn t k
 r" Yn Xy |  j | =Wn t k
 rE Yn Xd  S)N)r   r&   r   )r   r   r   r   r   r<   w   s    zLocMemCache._deletec          	   C   sI   |  j  | d | } |  j |  |  j j    |  j |  Wd  QXd  S)Nr   )r   r   r   r   r<   )r   r   r   r   r   r   delete   s    zLocMemCache.deletec             C   s   |  j  j   |  j j   d  S)N)r   r:   r   )r   r   r   r   r:      s    zLocMemCache.clear)__name__
__module____qualname__r   r   r"   r)   r   r,   r0   r1   r   r+   r<   r=   r:   r   r   r   r   r
      s   

r
   )__doc__r3   
contextlibr   Zdjango.core.cache.backends.baser   r   Zdjango.utils.synchr   Zdjango.utils.six.movesr   r   ImportErrorr   r   r   r	   r
   r   r   r   r   <module>   s   