o
    _J@hj                  
   @   s   d dl Z d dlmZmZ d dlmZ d dlmZmZmZ d dl	m
Z
mZ zd dlmZ W n ey= Z zededZ[ww G dd	 d	eZdS )
    N)datetimetimezone)Job)BaseJobStoreConflictingIdErrorJobLookupError)datetime_to_utc_timestamputc_timestamp_to_datetime)Redisz&RedisJobStore requires redis installedc                       s   e Zd ZdZdddejf fdd	Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Z  ZS )RedisJobStorea  
    Stores jobs in a Redis database. Any leftover keyword arguments are directly passed to redis's
    :class:`~redis.StrictRedis`.

    Plugin alias: ``redis``

    :param int db: the database number to store jobs in
    :param str jobs_key: key to store jobs in
    :param str run_times_key: key to store the jobs' run times in
    :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the
        highest available
    r   zapscheduler.jobszapscheduler.run_timesc                    s`   t    |d u rtd|std|std|| _|| _|| _tddt|i|| _d S )Nz$The "db" parameter must not be emptyz*The "jobs_key" parameter must not be emptyz/The "run_times_key" parameter must not be emptydb )	super__init__
ValueErrorpickle_protocoljobs_keyrun_times_keyr
   intredis)selfr   r   r   r   Zconnect_args	__class__r   N/var/www/html/venv/lib/python3.10/site-packages/apscheduler/jobstores/redis.pyr      s   
zRedisJobStore.__init__c                 C   s"   | j | j|}|r| |S d S N)r   Zhgetr   _reconstitute_job)r   job_id	job_stater   r   r   
lookup_job2   s   zRedisJobStore.lookup_jobc                 C   sH   t |}| j| jd|}|r"| jj| jg|R  }| t||S g S )Nr   )r   r   Zzrangebyscorer   Zhmgetr   _reconstitute_jobszip)r   now	timestampZjob_ids
job_statesr   r   r   get_due_jobs6   s   zRedisJobStore.get_due_jobsc                 C   s.   | j j| jdddd}|rt|d d S d S )Nr   T)Z
withscores   )r   Zzranger   r	   )r   next_run_timer   r   r   get_next_run_time>   s   zRedisJobStore.get_next_run_timec                    sB   | j | j}| | }tdddtjd t| fdddS )Ni'        )tzinfoc                    s
   | j p S r   )r&   )jobZpaused_sort_keyr   r   <lambda>G   s   
 z,RedisJobStore.get_all_jobs.<locals>.<lambda>)key)	r   Zhgetallr   r   itemsr   r   utcsorted)r   r#   jobsr   r,   r   get_all_jobsC   s   zRedisJobStore.get_all_jobsc              	   C   s   | j | j|jrt|j| j  1}|  || j|jt	|
 | j |jr8|| j|jt|ji |  W d    d S 1 sGw   Y  d S r   )r   hexistsr   idr   pipelinemultihsetpickledumps__getstate__r   r&   zaddr   r   executer   r+   piper   r   r   add_jobI   s    

"zRedisJobStore.add_jobc              	   C   s   | j | j|jst|j| j  6}|| j|jt|	 | j
 |jr5|| j|jt|ji n|| j|j |  W d    d S 1 sLw   Y  d S r   )r   r4   r   r5   r   r6   r8   r9   r:   r;   r   r&   r<   r   r   zremr=   r>   r   r   r   
update_job\   s    

"zRedisJobStore.update_jobc                 C   sl   | j | j|st|| j  }|| j| || j| |  W d    d S 1 s/w   Y  d S r   )	r   r4   r   r   r6   hdelrA   r   r=   )r   r   r?   r   r   r   
remove_jobp   s   
"zRedisJobStore.remove_jobc                 C   sP   | j  }|| j || j |  W d    d S 1 s!w   Y  d S r   )r   r6   deleter   r   r=   )r   r?   r   r   r   remove_all_jobsy   s
   
"zRedisJobStore.remove_all_jobsc                 C   s   | j j  d S r   )r   Zconnection_poolZ
disconnectr   r   r   r   shutdown      zRedisJobStore.shutdownc                 C   s2   t |}tt}|| | j|_| j|_|S r   )r9   loadsr   __new____setstate__Z
_scheduler_aliasZ_jobstore_alias)r   r   r+   r   r   r   r      s   


zRedisJobStore._reconstitute_jobc              	   C   s   g }g }|D ]#\}}z
| | | W q ty)   | jd| | | Y qw |rZ| j !}|j| jg|R   |j	| j
g|R   |  W d    |S 1 sUw   Y  |S )Nz)Unable to restore job "%s" -- removing it)appendr   BaseExceptionZ_logger	exceptionr   r6   rC   r   rA   r   r=   )r   r#   r2   Zfailed_job_idsr   r   r?   r   r   r   r      s(   

z RedisJobStore._reconstitute_jobsc                 C   s   d| j j dS )N<>)r   __name__rG   r   r   r   __repr__   rI   zRedisJobStore.__repr__)rS   
__module____qualname____doc__r9   HIGHEST_PROTOCOLr   r   r$   r'   r3   r@   rB   rD   rF   rH   r   r   rT   __classcell__r   r   r   r   r      s&    	r   )r9   r   r   Zapscheduler.jobr   Zapscheduler.jobstores.baser   r   r   Zapscheduler.utilr   r	   r   r
   ImportErrorexcr   r   r   r   r   <module>   s    
