
    g                     z    d Z ddlZddlZddlZddlZddlmZmZ ddlmZm	Z	 ddl
mZ  G d d      Zde	e   fd	Zy)
zs
This file contains the PrismaWrapper class, which is used to wrap the Prisma client and handle the RDS IAM token.
    N)datetime	timedelta)AnyOptional)str_to_boolc                   j    e Zd ZdedefdZdee   defdZdee   fdZ		 dd	ed
ee   fdZ
defdZy)PrismaWrapperoriginal_prismaiam_token_db_authc                      || _         || _        y N)_original_prismar   )selfr
   r   s      S/var/www/openai/venv/lib/python3.12/site-packages/litellm/proxy/db/prisma_client.py__init__zPrismaWrapper.__init__   s     /!2    	token_urlreturnc                 4   |yt         j                  j                  |      }t         j                  j                  |      }t         j                  j	                  |j
                        }|j                  dd g      d   }|t        d      t        |      }|j                  ddg      d   }|st        d      	 t        j                  |d      }|t        |
      z   }
t        j                         }||
kD  S # t        $ r}	t        d	|	       d }	~	ww xY w)NTzX-Amz-Expiresr   z.X-Amz-Expires parameter is missing or invalid.z
X-Amz-Date z+X-Amz-Date parameter is missing or invalid.z%Y%m%dT%H%M%SZzInvalid X-Amz-Date format: )seconds)urllibparseunquoteurlparseparse_qsqueryget
ValueErrorintr   strptimer   utcnow)r   r   decoded_url
parsed_urlquery_paramsexpiresexpires_inttoken_time_str
token_timeeexpiration_timecurrent_times               r   is_token_expiredzPrismaWrapper.is_token_expired   s   ll**95 \\**;7
 ||,,Z-=-=> ""?TF;A>?MNN'l &)),=a@JKK	@!**>;KLJ
 %y'EE  ( o--  	@:1#>??	@s   =C; ;	DDDc           
      p   | j                   rddlm} t        j                  d      }t        j                  d      }t        j                  d      }t        j                  d      }t        j                  d      } ||||      }d	| d
| d| d
| d| 
}|r|d| z  }|t        j
                  d<   |S y )Nr   )generate_iam_auth_tokenDATABASE_HOSTDATABASE_PORTDATABASE_USERDATABASE_NAMEDATABASE_SCHEMA)db_hostdb_portdb_userzpostgresql://:@/z?schema=DATABASE_URL)r    litellm.proxy.auth.rds_iam_tokenr/   osgetenvenviron)	r   r/   r5   r6   r7   db_name	db_schematoken_db_urls	            r   get_rds_iam_tokenzPrismaWrapper.get_rds_iam_token;   s    !!Pii0Gii0Gii0Gii0G		"34I+'E
 &gYaway'!G9UGXi[11)0BJJ~&Nr   N
new_db_urlhttp_clientc                    K   ddl m} | ||      | _        n |       | _        | j                  j                          d {    y 7 w)Nr   )Prisma)http)prismarH   r   connect)r   rE   rF   rH   s       r   recreate_prisma_clientz$PrismaWrapper.recreate_prisma_clientR   s@      	""$*$<D!$*HD!##++---s   AAA	Anamec                    t        | j                  |      }| j                  rt        j                  d      }| j                  |      r| j                         }t        j                         }|r]|j                         r't        j                  | j                  |      |       |S t        j                  | j                  |             |S t        d      |S )Nr;   zFailed to get RDS IAM token)getattrr   r   r=   r>   r-   rD   asyncioget_event_loop
is_runningrun_coroutine_threadsaferL   runr   )r   rM   original_attrdb_urlloops        r   __getattr__zPrismaWrapper.__getattr__^   s     5 5t<!!YY~.F$$V,//1--/(88 77? 	  D$?$?$GH  %%BCCr   r   )__name__
__module____qualname__r   boolr   r   strr-   rD   rL   rX    r   r   r	   r	      sh    3 3 3%.(3- %.D %.N8C= 0 =A
.
.,4SM
. r   r	   disable_prisma_schema_updatec                 N    | t        t        j                  d            } | du ryy)zT
    This function is used to determine if the Prisma schema should be updated.
    DISABLE_SCHEMA_UPDATETF)r   r=   r>   )r_   s    r   should_update_schemarb   s   s-     $+'2299=T3U'V$#t+r   )__doc__rP   r=   r   urllib.parser   r   typingr   r   litellm.secret_managers.mainr   r	   r\   rb   r^   r   r   <module>rg      s>     	   (   4a aHx~ r   