a
    xd$                     @   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   P/var/www/html/Ranjet/env/lib/python3.9/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 0 t|ts@|dfS tt }||k rh|| }|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   packedZ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 n0 ty } zt|d|W Y d }~n
d }~0 0 t||D ]:\}	}
|
d u rq  |
\}}|rd n||||	 < q|S )NFwritec                    s   g | ]} j |d qS ))r4   )Zmake_key).0r9   r    r4   r   r   
<listcomp>p       z'HerdClient.get_many.<locals>.<listcomp>
connection)	
get_clientr   dictzipZmget_main_exceptionsr   r3   decode)r    keysr4   r5   Zrecovered_dataZnew_keysZmap_keysresultser9   r)   r   r=   r   rA   r   get_manyg   s"    "zHerdClient.get_manyTc              
      s   |du r| j dd}|r| jnt j}z8| }| D ]\}}	|||	|||d q8|  W n0 ty }
 zt|d|
W Y d}
~
n
d}
~
0 0 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.
        NTr>   r4   r5   rD   )rF   r8   r   pipelineitemsexecuterI   r   )r    datar*   r4   r5   ZherdZset_functionrP   r9   r)   rM   r#   r   r   set_many   s    
zHerdClient.set_manyc                 O   s
   t  d S r   NotImplementedErrorr   r   r   r   incr   s    zHerdClient.incrc                 O   s
   t  d S r   rU   r   r   r   r   decr   s    zHerdClient.decrc                 C   sH   |d u r| j dd}| j|||d}|d u r0dS | j|||||d dS )NTr>   rO   F)r*   r4   r5   )rF   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<   rN   rT   rW   rX   rY   __classcell__r   r   r#   r   r   %   s     	
r   )r   socketr(   collectionsr   Zdjango.confr   Zredis.exceptionsr   r   r   
exceptionsr   r;   r
   r   r*   rI   r   getattrr   r   r   r   r   r   r   <module>   s   	
