
Nhk                 @   s   d  d l  m Z d  d l m Z d  d l m Z d  d l Z d  d l m Z m Z m	 Z	 d  d l
 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)datetime)utcN)BaseJobStoreJobLookupErrorConflictingIdError)datetime_to_utc_timestamputc_timestamp_to_datetime)Job)Redisz&RedisJobStore requires redis installedc                   s   e  Z d  Z d Z d d d e j   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   Z d d   Z   S)RedisJobStorea  
    Stores jobs in a Redis database. Any leftover keyword arguments are directly passed to redis's
    :class:`~redis.StrictRedis`.

    Plugin alias: ``redis``

    :param int db: the database number to store jobs in
    :param str jobs_key: key to store jobs in
    :param str run_times_key: key to store the jobs' run times in
    :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the
        highest available
    r   zapscheduler.jobszapscheduler.run_timesc                s   t  t |   j   | d  k r+ t d   | s= t d   | sO t d   | |  _ | |  _ | |  _ t d t |  |  |  _	 d  S)Nz$The "db" parameter must not be emptyz*The "jobs_key" parameter must not be emptyz/The "run_times_key" parameter must not be emptydb)
superr   __init__
ValueErrorpickle_protocoljobs_keyrun_times_keyr   intredis)selfr   r   r   r   Zconnect_args)	__class__ W/mod/web/acousticsspace/venv/lib/python3.5/site-packages/apscheduler/jobstores/redis.pyr   $   s    			zRedisJobStore.__init__c             C   s/   |  j  j |  j |  } | r+ |  j |  Sd  S)N)r   Zhgetr   _reconstitute_job)r   job_id	job_stater   r   r   
lookup_job4   s    zRedisJobStore.lookup_jobc             C   se   t  |  } |  j j |  j d |  } | ra |  j j |  j |  } |  j t j j	 | |   Sg  S)Nr   )
r   r   Zzrangebyscorer   Zhmgetr   _reconstitute_jobssixmoveszip)r   now	timestampZjob_ids
job_statesr   r   r   get_due_jobs8   s    zRedisJobStore.get_due_jobsc             C   s=   |  j  j |  j d d d d } | r9 t | d d  Sd  S)Nr   Z
withscoresT   )r   Zzranger   r	   )r   next_run_timer   r   r   get_next_run_time@   s    !zRedisJobStore.get_next_run_timec                sa   |  j  j |  j  } |  j t j |   } t d d d d t   t | d   f d d   S)Ni'        tzinfokeyc                s   |  j  p   S)N)r'   )job)paused_sort_keyr   r   <lambda>I   s    z,RedisJobStore.get_all_jobs.<locals>.<lambda>)	r   Zhgetallr   r   r   	iteritemsr   r   sorted)r   r$   jobsr   )r.   r   get_all_jobsE   s    zRedisJobStore.get_all_jobsc             C   s   |  j  j |  j | j  r* t | j   |  j  j   w } | j   | j |  j | j t j	 | j
   |  j   | j r | j |  j | j t | j  i  | j   Wd  QRXd  S)N)r   hexistsr   idr   pipelineZmultihsetpickledumps__getstate__r   r'   zaddr   r   execute)r   r-   piper   r   r   add_jobK   s    
!	zRedisJobStore.add_jobc             C   s   |  j  j |  j | j  s* t | j   |  j  j    } | j |  j | j t j | j	   |  j
   | j r | j |  j | j t | j  i  n | j |  j | j  | j   Wd  QRXd  S)N)r   r4   r   r5   r   r6   r7   r8   r9   r:   r   r'   r;   r   r   zremr<   )r   r-   r=   r   r   r   
update_jobY   s    !	zRedisJobStore.update_jobc          
   C   sq   |  j  j |  j |  s$ t |   |  j  j   7 } | j |  j |  | j |  j |  | j   Wd  QRXd  S)N)	r   r4   r   r   r6   hdelr?   r   r<   )r   r   r=   r   r   r   
remove_jobh   s    zRedisJobStore.remove_jobc          	   C   sG   |  j  j   1 } | j |  j  | j |  j  | j   Wd  QRXd  S)N)r   r6   deleter   r   r<   )r   r=   r   r   r   remove_all_jobsq   s    zRedisJobStore.remove_all_jobsc             C   s   |  j  j j   d  S)N)r   Zconnection_poolZ
disconnect)r   r   r   r   shutdownw   s    zRedisJobStore.shutdownc             C   sG   t  j |  } t j t  } | j |  |  j | _ |  j | _ | S)N)r8   loadsr
   __new____setstate__Z
_schedulerZ_aliasZ_jobstore_alias)r   r   r-   r   r   r   r   z   s    zRedisJobStore._reconstitute_jobc             C   s   g  } g  } xc | D][ \ } } y | j  |  j |   Wq t k
 rm |  j j d |  | j  |  Yq Xq W| r |  j j   7 } | j |  j |  | j	 |  j
 |  | j   Wd  QRX| S)Nz)Unable to restore job "%s" -- removing it)appendr   BaseException_logger	exceptionr   r6   rA   r   r?   r   r<   )r   r$   r2   Zfailed_job_idsr   r   r=   r   r   r   r      s    z RedisJobStore._reconstitute_jobsc             C   s   d |  j  j S)Nz<%s>)r   __name__)r   r   r   r   __repr__   s    zRedisJobStore.__repr__)rM   
__module____qualname____doc__r8   HIGHEST_PROTOCOLr   r   r%   r(   r3   r>   r@   rB   rD   rE   r   r   rN   r   r   )r   r   r      s   		r   )
__future__r   r   Zpytzr   r   Zapscheduler.jobstores.baser   r   r   Zapscheduler.utilr   r	   Zapscheduler.jobr
   cPickler8   ImportErrorr   r   r   r   r   r   r   <module>   s   