
     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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)datetime	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      P/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/celery/backends/base.pyunpickle_backendr;   E   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      r:   ignorez_nulldict.ignoreK       r<   N)__name__
__module____qualname__rE   __setitem__update
setdefaultrA   r<   r:   r>   r>   J   s.           )/.K.&:::r<   r>   c                     | dS | j         S NF)ignore_resultrequests    r:   _is_request_ignore_resultrR   Q   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                 0   || _         | 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
                    | _        t3          i t5                                | _        t9          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) r5   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floatrW   r1   r   _pending_resultsr#   MESSAGE_BUFFER_MAX_pending_messagesurl)rB   r5   rf   max_cached_resultsrq   ro   expires_typer{   r9   rd   cmaxs              r:   __init__zBackend.__init__u   sd    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 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)rB   include_passwordr{   s      r:   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rB   task_idmetas      r:   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.rP   N)rR   r   chordon_chord_part_return)rB   r   resultrQ   r   states         r:   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.	tracebackrQ   r   group_idNr   )r   r   r   iterchainAttributeError	TypeErrortupler   rK   optionsrs   idr   r   PROPAGATE_STATESr   errbacks_call_task_errbacks)rB   r   excr   rQ   r   call_errbacksr   
chain_data
chain_elemchain_elem_ctxs              r:   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__rV   r5   is_eagerF)	parent_idroot_id)r   r5   	signature_apphasattrtype
isinstancer   r   r%   appendr   r   r   r   rd   task_always_eagerdelivery_infors   applyapply_async)	rB   rQ   r   r   old_signatureerrbackr   r   gs	            r:   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   )rB   r   reasonrQ   r   r   r   s          r:   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   )rB   r   r   r   rQ   r   r   s          r:   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   )r5   _taskstaskbackendKeyErrorr   r   rs   dictr   fail_from_current_stackr   	Exception)rB   callbackr   r5   r   fake_requesteb_excs          r:   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)rB   r   r   type_real_exctbexception_infos          r:   r   zBackend.fail_from_current_stack7  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.NrI   )exc_typeexc_message
exc_module)
rf   EXCEPTION_ABLE_CODECSr)   r   getattrrG   r(   r8   encoderH   )rB   r   rf   exctypes       r:   prepare_exceptionzBackend.prepare_exceptionJ  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   z4Exception information must includethe exception type.r   r   z!Expected an exception class, got z with payload ())r   BaseExceptionrf   r   r*   r   r   rs   r   
ValueErrorr'   rG   r   modulessplitr   r   celery
exceptionsr   
issubclassr   r   listr   )
rB   r   er   r   r7   nameexc_msgfake_exc_typeerrs
             r:   exception_to_pythonzBackend.exception_to_pythonT  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.r0   )rf   r   r   as_tuplerB   r   s     r:   prepare_valuezBackend.prepare_value  s3    ?h&&:fj+I+I&??$$$r<   c                 8    |                      |          \  }}}|S r@   )_encode)rB   data_payloads       r:   r   zBackend.encode  s    T**1gr<   c                 .    t          || j                  S )N)rf   )r	   rf   )rB   r   s     r:   r   zBackend._encode  s    Tdo6666r<   c                 `    |d         | j         v r|                     |d                   |d<   |S )Nstatusr   )EXCEPTION_STATESr   )rB   r   s     r:   meta_from_decodedzBackend.meta_from_decoded  s4    >T222!55d8nEEDNr<   c                 R    |                      |                     |                    S r@   )r   decoderB   r   s     r:   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     r:   r  zBackend.decode  sF    ?N)S\\W"&"3&*&; K) ) ) 	)r<   c                     || j         j        j        }t          |t                    r|                                }||r ||          S |S r@   )r5   rd   result_expiresr   r   total_seconds)rB   valuer   s      r:   rn   zBackend.prepare_expires  sT    =HM0EeY'' 	*''))E4;;r<   c                 B    ||S | j         j        j        }|| j        n|S r@   )r5   rd   result_persistent
persistent)rB   enabledr  s      r:   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   )rB   r   r   s      r:   encode_resultzBackend.encode_result  sG    D)))j.K.K)))&111!!&)))r<   c                     || j         v S r@   )rm   rB   r   s     r:   	is_cachedzBackend.is_cached  s    $+%%r<   c           	         || j         v r*t          j                    }|r|                                }nd }||||                     |          |d}|rt          |dd           r
|j        |d<   |rt          |dd           r
|j        |d<   | j        j	        
                    dd          r|rt          |dd           t          |dd           t          |d	d           t          |d
d           t          |dd           t          |d          r!|j        r|j                            d          nd d}	|r8dd	h}
|
D ]1}|	|         }|                     |          }t          |          |	|<   2|                    |	           |S )N)r   r   r   children	date_doner   r   r   extendedr   r   r8   r9   hostnameretriesr   routing_key)r   r8   r9   workerr  queue)READY_STATESr   utcnow	isoformatcurrent_task_childrenr   r   r   r5   rd   find_value_for_keyr   r   rs   r   r   rK   )rB   r   r   r   rQ   format_dater   r  r   request_metaencode_needed_fieldsfieldr	  encoded_values                 r:   _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	  	   J,2H+=(!5 J J ,U 3(,E(:(:.:=.I.IU++L)))r<   c                 .    t          j        |           d S r@   )timesleep)rB   amounts     r:   _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   TrQ   rV     z%failed to store result on the backend)r   r   N)r  _store_resultr   rt   exception_safe_to_retryrW   r,   rv   ru   r,  r+   r   )
rB   r   r   r   r   rQ   r9   r  r   sleep_amounts
             r:   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     r:   forgetzBackend.forget%  s0    &&&Wr<   c                      t          d          )Nz"backend does not implement forget.NotImplementedErrorr  s     r:   r4  zBackend._forget)  s    !"FGGGr<   c                 8    |                      |          d         S )zGet the state of a task.r   )get_task_metar  s     r:   	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     r:   get_tracebackzBackend.get_traceback2  s$    !!'**..{;;;r<   c                 R    |                      |                              d          S )zGet the result of a task.r   r=  r  s     r:   
get_resultzBackend.get_result6  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     r:   get_childrenzBackend.get_children:  sB    	%%g..z:: 	 	 	DD	s    
++c                 `    | j         j        j        rt          j        dt
                     d S d S )Nz9Shouldn't retrieve result with task_always_eager enabled.)r5   rd   r   warningswarnRuntimeWarningrB   s    r:   _ensure_not_eagerzBackend._ensure_not_eagerA  s?    8=* 	MK    	 	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.
        FrA   )rB   r   s     r:   r0  zBackend.exception_safe_to_retryH  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   TrV   r.  zfailed to get meta)r   Nr   )rH  rm   r   _get_task_meta_forr   rt   r0  rW   r,   rv   ru   r,  r+   r   rs   r   SUCCESS)rB   r   cacher  r   r   r1  s          r:   r:  zBackend.get_task_metaR  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rM  N)r:  rm   r  s     r:   reload_task_resultzBackend.reload_task_resulty  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.FrO  N)get_group_metarm   rB   r   s     r:   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@   )rH  rm   r   _restore_grouprB   r   rM  r   s       r:   rR  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.rO  r   N)rR  rW  s       r:   restore_groupzBackend.restore_group  s6    ""85"99 	">!	" 	"r<   c                 .    |                      ||          S )z&Store the result of an executed group.)_save_grouprB   r   r   s      r:   
save_groupzBackend.save_group  s    &111r<   c                 b    | j                             |d            |                     |          S r@   )rm   r3  _delete_grouprS  s     r:   delete_groupzBackend.delete_group  s,    $'''!!(+++r<   c                     dS )zBackend cleanup.NrA   rG  s    r:   cleanupzBackend.cleanup        r<   c                     dS )z:Cleanup actions to do at the end of a task worker process.NrA   rG  s    r:   process_cleanupzBackend.process_cleanup  rc  r<   c                     i S r@   rA   )rB   producerr   s      r:   on_task_callzBackend.on_task_call  s    	r<   c                      t          d          )Nz%Backend does not support add_to_chordr7  )rB   chord_idr   s      r:   add_to_chordzBackend.add_to_chord  s    !"IJJJr<   c                     d S r@   rA   )rB   rQ   r   r   r9   s        r:   r   zBackend.on_chord_part_return  rF   r<   c                     d S r@   rA   )rB   r   
chord_sizes      r:   set_chord_sizezBackend.set_chord_size  rF   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 rA   r   .0rs     r:   
<listcomp>z1Backend.fallback_chord_unlock.<locals>.<listcomp>  s     @@@QAJJLL@@@r<   r   r   r  priorityr   zcelery.chord_unlock)	countdownr  rw  )r   r   r   rs   r5   amqprouterrouter   tasksr   r   )rB   header_resultbodyrx  r9   	body_typer  rw  s           r:   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@   rA   rG  s    r:   ensure_chords_allowedzBackend.ensure_chords_allowed  rF   r<   c                 j    |                                    | j        j        | } | j        ||fi | d S r@   )r  r5   r   r  rB   header_result_argsr~  r9   r}  s        r:   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 )NrQ   c                 6    g | ]}|                                 S rA   rr  rs  s     r:   rv  z1Backend.current_task_children.<locals>.<listcomp>  s     KKKQAJJLLKKKr<   r  )r   r   )rB   rQ   s     r:   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<   rA   c                 0    |si n|}t           | j        ||ffS r@   )r;   	__class__rB   r8   r9   s      r:   
__reduce__zBackend.__reduce__  s$    !-v 4>4"@AAr<   )NNNNNNFr@   )TFNN)T)rV   )rA   N)ErG   rH   rI   r   r  UNREADY_STATESr   r   subpolling_intervalsupports_native_joinsupports_autoexpirer  retry_policyr   r   r   rL  r   FAILUREr   r   REVOKEDr   RETRYr   r   r   r   r   r   r   r   r   r  r  rn   r  r  r  r'  r,  r   r5  r4  r;  
get_statusr>  r@  rB  rH  r0  r:  rP  rT  rR  rY  r]  r`  rb  re  rh  rk  r   ro  r  r  r  r   r  rA   r<   r:   rT   rT   W   sW       &L*N.L
  !
   J 	 L CG6:   8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 %. . . .`   .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<   rT   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)rH  resultssetr   r    r   addget_many)	rB   r   r  r  r  r  r  r  task_idss	            r:   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   )rH  r   wait_forr   _maybe_set_cachemaybe_throw)
rB   r   r  r  r  r  r  r   r  r   s
             r:   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        rV   r   zThe operation timed out.)rH  r:  r   r  r)  r*  r   )rB   r   r  r  r  r  time_elapsedr   s           r:   r  zSyncBackendMixin.wait_for  s     	   
	?%%g..DH~!444 Jx   H$L ?<722"#=>>>
	?r<   Fc                     |S r@   rA   )rB   r   r3   s      r:   add_pending_resultz#SyncBackendMixin.add_pending_result      r<   c                     |S r@   rA   r   s     r:   remove_pending_resultz&SyncBackendMixin.remove_pending_result  r  r<   c                     dS rN   rA   rG  s    r:   is_asynczSyncBackendMixin.is_async   s    ur<   )Nr  TNN)Nr  TNNNT)Nr  TNr  )
rG   rH   rI   r  r  r  r  r  propertyr  rA   r<   r:   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rG   rH   rI   __doc__rA   r<   r:   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!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  _encode_prefixessuperr   implements_incr_apply_chord_incrr  )rB   r8   r9   r  s      r:   r   z!BaseKeyValueStoreBackend.__init__3  sw    4:z** 	-,DJ$)&))) 	6#5D	6 	6r<   c                     |                      | j                  | _        |                      | j                  | _        |                      | j                  | _        d S r@   )r  task_keyprefixgroup_keyprefixchord_keyprefixrG  s    r:   r  z)BaseKeyValueStoreBackend._encode_prefixes;  sM    "jj)<==#zz$*>??#zz$*>??r<   c                      t          d          )NzMust implement the get method.r7  rB   keys     r:   rs   zBaseKeyValueStoreBackend.get@      !"BCCCr<   c                      t          d          )NzDoes not support get_manyr7  )rB   keyss     r:   mgetzBaseKeyValueStoreBackend.mgetC  s    !"=>>>r<   c                 .    |                      ||          S r@   )r  )rB   r  r	  r   s       r:   _set_with_statez(BaseKeyValueStoreBackend._set_with_stateF  s    xxU###r<   c                      t          d          )NzMust implement the set method.r7  rB   r  r	  s      r:   r  zBaseKeyValueStoreBackend.setI  r  r<   c                      t          d          )Nz Must implement the delete methodr7  r  s     r:   deletezBaseKeyValueStoreBackend.deleteL  s    !"DEEEr<   c                      t          d          )NzDoes not implement incrr7  r  s     r:   incrzBaseKeyValueStoreBackend.incrO  s    !";<<<r<   c                     d S r@   rA   r  s      r:   expirezBaseKeyValueStoreBackend.expireR  rF   r<   r   c                     | j         } |d                              | j         ||           ||          g          S )z#Get the cache key for a task by id.r   )r  joinr  )rB   r   r  r  s       r:   get_key_for_taskz)BaseKeyValueStoreBackend.get_key_for_taskU  sF    
uRyy~~ws
   	r<   c                     | j         } |d                              | j         ||           ||          g          S )z$Get the cache key for a group by id.r   )r  r  r  rB   r   r  r  s       r:   get_key_for_groupz*BaseKeyValueStoreBackend.get_key_for_group\  F    
uRyy~~ %%//55::
   	r<   c                     | j         } |d                              | j         ||           ||          g          S )z?Get the cache key for the chord waiting on group with given id.r   )r  r  r  r  s       r:   get_key_for_chordz*BaseKeyValueStoreBackend.get_key_for_chordc  r  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)rB   r  prefixs      r:   _strip_prefixz&BaseKeyValueStoreBackend._strip_prefixj  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  )rB   valuesr  kr	  s        r:   _filter_readyz&BaseKeyValueStoreBackend._filter_readyr  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 rA   )r  )rt  r  vrB   s      r:   
<dictcomp>z=BaseKeyValueStoreBackend._mget_to_results.<locals>.<dictcomp>|  s=       Aq ""1%%q  r<   c                 B    i | ]\  }}t          |                   |S rA   r   )rt  ir  r  s      r:   r  z=BaseKeyValueStoreBackend._mget_to_results.<locals>.<dictcomp>  s;       Aq T!W%%q  r<   )r   r  r  	enumerate)rB   r  r  r  s   ` ` r:   _mget_to_resultsz)BaseKeyValueStoreBackend._mget_to_resultsy  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 rA   )r  )rt  r  rB   s     r:   rv  z5BaseKeyValueStoreBackend.get_many.<locals>.<listcomp>  s=     1@ 1@ 1@56 261F1Fq1I1I 1@ 1@ 1@r<   c                 ,    h | ]}t          |          S rA   r  )rt  r  s     r:   	<setcomp>z4BaseKeyValueStoreBackend.get_many.<locals>.<setcomp>  s    ">">">q<??">">">r<   zOperation timed out (r   rV   )r   r  rm   r   r  r   difference_updater   r  r  rK   r  r   r)  r*  )rB   r  r  r  r  r  r  max_iterationsr  ids
cached_idsrM  r   cached
iterationsr  ru  r  r	  s   `                  r:   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     r:   r4  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   rQ   r   r   )r   r   )
r'  r   rK  r   rL  r  r  r   r   r  )
rB   r   r   r   r   rQ   r9   r   current_metaexs
             r:   r/  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   rL  r\  s      r:   r[  z$BaseKeyValueStoreBackend._save_group  sT    T33H==![[(FOO4E4E)FGG	Y 	Y 	Yr<   c                 V    |                      |                     |                     d S r@   )r  r  rS  s     r:   r_  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      r:   rK  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"   r5   )rB   r   r   r   s       r:   rV  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  r5   r   saver  s        r:   r  z*BaseKeyValueStoreBackend._apply_chord_incr  sC    ""$$$,,.@A4(((((r<   c           	      X   | 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|                                 | j                            |           d S # |                                 | j                            |           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 existsrn  z/Chord counter incremented too many times for %rT)r  r  zCallback error: zDependency {0.id} raised {1!r})"r  r5   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  clientr  ro   )rB   rQ   r   r   r9   r5   gidr  depsr   r   valsizejretculpritr   s                    r:   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* ""3''''' ""3''''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 0N)r   r  )$rG   rH   rI   r   r  r  r  r  r  r   r  rs   r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r4  r/  r[  r_  rK  rV  r  r   __classcell__)r  s   @r:   r  r  ,  s       E(N,O%OO6 6 6 6 6@ @ @
D D D? ? ?$ $ $D D D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  rA   r<   r:   r.   r.   /  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@   rA   r  s      r:   r   zDisabledBackend.store_result8  rF   r<   c                 N    t          t                                                    r@   )r8  E_CHORD_NO_BACKENDstriprG  s    r:   r  z%DisabledBackend.ensure_chords_allowed;  s    !"4":":"<"<===r<   c                 N    t          t                                                    r@   )r8  E_NO_BACKENDr&  r  s      r:   _is_disabledzDisabledBackend._is_disabled>  s    !,"4"4"6"6777r<   c                     dS )Nzdisabled://rA   r  s      r:   r   zDisabledBackend.as_uriA  s    }r<   N)rG   rH   rI   r  rm   r   r  r)  r   r;  r  r@  r>  get_task_meta_forr  r  rA   r<   r:   r/   r/   3  s|        F  > > >8 8 8   ;GFIF
FZ-.:::888r<   r/   )Tr  r   r)  rD  collectionsr   r   r   	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   rG   r  ry   r1   r(  r%  r;   r   r>   rR   rT   r  r-   BaseDictBackendr  r.   r/   rA   r<   r:   <module>r?     s[    


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