o
    QDi>                     @   s   d dl Z d dl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
 d dlm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 G dd deZdS )    N)OrderedDict)Iterator)datetime)AnyOptionalUnion)Redis)ConnectionError)KeyT)DEFAULT_TIMEOUTDefaultClient)ConnectionInterrupted)HashRing)CacheKeyc                       s   e Zd ZedejZ fddZdd ZdgddZ	d	d
 Z
dd Zeddf fdd	Zdh fdd	ZdiddZeddddf fdd	ZeddfddZdjddZdj fdd	Zdj fdd	Zdj fdd 	Zdj fd!d"	Zdj fd#d$	Zdj fd%d&	Zdjd'eeef f fd(d)Zdjd'eeef f fd*d+Z			,			-dk fd.d/	Zdid0d1Zdld3d4Z dl fd5d6	Z!dl fd7d8	Z"did9d:Z#did;d<Z$	dmd=d>Z%d?d@ Z&eddf fdAdB	Z'didCdDZ(dddEdFe)dGe*dHe+e dIe+e, dJef
 fdKdLZ-		djdFe)dHe+e dIe+e, dJef fdMdNZ.		djdFe)dHe+e dIe+e, dJe/je* f fdOdPZ0		djdQe)dRe)dSe*dHe+e dIe+e, f
 fdTdUZ1dddEdFe)dHe+e dIe+e, dJef fdVdWZ2		X		dndFe)dYe+e3 dZe+e dHe+e dIe+e, dJe/je* f fd[d\Z4		X		dndFe)dYe+e3 dZe+e dHe+e dIe+e, dJe5e* f fd]d^Z6			dhdFe)dZe+e dHe+e dIe+e, dJee/je*f f
 fd_d`Z7		djdFe)dSe*dHe+e dIe+e, dJe8f
 fdadbZ9			dhdFe)dZe+e dHe+e dIe+e, dJee/je*f f
 fdcddZ:dddEdFe)dHe+e dIe+e, dJe;e8 f fdedfZ<  Z=S )o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__ T/var/www/Datamplify/venv/lib/python3.10/site-packages/django_redis/client/sharded.pyr      s
   
zShardClient.__init__c                 O   s   t 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   indexconnection_dictnamer!   r!   r"   r   !   s   
zShardClient.connectc                 C   sD   t |}| j|}|d urt| dkr| d }| j|S )Nr   )str	_findhashmatchlengroupsr   get_node)r   _keykeygr!   r!   r"   get_server_name'   s
   zShardClient.get_server_namec                 C   s   |  |}| j| S r   )r3   r   )r   r1   r)   r!   r!   r"   
get_server.   s   

zShardClient.get_serverNc                    s6   |d u r| j ||d}| |}t j|||||dS )Nversion)r1   valuer6   clienttimeout)make_keyr4   r   add)r   r1   r7   r9   r6   r8   r   r!   r"   r;   2   s   

zShardClient.addc                    4   |d u r| j ||d}| |}t j||||dS )Nr5   )r1   defaultr6   r8   )r:   r4   r   get)r   r1   r=   r6   r8   r   r!   r"   r>   ;      
zShardClient.getc           	         sn   |si S t  } fdd|D }tt||}|D ]} |} j||d}|d u r.q|||| < q|S )Nc                       g | ]	} j |d qS r5   r:   .0r1   r   r6   r!   r"   
<listcomp>H       z(ShardClient.get_many.<locals>.<listcomp>r1   r6   r8   )r   dictzipr4   r>   )	r   keysr6   recovered_datanew_keysmap_keysr1   r8   r7   r!   rE   r"   get_manyB   s   
zShardClient.get_manyFc              	      s:   |du r| j ||d}| |}t j|||||||dS )zT
        Persist a value to the cache, and set an optional expiration time.
        Nr5   )r1   r7   r9   r6   r8   nxxx)r:   r4   r   set)r   r1   r7   r9   r6   r8   rP   rQ   r   r!   r"   rR   U   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.
        r6   r8   N)itemsrR   )r   datar9   r6   r8   r1   r7   r!   r!   r"   set_manyp   s   zShardClient.set_manyc              
   C   sd   |du r| j ||d}| |}| j ||d}z||dkW S  ty1 } zt|d|d}~ww )z%
        Test if key exists.
        Nr5      
connection)r:   r4   existsRedisConnectionErrorr   )r   r1   r6   r8   er!   r!   r"   has_key{   s   
zShardClient.has_keyc                    2   |d u r| j ||d}| |}t j|||dS Nr5   rH   )r:   r4   r   deleter   r1   r6   r8   r   r!   r"   r`         
zShardClient.deletec                    2   |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.
        Nr5   rH   )r:   r4   r   ttlra   r   r!   r"   rd         
zShardClient.ttlc                    rc   )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.
        Nr5   rH   )r:   r4   r   pttlra   r   r!   r"   rf      re   zShardClient.pttlc                    r^   r_   )r:   r4   r   persistra   r   r!   r"   rg      rb   zShardClient.persistc                    r<   Nr5   )r1   r9   r6   r8   )r:   r4   r   expirer   r1   r9   r6   r8   r   r!   r"   ri      r?   zShardClient.expirec                    r<   rh   )r:   r4   r   pexpirerj   r   r!   r"   rk      r?   zShardClient.pexpirewhenc                    4   |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.
        Nr5   )r1   rl   r6   r8   )r:   r4   r   
pexpire_atr   r1   rl   r6   r8   r   r!   r"   ro         
zShardClient.pexpire_atc                    rm   rn   )r:   r4   r   	expire_atrp   r   r!   r"   rr      rq   zShardClient.expire_at皙?Tc                    sF   |d u r| j ||d}| |}| j ||d}t j||||||dS )Nr5   )r9   sleepr8   blocking_timeoutthread_local)r:   r4   r   lock)r   r1   r6   r9   rt   ru   r8   rv   r   r!   r"   rw      s   

zShardClient.lockc                    s>   d} fdd|D D ]}  |}| j||d7 }q|S )z/
        Remove multiple keys at once.
        r   c                    r@   rA   rB   rD   krE   r!   r"   rF      rG   z+ShardClient.delete_many.<locals>.<listcomp>r8   )r4   r`   )r   rK   r6   resr1   r8   r!   rE   r"   delete_many   s
   
zShardClient.delete_manyrW   c              
   C   s  |d u r| j ||d}| |}|d u r| jj}|  ||}| j|||d}z
| j|||d}W n tyB } zt|d|d }~ww |d u rQd| d}	t|	t	|t
rb| j | || d}
n	| j ||| d}
| j|
||| |
d | j||d || S )Nr5   rS   rX   zKey 'z' not found)r9   r8   rz   )r:   r4   _backendr6   r>   rd   r[   r   
ValueErrorr   r   original_keyrR   r`   )r   r1   deltar6   r8   old_keyr7   rd   r\   msgnew_keyr!   r!   r"   incr_version   s,   

zShardClient.incr_versionc                    r<   Nr5   )r1   r   r6   r8   )r:   r4   r   incrr   r1   r   r6   r8   r   r!   r"   r     r?   zShardClient.incrc                    r<   r   )r:   r4   r   decrr   r   r!   r"   r     r?   zShardClient.decrc                 C   s   d}t |)Nz)iter_keys not supported on sharded clientr#   )r   r1   r6   error_messager!   r!   r"   	iter_keys#  s   zShardClient.iter_keysc              
      sx    j ||d}g }z j D ]
}||| qW n ty2 } z |}t|d|d }~ww  fdd|D S )Nr5   rX   c                    s   g | ]	}  | qS r!   )reverse_keydecoderx   r   r!   r"   rF   2  rG   z$ShardClient.keys.<locals>.<listcomp>)make_patternr   valuesextendrK   r[   r4   r   )r   searchr6   patternrK   rY   r\   r8   r!   r   r"   rK   '  s   
zShardClient.keysc           
      C   s   | j |||d}d|i}|r||d< g }| j D ]}|dd |jdi |D  qd}	|r?| j D ]	}|	|j| 7 }	q5|	S )	z3
        Remove all keys matching pattern.
        )r6   prefixr,   countc                 s   s    | ]}|V  qd S r   r!   rC   r!   r!   r"   	<genexpr>A  s    z-ShardClient.delete_pattern.<locals>.<genexpr>r   Nr!   )r   r   r   r   	scan_iterr`   )
r   r   r6   r8   itersizer   r   rK   rY   r{   r!   r!   r"   delete_pattern4  s   "zShardClient.delete_patternc                 C   s    | j  D ]}| j|d qd S )Nrz   )r   r   
disconnect)r   r8   r!   r!   r"   do_close_clientsI  s   zShardClient.do_close_clientsc                    r<   rh   )r:   r4   r   touchrj   r   r!   r"   r   M  r?   zShardClient.touchc                 C   s   | j  D ]}|  qd S r   )r   r   flushdb)r   r8   rY   r!   r!   r"   clearT  s   
zShardClient.clearrS   r1   r   r6   r8   returnc                   <   |d u r| j ||d}| |}t j|g|R ||dS Nr5   rS   )r:   r4   r   sadd)r   r1   r6   r8   r   r   r!   r"   r   X     
zShardClient.saddc                    r^   r_   )r:   r4   r   scardra   r   r!   r"   r   d     
zShardClient.scardc                    r^   r_   )r:   r4   r   smembersra   r   r!   r"   r   o  r   zShardClient.smemberssourcedestinationmemberc                    sD   |d u r| j ||d}| |}| j ||d}t j|||||dS )Nr5   )r   r   r   r6   r8   )r:   r4   r   smove)r   r   r   r   r6   r8   r   r!   r"   r   z  s   
zShardClient.smovec                   r   r   )r:   r4   r   sremr   r1   r6   r8   membersr   r!   r"   r     r   zShardClient.srem
   r,   r   c                    6   |d u r| j ||d}| |}t j|||||dS Nr5   )r1   r,   r   r6   r8   )r:   r4   r   sscanr   r1   r,   r   r6   r8   r   r!   r"   r        

zShardClient.sscanc                    r   r   )r:   r4   r   
sscan_iterr   r   r!   r"   r     r   zShardClient.sscan_iterc                    r<   Nr5   )r1   r   r6   r8   )r:   r4   r   srandmemberr   r1   r   r6   r8   r   r!   r"   r        
zShardClient.srandmemberc                    r<   r   )r:   r4   r   	sismember)r   r1   r   r6   r8   r   r!   r"   r     r   zShardClient.sismemberc                    r<   r   )r:   r4   r   spopr   r   r!   r"   r     r   zShardClient.spopc                   r   r   )r:   r4   r   
smismemberr   r   r!   r"   r     r   zShardClient.smismember)r   )NNNr   )NN)NNrs   NNT)rW   NN)NNNN)Nr   NN)>__name__
__module____qualname__recompileIr+   r   r%   r   r3   r4   r   r;   r>   rO   rR   rV   r]   r`   rd   rf   rg   ri   rk   r   r   intro   rr   rw   r|   r   r   r   r   rK   r   r   r   r   r
   r   r   r   r   r   builtinsr   r   r   r*   r   r   r   r   boolr   r   r   r   __classcell__r!   r!   r   r"   r      sz   	
	








r   )r   r   collectionsr   collections.abcr   r   typingr   r   r   redisr   redis.exceptionsr	   r[   redis.typingr
   django_redis.client.defaultr   r   django_redis.exceptionsr   django_redis.hash_ringr   django_redis.utilr   r   r!   r!   r!   r"   <module>   s    