
    g#                    V   d dl mZ d dlZd dlmZ d dlZd dlZd dl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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mZ ddlmZ ddlmZ ddlmZ ddlmZ  ed      Zej                  r G d de      Zd/dZnd dlmZ d dlmZ  e e       d      Zd0dZ G d de      Z  edd !      Z!er		 	 	 	 d1d"Z"nejD                  Z"d2d#Z#d3d$Z$d4d%Z%d4d&Z&d'd(	 	 	 	 	 	 	 	 	 d5d)Z' G d* d+      Z(d6d,Z)eserejT                  Z+y G d- d.      Z+y)7    )annotationsN)Context)Any)	Awaitable)Callable)	Coroutine)Optional)TYPE_CHECKING)TypeVar)Union   )memoized_property   )exc)py311)Literal)Protocol)Self)	TypeGuard_Tc                  :    e Zd ZU ded<   ded<   d	dZd
dZddZy)greenletbooldeadzOptional[Context]
gr_contextc                     y N selffndrivers      `/var/www/html/AdoubleTech/venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py__init__zgreenlet.__init__(           c                     y r   r   )r    args     r#   throwzgreenlet.throw*       r&   c                     y r   r   )r    values     r#   switchzgreenlet.switch-   r*   r&   Nr!   zCallable[..., Any]r"   r   )r(   r   returnr   )r,   r   r/   r   )__name__
__module____qualname____annotations__r$   r)   r-   r   r&   r#   r   r   $   s    
%%I		r&   r   c                      y r   r   r   r&   r#   
getcurrentr5   0   r%   r&   )r5   )r   r   c                |    t        | t               xs* t        | t        j                  t        j                  f      S r   )
isinstance	ExceptionasyncioTimeoutErrorCancelledError)es    r#   is_exit_exceptionr=   =   s8     !Y'' :	G  '"8"89, r&   c                  $    e Zd ZU ded<   dZddZy)_AsyncIoGreenletr   r   Tc                b    t        j                  | ||       t        r|j                  | _        y y r   )r   r$   _has_gr_contextr   r   s      r#   r$   z_AsyncIoGreenlet.__init__O   s)    $F+$//DO r&   Nr.   )r0   r1   r2   r3    __sqlalchemy_greenlet_provider__r$   r   r&   r#   r?   r?   J   s    
J'+$0r&   r?   _T_coT)	covariantc                     y r   r   	awaitables    r#   iscoroutinerH   Y   s    03r&   c                <    t        |       r| j                          y y r   )rH   closerF   s    r#   _safe_cancel_awaitablerK   a   s     9 r&   c                 0    t               } t        | dd      S )NrB   F)r5   getattr)currents    r#   in_greenletrO   h   s    lG7>FFr&   c                    t               }t        |dd      s t        |        t        j                  d      |j
                  j                  |       S )zAwaits an async function in a sync method.

    The sync method must be inside a :func:`greenlet_spawn` context.
    :func:`await_only` calls cannot be nested.

    :param awaitable: The coroutine to call.

    rB   Fzjgreenlet_spawn has not been called; can't call await_only() here. Was IO attempted in an unexpected place?)r5   rM   rK   r   MissingGreenletparentr-   )rG   rN   s     r#   
await_onlyrS   m   sO     lG7>Fy)!!=
 	
 >>  ++r&   c                    t               }t        |dd      sKt               }|j                         r t	        |        t        j                  d      |j                  |       S |j                  j                  |       S )a  Awaits an async function in a sync method.

    The sync method must be inside a :func:`greenlet_spawn` context.
    :func:`await_fallback` calls cannot be nested.

    :param awaitable: The coroutine to call.

    .. deprecated:: 2.0.24 The ``await_fallback()`` function will be removed
       in SQLAlchemy 2.1.  Use :func:`_util.await_only` instead, running the
       function / program / etc. within a top-level greenlet that is set up
       using :func:`_util.greenlet_spawn`.

    rB   Fzgreenlet_spawn has not been called and asyncio event loop is already running; can't call await_fallback() here. Was IO attempted in an unexpected place?)
r5   rM   get_event_loop
is_runningrK   r   rQ   run_until_completerR   r-   )rG   rN   loops      r#   await_fallbackrY      sr      lG7>F??"9-%%; 
 &&y11>>  ++r&   F)_require_awaitc               b  K   t        | t                     }d} |j                  |i |}|j                  s+d}	 | d{   }|j                  |      }|j                  s+|r|st        j                  d      |S 7 =# t        $ r$  |j
                  t        j                          }Y Vw xY ww)aG  Runs a sync function ``fn`` in a new greenlet.

    The sync function can then use :func:`await_only` to wait for async
    functions.

    :param fn: The sync callable to call.
    :param \*args: Positional arguments to pass to the ``fn`` callable.
    :param \*\*kwargs: Keyword arguments to pass to the ``fn`` callable.
    FTNzThe current operation required an async execution but none was detected. This will usually happen when using a non compatible DBAPI driver. Please ensure that an async DBAPI is used.)
r?   r5   r-   r   BaseExceptionr)   sysexc_infor   AwaitRequired)r!   rZ   argskwargscontextswitch_occurredresultr,   s           r#   greenlet_spawnre      s     " r:<0G
 OW^^T,V,Fll
	+ !LE ^^E*F ll oG
 	

 M ! 	4 #W]]CLLN3F		4s?   7B/A? A= A? B/"B/=A? ?*B,)B/+B,,B/c                  .    e Zd Zedd       ZddZddZy)AsyncAdaptedLockc                *    t        j                         S r   )r9   Lockr    s    r#   mutexzAsyncAdaptedLock.mutex   s     ||~r&   c                H    t        | j                  j                               S r   )rY   rk   acquirerj   s    r#   	__enter__zAsyncAdaptedLock.__enter__   s     djj00233r&   c                8    | j                   j                          y r   )rk   release)r    r(   kws      r#   __exit__zAsyncAdaptedLock.__exit__   s    

r&   N)r/   zasyncio.Lockr/   r   )r(   r   rq   r   r/   None)r0   r1   r2   r   rk   rn   rr   r   r&   r#   rg   rg      s     
4
r&   rg   c                     	 t        j                         S # t        $ r Y nw xY wt        j                         j	                         S )z}vendor asyncio.get_event_loop() for python 3.7 and above.

    Python 3.10 deprecates get_event_loop() as a standalone.

    )r9   get_running_loopRuntimeErrorget_event_loop_policyrU   r   r&   r#   rU   rU      sB    ''))  ((*99;;s    	""c                  T    e Zd ZU dZded<   ddZddZddZddZddZ	dd	Z
dd
Zy)_Runnerz#Runner implementation for test onlyz6Union[None, asyncio.AbstractEventLoop, Literal[False]]_loopc                    d | _         y r   )r{   rj   s    r#   r$   z_Runner.__init__   s	    DJr&   c                &    | j                          | S r   )
_lazy_initrj   s    r#   rn   z_Runner.__enter__   s    OOKr&   c                $    | j                          y r   )rJ   )r    exc_typeexc_valexc_tbs       r#   rr   z_Runner.__exit__  s    JJLr&   c                   | j                   rV	 | j                   j                  | j                   j                                | j                   j                          d| _         y y # | j                   j                          d| _         w xY w)NF)r{   rW   shutdown_asyncgensrJ   rj   s    r#   rJ   z_Runner.close  si    zz'JJ11

557 JJ$$&!&DJ  JJ$$&!&DJs   3A$ $#Bc                V    | j                          | j                  sJ | j                  S )zReturn embedded event loop.)r~   r{   rj   s    r#   get_loopz_Runner.get_loop  s"    OO:::::r&   c                t    | j                          | j                  sJ | j                  j                  |      S r   )r~   r{   rW   )r    coros     r#   runz_Runner.run  s-    OO:::::0066r&   c                    | j                   du rt        d      | j                   t        j                         | _         y y )NFzRunner is closed)r{   rw   r9   new_event_looprj   s    r#   r~   z_Runner._lazy_init  s9    zzU""#566zz!$335
 "r&   N)r/   rt   )r/   r   )r   r   r   r   r   r   r/   rt   r/   zasyncio.AbstractEventLoop)r   zCoroutine[Any, Any, _T]r/   r   )r0   r1   r2   __doc__r3   r$   rn   rr   rJ   r   r   r~   r   r&   r#   rz   rz      s.    1EE				'		7
	6r&   rz   )r/   r   )r<   r\   r/   r   )rG   zAwaitable[_T_co]r/   z%TypeGuard[Coroutine[Any, Any, _T_co]])rG   zAwaitable[Any]r/   rt   rs   )rG   zAwaitable[_T]r/   r   )
r!   zCallable[..., _T]r`   r   rZ   r   ra   r   r/   r   r   ),
__future__r   r9   contextvarsr   r]   typingr   r   r   r   r	   r
   r   r   langhelpersr    r   utilr   util.typingr   r   r   r   r   r   r5   hasattrrA   r=   r?   rC   rH   rK   rO   rS   rY   re   rg   rU   Runnerrz   r   r&   r#   <module>r      s:   #   
           *   ! "  #T]	
8 
 & $! *,50x 0 	4(4#4	.4
 %%KG
,4,F !,,, , 	,
 ,^  < nnG(6 (6r&   