o
    wvXj\  ã                   @   s¸   d Z ddlmZmZ ddlmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ d
ZdgZdZdZdd„ Zdd„ ZG dd„ deƒZeeedd„ dœZG dd„ deƒZdS )z-Memcached and in-memory cache result backend.é    )Úabsolute_importÚunicode_literals)Úbytes_to_strÚensure_bytes)Úcached_property)ÚImproperlyConfigured)ÚPY3)ÚLRUCacheé   )ÚKeyValueStoreBackend)ÚCacheBackendNzBThe Memcached backend requires either pylibmc or python-memcached.zYThe cache backend {0!r} is unknown,
Please use one of the following backends instead: {1}c                  C   s|   t d d u r:dt} }zdd l}d} W n ty.   zdd l}W n ty+   ttƒ‚w Y nw tr3t}| ||ft d< t d S )Nr   FT)	Ú_impr   ÚpylibmcÚImportErrorÚmemcacher   ÚREQUIRES_BACKENDr   r   )Ú
is_pylibmcÚmemcache_key_tr   © r   úR/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/backends/cache.pyÚimport_best_memcache   s"   
ÿÿþr   c                     s.   t ƒ \}}}|j }‰ |s‡ fdd„}||fS )Nc                     s   |  dd ¡ ˆ | i |¤ŽS )NÚ	behaviors)Úpop)ÚargsÚkwargs©Ú_Clientr   r   ÚClient4   s   z!get_best_memcache.<locals>.Client)r   r   )r   r   r   r   Úkey_tr   r   r   r   Úget_best_memcache-   s
   
r   c                   @   sF   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zddd„Zdd„ Z	dS )ÚDummyClientc                 O   s   t dd�| _d S )Niˆ  )Úlimit)r	   Úcache)Úselfr   r   r   r   r   Ú__init__=   s   zDummyClient.__init__c                 O   ó   | j  |¡S ©N)r"   Úget©r#   Úkeyr   r   r   r   r   r'   @   ó   zDummyClient.getc                    s   | j ‰ ‡ fdd„|D ƒS )Nc                    s   i | ]}|ˆ v r|ˆ | “qS r   r   )Ú.0Úk©r"   r   r   Ú
<dictcomp>E   s    z)DummyClient.get_multi.<locals>.<dictcomp>r-   ©r#   Úkeysr   r-   r   Ú	get_multiC   s   zDummyClient.get_multic                 O   s   || j |< d S r&   r-   )r#   r)   Úvaluer   r   r   r   r   ÚsetG   ó   zDummyClient.setc                 O   s   | j  |d ¡ d S r&   )r"   r   r(   r   r   r   ÚdeleteJ   ó   zDummyClient.deleter
   c                 C   ó   | j  ||¡S r&   )r"   Úincr)r#   r)   Údeltar   r   r   r8   M   r4   zDummyClient.incrc                 C   s   d S r&   r   )r#   r)   Úexpirer   r   r   ÚtouchP   s   zDummyClient.touchN)r
   )
Ú__name__Ú
__module__Ú__qualname__r$   r'   r1   r3   r5   r8   r;   r   r   r   r   r    ;   s    
r    c                   C   s   t tfS r&   )r    r   r   r   r   r   Ú<lambda>X   s    r?   )r   Ú	memcachedr   Úmemoryc                       s”   e Zd ZdZdZdZdZdZ		d‡ fdd„	Zdd„ Z	dd	„ Z
d
d„ Zdd„ Z‡ fdd„Zdd„ Zdd„ Zedd„ ƒZd‡ fdd„	Zdd„ Z‡  ZS )r   zCache result backend.NTc           	   
      sÞ   |si n|}t t| ƒj|fi |¤Ž || _t| jjjfi |¤Ž| _|p)|p)| jjj	| _
| j
rA| j
 d¡\| _
}}| d¡ d¡| _| j|td�| _zt| j
 ƒ \| _| _W n tyh   tt | j
d t¡¡ƒ‚w |  ¡  d S )Nz://ú/ú;)Útypez, )Úsuperr   r$   ÚurlÚdictÚappÚconfÚcache_backend_optionsÚoptionsÚcache_backendÚbackendÚ	partitionÚrstripÚsplitÚserversÚprepare_expiresÚintÚexpiresÚbackendsr   r   ÚKeyErrorr   ÚUNKNOWN_BACKENDÚformatÚjoinÚ_encode_prefixes)	r#   rH   rT   rM   rK   rF   r   Ú_rQ   ©Ú	__class__r   r   r$   d   s&   ÿÿÿzCacheBackend.__init__c                 C   r%   r&   )Úclientr'   ©r#   r)   r   r   r   r'   y   r*   zCacheBackend.getc                 C   r%   r&   )r^   r1   r/   r   r   r   Úmget|   r*   zCacheBackend.mgetc                 C   s   | j  ||| j¡S r&   )r^   r3   rT   )r#   r)   r2   Ústater   r   r   r3      r6   zCacheBackend.setc                 C   r%   r&   )r^   r5   r_   r   r   r   r5   ‚   r*   zCacheBackend.deletec                    s:   |   |j¡}| jj|d| jd� tt| ƒj||fi |¤ŽS )Nr   )Útime)Úget_key_for_chordÚidr^   r3   rT   rE   r   Ú_apply_chord_incr)r#   Úheader_resultÚbodyr   Ú	chord_keyr\   r   r   re   …   s   
ÿÿzCacheBackend._apply_chord_incrc                 C   r%   r&   )r^   r8   r_   r   r   r   r8   ‹   r*   zCacheBackend.incrc                 C   r7   r&   )r^   r;   )r#   r)   r2   r   r   r   r:   Ž   r4   zCacheBackend.expirec                 C   s   | j | jfi | j¤ŽS r&   )r   rQ   rK   )r#   r   r   r   r^   ‘   s   zCacheBackend.clientr   c                    sN   |si n|}d  | j¡}d | j|¡}| || j| jdœ¡ tt| ƒ 	||¡S )NrC   ú
{0}://{1}/)rM   rT   rK   )
rY   rQ   rX   rM   ÚupdaterT   rK   rE   r   Ú
__reduce__)r#   r   r   rQ   rM   r\   r   r   rk   •   s   þÿzCacheBackend.__reduce__c                 O   s   d  | j¡}d | j|¡S )zcReturn the backend as an URI.

        This properly handles the case of multiple servers.
        rC   ri   )rY   rQ   rX   rM   )r#   r   r   rQ   r   r   r   Úas_uriŸ   s   zCacheBackend.as_uri)NNNN)r   N)r<   r=   r>   Ú__doc__rQ   Úsupports_autoexpireÚsupports_native_joinÚimplements_incrr$   r'   r`   r3   r5   re   r8   r:   r   r^   rk   rl   Ú__classcell__r   r   r\   r   r   \   s(    ÿ

r   )rm   Ú
__future__r   r   Úkombu.utils.encodingr   r   Úkombu.utils.objectsr   Úcelery.exceptionsr   Úcelery.fiver   Úcelery.utils.functionalr	   Úbaser   Ú__all__r   r   rW   r   r   Úobjectr    rU   r   r   r   r   r   Ú<module>   s*   ü