
    h                         d Z ddlZddlZddl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mZ ddlmZ ddlmZ  G d d      Z G d	 d
      Z	 ddeeeef      d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Union)verbose_proxy_logger)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      Z/var/www/Befach/backend/env/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_tokenr1   osgetenvenviron)	r   r1   r7   r8   r9   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)prismarJ   r   connect)r   rG   rH   rJ   s       r   recreate_prisma_clientz$PrismaWrapper.recreate_prisma_clientV   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/   rF   asyncioget_event_loop
is_runningrun_coroutine_threadsaferN   runr!   )r   rO   original_attrdb_urlloops        r   __getattr__zPrismaWrapper.__getattr__b   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/   rF   rN   rZ    r   r   r   r      sh    3 3 3%.(3- %.D %.N8C= 0 =A
.
.,4SM
. r   r   c                   >    e Zd Zedefd       Zeddedefd       Zy)PrismaManagerr   c                      t         j                  j                  t              } t         j                  j	                  t         j                  j	                  |             }|S )z(Get the path to the migrations directory)r?   pathabspath__file__dirname)re   dnames     r   _get_prisma_dirzPrismaManager._get_prisma_dirx   s:     ''//(+ 89r   use_migratec                 \   t        t        j                  d            xs | } t        d      D ]  }t        j                         }t
        j                         }t        j                  |       	 | rD	 ddlm	} t
        j                         }|j                  | 	      t        j                  |       c S t        j                  g d
dd       	 t        j                  |        y y# t        $ r9}t        j                  d| d       Y d}~t        j                  |        yd}~ww xY w# t        j                   $ rH t        j"                  d|dz    d       t%        j&                  t)        j*                  dd             Y nut        j,                  $ r`}d|z
  }|dkD  rd| dnd}t        j"                  d| d|        t%        j&                  t)        j*                  dd             Y d}~nd}~ww xY wt        j                  |       # t        j                  |       w xY w)z
        Set up the database using either prisma migrate or prisma db push

        Returns:
            bool: True if setup was successful, False otherwise
        USE_PRISMA_MIGRATE   r   )ProxyExtrasDBManagerz3[1;31mLiteLLM: Failed to import proxy extras. Got z[0mNF)rj   )rL   dbpushz--accept-data-loss<   T)timeoutcheckzAttempt    z
 timed out         z Retrying... (z attempts left)r   z(The process failed to execute. Details: .)r	   r?   r@   rangegetcwdrb   ri   chdirlitellm_proxy_extras.utilsrn   ImportErrorr   errorsetup_database
subprocessrV   TimeoutExpiredwarningtimesleeprandom	randrangeCalledProcessError)rj   attemptoriginal_dir
prisma_dirrn   r,   attempts_left	retry_msgs           r   r   zPrismaManager.setup_database   s    "")),@"ABQkQxG99;L&668JHHZ $'%S "/!>!>!@J/>>;>W0 &+ NNF ""
    &Q  R C ' %,22TUVTWW^_  %8 &A%" ,, 4$,,x!}J-OP

6++Ar2300 
4 !G %q( %]O?C 
 %,,>qc9+N 

6++Ar233
4 &&sh   /D.2C)8%D.5D.)	D+2D&D.&D++D..AG:HG:AG50H5G::HH+N)F)r[   r\   r]   staticmethodr_   ri   r^   r   r`   r   r   rb   rb   w   s=    S   2D 2T 2 2r   rb   disable_updatesr   c                     | t        j                  dd      } t        | t              rt	        |       } t        |        S )ao  
    Determines if Prisma Schema updates should be applied during startup.

    Args:
        disable_updates: Controls whether schema updates are disabled.
            Accepts boolean or string ('true'/'false'). Defaults to checking DISABLE_SCHEMA_UPDATE env var.

    Returns:
        bool: True if schema updates should be applied, False if updates are disabled.

    Examples:
        >>> should_update_prisma_schema()  # Checks DISABLE_SCHEMA_UPDATE env var
        >>> should_update_prisma_schema(True)  # Explicitly disable updates
        >>> should_update_prisma_schema("false")  # Enable updates using string
    DISABLE_SCHEMA_UPDATEfalse)r?   r@   
isinstancer_   r	   r^   )r   s    r   should_update_prisma_schemar      s=    $ ))$;WE/3'%o6O$$$r   r   )__doc__rR   r?   r   r   r   r   urllib.parser   r   typingr   r   r   litellm._loggingr   litellm.secret_managers.mainr	   r   rb   r^   r_   r   r`   r   r   <module>r      sp     	      ( ' ' 1 4a aH; ;~ 37%eD#I./%	%r   