
    KiB&                        U d Z ddlZddlZddlmZ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 ddlmZ dd	lmZmZ dd
lmZ erddlmZ ddlmZ  ej4                  e      Zej:                  ed<    G d d      Z G d d      Z y)a#  Result storage for task execution results.

This module provides:
- ClusterKeyValueStore: A RedisCluster-compatible key-value store
- ResultStorage: An async context manager that wraps either ClusterKeyValueStore
  or py-key-value's RedisStore, managing connection pool lifecycle internally
    N)MappingSequence)AsyncExitStack)TracebackType)TYPE_CHECKINGAnySupportsFloat)Self)
RedisStore)ConnectionPoolRedis)RedisCluster)RedisConnection)close_resourceloggerc                   
   e Zd ZdZdddededdfdZd	ed
edz  defdZddZddd	ed
edz  de	ee
f   dz  fdZddd	ed
edz  dee	ee
f   dz  edz  f   fdZdddd	edeee
f   d
edz  dedz  ddf
dZddd	ed
edz  defdZdddee   d
edz  dee	ee
f   dz     fdZdddee   d
edz  deee	ee
f   dz  edz  f      fdZddddee   deeee
f      d
edz  dedz  ddf
dZdddee   d
edz  defdZy)ClusterKeyValueStoreaI  A key-value store that works with RedisCluster.

    This store implements the AsyncKeyValue protocol from py-key-value,
    storing JSON-serialized data in Redis keys. It's designed to work
    with RedisCluster clients where py-key-value's RedisStore doesn't.

    The store uses a simple key structure: {collection}:{key}
    default)default_collectionclientr   returnNc                     || _         || _        y)zInitialize the cluster key-value store.

        Args:
            client: A RedisCluster client to use for storage
            default_collection: The default collection name for keys
        N)_client_default_collection)selfr   r   s      `/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/docket/_result_store.py__init__zClusterKeyValueStore.__init__(   s     #5     key
collectionc                 0    ||n| j                   }| d| S )z1Build the full Redis key from collection and key.:)r   )r   r   r    colls       r   	_make_keyzClusterKeyValueStore._make_key7   s$    '3z9Q9Qqr   c                    K   yw)z.Initialize the store. No-op for cluster store.N r   s    r   setupzClusterKeyValueStore.setup<   	        r    c                   K   | j                  ||      }| j                  j                  |       d{   }|yt        j                  |      S 7 w)z6Retrieve a value by key from the specified collection.N)r$   r   getjsonloads)r   r   r    	redis_keydatas        r   r-   zClusterKeyValueStore.get@   sK      NN3
3	\\%%i00<zz$ 1s   1AAAc                  K   | j                  ||      }| j                  j                  |       d{   }|y| j                  j                  |       d{   }|dk\  rt	        |      nd}t        j                  |      |fS 7 S7 /w)z%Retrieve the value and TTL for a key.N)NNr   )r$   r   r-   ttlfloatr.   r/   )r   r   r    r0   r1   ttl_val	ttl_floats          r   r3   zClusterKeyValueStore.ttlM   s~      NN3
3	\\%%i00<((334;qL%.d	zz$** 1 4s!   1BB%BB	.B	Br    r3   valuer3   c                "  K   | j                  ||      }t        j                  |      }|:t        t	        |            }| j
                  j                  |||       d{    y| j
                  j                  ||       d{    y7 *7 w)z)Store a key-value pair with optional TTL.N)r$   r.   dumpsintr4   r   setexset)r   r   r8   r    r3   r0   r1   ttl_secondss           r   putzClusterKeyValueStore.put]   sx      NN3
3	zz% ?eCj/K,,$$YTBBB,,""9d333 C3s$   AB B!$BBBBc                   K   | j                  ||      }| j                  j                  |       d{   }|dkD  S 7 	w)zDelete a key-value pair.Nr   r$   r   delete)r   r   r    r0   results        r   rB   zClusterKeyValueStore.deleten   s>      NN3
3	||**955z 6s   1?=
?keysc                   K   |sg S |D cg c]  }| j                  ||       }}| j                  j                  |       d{   }|D cg c]  }|t        j                  |      nd c}S c c}w 7 0c c}w w)z Retrieve multiple values by key.N)r$   r   mgetr.   r/   )r   rD   r    k
redis_keysvaluesvs          r   get_manyzClusterKeyValueStore.get_manyy   ss      I=ABdnnQ
3B
B||((44BHIQ

1D8II C4Is-   	A<A0 A<A5A< A7-	A<7A<c                   K   |sg S g }|D ]3  }| j                  ||       d{   \  }}|j                  ||f       5 |S 7 w)z(Retrieve multiple values and their TTLs.r+   N)r3   append)r   rD   r    resultsr   valr5   s          r   ttl_manyzClusterKeyValueStore.ttl_many   sZ      IDF 	+C!%#*!EELCNNC>*	+  Fs   "AAArI   c                |   K   |syt        ||d      D ]"  \  }}| j                  ||||       d{    $ y7 w)zStore multiple key-value pairs.NT)strictr7   )zipr?   )r   rD   rI   r    r3   r   r8   s          r   put_manyzClusterKeyValueStore.put_many   sI      dF48 	GJC((3*#(FFF	GFs   0<:<c                   K   |sy|D cg c]  }| j                  ||       }} | j                  j                  |  d{   S c c}w 7 	w)z Delete multiple key-value pairs.r   NrA   )r   rD   r    rG   rH   s        r   delete_manyz ClusterKeyValueStore.delete_many   sO      =ABdnnQ
3B
B(T\\((*555 C5s   AAAA
Ar   N)__name__
__module____qualname____doc__r   strr   r$   r(   dictr   r-   tupler4   r3   r   r	   r?   boolrB   r   listrK   rP   rT   r;   rV   r&   r   r   r   r      sc    #,	66  	6
 
6S cDj S 
 "&	   $J	 
 
c3h$	 " "&	++ $J	+
 
tCH~$edl2	3+* "&$(44 sCx 4
 $J4 T!4 
4* "&			 $J		
 
	 "&	JsmJ $J	J
 
d38nt#	$J" "&	sm $J	
 
eDcNT)54<78	9( "&$(GsmG c*+G
 $JG T!G 
G$ "&	
6sm
6 $J	
6
 

6r   r   c                   V   e Zd ZU dZeez  ed<   eed<   eed<   e	ed<   ddde
d	d
fdZd	efdZdee   d
z  ded
z  ded
z  d	d
fdZd"dZd
dde
de
d
z  d	ee
ef   d
z  fdZd
dde
de
d
z  d	eee
ef   d
z  ed
z  f   fdZd
d
dde
dee
ef   de
d
z  ded
z  d	d
f
dZd
dde
de
d
z  d	efdZd
ddee
   de
d
z  d	eee
ef   d
z     fdZ d
ddee
   de
d
z  d	eeee
ef   d
z  ed
z  f      fdZ!d
d
ddee
   deee
ef      de
d
z  ded
z  d	d
f
d Z"d
ddee
   de
d
z  d	e#fd!Z$y
)#ResultStoragea5  Result storage that implements AsyncKeyValue using a RedisConnection.

    This class wraps either a ClusterKeyValueStore (for cluster mode) or a RedisStore
    (for standalone mode). It creates its own connection pool for standalone mode
    (with decode_responses=True) using the RedisConnection's URL.
    _store_poolr   _stackredisr   r   r   Nc                      || _         || _        y N)_redisr   )r   rf   r   s      r   r   zResultStorage.__init__   s    
 #5 r   c                    K   t                _         j                  j                          d {     j                  j                  rR j                  j
                  t        d      t         j                  j
                   j                         _	        n j                  j                  d       d {    _         j                  j                   fd        j                  j                  t         j                  d       t         j                         _         j                  j                   fd        j                  j                  t         j                   d	       t#         j                    j                         _	         j                  j%                          d {     S 7 7 7 w)
Nz-RedisConnection not connected in cluster mode)r   r   T)decode_responsesc                      t         d      S )Nrd   delattrr'   s   r   <lambda>z*ResultStorage.__aenter__.<locals>.<lambda>   s    w)? r   pool)connection_poolc                      t         d      S )Nr   rm   r'   s   r   ro   z*ResultStorage.__aenter__.<locals>.<lambda>   s    y)A r   r   )r   re   
__aenter__ri   
is_clustercluster_client
ValueErrorr   r   rc   _connection_pool_from_urlrd   callbackpush_async_callbackr   r   r   r   r(   r'   s   `r   rs   zResultStorage.__aenter__   sM    $&kk$$&&&;;!!{{))1 !PQQ.{{11#'#;#;DK  ${{DD!%  E   DJ KK  !?@KK++NDJJO <DLKK  !ABKK++NDLL(S$||8P8PDK kk!!!5 	' 	"s5   -GF=BG<G =C9G6G7G GGexc_typeexc_valexc_tbc                 n   K   	 | j                   j                  |||       d {    | ` y 7 # | ` w xY wwrh   )re   	__aexit__)r   rz   r{   r|   s       r   r~   zResultStorage.__aexit__   s8     	++'''6BBB Cs    5 . ,. 5. 25c                    K   yw)z1Initialize the store. Already done in __aenter__.Nr&   r'   s    r   r(   zResultStorage.setup   r)   r*   r+   r   r    c                X   K   | j                   j                  ||       d {   S 7 wNr+   )rc   r-   r   r   r    s      r   r-   zResultStorage.get   %      [[__SZ_@@@@   !*(*c                X   K   | j                   j                  ||       d {   S 7 wr   )rc   r3   r   s      r   r3   zResultStorage.ttl   r   r   r7   r8   r3   c                ^   K   | j                   j                  ||||       d {    y 7 wNr7   )rc   r?   )r   r   r8   r    r3   s        r   r?   zResultStorage.put  s&      kkooc5ZSoIII   #-+-c                X   K   | j                   j                  ||       d {   S 7 wr   )rc   rB   r   s      r   rB   zResultStorage.delete  s(      [[''
'CCCCr   rD   c                X   K   | j                   j                  ||       d {   S 7 wr   )rc   rK   r   rD   r    s      r   rK   zResultStorage.get_many  (      [[))$:)FFFFr   c                X   K   | j                   j                  ||       d {   S 7 wr   )rc   rP   r   s      r   rP   zResultStorage.ttl_many  r   r   rI   c                ^   K   | j                   j                  ||||       d {    y 7 wr   )rc   rT   )r   rD   rI   r    r3   s        r   rT   zResultStorage.put_many&  s)      kk""4JC"PPPr   c                X   K   | j                   j                  ||       d {   S 7 wr   )rc   rV   r   s      r   rV   zResultStorage.delete_many0  s(      [[,,Tj,IIIIr   rW   )%rX   rY   rZ   r[   r   r   __annotations__r   r   r   r\   r   r
   rs   typeBaseExceptionr   r~   r(   r]   r   r-   r^   r4   r3   r   r	   r?   r_   rB   r   r`   rK   rP   rT   r;   rV   r&   r   r   rb   rb      s    ---N6 6  6 
	6$ <	}%,	 %	 $		
 
	 "&	AA $J	A
 
c3h$	A "&	AA $J	A
 
tCH~$edl2	3A "&$(JJ sCx J
 $JJ T!J 
J "&	DD $J	D
 
D "&	GsmG $J	G
 
d38nt#	$G "&	GsmG $J	G
 
eDcNT)54<78	9G "&$(QsmQ c*+Q
 $JQ T!Q 
Q "&	JsmJ $J	J
 
Jr   rb   )!r[   r.   loggingcollections.abcr   r   
contextlibr   typesr   typingr   r   r	   typing_extensionsr
   key_value.aio.stores.redisr   redis.asyncior   r   redis.asyncio.clusterr   docket._redisr   r   	getLoggerrX   r   Loggerr   r   rb   r&   r   r   <module>r      sl      - %  4 4 " 1 / .- (***84 4O6 O6dFJ FJr   