
 X*                 @   s   d  Z  d d l Z d d l Z d d l m Z m Z d d l m Z d d l 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)six)	force_str)cached_propertyc                   s	  e  Z d  Z   f d d   Z e d d    Z e d d  Z d   f 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  t |   j |  t | t j  r= | j d  |  _ n	 | |  _ | |  _ | |  _	 | j
 d  |  _ d  S)N;OPTIONS)superr   __init__
isinstancer   string_typessplit_serversLibraryValueNotFoundException_libget_options)selfserverparamslibraryvalue_not_found_exception)	__class__ R/home/ubuntu/projects/ifolica/build/django/django/core/cache/backends/memcached.pyr      s    			zBaseMemcachedCache.__init__c             C   s:   t  |  d d  d k r3 |  j j |  j  |  _ n  |  j S)zR
        Implements transparent thread-safe access to a memcached client.
        _clientN)getattrr   Clientr   r   )r   r   r   r   _cache   s    zBaseMemcachedCache._cachec             C   sr   | t  k r |  j } n  | d k r( d St |  d k rC d } n  | d k rh | t t j    7} n  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                s   t  t t |   j | |   S)N)r   r
   r   make_key)r   keyversion)r   r   r   r&   B   s    zBaseMemcachedCache.make_keyc             C   s4   |  j  | d | } |  j j | | |  j |   S)Nr(   )r&   r   addr%   )r   r'   valuer$   r(   r   r   r   r)   F   s    zBaseMemcachedCache.addc             C   s;   |  j  | d | } |  j j |  } | d  k r7 | S| S)Nr(   )r&   r   r   )r   r'   defaultr(   valr   r   r   r   J   s
    zBaseMemcachedCache.getc             C   sM   |  j  | d | } |  j j | | |  j |   sI |  j j |  n  d  S)Nr(   )r&   r   setr%   delete)r   r'   r*   r$   r(   r   r   r   r-   Q   s    !zBaseMemcachedCache.setc             C   s)   |  j  | d | } |  j j |  d  S)Nr(   )r&   r   r.   )r   r'   r(   r   r   r   r.   W   s    zBaseMemcachedCache.deletec       	         s      f d d   | D }   j  j |  } | r i  } t t | |   } x( | j   D] \ } } | | | | <q\ W| } n  | S)Nc                s%   g  |  ] }   j  | d    q S)r(   )r&   ).0x)r   r(   r   r   
<listcomp>\   s   	 z/BaseMemcachedCache.get_many.<locals>.<listcomp>)r   Z	get_multidictzipitems)	r   keysr(   Znew_keysret_mkvr   )r   r(   r   get_many[   s    	zBaseMemcachedCache.get_manyc             K   s   |  j  j   d  S)N)r   Zdisconnect_all)r   kwargsr   r   r   closef   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 |   n  | S)Nr(   r   zKey '%s' not found)r&   r   decrincrr   
ValueError)r   r'   deltar(   r,   r   r   r   r?   i   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 |   n  | S)Nr(   r   zKey '%s' not found)r&   r   r?   r>   r   r@   )r   r'   rA   r(   r,   r   r   r   r>   {   s    zBaseMemcachedCache.decrc             C   sb   i  } x9 | j    D]+ \ } } |  j | d | } | | | <q W|  j j | |  j |   d  S)Nr(   )r4   r&   r   Z	set_multir%   )r   datar$   r(   Z	safe_datar'   r*   r   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   r5   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-   r.   r;   r=   r?   r>   rC   rE   rF   r   r   )r   r   r      s   
r   c                   s:   e  Z d  Z d Z   f d d   Z e d d    Z   S)MemcachedCachez;An implementation of a cache binding using python-memcachedc                s5   d d  l  } t t |   j | | d | d t d  S)Nr   r   r   )memcacher
   rK   r   r@   )r   r   r   rL   )r   r   r   r      s    zMemcachedCache.__init__c             C   sC   t  |  d d   d  k r< |  j j |  j d t j |  _ n  |  j S)Nr   ZpickleProtocol)r   r   r   r   pickleHIGHEST_PROTOCOLr   )r   r   r   r   r      s    $zMemcachedCache._cache)rG   rH   rI   __doc__r   rJ   r   r   r   )r   r   rK      s   rK   c                   s:   e  Z d  Z d Z   f d d   Z e d d    Z   S)PyLibMCCachez2An implementation of a cache binding using pylibmcc                s8   d d  l  } t t |   j | | d | d | j d  S)Nr   r   r   )pylibmcr
   rP   r   ZNotFound)r   r   r   rQ   )r   r   r   r      s    zPyLibMCCache.__init__c             C   s1   |  j  j |  j  } |  j r- |  j | _ n  | S)N)r   r   r   r   Z	behaviors)r   clientr   r   r   r      s    	zPyLibMCCache._cache)rG   rH   rI   rO   r   r   r   r   r   )r   r   rP      s   rP   )rO   rM   r#   Zdjango.core.cache.backends.baser   r   Zdjango.utilsr   Zdjango.utils.encodingr   Zdjango.utils.functionalr   r   rK   rP   r   r   r   r   <module>   s   