B
    `D                 @   s   d dl mZ ddlmZmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZmZmZ ddlZd	Zi ZdddZdd ZG dd deZG dd deZG dd deZdS )   )PY2    )NamespaceManager	Container)sha1)InvalidCacheBackendErrorMissingCacheParameter)file_synchronizer)verify_directorySyncDictparse_memcached_behaviorsN   autoc                sh   | t krt |  S dd dd dd dd   fd	d
} |d}||    t | < }|S )Nc               S   s   dd l a t S )Nr   )pylibmc r   r   \/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/beaker/ext/memcached.py_pylibmc   s    z_load_client.<locals>._pylibmcc               S   s   dd l a td t S )Nr   z]cmemcache is known to have serious concurrency issues; consider using 'memcache' or 'pylibmc')	cmemcachewarningswarnr   r   r   r   
_cmemcache   s    
z _load_client.<locals>._cmemcachec               S   s   dd l a t S )Nr   )memcacher   r   r   r   	_memcache    s    z_load_client.<locals>._memcachec               S   s   dd l a t S )Nr   )
bmemcachedr   r   r   r   _bmemcached%   s    z!_load_client.<locals>._bmemcachedc           	      s>   x8 fD ] } y|  S  t k
r,   Y qX qW tdd S )NzQMemcached cache backend requires one of: 'pylibmc' or 'memcache' to be installed.)ImportErrorr   )Z_client)r   r   r   r   r   r   _auto*   s    
z_load_client.<locals>._auto)r   r   r   r   r   )_client_libs)namer   clientsZclibr   )r   r   r   r   r   _load_client   s    r    c             C   s   | dkp|j dS )Nr   )__name__
startswith)Zmemcache_module_configmemcache_clientr   r   r   _is_configured_for_pylibmc@   s    r$   c               @   sz   e Zd ZdZe Zdd Zdd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d Zdd Zdd ZdS )MemcachedNamespaceManagerzKProvides the :class:`.NamespaceManager` API over a memcache client library.c             O   s6   | dd}t|}t||r(ttS ttS d S )Nmemcache_moduler   )popr    r$   object__new__PyLibMCNamespaceManagerr%   )clsargskwr&   r#   r   r   r   r)   J   s
    

z!MemcachedNamespaceManager.__new__r   Nc             K   s|   t | | t| }|s tdd | _|r2|| _n|r@|d | _| jrPt| j t||sxtj	||f|j
|d| _d S )Nzurl is requiredz/container_mcd_lock;)r   __init__r   r   lock_dirr
   r$   r%   r   getClientsplitmc)self	namespaceurlr&   data_dirr0   r-   _memcache_moduler   r   r   r/   T   s     


z"MemcachedNamespaceManager.__init__c             C   s   t d| j|f | jdS )Nz!memcachedcontainer/funclock/%s/%s)
identifierr0   )r	   r6   r0   )r5   keyr   r   r   get_creation_lockq   s    z+MemcachedNamespaceManager.get_creation_lockc             C   sT   t |ts|d}| jd | dd}t|tkrPtsD|d}t	|
 }|S )Nascii_ u   Â·zutf-8)
isinstancestrdecoder6   replacelenMAX_KEY_LENGTHr   encoder   	hexdigest)r5   r;   Zformated_keyr   r   r   _format_keyv   s    


z%MemcachedNamespaceManager._format_keyc             C   s   | j | |S )N)r4   r1   rH   )r5   r;   r   r   r   __getitem__   s    z%MemcachedNamespaceManager.__getitem__c             C   s   | j | |}|d k	S )N)r4   r1   rH   )r5   r;   valuer   r   r   __contains__   s    z&MemcachedNamespaceManager.__contains__c             C   s   || kS )Nr   )r5   r;   r   r   r   has_key   s    z!MemcachedNamespaceManager.has_keyc             C   s6   |r| j j| |||d n| j | || d S )N)time)r4   setrH   )r5   r;   rJ   
expiretimer   r   r   	set_value   s    z#MemcachedNamespaceManager.set_valuec             C   s   |  || d S )N)rP   )r5   r;   rJ   r   r   r   __setitem__   s    z%MemcachedNamespaceManager.__setitem__c             C   s   | j | | d S )N)r4   deleterH   )r5   r;   r   r   r   __delitem__   s    z%MemcachedNamespaceManager.__delitem__c             C   s   | j   d S )N)r4   	flush_all)r5   r   r   r   	do_remove   s    z#MemcachedNamespaceManager.do_removec             C   s   t dd S )Nz=Memcache caching does not support iteration of all cache keys)NotImplementedError)r5   r   r   r   keys   s    zMemcachedNamespaceManager.keys)r   NN)N)r!   
__module____qualname____doc__r   r   r)   r/   r<   rH   rI   rK   rL   rP   rQ   rS   rU   rW   r   r   r   r   r%   E   s    


r%   c                   s`   e Zd ZdZe Z fddZdd Zdd Zdd	 Z	dddZ
dd Zdd Zdd Z  ZS )r*   z)Provide thread-local support for pylibmc.c       
   	      s   t t| j|| |dd}t| }|dd}|dd }|dd }|d}t|}	tjj||f|j|	d|	|d	k||d
| _
tj||ftj| j
| _d S )Nr&   r   protocoltextusernamepasswordr7   r.   binary)Zservers	behaviorsr_   r]   r^   )superr*   r/   r1   r   r   r%   r   r2   r3   r4   poolsr   ZThreadMappedPoolpool)
r5   argr-   r&   r9   r[   r]   r^   r7   r`   )	__class__r   r   r/      s"    


z PyLibMCNamespaceManager.__init__c          	   C   s&   | j  }|| |S Q R X d S )N)rc   reserver1   rH   )r5   r;   r4   r   r   r   rI      s    z#PyLibMCNamespaceManager.__getitem__c          	   C   s.   | j  }|| |}|d k	S Q R X d S )N)rc   rf   r1   rH   )r5   r;   r4   rJ   r   r   r   rK      s    z$PyLibMCNamespaceManager.__contains__c             C   s   || kS )Nr   )r5   r;   r   r   r   rL      s    zPyLibMCNamespaceManager.has_keyNc          	   C   sH   | j  4}|r(|j| |||d n|| || W d Q R X d S )N)rM   )rc   rf   rN   rH   )r5   r;   rJ   rO   r4   r   r   r   rP      s    z!PyLibMCNamespaceManager.set_valuec             C   s   |  || d S )N)rP   )r5   r;   rJ   r   r   r   rQ      s    z#PyLibMCNamespaceManager.__setitem__c          	   C   s*   | j  }|| | W d Q R X d S )N)rc   rf   rR   rH   )r5   r;   r4   r   r   r   rS      s    z#PyLibMCNamespaceManager.__delitem__c          	   C   s"   | j  }|  W d Q R X d S )N)rc   rf   rT   )r5   r4   r   r   r   rU      s    z!PyLibMCNamespaceManager.do_remove)N)r!   rX   rY   rZ   r   rb   r/   rI   rK   rL   rP   rQ   rS   rU   __classcell__r   r   )re   r   r*      s   
r*   c               @   s   e Zd ZdZeZdS )MemcachedContainerzAContainer class which invokes :class:`.MemcacheNamespaceManager`.N)r!   rX   rY   rZ   r%   Znamespace_classr   r   r   r   rh      s   rh   )r   )_compatr   Zbeaker.containerr   r   Zbeaker.crypto.utilr   Zbeaker.exceptionsr   r   Zbeaker.synchronizationr	   Zbeaker.utilr
   r   r   r   rE   r   r    r$   r%   r*   rh   r   r   r   r   <module>   s   
1Z9