
    h                        d Z ddlZddl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mZmZ dd	lmZ dd
lmZmZ ddlmZ ddlZddlmZmZmZmZ ddlm Z  ddl!m"Z" ddlm#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z:m;Z;m<Z<m=Z= ddl>m?Z? dZ@ eAdh          ZB e7eC          ZDdZE edd          ZFdZGdZHd ZI G d deJ          ZKd  ZL G d! d"          ZM G d# d$          ZN G d% d&eMeN          ZOeOZP G d' d(eM          ZQ G d) d*eQeN          ZR G d+ d,eO          ZSdS )-zResult backend base classes.

- :class:`BaseBackend` defines the interface.

- :class:`KeyValueStoreBackend` is a common base class
    using K/V semantics like _get and _put.
    N)
namedtuple)	timedelta)partial)WeakValueDictionary)ExceptionInfo)dumpsloadsprepare_accept_content)registry)bytes_to_strensure_bytes)maybe_sanitize_url)current_appgroupmaybe_signaturestates)get_current_task)Context)BackendGetMetaErrorBackendStoreError
ChordErrorImproperlyConfiguredNotRegisteredSecurityErrorTaskRevokedErrorTimeoutError)GroupResult
ResultBase	ResultSetallow_join_resultresult_from_tuple)	BufferMap)LRUCachearity_greater)
get_logger)create_exception_clsensure_serializableget_pickleable_exceptionget_pickled_exceptionraise_with_context) get_exponential_backoff_interval)BaseBackendKeyValueStoreBackendDisabledBackendpicklei    pending_results_t)concreteweakzU
No result backend is configured.
Please see the documentation for more information.
z
Starting chords requires a result backend to be configured.

Note that a group chained with a task is also upgraded to be a chord,
as this pattern requires synchronization.

Result backends that supports chords: Redis, Database, Memcached, and more.
c                 8     | |dt          j                    i|S )zReturn an unpickled backend.app)r   _get_current_object)clsargskwargss      T/var/www/html/auto_sub_bot/venv/lib/python3.11/site-packages/celery/backends/base.pyunpickle_backendr:   ?   s%    3F+9;;FvFFF    c                        e Zd Zd ZexZxZZdS )	_nulldictc                     d S N )selfakws      r9   ignorez_nulldict.ignoreE       r;   N)__name__
__module____qualname__rD   __setitem__update
setdefaultr@   r;   r9   r=   r=   D   s.           )/.K.&:::r;   r=   c                     | dS | j         S NF)ignore_resultrequests    r9   _is_request_ignore_resultrQ   K   s    u  r;   c                      e Zd Zej        Zej        Zej        ZeZdZdZ	dZ
dZdddddZ	 	 d=dZd>d	Zd
 Zddej        fdZddddej        fdZd Zdddej        fdZdddej        fdZd?dZd?dZd?dZd Zd Zd Zd Zd Z d Z!d Z"d?dZ#d?dZ$d Z%d Z&	 	 d@dZ'd  Z(	 dAd!Z)d" Z*d# Z+d$ Z,e,Z-d% Z.d& Z/d' Z0d( Z1d) Z2dBd*Z3d+ Z4d, Z5dBd-Z6dBd.Z7d/ Z8d0 Z9d1 Z:d2 Z;d3 Z<d4 Z=d5 Z>d6 Z?dCd7Z@d8 ZAd9 ZBd?d:ZCdDd<ZDdS )EBackendNFT   r      )max_retriesinterval_startinterval_stepinterval_maxc                 f   || _         | j         j        }	|p|	j        | _        t          j        | j                 \  | _        | _        | _        |p|	j	        }
|
dk    rt                      nt          |
          | _        |                     ||          | _        ||	j        n|| _        | j        |	j        n| j        | _        t%          | j                  | _        |	                    dd          | _        |	                    dd          | _        |	                    dd          | _        |	                    d	t/          d
                    | _        |	                    dd          | _        t5          i t7                                | _        t;          t<                    | _        || _         d S )N)limitresult_backend_always_retryF+result_backend_max_sleep_between_retries_msi'  ,result_backend_base_sleep_between_retries_ms
   result_backend_max_retriesinfresult_backend_thread_safe)!r4   confresult_serializer
serializerserializer_registry	_encoderscontent_typecontent_encodingencoderresult_cache_maxr=   r#   _cacheprepare_expiresexpiresresult_accept_contentacceptaccept_contentr
   getalways_retrymax_sleep_between_retries_msbase_sleep_between_retries_msfloatrV   thread_safer0   r   _pending_resultsr"   MESSAGE_BUFFER_MAX_pending_messagesurl)rA   r4   rf   max_cached_resultsrq   ro   expires_typer|   r8   rd   cmaxs              r9   __init__zBackend.__init__o   s{    x}$>(> -6tG					!:T%:%)RZZikkkXD5I5I5I++G\BB 5;Nd00-1[-@d))dk,T[99 HH%BEJJ,0HH5bdi,j,j)-1XX6dfh-i-i*88$@%,,OO88$@%HH 1"6I6K6K L L!*+=!>!>r;   c                     |r| j         S t          | j         pd          }|                    d          r
|dd         n|S )z=Return the backend as an URI, sanitizing the password or not. z:///Nr[   )r|   r   endswith)rA   include_passwordr|   s      r9   as_urizBackend.as_uri   sI      	8O R00<<//8s3B3xxS8r;   c                 D    |                      ||t          j                  S )zMark a task as started.)store_resultr   STARTEDrA   task_idmetas      r9   mark_as_startedzBackend.mark_as_started   s      $???r;   c                     |r(t          |          s|                     ||||           |r |j        r|                     |||           dS dS dS )z#Mark task as successfully executed.rO   N)rQ   r   chordon_chord_part_return)rA   r   resultrP   r   states         r9   mark_as_donezBackend.mark_as_done   s~      	G!:7!C!C 	GgvugFFF 	>w} 	>%%guf=====	> 	> 	> 	>r;   c                    |r|                      |||||           |r=|j        r|                     |||           	 t          |j                  }n%# t
          t          f$ r t                      }Y nw xY w|D ]}	t          |	          }
|
	                    |
j
                   |
j
                            d          |
_        |
j
                            d          |
_        |r4|t          j        v r&|
j        |                      |
j        ||||
           d|
j
        v r|                     |
||           |r"|j        r|                     |||           dS dS dS dS )z#Mark task as executed with failure.	tracebackrP   r   group_idNr   )r   r   r   iterchainAttributeError	TypeErrortupler   rJ   optionsrs   idr   r   PROPAGATE_STATESr   errbacks_call_task_errbacks)rA   r   excr   rP   r   call_errbacksr   
chain_data
chain_elemchain_elem_ctxs              r9   mark_as_failurezBackend.mark_as_failure   s   
  	DgsE(17  D D D .	B} ?))'5#>>>%!'-00

"I. % % %"WW


%( J J
 ")!4!4%%n&<===$2$:$>$>y$I$I!'5'='A'A*'M'M$ !%*f.E%E%E"*6%%&.U"+^ &    n444--neSIII B!1 B((#yAAAAA].	B .	BZB B B Bs   A A65A6c                    g }|j         D ]}| j                            |          }|j        s| j        |_        	 t	          |j        d          rGt          |j        j        t                    s(t          |j        j        d          r ||||           n|
                    |           # t          $ r |
                    |           Y w xY w|r|j        }|j        p|}t          || j                  }| j        j        j        s|j                            dd          r|                    |f||           d S |                    |f||           d S d S )N
__header__rU   r4   is_eagerF)	parent_idroot_id)r   r4   	signature_apphasattrtype
isinstancer   r   r$   appendr   r   r   r   rd   task_always_eagerdelivery_infors   applyapply_async)	rA   rP   r   r   old_signatureerrbackr   r   gs	            r9   r   zBackend._call_task_errbacks   s   ' 	. 	.Gh((11G< (#x.  l;;2 'w|'>HH2 &gl&=qAA2 GGS)4444!((111  . . .
 $$W-----.  	 jGo0Gm222Ax}. '2G2K2KJX]2^2^ J'7       J'7      	 	s   A1B,,CCr   c                     t          |          }|r|                     |||d |           |r |j        r|                     |||           d S d S d S )Nr   )r   r   r   r   )rA   r   reasonrP   r   r   r   s          r9   mark_as_revokedzBackend.mark_as_revoked  s    v&& 	?gsE(,g  ? ? ? 	;w} 	;%%guc:::::	; 	; 	; 	;r;   c                 6    |                      |||||          S )zfMark task as being retries.

        Note:
            Stores the current exception (if any).
        r   )r   )rA   r   r   r   rP   r   r   s          r9   mark_as_retryzBackend.mark_as_retry  s/       #u+4g ! G G 	Gr;   c                    | j         }	 |j        |j                 j        }n# t          $ r | }Y nw xY wt          |j                            d          |j                            dg           t                      d|          }	 | 	                    ||d            |
                    |j        |          S # t          $ r&}|
                    |j        |          cY d }~S d }~ww xY w)Nr   
link_error)r   r   r   )r   )r4   _taskstaskbackendKeyErrorr   r   rs   dictr   fail_from_current_stackr   	Exception)rA   callbackr   r4   r   fake_requesteb_excs          r9   chord_error_from_stackzBackend.chord_error_from_stack  s%   h	j/7GG 	 	 	GGG	 "&&y11 (,,\2>>!VV 
  
 	 
  	I$$\3=== 228;C2HHH  	L 	L 	L228;F2KKKKKKKK	Ls*   ! 00B9 9
C)C$C)$C)c                    t          j                    \  }}}	 ||n|}t          |||f          }|                     |||j                   ||@	 |j                                         |j        j         n# t          $ r Y nw xY w|j	        }|@~S # |@	 |j                                         |j        j         n# t          $ r Y nw xY w|j	        }|@~w xY wr?   )
sysexc_infor   r   r   tb_frameclearf_localsRuntimeErrortb_next)rA   r   r   type_real_exctbexception_infos          r9   r   zBackend.fail_from_current_stack2  s'   !lnnx	!k((sC*E3+;<<N  #~/GHHH!.K%%'''K(((#   D Z .  .K%%'''K(((#   D Z . FFFFsA   5B %A77
BBC%B<;C<
C	CC		Cc                     || j         n|}|t          v rt          |          S t          |          }t	          |d|j                  t          |j        | j                  |j	        dS )z$Prepare exception for serialization.NrH   )exc_typeexc_message
exc_module)
rf   EXCEPTION_ABLE_CODECSr(   r   getattrrF   r'   r7   encoderG   )rA   r   rf   exctypes       r9   prepare_exceptionzBackend.prepare_exceptionE  so    (2(:T__

...+C000s))#G^W=MNN238T[II%02 2 	2r;   c                    |sdS t          |t                    r| j        t          v rt	          |          }|S t          |t
                    s6	 t          |          }n%# t          $ r}t          d|           |d}~ww xY w|                    d          }	 |d         }n"# t          $ r}t          d          |d}~ww xY w|t          |t                    }nr	 t          j        |         }|                    d          D ]}t          ||          }n6# t          t           f$ r" t          |t"          j        j                  }Y nw xY w|                    dd          }t          |t&                    rt)          |t                    s ||n| d| }t+          d	| d
|           	 t          |t,          t.          f          r || }n ||          }n,# t0          $ r}	t1          | d| d          }Y d}	~	nd}	~	ww xY w|S )z1Convert serialized exception to Python exception.NzbIf the stored exception isn't an instance of BaseException, it must be a dictionary.
Instead got: r   r   z5Exception information must include the exception type.r   r   z!Expected an exception class, got z with payload ())r   BaseExceptionrf   r   r)   r   r   rs   r   
ValueErrorr&   rF   r   modulessplitr   r   celery
exceptionsr   
issubclassr   r   listr   )
rA   r   er   r   r6   nameexc_msgfake_exc_typeerrs
             r9   exception_to_pythonzBackend.exception_to_pythonO  s    	>4]++ 	>"777+C00JC&& 	>>3ii > > > !6 14!6 !6 7 7 =>>> WW\**
	::HH 	: 	: 	: 2 3 389:	: &($ $CCGk*-$NN3// - -D!#t,,CC-n- G G G*8+1+<+EG GG ''-,," #t$$ 	\JsM,J,J 	\(2(:HH:@Z@ZPX@Z@ZMZMZZQXZZ\ \ \	1'E4=11 #c7mc'll 	1 	1 	1s//W///00CCCCCC	1 
sZ   A 
B)A<<BB# #
C-B==C:D 0EE0-G 
H(HHc                 n    | j         dk    r)t          |t                    r|                                S |S )zPrepare value for storage.r/   )rf   r   r   as_tuplerA   r   s     r9   prepare_valuezBackend.prepare_value  s3    ?h&&:fj+I+I&??$$$r;   c                 8    |                      |          \  }}}|S r?   )_encode)rA   data_payloads       r9   r   zBackend.encode  s    T**1gr;   c                 .    t          || j                  S )N)rf   )r   rf   )rA   r   s     r9   r   zBackend._encode  s    Tdo6666r;   c                 `    |d         | j         v r|                     |d                   |d<   |S )Nstatusr   )EXCEPTION_STATESr   )rA   r   s     r9   meta_from_decodedzBackend.meta_from_decoded  s4    >T222!55d8nEEDNr;   c                 R    |                      |                     |                    S r?   )r   decoderA   r   s     r9   decode_resultzBackend.decode_result  s"    %%dkk'&:&:;;;r;   c                 p    ||S |pt          |          }t          || j        | j        | j                  S )N)ri   rj   rq   )strr	   ri   rj   rq   r  s     r9   r  zBackend.decode  sF    ?N)S\\W"&"3&*&; K) ) ) 	)r;   c                     || j         j        j        }t          |t                    r|                                }||r ||          S |S r?   )r4   rd   result_expiresr   r   total_seconds)rA   valuer   s      r9   rn   zBackend.prepare_expires  sT    =HM0EeY'' 	*''))E4;;r;   c                 B    ||S | j         j        j        }|| j        n|S r?   )r4   rd   result_persistent
persistent)rA   enabledr  s      r9   prepare_persistentzBackend.prepare_persistent  s*    NX]4
","4t*Dr;   c                     || j         v r*t          |t                    r|                     |          S |                     |          S r?   )r   r   r   r   r   )rA   r   r   s      r9   encode_resultzBackend.encode_result  sG    D)))j.K.K)))&111!!&)))r;   c                     || j         v S r?   )rm   rA   r   s     r9   	is_cachedzBackend.is_cached  s    $+%%r;   c           	         || j         v r0| j                                        }|r|                                }nd }||||                     |          |d}|rt          |dd           r
|j        |d<   |rt          |dd           r
|j        |d<   | j        j        	                    dd          r|r	t          |dd           t          |dd           t          |d	d           t          |d
d           t          |dd           t          |d          r!|j        r|j                            d          nd d}	t          |dd           r$|j        |	d<   |	                    |j                   |r8dd	h}
|
D ]1}|	|         }|                     |          }t#          |          |	|<   2|                    |	           |S )N)r   r   r   children	date_doner   r   r   extendedr   r   r7   r8   hostnameretriesr   routing_key)r   r7   r8   workerr  queuestampsstamped_headers)READY_STATESr4   now	isoformatcurrent_task_childrenr   r   r   rd   find_value_for_keyr   r   rs   r  rJ   r  r   r   )rA   r   r   r   rP   format_dater   r  r   request_metaencode_needed_fieldsfieldr
  encoded_values                 r9   _get_result_metazBackend._get_result_meta  s    D%%%I 2%//11	I "227;;"
 
  	-ww66 	-&}D 	2wwT:: 	2 ' 1D8=++JAA 	* *#GVT::#GVT::%gx>>%gz4@@&w	4@@w884)4W266}EEE/3	  	  7Hd33 86=6ML!23 ''777 J,2H+=(!5 J J ,U 3(,E(:(:.:=.I.IU++L)))r;   c                 .    t          j        |           d S r?   )timesleep)rA   amounts     r9   _sleepzBackend._sleep  s    
6r;   c                    |                      ||          }d}	 	  | j        ||||fd|i| |S # t          $ r}| j        rz|                     |          re|| j        k     r:|dz  }t          | j        || j        d          dz  }	| 	                    |	           n!t          t          d||                     n Y d}~nd}~ww xY w)	zUpdate task state and result.

        if always_retry_backend_operation is activated, in the event of a recoverable exception,
        then retry operation with an exponential backoff until a limit has been reached.
        r   TrP   rU     z%failed to store result on the backend)r   r   N)r  _store_resultr   rt   exception_safe_to_retryrV   r+   rv   ru   r/  r*   r   )
rA   r   r   r   r   rP   r8   r  r   sleep_amounts
             r9   r   zBackend.store_result  s6    ##FE22	""7FE9 > >+2>6<> > >   $ )E)Ec)J)J !1111 (H > =t(E (EGK(L L1111*-.U_fnsttt    !	s   0 
CBCCc                 f    | j                             |d            |                     |           d S r?   )rm   pop_forgetr  s     r9   forgetzBackend.forget#  s0    &&&Wr;   c                      t          d          )Nz"backend does not implement forget.NotImplementedErrorr  s     r9   r7  zBackend._forget'  s    !"FGGGr;   c                 8    |                      |          d         S )zGet the state of a task.r   )get_task_metar  s     r9   	get_statezBackend.get_state*  s    !!'**844r;   c                 R    |                      |                              d          S )z$Get the traceback for a failed task.r   r=  rs   r  s     r9   get_tracebackzBackend.get_traceback0  s$    !!'**..{;;;r;   c                 R    |                      |                              d          S )zGet the result of a task.r   r@  r  s     r9   
get_resultzBackend.get_result4  s$    !!'**..x888r;   c                 \    	 |                      |          d         S # t          $ r Y dS w xY w)z(Get the list of subtasks sent by a task.r  N)r=  r   r  s     r9   get_childrenzBackend.get_children8  sB    	%%g..z:: 	 	 	DD	s    
++c                     | j         j        j        r-| j         j        j        st	          j        dt                     d S d S d S )NzResults are not stored in backend and should not be retrieved when task_always_eager is enabled, unless task_store_eager_result is enabled.)r4   rd   r   task_store_eager_resultwarningswarnRuntimeWarningrA   s    r9   _ensure_not_eagerzBackend._ensure_not_eager?  sZ    8=* 	48=3X 	M[    	 	 	 	r;   c                     dS )a  Check if an exception is safe to retry.

        Backends have to overload this method with correct predicates dealing with their exceptions.

        By default no exception is safe to retry, it's up to backend implementation
        to define which exceptions are safe.
        Fr@   )rA   r   s     r9   r3  zBackend.exception_safe_to_retryG  s	     ur;   c                 2   |                                   |r	 | j        |         S # t          $ r Y nw xY wd}	 	 |                     |          }n# t          $ r}| j        ry|                     |          rd|| j        k     r:|dz  }t          | j	        || j
        d          dz  }|                     |           n t          t          d|                     n Y d}~nd}~ww xY w|r-|                    d          t          j        k    r
|| j        |<   |S )	zGet task meta from backend.

        if always_retry_backend_operation is activated, in the event of a recoverable exception,
        then retry operation with an exponential backoff until a limit has been reached.
        r   TrU   r1  zfailed to get meta)r   Nr   )rL  rm   r   _get_task_meta_forr   rt   r3  rV   r+   rv   ru   r/  r*   r   rs   r   SUCCESS)rA   r   cacher  r   r   r4  s          r9   r=  zBackend.get_task_metaQ  sy    	    	{7++   	..w77   $ )E)Ec)J)J !1111 (H > =t(E (EGK(L L1111*/0DgVVV    !		,  	(TXXh''6>99#'DK s$   % 
22A 
C$BCC$c                 D    |                      |d          | j        |<   dS )z;Reload task result, even if it has been previously fetched.FrQ  N)r=  rm   r  s     r9   reload_task_resultzBackend.reload_task_resultx  s'    #11'1GGGr;   c                 D    |                      |d          | j        |<   dS )z<Reload group result, even if it has been previously fetched.FrS  N)get_group_metarm   rA   r   s     r9   reload_group_resultzBackend.reload_group_result|  s'     $ 3 3HE 3 J JHr;   c                     |                                   |r	 | j        |         S # t          $ r Y nw xY w|                     |          }|r|
|| j        |<   |S r?   )rL  rm   r   _restore_grouprA   r   rQ  r   s       r9   rV  zBackend.get_group_meta  s        	{8,,    ""8,, 	)T%$(DK!s   % 
22c                 H    |                      ||          }|r|d         S dS )zGet the result for a group.rS  r   N)rV  r[  s       r9   restore_groupzBackend.restore_group  s6    ""85"99 	">!	" 	"r;   c                 .    |                      ||          S )z&Store the result of an executed group.)_save_grouprA   r   r   s      r9   
save_groupzBackend.save_group  s    &111r;   c                 b    | j                             |d            |                     |          S r?   )rm   r6  _delete_grouprW  s     r9   delete_groupzBackend.delete_group  s,    $'''!!(+++r;   c                     dS )zBackend cleanup.Nr@   rK  s    r9   cleanupzBackend.cleanup        r;   c                     dS )z:Cleanup actions to do at the end of a task worker process.Nr@   rK  s    r9   process_cleanupzBackend.process_cleanup  rg  r;   c                     i S r?   r@   )rA   producerr   s      r9   on_task_callzBackend.on_task_call  s    	r;   c                      t          d          )Nz%Backend does not support add_to_chordr:  )rA   chord_idr   s      r9   add_to_chordzBackend.add_to_chord  s    !"IJJJr;   c                     d S r?   r@   )rA   rP   r   r   r8   s        r9   r   zBackend.on_chord_part_return  rE   r;   c                     d S r?   r@   )rA   r   
chord_sizes      r9   set_chord_sizezBackend.set_chord_size  rE   r;   c                    d |D             |d<   	 t          |dd           }n# t          $ r d }Y nw xY w|j                            dt          |dd                     }|5| j        j        j                            ||j                  d         j        }|j                            dt          |dd                    }| j        j	        d         
                    |j        |f||||           d S )	Nc                 6    g | ]}|                                 S r@   r   .0rs     r9   
<listcomp>z1Backend.fallback_chord_unlock.<locals>.<listcomp>  s     @@@QAJJLL@@@r;   r   r   r  priorityr   zcelery.chord_unlock)	countdownr  r{  )r   r   r   rs   r4   amqprouterrouter   tasksr   r   )rA   header_resultbodyr|  r8   	body_typer  r{  s           r9   fallback_chord_unlockzBackend.fallback_chord_unlock  s   @@-@@@x	fd33II 	 	 	III	   ')Wd*K*KLL= HM(..vtyAA'JOE<##J	:q0Q0QRR,-99t%v	 	: 	
 	
 	
 	
 	
s   # 22c                     d S r?   r@   rK  s    r9   ensure_chords_allowedzBackend.ensure_chords_allowed  rE   r;   c                 j    |                                    | j        j        | } | j        ||fi | d S r?   )r  r4   r   r  rA   header_result_argsr  r8   r  s        r9   apply_chordzBackend.apply_chord  sI    ""$$$,,.@A""=$AA&AAAAAr;   c                 ~    |pt          t                      dd           }|rd t          |dg           D             S d S )NrP   c                 6    g | ]}|                                 S r@   rv  rw  s     r9   rz  z1Backend.current_task_children.<locals>.<listcomp>  s     KKKQAJJLLKKKr;   r  )r   r   )rA   rP   s     r9   r#  zBackend.current_task_children  sT    IW%5%7%7DII 	LKK'':r*J*JKKKK	L 	Lr;   r@   c                 0    |si n|}t           | j        ||ffS r?   )r:   	__class__rA   r7   r8   s      r9   
__reduce__zBackend.__reduce__  s$    !-v 4>4"@AAr;   )NNNNNNFr?   )TFNN)T)rU   )r@   N)ErF   rG   rH   r   r   UNREADY_STATESr   r   subpolling_intervalsupports_native_joinsupports_autoexpirer  retry_policyr   r   r   rP  r   FAILUREr   r   REVOKEDr   RETRYr   r   r   r   r   r   r   r   r   r  r  rn   r  r  r  r*  r/  r   r8  r7  r>  
get_statusrA  rC  rE  rL  r3  r=  rT  rX  rV  r]  ra  rd  rf  ri  rl  ro  r   rs  r  r  r  r#  r  r@   r;   r9   rS   rS   Q   sW       &L*N.L
  !
   J 	 L CG6:   :9 9 9 9@ @ @
 "FN> > > > #'%)$n6B 6B 6B 6Bp, , ,\ /1 $4v~; ; ; ; 59"V\G G G GI I I I0   &2 2 2 2E E EN    7 7 7  
< < <) ) )   E E E E* * *
& & & AE %1 1 1 1f   .2       D  H H H5 5 5 J< < <9 9 9      % % % %NH H HK K K   " " " "2 2 2, , ,  I I I  K K K    
 
 
 
.  B B B
L L L L
B B B B B Br;   rS   c                   V    e Zd Z	 	 ddZ	 	 	 ddZ	 ddZddZd	 Zed
             Z	dS )SyncBackendMixinN      ?Tc              #   0  K   |                                   |j        }|sd S t                      }|D ]B}t          |t                    r|j        |j        fV  (|                    |j                   C|                     ||||||          E d {V  d S )N)timeoutintervalno_ack
on_messageon_interval)rL  resultssetr   r   r   addget_many)	rA   r   r  r  r  r  r  r  task_idss	            r9   iter_nativezSyncBackendMixin.iter_native  s         . 	F55 	( 	(F&),, (i/////VY''''==hv!{ ! 
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
r;   c	                     |                                   |t          d          |                     |j        ||||          }	|	r,|                    |	           |                    ||          S d S )Nz,Backend does not support on_message callback)r  r  r  r  )	propagater   )rL  r   wait_forr   _maybe_set_cachemaybe_throw)
rA   r   r  r  r  r  r  r   r  r   s
             r9   wait_for_pendingz!SyncBackendMixin.wait_for_pending  s     	   !&>@ @ @ }}Iw#	  
 
  	N##D)))%%	H%MMM	N 	Nr;   c                     |                                   d}	 |                     |          }|d         t          j        v r|S |r
 |             t	          j        |           ||z  }|r||k    rt          d          h)aL  Wait for task and return its result.

        If the task raises an exception, this exception
        will be re-raised by :func:`wait_for`.

        Raises:
            celery.exceptions.TimeoutError:
                If `timeout` is not :const:`None`, and the operation
                takes longer than `timeout` seconds.
        g        rU   r   zThe operation timed out.)rL  r=  r   r   r,  r-  r   )rA   r   r  r  r  r  time_elapsedr   s           r9   r  zSyncBackendMixin.wait_for  s     	   
	?%%g..DH~!444 Jx   H$L ?<722"#=>>>
	?r;   Fc                     |S r?   r@   )rA   r   r2   s      r9   add_pending_resultz#SyncBackendMixin.add_pending_result      r;   c                     |S r?   r@   r   s     r9   remove_pending_resultz&SyncBackendMixin.remove_pending_result  r  r;   c                     dS rM   r@   rK  s    r9   is_asynczSyncBackendMixin.is_async  s    ur;   )Nr  TNN)Nr  TNNNT)Nr  TNr  )
rF   rG   rH   r  r  r  r  r  propertyr  r@   r;   r9   r  r    s        EI15
 
 
 
( ?BCG26N N N N& GK? ? ? ?8        X  r;   r  c                       e Zd ZdZdS )r,   z"Base (synchronous) result backend.NrF   rG   rH   __doc__r@   r;   r9   r,   r,   $  s        ,,,,r;   r,   c                   
    e Zd ZeZdZdZdZdZ fdZ	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Zd#dZd#dZd#dZd#dZd Zej        fdZej        fdZddddddej        fdZd Z	 d$dZd Zd Z d Z!d  Z"d! Z#d" Z$ xZ%S )%BaseKeyValueStoreBackendzcelery-task-meta-zcelery-taskset-meta-zchord-unlock-Fc                     t          | j        d          r| j        j        | _         t                      j        |i | |                                  |                                  | j        r| j        | _	        d S d S )N__func__)
r   key_tr  superr   _add_global_keyprefix_encode_prefixesimplements_incr_apply_chord_incrr  )rA   r7   r8   r  s      r9   r   z!BaseKeyValueStoreBackend.__init__2  s    4:z** 	-,DJ$)&)))""$$$ 	6#5D	6 	6r;   c                     | j         j                            di                               dd          }|rA|d         dvr|dz  }| | j         | _        | | j         | _        | | j         | _        dS dS )a/  
        This method prepends the global keyprefix to the existing keyprefixes.

        This method checks if a global keyprefix is configured in `result_backend_transport_options` using the
        `global_keyprefix` key. If so, then it is prepended to the task, group and chord key prefixes.
         result_backend_transport_optionsglobal_keyprefixNr[   z:_-.r   )r4   rd   rs   task_keyprefixgroup_keyprefixchord_keyprefix)rA   r  s     r9   r  z.BaseKeyValueStoreBackend._add_global_keyprefix;  s      8=,,-OQSTTXXYkmqrr 	O#611 C' %5"Lt7J"L"LD&6#N8L#N#ND &6#N8L#N#ND   	O 	Or;   c                     |                      | j                  | _        |                      | j                  | _        |                      | j                  | _        d S r?   )r  r  r  r  rK  s    r9   r  z)BaseKeyValueStoreBackend._encode_prefixesJ  sM    "jj)<==#zz$*>??#zz$*>??r;   c                      t          d          )NzMust implement the get method.r:  rA   keys     r9   rs   zBaseKeyValueStoreBackend.getO      !"BCCCr;   c                      t          d          )NzDoes not support get_manyr:  )rA   keyss     r9   mgetzBaseKeyValueStoreBackend.mgetR  s    !"=>>>r;   c                 .    |                      ||          S r?   )r  )rA   r  r
  r   s       r9   _set_with_statez(BaseKeyValueStoreBackend._set_with_stateU  s    xxU###r;   c                      t          d          )NzMust implement the set method.r:  rA   r  r
  s      r9   r  zBaseKeyValueStoreBackend.setX  r  r;   c                      t          d          )Nz Must implement the delete methodr:  r  s     r9   deletezBaseKeyValueStoreBackend.delete[  s    !"DEEEr;   c                      t          d          )NzDoes not implement incrr:  r  s     r9   incrzBaseKeyValueStoreBackend.incr^  s    !";<<<r;   c                     d S r?   r@   r  s      r9   expirezBaseKeyValueStoreBackend.expirea  rE   r;   r   c                 d    |st          d| d          |                     | j        ||          S )z#Get the cache key for a task by id.ztask_id must not be empty. Got 	 instead.)r   _get_key_forr  )rA   r   r  s      r9   get_key_for_taskz)BaseKeyValueStoreBackend.get_key_for_taskd  s@     	SQwQQQRRR  !4gsCCCr;   c                 d    |st          d| d          |                     | j        ||          S )z$Get the cache key for a group by id. group_id must not be empty. Got r  )r   r  r  rA   r   r  s      r9   get_key_for_groupz*BaseKeyValueStoreBackend.get_key_for_groupj  @     	USSSSTTT  !5xEEEr;   c                 d    |st          d| d          |                     | j        ||          S )z?Get the cache key for the chord waiting on group with given id.r  r  )r   r  r  r  s      r9   get_key_for_chordz*BaseKeyValueStoreBackend.get_key_for_chordp  r  r;   c                 v    | j         } |d                              | ||           ||          g          S )Nr   )r  join)rA   prefixr   r  r  s        r9   r  z%BaseKeyValueStoreBackend._get_key_forv  sC    
uRyy~~EE"IIuuSzz
   	r;   c                     |                      |          }| j        | j        fD ]=}|                    |          r&t	          |t          |          d                   c S >t	          |          S )zTake bytes: emit string.N)r  r  r  
startswithr   len)rA   r  r  s      r9   _strip_prefixz&BaseKeyValueStoreBackend._strip_prefix}  su    jjoo)4+?? 	7 	7F~~f%% 7#CF$5666667C   r;   c              #   h   K   |D ],\  }}|%|                      |          }|d         |v r||fV  -d S )Nr   )r  )rA   valuesr   kr
  s        r9   _filter_readyz&BaseKeyValueStoreBackend._filter_ready  sY       	# 	#HAu **511?l22U(NNN		# 	#r;   c                      t          |d          r4 fd                     |                                |          D             S fd                     t          |          |          D             S )Nitemsc                 B    i | ]\  }}                     |          |S r@   )r  )rx  r  vrA   s      r9   
<dictcomp>z=BaseKeyValueStoreBackend._mget_to_results.<locals>.<dictcomp>  s=       Aq ""1%%q  r;   c                 B    i | ]\  }}t          |                   |S r@   r   )rx  ir  r  s      r9   r  z=BaseKeyValueStoreBackend._mget_to_results.<locals>.<dictcomp>  s;       Aq T!W%%q  r;   )r   r  r  	enumerate)rA   r  r  r   s   ` ` r9   _mget_to_resultsz)BaseKeyValueStoreBackend._mget_to_results  s    67## 	    ..v||~~|LL       ..y/@/@,OO   r;   Nr  Tc	              #   l   K   |dn|}t          |t                    r|nt          |          }	t                      }
 j        }|	D ]M}	 ||         }|d         |v r(t          |          |fV  |
                    |           ># t
          $ r Y Jw xY w|	                    |
           d}|	rt          |	          }                      	                     fd|D                       ||          }|
                    |           |	                    d |D                        |                                D ]%\  }}| ||           t          |          |fV  &|r||z  |k    rt          d| d          |r
 |             t          j        |           |dz  }|r||k    rd S |	d S d S )	Nr  r   r   c                 :    g | ]}                     |          S r@   )r  )rx  r  rA   s     r9   rz  z5BaseKeyValueStoreBackend.get_many.<locals>.<listcomp>  s=     1@ 1@ 1@56 261F1Fq1I1I 1@ 1@ 1@r;   c                 ,    h | ]}t          |          S r@   r  )rx  r  s     r9   	<setcomp>z4BaseKeyValueStoreBackend.get_many.<locals>.<setcomp>  s    ">">">q<??">">">r;   zOperation timed out (r   rU   )r   r  rm   r   r  r   difference_updater   r  r  rJ   r  r   r,  r-  )rA   r  r  r  r  r  r  max_iterationsr   ids
cached_idsrQ  r   cached
iterationsr  ry  r  r
  s   `                  r9   r  z!BaseKeyValueStoreBackend.get_many  s]      #*33$Xs33FhhXUU
 	, 	,G,w (#|33&w//7777NN7+++     	j)))
 	99D%%dii 1@ 1@ 1@ 1@:>1@ 1@ 1@ 'A 'ABFV VALLOOO!!">">A">">">???ggii / /
U)Ju%%%"3''..... G:0G;;"#E7#E#E#EFFF Jx   !OJ *">">#  	 	 	 	 	s   
B
BBc                 V    |                      |                     |                     d S r?   )r  r  r  s     r9   r7  z BaseKeyValueStoreBackend._forget  s(    D))'2233333r;   c                    |                      ||||          }t          |          |d<   |                     |          }|d         t          j        k    r|S 	 |                     |                     |          |                     |          |           n2# t          $ r%}	t          t          |	          ||          |	d }	~	ww xY w|S )N)r   r   r   rP   r   r   )r   r   )
r*  r   rO  r   rP  r  r  r   r   r  )
rA   r   r   r   r   rP   r8   r   current_metaexs
             r9   r2  z&BaseKeyValueStoreBackend._store_result  s    $$F%/8' % K K&w//Y ..w77!V^33M	S  !6!6w!?!?TARARTYZZZZ  	S 	S 	S#CGG5'JJJPRR	S s   =B 
C" CCc                     |                      |                     |          |                     d|                                i          t          j                   |S )Nr   )r  r  r   r   r   rP  r`  s      r9   r_  z$BaseKeyValueStoreBackend._save_group  sT    T33H==![[(FOO4E4E)FGG	Y 	Y 	Yr;   c                 V    |                      |                     |                     d S r?   )r  r  rW  s     r9   rc  z&BaseKeyValueStoreBackend._delete_group  s(    D**84455555r;   c                     |                      |                     |                    }|st          j        ddS |                     |          S )$Get task meta-data for a task by id.N)r   r   )rs   r  r   PENDINGr  r   s      r9   rO  z+BaseKeyValueStoreBackend._get_task_meta_for  sM    xx--g6677 	>$n===!!$'''r;   c                     |                      |                     |                    }|r7|                     |          }|d         }t          || j                  |d<   |S dS )r  r   N)rs   r  r  r!   r4   )rA   r   r   r   s       r9   rZ  z'BaseKeyValueStoreBackend._restore_group  si    xx..x8899  	;;t$$D(^F.vtx@@DNK		 	r;   c                 x    |                                    | j        j        | }|                    |            d S )Nr   )r  r4   r   saver  s        r9   r  z*BaseKeyValueStoreBackend._apply_chord_incr  sC    ""$$$,,.@A4(((((r;   c           	      D   | j         sd S | j        }|j        }|sd S |                     |          }	 t	          j        ||           }no# t          $ rb}	t          |j        |          }
t          
                    d||	           |                     |
t          d|	                    cY d }	~	S d }	~	ww xY w|	 t          |          # t          $ rc}	t          |j        |          }
t          
                    d||	           |                     |
t          d| d                    cY d }	~	S d }	~	ww xY w|                     |          }|j                            d          }|t!          |          }||k    rt                              d	|           d S ||k    rt          |j        |          }
|j        r|j        n|j        }	 t+                      5   ||j        j        d
          }d d d            n# 1 swxY w Y   	 |
                    |           n# t          $ rL}	t          
                    d||	           |                     |
t          d|	                     Y d }	~	nd }	~	ww xY w# t          $ r}		 t3          |                                          }d                    ||	          }n# t8          $ r t;          |	          }Y nw xY wt          
                    d||           |                     |
t          |                     Y d }	~	nd }	~	ww xY w|                                 |                     |           d S # |                                 |                     |           w xY w|                     || j                    d S )Nr  r   zChord %r raised: %rzCannot restore group: zChord callback %r raised: %rzGroupResult z no longer existsrr  z/Chord counter incremented too many times for %rT)r  r  zCallback error: zDependency {0.id} raised {1!r})!r  r4   r   r  r   restorer   r   r   logger	exceptionr   r   r   r  rs   r  warningr  join_nativer  r    rd   result_chord_join_timeoutdelaynext_failed_join_reportformatStopIterationreprr  r  ro   )rA   rP   r   r   r8   r4   gidr  depsr   r   valsizejretculpritr   s                    r9   r   z-BaseKeyValueStoreBackend.on_chord_part_return  s   # 	Fhm 	F$$S))	&sD999DD 	 	 	&w}#>>>H2C===..;C;;<<       	 < oo%   *7=cBBB  !?cJJJ22DcDDDEE        iinn }  ..<t99D::NNL         D[[&w}#>>>H$($=L  49A!&(( ( (! # B"&( ( (C( ( ( ( ( ( ( ( ( ( ( ( ( ( ( NN3''''    $$%:CEEE// "#=c#=#=>>         
J 
J 
J'"4#;#;#=#=>>G=DD FF % ' ' '!#YYFFF'   !6VDDD++Hj6H6HIIIIIIII
J* C      C    KKT\*****s   A	 	
B5AB0*B50B5;C
 

D7AD2,D72D7I> H6I> HI> 	H
I> H% #M %
I;/AI61M 6I;;M >
L)	7K L$KL$KAL$M $L))M +N)r   r  )&rF   rG   rH   r   r  r  r  r  r  r   r  r  rs   r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r  r7  r2  r_  rc  rO  rZ  r  r   __classcell__)r  s   @r9   r  r  +  s?       E(N,O%OO6 6 6 6 6O O O@ @ @
D D D? ? ?$ $ $D D DF F F= = =  D D D DF F F FF F F F   ! ! ! 281D # # # # ;A:M     *.D d4$1$ $ $ $L4 4 4 /3   0  
6 6 6( ( (
 
 
) ) )
D+ D+ D+ D+ D+ D+ D+r;   r  c                       e Zd ZdZdS )r-   z/Result backend base class for key/value stores.Nr  r@   r;   r9   r-   r-   B  s        9999r;   r-   c                   J    e Zd ZdZi Zd Zd Zd Zd ZexZ	xZ
xZZexZxZZdS )r.   zDummy result backend.c                     d S r?   r@   r  s      r9   r   zDisabledBackend.store_resultK  rE   r;   c                 N    t          t                                                    r?   )r;  E_CHORD_NO_BACKENDstriprK  s    r9   r  z%DisabledBackend.ensure_chords_allowedN  s    !"4":":"<"<===r;   c                 N    t          t                                                    r?   )r;  E_NO_BACKENDr1  r  s      r9   _is_disabledzDisabledBackend._is_disabledQ  s    !,"4"4"6"6777r;   c                     dS )Nzdisabled://r@   r  s      r9   r   zDisabledBackend.as_uriT  s    }r;   N)rF   rG   rH   r  rm   r   r  r4  r   r>  r  rC  rA  get_task_meta_forr  r  r@   r;   r9   r.   r.   F  s|        F  > > >8 8 8   ;GFIF
FZ-.:::888r;   r.   )Tr  r   r,  rH  collectionsr   datetimer   	functoolsr   weakrefr   billiard.einfor   kombu.serializationr   r	   r
   r   rg   kombu.utils.encodingr   r   kombu.utils.urlr   celery.exceptionsr   r   r   r   r   celery._stater   celery.app.taskr   r   r   r   r   r   r   r   r   celery.resultr   r   r   r    r!   celery.utils.collectionsr"   celery.utils.functionalr#   r$   celery.utils.logr%   celery.utils.serializationr&   r'   r(   r)   r*   celery.utils.timer+   __all__	frozensetr   rF   r  rz   r0   r3  r0  r:   r   r=   rQ   rS   r  r,   BaseDictBackendr  r-   r.   r@   r;   r9   <module>rK     sK    


   " " " " " "             ' ' ' ' ' ' ( ( ( ( ( ( D D D D D D D D D D ? ? ? ? ? ? ; ; ; ; ; ; ; ; . . . . . .     > > > > > > > > > > > > * * * * * * # # # # # #] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] b b b b b b b b b b b b b b . . . . . . ; ; ; ; ; ; ; ; ' ' ' ' ' 'S S S S S S S S S S S S S S > > > > > >
D!	8*-- 	H		 J2 5   
 G G G
/ / / / / / / /! ! !B
B B
B B
B B
B B
B B
B B
B B
BJK K K K K K K K\- - - - -'+ - - - T+ T+ T+ T+ T+w T+ T+ T+n: : : : :35E : : :; ; ; ; ;k ; ; ; ; ;r;   