
    OwgG                         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mZ 	 d dlmZ  G d d	e      Zy# e$ rZ ed      edZ[ww xY w)
    N)datetimetimezone)Job)BaseJobStoreConflictingIdErrorJobLookupError)datetime_to_utc_timestamp	maybe_refutc_timestamp_to_datetime)Etcd3Clientz(EtcdJobStore requires etcd3 be installedc                        e Zd ZdZdddej
                  f fd	Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Z xZS )EtcdJobStorea  
    Stores jobs in a etcd. Any leftover keyword arguments are directly passed to
    etcd3's `etcd3.client
    <https://python-etcd3.readthedocs.io/en/latest/readme.html>`_.

    Plugin alias: ``etcd``

    :param str path: path to store jobs in
    :param client: a :class:`~etcd3.client.etcd3` instance to use instead of
        providing connection arguments
    :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the
        highest available
    z/apschedulerNFc                     t         |           || _        || _        |st	        d      || _        |rt        |      | _        y t        di || _        y )Nz&The "path" parameter must not be empty )	super__init__pickle_protocolclose_connection_on_exit
ValueErrorpathr
   clientr   )selfr   r   r   r   connect_args	__class__s         Q/var/www/horilla/myenv/lib/python3.12/site-packages/apscheduler/jobstores/etcd.pyr   zEtcdJobStore.__init__!   sT     	.(@%EFF	#F+DK%55DK    c                     | j                   dz   t        |      z   }	 | j                  j                  |      \  }}t	        j
                  |      }| j                  |d         }|S # t        $ r Y y w xY w)N/	job_state)r   strr   getpickleloads_reconstitute_jobBaseException)r   job_id	node_pathcontent_jobs         r   
lookup_jobzEtcdJobStore.lookup_job7   sm    IIOc&k1		3JGQll7+G(()=>CJ 		s   AA& &	A21A2c                     t        |      }| j                         D cg c]  }|d   |d   |k  r|d    }}|S c c}w )Nnext_run_timer*   )r	   	_get_jobs)r   now	timestamp
job_recordjobss        r   get_due_jobszEtcdJobStore.get_due_jobsA   s[    -c2	 #nn.
/*6?+y8 u
 
 
s   ;c                     | j                         D cg c]  }|d   |d    }}t        |      dkD  rt        t        |            S d S c c}w )Nr-   r   )r.   lenr   min)r   r1   	next_runss      r   get_next_run_timezEtcdJobStore.get_next_run_timeK   sa     #nn.
/*6 '
	 

 =@	NQ<N(Y8XTXX
s   A
c                 r    | j                         D cg c]  }|d   	 }}| j                  |       |S c c}w Nr*   )r.   _fix_paused_jobs_sorting)r   r1   r2   s      r   get_all_jobszEtcdJobStore.get_all_jobsS   s:    48NN4DEj
5!EE%%d+ Fs   4c                 B   | j                   dz   t        |j                        z   }t        |j                        |j                         d}t        j                  || j                        }| j                  j                  ||      }|st        |j                        y )Nr   r-   r   value)r   r    idr	   r-   __getstate__r"   dumpsr   r   put_if_not_existsr   )r   r*   r'   r@   datastatuss         r   add_jobzEtcdJobStore.add_jobX   s    IIOc#&&k1	6s7H7HI))+
 ||E4#7#78..y.E$SVV,, r   c                    | j                   dz   t        |j                        z   }t        |j                        |j                         d}t        j                  || j                        }| j                  j                  | j                  j                  j                  |      dkD  g| j                  j                  j                  ||      gg       \  }}|st        |j                        y )Nr   r>   r   r?   comparesuccessfailure)r   r    rA   r	   r-   rB   r"   rC   r   r   transactiontransactionsversionputr   )r   r*   r'   changesrE   rF   r)   s          r   
update_jobzEtcdJobStore.update_jobc   s    IIOc#&&k1	6s7H7HI))+
 ||GT%9%9:KK++[[--55i@1DE[[--11)41HI , 
	
  (( r   c                 ,   | j                   dz   t        |      z   }| j                  j                  | j                  j                  j                  |      dkD  g| j                  j                  j                  |      gg       \  }}|st        |      y )Nr   r   rI   )r   r    r   rM   rN   rO   deleter   )r   r&   r'   rF   r)   s        r   
remove_jobzEtcdJobStore.remove_jobr   s    IIOc&k1	KK++[[--55i@1DE[[--44Y?@ , 
	
  (( r   c                 N    | j                   j                  | j                         y N)r   delete_prefixr   r   s    r   remove_all_jobszEtcdJobStore.remove_all_jobs|   s    !!$)),r   c                 8    | j                   j                          y rW   )r   closerY   s    r   shutdownzEtcdJobStore.shutdown   s    r   c                     |}t        j                  t               }|j                  |       | j                  |_        | j                  |_        |S rW   )r   __new____setstate__
_scheduler_alias_jobstore_alias)r   r   r*   s      r   r$   zEtcdJobStore._reconstitute_job   s?    	kk##"kk
r   c                 >  	 g }g }t        | j                  j                  | j                              }|D ]F  \  }}	 t	        j
                  |      }|d   | j                  |d         d}|j                  |       H |r|D ]  }| j                  |        t        dddt        j                  	      	t        |	fd
      S # t        $ rM t	        j
                  |      }|d   d   }|j                  |       | j                  j                  d|       Y w xY w)Nr-   r   )r-   r*   rA   z)Unable to restore job "%s" -- removing iti'        )tzinfoc                 *    | d   j                   xs S r:   )r-   )r1   paused_sort_keys    r   <lambda>z(EtcdJobStore._get_jobs.<locals>.<lambda>   s    :e#4#B#B#Uo r   )key)listr   
get_prefixr   r"   r#   r$   appendr%   _logger	exceptionrU   r   r   utcsorted)
r   r2   failed_job_idsall_idsdocr)   r(   r1   	failed_idri   s
            @r   r.   zEtcdJobStore._get_jobs   s   t{{--dii89 	FC ,,s+%,_%=11'+2FG
 J'	  + +		*+"4REU
 	
 !  ,,s+#K06	%%i0&&?	s   A CADDc                     | j                   j                  d| j                  j                  | j                         d| j                  j                   d| j                   dS )Nz<%s (client=%s)><z	 (client=z)>)ro   rp   r   __name__r   rY   s    r   __repr__zEtcdJobStore.__repr__   sK    14>>3J3JDKKX4>>**+9T[[MDDr   )ry   
__module____qualname____doc__r"   DEFAULT_PROTOCOLr   r+   r3   r8   r<   rG   rR   rU   rZ   r]   r$   r.   rz   __classcell__)r   s   @r   r   r      s_      !&//6,Y
	-))-
<Er   r   )r"   r   r   apscheduler.jobr   apscheduler.jobstores.baser   r   r   apscheduler.utilr	   r
   r   etcd3r   ImportErrorexcr   r   r   r   <module>r      sY     '  W W K!
XE< XE	  K
@
AsJKs   : A	AA