o
     Zh#                     @  s  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rG dd deZdIddZnd dlmZ d dlmZ ee dZdJd!d"ZG d#d$ d$eZ ed%d&d'Z!erdKd+d,Z"nej"Z"dLd/d0Z#dMd1d2Z$dNd4d5Z%dNd6d7Z&d8d9dOd@dAZ'G dBdC dCZ(dPdEdFZ)eserej*Z+dS G dGdH dHZ+dS )Q    )annotationsN)Context)Any)	Awaitable)Callable)	Coroutine)Optional)TYPE_CHECKING)TypeVar)Union   )memoized_property   )exc)py311)Literal)Protocol)Self)	TypeGuard_Tc                   @  s<   e Zd ZU ded< ded< ddd	ZdddZdddZdS )greenletbooldeadzOptional[Context]
gr_contextfnCallable[..., Any]driverc                 C     d S N selfr   r   r   r   X/var/www/html/lang_env/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py__init__(       zgreenlet.__init__argr   returnc                 G  r   r   r   )r!   r%   r   r   r"   throw*      zgreenlet.throwvaluec                 C  r   r   r   )r!   r)   r   r   r"   switch-   r(   zgreenlet.switchNr   r   r   r   )r%   r   r&   r   )r)   r   r&   r   )__name__
__module____qualname____annotations__r#   r'   r*   r   r   r   r"   r   $   s   
 

r   r&   c                   C  r   r   r   r   r   r   r"   
getcurrent0   r$   r0   )r0   )r   r   eBaseExceptionr   c                 C  s   t | t pt | tjtjfS r   )
isinstance	ExceptionasyncioTimeoutErrorZCancelledError)r1   r   r   r"   is_exit_exception=   s   r7   c                   @  s    e Zd ZU ded< d
ddZd	S )_AsyncIoGreenletr   r   r   r   r   r   c                 C  s(   t | || || _tr|j| _d S d S r   )r   r#   r   _has_gr_contextr   r    r   r   r"   r#   M   s
   z_AsyncIoGreenlet.__init__Nr+   )r,   r-   r.   r/   r#   r   r   r   r"   r8   J   s   
 r8   _T_coT)	covariant	awaitableAwaitable[_T_co]%TypeGuard[Coroutine[Any, Any, _T_co]]c                 C  r   r   r   r<   r   r   r"   iscoroutineX   s   r@   Awaitable[Any]Nonec                 C  s   t | r
|   d S d S r   )r@   closer?   r   r   r"   _safe_cancel_awaitable`   s   rD   c                  C  s   t  } t| tS r   )r0   r3   r8   )currentr   r   r"   in_greenletg   s   
rF   Awaitable[_T]c                 C  s.   t  }t|tst|  td|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.

    zjgreenlet_spawn has not been called; can't call await_only() here. Was IO attempted in an unexpected place?)r0   r3   r8   rD   r   MissingGreenletr   r*   )r<   rE   r   r   r"   
await_onlyl   s   

	rI   c                 C  sF   t  }t|tst }| rt|  td|| S |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`.

    zgreenlet_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?)r0   r3   r8   get_event_loopZ
is_runningrD   r   rH   run_until_completer   r*   )r<   rE   loopr   r   r"   await_fallback   s   

rM   F)_require_awaitr   Callable[..., _T]argsr   rN   kwargsc                  s   t | t }d}z1|j|i |}|js7d}z|I dH }W n ty.   |jt  }Y nw ||}|jrW |`n|`w |rG|sGt	
d|S )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.)r8   r0   r*   r   r2   r'   sysexc_infor   r   ZAwaitRequired)r   rN   rP   rQ   contextZswitch_occurredresultr)   r   r   r"   greenlet_spawn   s*   
rV   c                   @  s.   e Zd ZedddZdddZdddZdS )AsyncAdaptedLockr&   asyncio.Lockc                 C  s   t  S r   )r5   Lockr!   r   r   r"   mutex   s   zAsyncAdaptedLock.mutexr   c                 C  s   t | j S r   )rM   r[   acquirerZ   r   r   r"   	__enter__   s   zAsyncAdaptedLock.__enter__r%   r   kwrB   c                 O  s   | j   d S r   )r[   release)r!   r%   r^   r   r   r"   __exit__   s   zAsyncAdaptedLock.__exit__N)r&   rX   r&   r   )r%   r   r^   r   r&   rB   )r,   r-   r.   r   r[   r]   r`   r   r   r   r"   rW      s
    
rW   asyncio.AbstractEventLoopc                   C  s*   zt  W S  ty   Y nw t   S )z}vendor asyncio.get_event_loop() for python 3.7 and above.

    Python 3.10 deprecates get_event_loop() as a standalone.

    )r5   Zget_running_loopRuntimeErrorZget_event_loop_policyrJ   r   r   r   r"   rJ      s   
rJ   c                   @  s`   e Zd ZU dZded< dddZdd	d
Zd ddZdddZd!ddZ	d"ddZ
dddZdS )#_Runnerz#Runner implementation for test onlyz6Union[None, asyncio.AbstractEventLoop, Literal[False]]_loopr&   rB   c                 C  s
   d | _ d S r   )re   rZ   r   r   r"   r#      s   
z_Runner.__init__r   c                 C  s   |    | S r   )
_lazy_initrZ   r   r   r"   r]     s   z_Runner.__enter__exc_typer   exc_valexc_tbc                 C  s   |    d S r   )rC   )r!   rg   rh   ri   r   r   r"   r`     s   z_Runner.__exit__c                 C  sF   | j r!z| j | j   W | j   d| _ d S | j   d| _ w d S )NF)re   rK   Zshutdown_asyncgensrC   rZ   r   r   r"   rC   	  s   


z_Runner.closerb   c                 C  s   |    | js	J | jS )zReturn embedded event loop.)rf   re   rZ   r   r   r"   get_loop  s   
z_Runner.get_loopcoroCoroutine[Any, Any, _T]r   c                 C  s   |    | js	J | j|S r   )rf   re   rK   )r!   rk   r   r   r"   run  s   
z_Runner.runc                 C  s.   | j du r	td| j d u rt | _ d S d S )NFzRunner is closed)re   rc   r5   Znew_event_looprZ   r   r   r"   rf     s
   

z_Runner._lazy_initN)r&   rB   )r&   r   )rg   r   rh   r   ri   r   r&   rB   r&   rb   )rk   rl   r&   r   )r,   r-   r.   __doc__r/   r#   r]   r`   rC   rj   rm   rf   r   r   r   r"   rd      s   
 






rd   )r&   r   )r1   r2   r&   r   )r<   r=   r&   r>   )r<   rA   r&   rB   ra   )r<   rG   r&   r   )
r   rO   rP   r   rN   r   rQ   r   r&   r   rn   ),
__future__r   r5   Zcontextvarsr   rR   typingr   r   r   r   r   r	   r
   r   Zlanghelpersr    r   utilr   Zutil.typingr   r   r   r   r   r   r0   hasattrr9   r7   r8   r:   r@   rD   rF   rI   rM   rV   rW   rJ   ZRunnerrd   r   r   r   r"   <module>   sX   





#2

