a
    xd(                     @   s   d dl 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 d
dlmZmZ G dd deZdS )    N)OrderedDict)datetime)Union)ConnectionError   )ConnectionInterrupted)HashRing)CacheKey   )DEFAULT_TIMEOUTDefaultClientc                       s  e Zd ZedejZ fddZdd ZdCddZ	d	d
 Z
dd Zeddf fdd	ZdD fdd	ZdEddZedddf fdd	ZedfddZdFddZdG fdd	ZdH fdd	ZdI fdd 	ZdJ fd!d"	ZdK fd#d$	ZdL fd%d&	ZdMeeef d' fd(d)ZdN fd,d-	ZdOd.d/ZdPd1d2ZdQ fd3d4	Z dR fd5d6	Z!dSd7d8Z"dTd9d:Z#dUd;d<Z$d=d> Z%eddf fd?d@	Z&dVdAdBZ'  Z(S )WShardClientz.*\{(.*)\}.*c                    sF   t  j|i | t| jttfs,| jg| _t| j| _|  | _	d S N)
super__init__
isinstance_serverlisttupler   _ringconnect_serverdictselfargskwargs	__class__ S/var/www/html/Ranjet/env/lib/python3.9/site-packages/django_redis/client/sharded.pyr      s
    
zShardClient.__init__c                 O   s   t d S r   NotImplementedErrorr   r   r   r   
get_client   s    zShardClient.get_clientr   c                 C   s$   i }| j D ]}| j|||< q
|S r   )r   connection_factoryr   )r   indexZconnection_dictnamer   r   r   r      s    
zShardClient.connectc                 C   sH   t |}| j|}|d ur8t| dkr8| d }| j|}|S )Nr   )str	_findhashmatchlengroupsr   Zget_node)r   _keykeygr%   r   r   r   get_server_name#   s    zShardClient.get_server_namec                 C   s   |  |}| j| S r   )r.   r   )r   r,   r%   r   r   r   
get_server+   s    
zShardClient.get_serverNc                    s6   |d u r | j ||d}| |}t j|||||dS )Nversion)r,   valuer1   clienttimeout)make_keyr/   r   add)r   r,   r2   r4   r1   r3   r   r   r   r6   /   s    

zShardClient.addc                    s4   |d u r | j ||d}| |}t j||||dS )Nr0   )r,   defaultr1   r3   )r5   r/   r   get)r   r,   r7   r1   r3   r   r   r   r8   8   s    
zShardClient.getc           	         sn   |si S t  } fdd|D }tt||}|D ]4} |} j||d}|d u r\q4|||| < q4|S )Nc                    s   g | ]} j |d qS r0   r5   .0r,   r   r1   r   r   
<listcomp>E       z(ShardClient.get_many.<locals>.<listcomp>r,   r1   r3   )r   dictzipr/   r8   )	r   keysr1   Zrecovered_dataZnew_keysZmap_keysr,   r3   r2   r   r=   r   get_many?   s    
zShardClient.get_manyFc                    s8   |du r | j ||d}| |}t j||||||dS )zT
        Persist a value to the cache, and set an optional expiration time.
        Nr0   )r,   r2   r4   r1   r3   nx)r5   r/   r   set)r   r,   r2   r4   r1   r3   rE   r   r   r   rF   R   s    
zShardClient.setc                 C   s(   |  D ]\}}| j||||d qdS )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.
        r0   N)itemsrF   )r   datar4   r1   r,   r2   r   r   r   set_many`   s    zShardClient.set_manyc              
   C   st   |du r | j ||d}| |}| j ||d}z||dkW S  tyn } zt|d|W Y d}~n
d}~0 0 dS )z%
        Test if key exists.
        Nr0   r
   
connection)r5   r/   existsr   r   )r   r,   r1   r3   er   r   r   has_keyk   s    
zShardClient.has_keyc                    s2   |d u r | j ||d}| |}t j|||dS Nr0   r@   )r5   r/   r   deleter   r,   r1   r3   r   r   r   rP   z   s    
zShardClient.deletec                    s2   |du r | j ||d}| |}t j|||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.
        Nr0   r@   )r5   r/   r   ttlrQ   r   r   r   rR      s    
zShardClient.ttlc                    s2   |du r | j ||d}| |}t j|||dS )z
        Executes PTTL redis command and return the "time-to-live" of specified key
        in milliseconds. If key is a non volatile key, it returns None.
        Nr0   r@   )r5   r/   r   pttlrQ   r   r   r   rS      s    
zShardClient.pttlc                    s2   |d u r | j ||d}| |}t j|||dS rO   )r5   r/   r   persistrQ   r   r   r   rT      s    
zShardClient.persistc                    s4   |d u r | j ||d}| |}t j||||dS Nr0   )r,   r4   r1   r3   )r5   r/   r   expirer   r,   r4   r1   r3   r   r   r   rV      s    
zShardClient.expirec                    s4   |d u r | j ||d}| |}t j||||dS rU   )r5   r/   r   pexpirerW   r   r   r   rX      s    
zShardClient.pexpire)whenc                    s4   |du r | j ||d}| |}t j||||dS )z
        Set an expire flag on a ``key`` to ``when`` on a shard client.
        ``when`` which can be represented as an integer indicating unix
        time or a Python datetime object.
        Nr0   )r,   rY   r1   r3   )r5   r/   r   	expire_at)r   r,   rY   r1   r3   r   r   r   rZ      s    
zShardClient.expire_at皙?Tc                    sF   |d u r | j ||d}| |}| j ||d}t j||||||dS )Nr0   )r4   sleepr3   blocking_timeoutthread_local)r5   r/   r   lock)r   r,   r1   r4   r\   r]   r3   r^   r   r   r   r_      s    
zShardClient.lockc                    s>   d} fdd|D D ] }  |}| j||d7 }q|S )z/
        Remove multiple keys at once.
        r   c                    s   g | ]} j |d qS r9   r:   r<   kr=   r   r   r>      r?   z+ShardClient.delete_many.<locals>.<listcomp>r3   )r/   rP   )r   rC   r1   resr,   r3   r   r=   r   delete_many   s
    
zShardClient.delete_manyr
   c           
   
   C   s  |d u r | j ||d}| |}|d u r0| jj}|  ||}| j|||d}z| j|||d}W n0 ty } zt|d|W Y d }~n
d }~0 0 |d u rtd| t	|t
r| j | || d}	n| j ||| d}	| j|	||| |	d | j||d || S )Nr0   )r1   r3   rJ   zKey '%s' not found)r4   r3   rb   )r5   r/   Z_backendr1   r8   rR   r   r   
ValueErrorr   r	   Zoriginal_keyrF   rP   )
r   r,   deltar1   r3   Zold_keyr2   rR   rM   Znew_keyr   r   r   incr_version   s&    
"
zShardClient.incr_versionc                    s4   |d u r | j ||d}| |}t j||||dS Nr0   )r,   rf   r1   r3   )r5   r/   r   incrr   r,   rf   r1   r3   r   r   r   ri      s    
zShardClient.incrc                    s4   |d u r | j ||d}| |}t j||||dS rh   )r5   r/   r   decrrj   r   r   r   rk      s    
zShardClient.decrc                 C   s   t dd S )Nz)iter_keys not supported on sharded clientr    )r   r,   r1   r   r   r   	iter_keys  s    zShardClient.iter_keysc           	   
      s    j ||d}g }z( j D ]\}}||| qW n: tyt } z" |}t|d|W Y d }~n
d }~0 0  fdd|D S )Nr0   rJ   c                    s   g | ]}  | qS r   )Zreverse_keydecoder`   r   r   r   r>     r?   z$ShardClient.keys.<locals>.<listcomp>)make_patternr   rG   extendrC   r   r/   r   )	r   searchr1   patternrC   serverrK   rM   r3   r   rn   r   rC   
  s    
"zShardClient.keysc                 C   s   | j |||d}d|i}|r$||d< g }| j D ](\}}	|dd |	jf i |D  q2d}
|r| j D ]\}}	|
|	j| 7 }
qn|
S )z3
        Remove all keys matching pattern.
        )r1   prefixr(   countc                 s   s   | ]
}|V  qd S r   r   r;   r   r   r   	<genexpr>$  r?   z-ShardClient.delete_pattern.<locals>.<genexpr>r   )ro   r   rG   rp   Z	scan_iterrP   )r   rr   r1   r3   Zitersizert   r   rC   rs   rK   rc   r   r   r   delete_pattern  s    "zShardClient.delete_patternc                 C   s    | j  D ]}| j|d q
d S )Nrb   )r   valuesZ
disconnect)r   r3   r   r   r   do_close_clients,  s    zShardClient.do_close_clientsc                    s4   |d u r | j ||d}| |}t j||||dS rU   )r5   r/   r   touchrW   r   r   r   rz   0  s    
zShardClient.touchc                 C   s   | j  D ]}|  q
d S r   )r   rx   Zflushdb)r   r3   rK   r   r   r   clear7  s    zShardClient.clear)r   )NNN)N)NN)NN)NN)NN)NN)NN)NN)NN)NNr[   NNT)N)r
   NN)r
   NN)r
   NN)N)N)NNNN)N))__name__
__module____qualname__recompileIr'   r   r"   r   r.   r/   r   r6   r8   rD   rF   rI   rN   rP   rR   rS   rT   rV   rX   r   r   intrZ   r_   rd   rg   ri   rk   rl   rC   rw   ry   rz   r{   __classcell__r   r   r   r   r      sL   	
	

      




 
r   )r   collectionsr   r   typingr   Zredis.exceptionsr   
exceptionsr   Z	hash_ringr   utilr	   r7   r   r   r   r   r   r   r   <module>   s   