o
    ŠågÒ#  ã                   @  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r‡G 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r´dKd+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sèerèe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   ú]/var/www/html/flaskapp/venv/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ÚTimeoutErrorÚCancelledError)r1   r   r   r"   Úis_exit_exception=   s   ÿr8   c                   @  s$   e Zd ZU ded< dZddd	„Zd
S )Ú_AsyncIoGreenletr   r   Tr   r   r   r   c                 C  s"   t  | ||¡ tr|j| _d S d S r   )r   r#   Ú_has_gr_contextr   r    r   r   r"   r#   O   s   ÿz_AsyncIoGreenlet.__init__Nr+   )r,   r-   r.   r/   Ú __sqlalchemy_greenlet_provider__r#   r   r   r   r"   r9   J   s   
 r9   Ú_T_coT)Ú	covariantÚ	awaitableúAwaitable[_T_co]ú%TypeGuard[Coroutine[Any, Any, _T_co]]c                 C  r   r   r   ©r>   r   r   r"   ÚiscoroutineY   s   rB   úAwaitable[Any]ÚNonec                 C  s   t | ƒr
|  ¡  d S d S r   )rB   ÚcloserA   r   r   r"   Ú_safe_cancel_awaitablea   s   ÿrF   c                  C  s   t ƒ } t| ddƒS )Nr;   F)r0   Úgetattr)Úcurrentr   r   r"   Úin_greenleth   s   rI   úAwaitable[_T]c                 C  s0   t ƒ }t|ddƒst| ƒ t d¡‚|j | ¡S )zÓAwaits 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.

    r;   Fzjgreenlet_spawn has not been called; can't call await_only() here. Was IO attempted in an unexpected place?)r0   rG   rF   r   ÚMissingGreenletÚparentr*   )r>   rH   r   r   r"   Ú
await_onlym   s   
ÿ	rM   c                 C  sH   t ƒ }t|ddƒ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`.

    r;   Fz˜greenlet_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   rG   Úget_event_loopÚ
is_runningrF   r   rK   Úrun_until_completerL   r*   )r>   rH   Úloopr   r   r"   Úawait_fallback‡   s   ÿ
rR   F)Ú_require_awaitr   úCallable[..., _T]Úargsr   rS   Úkwargsc                Ï  s‚   �t | tƒ ƒ}d}|j|i |¤Ž}|js6d}z|I dH }W n ty-   |jt ¡ Ž }Y nw | |¡}|jr|r?|s?t 	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.
    FTNz¶The 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.)
r9   r0   r*   r   r2   r'   ÚsysÚexc_infor   ÚAwaitRequired)r   rS   rU   rV   ÚcontextÚswitch_occurredÚresultr)   r   r   r"   Úgreenlet_spawn§   s$   €ü
ôÿr]   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   )rR   rb   Úacquirera   r   r   r"   Ú	__enter__Ý   s   zAsyncAdaptedLock.__enter__r%   r   ÚkwrD   c                 O  s   | j  ¡  d S r   )rb   Úrelease)r!   r%   re   r   r   r"   Ú__exit__â   s   zAsyncAdaptedLock.__exit__N)r&   r_   ©r&   r   )r%   r   re   r   r&   rD   )r,   r-   r.   r   rb   rd   rg   r   r   r   r"   r^   Ö   s
    
r^   ú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   Úget_running_loopÚRuntimeErrorÚget_event_loop_policyrN   r   r   r   r"   rN   æ   s   
þrN   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&   rD   c                 C  s
   d | _ d S r   )rn   ra   r   r   r"   r#   ý   s   
z_Runner.__init__r   c                 C  s   |   ¡  | S r   )Ú
_lazy_initra   r   r   r"   rd      s   z_Runner.__enter__Úexc_typer   Úexc_valÚexc_tbc                 C  s   |   ¡  d S r   )rE   )r!   rp   rq   rr   r   r   r"   rg     s   z_Runner.__exit__c                 C  sF   | j r!z| j  | j  ¡ ¡ W | j  ¡  d| _ d S | j  ¡  d| _ w d S )NF)rn   rP   Úshutdown_asyncgensrE   ra   r   r   r"   rE     s   ÿ


ÿùz_Runner.closeri   c                 C  s   |   ¡  | js	J ‚| jS )zReturn embedded event loop.)ro   rn   ra   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   )ro   rn   rP   )r!   ru   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)rn   rk   r5   Únew_event_loopra   r   r   r"   ro     s
   

ÿz_Runner._lazy_initN)r&   rD   )r&   r   )rp   r   rq   r   rr   r   r&   rD   ©r&   ri   )ru   rv   r&   r   )r,   r-   r.   Ú__doc__r/   r#   rd   rg   rE   rt   rw   ro   r   r   r   r"   rm   ø   s   
 






rm   )r&   r   )r1   r2   r&   r   )r>   r?   r&   r@   )r>   rC   r&   rD   rh   )r>   rJ   r&   r   )
r   rT   rU   r   rS   r   rV   r   r&   r   ry   ),Ú
__future__r   r5   Úcontextvarsr   rW   Útypingr   r   r   r   r   r	   r
   r   Úlanghelpersr   Ú r   Úutilr   Úutil.typingr   r   r   r   r   r   r0   Úhasattrr:   r8   r9   r<   rB   rF   rI   rM   rR   r]   r^   rN   ÚRunnerrm   r   r   r   r"   Ú<module>   sX   




#ý/

