
v^                 @   s   d  Z  d d l Z d d l Z d d l Z d d l m Z m Z d d l m Z Gd d   d e  Z	 Gd d   d e	  Z
 Gd	 d
   d
 e	  Z d S)zMemcached cache backend    N)DEFAULT_TIMEOUT	BaseCache)cached_propertyc                   s   e  Z d  Z   f d d   Z e d d    Z e d d  Z e d d d	  Z d d d
 d  Z	 e d d d  Z
 d d d  Z d d d  Z d d   Z d d d d  Z d d d d  Z e d d d  Z d d d  Z d d   Z   S)BaseMemcachedCachec                sn   t    j |  t | t  r7 t j d |  |  _ n	 | |  _ | |  _ | |  _ | j	 d  pd i  |  _
 d  S)Nz[;,]OPTIONS)super__init__
isinstancestrresplit_serversLibraryValueNotFoundException_libget_options)selfserverparamslibraryvalue_not_found_exception)	__class__ F/tmp/pip-build-8lau8j11/django/django/core/cache/backends/memcached.pyr      s    			zBaseMemcachedCache.__init__c             C   s=   t  |  d d  d k r6 |  j j |  j |  j  |  _ |  j S)zQ
        Implement transparent thread-safe access to a memcached client.
        _clientN)getattrr   Clientr   r   r   )r   r   r   r   _cache   s    zBaseMemcachedCache._cachec             C   si   | t  k r |  j } | d k r% d St |  d k r= d } | d k r_ | t t j    7} t |  S)z
        Memcached deals with long (> 30 days) timeouts in a special
        way. Call this function to obtain a safe value for your timeout.
        Nr      i ' )r   Zdefault_timeoutinttime)r   timeoutr   r   r   get_backend_timeout&   s    	z&BaseMemcachedCache.get_backend_timeoutNc             C   s4   |  j  | d | } |  j j | | |  j |   S)Nversion)make_keyr   addr#   )r   keyvaluer"   r$   r   r   r   r&   A   s    zBaseMemcachedCache.addc             C   s(   |  j  | d | } |  j j | |  S)Nr$   )r%   r   r   )r   r'   defaultr$   r   r   r   r   E   s    zBaseMemcachedCache.getc             C   sJ   |  j  | d | } |  j j | | |  j |   sF |  j j |  d  S)Nr$   )r%   r   setr#   delete)r   r'   r(   r"   r$   r   r   r   r*   I   s    !zBaseMemcachedCache.setc             C   s)   |  j  | d | } |  j j |  d  S)Nr$   )r%   r   r+   )r   r'   r$   r   r   r   r+   O   s    zBaseMemcachedCache.deletec                sQ     f d d   | D    j  j   j    }   f d d   | j   D S)Nc                s(   i  |  ] } |   j  | d    q S)r$   )r%   ).0r'   )r   r$   r   r   
<dictcomp>T   s   	 z/BaseMemcachedCache.get_many.<locals>.<dictcomp>c                s#   i  |  ] \ } } |   |  q Sr   r   )r,   kv)key_mapr   r   r-   V   s   	 )r   Z	get_multikeysitems)r   r1   r$   retr   )r0   r   r$   r   get_manyS   s    zBaseMemcachedCache.get_manyc             K   s   |  j  j   d  S)N)r   Zdisconnect_all)r   kwargsr   r   r   closeX   s    zBaseMemcachedCache.closer   c             C   s   |  j  | d | } | d k  r5 |  j j | |  Sy |  j j | |  } Wn |  j k
 rk d  } Yn X| d  k r t d |   | S)Nr$   r   zKey '%s' not found)r%   r   decrincrr   
ValueError)r   r'   deltar$   valr   r   r   r8   \   s    zBaseMemcachedCache.incrc             C   s   |  j  | d | } | d k  r5 |  j j | |  Sy |  j j | |  } Wn |  j k
 rk d  } Yn X| d  k r t d |   | S)Nr$   r   zKey '%s' not found)r%   r   r8   r7   r   r9   )r   r'   r:   r$   r;   r   r   r   r7   n   s    zBaseMemcachedCache.decrc       	         s   i  } i    xC | j    D]5 \ } } |  j | d | } | | | <|   | <q W|  j j | |  j |   }   f d d   | D S)Nr$   c                s   g  |  ] }   |  q Sr   r   )r,   r.   )original_keysr   r   
<listcomp>   s   	 z/BaseMemcachedCache.set_many.<locals>.<listcomp>)r2   r%   r   Z	set_multir#   )	r   datar"   r$   Z	safe_datar'   r(   Zsafe_keyZfailed_keysr   )r<   r   set_many   s    
zBaseMemcachedCache.set_manyc                s*     j  j    f d d   | D  d  S)Nc             3   s$   |  ] }   j  | d   Vq d S)r$   N)r%   )r,   r'   )r   r$   r   r   	<genexpr>   s    z1BaseMemcachedCache.delete_many.<locals>.<genexpr>)r   Zdelete_multi)r   r1   r$   r   )r   r$   r   delete_many   s    zBaseMemcachedCache.delete_manyc             C   s   |  j  j   d  S)N)r   Z	flush_all)r   r   r   r   clear   s    zBaseMemcachedCache.clear)__name__
__module____qualname__r   propertyr   r   r#   r&   r   r*   r+   r4   r6   r8   r7   r?   rA   rB   r   r   )r   r   r      s   

r   c                   s^   e  Z d  Z d Z   f d d   Z e d d    Z e d d d  Z d d d	 d
  Z	   S)MemcachedCachez;An implementation of a cache binding using python-memcachedc                s/   d d  l  } t   j | | d | d t d  S)Nr   r   r   )memcacher   r   r9   )r   r   r   rH   )r   r   r   r      s    zMemcachedCache.__init__c             C   sY   t  |  d d   d  k rR d t j i } | j |  j  |  j j |  j |  |  _ |  j S)Nr   ZpickleProtocol)	r   pickleHIGHEST_PROTOCOLupdater   r   r   r   r   )r   Zclient_kwargsr   r   r   r      s
    zMemcachedCache._cacheNc             C   s7   |  j  | d | } |  j j | |  j |   d k S)Nr$   r   )r%   r   touchr#   )r   r'   r"   r$   r   r   r   rL      s    zMemcachedCache.touchc             C   s;   |  j  | d | } |  j j |  } | d  k r7 | S| S)Nr$   )r%   r   r   )r   r'   r)   r$   r;   r   r   r   r      s
    zMemcachedCache.get)
rC   rD   rE   __doc__r   rF   r   r   rL   r   r   r   )r   r   rG      s
   rG   c                   sX   e  Z d  Z d Z   f d d   Z e d d    Z e d d d  Z d	 d
   Z	   S)PyLibMCCachez2An implementation of a cache binding using pylibmcc                s2   d d  l  } t   j | | d | d | j d  S)Nr   r   r   )pylibmcr   r   ZNotFound)r   r   r   rO   )r   r   r   r      s    zPyLibMCCache.__init__c             C   s   |  j  j |  j |  j  S)N)r   r   r   r   )r   r   r   r   r      s    zPyLibMCCache._cacheNc             C   sM   |  j  | d | } | d k r1 |  j j |  S|  j j | |  j |   S)Nr$   r   )r%   r   r+   rL   r#   )r   r'   r"   r$   r   r   r   rL      s    zPyLibMCCache.touchc             K   s   d  S)Nr   )r   r5   r   r   r   r6      s    zPyLibMCCache.close)
rC   rD   rE   rM   r   r   r   r   rL   r6   r   r   )r   r   rN      s
   rN   )rM   rI   r   r!   Zdjango.core.cache.backends.baser   r   Zdjango.utils.functionalr   r   rG   rN   r   r   r   r   <module>   s   