
    `fC                         d 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 	 dd	lZdd
lmZ n# e$ r d	xZZY nw xY wdZ edd          Z ee          Z G d de          Zd	S )z"AWS DynamoDB result store backend.    )
namedtuple)sleeptime)
_parse_url)ImproperlyConfigured)
get_logger   )KeyValueStoreBackendN)ClientError)DynamoDBBackendDynamoDBAttributename	data_typec                   &    e Zd ZdZdZdZdZdZdZdZ	dZ
 edd          Z ed	d
          Z edd          Z edd          ZdZd! fd	Zd!dZd Zd Zd Zd Zd Zd Zd Zd"dZd Zd Zd Zed             Zd Z d Z!d Z"d  Z# xZ$S )#r   zAWS DynamoDB result backend.

    Raises:
        celery.exceptions.ImproperlyConfigured:
            if module :pypi:`boto3` is not available.
    celeryr	   NTidSr   resultB	timestampNttlc                     t                      j        |i | || _        |p| j        | _        t          st          d          d}d }d }|t          |          \  }}	}
}}}}|}|}|d u}|d u}||k    rt          d          |}|	dk    rDd|
 | _        d| _        t          
                    d                    | j                             n|	| _        | j        j        j        } |d          }|r|| _        t          |                    d	| j                            | _        t          |                    d
| j                            | _        |                    d| j                  }|rJ	 t          |          | _        n4# t&          $ r'}t                              d| d|           |d }~ww xY w|p| j        | _        | j        | j        | j        f| _        d | _        |r|                     ||           d S d S )NzBYou need to install the boto3 library to use the DynamoDB backend.Fz6You need to specify both the Access Key ID and Secret.	localhostzhttp://localhost:z	us-east-1z*Using local-only DynamoDB endpoint URL: {}dynamodb_endpoint_urlreadwritettl_secondszTTL must be a number; got "")exc_info)access_key_idsecret_access_key)super__init__url
table_nameboto3r   	parse_urlendpoint_url
aws_regionloggerwarningformatappconfgetintread_capacity_unitswrite_capacity_unitstime_to_live_seconds
ValueErrorerror
_key_field_value_field_timestamp_field_available_fields_client_get_client)selfr&   r'   argskwargsaws_credentials_givenaws_access_key_idaws_secret_access_keyschemeregionportusernamepasswordtablequeryaccess_key_givensecret_key_given_getconfig_endpoint_urlr   e	__class__s                        J/var/www/html/env/lib/python3.11/site-packages/celery/backends/dynamodb.pyr%   zDynamoDBBackend.__init__>   s   $)&)))$7 	%&$% % % !&  $?# CFFD(HeU !)$,!0<4D@#333*"# # # %5!$$$>$>$>!"-@GG)     #) 8=$D"&$'>"?"?" 8$7!'*		, ( (D$ ),		- ) )D% ))M4+DEEC 03CD--!   LL<c<<<!" !    G $6tDO O!"
   	/"7      	 	s   7F 
F="F88F=c                 T   | j         d| j        i}||                    ||d           | j        
| j        |d<   t	          j        	 di || _         |                                  |                                 (|                                  | 	                                 | j         S )zGet client connection.Nregion_name)rB   rC   r*   dynamodb)rT   )
r<   r+   updater*   r(   client_get_or_create_table_has_ttl_validate_ttl_methods_set_table_ttl)r>   r"   r#   client_parameterss       rQ   r=   zDynamoDBBackend._get_client   s    <t! (!(()6->* *   
  ,484E!.1 < # DL %%'''}}***,,,##%%%|    c                     | j         j        | j         j        dg| j        | j         j        ddg| j        | j        ddS )z=Get the boto3 structure describing the DynamoDB table schema.)AttributeNameAttributeTypeHASH)r^   KeyType)ReadCapacityUnitsWriteCapacityUnits)AttributeDefinitions	TableName	KeySchemaProvisionedThroughput)r8   r   r   r'   r3   r4   r>   s    rQ   _get_table_schemaz!DynamoDBBackend._get_table_schema   sm    
 &*_%9%)_%> %  &*_%9%  &*%=&*&?& &
 
 	
r\   c                    |                                  }	 | j                            | j                  S # t          $ r}|j        d                             dd          }|dk    r | j        j        d
i |}t          	                    d
                    | j                             |                     d           t          	                    d
                    | j                             |cY d	}~S |d	}~ww xY w)z=Create table if not exists, otherwise return the description.re   ErrorCodeUnknownResourceNotFoundExceptionz*DynamoDB Table {} did not exist, creating.ACTIVEz#DynamoDB Table {} is now available.N )ri   r<   describe_tabler'   r   responser1   create_tabler,   infor.   _wait_for_table_status)r>   table_schemarO   
error_codetable_descriptions        rQ   rW   z$DynamoDBBackend._get_or_create_table   s#   --//	<...III 	 	 	G,00CCJ888$=DL$=$M$M$M$M!@GG    ++H5559@@   
 )(((((('	s"   6 
D  B3C;3D 9C;;D c                 *    | j         dn
| j         dk    S )zReturn the desired Time to Live config.

        - True:  Enable TTL on the table; use expiry.
        - False: Disable TTL on the table; don't use expiry.
        - None:  Ignore TTL on the table; don't use expiry.
        Nr   )r5   rh   s    rQ   rX   zDynamoDBBackend._has_ttl   s!     08tt*a/	0r\   c                 x   d}g }t          |          D ],}t          | j        |          s|                    |           -|rwt                              d                    d                    |                               t          d                    d                    |                              dS )z:Verify boto support for the DynamoDB Time to Live methods.)update_time_to_livedescribe_time_to_livezdboto3 method(s) {methods} not found; ensure that boto3>=1.9.178 and botocore>=1.12.178 are installed,)methodsz#boto3 method(s) {methods} not foundN)	listhasattrr<   appendr,   r7   r.   joinAttributeError)r>   required_methodsmissing_methodsmethods       rQ   rY   z%DynamoDBBackend._validate_ttl_methods   s    
 +,, 	/ 	/F4<00 /&&v... 	LLJ&HH_55   	   !5<<HH_55 =    	 	r\   c                 @    | j         |                                 |ddS )zBGet the boto3 structure describing the DynamoDB TTL specification.)Enabledr^   )re   TimeToLiveSpecification)r'   rX   )r>   ttl_attr_names     rQ   _get_ttl_specificationz&DynamoDBBackend._get_ttl_specification	  s0     ==??!.( (
 
 	
r\   c                 `   	 | j                             | j                  }n# t          $ r~}|j        d                             dd          }|j        d                             dd          }t                              d                    | j        ||                     |d }~ww xY w|S )Nrk   rl   rm   rn   MessagezJError describing Time to Live on DynamoDB table {table}: {code}: {message})rI   codemessage)	r<   r}   r'   r   rs   r1   r,   r7   r.   )r>   descriptionrO   rx   error_messages        rQ   _get_table_ttl_descriptionz*DynamoDBBackend._get_table_ttl_description  s    	,<</ =  KK  	 	 	G,00CCJJw/33IyIIMLL$fo%      G	 s    # 
B+A9B&&B+c           	         |                                  }|d         d         }|dv rq|d         d         }|                                 rN|| j        j        k    r>t                              d                    |dk    rdnd| j        	                     |S n|d
v rS|                                 s>t                              d                    |dk    rdnd| j        	                     |S n4t                              d                    || j                             |dk    r|n| j        j        }	  | j	        j
        di |                     |          }t                              d                    | j        |                                 | j        j                             |S # t          $ r}|j        d                             dd          }|j        d                             dd          }t                              d                    |                                 rdnd| j        ||                     |d}~ww xY w)z,Enable or disable Time to Live on the table.TimeToLiveDescriptionTimeToLiveStatus)ENABLEDENABLINGr^   z5DynamoDB Time to Live is {situation} on table {table}r   zalready enabledzcurrently being enabled)	situationrI   )DISABLED	DISABLINGr   zalready disabledzcurrently being disabledzWUnknown DynamoDB Time to Live status {status} on table {table}. Attempting to continue.)statusrI   )r   zUDynamoDB table Time to Live updated: table={table} enabled={enabled} attribute={attr})rI   enabledattrrl   rm   rn   r   zHError {action} Time to Live on DynamoDB table {table}: {code}: {message}enabling	disabling)actionrI   r   r   Nrq   )r   rX   
_ttl_fieldr   r,   debugr.   r'   r-   r<   r|   r   ru   r   rs   r1   r7   )	r>   r   r   cur_attr_name	attr_namespecificationrO   rx   r   s	            rQ   rZ   zDynamoDBBackend._set_table_ttl(  s    5577456HI,,,34_E }} ' DO$888 LL+f!Y.. #4"36"o	      '&000==?? # '&++ 103/	      #"#$ NN<fo     L $y00MMdo6J 		<DL<  --"+ .   M
 KKG&/ MMOO-   		 	 	 !  	 	 	G,00CCJJw/33IyIIMLL$f%)]]__Ezz+o%	      G	s   8A8F1 1
I;BIIrp   c                    d}|sz| j                             | j                  }t                              d                    | j        |                     |d         d         }||k    }t          d           |xdS dS )z#Poll for the expected table status.Frk   z+Waiting for DynamoDB table {} to become {}.TableTableStatusr	   N)rV   rr   r'   r,   r   r.   r   )r>   expectedachieved_statery   current_statuss        rQ   rv   z&DynamoDBBackend._wait_for_table_status  s      	 $ : :/ !; ! ! LL=DDO    /w7FN+x7N!HHH ! 	 	 	 	 	r\   c                 F    | j         | j        j        | j        j        |iidS )z0Construct the item retrieval request parameters.)re   Key)r'   r8   r   r   )r>   keys     rQ   _prepare_get_requestz$DynamoDBBackend._prepare_get_request  s4     $O-s'
 
 	
r\   c           
         t                      }| j        | j        j        | j        j        |i| j        j        | j        j        |i| j        j        | j        j        t          |          iid}|                                 rU|d         	                    | j
        j        | j
        j        t          t          || j        z                       ii           |S )z/Construct the item creation request parameters.)re   Itemr   )r   r'   r8   r   r   r9   r:   strrX   rU   r   r2   r5   )r>   r   valuer   put_requests        rQ   _prepare_put_requestz$DynamoDBBackend._prepare_put_request  s    FF	$O-s' !&%/) %*)3S^^-

 
 ==?? 	&&$O-C	D,E EFFGG'(    r\   c                 6    dvri S fd| j         D             S )z1Convert get_item() response to field-value pairs.r   c                 X    i | ]&}|j         d          |j                  |j                 'S )r   r   ).0fieldraw_responses     rQ   
<dictcomp>z1DynamoDBBackend._item_to_dict.<locals>.<dictcomp>  s@     
 
 
 JV,UZ8I
 
 
r\   )r;   )r>   r   s    `rQ   _item_to_dictzDynamoDBBackend._item_to_dict  sA    %%I
 
 
 
/
 
 
 	
r\   c                 *    |                                  S )N)r=   rh   s    rQ   rV   zDynamoDBBackend.client  s    !!!r\   c                     t          |          }|                     |          } | j        j        di |}|                     |          }|                    | j        j                  S Nrq   )r   r   rV   get_itemr   r1   r9   r   )r>   r   request_parametersitem_responseitems        rQ   r1   zDynamoDBBackend.get  sg    #hh!66s;;,,BB/ABB!!-00xx).///r\   c                 t    t          |          }|                     ||          } | j        j        di | d S r   )r   r   rV   put_item)r>   r   r   r   s       rQ   setzDynamoDBBackend.set  sE    #hh!66sEBB22122222r\   c                        fd|D             S )Nc                 :    g | ]}                     |          S rq   )r1   )r   r   r>   s     rQ   
<listcomp>z(DynamoDBBackend.mget.<locals>.<listcomp>  s#    ...#...r\   rq   )r>   keyss   ` rQ   mgetzDynamoDBBackend.mget  s    ........r\   c                 r    t          |          }|                     |          } | j        j        di | d S r   )r   r   rV   delete_item)r>   r   r   s      rQ   deletezDynamoDBBackend.delete  sC    #hh!66s;;55"455555r\   )NN)rp   )%__name__
__module____qualname____doc__r'   r3   r4   r+   r*   r5   supports_autoexpirer   r8   r9   r:   r   r;   r%   r=   ri   rW   rX   rY   r   r   rZ   rv   r   r   r   propertyrV   r1   r   r   r   __classcell__)rP   s   @rQ   r   r      s         J   J L   ""<<<J$$(cBBBL((kSIII""===JW W W W W Wr   6
 
 
,  40 0 0  :
 
 
  *n n n`   "	
 	
 	
  4
 
 
 " " X"0 0 03 3 3
/ / /6 6 6 6 6 6 6r\   r   )r   collectionsr   r   r   kombu.utils.urlr   r)   celery.exceptionsr   celery.utils.logr   baser
   r(   botocore.exceptionsr   ImportError__all__r   r   r,   r   rq   r\   rQ   <module>r      s4   ( ( " " " " " "         3 3 3 3 3 3 2 2 2 2 2 2 ' ' ' ' ' ' & & & & & &LLL///////   EKKK  J24IJJ 	H		R6 R6 R6 R6 R6* R6 R6 R6 R6 R6s   
5 	A A