
    R}bg!_                     6   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	m
Z
mZ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mZ ddlmZ ddlm Z m!Z! ddl"m#Z# eeeej$        fZ% ej&        d          Z'de(de(fdZ) G d d          Z*dS )    N)OrderedDict)datetime)AnyDictIteratorListOptionalUnion)settings)DEFAULT_TIMEOUT	BaseCacheget_key_func)ImproperlyConfigured)import_string)Redis)ConnectionErrorResponseErrorTimeoutError   )pool)CompressorErrorConnectionInterrupted)CacheKeyz([*?[])sreturnc                 8    t                               d|           S )Nz[\1])
special_resub)r   s    n/home/e360mart.nyusoft.in/public_html/e360mart_env/lib/python3.11/site-packages/django_redis/client/default.pyglob_escaper       s    >>'1%%%    c                   N   e Zd Zdeeef         deddfdZdedefdZ		 dBd	ed
e
ee                  defdZ	 	 	 dCd	ed
e
ee                  defdZdDdedefdZdEdZeddddfdedede
e         de
e         de
e         dededefdZ	 	 	 dFdedede
e         de
e         def
dZeddfdededede
e         de
e         defdZ	 	 	 dGdede
e         de
e         defdZ	 dHdede
e         de
e         defdZ	 	 dHdede
e         de
e         defd ZdHdefd!Z	 	 dHded"eeef         de
e         de
e         def
d#Z	 	 dHded"eeef         de
e         de
e         def
d$Z	 	 	 	 	 	 dIde
e         de
e         fd&Z	 	 	 dGdede
e         d'e
e         de
e         def
d(Z 	 	 	 	 dJd)ede
e         d'e
e         de
e         d*e
e         defd+Z!	 dHde
e         de
e         fd,Z"dKde
e         ddfd-Z#dee$ef         defd.Z%dedee$ef         fd/Z&	 dHde
e         de
e         de'fd0Z(eddfd1eeef         de
e         de
e         de
e         ddf
d2Z)	 	 	 	 dLdedede
e         de
e         d3edefd4Z*	 	 	 	 dLdedede
e         de
e         d3edefd5Z+	 	 	 dFdedede
e         de
e         def
d6Z,	 dHdede
e         de
e         de
e         fd7Z-dHd8Z.	 dHdede
e         de
e         defd9Z/	 	 	 dGd:ed*e
e         de
e         de
e         de0e         f
d;Z1	 dHd:ede
e         de
e         dee         fd<Z2	 dHdede
e         d'e
e         de3fd=Z4	 dHd)ede
e         d'e
e         de3fd>Z5d? Z6d@ Z7eddfdede
e         de
e         de
e         def
dAZ8dS )MDefaultClientparamsbackendr   Nc                 (   || _         || _        || _        t          |                    d          pd          | _        | j        st          d          t          | j        t          t          t          f          s| j                            d          | _        d gt          | j                  z  | _        |                    di           | _        | j                            dd          | _        | j                            dd	          }t!          |          }| j                            d
d          }t!          |          } || j                  | _         || j                  | _        t'          j        | j                  | _        d S )NREVERSE_KEY_FUNCTIONz%django_redis.util.default_reverse_keyzMissing connections string,OPTIONSREPLICA_READ_ONLYT
SERIALIZERz0django_redis.serializers.pickle.PickleSerializer
COMPRESSORz4django_redis.compressors.identity.IdentityCompressor)options)_backend_server_paramsr   getreverse_keyr   
isinstancelisttuplesetsplitlen_clients_options_replica_read_onlyr   _serializer_compressorr   get_connection_factoryconnection_factory)selfserverr$   r%   serializer_pathserializer_clscompressor_pathcompressor_clss           r   __init__zDefaultClient.__init__   s{   'JJ-.. 76
 

 | 	E&'CDDD$,uc(:;; 	3<--c22DL04vDL8I8I/I

9b11"&-"3"34G"N"N-++L
 
 '77-++P
 
 '77)>$-@@@)>$-@@@"&"=dm"T"T"Tr!   keyc                 ,    |                      |          S N)has_key)r@   rG   s     r   __contains__zDefaultClient.__contains__@   s    ||C   r!   Twritetriedc                    t                      rgt                    t          | j                  k     rBfdt          dt          | j                            D             }t	          j        |          S |st          | j                  dk    rdS t	          j        dt          | j                  dz
            S )z
        Return a next index for read client. This function implements a default
        behavior for get a next read client for a replication setup.

        Overwrite this function if you want a specific
        behavior.
        Nc                     g | ]}|v|	S  rP   ).0irM   s     r   
<listcomp>z7DefaultClient.get_next_client_index.<locals>.<listcomp>Q   s    RRRq1E>>>>>r!   r      )r4   r8   r/   rangerandomchoicerandint)r@   rL   rM   	not_trieds     ` r   get_next_client_indexz#DefaultClient.get_next_client_indexC   s     =FFE 	,SZZ#dl"3"333RRRRE!S->->$?$?RRRI=+++ 	C%%**1~aT\!2!2Q!6777r!   F
show_indexc                     |                      ||          }| j        |         |                     |          | j        |<   |r| j        |         |fS | j        |         S )z
        Method used for obtain a raw redis client.

        This function is used by almost all cache backend
        operations for obtain a native redis client/connection
        instance.
        )rL   rM   )rZ   r9   connect)r@   rL   rM   r[   indexs        r   
get_clientzDefaultClient.get_clientY   sh     **e*DD='#'<<#6#6DM%  	(='..=''r!   r   r^   c                 L    | j                             | j        |                   S )z
        Given a connection index, returns a new raw redis client/connection
        instance. Index is used for replication setups and indicates that
        connection string should be used. In normal setups, index is 0.
        )r?   r]   r/   )r@   r^   s     r   r]   zDefaultClient.connectp   s"     &..t|E/BCCCr!   c                 \    |s| j         |         }|r| j                            |          ndS )z9delegates the connection factory to disconnect the clientN)r9   r?   
disconnect)r@   r^   clients      r   rb   zDefaultClient.disconnectx   s7     	*]5)F=CMt&11&999Mr!   valuetimeoutversionrc   nxxxc           	         |                      ||          }|                     |          }	|t          u r| j        j        }|}
g }	 	 ||                     d|d          \  }}|Xt          |dz            }|dk    r@|r|                     |||           S t          | 	                    |||                    S t          |
                    ||	|||	                    S # t          $ r`}|
sH| j        sAt          |          t          | j                  k     r|                    |           d}Y d}~t!          |
          |d}~ww xY w)z
        Persist a value to the cache, and set an optional expiration time.

        Also supports optional nx parameter. If set to True - will use redis
        setnx instead of set.
        rf   TN)rL   rM   r[     r   rf   rc   )rc   rf   )rg   pxrh   
connection)make_keyencoder   r.   default_timeoutr_   intrJ   booldeleter6   _main_exceptionsr;   r8   r/   appendr   )r@   rG   rd   re   rf   rc   rg   rh   nkeynvalueoriginal_clientrM   r^   es                 r   r6   zDefaultClient.set~   s     }}S'}22U##o%%m3G #	F"F>$(OO"%D %4 % %MFE &!'D.11G!||  (,||CQW|'X'X#XX
 $( $C P P$ $  FJJtVw2JNNOOO# 	F 	F 	F' 3 E

S%6%666LL'''!FHHHH+v>>>AE	Fs,   AC& $C& ?&C& &
E0AE:EErT   deltac                 n   ||                      d          }|| j        j        }|                     ||          }|                     |||          }	 |                     |||          }n## t          $ r}t          |          |d}~ww xY w|t          d|z            t          |t                    r-|                     |                                ||z             }	n|                     |||z             }	|                     |	|||           |                     ||	           ||z   S )
zh
        Adds delta to the cache version for the supplied key. Returns the
        new version.
        NTrL   rl   rn   Key '%s' not foundrj   )re   rc   )rc   )r_   r.   rf   rp   r1   ttlrv   r   
ValueErrorr3   r   original_keyr6   ru   )
r@   rG   r|   rf   rc   old_keyrd   r   r{   new_keys
             r   incr_versionzDefaultClient.incr_version   sR    >__4_00F?m+G--W--'&AA	B((7GF(CCCC 	B 	B 	B'6:::A	B =1C7888c8$$ 	BmmC$4$4$6$6%mPPGGmmC5mAAG%V<<<GF+++s   A/ /
B9B

Bc                 8    |                      |||||d          S )z
        Add a value to the cache, failing if the key already exists.

        Returns ``True`` if the object was added, ``False`` if not.
        T)rf   rc   rg   )r6   )r@   rG   rd   re   rf   rc   s         r   addzDefaultClient.add   s#     xxUGWVPTxUUUr!   c                    ||                      d          }|                     ||          }	 |                    |          }n## t          $ r}t	          |          |d}~ww xY w||S |                     |          S )zv
        Retrieve a value from the cache.

        Returns decoded value if key is found, the default if not.
        NFr~   rj   rn   )r_   rp   r1   rv   r   decode)r@   rG   defaultrf   rc   rd   r{   s          r   r1   zDefaultClient.get   s     >__5_11FmmCm11	BJJsOOEE 	B 	B 	B'6:::A	B =N{{5!!!s   A 
A'A""A'c                     ||                      d          }|                     ||          }|                    |          S NTr~   rj   )r_   rp   persist)r@   rG   rf   rc   s       r   r   zDefaultClient.persist  sC     >__4_00FmmCm11~~c"""r!   c                     ||                      d          }|                     ||          }|                    ||          S r   )r_   rp   expirer@   rG   re   rf   rc   s        r   r   zDefaultClient.expire  sE     >__4_00FmmCm11}}S'***r!   c                     ||                      d          }|                     ||          }t          |                    ||                    S r   )r_   rp   rt   pexpirer   s        r   r   zDefaultClient.pexpire#  sM    >__4_00FmmCm11 FNN300111r!   whenc                     ||                      d          }|                     ||          }t          |                    ||                    S z
        Set an expire flag on a ``key`` to ``when``, which can be represented
        as an integer indicating unix time or a Python datetime object.
        NTr~   rj   )r_   rp   rt   	pexpireatr@   rG   r   rf   rc   s        r   
pexpire_atzDefaultClient.pexpire_at-  sO     >__4_00FmmCm11F$$S$//000r!   c                     ||                      d          }|                     ||          }|                    ||          S r   )r_   rp   expireatr   s        r   	expire_atzDefaultClient.expire_at?  sE     >__4_00FmmCm11sD)))r!   皙?c                     ||                      d          }|                     ||          }|                    |||||          S )NTr~   rj   )re   sleepblocking_timeoutthread_local)r_   rp   lock)r@   rG   rf   re   r   r   rc   r   s           r   r   zDefaultClient.lockQ  s[     >__4_00FmmCm11{{-%  
 
 	
r!   prefixc                     ||                      d          }	 |                    |                     |||                    S # t          $ r}t	          |          |d}~ww xY w)z.
        Remove a key from the cache.
        NTr~   rf   r   rn   )r_   ru   rp   rv   r   )r@   rG   rf   r   rc   r{   s         r   ru   zDefaultClient.deleteg  s|     >__4_00F	B==sGF!S!STTT 	B 	B 	B'6:::A	Bs   *A 
A%A  A%patternitersizec                 j   ||                      d          }|                     |||          }	 d}|                                }|                    ||          D ]}|                    |           |dz  }|                                 |S # t          $ r}	t          |          |	d}	~	ww xY w)	z3
        Remove all keys matching pattern.
        NTr~   r   r   matchcountrT   rn   )r_   make_patternpipeline	scan_iterru   executerv   r   )
r@   r   rf   r   rc   r   r   r   rG   r{   s
             r   delete_patternzDefaultClient.delete_patterny  s     >__4_00F##GWV#LL	BE((H''gX'FF  $$$
L 	B 	B 	B'6:::A	Bs   AB 
B2B--B2c                      |                      d          } fd|D             }|sdS 	  |j        | S # t          $ r}t          |          |d}~ww xY w)z/
        Remove multiple keys at once.
        NTr~   c                 >    g | ]}                     |           S )rj   rp   rQ   kr@   rf   s     r   rS   z-DefaultClient.delete_many.<locals>.<listcomp>  s)    @@@aa11@@@r!   rn   )r_   ru   rv   r   )r@   keysrf   rc   r{   s   ` `  r   delete_manyzDefaultClient.delete_many  s     >__4_00F@@@@@4@@@ 	F	B 6=$'' 	B 	B 	B'6:::A	Bs   	9 
AAAc                     ||                      d          }	 |                                 dS # t          $ r}t          |          |d}~ww xY w)z'
        Flush all cache keys.
        NTr~   rn   )r_   flushdbrv   r   )r@   rc   r{   s      r   clearzDefaultClient.clear  sn    
 >__4_00F	BNN 	B 	B 	B'6:::A	Bs   0 
AAAc                     	 t          |          }n]# t          t          f$ rI 	 | j                            |          }n# t
          $ r Y nw xY w| j                            |          }Y nw xY w|S )z)
        Decode the given value.
        )rs   r   	TypeErrorr=   
decompressr   r<   loadsr@   rd   s     r   r   zDefaultClient.decode  s    	2JJEEI& 	2 	2 	2(33E::"    $**511EEE	2 s/    A,?A,
A	A,AA,+A,c                     t          |t                    st          |t                    s6| j                            |          }| j                            |          }|S |S )z)
        Encode the given value.
        )r3   rt   rs   r<   dumpsr=   compressr   s     r   rq   zDefaultClient.encode  s]    
 eT"" 	*UC*@*@ 	$**511E$--e44ELr!   c                 z    |                      d          }|st                      S t                      }t           fd|D                       }	  |j        | }n## t          $ r}t	          |          |d}~ww xY wt          ||          D ]&\  }}	|	                     |	          |||         <   '|S )z%
        Retrieve many keys.
        NFr~   c              3   J   K   | ]}                     |           |fV  dS )rj   Nr   r   s     r   	<genexpr>z)DefaultClient.get_many.<locals>.<genexpr>  s8      TT!a A A1ETTTTTTr!   rn   )r_   r   mgetrv   r   zipr   )
r@   r   rf   rc   recovered_datamap_keysresultsr{   rG   rd   s
   ` `       r   get_manyzDefaultClient.get_many  s     >__5_11F 	!== $TTTTTtTTTTT	B!fk8,GG 	B 	B 	B'6:::A	B h00 	? 	?JC},0KK,>,>N8C=))s   
A! !
B+A<<Bdatac                 6   ||                      d          }	 |                                }|                                D ]\  }}|                     |||||            |                                 dS # t
          $ r}t          |          |d}~ww xY 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~   rl   rn   )r_   r   itemsr6   r   rv   r   )	r@   r   re   rf   rc   r   rG   rd   r{   s	            r   set_manyzDefaultClient.set_many  s     >__4_00F	B((H"jjll P P
UeWghOOOO 	B 	B 	B'6:::A	Bs   AA8 8
BBBignore_key_checkc                    ||                      d          }|                     ||          }	 	 |sd}nd}|                    |d||          }|t          d|z            nu# t          $ rh |                     |||          }|d	k    rt          d|z            |                     |||          |z   }|                     |||||
           Y nw xY wn## t          $ r}	t          |          |	d }	~	ww xY w|S )NTr~   rj   z
                    local exists = redis.call('EXISTS', KEYS[1])
                    if (exists == 1) then
                        return redis.call('INCRBY', KEYS[1], ARGV[1])
                    else return false end
                    zW
                    return redis.call('INCRBY', KEYS[1], ARGV[1])
                    rT   r   rl   )rf   re   rc   rn   )
r_   rp   evalr   r   r   r1   r6   rv   r   )
r@   rG   r|   rf   rc   r   luard   re   r{   s
             r   _incrzDefaultClient._incr  sc    >__4_00FmmCm11#	B V ( 
CCC CC77=$%9C%?@@@ !  V V V ((3(GG b==$%9C%?@@@gfEEMeWgfUUUUUV   	B 	B 	B'6:::A	B s6   3A& %C &A/CC CC 
C<&C77C<c                 6    |                      |||||          S )z
        Add delta to value in the cache. If the key does not exist, raise a
        ValueError exception. if ignore_key_check=True then the key will be
        created and set to the delta value by default.
        )rG   r|   rf   rc   r   r   )r@   rG   r|   rf   rc   r   s         r   incrzDefaultClient.incr<  s.     zz-  
 
 	
r!   c                 6    |                      || ||          S )zx
        Decreace delta to value in the cache. If the key does not exist, raise a
        ValueError exception.
        )rG   r|   rf   rc   r   )r@   rG   r|   rf   rc   s        r   decrzDefaultClient.decrQ  s      zzc%zPPPr!   c                     ||                      d          }|                     ||          }|                    |          sdS |                    |          }|dk    r|S |dk    rdS |dk    rdS 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.
        NFr~   rj   r   r   )r_   rp   existsr   r@   rG   rf   rc   ts        r   r   zDefaultClient.ttl^  s     >__5_11FmmCm11}}S!! 	1JJsOO66H"WW4"WW1 4r!   c                     ||                      d          }|                     ||          }|                    |          sdS |                    |          }|dk    r|S |dk    rdS |dk    rdS dS )z
        Executes PTTL redis command and return the "time-to-live" of specified key.
        If key is a non volatile key, it returns None.
        NFr~   rj   r   r   r   )r_   rp   r   pttlr   s        r   r   zDefaultClient.pttlx  s    
 >__5_11FmmCm11}}S!! 	1KK66H"WW4"WW1 4r!   c                     ||                      d          }|                     ||          }	 |                    |          dk    S # t          $ r}t	          |          |d}~ww xY w)z%
        Test if key exists.
        NFr~   rj   rT   rn   )r_   rp   r   rv   r   )r@   rG   rf   rc   r{   s        r   rJ   zDefaultClient.has_key  s     >__5_11FmmCm11	B==%%** 	B 	B 	B'6:::A	Bs   A
 

A*A%%A*searchc              #      K   ||                      d          }|                     ||          }|                    ||          D ]+}|                     |                                          V  ,dS )zo
        Same as keys, but uses redis >= 2.8 cursors
        for make memory efficient keys iteration.
        NFr~   rj   r   )r_   r   r   r2   r   )r@   r   r   rc   rf   r   items          r   	iter_keyszDefaultClient.iter_keys  s       >__5_11F##FG#<<$$7($CC 	2 	2D""4;;==111111	2 	2r!   c                      |                      d          }                     ||          }	  fd|                    |          D             S # t          $ r}t	          |          |d}~ww xY w)z
        Execute KEYS command and return matched results.
        Warning: this can return huge number of results, in
        this case, it strongly recommended use iter_keys
        for it.
        NFr~   rj   c                 ^    g | ])}                     |                                          *S rP   )r2   r   )rQ   r   r@   s     r   rS   z&DefaultClient.keys.<locals>.<listcomp>  s/    OOOQD$$QXXZZ00OOOr!   rn   )r_   r   r   rv   r   )r@   r   rf   rc   r   r{   s   `     r   r   zDefaultClient.keys  s     >__5_11F##FG#<<	BOOOO&++g:N:NOOOO 	B 	B 	B'6:::A	Bs    A 
A3A..A3c                     t          |t                    r|S || j        j        }|| j        j        }t          | j                            |||                    S rI   )r3   r   r.   
key_prefixrf   key_func)r@   rG   rf   r   s       r   rp   zDefaultClient.make_key  s[     c8$$ 	J>]-F?m+G..sFGDDEEEr!   c                    t          |t                    r|S || j        j        }t	          |          }|| j        j        }t	          t          |                    }t          | j                            |||                    S rI   )r3   r   r.   r   r    rf   strr   )r@   r   rf   r   version_strs        r   r   zDefaultClient.make_pattern  s{     gx(( 	N>]-FV$$?m+G!#g,,//..wLLMMMr!   c                     | j                             dt          t          dd                    }|r|                                  d S d S )NCLOSE_CONNECTIONDJANGO_REDIS_CLOSE_CONNECTIONF)r:   r1   getattrr   do_close_clients)r@   kwargs
close_flags      r   closezDefaultClient.close  sX    ]&&H=uEE
 

  	$!!#####	$ 	$r!   c                     t          | j                  }t          |          D ]}|                     |           dg|z  | _        dS )z1default implementation: Override in custom client)r^   N)r8   r9   rU   rb   )r@   num_clientsidxs      r   r   zDefaultClient.do_close_clients  sQ    $-((%% 	' 	'COO#O&&&&,r!   c                 <   |t           u r| j        j        }||                     d          }|                     ||          }|"t          |                    |                    S t          |dz            }t          |                    ||                    S )z2
        Sets a new expiration for a key.
        NTr~   rj   rk   )	r   r.   rr   r_   rp   rt   r   rs   r   r   s        r   touchzDefaultClient.touch  s     o%%m3G>__4_00FmmCm11?s++,,, 'D.))GsG44555r!   )TN)TNF)r   )r   N)rT   NN)NNN)NN)NNr   NNT)NNNNrI   )rT   NNF)9__name__
__module____qualname__r   r   r   r   rF   rt   rK   r	   r   rs   rZ   r_   r   r]   rb   r   floatr6   r   r   r1   r   r   r   r
   r   r   r   r   ru   r   r   r   bytesr   rq   r   r   r   r   r   r   r   r   rJ   r   r   r   r   rp   r   r   r   r   rP   r!   r   r#   r#      s
       !UtCH~ !U	 !Ud !U !U !U !UF! ! ! ! ! ! @D8 88)1$s))<8	8 8 8 80 %) 	( (( S	"( 	( ( ( (.D DS D D D D DN N N N $3!%"&;F ;F;F ;F %	;F
 #;F ;F ;F ;F 
;F ;F ;F ;F@ !%"&$ $$ $ #	$
 $ 
$ $ $ $T '!%"&V VV V 	V
 #V V 
V V V V$ !%"&" "" #	"
 " 
" " " "8 RV# ##!)##?G#	# # # # "&"&+ ++ #	+
 + 
+ + + +2 2$ 2 2 2 2 "&"&1 11 HcM"1 #	1
 1 
1 1 1 1, "&"&* ** HcM"* #	*
 * 
* * * ** "&"&
 
 #
 
 
 
 
2 "& $"&B BB #B 	B
 B 
B B B B* "& $"&"&B BB #B 	B
 B 3-B 
B B B B> NRB B%c]B;CE?B B B B(B BHUO Bt B B B BE%*- #    
C 
E%*$5 
 
 
 
 NR %c];CE?	   > $3!%"&B B38nB %B #	B
 B 
B B B B8 !%"&!&2 22 2 #	2
 2 2 
2 2 2 2n !%"&!&
 

 
 #	

 
 
 

 
 
 
0 !%"&Q QQ Q #	Q
 Q 
Q Q Q Q RV !)#?G	#   4   2 RVB BB!)#B?GB	B B B B& #'"&!%2 22 3-2 	2
 #2 
#2 2 2 2( UYB BB$,SMBBJ5/B	cB B B B( PTF FF!)#F?G}F	F F F F TXN NN%-c]NCKC=N	N N N N $ $ $- - - $3!%"&6 66 %6 #	6
 6 
6 6 6 6 6 6r!   r#   )+rV   resocketcollectionsr   r   typingr   r   r   r   r	   r
   django.confr   django.core.cache.backends.baser   r   r   django.core.exceptionsr   django.utils.module_loadingr   redisr   redis.exceptionsr   r   r    r   
exceptionsr   r   utilr   re   rv   compiler   r   r    r#   rP   r!   r   <module>r     s    				  # # # # # #       = = = = = = = = = = = = = = = =             T T T T T T T T T T 7 7 7 7 7 7 5 5 5 5 5 5       I I I I I I I I I I       ? ? ? ? ? ? ? ?       -&.Q RZ	""
&3 &3 & & & &n6 n6 n6 n6 n6 n6 n6 n6 n6 n6r!   