
    df                         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 	 d dlZ	 d dlmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ  G d
 de      Zy# e$ r d dlZY :w xY w# e$ r	  ed	      w xY w)    )absolute_import)BaseJobStoreJobLookupErrorConflictingIdError)	maybe_refdatetime_to_utc_timestamputc_timestamp_to_datetime)JobN)	create_engineTableColumnMetaDataUnicodeFloatLargeBinaryselectand_)IntegrityError)nullz0SQLAlchemyJobStore requires SQLAlchemy installedc                        e Zd ZdZddddej
                  ddf fd	Z 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 )SQLAlchemyJobStorea  
    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                 r   t         t        |           || _        t	        |      xs
 t               }|rt	        |      | _        n#|rt        |fi |xs i | _        nt        d      t        ||t        dt        d      d      t        dt        d      d      t        d	t        d
      |      | _        y )Nz%Need either "engine" or "url" definedid   T)primary_keynext_run_time   )index	job_stateF)nullable)schema)superr   __init__pickle_protocolr   r   enginer   
ValueErrorr   r   r   r   r   jobs_t)	selfurlr&   	tablenamemetadatar%   tableschemaengine_options	__class__s	           Y/home/api-vastappli/venv/lib/python3.12/site-packages/apscheduler/jobstores/sqlalchemy.pyr$   zSQLAlchemyJobStore.__init__+   s     $02.X&4(*#F+DK'F0D"FDKDEE x448?E"IT:;e<
    c                 z    t         t        |   ||       | j                  j	                  | j
                  d       y )NT)r#   r   startr(   creater&   )r)   	scheduleraliasr/   s      r0   r3   zSQLAlchemyJobStore.startB   s-     $-i?4;;-r1   c                 |   t        | j                  j                  j                        j	                  | j                  j                  j
                  |k(        }| j                  j                         5 }|j                  |      j                         }|r| j                  |      nd cd d d        S # 1 sw Y   y xY wN)r   r(   cr    wherer   r&   beginexecutescalar_reconstitute_job)r)   job_id
selectable
connectionr    s        r0   
lookup_jobzSQLAlchemyJobStore.lookup_jobF   s    DKKMM334::4;;==;K;Kv;UV
[[  	LJ"**:6==?I8A4)))4t	L 	L 	Ls   44B22B;c                 |    t        |      }| j                  | j                  j                  j                  |k        S r8   )r   	_get_jobsr(   r9   r   )r)   now	timestamps      r0   get_due_jobszSQLAlchemyJobStore.get_due_jobsL   s.    -c2	~~dkkmm99YFGGr1   c                    t        | j                  j                  j                        j	                  | j                  j                  j                  t               k7        j                  | j                  j                  j                        j                  d      }| j                  j                         5 }|j                  |      j                         }t        |      cd d d        S # 1 sw Y   y xY w)N   )r   r(   r9   r   r:   r   order_bylimitr&   r;   r<   r=   r	   )r)   r@   rA   r   s       r0   get_next_run_timez$SQLAlchemyJobStore.get_next_run_timeP   s    DKKMM778E$++----78HT[[]]001%%( 	 [[  	<J&..z:AACM,];	< 	< 	<s   8*C,,C5c                 H    | j                         }| j                  |       |S r8   )rD   _fix_paused_jobs_sorting)r)   jobss     r0   get_all_jobszSQLAlchemyJobStore.get_all_jobsX   s!    ~~%%d+r1   c           
          | j                   j                         j                  di |j                  t	        |j
                        t        j                  |j                         | j                        d}| j                  j                         5 }	 |j                  |       	 d d d        y # t        $ r t        |j                        w xY w# 1 sw Y   y xY w)N)r   r   r     )r(   insertvaluesr   r   r   pickledumps__getstate__r%   r&   r;   r<   r   r   )r)   jobrS   rA   s       r0   add_jobzSQLAlchemyJobStore.add_job]   s    ,##%,, &&6s7H7HIc&6&6&8$:N:NO0
 
 [[  	1J1""6*	1 	1 " 1(001	1 	1s   CB//CCCc           	          | j                   j                         j                  di t        |j                        t        j                  |j                         | j                        dj                  | j                   j                  j                  |j                  k(        }| j                  j                         5 }|j                  |      }|j                  dk(  rt!        |j                        	 d d d        y # 1 sw Y   y xY w)N)r   r    r   rR   )r(   updaterT   r   r   rU   rV   rW   r%   r:   r9   r   r&   r;   r<   rowcountr   )r)   rX   r[   rA   results        r0   
update_jobzSQLAlchemyJobStore.update_jobi   s    ,##%,, 6s7H7HIc&6&6&8$:N:NO0
  5!!SVV+, 	 [[  	-J''/F!#$SVV,, $	- 	- 	-s   6DD
c                 N   | j                   j                         j                  | j                   j                  j                  |k(        }| j
                  j                         5 }|j                  |      }|j                  dk(  rt        |      	 d d d        y # 1 sw Y   y xY w)Nr   )
r(   deleter:   r9   r   r&   r;   r<   r\   r   )r)   r?   r`   rA   r]   s        r0   
remove_jobzSQLAlchemyJobStore.remove_jobs   s    ##%++DKKMM,<,<,FG[[  	-J''/F!#$V,, $	- 	- 	-s   %,BB$c                     | j                   j                         }| j                  j                         5 }|j	                  |       d d d        y # 1 sw Y   y xY wr8   )r(   r`   r&   r;   r<   )r)   r`   rA   s      r0   remove_all_jobsz"SQLAlchemyJobStore.remove_all_jobsz   sI    ##%[[  	'Jv&	' 	' 	's   AAc                 8    | j                   j                          y r8   )r&   disposer)   s    r0   shutdownzSQLAlchemyJobStore.shutdown   s    r1   c                     t        j                  |      }| |d<   t        j                  t              }|j	                  |       | j
                  |_        | j                  |_        |S )Njobstore)rU   loadsr
   __new____setstate__
_scheduler_alias_jobstore_alias)r)   r    rX   s      r0   r>   z$SQLAlchemyJobStore._reconstitute_job   sR    LL+	 $	*kk##"kk
r1   c                    g }t        | j                  j                  j                  | j                  j                  j                        j                  | j                  j                  j                        }|r|j                  t        |       n|}t               }| j                  j                         5 }|j                  |      D ]-  }	 |j                  | j                  |j                               / |rg| j                  j'                         j                  | j                  j                  j                  j)                  |            }|j                  |       d d d        |S # t        $ rD | j                   j#                  d|j                         |j%                  |j                         Y w xY w# 1 sw Y   |S xY w)Nz)Unable to restore job "%s" -- removing it)r   r(   r9   r   r    rJ   r   r:   r   setr&   r;   r<   appendr>   BaseException_logger	exceptionaddr`   in_)r)   
conditionsrO   r@   failed_job_idsrA   rowr`   s           r0   rD   zSQLAlchemyJobStore._get_jobs   s\   DKKMM,,dkkmm.E.EFHT[[]]001 	<FZ%%dJ&78J
[[  	+J!))*5 //KK 6 6s}} EF/ ++-33DKKMM4D4D4H4H4XY""6*	+  % /LL**+VX[X^X^_"&&svv./		+ s2   7F<*E,7A+F<,A
F96F<8F99F<<Gc                 d    d| j                   j                  d| j                  j                  dS )N<z (url=z)>)r/   __name__r&   r*   rf   s    r0   __repr__zSQLAlchemyJobStore.__repr__   s    "&.."9"94;;??KKr1   )r}   
__module____qualname____doc__rU   HIGHEST_PROTOCOLr$   r3   rB   rG   rL   rP   rY   r^   ra   rc   rg   r>   rD   r~   __classcell__)r/   s   @r0   r   r      sl    *  8JUY!'!8!8d[_
..LH<

1--'
*Lr1   r   )
__future__r   apscheduler.jobstores.baser   r   r   apscheduler.utilr   r   r	   apscheduler.jobr
   cPicklerU   ImportError
sqlalchemyr   r   r   r   r   r   r   r   r   sqlalchemy.excr   sqlalchemy.sql.expressionr   r   rR   r1   r0   <module>r      s    & W W \ \ J[ [ [-.
LL LL    J
H
IIJs   A "A$ 	A! A!$A2