o
    US                     @   s   d dl Z d dlmZmZmZmZmZmZ ddlm	Z	 G dd deZ
dd Zd	d
 Zdd Zdd Zdd Zdd Zzd dlmZ d dlmZ W n	 eyQ   Y nw dd ZG dd de
Zdd ZdS )    N)	BaseCache	NullCacheSimpleCacheMemcachedCacheGAEMemcachedCacheFileSystemCache   )
range_typec                   @   s   e Zd Z		dddZdS )SASLMemcachedCacheN,  c                 C   s@   t | | |d u rdg}dd l}|j|||dd| _|| _d S )Nz127.0.0.1:11211r   T)usernamepasswordbinary)r   __init__pylibmcClient_client
key_prefix)selfserversdefault_timeoutr   r   r   r    r   M/home/ubuntu/webapp/venv/lib/python3.10/site-packages/flask_cache/backends.pyr   	   s   
zSASLMemcachedCache.__init__)Nr   NNN)__name__
__module____qualname__r   r   r   r   r   r
      s    r
   c                 C   s   t  S N)r   appconfigargskwargsr   r   r   null   s   r"   c                 C   "   | t|d d t|i |S )NCACHE_THRESHOLD	threshold)updatedictr   r   r   r   r   simple      r)   c                 C   s0   | |d  |t|d d t|i |S )NCACHE_MEMCACHED_SERVERSCACHE_KEY_PREFIXr   )appendr'   r(   r   r   r   r   r   	memcached    s   r/   c                 C   s<   | |d  |t|d |d |d d t|i |S Nr+   CACHE_MEMCACHED_USERNAMECACHE_MEMCACHED_PASSWORDr,   )r   r   r   )r.   r'   r(   r
   r   r   r   r   saslmemcached%   s   r3   c                 C   r#   )Nr,   r-   )r'   r(   r   r   r   r   r   gaememcached,   r*   r4   c                 C   s2   | d|d  |t|d d t|i |S )Nr   	CACHE_DIRr$   r%   )insertr'   r(   r   r   r   r   r   
filesystem0   s   r7   )
RedisCache)from_urlc                 C   s   | t|dd|ddd |d}|r||d< |d}|r'||d	< |d
}|r2||d< |d}|rEt||dd d|d< t|i |S )NCACHE_REDIS_HOST	localhostCACHE_REDIS_PORTi  )hostportCACHE_REDIS_PASSWORDr   r,   r   CACHE_REDIS_DBdbCACHE_REDIS_URL)rA   r=   )r'   r(   getredis_from_urlpopr8   )r   r   r    r!   r   r   	db_number	redis_urlr   r   r   redis<   s(   







rH   c                       sj   e Zd ZdZ fddZ fddZd fdd		Zd fd
d	Zd fdd	Zdd Z	 fddZ
  ZS )SpreadSASLMemcachedCachez
    Simple Subclass of SASLMemcached client that spread value across multiple
    key is they are bigger than a given treshhold.

    Spreading require using pickle to store the value, wich can significantly
    impact the performances.
    c                    s6   | dd| _| dd| _tt| j|i | dS )zR
        chunksize : (int) max size in bytes of chunk stored in memcached
        	chunksizei~ maxchunk    N)rC   rJ   rK   superrI   r   )r   r    r!   	__class__r   r   r   a   s   z!SpreadSASLMemcachedCache.__init__c                    s$   |  |D ]
}tt| | qd S r   )_genkeysrM   rI   delete)r   keyskeyrN   r   r   rQ   i   s   zSpreadSASLMemcachedCache.deleteNTc                    s*   |r
| j |||dS tt| j|||dS )aO  set a value in cache, potentially spreding it across multiple key.

        chunk : (Bool) if set to false, does not try to spread across multiple key.
                this can be faster, but will fail if value is bigger than chunks,
                and require you to get back the object by specifying that it is not spread.

        )timeout)_setrM   rI   set)r   rR   valuerT   chunkrN   r   r   rV   n   s   zSpreadSASLMemcachedCache.setc           	         s   t |d}i }t|}td|| j}t|| jkr!td| j |D ]}|||| j  |d||| j f < q#tt| 	|| d S )N   r   z'Cannot store value in less than %s keys%s.%s)
pickledumpslenr	   rJ   rK   
ValueErrorrM   rI   set_many)	r   rR   rW   rT   
serializedvalueslen_serchksirN   r   r   rU   {   s   &zSpreadSASLMemcachedCache._setc                    s   |r|  |S tt| |S )zget a value in cache, potentially spreded it across multiple key.

        chunk : (Bool) if set to false, get a value set with set(..., chunk=False)
        )_getrM   rI   rC   )r   rR   rX   rN   r   r   rC      s   
zSpreadSASLMemcachedCache.getc                    s    fddt | jD S )Nc                       g | ]}d  |f qS rZ   r   .0rd   rR   r   r   
<listcomp>       z5SpreadSASLMemcachedCache._genkeys.<locals>.<listcomp>)r	   rK   )r   rR   r   rj   r   rP      s   z!SpreadSASLMemcachedCache._genkeysc                    sN    fddt | jD }tt| j| }ddd |D }|s"d S t|S )Nc                    rf   rg   r   rh   rj   r   r   rk      rl   z1SpreadSASLMemcachedCache._get.<locals>.<listcomp> c                 S   s   g | ]}|d ur|qS r   r   )ri   vr   r   r   rk      rl   )r	   rK   rM   rI   get_manyjoinr[   loads)r   rR   to_getresultr`   rN   rj   r   re      s   
zSpreadSASLMemcachedCache._get)NTr   )T)r   r   r   __doc__r   rQ   rV   rU   rC   rP   re   __classcell__r   r   rN   r   rI   W   s    	
rI   c                 C   sB   | |d  |t|d|d|dd t|i |S r0   )r.   r'   r(   rC   rI   r   r   r   r   spreadsaslmemcachedcache   s   rv   )r[   werkzeug.contrib.cacher   r   r   r   r   r   _compatr	   r
   r"   r)   r/   r3   r4   r7   r8   rH   r9   rD   ImportErrorrI   rv   r   r   r   r   <module>   s&     H