a
    Lcòf�  ã                   @   sl   d Z ddlZddlZddlmZmZmZmZ ddlm	Z	 G dd„ deƒZ
G dd„ de
ƒZG d	d
„ d
e
ƒZdS )zMemcached cache backendé    N)ÚDEFAULT_TIMEOUTÚ	BaseCacheÚInvalidCacheKeyÚmemcache_key_warnings)Úcached_propertyc                       sÂ   e Zd Z‡ fdd„Ze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„ Zd&dd„Zed	fdd„Zd'dd„Zdd „ Zd!d"„ Z‡  ZS )(ÚBaseMemcachedCachec                    sT   t ƒ  |¡ t|tƒr&t d|¡| _n|| _|| _|| _|j	| _
| d¡pLi | _d S )Nz[;,]ÚOPTIONS)ÚsuperÚ__init__Ú
isinstanceÚstrÚreÚsplitÚ_serversÚLibraryValueNotFoundExceptionÚ_libZClientÚ_classÚgetÚ_options)ÚselfÚserverÚparamsÚlibraryÚvalue_not_found_exception©Ú	__class__© úa/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/core/cache/backends/memcached.pyr
      s    
zBaseMemcachedCache.__init__c                 C   s   | j S ©N)r   ©r   r   r   r   Úclient_servers   s    z!BaseMemcachedCache.client_serversc                 C   s   | j | jfi | j¤ŽS )zQ
        Implement transparent thread-safe access to a memcached client.
        )r   r    r   r   r   r   r   Ú_cache#   s    zBaseMemcachedCache._cachec                 C   sJ   |t kr| j}|du rdS t|ƒdkr*d}|dkrB|tt ¡ ƒ7 }t|ƒS )z–
        Memcached deals with long (> 30 days) timeouts in a special
        way. Call this function to obtain a safe value for your timeout.
        Nr   éÿÿÿÿi �' )r   Zdefault_timeoutÚintÚtime)r   Útimeoutr   r   r   Úget_backend_timeout*   s    z&BaseMemcachedCache.get_backend_timeoutNc                 C   s$   | j ||d�}| j |||  |¡¡S ©N©Úversion)Úmake_and_validate_keyr!   Úaddr&   ©r   ÚkeyÚvaluer%   r)   r   r   r   r+   E   s    zBaseMemcachedCache.addc                 C   s   | j ||d�}| j ||¡S r'   )r*   r!   r   )r   r-   Údefaultr)   r   r   r   r   I   s    zBaseMemcachedCache.getc                 C   s4   | j ||d�}| j |||  |¡¡s0| j |¡ d S r'   )r*   r!   Úsetr&   Údeleter,   r   r   r   r0   M   s    zBaseMemcachedCache.setc                 C   s&   | j ||d�}t| j ||  |¡¡ƒS r'   )r*   Úboolr!   Útouchr&   ©r   r-   r%   r)   r   r   r   r3   T   s    zBaseMemcachedCache.touchc                 C   s   | j ||d�}t| j |¡ƒS r'   )r*   r2   r!   r1   )r   r-   r)   r   r   r   r1   X   s    zBaseMemcachedCache.deletec                    s:   ‡‡fdd„|D ƒ‰ ˆj  ˆ  ¡ ¡}‡ fdd„| ¡ D ƒS )Nc                    s   i | ]}ˆ j |ˆd �|“qS ©r(   ©r*   ©Ú.0r-   ©r   r)   r   r   Ú
<dictcomp>]   s   z/BaseMemcachedCache.get_many.<locals>.<dictcomp>c                    s   i | ]\}}ˆ | |“qS r   r   )r8   ÚkÚv)Úkey_mapr   r   r:   a   ó    )r!   Z	get_multiÚkeysÚitems)r   r?   r)   Úretr   )r=   r   r)   r   Úget_many\   s
    ÿzBaseMemcachedCache.get_manyc                 K   s   | j  ¡  d S r   )r!   Zdisconnect_all©r   Úkwargsr   r   r   Úclosec   s    zBaseMemcachedCache.closeé   c                 C   sl   | j ||d�}z,|dk r*| j || ¡}n| j ||¡}W n | jyR   d }Y n0 |d u rhtd| ƒ‚|S )Nr(   r   zKey '%s' not found)r*   r!   ZdecrÚincrr   Ú
ValueError)r   r-   Údeltar)   Úvalr   r   r   rG   g   s    
zBaseMemcachedCache.incrc           	         s^   i }i ‰ |  ¡ D ]&\}}| j||d�}|||< |ˆ |< q| j ||  |¡¡}‡ fdd„|D ƒS )Nr(   c                    s   g | ]}ˆ | ‘qS r   r   )r8   r;   ©Zoriginal_keysr   r   Ú
<listcomp>‚   r>   z/BaseMemcachedCache.set_many.<locals>.<listcomp>)r@   r*   r!   Z	set_multir&   )	r   Údatar%   r)   Z	safe_datar-   r.   Zsafe_keyZfailed_keysr   rK   r   Úset_manyx   s    

ÿzBaseMemcachedCache.set_manyc                    s$   ‡ ‡fdd„|D ƒ}ˆ j  |¡ d S )Nc                    s   g | ]}ˆ j |ˆd �‘qS r5   r6   r7   r9   r   r   rL   …   r>   z2BaseMemcachedCache.delete_many.<locals>.<listcomp>)r!   Zdelete_multi)r   r?   r)   r   r9   r   Údelete_many„   s    zBaseMemcachedCache.delete_manyc                 C   s   | j  ¡  d S r   )r!   Z	flush_allr   r   r   r   Úclearˆ   s    zBaseMemcachedCache.clearc                 C   s   t |ƒD ]}t|ƒ‚qd S r   )r   r   )r   r-   Úwarningr   r   r   Úvalidate_key‹   s    zBaseMemcachedCache.validate_key)NN)N)N)rF   N)N)Ú__name__Ú
__module__Ú__qualname__r
   Úpropertyr    r   r!   r   r&   r+   r   r0   r3   r1   rB   rE   rG   rN   rO   rP   rR   Ú__classcell__r   r   r   r   r      s$   






r   c                       sB   e Zd ZdZ‡ fdd„Zedd„ ƒZedfdd„Zd	d
„ Z	‡  Z
S )ÚPyLibMCCachez2An implementation of a cache binding using pylibmcc                    s"   dd l }tƒ j||||jd� d S )Nr   ©r   r   )Úpylibmcr	   r
   ZNotFound)r   r   r   rZ   r   r   r   r
   “   s    
ÿzPyLibMCCache.__init__c                 C   s4   g }| j D ]$}| | d¡r(|dd … n|¡ q
|S )Nzunix:é   )r   ÚappendÚ
startswith)r   Úoutputr   r   r   r   r    š   s    
"zPyLibMCCache.client_serversNc                 C   s6   | j ||d�}|dkr"| j |¡S | j ||  |¡¡S )Nr(   r   )r*   r!   r1   r3   r&   r4   r   r   r   r3   ¡   s    zPyLibMCCache.touchc                 K   s   d S r   r   rC   r   r   r   rE   §   s    zPyLibMCCache.close)rS   rT   rU   Ú__doc__r
   rV   r    r   r3   rE   rW   r   r   r   r   rX   �   s   
rX   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚPyMemcacheCachez6An implementation of a cache binding using pymemcache.c                    sB   dd l }tƒ j|||td� | jj| _dd|jjdœ| j	¥| _	d S )Nr   rY   TF)Zallow_unicode_keysZdefault_noreplyÚserde)
Zpymemcache.serder	   r
   ÚKeyErrorr   Z
HashClientr   ra   Zpickle_serder   )r   r   r   Z
pymemcacher   r   r   r
   °   s    ÿ
ýüzPyMemcacheCache.__init__)rS   rT   rU   r_   r
   rW   r   r   r   r   r`   ­   s   r`   )r_   r   r$   Zdjango.core.cache.backends.baser   r   r   r   Zdjango.utils.functionalr   r   rX   r`   r   r   r   r   Ú<module>   s    