o
    i8                     @   sH  d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZ ddlmZmZ ddlmZmZmZm Z m!Z!m"Z" G dd de"eZ#G dd de#e!eZ$G dd de#eZ%G dd de#e eZ&G dd de#eeZ'G dd de#eeZ(G dd de#eeZ)dS )zB
Base abstract class for managed key-value store implementations.
    )ABCabstractmethod)Lock)defaultdict)Sequence)TracebackType)AnySupportsFloat)DEFAULT_COLLECTION_NAME)StoreSetupError)ManagedEntry)nowprepare_ttlprepare_ttls)Selfoverride)AsyncCullProtocolAsyncDestroyCollectionProtocolAsyncDestroyStoreProtocol!AsyncEnumerateCollectionsProtocolAsyncEnumerateKeysProtocolAsyncKeyValueProtocolc                       sn  e Zd ZU dZeed< eed< eeef ed< eeef ed< eed< dddedB d	df fd
dZ	d<ddZ
ded	dfddZd<ddZded	dfddZededed	edB fddZdedee d	eedB  fddZedddededB d	eeef dB fddZedddee dedB d	eeeef dB  fddZedddededB d	eeeef dB edB f fd d!Zedddee dedB d	eeeeef dB edB f  fd"d#Zededed$ed	dfd%d&Zdedee d'ee d	dfd(d)Zeddd*ded+eeef dedB d,edB d	df
d-d.Z dee d/eeeef  d,eedB  eB dB d	eee eeeef  eedB  f fd0d1Z!eddd*dee d/eeeef  dedB d,eedB  dB d	df
d2d3Z"ededed	efd4d5Z#dee ded	e$fd6d7Z%edddededB d	efd8d9Z&edddee dedB d	e$fd:d;Z'  Z(S )=	BaseStorea  An opinionated Abstract base class for managed key-value stores using ManagedEntry objects.

    This class implements all of the methods required for compliance with the KVStore protocol but
    requires subclasses to implement the _get_managed_entry, _put_managed_entry, and _delete_managed_entry methods.

    Subclasses can also override the _get_managed_entries, _put_managed_entries, and _delete_managed_entries methods if desired.

    Subclasses can implement the _setup, which will be called once before the first use of the store, and _setup_collection, which will
    be called once per collection before the first use of a collection.
    _setup_complete_setup_lock_setup_collection_locks_setup_collection_completedefault_collectionN)r   returnc                   s:   d| _ t | _tt| _tt| _|pt| _t	 
  dS )zInitialize the managed key-value store.

        Args:
            default_collection: The default collection to use if no collection is provided.
                Defaults to "default_collection".
        FN)r   r   r   r   r   boolr   r
   r   super__init__)selfr   	__class__ _/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/key_value/aio/stores/base.pyr!   0   s   


zBaseStore.__init__c                       dS )z4Initialize the store (called once before first use).Nr%   r"   r%   r%   r&   _setupA       zBaseStore._setup
collectionc                   r'   )zKInitialize the collection (called once before first use of the collection).Nr%   r"   r+   r%   r%   r&   _setup_collectionD   r*   zBaseStore._setup_collectionc                    s   | j sN| j4 I d H 6 | j s6z	|  I d H  W n ty2 } ztd| d| jjid|d }~ww d| _ W d   I d H  d S 1 I d H sGw   Y  d S d S )Nz!Failed to setup key value store: storemessage
extra_infoT)r   r   r)   	Exceptionr   r$   __name__)r"   er%   r%   r&   setupG   s"   .zBaseStore.setupc                   s   |   I d H  | j| s]| j| 4 I d H : | j| sEz| j|dI d H  W n ty? } ztd| d|id|d }~ww d| j|< W d   I d H  d S 1 I d H sVw   Y  d S d S )Nr+   zFailed to setup collection: r+   r/   T)r5   r   r   r-   r2   r   )r"   r+   r4   r%   r%   r&   setup_collectionS   s   

.zBaseStore.setup_collectionkeyc                   r'   )z<Retrieve a cache entry by key from the specified collection.Nr%   )r"   r+   r8   r%   r%   r&   _get_managed_entry_   r*   zBaseStore._get_managed_entrykeysc                   s    fdd|D I dH S )zGRetrieve multiple managed entries by key from the specified collection.c                    s"   g | ]}j  |d I dH qS )r+   r8   N)r9   ).0r8   r+   r"   r%   r&   
<listcomp>f   s     z2BaseStore._get_managed_entries.<locals>.<listcomp>Nr%   )r"   r+   r:   r%   r=   r&   _get_managed_entriesc   s   zBaseStore._get_managed_entriesr6   c                   sJ   |p| j }| j|dI dH  | j||dI dH }|sdS |jr"dS |jS )aj  Retrieve a value by key from the specified collection.

        Args:
            collection: The collection to retrieve the value from. If no collection is provided, it will use the default collection.
            key: The key to retrieve the value from.

        Returns:
            The value associated with the key, or None if not found or expired.
        r6   Nr;   )r   r7   r9   
is_expiredvaluer"   r8   r+   managed_entryr%   r%   r&   geth   s   
zBaseStore.getc                   s@   |p| j }| j|dI d H  | j||dI d H }dd |D S )Nr6   r:   r+   c                 S   s    g | ]}|r|j s|jnd qS N)r@   rA   r<   entryr%   r%   r&   r>      s     z&BaseStore.get_many.<locals>.<listcomp>r   r7   r?   r"   r:   r+   entriesr%   r%   r&   get_many   s
   
zBaseStore.get_manyc                   sL   |p| j }| j|dI d H  | j||dI d H }|r|jr dS |j|jfS )Nr6   r;   NN)r   r7   r9   r@   rA   ttlrB   r%   r%   r&   rN      s   

zBaseStore.ttlc                   s@   |p| j }| j|dI dH  | j||dI dH }dd |D S )zRetrieve multiple values and TTLs by key from the specified collection.

        Returns a list of tuples of the form (value, ttl_seconds). Missing or expired
        entries are represented as (None, None).
        r6   NrE   c                 S   s&   g | ]}|r|j s|j|jfnd qS )rM   )r@   rA   rN   rG   r%   r%   r&   r>      s   & z&BaseStore.ttl_many.<locals>.<listcomp>rI   rJ   r%   r%   r&   ttl_many   s
   
zBaseStore.ttl_manyrC   c                   r'   )z9Store a managed entry by key in the specified collection.Nr%   )r"   r+   r8   rC   r%   r%   r&   _put_managed_entry      zBaseStore._put_managed_entrymanaged_entriesc                   s4   t ||ddD ]\}}| j|||dI dH  qdS )zBStore multiple managed entries by key in the specified collection.T)strictr+   r8   rC   N)ziprP   )r"   r+   r:   rR   r8   rC   r%   r%   r&   _put_managed_entries   s   zBaseStore._put_managed_entries)r+   rN   rA   rN   c                   sN   |p| j }| j|dI dH  t|t|dt d}| j|||dI dH  dS )zEStore a key-value pair in the specified collection with optional TTL.r6   N)trA   rN   
created_atrT   )r   r7   r   r   r   rP   )r"   r8   rA   r+   rN   rC   r%   r%   r&   put   s   
zBaseStore.putvaluesc                C   sd   t |t |krd}t|d|r%t|tr%t |t |kr%d}t|dt|t |d}|||fS )zPrepare multiple managed entries for a put_many operation.

        Inheriting classes can use this method if they need to modify a put_many operation.zGput_many called but a different number of keys and values were providedNzKput_many called but a different number of keys and ttl values were provided)rW   count)len
ValueError
isinstancer   r   )r"   r:   r[   rN   msgttl_for_entriesr%   r%   r&   _prepare_put_many   s   


zBaseStore._prepare_put_manyc                   sd   |p| j }| j|dI dH  | j|||d\}}  fddt|D }| j|||dI dH  dS )z;Store multiple key-value pairs in the specified collection.r6   N)r:   r[   rN   c                    s$   g | ]\}}t | | t d qS )rX   )r   r   )r<   irA   ra   r%   r&   r>      s    z&BaseStore.put_many.<locals>.<listcomp>)r+   r:   rR   )r   r7   rb   	enumeraterV   )r"   r:   r[   r+   rN   rR   r%   rd   r&   put_many   s   

zBaseStore.put_manyc                   r'   )z<Delete a managed entry by key from the specified collection.Nr%   r"   r8   r+   r%   r%   r&   _delete_managed_entry   rQ   zBaseStore._delete_managed_entryc                   s0   d}|D ]}| j ||dI dH r|d7 }q|S )EDelete multiple managed entries by key from the specified collection.r   r8   r+   N   )rh   )r"   r:   r+   deleted_countr8   r%   r%   r&   _delete_managed_entries   s   z!BaseStore._delete_managed_entriesc                   s2   |p| j }| j|dI d H  | j||dI d H S )Nr6   rj   )r   r7   rh   rg   r%   r%   r&   delete  s   
zBaseStore.deletec                   s2   |p| j }| j|dI dH  | j||dI dH S )ri   r6   NrE   )r   r7   rm   )r"   r:   r+   r%   r%   r&   delete_many  s   
zBaseStore.delete_manyr   N))r3   
__module____qualname____doc__r   __annotations__r   r   strr!   r)   r-   r5   r7   r   r   r9   listr?   r   dictr   rD   rL   tuplefloatrN   rO   rP   r   rV   r	   rZ   rb   rf   rh   intrm   rn   ro   __classcell__r%   r%   r#   r&   r      s   
  

"6:"
8$
".r   c                
   @   sf   e Zd ZdZeddddedB dedB dee fddZe	dddededB dee fd	d
Z
dS )BaseEnumerateKeysStorez{An abstract base class for enumerate key-value stores.

    Subclasses must implement the _get_collection_keys method.
    Nlimitr+   r~   r   c                   s2   |p| j }| j|dI dH  | j||dI dH S )*List all keys in the specified collection.r6   N)r+   r~   )r   r7   _get_collection_keysr"   r+   r~   r%   r%   r&   r:     s   
zBaseEnumerateKeysStore.keysc                   r'   )r   Nr%   r   r%   r%   r&   r      r*   z+BaseEnumerateKeysStore._get_collection_keysrF   )r3   rq   rr   rs   r   ru   rz   rv   r:   r   r   r%   r%   r%   r&   r|     s    ,*r|   c                   @   s`   e Zd ZdZdefddZdee dB dedB dedB ddfd	d
Z	dddZ
edddZdS )BaseContextManagerStorez2An abstract base class for context manager stores.r   c                    s   |   I d H  | S rF   )r5   r(   r%   r%   r&   
__aenter__(  s   z"BaseContextManagerStore.__aenter__exc_typeN	exc_value	tracebackc                       |   I d H  d S rF   _close)r"   r   r   r   r%   r%   r&   	__aexit__,  s   z!BaseContextManagerStore.__aexit__c                    r   rF   r   r(   r%   r%   r&   close1  s   zBaseContextManagerStore.closec                    r'   )zClose the store.Nr%   r(   r%   r%   r&   r   4  rQ   zBaseContextManagerStore._closerp   )r3   rq   rr   rs   r   r   typeBaseExceptionr   r   r   r   r   r%   r%   r%   r&   r   %  s    


r   c                   @   sX   e Zd ZdZedddedB dee fddZe	dddedB dee fdd	Z
dS )
BaseEnumerateCollectionsStorez~An abstract base class for enumerate collections stores.

    Subclasses must implement the _get_collection_names method.
    Nr}   r~   r   c                   "   |   I dH  | j|dI dH S )DList all available collection names (may include empty collections).Nr}   )r5   _get_collection_namesr"   r~   r%   r%   r&   collections@     z)BaseEnumerateCollectionsStore.collectionsc                   r'   )r   Nr%   r   r%   r%   r&   r   G  r*   z3BaseEnumerateCollectionsStore._get_collection_names)r3   rq   rr   rs   r   rz   rv   ru   r   r   r   r%   r%   r%   r&   r   :  s    "&r   c                   @   s4   e Zd ZdZedefddZedefddZdS )BaseDestroyStorezlAn abstract base class for destroyable stores.

    Subclasses must implement the _delete_store method.
    r   c                       |   I dH  |  I dH S )zDestroy the store.N)r5   _delete_storer(   r%   r%   r&   destroyR     zBaseDestroyStore.destroyc                    r'   )zDelete the store.Nr%   r(   r%   r%   r&   r   Y  rQ   zBaseDestroyStore._delete_storeN)	r3   rq   rr   rs   r   r   r   r   r   r%   r%   r%   r&   r   L  s    r   c                   @   s<   e Zd ZdZededefddZededefddZ	dS )	BaseDestroyCollectionStorezvAn abstract base class for destroyable collections.

    Subclasses must implement the _delete_collection method.
    r+   r   c                    r   )zDestroy the collection.Nr6   )r5   _delete_collectionr,   r%   r%   r&   destroy_collectione  r   z-BaseDestroyCollectionStore.destroy_collectionc                   r'   )zDelete the collection.Nr%   r,   r%   r%   r&   r   l  rQ   z-BaseDestroyCollectionStore._delete_collectionN)
r3   rq   rr   rs   r   ru   r   r   r   r   r%   r%   r%   r&   r   _  s    r   c                   @   s,   e Zd ZdZedddZedddZdS )	BaseCullStorezaAn abstract base class for cullable stores.

    Subclasses must implement the _cull method.
    r   Nc                    r   zCull the store.N)r5   _cullr(   r%   r%   r&   cullx  r   zBaseCullStore.cullc                    r'   r   r%   r(   r%   r%   r&   r     rQ   zBaseCullStore._cullrp   )r3   rq   rr   rs   r   r   r   r   r%   r%   r%   r&   r   r  s    r   N)*rs   abcr   r   asyncio.locksr   r   r   collections.abcr   typesr   typingr   r	   key_value.shared.constantsr
   key_value.shared.errorsr   $key_value.shared.utils.managed_entryr   #key_value.shared.utils.time_to_liver   r   r   typing_extensionsr   r   !key_value.aio.protocols.key_valuer   r   r   r   r   r   r   r|   r   r   r   r   r   r%   r%   r%   r&   <module>   s*     
 v