
    0WRi>                         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e      Zy)    N)OrderedDict)Iterator)datetime)AnyOptionalUnion)Redis)ConnectionError)KeyT)DEFAULT_TIMEOUTDefaultClient)ConnectionInterrupted)HashRing)CacheKeyc                       e Zd Z ej                  dej
                        Z fdZd Zd9dZ	d Z
d Zeddf fd	Zd: fd		Zd;d
Zeddddf fd	ZeddfdZd<dZd< fd	Zd< fd	Zd< fd	Zd< fd	Zd< fd	Zd< fd	Zd<deeef   f fdZd<deeef   f fdZ	 	 	 	 	 	 d= fd	Zd;dZd>dZ d> fd	Z!d> fd	Z"d;dZ#d;dZ$	 d?dZ%d  Z&eddf fd!	Z'd;d"Z(ddd#d$e)d%e*d&e+e   d'e+e,   d(ef
 fd)Z-	 	 d<d$e)d&e+e   d'e+e,   d(ef fd*Z.	 	 d<d$e)d&e+e   d'e+e,   d(e/j                   e*   f fd+Z0	 	 d<d,e)d-e)d.e*d&e+e   d'e+e,   f
 fd/Z1ddd#d$e)d&e+e   d'e+e,   d(ef fd0Z2	 	 	 	 d@d$e)d1e+e3   d2e+e   d&e+e   d'e+e,   d(e/j                   e*   f fd3Z4	 	 	 	 d@d$e)d1e+e3   d2e+e   d&e+e   d'e+e,   d(e5e*   f fd4Z6	 	 	 d:d$e)d2e+e   d&e+e   d'e+e,   d(ee/j                   e*f   f
 fd5Z7	 	 d<d$e)d.e*d&e+e   d'e+e,   d(e8f
 fd6Z9	 	 	 d:d$e)d2e+e   d&e+e   d'e+e,   d(ee/j                   e*f   f
 fd7Z:ddd#d$e)d&e+e   d'e+e,   d(e;e8   f fd8Z< xZ=S )AShardClientz.*\{(.*)\}.*c                     t        |   |i | t        | j                  t        t
        f      s| j                  g| _        t        | j                        | _        | j                         | _	        y N)
super__init__
isinstance_serverlisttupler   _ringconnect_serverdict)selfargskwargs	__class__s      y/var/www/html/navyabakers_fullstack/navyabakers_prod/venv_new/lib/python3.12/site-packages/django_redis/client/sharded.pyr   zShardClient.__init__   sR    $)&)$,,u6 LL>DLdll+
<<>    c                     t         r   NotImplementedError)r   r   r    s      r"   
get_clientzShardClient.get_client   s    !!r#   c                 h    i }| j                   D ]   }| j                  j                  |      ||<   " |S r   )r   connection_factoryr   )r   indexconnection_dictnames       r"   r   zShardClient.connect!   s=    LL 	JD$($;$;$C$CD$IOD!	Jr#   c                     t        |      }| j                  j                  |      }|/t        |j	                               dkD  r|j	                         d   }| j
                  j                  |      S )Nr   )str	_findhashmatchlengroupsr   get_node)r   _keykeygs       r"   get_server_namezShardClient.get_server_name'   sY    $iNN  %=S_q0((*Q-Czz""3''r#   c                 B    | j                  |      }| j                  |   S r   )r7   r   )r   r5   r,   s      r"   
get_serverzShardClient.get_server.   s#    ##C(%%r#   Nc                 x    |$| j                  ||      }| j                  |      }t        |   |||||      S )Nversion)r5   valuer<   clienttimeout)make_keyr9   r   add)r   r5   r=   r?   r<   r>   r!   s         r"   rA   zShardClient.add2   sI    >--W-5C__S)Fw{5'&'  
 	
r#   c                 v    |$| j                  ||      }| j                  |      }t        |   ||||      S )Nr;   )r5   defaultr<   r>   )r@   r9   r   get)r   r5   rC   r<   r>   r!   s        r"   rD   zShardClient.get;   s?    >--W-5C__S)Fw{sGWV{TTr#   c                    |si S t               }|D cg c]  }| j                  ||       }}t        t        ||            }|D ]2  }| j	                  |      }| j                  |||      }|+||||   <   4 |S c c}w Nr;   r5   r<   r>   )r   r@   dictzipr9   rD   )	r   keysr<   recovered_datar5   new_keysmap_keysr>   r=   s	            r"   get_manyzShardClient.get_manyB   s    I$CGHCDMM#wM7HHHd+, 	2C__S)FHHgfHEE},1N8C=)	2  Is   A=Fc           	      |    |$| j                  ||      }| j                  |      }t        |   |||||||      S )zT
        Persist a value to the cache, and set an optional expiration time.
        r;   )r5   r=   r?   r<   r>   nxxx)r@   r9   r   set)	r   r5   r=   r?   r<   r>   rP   rQ   r!   s	           r"   rR   zShardClient.setU   sU     >--W-5C__S)Fw{  
 	
r#   c                 `    |j                         D ]  \  }}| j                  |||||        y)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.
        r<   r>   N)itemsrR   )r   datar?   r<   r>   r5   r=   s          r"   set_manyzShardClient.set_manyp   s5     **, 	JJCHHS%'&HI	Jr#   c                     |$| j                  ||      }| j                  |      }| j                  ||      }	 |j                  |      dk(  S # t        $ r}t	        |      |d}~ww xY w)z%
        Test if key exists.
        Nr;      
connection)r@   r9   existsRedisConnectionErrorr   )r   r5   r<   r>   es        r"   has_keyzShardClient.has_key{   st    
 >--W-5C__S)FmmCm1	B==%**# 	B'6:A	Bs   A 	A*A%%A*c                 t    |$| j                  ||      }| j                  |      }t        |   |||      S rF   )r@   r9   r   deleter   r5   r<   r>   r!   s       r"   ra   zShardClient.delete   s=    >--W-5C__S)Fw~#wv~FFr#   c                 t    |$| j                  ||      }| j                  |      }t        |   |||      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.
        r;   rG   )r@   r9   r   ttlrb   s       r"   rd   zShardClient.ttl   s?     >--W-5C__S)Fw{sGF{CCr#   c                 t    |$| j                  ||      }| j                  |      }t        |   |||      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.
        r;   rG   )r@   r9   r   pttlrb   s       r"   rf   zShardClient.pttl   s?     >--W-5C__S)Fw|WV|DDr#   c                 t    |$| j                  ||      }| j                  |      }t        |   |||      S rF   )r@   r9   r   persistrb   s       r"   rh   zShardClient.persist   s=    >--W-5C__S)Fw3GGr#   c                 v    |$| j                  ||      }| j                  |      }t        |   ||||      S Nr;   )r5   r?   r<   r>   )r@   r9   r   expirer   r5   r?   r<   r>   r!   s        r"   rk   zShardClient.expire   s@    >--W-5C__S)Fw~#wPV~WWr#   c                 v    |$| j                  ||      }| j                  |      }t        |   ||||      S rj   )r@   r9   r   pexpirerl   s        r"   rn   zShardClient.pexpire   s@    >--W-5C__S)Fw3QWXXr#   whenc                 v    |$| j                  ||      }| j                  |      }t        |   ||||      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.
        r;   )r5   ro   r<   r>   )r@   r9   r   
pexpire_atr   r5   ro   r<   r>   r!   s        r"   rr   zShardClient.pexpire_at   sC     >--W-5C__S)Fw!cgf!UUr#   c                 v    |$| j                  ||      }| j                  |      }t        |   ||||      S rq   )r@   r9   r   	expire_atrs   s        r"   ru   zShardClient.expire_at   sC     >--W-5C__S)Fw StWV TTr#   c                     |$| j                  ||      }| j                  |      }| j                  ||      }t        |   ||||||      S )Nr;   )r?   sleepr>   blocking_timeoutthread_local)r@   r9   r   lock)	r   r5   r<   r?   rw   rx   r>   ry   r!   s	           r"   rz   zShardClient.lock   sd     >--W-5C__S)FmmCm1w|-%  
 	
r#   c                     d}|D cg c]  }| j                  ||       c}D ])  }| j                  |      }|| j                  ||      z  }+ |S c c}w )z/
        Remove multiple keys at once.
        r   r;   r>   )r@   r9   ra   )r   rJ   r<   reskr5   r>   s          r"   delete_manyzShardClient.delete_many   sb     ?CD!DMM!WM5D 	3C__S)F4;;s6;22C	3 
 Es   Ac                 d   |$| j                  ||      }| j                  |      }|| j                  j                  }| j                  ||      }| j	                  |||      }	 | j                  |||      }|d| d}	t        |	      t        |t              r%| j                  |j                         ||z         }
n| j                  |||z         }
| j                  |
||| j                  |
             | j                  ||       ||z   S # t        $ r}t        |      |d }~ww xY w)Nr;   rT   rZ   zKey 'z' not found)r?   r>   r|   )r@   r9   _backendr<   rD   rd   r]   r   
ValueErrorr   r   original_keyrR   ra   )r   r5   deltar<   r>   old_keyr=   rd   r^   msgnew_keys              r"   incr_versionzShardClient.incr_version   s/   >--W-5C__S)F?mm++G--W-'&A	B((7GF(CC =#k*CS/!c8$mmC$4$4$6%mPGmmC5mAG%T__W5MNGF+ $ 	B'6:A	Bs   &D 	D/D**D/c                 v    |$| j                  ||      }| j                  |      }t        |   ||||      S Nr;   )r5   r   r<   r>   )r@   r9   r   incrr   r5   r   r<   r>   r!   s        r"   r   zShardClient.incr  ?    >--W-5C__S)Fw|5'&|QQr#   c                 v    |$| j                  ||      }| j                  |      }t        |   ||||      S r   )r@   r9   r   decrr   s        r"   r   zShardClient.decr  r   r#   c                     d}t        |      )Nz)iter_keys not supported on sharded clientr%   )r   r5   r<   error_messages       r"   	iter_keyszShardClient.iter_keys#  s    C!-00r#   c                 p   | j                  ||      }g }	 | j                  j                         D ]"  }|j                  |j	                  |             $ 	 |D cg c]!  }| j                  |j                               # c}S # t
        $ r#}| j                  |      }t        |      |d }~ww xY wc c}w )Nr;   rZ   )
make_patternr   valuesextendrJ   r]   r9   r   reverse_keydecode)	r   searchr<   patternrJ   r[   r^   r>   r~   s	            r"   rJ   zShardClient.keys'  s    ##FG#<	B"..557 6
JOOG456 7;;  ,;; $ 	B__W-F'6:A	B
 <s   ?B &B3	B0B++B0c           	      @   | j                  |||      }d|i}|r||d<   g }| j                  j                         D ]*  }|j                  d  |j                  di |D               , d}	|r1| j                  j                         D ]  }|	 |j
                  | z  }	 |	S )z3
        Remove all keys matching pattern.
        )r<   prefixr0   countc              3       K   | ]  }|  y wr    ).0r5   s     r"   	<genexpr>z-ShardClient.delete_pattern.<locals>.<genexpr>A  s     FFs   r   r   )r   r   r   r   	scan_iterra   )
r   r   r<   r>   itersizer   r    rJ   r[   r}   s
             r"   delete_patternzShardClient.delete_pattern4  s     ##GWV#L7#&F7O**113 	GJKKF';z';';'Ef'EFF	G "..557 0
(z(($//0
r#   c                 f    | j                   j                         D ]  }| j                  |        y )Nr|   )r   r   
disconnect)r   r>   s     r"   do_close_clientszShardClient.do_close_clientsI  s.    &&--/ 	+FOO6O*	+r#   c                 v    |$| j                  ||      }| j                  |      }t        |   ||||      S rj   )r@   r9   r   touchrl   s        r"   r   zShardClient.touchM  s?    >--W-5C__S)Fw}gwv}VVr#   c                 b    | j                   j                         D ]  }|j                           y r   )r   r   flushdb)r   r>   r[   s      r"   clearzShardClient.clearT  s,    **113 	!J 	!r#   rT   r5   r   r<   r>   returnc                x    |$| j                  ||      }| j                  |      }t        |   |g|||dS Nr;   rT   )r@   r9   r   sadd)r   r5   r<   r>   r   r!   s        r"   r   zShardClient.saddX  sE     >--W-5C__S)Fw|CI&I'&IIr#   c                 t    |$| j                  ||      }| j                  |      }t        |   |||      S rF   )r@   r9   r   scardrb   s       r"   r   zShardClient.scardd  s?     >--W-5C__S)Fw}gf}EEr#   c                 t    |$| j                  ||      }| j                  |      }t        |   |||      S rF   )r@   r9   r   smembersrb   s       r"   r   zShardClient.smemberso  sA     >--W-5C__S)FwCHHr#   sourcedestinationmemberc                     |7| j                  ||      }| j                  |      }| j                  ||      }t        |   |||||      S )Nr;   )r   r   r   r<   r>   )r@   r9   r   smove)r   r   r   r   r<   r>   r!   s         r"   r   zShardClient.smovez  sa     >]]67];F__V,F--W-EKw}#  
 	
r#   c                x    |$| j                  ||      }| j                  |      }t        |   |g|||dS r   )r@   r9   r   sremr   r5   r<   r>   membersr!   s        r"   r   zShardClient.srem  sE     >--W-5C__S)Fw|CJ'J76JJr#   r0   r   c                 x    |$| j                  ||      }| j                  |      }t        |   |||||      S Nr;   )r5   r0   r   r<   r>   )r@   r9   r   sscanr   r5   r0   r   r<   r>   r!   s         r"   r   zShardClient.sscan  sK     >--W-5C__S)Fw}5wv  
 	
r#   c                 x    |$| j                  ||      }| j                  |      }t        |   |||||      S r   )r@   r9   r   
sscan_iterr   s         r"   r   zShardClient.sscan_iter  sL     >--W-5C__S)Fw!5wv " 
 	
r#   c                 v    |$| j                  ||      }| j                  |      }t        |   ||||      S Nr;   )r5   r   r<   r>   )r@   r9   r   srandmemberr   r5   r   r<   r>   r!   s        r"   r   zShardClient.srandmember  sD     >--W-5C__S)Fw"s%QW"XXr#   c                 v    |$| j                  ||      }| j                  |      }t        |   ||||      S r   )r@   r9   r   	sismember)r   r5   r   r<   r>   r!   s        r"   r   zShardClient.sismember  sC     >--W-5C__S)Fw fgf MMr#   c                 v    |$| j                  ||      }| j                  |      }t        |   ||||      S r   )r@   r9   r   spopr   s        r"   r   zShardClient.spop  sA     >--W-5C__S)Fw|5'&|QQr#   c                x    |$| j                  ||      }| j                  |      }t        |   |g|||dS r   )r@   r9   r   
smismemberr   s        r"   r   zShardClient.smismember  sF     >--W-5C__S)Fw!#PPPPr#   )r   )NNNr   )NN)NNg?NNT)rY   NN)NNNN)N
   NN)>__name__
__module____qualname__recompileIr/   r   r'   r   r7   r9   r   rA   rD   rN   rR   rW   r_   ra   rd   rf   rh   rk   rn   r   r   intrr   ru   rz   r   r   r   r   r   rJ   r   r   r   r   r   r   r   r	   r   r   builtinsr   r   r   r.   r   r   r   r   boolr   r   r   r   __classcell__)r!   s   @r"   r   r      s   

?BDD1I*"(& '6tD 
U.  
6 &5d4 	JBG
D
EHXY
VE(C-$8 
V
U53#7 
U 
0:RR1< IM*+ "1$t W! "&"&
J
J 
J #	
J
 
J 

J "&"&		F	F #	F 		F
 
	F "&"&		I	I #	I 		I
 
c		I  "&"&

 
 	

 #
 
2 "&"&
K
K #	
K
 
K 

K  $!!%"&

 }
 }	

 #
 
 
c	
$  $!!%"&

 }
 }	

 #
 
 
#
$  $!%"&
Y
Y }
Y #	
Y
 
Y 
x||S 	!
Y  "&"&
N
N 
N #	
N
 
N 

N  $!%"&
R
R }
R #	
R
 
R 
x||S 	!
R  "&"&
Q
Q #	
Q
 
Q 
d
Q 
Qr#   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"   <module>r      s?     	 # $  ' '  D  F 9 + &UQ- UQr#   