o
    wvXj&  ã                   @   s¤   d dl Z d dlZd dl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mZ ee	e
ejfZG d	d
„ d
ƒZeeddƒZdd„ ZG dd„ deƒZdS )é    N)ÚOrderedDict)Úsettings)ÚConnectionErrorÚResponseErrorÚTimeoutErroré   )ÚConnectionInterruptedé   )ÚDEFAULT_TIMEOUTÚDefaultClientc                   @   s   e Zd ZdZdS )ÚMarkerz<
    Dummy class for use as
    marker for herded keys.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úU/var/www/html/myproject/venv/lib/python3.10/site-packages/django_redis/client/herd.pyr      s    r   ÚCACHE_HERD_TIMEOUTé<   c                 C   s,   | t krdS | t dt ¡ }|t krdS dS )NTr	   F)r   ÚrandomÚrandint)ÚxÚvalr   r   r   Ú_is_expired   s   r   c                       s’   e Zd Z‡ fdd„Zdd„ Zdd„ Zedd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
dd„ Zdd„ Zeddfdd„Z‡  ZS )Ú
HerdClientc                    s   t ƒ | _tƒ j|i |¤Ž d S ©N)r   Ú_markerÚsuperÚ__init__©ÚselfÚargsÚkwargs©Ú	__class__r   r   r   &   s   zHerdClient.__init__c                 C   s$   |p| j jtt ¡ ƒ }| j||fS r   )Ú_backendÚdefault_timeoutÚintÚtimer   )r    ÚvalueÚtimeoutÚherd_timeoutr   r   r   Ú_pack*   s   zHerdClient._packc              	   C   sp   z|\}}}W n t tfy   |df Y S w t|tƒs |dfS tt ¡ ƒ}||k r4|| }|t|ƒfS |dfS )NF)Ú
ValueErrorÚ	TypeErrorÚ
isinstancer   r'   r(   r   )r    r)   ÚmarkerÚunpackedr+   Únowr   r   r   r   Ú_unpack.   s   ÿ
zHerdClient._unpackNFc           
   	      sf   |t u r| jj}|d u s|dkrtƒ j|||||||d�S |  ||¡}|t }	tƒ j|||	|||d�S )Nr   )r*   ÚversionÚclientÚnxÚxx)r*   r4   r5   r6   )r
   r%   r&   r   Úsetr,   r   )
r    Úkeyr)   r*   r4   r5   r6   r7   ÚpackedÚreal_timeoutr#   r   r   r8   >   s"   ù
ÿzHerdClient.setc                    s.   t ƒ j||||d�}|  |¡\}}|r|S |S )N)Údefaultr4   r5   )r   Úgetr3   )r    r9   r<   r4   r5   r:   r   Úrefreshr#   r   r   r=   ^   s
   zHerdClient.getc              
      sÂ   |d u r
ˆ j dd�}|si S tƒ }‡ ‡fdd„|D ƒ}tt||ƒƒ}z|j|Ž }W n ty; } zt|d�|‚d }~ww t||ƒD ]\}	}
|
d u rJqAˆ  ˆ  |
¡¡\}}|rXd n||||	 < qA|S )NF©Úwritec                    s   g | ]	}ˆ j |ˆd �‘qS ))r4   )Úmake_key)Ú.0r9   ©r    r4   r   r   Ú
<listcomp>p   s    z'HerdClient.get_many.<locals>.<listcomp>©Ú
connection)	Ú
get_clientr   ÚdictÚzipÚmgetÚ_main_exceptionsr   r3   Údecode)r    Úkeysr4   r5   Úrecovered_dataÚnew_keysÚmap_keysÚresultsÚer9   r)   r   r>   r   rC   r   Úget_manyg   s&   €ÿzHerdClient.get_manyTc              
      s†   |du r
| j dd�}|r| jntƒ j}z| ¡ }| ¡ D ]\}}	|||	|||d� q| ¡  W dS  tyB }
 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?   ©r4   r5   rE   )rG   r8   r   ÚpipelineÚitemsÚexecuterK   r   )r    Údatar*   r4   r5   ÚherdÚset_functionrU   r9   r)   rR   r#   r   r   Úset_many�   s   
€ÿzHerdClient.set_manyc                 O   ó   t ƒ ‚r   ©ÚNotImplementedErrorr   r   r   r   Úincr˜   ó   zHerdClient.incrc                 O   r\   r   r]   r   r   r   r   Údecr›   r`   zHerdClient.decrc                 C   sH   |d u r
| j dd�}| j|||d�}|d u rdS | j|||||d� dS )NTr?   rT   F)r*   r4   r5   )rG   r=   r8   )r    r9   r*   r4   r5   r)   r   r   r   Útouchž   s   zHerdClient.touch)NNN)NN)r   r   r   r   r,   r3   r
   r8   r=   rS   r[   r_   ra   rb   Ú__classcell__r   r   r#   r   r   %   s"    ø 
	ÿr   )r   Úsocketr(   Úcollectionsr   Údjango.confr   Úredis.exceptionsr   r   r   Ú
exceptionsr   r<   r
   r   r*   rK   r   Úgetattrr   r   r   r   r   r   r   Ú<module>   s    	
