o
    Ch                     @   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   s/var/www/html/myvaluetrips/my_value_trip_new/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dd	 Zd 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t | _|j}|du rr|   d S 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?Tr   )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   r   session_managerdatabase_create_tables_at_setup_create_tables)	selfdburir9   r*   r#   r3   schemas
tablenamescreate_tables_at_setup	__class__r   r   r1   E   sJ   


zDatabaseBackend.__init__c                 C   s   | j jddS )Nextendedresult)r2   r3   find_value_for_keyrC   r   r   r   r4   k   s   zDatabaseBackend.extended_resultc                 C   s   |    dS )z#Create the task and taskset tables.N)ResultSessionrM   r   r   r   rB   o   s   zDatabaseBackend._create_tablesc                 C   s*   |d u r| j }|jd| j| jd| jS )N)rD   r+   r   )r@   session_factoryr*   r+   r9   )rC   r@   r   r   r   rN   s   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)rN   r   listqueryr5   filtertask_idaddflush_update_resultcommit)	rC   rU   rK   staterP   rQ   r#   r   r,   r   r   r   _store_result{   s   



"zDatabaseBackend._store_resultc           
      C   sN   | j ||||ddd}dd | jjjD }|D ]}||}	t|||	 qd S )NFT)rK   rZ   rP   rQ   format_dateencodec                 S   s   g | ]
}|j d vr|j qS )>   idrU   )r.   ).0columnr   r   r   
<listcomp>   s    
z2DatabaseBackend._update_result.<locals>.<listcomp>)_get_result_metar5   	__table__columnsr:   setattr)
rC   r,   rK   rZ   rP   rQ   metard   r`   valuer   r   r   rX      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#   )rN   r   rR   rS   r5   rT   rU   r   PENDINGstatusrK   to_dictr:   decodemeta_from_decoded)rC   rU   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)rN   r   r?   rV   rW   rY   )rC   group_idrK   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)rN   r   rS   r?   rT   
taskset_idfirstrj   )rC   ro   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)	rN   r   rS   r?   rT   rq   deleterW   rY   )rC   ro   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)rN   r   rS   r5   rT   rU   rt   rY   )rC   rU   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)rN   expiresr2   nowr   rS   r5   rT   	date_donert   r?   rY   )rC   r   rw   rx   r   r   r   cleanup   s   


"zDatabaseBackend.cleanupr   c                    s2   |si n|}| | j| j| jd t ||S )N)rD   rw   r9   )updater*   rw   r9   r0   
__reduce__)rC   r"   r#   rH   r   r   r|      s   zDatabaseBackend.__reduce__)NNNr   )NN)r   N)r!   
__module____qualname____doc__subpolling_intervalr
   r5   r   r?   r1   propertyr4   rB   rN   r(   r[   rX   rn   rp   rs   ru   rv   rz   r|   __classcell__r   r   rH   r   r   ;   s:    &






	
	
r   )!r   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    


