
    i                         S SK r S SKJr  S SKJrJrJr  S SKJrJ	r	J
r
   S SKJrJrJrJrJrJrJrJrJr  S SKJr  S SKJr   " S	 S
\5      rg! \ a  r\" S5      \eSrCff = f)    N)Job)BaseJobStoreConflictingIdErrorJobLookupError)datetime_to_utc_timestamp	maybe_refutc_timestamp_to_datetime)	ColumnFloatLargeBinaryMetaDataTableUnicodeand_create_engineselect)IntegrityError)nullz0SQLAlchemyJobStore requires SQLAlchemy installedc                      ^  \ rS rSrSrSSSS\R                  SS4U 4S jjrU 4S jrS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rSrU =r$ )SQLAlchemyJobStore   at  
Stores jobs in a database table using SQLAlchemy.
The table will be created if it doesn't exist in the database.

Plugin alias: ``sqlalchemy``

:param str url: connection string (see
    :ref:`SQLAlchemy documentation <sqlalchemy:database_urls>` on this)
:param engine: an SQLAlchemy :class:`~sqlalchemy.engine.Engine` to use instead of creating a
    new one based on ``url``
:param str tablename: name of the table to store jobs in
:param metadata: a :class:`~sqlalchemy.schema.MetaData` instance to use instead of creating a
    new one
:param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the
    highest available
:param str tableschema: name of the (existing) schema in the target database where the table
    should be
:param dict engine_options: keyword arguments to :func:`~sqlalchemy.create_engine`
    (ignored if ``engine`` is given)
Napscheduler_jobsc                 x  > [         TU ]  5         XPl        [        U5      =(       d
    [	        5       nU(       a  [        U5      U l        O-U(       a  [        U40 U=(       d    0 D6U l        O[        S5      e[        UU[        S[        S5      SS9[        S[        S5      SS9[        S	[        S
S9US9U l        g )Nz%Need either "engine" or "url" definedid   T)primary_keynext_run_time   )index	job_stateF)nullable)schema)super__init__pickle_protocolr   r   enginer   
ValueErrorr   r
   r   r   r   jobs_t)	selfurlr&   	tablenamemetadatar%   tableschemaengine_options	__class__s	           M/app/mltbenv/lib/python3.13/site-packages/apscheduler/jobstores/sqlalchemy.pyr$   SQLAlchemyJobStore.__init__3   s     	.X&4(*#F+DK'F0D"FDKDEE 448?E"IT:;e<
    c                 p   > [         TU ]  X5        U R                  R                  U R                  S5        g )NT)r#   startr(   creater&   )r)   	scheduleraliasr/   s      r0   r4   SQLAlchemyJobStore.startS   s'    i'4;;-r2   c                    [        U R                  R                  R                  5      R	                  U R                  R                  R
                  U:H  5      nU R                  R                  5        nUR                  U5      R                  5       nU(       a  U R                  U5      OS sS S S 5        $ ! , (       d  f       g = fN)r   r(   cr    wherer   r&   beginexecutescalar_reconstitute_job)r)   job_id
selectable
connectionr    s        r0   
lookup_jobSQLAlchemyJobStore.lookup_jobW   s    DKKMM334::4;;==;K;Kv;UV
[[ J"**:6==?I8A4)))4t !  s   49B77
Cc                 |    [        U5      nU R                  U R                  R                  R                  U:*  5      $ r:   )r   	_get_jobsr(   r;   r   )r)   now	timestamps      r0   get_due_jobsSQLAlchemyJobStore.get_due_jobs]   s.    -c2	~~dkkmm99YFGGr2   c                    [        U R                  R                  R                  5      R	                  U R                  R                  R                  [        5       :g  5      R                  U R                  R                  R                  5      R                  S5      nU R                  R                  5        nUR                  U5      R                  5       n[        U5      sS S S 5        $ ! , (       d  f       g = f)N   )r   r(   r;   r   r<   r   order_bylimitr&   r=   r>   r?   r	   )r)   rB   rC   r   s       r0   get_next_run_time$SQLAlchemyJobStore.get_next_run_timea   s    4;;==../U4;;==..$&89Xdkkmm112U1X	 	 [[ J&..z:AACM,]; !  s   8*C,,
C:c                 H    U R                  5       nU R                  U5        U$ r:   )rG   _fix_paused_jobs_sorting)r)   jobss     r0   get_all_jobsSQLAlchemyJobStore.get_all_jobsl   s!    ~~%%d+r2   c           
         U R                   R                  5       R                  " S0 UR                  [	        UR
                  5      [        R                  " UR                  5       U R                  5      S.D6nU R                  R                  5        n UR                  U5         S S S 5        g ! [         a    [        UR                  5      ef = f! , (       d  f       g = f)N)r   r   r     )r(   insertvaluesr   r   r   pickledumps__getstate__r%   r&   r=   r>   r   r   )r)   jobrY   rC   s       r0   add_jobSQLAlchemyJobStore.add_jobq   s    ##%,, 
ff!:3;L;L!M#\\#*:*:*<d>R>RS
 [[ J1""6* !  " 1(001 ! s   CB00 CC
C!c           	      (   U R                   R                  5       R                  " S0 [        UR                  5      [
        R                  " UR                  5       U R                  5      S.D6R                  U R                   R                  R                  UR                  :H  5      nU R                  R                  5        nUR                  U5      nUR                  S:X  a  [!        UR                  5      e S S S 5        g ! , (       d  f       g = f)N)r   r    r   rX   )r(   updaterZ   r   r   r[   r\   r]   r%   r<   r;   r   r&   r=   r>   rowcountr   )r)   r^   rb   rC   results        r0   
update_jobSQLAlchemyJobStore.update_job   s    KK V  &?s?P?P%Q!'c.>.>.@$BVBV!W U4;;==##svv-. 	 [[ J''/F!#$SVV,, $ !  s   7D
Dc                 Z   U R                   R                  5       R                  U R                   R                  R                  U:H  5      nU R
                  R                  5        nUR                  U5      nUR                  S:X  a  [        U5      e S S S 5        g ! , (       d  f       g = f)Nr   )
r(   deleter<   r;   r   r&   r=   r>   rc   r   )r)   rA   rh   rC   rd   s        r0   
remove_jobSQLAlchemyJobStore.remove_job   s|    ##%++DKKMM,<,<,FG[[ J''/F!#$V,, $ !  s   %-B
B*c                     U R                   R                  5       nU R                  R                  5        nUR	                  U5        S S S 5        g ! , (       d  f       g = fr:   )r(   rh   r&   r=   r>   )r)   rh   rC   s      r0   remove_all_jobs"SQLAlchemyJobStore.remove_all_jobs   s@    ##%[[ Jv& !  s   A
Ac                 8    U R                   R                  5         g r:   )r&   disposer)   s    r0   shutdownSQLAlchemyJobStore.shutdown   s    r2   c                     [         R                  " U5      nXS'   [        R                  " [        5      nUR	                  U5        U R
                  Ul        U R                  Ul        U$ )Njobstore)r[   loadsr   __new____setstate__
_scheduler_alias_jobstore_alias)r)   r    r^   s      r0   r@   $SQLAlchemyJobStore._reconstitute_job   sP    LL+	 $*kk##"kk
r2   c                    / n[        U R                  R                  R                  U R                  R                  R                  5      R                  U R                  R                  R                  5      nU(       a  UR                  [        U6 5      OUn[        5       nU R                  R                  5        nUR                  U5       H.  n UR                  U R                  UR                  5      5        M0     U(       ag  U R                  R'                  5       R                  U R                  R                  R                  R)                  U5      5      nUR                  U5        S S S 5        U$ ! [         aE    U R                   R#                  SUR                  5        UR%                  UR                  5         M  f = f! , (       d  f       U$ = f)Nz)Unable to restore job "%s" -- removing it)r   r(   r;   r   r    rN   r   r<   r   setr&   r=   r>   appendr@   BaseException_logger	exceptionaddrh   in_)r)   
conditionsrT   rB   failed_job_idsrC   rowrh   s           r0   rG   SQLAlchemyJobStore._get_jobs   s_   DKKMM,,dkkmm.E.EFOOKKMM''

 =GZ%%dJ&78J
[[ J!))*5/KK 6 6s}} EF 6 ++-33KKMM$$((8 ""6* !"  % /LL**CSVV #&&svv.	/	 ! " s2   <G
*E8<A2G
8AGG
GG


Gc                 d    SU R                   R                   SU R                  R                   S3$ )N<z (url=z)>)r/   __name__r&   r*   rp   s    r0   __repr__SQLAlchemyJobStore.__repr__   s+    4>>**+6$++//1B"EEr2   )r&   r(   r%   )r   
__module____qualname____firstlineno____doc__r[   HIGHEST_PROTOCOLr$   r4   rD   rJ   rP   rU   r_   re   ri   rl   rq   r@   rG   r   __static_attributes____classcell__)r/   s   @r0   r   r      su    . $//
@.LH	<
1- -'
4F Fr2   r   )r[   apscheduler.jobr   apscheduler.jobstores.baser   r   r   apscheduler.utilr   r   r	   
sqlalchemyr
   r   r   r   r   r   r   r   r   sqlalchemy.excr   sqlalchemy.sql.expressionr   ImportErrorexcr   rX   r2   r0   <module>r      sj      W W S
 
 
 ..
eF eF	  S
H
IsRSs   "A A"	AA"