a
    Lcòfô  ã                   @   st   d Z ddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
 G dd„ dƒZG dd	„ d	ƒZG d
d„ deƒZdS )zRedis cache backend.é    N)ÚDEFAULT_TIMEOUTÚ	BaseCache)Úcached_property)Úimport_stringc                   @   s&   e Zd Zddd„Zdd„ Zdd„ ZdS )	ÚRedisSerializerNc                 C   s   |d u rt jn|| _d S ©N)ÚpickleÚHIGHEST_PROTOCOLÚprotocol)Úselfr
   © r   ú]/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/core/cache/backends/redis.pyÚ__init__   s    zRedisSerializer.__init__c                 C   s   t |ƒtu r|S t || j¡S r   )ÚtypeÚintr   Údumpsr
   )r   Úobjr   r   r   r      s    zRedisSerializer.dumpsc                 C   s,   z
t |ƒW S  ty&   t |¡ Y S 0 d S r   )r   Ú
ValueErrorr   Úloads)r   Údatar   r   r   r      s    
zRedisSerializer.loads)N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r      s   
r   c                   @   sŽ   e Zd Zd"dd„Zdd„ Zdd„ Zd#dd	œd
d„Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ ZdS )$ÚRedisCacheClientNc                 K   s¢   dd l }|| _|| _i | _| jj| _t|tƒr6t|ƒ}|p@| jj	| _
t|tƒrVt|ƒ}t|ƒrd|ƒ }|pltƒ | _t|tƒr‚t|ƒ}|pŽ| jjj}d|i|¥| _d S )Nr   Úparser_class)ÚredisZ_libÚ_serversÚ_poolsZRedisÚ_clientÚ
isinstanceÚstrr   ÚConnectionPoolÚ_pool_classÚcallabler   Ú_serializerÚ
connectionZDefaultParserÚ_pool_options)r   ZserversÚ
serializerZ
pool_classr   Úoptionsr   r   r   r   r      s"    



zRedisCacheClient.__init__c                 C   s,   |st | jƒdkrdS t dt | jƒd ¡S )Né   r   )Úlenr   ÚrandomÚrandint)r   Úwriter   r   r   Ú_get_connection_pool_index?   s    z+RedisCacheClient._get_connection_pool_indexc                 C   s@   |   |¡}|| jvr6| jj| j| fi | j¤Ž| j|< | j| S r   )r.   r   r"   Zfrom_urlr   r&   )r   r-   Úindexr   r   r   Ú_get_connection_poolF   s    

ÿþz%RedisCacheClient._get_connection_poolF©r-   c                C   s   |   |¡}| j|d�S )N)Zconnection_pool)r0   r   )r   Úkeyr-   Úpoolr   r   r   Ú
get_clientO   s    
zRedisCacheClient.get_clientc                 C   sb   | j |dd�}| j |¡}|dkrHt|j||dd�ƒ }rD| |¡ |S t|j|||dd�ƒS d S )NTr1   r   )Únx)Úexr5   )r4   r$   r   ÚboolÚsetÚdelete)r   r2   ÚvalueÚtimeoutÚclientÚretr   r   r   ÚaddV   s    
zRedisCacheClient.addc                 C   s,   |   |¡}| |¡}|d u r |S | j |¡S r   )r4   Úgetr$   r   )r   r2   Údefaultr<   r:   r   r   r   r?   a   s    

zRedisCacheClient.getc                 C   sB   | j |dd�}| j |¡}|dkr.| |¡ n|j|||d� d S )NTr1   r   )r6   )r4   r$   r   r9   r8   )r   r2   r:   r;   r<   r   r   r   r8   f   s
    zRedisCacheClient.setc                 C   s8   | j |dd�}|d u r$t| |¡ƒS t| ||¡ƒS d S ©NTr1   )r4   r7   ZpersistÚexpire)r   r2   r;   r<   r   r   r   Útouchn   s    zRedisCacheClient.touchc                 C   s   | j |dd�}t| |¡ƒS rA   )r4   r7   r9   ©r   r2   r<   r   r   r   r9   u   s    zRedisCacheClient.deletec                    s,   ˆ   d ¡}| |¡}‡ fdd„t||ƒD ƒS )Nc                    s&   i | ]\}}|d ur|ˆ j  |¡“qS r   )r$   r   ©Ú.0ÚkÚv©r   r   r   Ú
<dictcomp>|   s   z-RedisCacheClient.get_many.<locals>.<dictcomp>)r4   ZmgetÚzip)r   Úkeysr<   r=   r   rI   r   Úget_manyy   s
    


ÿzRedisCacheClient.get_manyc                 C   s   |   |¡}t| |¡ƒS r   )r4   r7   ÚexistsrD   r   r   r   Úhas_key€   s    
zRedisCacheClient.has_keyc                 C   s0   | j |dd�}| |¡s$td| ƒ‚| ||¡S )NTr1   zKey '%s' not found.)r4   rN   r   Úincr)r   r2   Údeltar<   r   r   r   rP   „   s    
zRedisCacheClient.incrc                    s\   ˆ j d dd�}| ¡ }| ‡ fdd„| ¡ D ƒ¡ |d urP|D ]}| ||¡ q>| ¡  d S )NTr1   c                    s   i | ]\}}|ˆ j  |¡“qS r   )r$   r   rE   rI   r   r   rJ   �   ó    z-RedisCacheClient.set_many.<locals>.<dictcomp>)r4   ÚpipelineZmsetÚitemsrB   Úexecute)r   r   r;   r<   rS   r2   r   rI   r   Úset_manyŠ   s    zRedisCacheClient.set_manyc                 C   s   | j d dd�}|j|Ž  d S rA   )r4   r9   )r   rL   r<   r   r   r   Údelete_many–   s    zRedisCacheClient.delete_manyc                 C   s   | j d dd�}t| ¡ ƒS rA   )r4   r7   Zflushdb)r   r<   r   r   r   Úclearš   s    zRedisCacheClient.clear)NNN)N)r   r   r   r   r.   r0   r4   r>   r?   r8   rC   r9   rM   rO   rP   rV   rW   rX   r   r   r   r   r      s$      û
 	r   c                       s°   e Zd Z‡ fdd„Zedd„ ƒZefdd„Zedfdd	„Zdd
d„Z	edfdd„Z
edfdd„Zd dd„Zd!dd„Zd"dd„Zd#dd„Zedfdd„Zd$dd„Zdd„ Z‡  ZS )%Ú
RedisCachec                    sD   t ƒ  |¡ t|tƒr&t d|¡| _n|| _t| _| 	di ¡| _
d S )Nz[;,]ÚOPTIONS)Úsuperr   r   r    ÚreÚsplitr   r   Ú_classr?   Ú_options)r   ÚserverÚparams©Ú	__class__r   r   r       s    
zRedisCache.__init__c                 C   s   | j | jfi | j¤ŽS r   )r^   r   r_   rI   r   r   r   Ú_cacheª   s    zRedisCache._cachec                 C   s(   |t kr| j}|d u rd S tdt|ƒƒS )Nr   )r   Zdefault_timeoutÚmaxr   )r   r;   r   r   r   Úget_backend_timeout®   s    zRedisCache.get_backend_timeoutNc                 C   s$   | j ||d�}| j |||  |¡¡S ©N©Úversion)Úmake_and_validate_keyrd   r>   rf   ©r   r2   r:   r;   ri   r   r   r   r>   µ   s    zRedisCache.addc                 C   s   | j ||d�}| j ||¡S rg   )rj   rd   r?   )r   r2   r@   ri   r   r   r   r?   ¹   s    zRedisCache.getc                 C   s(   | j ||d�}| j |||  |¡¡ d S rg   )rj   rd   r8   rf   rk   r   r   r   r8   ½   s    zRedisCache.setc                 C   s"   | j ||d�}| j ||  |¡¡S rg   )rj   rd   rC   rf   )r   r2   r;   ri   r   r   r   rC   Á   s    zRedisCache.touchc                 C   s   | j ||d�}| j |¡S rg   )rj   rd   r9   ©r   r2   ri   r   r   r   r9   Å   s    zRedisCache.deletec                    s:   ‡‡fdd„|D ƒ‰ ˆj  ˆ  ¡ ¡}‡ fdd„| ¡ D ƒS )Nc                    s   i | ]}ˆ j |ˆd �|“qS ©rh   ©rj   ©rF   r2   ©r   ri   r   r   rJ   Ê   s   z'RedisCache.get_many.<locals>.<dictcomp>c                    s   i | ]\}}ˆ | |“qS r   r   rE   )Úkey_mapr   r   rJ   Î   rR   )rd   rM   rL   rT   )r   rL   ri   r=   r   )rq   r   ri   r   rM   É   s
    ÿzRedisCache.get_manyc                 C   s   | j ||d�}| j |¡S rg   )rj   rd   rO   rl   r   r   r   rO   Ð   s    zRedisCache.has_keyr)   c                 C   s   | j ||d�}| j ||¡S rg   )rj   rd   rP   )r   r2   rQ   ri   r   r   r   rP   Ô   s    zRedisCache.incrc                 C   sL   |sg S i }|  ¡ D ]\}}| j||d�}|||< q| j ||  |¡¡ g S rg   )rT   rj   rd   rV   rf   )r   r   r;   ri   Z	safe_datar2   r:   r   r   r   rV   Ø   s    
zRedisCache.set_manyc                    s,   |sd S ‡ ‡fdd„|D ƒ}ˆ j  |¡ d S )Nc                    s   g | ]}ˆ j |ˆd �‘qS rm   rn   ro   rp   r   r   Ú
<listcomp>å   rR   z*RedisCache.delete_many.<locals>.<listcomp>)rd   rW   )r   rL   ri   Z	safe_keysr   rp   r   rW   â   s    zRedisCache.delete_manyc                 C   s
   | j  ¡ S r   )rd   rX   rI   r   r   r   rX   è   s    zRedisCache.clear)NN)N)N)N)r)   N)N)r   r   r   r   r   rd   r   rf   r>   r?   r8   rC   r9   rM   rO   rP   rV   rW   rX   Ú__classcell__r   r   rb   r   rY   Ÿ   s   








rY   )Ú__doc__r   r+   r\   Zdjango.core.cache.backends.baser   r   Zdjango.utils.functionalr   Zdjango.utils.module_loadingr   r   r   rY   r   r   r   r   Ú<module>   s    