o
    QDi+                     @   sH  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mZ d dl	m
Z
 d dlmZmZmZmZ d dlmZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlm Z! d dl"m#Z#m$Z$m%Z%m&Z&m'Z' d dl(m)Z) d dl*m+Z+m,Z, d dl-m.Z. ee!eej/fZ0e1dZ2de3de3fddZ4G dd dZ5dS )    N)OrderedDict)IterableIterator)suppress)AnyOptionalUnioncast)settings)DEFAULT_TIMEOUT	BaseCacheget_key_func)ImproperlyConfigured)import_string)Redis)ConnectionError)ResponseError)TimeoutError)
AbsExpiryT
EncodableTExpiryTKeyTPatternT)pool)CompressorErrorConnectionInterrupted)CacheKeyz([*?[])sreturnc                 C   s   t d| S )Nz[\1])
special_resub)r    r!   T/var/www/Datamplify/venv/lib/python3.10/site-packages/django_redis/client/default.pyglob_escape'   s   r#   c                   @   sr
  e Zd Zdeeef deddfddZdede	fdd	Z
de	fd
dZ	dde	deee  defddZ		dde	deee  defddZ		dde	deee  deeef fddZddedefddZddedee ddfddZeddddfdededee dee dee d e	d!e	de	fd"d#Z	$		dded%edee dee def
d&d'Zeddfdededee dee dee de	fd(d)Z			dded*ee dee dee def
d+d,Z	ddedee dee de	fd-d.Z		ddededee dee de	f
d/d0Z		ddededee dee de	f
d1d2Z 		dded3e!dee dee de	f
d4d5Z"		dded3e!dee dee de	f
d6d7Z#			8				ddedee dee d9ed:e	d;ee dee d<e	fd=d>Z$			ddedee d?ee dee def
d@dAZ%				ddBedee d?ee dee dCee defdDdEZ&		ddFe'e dee dee defdGdHZ(ddee ddfdIdJZ)dedefdKdLZ*dede+e,ef fdMdNZ-	ddOedPe	de+ee def fdQdRZ.		ddFe'e dee dee de/fdSdTZ0eddfdUeeef dee dee dee ddf
dVdWZ1	$			dded%edee dee dXe	defdYdZZ2	$			dded%edee dee dXe	defd[d\Z3	$		dded%edee dee def
d]d^Z4	ddedee dee dee fd_d`Z5	ddedee dee dee fdadbZ6	ddedee dee de	fdcddZ7			ddeedCee dee dee de8e f
dfdgZ9	ddeedee dee dee fdhdiZ:	ddedee d?ee defdjdkZ;	ddBedee d?ee defdldmZ<dddndedoedee dee def
dpdqZ=		ddedee dee defdrdsZ>dddndFedee dee de?je fdtduZ@ddddvdwedFedxee dyee dee defdzd{ZAdddndFedee dee de?je fd|d}ZBdddndwedFedee dee def
d~dZCdddndedee dee dee	 fddZD		ddededee dee de	f
ddZE		ddedee dee de?je fddZF		ddedededee dee de	fddZG			ddedee dee dee de+e?jef f
ddZH			ddedee dee dee de+eef f
ddZIdddndededee dee def
ddZJ				ddedee dee dee dee de?je fddZK				ddedee dee dee dee de8e fddZLdddndFedee dee de?je fddZMdddndedFedee dee def
ddZNdddZOdddZPeddfdedee dee dee de	f
ddZQ		ddedededee dee defddZR		ddededee dee def
ddZS	ddedee defddZT	ddedee dee fddZU		ddededee dee de	f
ddZVdS )DefaultClientparamsbackendr   Nc           	      C   s   || _ || _|| _t|dpd| _| jsd}t|t| jtt	t
fs,| jd| _d gt| j | _|di | _| jdd| _| jdd	}t|}| jd
d}t|}|| jd| _|| jd| _tj| jd| _d S )NREVERSE_KEY_FUNCTIONz%django_redis.util.default_reverse_keyzMissing connections string,OPTIONSREPLICA_READ_ONLYT
SERIALIZERz0django_redis.serializers.pickle.PickleSerializer
COMPRESSOR4django_redis.compressors.identity.IdentityCompressor)options)_backend_server_paramsr   getreverse_keyr   
isinstancelisttuplesetsplitlen_clients_options_replica_read_onlyr   _serializer_compressorr   get_connection_factoryconnection_factory)	selfserverr%   r&   error_messageserializer_pathserializer_clscompressor_pathcompressor_clsr!   r!   r"   __init__,   s4   
zDefaultClient.__init__keyc                 C   s
   |  |S N)has_key)rA   rI   r!   r!   r"   __contains__P   s   
zDefaultClient.__contains__c                 C   s   | j dddkS )Nr,   r-   )r;   r2   rA   r!   r!   r"   _has_compression_enabledS   s   z&DefaultClient._has_compression_enabledTwritetriedc                    sv    du rg   r%t  t | jk r% fddtdt | jD }t|S |s.t | jdkr0dS tdt | jd S )z
        Return a next index for read client. This function implements a default
        behavior for get a next read client for a replication setup.

        Overwrite this function if you want a specific
        behavior.
        Nc                    s   g | ]}| vr|qS r!   r!   ).0irP   r!   r"   
<listcomp>i   s    z7DefaultClient.get_next_client_index.<locals>.<listcomp>r      )r9   r0   rangerandomchoicerandint)rA   rO   rP   	not_triedr!   rS   r"   get_next_client_index[   s   

z#DefaultClient.get_next_client_indexc                 C   s6   | j ||d}| j| du r| || j|< | j| S z
        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.
        rO   rP   Nr[   r:   connectrA   rO   rP   indexr!   r!   r"   
get_clientq   s   
zDefaultClient.get_clientc                 C   s:   | j ||d}| j| du r| || j|< | j| |fS r\   r^   r`   r!   r!   r"   get_client_with_index   s   z#DefaultClient.get_client_with_indexr   ra   c                 C   s   | j | j| S )z
        Given a connection index, returns a new raw redis client/connection
        instance. Index is used for replication setups and indicates that
        connection string should be used. In normal setups, index is 0.
        )r@   r_   r0   )rA   ra   r!   r!   r"   r_      s   zDefaultClient.connectclientc                 C   s.   |du r	| j | }|dur| j| dS dS )zK
        delegates the connection factory to disconnect the client
        N)r:   r@   
disconnect)rA   ra   rd   r!   r!   r"   re      s
   
zDefaultClient.disconnectFvaluetimeoutversionnxxxc              
   C   s  | j ||d}| |}	|tu r| jj}|}
g }	 z?|du r'| jd|d\}}|durLt|d }|dkrL|rA| j|||d W S t| j	|||dW S t|j
||	|||d	W S  ty } z!|
s{| js{t|t| jk r{|| d}W Y d}~qt|d
|d}~ww )z
        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.
        rh   TNr]     r   rh   rd   )rd   rh   )ri   pxrj   
connection)make_keyencoder   r/   default_timeoutrc   intrK   booldeleter7   _main_exceptionsr<   r9   r0   appendr   )rA   rI   rf   rg   rh   rd   ri   rj   nkeynvalueoriginal_clientrP   ra   er!   r!   r"   r7      s:   

zDefaultClient.setrU   deltac              
   C   s   |du r
| j dd}|du r| jj}| ||}| j|||d}z
| j|||d}W n ty< } zt|d|d}~ww |du rKd|d}	t|	t	|t
r\| j| || d}
n	| j||| d}
| j|
|||d	 | j||d
 || S )zh
        Adds delta to the cache version for the supplied key. Returns the
        new version.
        NTrO   rm   ro   Key '' not foundrk   )rg   rd   )rd   )rb   r/   rh   rq   r2   ttlrw   r   
ValueErrorr4   r   original_keyr7   rv   )rA   rI   r}   rh   rd   old_keyrf   r   r|   rC   new_keyr!   r!   r"   incr_version   s*   
zDefaultClient.incr_versionc                 C   s   | j |||||ddS )z
        Add a value to the cache, failing if the key already exists.

        Returns ``True`` if the object was added, ``False`` if not.
        T)rh   rd   ri   )r7   )rA   rI   rf   rg   rh   rd   r!   r!   r"   add	  s   zDefaultClient.adddefaultc              
   C   sl   |du r
| j dd}| j||d}z||}W n ty* } zt|d|d}~ww |du r1|S | |S )zv
        Retrieve a value from the cache.

        Returns decoded value if key is found, the default if not.
        NFr~   rk   ro   )rb   rq   r2   rw   r   decode)rA   rI   r   rh   rd   rf   r|   r!   r!   r"   r2     s   
zDefaultClient.getc                 C   s,   |d u r
| j dd}| j||d}||S NTr~   rk   )rb   rq   persistrA   rI   rh   rd   r!   r!   r"   r   3  s   
zDefaultClient.persistc                 C   s>   |t u r| jj}|d u r| jdd}| j||d}|||S r   )r   r/   rs   rb   rq   expirerA   rI   rg   rh   rd   r!   r!   r"   r   =  s   zDefaultClient.expirec                 C   sB   |t u r| jj}|d u r| jdd}| j||d}t|||S r   )r   r/   rs   rb   rq   ru   pexpirer   r!   r!   r"   r   N  s   zDefaultClient.pexpirewhenc                 C   s2   |du r
| j dd}| j||d}t|||S z
        Set an expire flag on a ``key`` to ``when``, which can be represented
        as an integer indicating unix time or a Python datetime object.
        NTr~   rk   )rb   rq   ru   	pexpireatrA   rI   r   rh   rd   r!   r!   r"   
pexpire_at_  s   zDefaultClient.pexpire_atc                 C   s.   |du r
| j dd}| j||d}|||S r   )rb   rq   expireatr   r!   r!   r"   	expire_atq  s   zDefaultClient.expire_at皙?sleepblockingblocking_timeoutthread_localc	           	      C   s8   |d u r
| j dd}| j||d}|j||||||dS )NTr~   rk   )rg   r   r   r   r   )rb   rq   lock)	rA   rI   rh   rg   r   r   r   rd   r   r!   r!   r"   r     s   zDefaultClient.lockprefixc              
   C   sR   |du r
| j dd}z|| j|||dW S  ty( } zt|d|d}~ww )z.
        Remove a key from the cache.
        NTr~   rh   r   ro   )rb   rv   rq   rw   r   )rA   rI   rh   r   rd   r|   r!   r!   r"   rv     s   
zDefaultClient.deletepatternitersizec           
   
   C   s   |du r
| j dd}| j|||d}z d}| }|j||dD ]}|| |d7 }q |  |W S  tyD }	 zt|d|	d}	~	ww )	z3
        Remove all keys matching pattern.
        NTr~   r   r   matchcountrU   ro   )rb   make_patternpipeline	scan_iterrv   executerw   r   )
rA   r   rh   r   rd   r   r   r   rI   r|   r!   r!   r"   delete_pattern  s   

zDefaultClient.delete_patternkeysc              
      sb   |du r
 j dd} fdd|D }|sdS z|j| W S  ty0 } zt|d|d}~ww )z/
        Remove multiple keys at once.
        NTr~   c                       g | ]	} j |d qS rk   rq   rQ   krA   rh   r!   r"   rT         z-DefaultClient.delete_many.<locals>.<listcomp>r   ro   )rb   rv   rw   r   )rA   r   rh   rd   r|   r!   r   r"   delete_many  s   
zDefaultClient.delete_manyc              
   C   sH   |du r
| j dd}z|  W dS  ty# } zt|d|d}~ww )z'
        Flush all cache keys.
        NTr~   ro   )rb   flushdbrw   r   )rA   rd   r|   r!   r!   r"   clear  s   zDefaultClient.clearc                 C   sh   zt |}W |S  ttfy3   tt | j|}W d   n1 s%w   Y  | j|}Y |S w )z)
        Decode the given value.
        N)	rt   r   	TypeErrorr   r   r>   
decompressr=   loadsrA   rf   r!   r!   r"   r     s   

zDefaultClient.decodec                 C   s0   t |ts
t |ts| j|}| j|S |S )z)
        Encode the given value.
        )r4   ru   rt   r=   dumpsr>   compressr   r!   r!   r"   rr     s   zDefaultClient.encoderesultcovert_to_setc                    sH   |d u rd S t |tr|r fdd|D S  fdd|D S  |S )Nc                       h | ]}  |qS r!   r   rQ   rf   rM   r!   r"   	<setcomp>      z8DefaultClient._decode_iterable_result.<locals>.<setcomp>c                       g | ]}  |qS r!   r   r   rM   r!   r"   rT     r   z9DefaultClient._decode_iterable_result.<locals>.<listcomp>)r4   r5   r   )rA   r   r   r!   rM   r"   _decode_iterable_result  s   

z%DefaultClient._decode_iterable_resultc           
   
      s   |du r
 j dd}|st S t }t fdd|D }z|j| }W n ty7 } zt|d|d}~ww t||D ]\}}	|	du rFq= |	||| < q=|S )z%
        Retrieve many keys.
        NFr~   c                 3   s"    | ]} j |d |fV  qdS )rk   Nr   r   r   r!   r"   	<genexpr>$  s     z)DefaultClient.get_many.<locals>.<genexpr>ro   )rb   r   mgetrw   r   zipr   )
rA   r   rh   rd   recovered_datamap_keysresultsr|   rI   rf   r!   r   r"   get_many  s"   
zDefaultClient.get_manydatac           	   
   C   sv   |du r
| j dd}z| }| D ]\}}| j|||||d q|  W dS  ty: } zt|d|d}~ww )a"  
        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.
        NTr~   rm   ro   )rb   r   itemsr7   r   rw   r   )	rA   r   rg   rh   rd   r   rI   rf   r|   r!   r!   r"   set_many1  s   zDefaultClient.set_manyignore_key_checkc              
   C   s
  |d u r
| j dd}| j||d}zaz!|sd}nd}||d||}|d u r0d|d}t|W W |S  tyr }	 z3| j|||d	}
|
d
krRd|d}t||	| j|||d	| }| j||||
|d W Y d }	~	W |S d }	~	ww  ty }	 zt	|d|	d }	~	ww )NTr~   rk   z
                    local exists = redis.call('EXISTS', KEYS[1])
                    if (exists == 1) then
                        return redis.call('INCRBY', KEYS[1], ARGV[1])
                    else return false end
                    zW
                    return redis.call('INCRBY', KEYS[1], ARGV[1])
                    rU   r   r   rm   )rh   rg   rd   ro   )
rb   rq   evalr   r   r   r2   r7   rw   r   )rA   rI   r}   rh   rd   r   luarf   rC   r|   rg   r!   r!   r"   _incrJ  s8   
 zDefaultClient._incrc                 C   s   | j |||||dS )z
        Add delta to value in the cache. If the key does not exist, raise a
        ValueError exception. if ignore_key_check=True then the key will be
        created and set to the delta value by default.
        )rI   r}   rh   rd   r   r   )rA   rI   r}   rh   rd   r   r!   r!   r"   incr  s   zDefaultClient.incrc                 C   s   | j || ||dS )zx
        Decreace delta to value in the cache. If the key does not exist, raise a
        ValueError exception.
        )rI   r}   rh   rd   r   )rA   rI   r}   rh   rd   r!   r!   r"   decr  s   zDefaultClient.decrc                 C   b   |du r
| j dd}| j||d}||sdS ||}|dkr#|S |dkr)dS |dkr/dS dS )z
        Executes TTL redis command and return the "time-to-live" of specified key.
        If key is a non volatile key, it returns None.
        NFr~   rk   r   r   )rb   rq   existsr   rA   rI   rh   rd   tr!   r!   r"   r        

zDefaultClient.ttlc                 C   r   )z
        Executes PTTL redis command and return the "time-to-live" of specified key.
        If key is a non volatile key, it returns None.
        NFr~   rk   r   r   r   )rb   rq   r   pttlr   r!   r!   r"   r     r   zDefaultClient.pttlc              
   C   sX   |du r
| j dd}| j||d}z||dkW S  ty+ } zt|d|d}~ww )z%
        Test if key exists.
        NFr~   rk   rU   ro   )rb   rq   r   rw   r   )rA   rI   rh   rd   r|   r!   r!   r"   rK     s   zDefaultClient.has_keysearchc                 c   sL    |du r| j dd}| j||d}|j||dD ]
}| | V  qdS )zo
        Same as keys, but uses redis >= 2.8 cursors
        for make memory efficient keys iteration.
        NFr~   rk   r   )rb   r   r   r3   r   )rA   r   r   rd   rh   r   itemr!   r!   r"   	iter_keys  s   zDefaultClient.iter_keysc              
      sb   |du r
 j dd} j||d}z fdd||D W S  ty0 } zt|d|d}~ww )z
        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.
        NFr~   rk   c                       g | ]	}  | qS r!   r3   r   r   rM   r!   r"   rT     r   z&DefaultClient.keys.<locals>.<listcomp>ro   )rb   r   r   rw   r   )rA   r   rh   rd   r   r|   r!   rM   r"   r     s   
zDefaultClient.keysc                 C   sB   t |tr|S |d u r| jj}|d u r| jj}t| j|||S rJ   )r4   r   r/   
key_prefixrh   key_func)rA   rI   rh   r   r!   r!   r"   rq     s   
zDefaultClient.make_keyc                 C   sV   t |tr|S |d u r| jj}t|}|d u r| jj}tt|}t| j|||S rJ   )r4   r   r/   r   r#   rh   strr   )rA   r   rh   r   version_strr!   r!   r"   r     s   
zDefaultClient.make_patternrm   valuesc                   J   |d u r
 j dd} j||d} fdd|D }t|j|g|R  S )NTr~   rk   c                    r   r!   rr   r   rM   r!   r"   rT   5  r   z&DefaultClient.sadd.<locals>.<listcomp>)rb   rq   rt   sadd)rA   rI   rh   rd   r   encoded_valuesr!   rM   r"   r   *  
   zDefaultClient.saddc                 C   s0   |d u r
| j dd}| j||d}t||S NFr~   rk   )rb   rq   rt   scardr   r!   r!   r"   r   8  s   zDefaultClient.scardc                   @   |d u r
 j dd} fdd|D } fdd|j| D S )NFr~   c                    r   r   r   rQ   rI   r   r!   r"   rT   M  r   z'DefaultClient.sdiff.<locals>.<listcomp>c                    r   r!   r   r   rM   r!   r"   r   N  r   z&DefaultClient.sdiff.<locals>.<setcomp>)rb   sdiffrA   rh   rd   r   nkeysr!   r   r"   r   D     zDefaultClient.sdiff)version_destversion_keysrd   destr   r   c                   sL   |d u r
 j dd} j||d} fdd|D }t|j|g|R  S )NTr~   rk   c                    r   r   r   r   rA   r   r!   r"   rT   \  r   z,DefaultClient.sdiffstore.<locals>.<listcomp>)rb   rq   rt   
sdiffstore)rA   r   r   r   rd   r   r   r!   r   r"   r   P  s
   zDefaultClient.sdiffstorec                   r   )NFr~   c                    r   r   r   r   r   r!   r"   rT   h  r   z(DefaultClient.sinter.<locals>.<listcomp>c                    r   r!   r   r   rM   r!   r"   r   i  r   z'DefaultClient.sinter.<locals>.<setcomp>)rb   sinterr   r!   r   r"   r   _  r   zDefaultClient.sinterc                   L   |d u r
 j dd} j|d} fdd|D }t|j|g|R  S )NTr~   rk   c                    r   r   r   r   r   r!   r"   rT   v  r   z-DefaultClient.sinterstore.<locals>.<listcomp>)rb   rq   rt   sinterstore)rA   r   rh   rd   r   r   r!   r   r"   r   k  
   zDefaultClient.sinterstorec                   sP   |d u r
 j dd} j||d} fdd|D }dd |j|g|R  D S )NFr~   rk   c                    r   r!   r   rQ   memberrM   r!   r"   rT     r   z,DefaultClient.smismember.<locals>.<listcomp>c                 S   s   g | ]}t |qS r!   )ru   r   r!   r!   r"   rT     s    )rb   rq   
smismember)rA   rI   rh   rd   membersencoded_membersr!   rM   r"   r   y  s
   zDefaultClient.smismemberr   c                 C   s<   |d u r
| j dd}| j||d}| |}t|||S r   )rb   rq   rr   ru   	sismember)rA   rI   r   rh   rd   r!   r!   r"   r    s
   
zDefaultClient.sismemberc                    s:   |d u r
 j dd} j||d} fdd||D S )NFr~   rk   c                    r   r!   r   r   rM   r!   r"   r     r   z)DefaultClient.smembers.<locals>.<setcomp>)rb   rq   smembersr   r!   rM   r"   r    s   zDefaultClient.smemberssourcedestinationc                 C   sH   |d u r
| j dd}| j||d}| |}| |}t||||S r   )rb   rq   rr   ru   smove)rA   r  r  r   rh   rd   r!   r!   r"   r    s   

zDefaultClient.smover   c                 C   s8   |d u r
| j dd}| j||d}|||}| |S r   )rb   rq   spopr   )rA   rI   r   rh   rd   ry   r   r!   r!   r"   r    s
   
zDefaultClient.spopc                 C   s<   |d u r
| j dd}| j||d}|||}| j|ddS )NFr~   rk   )r   )rb   rq   srandmemberr   )rA   rI   r   rh   rd   r   r!   r!   r"   r    s
   zDefaultClient.srandmemberr   c                   r   )NTr~   rk   c                    r   r!   r   r   rM   r!   r"   rT     r   z&DefaultClient.srem.<locals>.<listcomp>)rb   rq   rt   srem)rA   rI   rh   rd   r   nmembersr!   rM   r"   r    r   zDefaultClient.srem
   r   c           	         st      r|rd}t||d u r jdd} j||d}|j||r*td |nd |d\}} fdd|D S )	N.Using match with compression is not supported.Fr~   rk   r   r   c                    r   r!   r   r   rM   r!   r"   r     r   z&DefaultClient.sscan.<locals>.<setcomp>)rN   r   rb   rq   sscanr	   rr   )	rA   rI   r   r   rh   rd   err_msgcursorr   r!   rM   r"   r    s   
zDefaultClient.sscanc                 c   sv    |   r|rd}t||d u r| jdd}| j||d}|j||r+td| |nd |dD ]}| |V  q0d S )Nr  Fr~   rk   r   r   )rN   r   rb   rq   
sscan_iterr	   rr   r   )rA   rI   r   r   rh   rd   r  rf   r!   r!   r"   r    s   
zDefaultClient.sscan_iterc                   r   )NFr~   c                    r   r   r   r   r   r!   r"   rT     r   z(DefaultClient.sunion.<locals>.<listcomp>c                    r   r!   r   r   rM   r!   r"   r     r   z'DefaultClient.sunion.<locals>.<setcomp>)rb   sunionr   r!   r   r"   r    r   zDefaultClient.sunionc                   r   )NTr~   rk   c                    r   r   r   r   r   r!   r"   rT   "  r   z-DefaultClient.sunionstore.<locals>.<listcomp>)rb   rq   rt   sunionstore)rA   r  rh   rd   r   encoded_keysr!   r   r"   r    r   zDefaultClient.sunionstorec                 C   s*   | j dttdd}|r|   d S d S )NCLOSE_CONNECTIONDJANGO_REDIS_CLOSE_CONNECTIONF)r;   r2   getattrr
   do_close_clients)rA   
close_flagr!   r!   r"   close%  s   
zDefaultClient.closec                 C   s4   t | j}t|D ]}| j|d q	dg| | _dS )zC
        default implementation: Override in custom client
        )ra   N)r9   r:   rV   re   )rA   num_clientsidxr!   r!   r"   r  -  s   
zDefaultClient.do_close_clientsc                 C   sd   |t u r| jj}|du r| jdd}| j||d}|du r$t||S t|d }t|||S )z2
        Sets a new expiration for a key.
        NTr~   rk   rl   )	r   r/   rs   rb   rq   ru   r   rt   r   r   r!   r!   r"   touch6  s   zDefaultClient.touchnamec                 C   s>   |du r
| j dd}| j||d}| |}t||||S )zu
        Set the value of hash name at key to value.
        Returns the number of fields added to the hash.
        NTr~   rk   )rb   rq   rr   rt   hset)rA   r  rI   rf   rh   rd   ry   rz   r!   r!   r"   r  O  s
   
zDefaultClient.hsetc                 C   2   |du r
| j dd}| j||d}t|||S )zi
        Remove keys from hash name.
        Returns the number of fields deleted from the hash.
        NTr~   rk   )rb   rq   rt   hdelrA   r  rI   rh   rd   ry   r!   r!   r"   r  a  s   zDefaultClient.hdelc                 C   s"   |du r
| j dd}t||S )z:
        Return the number of items in hash name.
        NFr~   )rb   rt   hlen)rA   r  rd   r!   r!   r"   r!  q  s   zDefaultClient.hlenc              
      sT   |du r
 j dd}z fdd||D W S  ty) } zt|d|d}~ww )z5
        Return a list of keys in hash name.
        NFr~   c                    r   r!   r   r   rM   r!   r"   rT     r   z'DefaultClient.hkeys.<locals>.<listcomp>ro   )rb   hkeysrw   r   )rA   r  rd   r|   r!   rM   r"   r"  }  s   zDefaultClient.hkeysc                 C   r  )zE
        Return True if key exists in hash name, else False.
        NFr~   rk   )rb   rq   ru   hexistsr   r!   r!   r"   r#    s   
zDefaultClient.hexists)TN)r   )r   N)rU   NN)NNN)NN)NNr   TNNT)NNNNrJ   )T)rU   NNF)Nr
  NN)r   N)W__name__
__module____qualname__dictr   r   r   rH   r   ru   rL   rN   r   r5   rt   r[   r   rb   r6   rc   r_   re   r   r   floatr7   r   r   r2   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   bytesrr   r   r   r   r   r   r   r   r   r   rK   r   r   r   rq   r   r   r   builtinsr   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r"  r#  r!   r!   r!   r"   r$   +   sR   $	






	
<
+






	


!


"


9

































r$   )6r*  rW   resocketcollectionsr   collections.abcr   r   
contextlibr   typingr   r   r   r	   django.confr
   django.core.cache.backends.baser   r   r   django.core.exceptionsr   django.utils.module_loadingr   redisr   redis.exceptionsr   RedisConnectionErrorr   r   RedisTimeoutErrorredis.typingr   r   r   r   r   django_redisr   django_redis.exceptionsr   r   django_redis.utilr   rg   rw   compiler   r   r#   r$   r!   r!   r!   r"   <module>   s8    
