o
    iv                     @   s   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d ZG dd dZdS )    N)	b64decode	b64encode)datetimetimezone)Enum)AnyOptional)Redis   )#UNSERIALIZABLE_RETURN_VALUE_PAYLOAD)Job)resolve_serializer)decode_redis_hashnowc                 C   s
   d|  S Nzrq:results: )job_idr   r   A/home/app/Keep/.python/lib/python3.10/site-packages/rq/results.pyget_key      
r   c                   @   sx  e Zd ZG dd deZ						d3dedededee d	ee d
ee	 dee defddZ
dd Zdd Zdd Zed4d5ddZed6d5ddZed6d5ddZed7defddZededefdd Zededdfd!d"Zed7ded#ed$ededd f
d%d&Zed7deded  fd'd(Zed8ded*eded  fd+d,Zed-d. Zd7d/d0Zdeee	f fd1d2ZdS )9Resultc                   @   s   e Zd ZdZdZdZdZdS )zResult.Typer
            N)__name__
__module____qualname__Z
SUCCESSFULFAILEDZSTOPPEDRETRIEDr   r   r   r   Type   s
    r   N r   type
connectionid
created_atreturn_value
exc_stringworker_namec
           
      C   sH   || _ || _|| _|r|nt | _t|	| _|| _|| _|| _	|| _
d S N)r%   r&   r!   r   r$   r   
serializerr"   r   r#   r'   )
selfr   r!   r"   r#   r$   r%   r&   r'   r)   r   r   r   __init__   s   

zResult.__init__c                 C   s   d| j  d| | jj dS )Nz
Result(id=z, type=))r#   r   r!   namer*   r   r   r   __repr__0   s   zResult.__repr__c                 C   s$   z| j |j kW S  ty   Y dS w )NF)r#   AttributeError)r*   otherr   r   r   __eq__3   s
   zResult.__eq__c                 C   s
   t | jS r(   )boolr#   r.   r   r   r   __bool__9   r   zResult.__bool__returnc           	   	   C   s.   | |j ||j||||jd}|j||d |S )N)r   r!   r"   r%   r&   r'   r)   ttlpipeline)r#   r"   r)   save)	clsjobr!   r7   r%   r&   r'   r8   resultr   r   r   create<   s   	zResult.createc                 C   s0   | |j | jj|j|||jd}|j||d |S )N)r   r!   r"   r&   r'   r)   r6   )r#   r   r   r"   r)   r9   )r:   r;   r7   r&   r'   r8   r<   r   r   r   create_failureJ   s   zResult.create_failurec                 C   s.   | |j | jj|j||jd}|j||d |S )N)r   r!   r"   r'   r)   r6   )r#   r   r   r"   r)   r9   )r:   r;   r7   r'   r8   r<   r   r   r   create_retriedW   s   zResult.create_retriedr;   c              
   C   sP   |j | |jdd}g }|D ]\}}|| j|j| ||j |d q|S )zReturns all results for job+-r"   r)   )r"   	xrevranger   r#   appendrestoredecode)r:   r;   r)   responseresults	result_idpayloadr   r   r   allc   s   z
Result.allc                 C   s   |j | |jS )z!Returns the number of job results)r"   xlenr   r#   r:   r;   r   r   r   countp   s   zResult.countc                 C   s   |j | |j dS )zDelete all job resultsN)r"   deleter   r#   rM   r   r   r   
delete_allu   s   zResult.delete_allrI   rJ   c           
   
   C   s   t jt|dd d tjd}t|}t|}|d}|dur+|	t
| }|d}|r;tt
| }|drH|dd	 nd
}	t|tt|d ||||||	dS )z/Create a Result object from given Redis payloadrA   r     )tzr%   Nr&   r'       r    r!   )r"   r#   r$   r%   r&   r'   )r   fromtimestampintsplitr   utcr   r   getloadsr   rF   zlib
decompressr   r   )
r:   r   rI   rJ   r"   r)   r$   r%   r&   r'   r   r   r   rE   z   s(   "

zResult.restorec                 C   s   dS )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   )r:   r;   r)   r   r   r   fetch   s   
zResult.fetchr   timeoutc           	      C   s   |r'|d }|j j| |jdi|d}|sdS |d }|d }|d \}}n|j j| |jdd	dd
}|s9dS |d \}}| j|j| ||j |d}|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.
        rQ   z0-0)blockNr   r
   r@   rA   )rN   rB   )r"   Zxreadr   r#   rC   rE   rF   )	r:   r;   r)   r]   Z
timeout_msrG   rI   rJ   resr   r   r   fetch_latest   s   zResult.fetch_latestc                 C   s
   d| S r   r   )r:   r   r   r   r   r      s   
zResult.get_keyc                 C   sv   |  | j}|dur|n| j}|j||  dd}|du r"| | _|dur8|dkr2|| | jS ||| | jS )zSave result data to RedisN
   )maxlenr_   )	r   r   r"   Zxadd	serializerF   r#   ZpersistZexpire)r*   r7   r8   keyr"   r<   r   r   r   r9      s   

zResult.savec                 C   s|   | j j| jd}| jd urtt| j  |d< z	| j	
| j}W n
   | j	
t}Y | jd ur<t| |d< |S )N)r!   r'   r&   r%   )r!   valuer'   r&   r   rZ   compressencoderF   r)   dumpsr%   r   )r*   dataZ
serializedr   r   r   rd      s   

zResult.serialize)NNNNr    N)NNr    N)r5   r   )r    Nr(   )Nr   )r   r   r   r   r   strr	   r   r   r   r+   r/   r2   r4   classmethodr=   r>   r?   r   rK   rU   rN   rP   dictrE   r\   ra   r   r9   rd   r   r   r   r   r      sd    	
"

r   )rZ   base64r   r   r   r   enumr   typingr   r   Zredisr	   defaultsr   r;   r   Zserializersr   utilsr   r   r   r   r   r   r   r   <module>   s    