
    h                        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 	 ddlmZmZ ddlmZ  ej4                  e      ZdZed        Zd Z G d de	      Z y# e$ r	  ed      w xY w)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              #      K   	 d  	 | j                          y # t         $ r | j                           w xY w# | j                          w xY wwN)	Exceptionrollbackclose)sessions    ]/var/www/Befach/backend/env/lib/python3.12/site-packages/celery/backends/database/__init__.pysession_cleanupr      sD     
 		   	s!   A A58 A

Ac                 .     t                fd       }|S )Nc                      |j                  dd      }t        |      D ]  }	  | i |c S  y # t        t        t        f$ r5 t
        j                  dj                  ||z
  dz
  d       |dz   |k\  r Y Xw xY w)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funs       r   _innerzretry.<locals>._inner)   s    jj2[)GD+F++ * "#6G CLL+"7!";!  # Q;+- .s   /AA87A8r   )r(   r)   s   ` r   retryr*   '   s     
3Z  M    c                        e Zd ZdZdZeZeZd fd	Z	e
d        Zd ZddZe	 	 dd       Z	 	 ddZed	        Zed
        Zed        Zed        Zed        Zd Zd fd	Z xZS )r   zThe database result backend.g      ?c                     t        	|   dt        |d| | j                  j                  }| j
                  rt        | _        |xs |xs |j                  | _	        t        |xs i fi |j                  xs i | _        |j                  d|j                        | _        |j                   xs i }|j"                  xs i }| j                  j%                  |j                  d      |j                  d             | j&                  j%                  |j                  d      |j                  d             | j                  st)        d      t+               | _        |j.                  }|du r| j1                          y y )	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?T )super__init__r	   appconfextended_resultr   task_clsdatabase_urlr/   dictdatabase_engine_optionsengine_optionsgetdatabase_short_lived_sessionsr0   database_table_schemasdatabase_table_names	configuretaskset_clsr   r   session_managerdatabase_create_tables_at_setup_create_tables)
selfdburir?   r/   r&   r9   schemas
tablenamescreate_tables_at_setup	__class__s
            r   r7   zDatabaseBackend.__init__E   sp    	 	,o 	,$*	,xx}}(DM4%44#4#4" b2**0b2 %+JJ"..%0! --3..4"
;;v&' 	  	) 	"";;w'( 	# 	* xx&=> >  ./!%!E!E!T)! *r+   c                 N    | j                   j                  j                  dd      S )Nextendedresult)r8   r9   find_value_for_keyrI   s    r   r:   zDatabaseBackend.extended_resultk   s    xx}}//
HEEr+   c                 $    | j                          y)z#Create the task and taskset tables.N)ResultSessionrS   s    r   rH   zDatabaseBackend._create_tableso   s    r+   c                     || j                   } |j                  d| j                  | j                  d| j                  S )N)rJ   r0   r5   )rF   session_factoryr/   r0   r?   )rI   rF   s     r   rU   zDatabaseBackend.ResultSessions   sM    ""22O... #((!%!:!:# !!# 	#r+   c                    | j                         }t        |      5  t        |j                  | j                        j                  | j                  j                  |k(              }|xr |d   }|s9| j	                  |      }||_        |j                  |       |j                          | j                  |||||       |j                          ddd       y# 1 sw Y   yxY w)z1Store return value and state of an executed task.r   )	tracebackrequestN)rU   r   listqueryr;   filtertask_idaddflush_update_resultcommit)	rI   r^   rQ   staterY   rZ   r&   r   r1   s	            r   _store_resultzDatabaseBackend._store_result{   s     $$&W% 
	dmm4;;DMM<Q<QU\<\]^D#DGD}}W-&D!feyRYZNN
	 
	 
	s   B5CC#c                    | j                  ||||dd      }| j                  j                  j                  D cg c]  }|j                  dvr|j                   }}|D ]   }|j                  |      }	t        |||	       " y c c}w )NFT)rQ   rc   rY   rZ   format_dateencode>   idr^   )_get_result_metar;   	__table__columnsr3   r@   setattr)
rI   r1   rQ   rc   rY   rZ   metacolumnrk   values
             r   ra   zDatabaseBackend._update_result   s     $$F%/8'16t % E .2]]-D-D-L-L <6kk):: ;; < < FHHV$ED&%( <s   !Bc                 N   | j                         }t        |      5  t        |j                  | j                        j                  | j                  j                  |k(              }|xr |d   }|s-| j	                  |      }t        j                  |_	        d|_
        |j                         }|j                  dd      | j                  |d         |d<   |j                  dd      | j                  |d         |d<   | j                  |      cddd       S # 1 sw Y   yxY w)z$Get task meta-data for a task by id.r   Nr%   r&   )rU   r   r[   r\   r;   r]   r^   r   PENDINGstatusrQ   to_dictr@   decodemeta_from_decoded)rI   r^   r   r1   datas        r   _get_task_meta_forz"DatabaseBackend._get_task_meta_for   s     $$&W% 	0dmm4;;DMM<Q<QU\<\]^D#DGD}}W-$nn"<<>Dxx%1#{{4<8Vxx$'3!%T(^!<X))$/	0 	0 	0s   C5DD$c                     | j                         }t        |      5  | j                  ||      }|j                  |       |j	                          |j                          |cddd       S # 1 sw Y   yxY w)z&Store the result of an executed group.N)rU   r   rE   r_   r`   rb   )rI   group_idrQ   r   r4   s        r   _save_groupzDatabaseBackend._save_group   sc     $$&W% 	$$Xv6EKKMMONN	 	 	s   AA++A4c                 :   | j                         }t        |      5  |j                  | j                        j	                  | j                  j
                  |k(        j                         }|r|j                         cddd       S 	 ddd       y# 1 sw Y   yxY w)zGet meta-data for group by id.N)rU   r   r\   rE   r]   
taskset_idfirstrs   )rI   ry   r   r4   s       r   _restore_groupzDatabaseBackend._restore_group   s     $$&W% 	'MM$"2"23::  ++x799> }}		' 	' 	' 	' 	's   A!BBc                 B   | j                         }t        |      5  |j                  | j                        j	                  | j                  j
                  |k(        j                          |j                          |j                          ddd       y# 1 sw Y   yxY w)z!Delete meta-data for group by id.N)	rU   r   r\   rE   r]   r|   deleter`   rb   )rI   ry   r   s      r   _delete_groupzDatabaseBackend._delete_group   sz     $$&W% 	MM$**+22  ++x799?MMONN		 	 	s   A0BBc                 "   | j                         }t        |      5  |j                  | j                        j	                  | j                  j
                  |k(        j                          |j                          ddd       y# 1 sw Y   yxY w)zForget about result.N)rU   r   r\   r;   r]   r^   r   rb   )rI   r^   r   s      r   _forgetzDatabaseBackend._forget   sl     $$&W% 	MM$--(//0E0E0PQXXZNN	 	 	s   A BBc                    | j                         }| j                  }| j                  j                         }t	        |      5  |j                  | j                        j                  | j                  j                  ||z
  k        j                          |j                  | j                        j                  | j                  j                  ||z
  k        j                          |j                          ddd       y# 1 sw Y   yxY w)zDelete expired meta-data.N)rU   expiresr8   nowr   r\   r;   r]   	date_doner   rE   rb   )rI   r   r   r   s       r   cleanupzDatabaseBackend.cleanup   s    $$&,,hhllnW% 	MM$--(//''3=9;;A68MM$**+22  **cGm<>>DfhNN	 	 	s   B5D  D	c                     |si n|}|j                  | j                  | j                  | j                  d       t        |   ||      S )N)rJ   r   r?   )updater/   r   r?   r6   
__reduce__)rI   r%   r&   rN   s      r   r   zDatabaseBackend.__reduce__   sH    !vhh#224	5 w!$//r+   )NNNr   )NN)r5   N)r$   
__module____qualname____doc__subpolling_intervalr   r;   r   rE   r7   propertyr:   rH   rU   r*   rd   ra   rw   rz   r~   r   r   r   r   __classcell__)rN   s   @r   r   r   ;   s    & HK$"L F F# >B"   =A#)& 0 0"   ' '    
0 0r+   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   r5   r+   r   <module>r      s    &  %   , 2 - / / #4A1 
		8	$
  (o0k o0S  4
	34 44s   A5 5B