o
    ]f9                     @   s4   d dl Zd dlmZ d dlmZ G dd deZdS )    N)	BaseCache)RedisSerializerc                   @   s  e Zd ZU dZdZejed< dZejed< e	 Z
						d2d	ejd
edeje dededeje dejfddZdeje defddZdedejfddZdedejej fddZd3dedejdeje dejfddZd3dedejdeje dejfdd Z	d3d!ejeejf deje dejej fd"d#Zdedefd$d%Zdedejej fd&d'Zdedefd(d)Zdefd*d+Zd4ded-edejfd.d/Zd4ded-edejfd0d1ZdS )5
RedisCachea  Uses the Redis key-value store as a cache backend.

    The first argument can be either a string denoting address of the Redis
    server or an object resembling an instance of a redis.Redis class.

    Note: Python Redis API already takes care of encoding unicode strings on
    the fly.

    :param host: address of the Redis server or an object which API is
                 compatible with the official Python Redis client (redis-py).
    :param port: port number on which Redis server listens for connections.
    :param password: password authentication for the Redis server.
    :param db: db (zero-based numeric index) on Redis Server to connect.
    :param default_timeout: the default timeout that is used if no timeout is
                            specified on :meth:`~BaseCache.set`. A timeout of
                            0 indicates that the cache never expires.
    :param key_prefix: A prefix that should be added to all keys.

    Any additional keyword arguments will be passed to ``redis.Redis``.
    N_read_client_write_client	localhost  r   ,  hostportpassworddbdefault_timeout
key_prefixkwargsc           
   
   K   s   t | | |d u rtdt|trGzdd l}W n ty* }	 ztd|	d }	~	ww |dd r5td|j	d||||d| | _
| _n| | _| _
|pPd| _d S )	Nz)RedisCache host parameter may not be Noner   zno redis module founddecode_responsesz0decode_responses is not supported by RedisCache.)r
   r   r   r     )r   __init__
ValueError
isinstancestrredisImportErrorRuntimeErrorgetRedisr   r   r   )
selfr
   r   r   r   r   r   r   r   errr   r   G/home/ubuntu/webapp/venv/lib/python3.10/site-packages/cachelib/redis.pyr   !   s&   


zRedisCache.__init__timeoutreturnc                 C   s   t | |}|dkrd}|S )zNormalize timeout by setting it to default of 300 if
        not defined (None) or -1 if explicitly set to zero.

        :param timeout: timeout to normalize.
        r   )r   _normalize_timeout)r   r    r   r   r   r#   <   s   zRedisCache._normalize_timeoutkeyc                 C   s   | j | j| j| S N)
serializerloadsr   r   r   r   r$   r   r   r   r   G   s   zRedisCache.getkeysc                    s<    j r fdd|D }nt|} fdd j|D S )Nc                       g | ]} j | qS r   r   .0r$   r   r   r   
<listcomp>L       z'RedisCache.get_many.<locals>.<listcomp>c                    s   g | ]} j |qS r   )r&   r'   )r-   xr.   r   r   r/   O       )r   listr   mgetr   r)   prefixed_keysr   r.   r   get_manyJ   s   zRedisCache.get_manyvaluec                 C   sT   |  |}| j|}|dkr| jj| j| |d}|S | jj| j| ||d}|S )Nr"   namer8   r:   r8   time)r#   r&   dumpsr   setr   setex)r   r$   r8   r    dumpresultr   r   r   r>   Q   s   
zRedisCache.setc                 C   sR   |  |}| j|}| jj| j| |d}|r'|dkr'| jj| j| |d |S )Nr9   r"   )r:   r<   )r#   r&   r=   r   setnxr   expire)r   r$   r8   r    r@   createdr   r   r   add\   s   
zRedisCache.addmappingc                 C   s   |  |}| jjdd}| D ]$\}}| j|}|dkr)|j| j| |d q|j| j| ||d q|	 }dd t
| |D S )NF)transactionr"   r9   r;   c                 S   s   g | ]\}}|r|qS r   r   )r-   kwas_setr   r   r   r/   t   r2   z'RedisCache.set_many.<locals>.<listcomp>)r#   r   pipelineitemsr&   r=   r>   r   r?   executezipr)   )r   rF   r    piper$   r8   r@   resultsr   r   r   set_manye   s   
zRedisCache.set_manyc                 C      t | j| j| S r%   )boolr   deleter   r(   r   r   r   rS   v      zRedisCache.deletec                    sN   |sg S  j r fdd|D }ndd |D } jj|   fdd|D S )Nc                    r*   r   r+   r,   r.   r   r   r/   }   r0   z*RedisCache.delete_many.<locals>.<listcomp>c                 S   s   g | ]}|qS r   r   r-   rH   r   r   r   r/      s    c                    s   g | ]	}  |s|qS r   )hasrU   r.   r   r   r/      s    )r   r   rS   r5   r   r.   r   delete_manyy   s   zRedisCache.delete_manyc                 C   rQ   r%   )rR   r   existsr   r(   r   r   r   rV      rT   zRedisCache.hasc                 C   sF   d}| j r| j| j d }|r| jj| }t|S | j }t|S )Nr   *)r   r   r)   r   rS   flushdbrR   )r   statusr)   r   r   r   clear   s   
zRedisCache.clear   deltac                 C   s   | j j| j| |dS N)r:   amountr   incrr   r   r$   r^   r   r   r   inc   rT   zRedisCache.incc                 C   s   | j j| j| | dS r_   ra   rc   r   r   r   dec   s   zRedisCache.dec)r   r   Nr   r	   Nr%   )r]   )__name__
__module____qualname____doc__r   _tAny__annotations__r   r   r&   intOptionalr   r   r#   r   Listr7   r>   rE   DictrP   rR   rS   rW   rV   r\   rd   re   r   r   r   r   r      sZ   
 
&&




r   )typingrj   cachelib.baser   cachelib.serializersr   r   r   r   r   r   <module>   s    