
    ,iG                       U d dl mZ d dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZmZ d dlmZ d	d
lmZmZmZmZmZmZ d	dlmZmZmZmZ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.  ej^                  e0      Z1de2d<    G d d      Z3 e3       Z4ddd!dZ5 e	de      Z6 G d dee6         Z7 G d de7e         Z8 G d d e7e          Z9y)"    )annotationsN)TracebackType)AnyGenericTypeVaroverload)Path)	timedelta)SelfLiteral)	BaseModel   )
Datasource
HttpConfigPrismaMethodMetricsFormatTransactionIdDatasourceOverride)SyncQueryEngineAsyncQueryEngineBaseAbstractEngineSyncAbstractEngineAsyncAbstractEngine)ClientNotConnectedErrorClientNotRegisteredError)model_parseremoveprefix)QueryBuilder)Metrics)
get_client)
EngineTypezlogging.Loggerlogc                      e Zd ZdZy)UseClientDefaulta1  For certain parameters such as `timeout=...` we can make our intent more clear
    by typing the parameter with this class rather than using None, for example:

    ```py
    def connect(timeout: Union[int, timedelta, UseClientDefault] = UseClientDefault()) -> None: ...
    ```

    relays the intention more clearly than:

    ```py
    def connect(timeout: Union[int, timedelta, None] = None) -> None: ...
    ```

    This solution also allows us to indicate an "unset" state that is uniquely distinct
    from `None` which may be useful in the future.
    N)__name__
__module____qualname____doc__     X/var/www/html/langgraph-service/venv/lib/python3.12/site-packages/prisma/_base_client.pyr$   r$      s    r*   r$   F)overridec                8    ddl m}  |dd| i|  |dd| i| y)zLoad environemntal variables from dotenv files

    Loads from the following files relative to the current
    working directory:

    - .env
    - prisma/.env
    r   )load_dotenvr,   N)z.env)zprisma/.env)dotenvr.   )r,   kwargsr.   s      r+   load_envr1   5   s'     #44V4;;F;r*   _EngineT)boundc                     e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   dZ	 	 	 	 	 	 	 	 	 	 	 	 d,dZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d-dZed.d       Zd/dZ	d/dZ
d/d Zd0d!Zed1d"       Zej                  d2d#       Zd3d$Zd4d%Zd&d'd5d(Zed)	 	 	 d6d*Z	 	 	 	 	 	 	 	 	 	 d7d+Zy&)8
BasePrismabool_log_queriesDatasourceOverride | None_datasourceint | timedelta_connect_timeoutzTransactionId | None_tx_idr   _http_configz_EngineT | None_internal_engine_copiedr	   _schema_pathset[str]_prisma_models_packaged_schema_pathr!   _engine_type_preview_featuresstr_default_datasource_namedict[str, dict[str, str]]_relational_field_mappings)r?   r<   r9   r7   r=   r@   rD   rB   _active_providerr;   r>   rC   rE   rG   rI   c                   d | _         || _        || _        t        |t              r*d}t        j                  |t        d       t        |      }|| _	        |xs i | _
        d | _        d| _        |rt                y y )NzPassing an int as `connect_timeout` argument is deprecated and will be removed in the next major release. Use a `datetime.timedelta` instance instead.   
stacklevelsecondsF)r>   r7   r9   
isinstanceintwarningswarnDeprecationWarningr
   r;   r=   r<   r?   r1   )self
use_dotenvlog_queries
datasourceconnect_timeouthttpmessages          r+   __init__zBasePrisma.__init__k   s|     !%'%os+? 
 MM'#5!D'@O /(,
,0"J r*   c               t    || _         || _        || _        || _        || _        || _        || _        || _        y)zWe pass through generated metadata using this method
        instead of the `__init__()` because that causes weirdness
        for our `_copy()` method as this base class has arguments
        that the subclasses do not.
        N)r@   rD   rB   rJ   rC   rE   rI   rG   )	rV   schema_pathengine_typepackaged_schema_pathactive_providerprisma_modelspreview_featuresrelational_field_mappingsdefault_datasource_names	            r+   _set_generated_propertiesz$BasePrisma._set_generated_properties   sD    " ('+ /%9"!1*C'(?%r*   c                    t        d      )Nz9`_default_datasource` should be implemented in a subclass)NotImplementedErrorrV   s    r+   _default_datasourcezBasePrisma._default_datasource   s    !"]^^r*   c                :    	 t               | u S # t        $ r Y yw xY w)z2Returns True if this client instance is registeredF)r    r   rj   s    r+   is_registeredzBasePrisma.is_registered   s&    	<4''' 		s    	c                    | j                   duS )z:Returns True if the client is wrapped within a transactionN)r<   rj   s    r+   is_transactionzBasePrisma.is_transaction   s    {{$&&r*   c                    | j                   duS )zMReturns True if the client is connected to the query engine, False otherwise.Nr>   rj   s    r+   is_connectedzBasePrisma.is_connected   s    $$D00r*   c                    | j                   F| j                  s9t        j                  d       | j                   }d | _         |j	                          y y y )Nz!unclosed client - stopping engine)r>   r?   r"   debugstoprV   engines     r+   __del__zBasePrisma.__del__   sH    
   ,T\\II9:**F$(D!KKM	 6B,r*   c                6    | j                   }|
t               |S N)r>   r   rv   s     r+   _enginezBasePrisma._engine   s     &&>)++r*   c                    || _         y rz   rq   rv   s     r+   r{   zBasePrisma._engine   s
     &r*   c                    | j                  d| j                  | j                  | j                  | j                        }d|_        | j                  | j                  |_        |S )zReturn a new Prisma instance using the same engine process (if connected).

        This is only intended for private usage, there are no guarantees around this API.
        F)rW   r[   rY   rX   rZ   T)	__class__r=   r9   r7   r;   r?   r>   r{   )rV   news     r+   _copyzBasePrisma._copy   se    
 nn""'')) 11  
   ,//CK
r*   c                    | j                   j                  d      }|rt        |      j                  }| j                   d   | j	                  | j                   d   |      dS )zOverride the default SQLite path to protect against
        https://github.com/RobertCraigie/prisma-client-py/issues/409
        source_file_pathnameurlrelative_to)r   r   )rk   getr	   parent_make_sqlite_url)rV   r   s     r+   _make_sqlite_datasourcez"BasePrisma._make_sqlite_datasource   so     /3.F.F.J.JK].^#$45<< ,,V4((((/, ) 
 	
r*   Nr   c                  t        t        |d      d      }||k(  r|S t        |      j                         r|S || j                  j                  }t        |t              rt        |      }d|j                  |      j                          S )Nzfile:zsqlite:)	r   r	   is_absoluter@   r   rQ   rF   joinpathresolve)rV   r   r   url_paths       r+   r   zBasePrisma._make_sqlite_url   s    S' :IFs?J>%%'J++22Kk3'{+K{++H5==?@AAr*   timeoutc                  t        |t              r| j                  }t        |t              r*d}t	        j
                  |t        d       t        |      }d}| j                  :| j                  j                         }|j                  d| j                         |g}n5| j                  dk(  r&t        j                  d       | j                         g}t        j                  d	|       ||fS )
zIReturns (timeout, datasources) to be passed to `AbstractEngine.connect()`zPassing an int as `timeout` argument is deprecated and will be removed in the next major release. Use a `datetime.timedelta` instance instead.rL   rM   rO   Nr   sqlitez)overriding default SQLite datasource pathzdatasources: %s)rQ   r$   r;   rR   rS   rT   rU   r
   r9   copy
setdefaultrG   rJ   r"   rt   r   )rV   r   r\   datasourcesdss        r+   _prepare_connect_argsz BasePrisma._prepare_connect_args  s     g/0++Ggs#? 
 MM'#5!D0G7;'!!&&(BMM&$"?"?@$K""h.IIAB  779:K		#[1##r*   c               L    t        ||||| j                  | j                        S )N)methodmodel	argumentsroot_selectionrc   re   )r   rB   rI   )rV   r   r   r   r   s        r+   _make_query_builderzBasePrisma._make_query_builder!  s/     )--&*&E&E
 	
r*   )rW   r6   rX   r6   rY   r8   rZ   r:   r[   zHttpConfig | NonereturnNone)r_   r	   r`   r!   ra   r	   rb   rF   rc   rA   rd   rA   re   rH   rf   rF   r   r   )r   r   )r   r6   )r   r   )r   r2   )rw   r2   r   r   r   r   )r   r   )r   rF   r   zPath | str | Noner   rF   )r   "int | timedelta | UseClientDefaultr   z1tuple[timedelta, list[DatasourceOverride] | None])
r   r   r   dict[str, Any]r   type[BaseModel] | Noner   list[str] | Noner   r   )r%   r&   r'   __annotations__	__slots__r]   rg   propertyrk   rm   ro   rr   rx   r{   setterr   r   r   USE_CLIENT_DEFAULTr   r   r)   r*   r+   r5   r5   G   s   **%%  %%M !! 99I$  	
 . )   
@@ @  	@
 #@ @  @ #@ $=@ "%@ 
@4 _ _'1	   ^^' '&
  NR B& 7I$ 4$ 
;	$@
 
 "	

 &
 )
 

r*   r5   c                      e Zd ZdZef	 	 	 ddZdddZddZ	 	 	 	 	 	 	 	 ddZe		 ddd	 	 	 	 	 dd       Z
e	dd	 	 	 	 	 dd	       Z
	 ddd	 	 	 	 	 dd
Z
dddZedd       Z	 	 d	 	 	 	 	 	 	 	 	 ddZy)SyncBasePrismar)   c                    | j                   !| j                  | j                        | _         | j                  |      \  }}| j                   j	                  ||       yzhConnect to the Prisma query engine.

        It is required to call this before accessing data.
        N)dml_pathr   )r   r   r>   _create_enginerC   r   connectrV   r   r   s      r+   r   zSyncBasePrisma.connect6  sc       ($($7$7A[A[$7$\D!#99'9J%%# 	& 	
r*   Nc                   | j                   x| j                   }d| _         t        |t        t        f      r*d}t	        j
                  |t        d       t        |      }|j                  |       |j                  |       yyz#Disconnect the Prisma query engine.NzPassing a number as `timeout` argument is deprecated and will be removed in the next major release. Use a `datetime.timedelta` instead.rL   rM   rO   r   )
r>   rQ   rR   floatrS   rT   rU   r
   closeru   rV   r   rw   r\   s       r+   
disconnectzSyncBasePrisma.disconnectH  sw      ,**F$(D!'C<0: 
 g'9aH#G4LLL)KKK( -r*   c                &    | j                          | S rz   r   rj   s    r+   	__enter__zSyncBasePrisma.__enter__Z  s    r*   c                F    | j                         r| j                          y y rz   rr   r   rV   exc_typeexcexc_tbs       r+   __exit__zSyncBasePrisma.__exit__^  s     OO r*   global_labelsc                    y rz   r)   rV   formatr   s      r+   get_metricszSyncBasePrisma.get_metricsg  s     r*   c                    y rz   r)   r   s      r+   r   zSyncBasePrisma.get_metricso  s     r*   c                   | j                   j                  ||      }|dk(  rt        |t              sJ |S t	        t
        |      S )  Metrics give you a detailed insight into how the Prisma Client interacts with your database.

        You can retrieve metrics in either JSON or Prometheus formats.

        For more details see https://www.prisma.io/docs/concepts/components/prisma-client/metrics.
        r   r   
prometheusr{   metricsrQ   rF   r   r   rV   r   r   responses       r+   r   zSyncBasePrisma.get_metricsw  sG     <<''v]'S\!h,,,O7H--r*   c                    | j                   t        j                  k(  r0t        |xs | j                  | j
                  | j                        S t        d| j                          N)r   rX   http_configzUnsupported engine type: )rD   r!   binaryr   rC   r7   r=   ri   rV   r   s     r+   r   zSyncBasePrisma._create_engine  s_    
 1 11"!?T%?%? -- --  "$=d>O>O=P"QRRr*   c                x    | j                   t        j                  k(  rt        S t	        d| j                          NzUnhandled engine type: )rD   r!   r   r   RuntimeErrorrj   s    r+   _engine_classzSyncBasePrisma._engine_class  s6    
 1 11""4T5F5F4GHIIr*   c                    | j                  ||||      }| j                  j                  |j                         | j                        S N)r   r   r   r   )tx_idr   r{   querybuildr<   rV   r   r   r   r   builders         r+   _executezSyncBasePrisma._execute  sH     **)N + 
 ||!!'--/!EEr*   r   r   r   r   rz   r   zfloat | timedelta | Noner   r   r   r   ztype[BaseException] | Noner   zBaseException | Noner   zTracebackType | Noner   r   jsonr   zLiteral['json']r   dict[str, str] | Noner   r   r   zLiteral['prometheus']r   r   r   rF   r   r   r   r   r   zstr | Metrics)r   Path | Noner   r   )r   ztype[SyncAbstractEngine])NN
r   r   r   r   r   r   r   r   r   r   )r%   r&   r'   r   r   r   r   r   r   r   r   r   r   r   r   r)   r*   r+   r   r   3  s\   I 7I
3
 

$)$, " %	
 
  #) 04	 -	
 
  
 04	% -	
 
  !'. 04	.. -	.
 
.(S J J )-+/
F
F "
F &	
F
 )
F 

Fr*   r   c                      e Zd ZdZef	 	 	 ddZdddZddZ	 	 	 	 	 	 	 	 ddZe		 ddd	 	 	 	 	 dd       Z
e	dd	 	 	 	 	 dd	       Z
	 ddd	 	 	 	 	 dd
Z
dddZedd       Zddd	 	 	 	 	 	 	 	 	 ddZy)AsyncBasePrismar)   c                   K   | j                   !| j                  | j                        | _         | j                  |      \  }}| j                   j	                  ||       d{    y7 wr   r   r   s      r+   r   zAsyncBasePrisma.connect  sq        ($($7$7A[A[$7$\D!#99'9J##++# , 
 	
 	
s   A#A-%A+&A-Nc                (  K   | j                   | j                   }d| _         t        |t        t        f      r*d}t	        j
                  |t        d       t        |      }|j                  |       d{    |j                  |       yy7 wr   )
r>   rQ   rR   r   rS   rT   rU   r
   acloseru   r   s       r+   r   zAsyncBasePrisma.disconnect  s       ,**F$(D!'C<0: 
 g'9aH#G4---000KKK( - 1s   A5B7B8Bc                B   K   | j                          d {    | S 7 wrz   r   rj   s    r+   
__aenter__zAsyncBasePrisma.__aenter__  s     lln 	s   c                b   K   | j                         r| j                          d {    y y 7 wrz   r   r   s       r+   	__aexit__zAsyncBasePrisma.__aexit__  s,      //### #s   $/-/r   c                  K   y wrz   r)   r   s      r+   r   zAsyncBasePrisma.get_metrics  s         c                  K   y wrz   r)   r   s      r+   r   zAsyncBasePrisma.get_metrics  s      r   c                  K   | j                   j                  ||       d{   }|dk(  rt        |t              sJ |S t	        t
        |      S 7 -w)r   r   Nr   r   r   s       r+   r   zAsyncBasePrisma.get_metrics  sT      --V=-YY\!h,,,O7H-- Zs   !AA.Ac                    | j                   t        j                  k(  r0t        |xs | j                  | j
                  | j                        S t        d| j                          r   )rD   r!   r   r   rC   r7   r=   ri   r   s     r+   r   zAsyncBasePrisma._create_engine  s_    
 1 11#!?T%?%? -- --  "$=d>O>O=P"QRRr*   c                x    | j                   t        j                  k(  rt        S t	        d| j                          r   )rD   r!   r   r   r   rj   s    r+   r   zAsyncBasePrisma._engine_class  s6    
 1 11##4T5F5F4GHIIr*   )r   r   c                  K   | j                  ||||      }| j                  j                  |j                         | j                         d {   S 7 wr   r   r   s         r+   r   zAsyncBasePrisma._execute  sR      **)N + 
 \\''t{{'KKKKs   AAAAr   rz   r   r   r   r   r   r   r   )r   r   r   r   )r   ztype[AsyncAbstractEngine]r   )r%   r&   r'   r   r   r   r   r   r   r   r   r   r   r   r   r)   r*   r+   r   r     s^   I 7I
3
 

$)$$,$ "$ %	$
 
$  #) 04	 -	
 
  
 04	% -	
 
  !'. 04	.. -	.
 
.(S J J )-+/L L "	L
 &L )L 
Lr*   r   )r,   r6   r0   r   r   r   ):
__future__r   loggingrS   typesr   typingr   r   r   r   pathlibr	   datetimer
   typing_extensionsr   r   pydanticr   _typesr   r   r   r   r   r   rw   r   r   r   r   r   errorsr   r   _compatr   r   _builderr   _metricsr   	_registryr    generator.modelsr!   	getLoggerr%   r"   r   r$   r   r1   r2   r5   r   r   r)   r*   r+   <module>r     s    "    2 2   +  j j  F . "  ! ('g''1^ 1 & &'  "' < :%78i
" i
XtFZ 23 tFnuLj!45 uLr*   