
    Owg                         d dl 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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Z ed      edZ[ww xY w)    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                        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                 j   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)super__init__pickle_protocolr   r   enginer   
ValueErrorr   r
   r   r   r   jobs_t)	selfurlr%   	tablenamemetadatar$   tableschemaengine_options	__class__s	           W/var/www/horilla/myenv/lib/python3.12/site-packages/apscheduler/jobstores/sqlalchemy.pyr#   zSQLAlchemyJobStore.__init__3   s     	.X&4(*#F+DK'F0D"FDKDEE 448?E"IT:;e<
    c                 r    t         |   ||       | j                  j                  | j                  d       y )NT)r"   startr'   creater%   )r(   	scheduleraliasr.   s      r/   r2   zSQLAlchemyJobStore.startS   s)    i'4;;-r0   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        r/   
lookup_jobzSQLAlchemyJobStore.lookup_jobW   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 r7   )r   	_get_jobsr'   r8   r   )r(   now	timestamps      r/   get_due_jobszSQLAlchemyJobStore.get_due_jobs]   s.    -c2	~~dkkmm99YFGGr0   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'   r8   r   r9   r   order_bylimitr%   r:   r;   r<   r	   )r(   r?   r@   r   s       r/   get_next_run_timez$SQLAlchemyJobStore.get_next_run_timea   s    4;;==../U4;;==..$&89Xdkkmm112U1X	 	 [[  	<J&..z:AACM,];	< 	< 	<s   8*C,,C5c                 H    | j                         }| j                  |       |S r7   )rC   _fix_paused_jobs_sorting)r(   jobss     r/   get_all_jobszSQLAlchemyJobStore.get_all_jobsl   s!    ~~%%d+r0   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(   jobrR   r@   s       r/   add_jobzSQLAlchemyJobStore.add_jobq   s    ,##%,, 
ff!:3;L;L!M#\\#*:*:*<d>R>RS
 [[  	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   rQ   )r'   updaterS   r   r   rT   rU   rV   r$   r9   r8   r   r%   r:   r;   rowcountr   )r(   rW   rZ   r@   results        r/   
update_jobzSQLAlchemyJobStore.update_job   s    DKK V &?s?P?P%Q!'c.>.>.@$BVBV!W U4;;==##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'   deleter9   r8   r   r%   r:   r;   r[   r   )r(   r>   r_   r@   r\   s        r/   
remove_jobzSQLAlchemyJobStore.remove_job   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r7   )r'   r_   r%   r:   r;   )r(   r_   r@   s      r/   remove_all_jobsz"SQLAlchemyJobStore.remove_all_jobs   sI    ##%[[  	'Jv&	' 	' 	's   AAc                 8    | j                   j                          y r7   )r%   disposer(   s    r/   shutdownzSQLAlchemyJobStore.shutdown   s    r0   c                     t        j                  |      }| |d<   t        j                  t              }|j	                  |       | j
                  |_        | j                  |_        |S )Njobstore)rT   loadsr   __new____setstate__
_scheduler_alias_jobstore_alias)r(   r   rW   s      r/   r=   z$SQLAlchemyJobStore._reconstitute_job   sR    LL+	 $	*kk##"kk
r0   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'   r8   r   r   rI   r   r9   r   setr%   r:   r;   appendr=   BaseException_logger	exceptionaddr_   in_)r(   
conditionsrN   r?   failed_job_idsr@   rowr_   s           r/   rC   zSQLAlchemyJobStore._get_jobs   sf   DKKMM,,dkkmm.E.EFOOKKMM''

 =GZ%%dJ&78J
[[  	+J!))*5 //KK 6 6s}} EF/ ++-33KKMM$$((8 ""6*	+"  % /LL**CSVV #&&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)   re   s    r/   __repr__zSQLAlchemyJobStore.__repr__   s+    4>>**+6$++//1B"EEr0   )r|   
__module____qualname____doc__rT   HIGHEST_PROTOCOLr#   r2   rA   rF   rK   rO   rX   r]   r`   rb   rf   r=   rC   r}   __classcell__)r.   s   @r/   r   r      so    . $//
@.LH	<
1- -'
4Fr0   r   )rT   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   rQ   r0   r/   <module>r      sj      W W S
 
 
 ..
eF eF	  S
H
IsRSs   "A A!	AA!