o
    wvXj$  ã                   @   st   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mZ G dd„ deƒZdS )é    N)ÚOrderedDict)Úsettings)ÚConnectionErroré   )ÚConnectionInterrupted)ÚHashRing)ÚCacheKeyé   )ÚDEFAULT_TIMEOUTÚDefaultClientc                       sd  e Zd Ze dej¡Z‡ fdd„Zd9dd„Zdd„ Z	d	d
„ Z
dd„ Zeddf‡ fdd„	Zd:‡ fdd„	Zd;dd„Zedddf‡ fdd„	Zedfdd„Zd<dd„Zd<‡ fdd„	Zd<‡ fdd„	Zd<‡ fdd „	Zd<‡ fd!d"„	Z			#			d=‡ fd$d%„	Zd;d&d'„Zd>d)d*„Zd>‡ fd+d,„	Zd>‡ fd-d.„	Zd;d/d0„Zd;d1d2„Z	d?d3d4„Zd5d6„ Zeddf‡ fd7d8„	Z ‡  Z!S )@Ú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__© úX/var/www/html/myproject/venv/lib/python3.10/site-packages/django_redis/client/sharded.pyr      s
   
zShardClient.__init__Tc                 C   s   t ‚r   ©ÚNotImplementedError)r   Úwriter   r   r   Ú
get_client   s   zShardClient.get_clientc                 C   s$   i }| j D ]
}| j |¡||< q|S r   )r   Úconnection_factoryr   )r   Úconnection_dictÚnamer   r   r   r      s   
zShardClient.connectc                 C   sH   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   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                    ó4   |d u r| j ||d�}|  |¡}tƒ j||||d�S )Nr0   )r,   Údefaultr1   r3   )r5   r/   r   Úget)r   r,   r8   r1   r3   r   r   r   r9   7   ó   
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 ©r0   ©r5   ©Ú.0r,   ©r   r1   r   r   Ú
<listcomp>D   ó    z(ShardClient.get_many.<locals>.<listcomp>©r,   r1   r3   )r   ÚdictÚzipr/   r9   )	r   Úkeysr1   Úrecovered_dataÚnew_keysÚ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   rK   r   r   r   rL   Q   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)ÚitemsrL   )r   Údatar4   r1   r,   r2   r   r   r   Úset_many_   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.
        Nr0   r	   ©Ú
connection)r5   r/   Úexistsr   r   )r   r,   r1   r3   Úer   r   r   Úhas_keyj   s   
€ÿzShardClient.has_keyc                    ó2   |d u r| j ||d�}|  |¡}tƒ j|||d�S ©Nr0   rC   )r5   r/   r   Údelete©r   r,   r1   r3   r   r   r   rW   y   ó   
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   rC   )r5   r/   r   ÚttlrX   r   r   r   rZ   €   s   
zShardClient.ttlc                    rU   rV   )r5   r/   r   ÚpersistrX   r   r   r   r[   Œ   rY   zShardClient.persistc                    r7   ©Nr0   )r,   r4   r1   r3   )r5   r/   r   Úexpire©r   r,   r4   r1   r3   r   r   r   r]   “   r:   zShardClient.expireçš™™™™™¹?c                    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`   ra   r3   rb   r   r   r   rc   š   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;   r<   r=   ©r?   Úkr@   r   r   rA   ¸   rB   z+ShardClient.delete_many.<locals>.<listcomp>©r3   )r/   rW   )r   rF   r1   Úresr,   r3   r   r@   r   Údelete_many³   s
   
zShardClient.delete_manyr	   c           
   
   C   sö   |d u r| j ||d�}|  |¡}|d u r| jj}|   ||¡}| j|||d�}z| |¡}W n ty? } zt|d�|‚d }~ww |d u rJtd| ƒ‚t	|t
ƒr[| j | ¡ || d�}	n	| j ||| d�}	| j|	|||  |	¡d� | j||d� || S )Nr0   )r1   r3   rP   zKey '%s' not found)r4   r3   rf   )r5   r/   Ú_backendr1   r9   rZ   r   r   Ú
ValueErrorr   r   Úoriginal_keyrL   rW   )
r   r,   Údeltar1   r3   Úold_keyr2   rZ   rS   Únew_keyr   r   r   Úincr_version½   s*   
€ÿ
zShardClient.incr_versionc                    r7   ©Nr0   )r,   rl   r1   r3   )r5   r/   r   Úincr©r   r,   rl   r1   r3   r   r   r   rq   Ù   r:   zShardClient.incrc                    r7   rp   )r5   r/   r   Údecrrr   r   r   r   rs   à   r:   zShardClient.decrc                 C   s   t dƒ‚)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y4 } zˆ  |¡}t|d�|‚d }~ww ‡ fdd„|D ƒS )Nr0   rP   c                    s   g | ]	}ˆ   | ¡ ¡‘qS r   )Úreverse_keyÚdecoderd   ©r   r   r   rA   õ   rB   z$ShardClient.keys.<locals>.<listcomp>)Úmake_patternr   rM   ÚextendrF   r   r/   r   )	r   Úsearchr1   ÚpatternrF   ÚserverrQ   rS   r3   r   rw   r   rF   ê   s   ÿ
€ýzShardClient.keysc                 C   sŠ   | j |||d�}d|i}|r||d< g }| j ¡ D ]\}}	| dd„ |	jdi |¤ŽD ƒ¡ qd}
|rC| j ¡ D ]\}}	|
|	j|Ž 7 }
q7|
S )	z3
        Remove all keys matching pattern.
        )r1   Úprefixr'   Úcountc                 s   s   � | ]}|V  qd S r   r   r>   r   r   r   Ú	<genexpr>  s   € z-ShardClient.delete_pattern.<locals>.<genexpr>r   Nr   )rx   r   rM   ry   Ú	scan_iterrW   )r   r{   r1   r3   Úitersizer}   r   rF   r|   rQ   rg   r   r   r   Údelete_pattern÷   s   "zShardClient.delete_patternc                 K   s:   t tddƒr| j ¡ D ]}|jjD ]}| ¡  qqd S d S )NÚDJANGO_REDIS_CLOSE_CONNECTIONF)Úgetattrr   r   ÚvaluesÚconnection_poolÚ_available_connectionsÚ
disconnect)r   r   r3   Úcr   r   r   Úclose  s   
ÿþzShardClient.closec                    r7   r\   )r5   r/   r   Útouchr^   r   r   r   r‹     r:   zShardClient.touch)T)NNNr   )NN)NNr_   NNT)r	   NN)NNNN)"Ú__name__Ú
__module__Ú__qualname__ÚreÚcompileÚIr&   r   r!   r   r.   r/   r
   r6   r9   rJ   rL   rO   rT   rW   rZ   r[   r]   rc   rh   ro   rq   rs   rt   rF   r‚   rŠ   r‹   Ú__classcell__r   r   r   r   r      sF    
		
ÿ

ø





ÿr   )r�   Úcollectionsr   Údjango.confr   Úredis.exceptionsr   Ú
exceptionsr   Ú	hash_ringr   Úutilr   r8   r
   r   r   r   r   r   r   Ú<module>   s    