
    >i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 dZ edd      Z ee      Z G d de      Zy	# e$ r d	xZZY *w xY w)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        |   |i | || _        |xs | j                  | _        t        st        d      d}d }d }|Ft        |      \  }}	}
}}}}|}|}|d u}|d u}||k7  rt        d      |}|	dk(  r@d|
 | _        d| _        t        j                  dj                  | j                               n|	| _        | j                  j                  j                  } |d      }|r|| _        t        |j                  d	| j                               | _        t        |j                  d
| j"                              | _        |j                  d| j$                        }|r	 t        |      | _        |xs | j                  | _        | j*                  | j,                  | j.                  f| _        d | _        |r| j5                  ||       y y # t&        $ r"}t        j)                  d| d|       |d }~ww xY w)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                        t/var/www/html/wine-match-dev/backend/winematch-backend/venv/lib/python3.12/site-packages/celery/backends/dynamodb.pyr%   zDynamoDBBackend.__init__>   sD   $)&)$7&$% % !&  $?# CFFD(HeU !)$,!0<4D@#33*"# # %5!$&7v$>!"-@GG)) #) 88==$$D"&'>"?"$7!'*		,,(D$ ),		--)D% ))M4+D+DEC03CD- $6tDO OO!!"
  /"7   !! " LL5cU!<!" !  Gs   (G 	G>G99G>c                 f   | j                   d| j                  i}||j                  ||d       | j                  | j                  |d<   t	        j
                  	 di || _         | j                          | j                          | j                          | j                          | j                   S )zGet client connection.region_name)rB   rC   r*   )dynamodb)
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->* 
   ,484E4E!.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   sp    
 &*__%9%9%)__%>%>%  &*__%9%9% &*%=%=&*&?&?&
 	
r\   c                    | j                         }	 | j                  j                  | j                        S # t        $ r}|j
                  d   j                  dd      }|dk(  r | j                  j                  d
i |}t        j                  dj                  | j                               | j                  d       t        j                  dj                  | 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 	G,00CJ88$=DLL$=$=$M$M!@GG ++H59@@
 )('	s"   %8 	C<B.C7/C<5C77C<c                 <    | j                   dS | 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08t 	0**a/	0r\   c                 <   d}g }t        |      D ]*  }t        | j                  |      r|j                  |       , |r^t        j                  dj                  dj                  |                   t        dj                  dj                  |                  y)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&&v.	/ LLJ&HH_5  	 !5<<HH_5 =   r\   c                 B    | j                   | 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	  s&     ==?!.(
 	
r\   c                 X   	 | j                   j                  | j                        }|S # t        $ rv}|j                  d   j                  dd      }|j                  d   j                  dd      }t        j                  dj                  | j                  ||             |d }~ww xY w)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    	,,<<// = K    	G,00CJJJw/33IyIMLL$foo%   G	s   &* 	B)A1B$$B)c           	      p   | j                         }|d   d   }|dv rj|d   d   }| j                         r|| j                  j                  k(  rt        j                  dj                  |dk(  rdnd| j                  	             |S |d
v rI| j                         sit        j                  dj                  |dk(  rdnd| j                  	             |S t        j                  dj                  || j                               |dk(  rn| j                  j                  }	  | j                  j                  di | j                  |      }t        j                  dj                  | j                  | j                         | j                  j                               |S # t        $ r}|j                  d   j                  dd      }|j                  d   j                  dd      }t        j!                  dj                  | j                         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456HI,,34_E }} DOO$8$88 LL+f!Y. #46"oo	   '&00==? '&+ 13//	   #" NN<foo  L $y0Mdoo6J6J 		<DLL<< --"+ . M
 KKG&// MMO--  		 !  	G,00CJJJw/33IyIMLL$f%)]]_z+oo%	   G	s   "B F# #	H5,BH00H5c                     d}|sq| j                   j                  | j                        }t        j	                  dj                  | j                  |             |d   d   }||k(  }t        d       |spyy)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  sx      $ : :// !; ! LL=DDOO /w7FN+x7N!H !r\   c                 x    | 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  s;     $$OO--s'
 	
r\   c           
      0   t               }| j                  | j                  j                  | j                  j                  |i| j
                  j                  | j
                  j                  |i| j                  j                  | j                  j                  t        |      iid}| j                         r_|d   j                  | 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    F	$$OO--s' !!&&%%//) %%**))33S^-

 ==?&&$$OO--C	D,E,E EFG'(  r\   c                     d|vri S | j                   D ci c],  }|j                  |d   |j                     |j                     . c}S c c}w )z1Convert get_item() response to field-value pairs.r   )r;   r   r   )r>   raw_responsefields      rQ   _item_to_dictzDynamoDBBackend._item_to_dict  sW    %I //
 JJV,UZZ8II
 	
 
s   1A	c                 "    | j                         S N)r=   rh   s    rQ   rV   zDynamoDBBackend.client  s    !!r\   c                     t        |      }| j                  |      } | j                  j                  di |}| j	                  |      }|j                  | j                  j                        S Nrq   )r   r   rV   get_itemr   r1   r9   r   )r>   r   request_parametersitem_responseitems        rQ   r1   zDynamoDBBackend.get  sa    #h!66s;,,,B/AB!!-0xx))..//r\   c                 v    t        |      }| j                  ||      } | j                  j                  di | y r   )r   r   rV   put_item)r>   r   r   r   s       rQ   setzDynamoDBBackend.set  s6    #h!66sEB212r\   c                 J    |D cg c]  }| j                  |       c}S c c}w r   )r1   )r>   keysr   s      rQ   mgetzDynamoDBBackend.mget  s    )-.#...s    c                 t    t        |      }| j                  |      } | j                  j                  di | y r   )r   r   rV   delete_item)r>   r   r   s      rQ   deletezDynamoDBBackend.delete  s4    #h!66s;5"4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BL(kSI"=JWr6
,40:
*n`"	
4
 " "03
/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      sq    ( "  3 2 ' &/  24IJ 	H	R6* R6  EKs   
A 	AA