ó
P'—^c           @@ sj  d  d l  m Z m Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l m Z d  d l	 m
 Z
 d  d l m Z m Z d  d l m Z d  d l m Z d  d l m Z d  d	 l m Z y/ d  d
 l m Z m Z e e e e j f Z Wn  e k
 re e j f Z n Xd d l m Z m Z m Z d d l m Z m Z d d l  m! Z! d e" f d „  ƒ  YZ# d S(   i    (   t   absolute_importt   unicode_literalsN(   t   OrderedDict(   t   settings(   t   DEFAULT_TIMEOUTt   get_key_func(   t   ImproperlyConfigured(   t
   smart_text(   t   ConnectionError(   t   ResponseError(   t   TimeoutErrorR	   i   (   t   CacheKeyt
   load_classt   integer_types(   t   ConnectionInterruptedt   CompressorError(   t   poolt   DefaultClientc           B@ sÁ  e  Z d  „  Z d „  Z e d „ Z e d „ Z d d „ Z e d  d  e
 e
 d „ Z d d  d  d „ Z e d  d  d	 „ Z d  d  d  d
 „ Z d  d  d „ Z d  d  d „ Z d  d  d d  d  d „ Z d  d  d  d „ Z d  d  d  d „ Z d  d  d „ Z d  d „ Z d „  Z d „  Z d  d  d „ Z e d  d  d „ Z d d  d  d „ Z d d  d  d „ Z d d  d  d „ Z d  d  d „ Z d  d  d „ Z d  d  d  d „ Z d  d  d „ Z  d  d  d „ Z! d „  Z" RS(!   c         C@ s:  | |  _  | |  _ | |  _ t | j d ƒ p0 d ƒ |  _ |  j sQ t d ƒ ‚ n  t |  j t t	 t
 f ƒ s„ |  j j d ƒ |  _ n  d  g t |  j ƒ |  _ | j d i  ƒ |  _ |  j j d d ƒ } t | ƒ } |  j j d d	 ƒ } t | ƒ } | d
 |  j ƒ |  _ | d
 |  j ƒ |  _ t j d
 |  j ƒ |  _ d  S(   Nu   REVERSE_KEY_FUNCTIONu%   django_redis.util.default_reverse_keyu   Missing connections stringu   ,u   OPTIONSu
   SERIALIZERu0   django_redis.serializers.pickle.PickleSerializeru
   COMPRESSORu4   django_redis.compressors.identity.IdentityCompressort   options(   t   _backendt   _servert   _paramsR   t   gett   reverse_keyR   t
   isinstancet   listt   tuplet   sett   splitt   Nonet   lent   _clientst   _optionsR   t   _serializert   _compressorR   t   get_connection_factoryt   connection_factory(   t   selft   servert   paramst   backendt   serializer_patht   serializer_clst   compressor_patht   compressor_cls(    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   __init__!   s$    				c         C@ s   |  j  | ƒ S(   N(   t   has_key(   R%   t   key(    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   __contains__=   s    c         C@ s<   | s t  |  j ƒ d k r d St j d t  |  j ƒ d ƒ S(   uï   
        Return a next index for read client.
        This function implements a default behavior for
        get a next read client for master-slave setup.

        Overwrite this function if you want a specific
        behavior.
        i   i    (   R   R   t   randomt   randint(   R%   t   write(    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   get_next_client_index@   s    	c         C@ sI   |  j  d | ƒ } |  j | d k r> |  j | ƒ |  j | <n  |  j | S(   uÈ   
        Method used for obtain a raw redis client.

        This function is used by almost all cache backend
        operations for obtain a native redis client/connection
        instance.
        R3   N(   R4   R   R   t   connect(   R%   R3   t   index(    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt
   get_clientN   s    i    c         C@ s   |  j  j |  j | ƒ S(   uè   
        Given a connection index, returns a new raw redis client/connection
        instance. Index is used for master/slave setups and indicates that
        connection string should be used. In normal setups, index is 0.
        (   R$   R5   R   (   R%   R6   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyR5   ]   s    c      	   C@ s?  | s |  j  d t ƒ } n  |  j | d | ƒ} |  j | ƒ }	 | t k rj t j d t ƒ |  j j } n  | t	 k r… |  j j } n  y‹ | d k	 rí | d k r³ t | d ƒ } qí | d k rí | rÎ d } qê |  j | d | d | ƒSqí n  | j | |	 d | d | d	 | ƒSWn( t k
 r:}
 t d
 | d |
 ƒ ‚ n Xd S(   u·   
        Persist a value to the cache, and set an optional expiration time.
        Also supports optional nx parameter. If set to True - will use redis setnx instead of set.
        R3   t   versionu/   Using True as timeout value, is now deprecated.i    iè  t   clientt   nxt   pxt   xxt
   connectiont   parentN(   R7   t   Truet   make_keyt   encodet   warningst   warnt   DeprecationWarningR   t   default_timeoutR   R   t   intt   deleteR   t   _main_exceptionsR   (   R%   R/   t   valuet   timeoutR8   R9   R:   R<   t   nkeyt   nvaluet   e(    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyR   e   s(    	&i   c   
      C@ sG  | d k r! |  j d t ƒ } n  | d k r< |  j j } n  |  j | | ƒ } |  j | d | d | ƒ} y | j | ƒ } Wn( t k
 r¦ } t	 d | d | ƒ ‚ n X| d k rÆ t
 d | ƒ ‚ n  t | t ƒ r÷ |  j | j ƒ  d | | ƒ}	 n |  j | d | | ƒ}	 |  j |	 | d | d | ƒ|  j | d | ƒ| | S(	   uh   
        Adds delta to the cache version for the supplied key. Returns the
        new version.
        R3   R8   R9   R=   R>   u   Key '%s' not foundRJ   N(   R   R7   R?   R   R8   R@   R   t   ttlRH   R   t
   ValueErrorR   R   t   original_keyR   RG   (
   R%   R/   t   deltaR8   R9   t   old_keyRI   RN   RM   t   new_key(    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   incr_version   s$    "c      
   C@ s%   |  j  | | | d | d | d t ƒS(   u“   
        Add a value to the cache, failing if the key already exists.

        Returns ``True`` if the object was added, ``False`` if not.
        R8   R9   R:   (   R   R?   (   R%   R/   RI   RJ   R8   R9   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   add­   s    c         C@ s‘   | d k r! |  j d t ƒ } n  |  j | d | ƒ} y | j | ƒ } Wn( t k
 rs } t d | d | ƒ ‚ n X| d k r„ | S|  j | ƒ S(   uv   
        Retrieve a value from the cache.

        Returns decoded value if key is found, the default if not.
        R3   R8   R=   R>   N(   R   R7   t   FalseR@   R   RH   R   t   decode(   R%   R/   t   defaultR8   R9   RI   RM   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyR   µ   s    c         C@ sY   | d  k r! |  j d t ƒ } n  |  j | d | ƒ} | j | ƒ rU | j | ƒ n  d  S(   NR3   R8   (   R   R7   R?   R@   t   existst   persist(   R%   R/   R8   R9   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyRZ   Ê   s
    c         C@ s\   | d  k r! |  j d t ƒ } n  |  j | d | ƒ} | j | ƒ rX | j | | ƒ n  d  S(   NR3   R8   (   R   R7   R?   R@   RY   t   expire(   R%   R/   RJ   R8   R9   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyR[   Ó   s
    gš™™™™™¹?c         C@ sU   | d  k r! |  j d t ƒ } n  |  j | d | ƒ} | j | d | d | d | ƒS(   NR3   R8   RJ   t   sleept   blocking_timeout(   R   R7   R?   R@   t   lock(   R%   R/   R8   RJ   R\   R]   R9   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyR^   Ü   s
    c         C@ sv   | d k r! |  j d t ƒ } n  y& | j |  j | d | d | ƒƒ SWn( t k
 rq } t d | d | ƒ ‚ n Xd S(   u.   
        Remove a key from the cache.
        R3   R8   t   prefixR=   R>   N(   R   R7   R?   RG   R@   RH   R   (   R%   R/   R8   R_   R9   RM   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyRG   å   s    c         C@ sª   | d k r! |  j d t ƒ } n  |  j | d | d | ƒ} y? d } x. | j | ƒ D] } | j | ƒ | d 7} qU W| SWn( t k
 r¥ } t d | d | ƒ ‚ n Xd S(	   u3   
        Remove all keys matching pattern.
        R3   R8   R_   i    i   R=   R>   N(   R   R7   R?   R@   t	   scan_iterRG   RH   R   (   R%   t   patternR8   R_   R9   t   countR/   RM   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   delete_patternò   s    c         C@ s“   | d k r! |  j d t ƒ } n  g  | D] } |  j | d | ƒ^ q( } | sS d Sy | j | Œ  SWn( t k
 rŽ } t d | d | ƒ ‚ n Xd S(   u/   
        Remove multiple keys at once.
        R3   R8   NR=   R>   (   R   R7   R?   R@   RG   RH   R   (   R%   t   keysR8   R9   t   kRM   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   delete_many  s    (c         C@ s   | d k r! |  j d t ƒ } n  y? d } x. | j d ƒ D] } | j | ƒ | d 7} q: W| SWn( t k
 rŠ } t d | d | ƒ ‚ n Xd S(   u'   
        Flush all cache keys.
        R3   i    u   *i   R=   R>   N(   R   R7   R?   R`   RG   RH   R   (   R%   R9   Rb   R/   RM   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   clear  s    c         C@ sj   y t  | ƒ } WnS t t f k
 re y |  j j | ƒ } Wn t k
 rO n X|  j j | ƒ } n X| S(   u)   
        Decode the given value.
        (   RF   RO   t	   TypeErrorR"   t
   decompressR   R!   t   loads(   R%   RI   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyRW   '  s    c         C@ sK   t  | t ƒ s t  | t ƒ rG |  j j | ƒ } |  j j | ƒ } | S| S(   u)   
        Encode the given value.
        (   R   t   boolR   R!   t   dumpsR"   t   compress(   R%   RI   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyRA   6  s
    c         C@ sü   | d k r! |  j d t ƒ } n  | s+ i  St ƒ  } g  | D] } |  j | d | ƒ^ q; } t t | | ƒ ƒ } y | j | Œ  } Wn( t k
 r® }	 t	 d | d |	 ƒ ‚ n XxF t | | ƒ D]5 \ }
 } | d k rÝ q¿ n  |  j
 | ƒ | | |
 <q¿ W| S(   u%   
        Retrieve many keys.
        R3   R8   R=   R>   N(   R   R7   RV   R   R@   t   dictt   zipt   mgetRH   R   RW   (   R%   Rd   R8   R9   t   recovered_dataRe   t   new_keyst   map_keyst   resultsRM   R/   RI   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   get_manyB  s     	(c   	   	   C@ s¦   | d k r! |  j d t ƒ } n  yV | j ƒ  } x9 | j ƒ  D]+ \ } } |  j | | | d | d | ƒq= W| j ƒ  Wn( t k
 r¡ } t d | d | ƒ ‚ n Xd S(   u"  
        Set a bunch of values in the cache at once from a dict of key/value
        pairs. This is much more efficient than calling set() multiple times.

        If timeout is given, that timeout will be used for the key; otherwise
        the default cache timeout will be used.
        R3   R8   R9   R=   R>   N(	   R   R7   R?   t   pipelinet   itemsR   t   executeRH   R   (	   R%   t   dataRJ   R8   R9   Rv   R/   RI   RM   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   set_many]  s    #c   	   	   C@ s-  | d  k r! |  j d t ƒ } n  |  j | d | ƒ} yÈ yA d } | j | d | | ƒ } | d  k ry t d | ƒ ‚ n  Wn€ t k
 rü | j | ƒ } | d k r¸ t d | ƒ ‚ n  |  j | d | d | ƒ| } |  j	 | | d | d | d | ƒn XWn( t
 k
 r(} t d	 | d
 | ƒ ‚ n X| S(   NR3   R8   uÜ   
                local exists = redis.call('EXISTS', KEYS[1])
                if (exists == 1) then
                    return redis.call('INCRBY', KEYS[1], ARGV[1])
                else return false end
                i   u   Key '%s' not foundiþÿÿÿR9   RJ   R=   R>   (   R   R7   R?   R@   t   evalRO   R	   RN   R   R   RH   R   (	   R%   R/   RQ   R8   R9   t   luaRI   RJ   RM   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   _incrp  s&    	c      	   C@ s"   |  j  d | d | d | d | ƒ S(   us   
        Add delta to value in the cache. If the key does not exist, raise a
        ValueError exception.
        R/   RQ   R8   R9   (   R}   (   R%   R/   RQ   R8   R9   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   incr™  s    c      	   C@ s#   |  j  d | d | d | d | ƒ S(   ux   
        Decreace delta to value in the cache. If the key does not exist, raise a
        ValueError exception.
        R/   RQ   R8   R9   (   R}   (   R%   R/   RQ   R8   R9   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   decr   s    c         C@ s   | d k r! |  j d t ƒ } n  |  j | d | ƒ} | j | ƒ sI d S| j | ƒ } | d k rh | S| d k rx d S| d k rˆ d Sd Sd S(   u“   
        Executes TTL redis command and return the "time-to-live" of specified key.
        If key is a non volatile key, it returns None.
        R3   R8   i    iÿÿÿÿiþÿÿÿN(   R   R7   RV   R@   RY   RN   (   R%   R/   R8   R9   t   t(    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyRN   ¨  s    c         C@ sv   | d k r! |  j d t ƒ } n  |  j | d | ƒ} y | j | ƒ SWn( t k
 rq } t d | d | ƒ ‚ n Xd S(   u%   
        Test if key exists.
        R3   R8   R=   R>   N(   R   R7   RV   R@   RY   RH   R   (   R%   R/   R8   R9   RM   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyR.   À  s    c         c@ sw   | d k r! |  j d t ƒ } n  |  j | d | ƒ} x: | j d | d | ƒ D]  } t | ƒ } |  j | ƒ VqO Wd S(   uo   
        Same as keys, but uses redis >= 2.8 cursors
        for make memory efficient keys iteration.
        R3   R8   t   matchRb   N(   R   R7   RV   R@   R`   R   R   (   R%   t   searcht   itersizeR9   R8   Ra   t   item(    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt	   iter_keysÎ  s    c         C@ s±   | d k r! |  j d t ƒ } n  |  j | d | ƒ} yL g  | j | ƒ D] } t | ƒ ^ qI } g  | D] } |  j | ƒ ^ qh SWn( t k
 r¬ } t d | d | ƒ ‚ n Xd S(   uÇ   
        Execute KEYS command and return matched results.
        Warning: this can return huge number of results, in
        this case, it strongly recommended use iter_keys
        for it.
        R3   R8   R=   R>   N(	   R   R7   RV   R@   Rd   R   R   RH   R   (   R%   R‚   R8   R9   Ra   Re   t   encoding_mapRM   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyRd   Ü  s    ($c         C@ se   t  | t ƒ r | S| d  k r. |  j j } n  | d  k rI |  j j } n  t |  j j | | | ƒ ƒ S(   N(   R   R   R   R   t
   key_prefixR8   t   key_func(   R%   R/   R8   R_   (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyR@   î  s    c         K@ sC   t  t d t ƒ r? x! |  j j j D] } | j ƒ  q" W|  ` n  d  S(   Nu   DJANGO_REDIS_CLOSE_CONNECTION(   t   getattrR   RV   R9   t   connection_poolt   _available_connectionst
   disconnectt   _client(   R%   t   kwargst   c(    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   closeú  s    N(#   t   __name__t
   __module__R-   R0   R?   R4   R7   R5   R   R   RV   R   RT   RU   R   RZ   R[   R^   RG   Rc   Rf   Rg   RW   RA   Ru   Rz   R}   R~   R   RN   R.   R…   Rd   R@   R   (    (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyR       s<   		( 					)($   t
   __future__R    R   R1   t   socketRB   t   zlibt   collectionsR   t   django.confR   t   django.core.cache.backends.baseR   R   t   django.core.exceptionsR   t   django.utils.encodingR   t   redis.exceptionsR   R	   R
   RJ   RH   t   ImportErrort   utilR   R   R   t
   exceptionsR   R   t    R   t   objectR   (    (    (    s=   /tmp/pip-unpacked-wheel-l0XfrS/django_redis/client/default.pyt   <module>   s(   