
    h|L                         d Z ddlmZ ddlmZ ddlmZ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)
ip_address)sleeptime)AnyDict)
_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 edd          ZdZdZd) fd	Ze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e!de"e!e#f         fdZ$de!de"e!e#f         fd Z%d! Z&e'd"             Z(d# Z)d$ Z*d% Z+d& Z,de-de.fd'Z/ fd(Z0 xZ1S )+r   zAWS DynamoDB result backend.

    Raises:
        celery.exceptions.ImproperlyConfigured:
            if module :pypi:`boto3` is not available.
    celeryr   NTidSr   resultBchord_countN	timestampttlc                 P    t                      j        |i | || _        |p| j        | _        t          st          d          d}d }d }|t          |          \  }}	}
}}}}|}|}|d u}|d u}||k    rt          d          |}|	dk    st                              |	          rGd|	 d|
 | _	        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://: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_urlr   _is_valid_ip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                        X/var/www/html/auto_sub_bot/venv/lib/python3.11/site-packages/celery/backends/dynamodb.pyr*   zDynamoDBBackend.__init__D   s   $)&)))$7 	%&$% % % !&  $?# CFFD(HeU !)$,!0<4D@#333*"# # # %5!$$(D(DV(L(L$$=f$=$=t$=$=!"-@GG)     #) 8=$D"&$'>"?"?" 8$7!'*		, ( (D$ ),		- ) )D% ))M4+DEEC 03CD--!   LL<c<<<!" !    G $6tDO O!"
   	/"7      	 	s   F) )
G3"GGc                 H    	 t          |            dS # t          $ r Y dS w xY w)NTF)r   r<   )ips    rW   r/   zDynamoDBBackend._is_valid_ip   s9    	rNNN4 	 	 	55	s    
!!c                 T   | j         d| j        i}||                    ||d           | j        
| j        |d<   t	          j        	 di || _         |                                  |                                 (|                                  | 	                                 | j         S )zGet client connection.Nregion_name)rH   rI   r0   dynamodb)r\   )
rB   r1   updater0   r-   client_get_or_create_table_has_ttl_validate_ttl_methods_set_table_ttl)rD   r'   r(   client_parameterss       rW   rC   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)rf   KeyType)ReadCapacityUnitsWriteCapacityUnits)AttributeDefinitions	TableName	KeySchemaProvisionedThroughput)r>   r   r   r,   r9   r:   rD   s    rW   _get_table_schemaz!DynamoDBBackend._get_table_schema   sm    
 &*_%9%)_%> %  &*_%9%  &*%=&*&?& &
 
 	
rd   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.rm   ErrorCodeUnknownResourceNotFoundExceptionz*DynamoDB Table {} did not exist, creating.ACTIVEz#DynamoDB Table {} is now available.N )rq   rB   describe_tabler,   r   responser7   create_tabler2   infor4   _wait_for_table_status)rD   table_schemarU   
error_codetable_descriptions        rW   r_   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   )r;   rp   s    rW   r`   zDynamoDBBackend._has_ttl   s!     08tt*a/	0rd   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hasattrrB   appendr2   r=   r4   joinAttributeError)rD   required_methodsmissing_methodsmethods       rW   ra   z%DynamoDBBackend._validate_ttl_methods   s    
 +,, 	/ 	/F4<00 /&&v... 	LLJ&HH_55   	   !5<<HH_55 =    	 	rd   c                 @    | j         |                                 |ddS )zBGet the boto3 structure describing the DynamoDB TTL specification.)Enabledrf   )rm   TimeToLiveSpecification)r,   r`   )rD   ttl_attr_names     rW   _get_ttl_specificationz&DynamoDBBackend._get_ttl_specification  s0     ==??!.( (
 
 	
rd   c                 `   	 | j                             | j                  }n# t          $ r~}|j        d                             dd          }|j        d                             dd          }t                              d                    | j        ||                     |d }~ww xY w|S )Nrs   rt   ru   rv   MessagezJError describing Time to Live on DynamoDB table {table}: {code}: {message})rO   codemessage)	rB   r   r,   r   r{   r7   r2   r=   r4   )rD   descriptionrU   r   error_messages        rW   _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ENABLINGrf   z5DynamoDB Time to Live is {situation} on table {table}r   zalready enabledzcurrently being enabled)	situationrO   )DISABLED	DISABLINGr   zalready disabledzcurrently being disabledzWUnknown DynamoDB Time to Live status {status} on table {table}. Attempting to continue.)statusrO   )r   zUDynamoDB table Time to Live updated: table={table} enabled={enabled} attribute={attr})rO   enabledattrrt   ru   rv   r   zHError {action} Time to Live on DynamoDB table {table}: {code}: {message}enabling	disabling)actionrO   r   r   Nry   )r   r`   
_ttl_fieldr   r2   debugr4   r,   r3   rB   r   r   r}   r   r{   r7   r=   )	rD   r   r   cur_attr_name	attr_namespecificationrU   r   r   s	            rW   rb   zDynamoDBBackend._set_table_ttl6  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rx   c                    d}|sz| j                             | j                  }t                              d                    | j        |                     |d         d         }||k    }t          d           |xdS dS )z#Poll for the expected table status.Frs   z+Waiting for DynamoDB table {} to become {}.TableTableStatusr   N)r^   rz   r,   r2   r   r4   r   )rD   expectedachieved_stater   current_statuss        rW   r~   z&DynamoDBBackend._wait_for_table_status  s      	 $ : :/ !; ! ! LL=DDO    /w7FN+x7N!HHH ! 	 	 	 	 	rd   c                 F    | j         | j        j        | j        j        |iidS )z0Construct the item retrieval request parameters.)rm   Key)r,   r>   r   r   rD   keys     rW   _prepare_get_requestz$DynamoDBBackend._prepare_get_request  s4     $O-s'
 
 	
rd   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.rm   Itemr   )r   r,   r>   r   r   r?   r@   strr`   r]   r   r8   r;   )rD   r   valuer   put_requests        rW   _prepare_put_requestz$DynamoDBBackend._prepare_put_request  s    FF	$O-s' !&%/) %*)3S^^-

 
 ==?? 	&&$O-C	D,E EFFGG'(    rd   r   returnc           
          t                      }| j        | j        j        | j        j        |i| j        j        | j        j        di| j        j        | j        j        t          |          iidS )z7Construct the counter initialization request parameters0r   )r   r,   r>   r   r   _count_filedr@   r   )rD   r   r   s      rW   _prepare_init_count_requestz+DynamoDBBackend._prepare_init_count_request  sw    FF	$O-s' !&%/) %*)3S^^-

 
 	
rd   c                     | j         | j        j        | j        j        |iid| j        j         d| j        j         ddddiiddS )	z2Construct the counter increment request parameterszset z = z + :numz:numr   1UPDATED_NEW)rm   r   UpdateExpressionExpressionAttributeValuesReturnValues)r,   r>   r   r   r   r   s     rW   _prepare_inc_count_requestz*DynamoDBBackend._prepare_inc_count_request  sl     $O-s'
 !bt'8'= a a$BSBX a a ac
* *
 
 	
rd   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     rW   
<dictcomp>z1DynamoDBBackend._item_to_dict.<locals>.<dictcomp>  s@     
 
 
 JV,UZ8I
 
 
rd   )rA   )rD   r   s    `rW   _item_to_dictzDynamoDBBackend._item_to_dict  sA    %%I
 
 
 
/
 
 
 	
rd   c                 *    |                                  S )N)rC   rp   s    rW   r^   zDynamoDBBackend.client  s    !!!rd   c                     t          |          }|                     |          } | j        j        di |}|                     |          }|                    | j        j                  S Nry   )r   r   r^   get_itemr   r7   r?   r   )rD   r   request_parametersitem_responseitems        rW   r7   zDynamoDBBackend.get  sg    #hh!66s;;,,BB/ABB!!-00xx).///rd   c                 t    t          |          }|                     ||          } | j        j        di | d S r   )r   r   r^   put_item)rD   r   r   r   s       rW   setzDynamoDBBackend.set  sE    #hh!66sEBB22122222rd   c                        fd|D             S )Nc                 :    g | ]}                     |          S ry   )r7   )r   r   rD   s     rW   
<listcomp>z(DynamoDBBackend.mget.<locals>.<listcomp>  s#    ...#...rd   ry   )rD   keyss   ` rW   mgetzDynamoDBBackend.mget  s    ........rd   c                 r    t          |          }|                     |          } | j        j        di | d S r   )r   r   r^   delete_item)rD   r   r   s      rW   deletezDynamoDBBackend.delete  sC    #hh!66s;;55"455555rd   c                     t          |          }|                     |          } | j        j        di |}|d         | j        j                 | j        j                 }t          |          S )z<Atomically increase the chord_count and return the new count
Attributesry   )r   r   r^   update_itemr   r   r   r8   )rD   r   r   r   	new_counts        rW   incrzDynamoDBBackend.incr  sh    #hh!<<SAA//EE2DEE&|4T5F5KLTM^Mhi	9~~rd   c                     |                      |d                   }|                     t          |                    } | j        j        di |  t                      j        ||fi |S )Nr   ry   )get_key_for_chordr   r   r^   r   r)   _apply_chord_incr)rD   header_result_argsbodyrF   	chord_keyinit_count_requestrV   s         rW   r   z!DynamoDBBackend._apply_chord_incr'  s    **+=a+@AA	!==c)nnMM221222(uww(0 0(.0 0 	0rd   )NN)rx   )2__name__
__module____qualname____doc__r,   r9   r:   r1   r0   r;   supports_autoexpirer   r>   r?   r   r@   r   rA   implements_incrr*   staticmethodr/   rC   rq   r_   r`   ra   r   r   rb   r~   r   r   r   r   r   r   r   r   propertyr^   r7   r   r   r   bytesr8   r   r   __classcell__)rV   s   @rW   r   r      s         J   J L   ""<<<J$$(cBBBL$$-3GGGL((kSIII""===JOW W W W W Wr   \   6
 
 
,  40 0 0  :
 
 
  *n n n`   "	
 	
 	
  4
s 
tCH~ 
 
 
 
$
c 
d38n 
 
 
 
 
 
 
 " " X"0 0 03 3 3
/ / /6 6 6
 #    0 0 0 0 0 0 0 0 0rd   r   )r   collectionsr   	ipaddressr   r   r   typingr   r   kombu.utils.urlr	   r.   celery.exceptionsr
   celery.utils.logr   baser   r-   botocore.exceptionsr   ImportError__all__r   r   r2   r   ry   rd   rW   <module>r     s^   ( ( " " " " " "                             3 3 3 3 3 3 2 2 2 2 2 2 ' ' ' ' ' ' & & & & & &LLL///////   EKKK  J24IJJ 	H		O0 O0 O0 O0 O0* O0 O0 O0 O0 O0s   
A 	AA