
Nh                 @   s   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 y d  d l Z Wn e k
 r d  d l Z Yn Xy d  d l m Z Wn e k
 r e d   Yn XGd d	   d	 e  Z d S)
    )absolute_import)BaseJobStoreJobLookupErrorConflictingIdError)	maybe_refdatetime_to_utc_timestamputc_timestamp_to_datetime)JobN)	RethinkDBz.RethinkDBJobStore requires rethinkdb installedc                   s   e  Z d  Z d Z d d d e j   f d d  Z   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 d  Z d d    Z   S)!RethinkDBJobStorea1  
    Stores jobs in a RethinkDB database. Any leftover keyword arguments are directly passed to
    rethinkdb's `RethinkdbClient <http://www.rethinkdb.com/api/#connect>`_.

    Plugin alias: ``rethinkdb``

    :param str database: database to store jobs in
    :param str collection: collection to store jobs in
    :param client: a :class:`rethinkdb.net.Connection` 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apschedulerjobsNc                s   t  t |   j   | s% t d   | s7 t d   | |  _ | |  _ d  |  _ | |  _ | |  _ | |  _	 t
   |  _ d  |  _ d  S)Nz*The "database" parameter must not be emptyz'The "table" parameter must not be empty)superr   __init__
ValueErrordatabase
table_nametableclientpickle_protocolconnect_argsr
   rconn)selfr   r   r   r   r   )	__class__ [/mod/web/acousticsspace/venv/lib/python3.5/site-packages/apscheduler/jobstores/rethinkdb.pyr   !   s    						zRethinkDBJobStore.__init__c                s[  t  t |   j | |  |  j r7 t |  j  |  _ n! |  j j d |  j |  j	  |  _ |  j |  j j
   j |  j  k r |  j j |  j  j |  j  |  j |  j j   j |  j  k r |  j j |  j  j |  j  d |  j j |  j  j   j |  j  k r3|  j j |  j  j d  j |  j  |  j j |  j  j |  j  |  _ d  S)Ndbnext_run_time)r   r   startr   r   r   r   connectr   r   Zdb_listrunZ	db_creater   Z
table_listZtable_creater   Z
index_listZindex_creater   )r   Z	scheduleralias)r   r   r   r   3   s    	!$$-(zRethinkDBJobStore.startc             C   sL   t  |  j j |  j d  j |  j   } | rH |  j | d d  Sd  S)N	job_stater   )listr   get_allpluckr    r   _reconstitute_job)r   job_idresultsr   r   r   
lookup_jobF   s    -zRethinkDBJobStore.lookup_jobc             C   s#   |  j  |  j j d t |  k  S)Nr   )	_get_jobsr   rowr   )r   nowr   r   r   get_due_jobsJ   s    zRethinkDBJobStore.get_due_jobsc             C   sy   t  |  j j |  j j d d  k  j |  j j d   j d d    j d  j	 |  j
   } | ru t | d  Sd  S)Nr   c             S   s   |  d S)Nr   r   )xr   r   r   <lambda>R   s    z5RethinkDBJobStore.get_next_run_time.<locals>.<lambda>   r   )r#   r   filterr   r+   order_byZascmaplimitr    r   r   )r   r(   r   r   r   get_next_run_timeM   s    		z#RethinkDBJobStore.get_next_run_timec             C   s   |  j    } |  j |  | S)N)r*   Z_fix_paused_jobs_sorting)r   r   r   r   r   get_all_jobsX   s    zRethinkDBJobStore.get_all_jobsc          	   C   s   d | j  d t | j  d |  j j t j | j   |  j   i } |  j	 j
 |  j |  j  } | d d k r t | j    d  S)Nidr   r"   errorsr   )r7   r   r   r   binarypickledumps__getstate__r   r   insertr    r   r   )r   jobZjob_dictr(   r   r   r   add_job]   s    	-zRethinkDBJobStore.add_jobc                s   d t  | j  d |  j j t j | j   |  j   i } |  j j	 | j
  j |  j |  j    d t   f d d     j    k }   d d k s   d d k s | r t | j
   d  S)	Nr   r"   Fc                s     |  d k S)Nr   r   )r.   )r(   r   r   r/   m   s    z.RethinkDBJobStore.update_job.<locals>.<lambda>skippedr   r8   )r   r   r   r9   r:   r;   r<   r   r   r$   r7   updater    r   r3   keysr   )r   r>   changesr@   r   )r(   r   
update_jobg   s    -*''zRethinkDBJobStore.update_jobc             C   sL   |  j  j |  j   j |  j  } | d | d d k rH t |   d  S)NZdeletedr@   r0   )r   r$   deleter    r   r   )r   r'   r(   r   r   r   
remove_jobq   s    $zRethinkDBJobStore.remove_jobc             C   s   |  j  j   j |  j  d  S)N)r   rE   r    r   )r   r   r   r   remove_all_jobsv   s    z!RethinkDBJobStore.remove_all_jobsc             C   s   |  j  j   d  S)N)r   close)r   r   r   r   shutdowny   s    zRethinkDBJobStore.shutdownc             C   sG   t  j |  } t j t  } | j |  |  j | _ |  j | _ | S)N)r:   loadsr	   __new____setstate__Z
_schedulerZ_aliasZ_jobstore_alias)r   r"   r>   r   r   r   r&   |   s    z#RethinkDBJobStore._reconstitute_jobc                s  g  } g  } | r=   j  j   j j d d  k  j |  n   j  } | j d d  j d d  } xu | j   j  D]a } y | j   j	 | d   Wqw t
 k
 r   j j d | d  | j | d  Yqw Xqw W| r  j j |  j   f d d    j   j  | S)Nr   r7   r"   z)Unable to restore job "%s" -- removing itc                s     j  j |   j   S)N)r   r$   rE   )r'   )r   r   r   r/      s    z-RethinkDBJobStore._get_jobs.<locals>.<lambda>)r   r1   r   r+   r2   r%   r    r   appendr&   	Exception_logger	exceptionexprZfor_each)r   	predicater   Zfailed_job_idsquerydocumentr   )r   r   r*      s    :zRethinkDBJobStore._get_jobsc             C   s   |  j  } d |  j j | f S)Nz<%s (connection=%s)>)r   r   __name__)r   
connectionr   r   r   __repr__   s    	zRethinkDBJobStore.__repr__)rU   
__module____qualname____doc__r:   HIGHEST_PROTOCOLr   r   r)   r-   r5   r6   r?   rD   rF   rG   rI   r&   r*   rW   r   r   )r   r   r      s    	

r   )
__future__r   Zapscheduler.jobstores.baser   r   r   Zapscheduler.utilr   r   r   Zapscheduler.jobr	   cPickler:   ImportErrorZ	rethinkdbr
   r   r   r   r   r   <module>   s   