§
    X˜¶fõ  ã                   ó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   € ð 
ð 
ð 
ØÀUÈ5Ä\ð
ð 
Ø;AˆF�1ŒIð
ð 
ð 
ð 
ó    Ú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ØˆNˆNˆNˆNøÝð 	7ð 	7ð 	7ÝŒOÐ5Ñ6Ô6Ð6Ð6Ð6ð	7øøøð ˆ>�Z¨µÑ4Ô4ˆ>Ø×(Ò(¨fÐ(Ñ5Ô5ˆFØ˜R”j Ô,ˆŒØ”[×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½Ô9JÔ9NÐ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×%Ò% |°f¸d¿lºl¹n¼nÐ5MÐ&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   € ð 	×ÒÑÔÐØ”×%Ò% t¨T¬_¸sÑ-BÐ&CÑDÔDˆØˆØð 	9Ø”O×)Ò)¨&°¬-Ñ8Ô8ˆEØˆ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×$Ò$ d¨D¬O¸cÑ,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ˆØ�lŠl‰nŒnˆàð 	ð �xŠx˜‰}Œ}ð Ø�uàŒ×$Ò$ UÑ+Ô+ˆØœ¨#Ñ-°dÐ;Ð;ˆà�QŠ;ˆ;Ø#&­Ô);ÀGÐ)LÑ)LÔ)LÑ#LˆF�<Ñ ØŒ×Ò  d¤o¸Ñ&;Ð<¸vÀvÐ>NÐPTÑUÔUÐUØˆtr   c                 ó\   — |                       ¦   «          |                      |||d¬¦  «        S )NT©rJ   rK   ©r<   rX   ©r*   r   r   rJ   s       r   ÚsetzMongoDbCache.set|   s.   € Ø×ÒÑÔÐØ�yŠy˜˜e¨WÀˆ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­  ø€ ð 	×ÒÑÔÐØ%Ð%Ð%Ð%Ð%Ð%àˆ
Ø�lŠl‰nŒnˆØ×)Ò)¨'Ñ2Ô2ˆØŸš™œð 		ð 		‰HˆC�Ø”?×(Ò(¨Ñ-Ô-ˆDà œO¨cÑ1¸$Ð?Ð?ˆFà˜Š{ˆ{Ø'*­XÔ-?ÈÐ-PÑ-PÔ-PÑ'P��|Ñ$Ø×ÒØ�	˜4 ¤°3Ñ!6Ð7¸&À&Ð9IÐRVÐWÑWÔWñô ð ð ð ”×'Ò'¨
Ñ3Ô3ˆÝ�G—L’L‘N”NÑ#Ô#ˆØÔ! +Ô.µ#°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ð 	2ˆCØ�MŠM˜'Ÿ+š+ c¨4Ñ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ÐB°c˜DœO¨cÑ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ÐB¸TÐBÑBÔBÐCÐDñ
ô 
ˆõ —-’-  dÑ+Ô+ˆØð 	@ð 	@ˆDØ”O×)Ò)¨$¨u¬+Ñ6Ô6ˆEØ:?ˆG�D˜”J�s 4¤?Ñ3Ô3Ð5Ð5Ô6Ñ7Ð7Øˆr   c                 ó\   — |                       ¦   «          |                      |||d¬¦  «        S )NFrZ   r[   r\   s       r   ÚaddzMongoDbCache.add±   s.   € Ø×ÒÑÔÐØ�yŠy˜˜e¨WÀˆ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Ð G¸3 ¤°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”
�3˜tœÑ/Ô/Ð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ÐF˜D¨D¸Ð,EÐ,E�4Ð,EÐ,EÐ,Er   )r<   rk   r
   r:   rG   rn   ro   )r*   rl   r;   Úfilterrq   r…   s   `    @r   r:   zMongoDbCache.delete_manyº   sÈ   øø€ Ø×ÒÑÔÐÝ�4‰jŒjˆØ˜Ð GÐ GÐ GÐ GÀ$Ð GÑ GÔ GÐHÐIˆØ”×(Ò(¨Ñ0Ô0ˆàÔ¥3 t¡9¤9Ò,Ð,ðð ð ð Ø?C¼{×?OÒ?OÐPVÑ?WÔ?Wðñ ô ˆMð GÐFÐFÐF DÐFÑFÔFˆCàˆ
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ð ˜rœvð ð ð ð ð
˜#ð 
 $ð 
ð 
ð 
ð 
ð  %)Ø'+ð"ð "àð"ð Œvð"ð ”˜SÔ!ð	"ð
 ”;˜tÔ$ð"ð 
Œð"ð "ð "ð "ðHFð F�sð F 2¤6ð F°B´KÀÔ4Dð FÐPRÔPVð Fð Fð Fð Fð
 JNðð Ø”w˜s B¤F˜{Ô+ðØ68´kÀ#Ô6Fðà	Œ�”Œðð ð ð ð>˜cð  b¤g¨b¬f¤oð ð ð ð ð	˜cð 	 b¤g¨c°2´6¨kÔ&:ð 	ð 	ð 	ð 	ðGð G�sð G 2¤6ð G°B´KÀÔ4Dð GÐPRÔPVð 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   