
    ]jz                         d dl Z d dlmZmZ d dlmZ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 ddlmZmZ d Z G d d      Zy)    N)	b64decode	b64encode)datetimetimezone)Enum)AnyOptional)Redis   )#UNSERIALIZABLE_RETURN_VALUE_PAYLOAD)Job)resolve_serializer)decode_redis_hashnowc                     d| z  S Nzrq:results:%s )job_ids    4/root/env/lib/python3.12/site-packages/rq/results.pyget_keyr      s    V##    c                      e Zd Z G d de      Z	 	 	 	 	 	 d!dedededee   dee   d	ee	   d
ee   defdZ
d Zd Zd Zed"d#d       Zed$d#d       Zed$d#d       Zed%defd       Zededefd       Zededdfd       Zed%dededededd f
d       Zed%deded    fd       Zed&dededed    fd       Zed        Zd%dZdeee	f   fd Zy)'Resultc                       e Zd ZdZdZdZdZy)Result.Typer            N)__name__
__module____qualname__
SUCCESSFULFAILEDSTOPPEDRETRIEDr   r   r   Typer      s    
r   r&   Nr   type
connectionid
created_atreturn_value
exc_stringworker_namec
                     || _         || _        || _        |r|n	t               | _        t        |	      | _        || _        || _        || _	        || _
        y N)r+   r,   r'   r   r*   r   
serializerr(   r   r)   r-   )
selfr   r'   r(   r)   r*   r+   r,   r-   r0   s
             r   __init__zResult.__init__   sP     )$	(2*,Z8$&r   c                 n    d| j                    d| j                  | j                        j                   dS )Nz
Result(id=z, type=))r)   r&   r'   namer1   s    r   __repr__zResult.__repr__0   s/    DGG9GDIIdii,@,E,E+FaHHr   c                 T    	 | j                   |j                   k(  S # t        $ r Y yw xY w)NF)r)   AttributeError)r1   others     r   __eq__zResult.__eq__3   s,    	77ehh&& 		s    	''c                 ,    t        | j                        S r/   )boolr)   r6   s    r   __bool__zResult.__bool__9   s    DGG}r   returnc           	           | |j                   ||j                  ||||j                        }|j                  ||       |S )N)r   r'   r(   r+   r,   r-   r0   ttlpipeline)r)   r(   r0   save)	clsjobr'   rB   r+   r,   r-   rC   results	            r   createzResult.create<   sD    66~~%!#~~
 	h/r   c                      | |j                   | j                  j                  |j                  |||j                        }|j                  ||       |S )N)r   r'   r(   r,   r-   r0   rA   )r)   r&   r#   r(   r0   rD   )rE   rF   rB   r,   r-   rC   rG   s          r   create_failurezResult.create_failureJ   sI    66~~!#~~
 	h/r   c                      | |j                   | j                  j                  |j                  ||j                        }|j                  ||       |S )N)r   r'   r(   r-   r0   rA   )r)   r&   r%   r(   r0   rD   )rE   rF   rB   r-   rC   rG   s         r   create_retriedzResult.create_retriedW   sH    66!!~~#~~
 	h/r   rF   c           
         |j                   j                  | j                  |j                        dd      }g }|D ]L  \  }}|j	                  | j                  |j                  |j                         ||j                   |             N |S )zReturns all results for job+-r(   r0   )r(   	xrevranger   r)   appendrestoredecode)rE   rF   r0   responseresults	result_idpayloads          r   allz
Result.allc   s}     >>++CKK,?cJ"* 	IwNNCFFI$4$4$6CNNgqr	
 r   c                 j    |j                   j                  | j                  |j                              S )z!Returns the number of job results)r(   xlenr   r)   rE   rF   s     r   countzResult.countp   s&     ~~""3;;svv#677r   c                 l    |j                   j                  | j                  |j                               y)zDelete all job resultsN)r(   deleter   r)   r\   s     r   
delete_allzResult.delete_allu   s#     	ckk#&&12r   rW   rX   c           
      r   t        j                  t        |j                  d      d         dz  t        j
                        }t        |      }t        |      }|j                  d      }|(|j                  t        |j                                     }|j                  d      }|r,t        j                  t        |            j                         }|j                  d      r |j                  dd      j                         nd	}	t        |t        j                  t        |d
               ||||||	      S )z/Create a Result object from given Redis payloadrO   r     )tzr+   r,   r-   r    r'   )r(   r)   r*   r+   r,   r-   )r   fromtimestampintsplitr   utcr   r   getloadsr   rT   zlib
decompressr   r&   )
rE   r   rW   rX   r(   r0   r*   r+   r,   r-   s
             r   rS   zResult.restorez   s    ++C	0DQ0G,H4,OT\T`T`a
#G,
 (
3
{{>2#%++Il6I6I6K,LML[[.
:)>?FFHJBI++mB\gkk-5<<>bdKKGFO,-!!%!#	
 		
r   c                      y)af  Fetch a result that matches a given job ID. The current sorted set
        based implementation does not allow us to fetch a given key by ID
        so we need to iterate through results, deserialize the payload and
        look for a matching ID.

        Future Redis streams based implementation may make this more efficient
        and scalable.
        Nr   )rE   rF   r0   s      r   fetchzResult.fetch   s     r   timeoutc                    |rS|dz  }|j                   j                  | j                  |j                        di|      }|sy|d   }|d   }|d   \  }}nC|j                   j	                  | j                  |j                        dd	d
      }|sy|d   \  }}| j                  |j                  |j                         ||j                   |      }|S )zReturns the latest result for given job instance or ID.

        If a non-zero timeout is provided, block for a result until timeout is reached.
        rb   z0-0)blockNr   r   rN   rO   )r]   rP   )r(   xreadr   r)   rQ   rS   rT   )	rE   rF   r0   ro   
timeout_msrU   rW   rX   ress	            r   fetch_latestzResult.fetch_latest   s      !4J~~++S[[-@%,HPZ+[H{H{H!)"Iw ~~//CFF0CS#UV/WH!)!Iwkk#&&)"2"2"4g#..eokp
r   c                     d|z  S r   r   )rE   r   s     r   r   zResult.get_key   s    ''r   c                 N   | j                  | j                        }||n| j                  }|j                  || j	                         d      }||j                         | _        |4|dk(  r|j                  |       | j                  S |j                  ||       | j                  S )zSave result data to Redis
   )maxlenrr   )	r   r   r(   xadd	serializerT   r)   persistexpire)r1   rB   rC   keyr(   rG   s         r   rD   zResult.save   s    ll4;;'!)!5X4??
dnn&6rBmmoDG?by""3' ww !!#s+wwr   c                    | j                   j                  | j                  d}| j                  Gt	        t        j                  | j                  j                                     j                         |d<   	 | j                  j                  | j                        }| j                  t	        |      j                         |d<   |S #  | j                  j                  t              }Y MxY w)N)r'   r-   r,   r+   )r'   valuer-   r,   r   rk   compressencoderT   r0   dumpsr+   r   )r1   data
serializeds      r   r|   zResult.serialize   s    (,		HXHXY??&!*4==9O9O9Q+R!S!Z!Z!\D	T..t/@/@AJ (#,Z#8#?#?#AD  	T../RSJs   8%C !C*)NNNNrd   N)NNrd   N)r?   r   )rd   Nr/   )Nr   )r   r    r!   r   r&   strr
   r	   r   r   r2   r7   r;   r>   classmethodrH   rJ   rL   r   rY   rf   r]   r`   dictrS   rn   rv   r   rD   r|   r   r   r   r   r      s   t  !)-&*$('' ' 	'
 SM' X&' sm' SM' ',I   
 
 	 	 
c 
 
 8 8 8 8 3S 3T 3 3 
S 
S 
4 
U 
hp 
 
< 	 	(1C 	 	 s c (S[J\  4 ( ("4S> r   r   )rk   base64r   r   r   r   enumr   typingr   r	   redisr
   defaultsr   rF   r   serializersr   utilsr   r   r   r   r   r   r   <module>r      s4     ' '     9  + )$Q Qr   