o
    DfG                     @   s   d 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mZmZ d	dlmZ zddlmZmZ ddlmZ W n eyU   edw eeZdZedd Zdd ZG dd de	Z dS )z SQLAlchemy result store backend.    N)contextmanagerwraps)states)BaseBackend)ImproperlyConfigured)maybe_timedelta   )TaskTaskExtendedTaskSet)SessionManager)DatabaseErrorInvalidRequestError)StaleDataErrorzhThe database result backend requires SQLAlchemy to be installed.See https://pypi.org/project/SQLAlchemy/)DatabaseBackendc                 c   s@    zzd V  W n t y   |    w W |   d S |   w )N)	Exceptionrollbackclose)session r   Z/home/ubuntu/webapp/venv/lib/python3.10/site-packages/celery/backends/database/__init__.pysession_cleanup   s   
r   c                    s   t   fdd}|S )Nc                     st   | dd}t|D ]-}z
 | i |W   S  tttfy7   tjd j|| d dd |d |kr5 Y q
w d S )Nmax_retries   z-Failed operation %s.  Retrying %s more times.r	   T)exc_info)popranger   r   r   loggerwarning__name__)argskwargsr   retriesfunr   r   _inner)   s   zretry.<locals>._innerr   )r%   r&   r   r$   r   retry'   s   r'   c                       s   e Zd ZdZdZeZeZd fdd	Z	e
dd Ze fdd	Ze		dd
dZ		dddZedd Zedd Zedd Zedd Zedd Zdd Zd fdd	Z  ZS ) r   zThe database result backend.g      ?Nc                    s   t  jdt|d| | jj}| jrt| _|p|p|j| _	t
|p"i fi |jp(i | _|d|j| _|jp8i }|jp=i }| jj|d|dd | jj|d|dd | j	satdd S )N)expires_typeurlshort_lived_sessionstask)schemanamegroupzTMissing connection string! Do you have the database_url setting set to a real value?r   )super__init__r   appconfextended_resultr   task_clsdatabase_urlr)   dictdatabase_engine_optionsengine_optionsgetdatabase_short_lived_sessionsr*   database_table_schemasdatabase_table_names	configuretaskset_clsr   )selfdburir8   r)   r"   r2   schemas
tablenames	__class__r   r   r0   E   sB   


zDatabaseBackend.__init__c                 C   s   | j jddS )Nextendedresult)r1   r2   find_value_for_key)r?   r   r   r   r3   e   s   zDatabaseBackend.extended_resultc                 C   s   |j d| j| jd| jS )N)r@   r*   r   )session_factoryr)   r*   r8   )r?   session_managerr   r   r   ResultSessioni   s   zDatabaseBackend.ResultSessionc           	      K   s   |   }t|? t|| j| jj|k}|o|d }|s1| |}||_|| |  | j	|||||d |
  W d   dS 1 sJw   Y  dS )z1Store return value and state of an executed task.r   )	tracebackrequestN)rJ   r   listqueryr4   filtertask_idaddflush_update_resultcommit)	r?   rP   rF   staterK   rL   r"   r   r+   r   r   r   _store_resulto   s   



"zDatabaseBackend._store_resultc           
      C   sN   | j ||||ddd}dd | jjjD }|D ]}||}	t|||	 qd S )NFT)rF   rU   rK   rL   format_dateencodec                 S   s   g | ]
}|j d vr|j qS )>   idrP   )r-   ).0columnr   r   r   
<listcomp>   s    
z2DatabaseBackend._update_result.<locals>.<listcomp>)_get_result_metar4   	__table__columnsr9   setattr)
r?   r+   rF   rU   rK   rL   metar_   r[   valuer   r   r   rS      s   
zDatabaseBackend._update_resultc                 C   s   |   }t|V t|| j| jj|k}|o|d }|s,| |}tj|_	d|_
| }|dddurA| |d |d< |dddurR| |d |d< | |W  d   S 1 saw   Y  dS )z$Get task meta-data for a task by id.r   Nr!   r"   )rJ   r   rM   rN   r4   rO   rP   r   PENDINGstatusrF   to_dictr9   decodemeta_from_decoded)r?   rP   r   r+   datar   r   r   _get_task_meta_for   s   

$z"DatabaseBackend._get_task_meta_forc                 C   s^   |   }t| | ||}|| |  |  |W  d   S 1 s(w   Y  dS )z&Store the result of an executed group.N)rJ   r   r>   rQ   rR   rT   )r?   group_idrF   r   r.   r   r   r   _save_group   s   

$zDatabaseBackend._save_groupc                 C   sn   |   }t|% || j| jj|k }|r%| W  d   S W d   dS 1 s0w   Y  dS )zGet meta-data for group by id.N)rJ   r   rN   r>   rO   
taskset_idfirstre   )r?   rj   r   r.   r   r   r   _restore_group   s   

"zDatabaseBackend._restore_groupc                 C   sd   |   }t|  || j| jj|k  |  |  W d   dS 1 s+w   Y  dS )z!Delete meta-data for group by id.N)	rJ   r   rN   r>   rO   rl   deleterR   rT   )r?   rj   r   r   r   r   _delete_group   s   


"zDatabaseBackend._delete_groupc                 C   s\   |   }t| || j| jj|k  |  W d   dS 1 s'w   Y  dS )zForget about result.N)rJ   r   rN   r4   rO   rP   ro   rT   )r?   rP   r   r   r   r   _forget   s
   

"zDatabaseBackend._forgetc                 C   s   |   }| j}| j }t|/ || j| jj|| k 	  || j
| j
j|| k 	  |  W d   dS 1 sBw   Y  dS )zDelete expired meta-data.N)rJ   expiresr1   nowr   rN   r4   rO   	date_donero   r>   rT   )r?   r   rr   rs   r   r   r   cleanup   s   


"zDatabaseBackend.cleanupr   c                    s2   |si n|}| | j| j| jd t ||S )N)r@   rr   r8   )updater)   rr   r8   r/   
__reduce__)r?   r!   r"   rC   r   r   rw      s   zDatabaseBackend.__reduce__)NNN)NN)r   N)r    
__module____qualname____doc__subpolling_intervalr
   r4   r   r>   r0   propertyr3   r   rJ   r'   rV   rS   ri   rk   rn   rp   rq   ru   rw   __classcell__r   r   rC   r   r   ;   s8     





	
	
r   )!rz   logging
contextlibr   
vine.utilsr   celeryr   celery.backends.baser   celery.exceptionsr   celery.utils.timer   modelsr
   r   r   r   r   sqlalchemy.excr   r   sqlalchemy.orm.excr   ImportError	getLoggerr    r   __all__r   r'   r   r   r   r   r   <module>   s0    


