
    Xf                     R    d dl Z d dlZd dlZd dlmZ d dlmZ  G d de          ZdS )    N)	BaseCache)BaseSerializerc                       e Zd ZdZ e            Z	 	 	 	 	 d"dej        dej        e	         dej        e	         d	e
d
ej        e	         dej        f fdZdej        fdZdej        fdZde	dej        fdZde	defdZ	 	 d#de	dej        dej        e
         dej        e         dej        f
dZd$de	dej        dej        e
         dej        fdZ	 d$dej        e	ej        f         dej        e
         dej        ej                 fdZde	dej        ej                 fdZde	dej        e	ej        f         fdZd$de	dej        dej        e
         dej        fdZde	defdZde	dej        ej                 fd Zdefd!Z xZS )%MongoDbCachea  
    Implementation of cachelib.BaseCache that uses mongodb collection
    as the backend.

    Limitations: maximum MongoDB document size is 16mb

    :param client: mongodb client or connection string
    :param db: mongodb database name
    :param collection: mongodb collection name
    :param default_timeout: Set the timeout in seconds after which cache entries
                            expire
    :param key_prefix: A prefix that should be added to all keys.

    Ncache-dbcache-collection,  clientdb
collectiondefault_timeout
key_prefixkwargsc                    t                                          |           	 dd l}n$# t          $ r t	          j        d           Y nw xY w|t          |t                    r|                    |          }||         |         | _	        | j	        
                                }d |                                D             }	d|	vr| j	                            dd           |pd| _        || _        d S )	Nr   zno pymongo module found)hostc                 4    h | ]}|d          D ]
}|d         S )keyr    ).0valuesubkeys      D/var/www/piapp/venv/lib/python3.11/site-packages/cachelib/mongodb.py	<setcomp>z(MongoDbCache.__init__.<locals>.<setcomp>.   sA     
 
 
U5\
 
;AF1I
 
 
 
    idT)unique )super__init__pymongoImportErrorloggingwarning
isinstancestrMongoClientr
   index_informationvaluescreate_indexr   r   )selfr
   r   r   r   r   r   r    
index_infoall_keys	__class__s             r   r   zMongoDbCache.__init__   s    	)))	7NNNN 	7 	7 	7O566666	7 >Z44>((f(55FRj,[2244

 
#-#4#4#6#6
 
 
 xK$$T$$777$*$s   ) A
	A
returnc                     t           j                                                             t           j        j                  S )z<Return a tz-aware UTC datetime representing the current time)tzinfo)datetimeutcnowreplacetimezoneutcr*   s    r   _utcnowzMongoDbCache._utcnow6   s.     ''))119J9N1OOOr   c                 f    | j                             dd|                                 ii          }|S )N
expirationz$lte)r
   delete_manyr7   )r*   ress     r   _expire_recordszMongoDbCache._expire_records:   s.    k%%|fdllnn5M&NOO
r   r   c                     |                                   | j                            d| j        |z   i          }d}|r | j                            |d                   }|S )z
        Get a cache item

        :param key: The cache key of the item to fetch
        :return: cache value if not expired, else None
        r   Nval)r<   r
   find_oner   
serializerloads)r*   r   recordr   s       r   getzMongoDbCache.get>   sb     	%%tT_s-B&CDD 	9O))&-88Er   c                 ~    | j                             d| j        |z   i          }t          |j        dk              }|S )z
        Deletes an item from the cache.  This is a no-op if the item doesn't
        exist

        :param key: Key of the item to delete.
        :return: True if the key existed and was deleted
        r   r   )r
   
delete_oner   booldeleted_count)r*   r   r;   deleteds       r   deletezMongoDbCache.deleteL   s?     k$$dDOc,A%BCCs(1,--r   Tr   timeout	overwritec                 j   |                      |          }|                                 }|s|                     |          rdS | j                            |          }| j        |z   |d}|dk    r|t          j        |          z   |d<   | j        	                    d| j        |z   id|id           dS )	a*  
        Store a cache item, with the option to not overwrite existing items

        :param key: Cache key to use
        :param value: a serializable object
        :param timeout: The timeout in seconds for the cached item, to override
                        the default
        :param overwrite: If true, overwrite any existing cache item with key.
                          If false, the new value will only be stored if no
                          non-expired cache item exists with key.
        :return: True if the new item was stored.
        Fr   r>   r   secondsr9   r   $setT)
_normalize_timeoutr7   hasr@   dumpsr   r1   	timedeltar
   
update_one)r*   r   r   rJ   rK   nowdumprB   s           r   _setzMongoDbCache._setX   s    & ))'22llnn 	 xx}} u$$U++#-d;;Q;;#&);G)L)L)L#LF< do&;<vv>NPTUUUtr   c                 \    |                                   |                     |||d          S )NTrJ   rK   r<   rX   r*   r   r   rJ   s       r   setzMongoDbCache.set|   s.    yyeWyEEEr   mappingc                                                        ddlm} g }                                 }                     |          }|                                D ]z\  }} j                            |          } j        |z   |d}	|dk    r|t          j
        |          z   |	d<   |                     |d j        |z   id|	id	                     { j                            |          }
t          |                                          }|
j        d
         t#          |          k    rL j                            dd fd|D             ii          }g }|D ]}|                    |d                    |S )Nr   )	UpdateOnerM   rN   r9   r   rP   T)upsert	nUpserted$inc                 $    g | ]}j         |z   S r   r   r   r   r*   s     r   
<listcomp>z)MongoDbCache.set_many.<locals>.<listcomp>   s     FFF## 5FFFr   )r<   r    r`   r7   rQ   itemsr@   rS   r   r1   rT   appendr
   
bulk_writelistkeysbulk_api_resultlenfind)r*   r^   rJ   r`   
operationsrV   r   r>   rW   rB   resultrl   queryitems   `             r   set_manyzMongoDbCache.set_many   s    	%%%%%%
llnn))'22 		 		HC?((--D Oc1$??F{{'*X-?-P-P-P'P|$	43!67&&9IRVWWW    ''
33GLLNN##!+.#d));;K$$FFFFFFFGH E D ( (DJ''''r   rl   c                 z     | j         | }g }|D ]+}|                    |                    |d                      ,|S N)get_dictri   rC   )r*   rl   resultsr(   r   s        r   get_manyzMongoDbCache.get_many   sL    $-& 	2 	2CMM'++c4001111r   c                 N                                        j                            dd fd|D             ii          }t                              |d           }|D ]G} j                            |d                   }|||d         t           j                  d          <   H|S )Nr   rc   c                 $    g | ]}j         |z   S r   re   rf   s     r   rg   z)MongoDbCache.get_dict.<locals>.<listcomp>   s     BBBcDOc1BBBr   r>   )	r<   r
   ro   dictfromkeysr@   rA   rn   r   )r*   rl   rr   rx   rs   r   s   `     r   rw   zMongoDbCache.get_dict   s      EBBBBTBBBCD
 
 --d++ 	@ 	@DO))$u+66E:?GDJs4?3355677r   c                 \    |                                   |                     |||d          S )NFrZ   r[   r\   s       r   addzMongoDbCache.add   s.    yyeWyFFFr   c                 \    |                                   |                     |          }|d uS rv   )r<   rC   )r*   r   rB   s      r   rR   zMongoDbCache.has   s.    #T!!r   c                 @                                       t          |          }dd fd|D             ii} j                            |          }|j        t          |          k    r4 fd j                            |          D             fd|D             }|S )Nr   rc   c                 $    g | ]}j         |z   S r   re   rf   s     r   rg   z,MongoDbCache.delete_many.<locals>.<listcomp>   s      G G G33!6 G G Gr   c                 T    g | ]$}|d          t          j                  d         %S )r   N)rn   r   )r   rs   r*   s     r   rg   z,MongoDbCache.delete_many.<locals>.<listcomp>   s?       7;T
3t//112  r   c                     g | ]}|v|	S r   r   )r   rs   existing_keyss     r   rg   z,MongoDbCache.delete_many.<locals>.<listcomp>   s#    FFFDD,E,E4,E,E,Er   )r<   rk   r
   r:   rG   rn   ro   )r*   rl   r;   filterrq   r   s   `    @r   r:   zMongoDbCache.delete_many   s    4jj G G G G$ G G GHI((003t99,,   ?C{?O?OPV?W?W  M GFFFDFFFC
r   c                 8    | j                                          dS NT)r
   dropr6   s    r   clearzMongoDbCache.clear   s    tr   )Nr   r   r	   Nr   rv   )__name__
__module____qualname____doc__r   r@   _tAnyOptionalr%   intr   r7   r<   rC   rF   rI   rX   r]   DictListrt   ry   rw   r   rR   r:   r   __classcell__)r-   s   @r   r   r   	   sR          !!J )'9"'+% %% K% K$	%
 % K$% &% % % % % %6P P P P P    s rv    
# 
$ 
 
 
 
  %)'+" "" v" S!	"
 ;t$" 
" " " "HF Fs F26 FBK4D FPRPV F F F F
 JN wsBF{+68k#6F	   >c bgbfo    	c 	bgc26k&: 	 	 	 	G Gs G26 GBK4D GPRPV G G G G"s "t " " " "
     t        r   r   )	r1   r"   typingr   cachelib.baser   cachelib.serializersr   r   r   r   r   <module>r      s          # # # # # # / / / / / /A A A A A9 A A A A Ar   