σ
P'^c           @@  sB  d  Z  d d l m Z d d l Z d d l m Z d d l m Z d d l m	 Z	 d d l
 m Z d d l m Z d d	 l m Z d d
 l m Z d d l m Z d d l m Z d d l m Z e j e  Z d g Z d   Z e   d d l m Z m Z d d l m  Z  e d    Z! d   Z" d e f d     YZ# d S(   sb   
    celery.backends.database
    ~~~~~~~~~~~~~~~~~~~~~~~~

    SQLAlchemy result store backend.

i    (   t   absolute_importN(   t   contextmanager(   t   wraps(   t   states(   t   BaseBackend(   t   ImproperlyConfigured(   t   range(   t   maybe_timedeltai   (   t   Task(   t   TaskSet(   t   SessionManagert   DatabaseBackendc          C@  s4   y d d  l  }  Wn t k
 r/ t d   n X|  S(   Ni    sj   The database result backend requires SQLAlchemy to be installed.See http://pypi.python.org/pypi/SQLAlchemy(   t
   sqlalchemyt   ImportErrorR   (   R   (    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyt   _sqlalchemy_installed   s    (   t   DatabaseErrort   InvalidRequestError(   t   StaleDataErrorc         c@  s@   z. y	 d  VWn t  k
 r, |  j     n XWd  |  j   Xd  S(   N(   t	   Exceptiont   rollbackt   close(   t   session(    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyt   session_cleanup,   s     	
c         @  s   t       f d    } | S(   Nc          @  s   | j  d d  } x| t |  D]n } y   |  |   SWq t t t f k
 r t j d   j | | d d t | d | k r   q q Xq Wd  S(   Nt   max_retriesi   s,   Failed operation %s. Retrying %s more times.i   t   exc_info(	   t   popR   R   R   R   t   loggert   warningt   __name__t   True(   t   argst   kwargsR   t   retries(   t   fun(    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyt   _inner9   s    (   R   (   R!   R"   (    (   R!   sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyt   retry7   s    c           B@  s°   e  Z d  Z d Z d d d d d  Z e   d  Z e d d d   Z	 e d    Z
 e d    Z e d    Z e d	    Z e d
    Z d   Z d i  d  Z RS(   s   The database result backend.g      ΰ?c         K@  sζ   t  t |   j |   |  j j } t |  j |   |  _ | pL | pL | j |  _	 t
 | p^ i  | j pj i   |  _ | j d | j  |  _ | j p i  } | j d d  t j _ | j d d  t j _ |  j	 sβ t d   n  d  S(   Nt   short_lived_sessionst   taskt   celery_taskmetat   groupt   celery_tasksetmetasO   Missing connection string! Do you have CELERY_RESULT_DBURI set to a real value?(   t   superR   t   __init__t   appt   confR   t   prepare_expirest   expirest   CELERY_RESULT_DBURIt   urlt   dictt   CELERY_RESULT_ENGINE_OPTIONSt   engine_optionst   gett%   CELERY_RESULT_DB_SHORT_LIVED_SESSIONSR$   t   CELERY_RESULT_DB_TABLENAMESR   t	   __table__t   nameR	   R   (   t   selft   dburiR.   R3   R0   R   R,   t
   tablenames(    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyR*   R   s     		c         C@  s"   | j  d |  j d |  j |  j  S(   NR:   R$   (   t   session_factoryR0   R$   R3   (   R9   t   session_manager(    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyt   ResultSessionk   s    		i   c   	      K@  s―   |  j    } t |   t | j t  j t j | k   } | oM | d } | s| t |  } | j |  | j   n  | | _	 | | _
 | | _ | j   | SWd QXd S(   s2   Store return value and status of an executed task.i    N(   R>   R   t   listt   queryR   t   filtert   task_idt   addt   flusht   resultt   statust	   tracebackt   commit(	   R9   RB   RE   RF   RG   R   R   R   R%   (    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyt   _store_resultr   s    '			
c         C@  s   |  j    } t |  y t | j t  j t j | k   } | oM | d } | sz t |  } t j | _	 d | _ n  |  j | j    SWd QXd S(   s#   Get task metadata for a task by id.i    N(   R>   R   R?   R@   R   RA   RB   R   t   PENDINGRF   t   NoneRE   t   meta_from_decodedt   to_dict(   R9   RB   R   R%   (    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyt   _get_task_meta_for   s    'c         C@  sW   |  j    } t |  9 t | |  } | j |  | j   | j   | SWd QXd S(   s&   Store the result of an executed group.N(   R>   R   R	   RC   RD   RH   (   R9   t   group_idRE   R   R'   (    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyt   _save_group   s    

c         C@  sZ   |  j    } t |  < | j t  j t j | k  j   } | rP | j   SWd QXd S(   s   Get metadata for group by id.N(   R>   R   R@   R	   RA   t
   taskset_idt   firstRM   (   R9   RO   R   R'   (    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyt   _restore_group   s    c         C@  s\   |  j    } t |  > | j t  j t j | k  j   | j   | j   Wd QXd S(   s    Delete metadata for group by id.N(	   R>   R   R@   R	   RA   RQ   t   deleteRD   RH   (   R9   RO   R   (    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyt   _delete_group¦   s    
c         C@  sR   |  j    } t |  4 | j t  j t j | k  j   | j   Wd QXd S(   s   Forget about result.N(   R>   R   R@   R   RA   RB   RT   RH   (   R9   RB   R   (    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyt   _forget°   s    %c         C@  s   |  j    } |  j } |  j j   } t |  a | j t  j t j | | k   j	   | j t
  j t
 j | | k   j	   | j   Wd QXd S(   s   Delete expired metadata.N(   R>   R.   R+   t   nowR   R@   R   RA   t	   date_doneRT   R	   RH   (   R9   R   R.   RW   (    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyt   cleanupΈ   s    	c         C@  sD   | j  t d |  j d |  j d |  j   t t |   j | |  S(   NR:   R.   R3   (   t   updateR1   R0   R.   R3   R)   R   t
   __reduce__(   R9   R   R   (    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyR[   Δ   s
    	N(    (   R   t
   __module__t   __doc__t   subpolling_intervalRK   R*   R
   R>   R#   RI   RN   RP   RS   RU   RV   RY   R[   (    (    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyR   L   s   

	($   R]   t
   __future__R    t   loggingt
   contextlibR   t	   functoolsR   t   celeryR   t   celery.backends.baseR   t   celery.exceptionsR   t   celery.fiveR   t   celery.utils.timeutilsR   t   modelsR   R	   R   R
   t	   getLoggerR   R   t   __all__R   t   sqlalchemy.excR   R   t   sqlalchemy.orm.excR   R   R#   R   (    (    (    sC   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/database/__init__.pyt   <module>   s*   			