o
    g+                     @  s  U d Z ddlmZ ddl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ZddlmZ ddlmZ ejrvddlmZ ddlmZ edef Zeeeeef f Zeeeef ZedddZG dd dZ e
d Z!e"e#Z$de%d< 	 e
def Z&e"e#Z'de%d< 	 d9d$d%Z(d:d+d,Z)d;d-d.Z*d<d3d4Z+d=d5d6Z,G d7d8 d8ee Z-dS )>aJ  Provides managed registration services on behalf of :func:`.listen`
arguments.

By "managed registration", we mean that event listening functions and
other objects can be added to various collections in such a way that their
membership in all those collections can be revoked at once, based on
an equivalent :class:`._EventKey`.

    )annotationsN)Any)Callable)cast)Deque)Dict)Generic)Iterable)Optional)Tuple)TypeVar)Union   )exc)util   )RefCollection)
dispatcher._ETEventTarget)boundc                   @  s   e Zd ZU dZdZded< dS )r   zrepresents an event target, that is, something we can listen on
    either with that target as a class or as an instance.

    Examples include:  Connection, Mapper, Table, Session,
    InstrumentedAttribute, Engine, Pool, Dialect.

     zdispatcher[Any]dispatchN)__name__
__module____qualname____doc__	__slots____annotations__r   r   r   [/var/www/html/ecg_monitoring/venv/lib/python3.10/site-packages/sqlalchemy/event/registry.pyr   2   s   
 )zweakref.ref[RefCollection[Any]]weakref.ref[_ListenerFnType]z6Dict[_EventKeyTupleType, _RefCollectionToListenerType]_key_to_collectionr    z>Dict[weakref.ref[RefCollection[Any]], _ListenerToEventKeyType]_collection_to_keyrefweakref.ref[Any]returnNonec                 C  s^   t r| t vrd S td| } t | }| D ]}|tv r,t| }||  |s,t| qd S )Nz'weakref.ref[RefCollection[EventTarget]])r"   r   popvaluesr!   )r#   listener_to_keykeydispatch_regr   r   r   _collection_gcedg   s   



r,   	event_key_EventKey[_ET]ownerRefCollection[_ET]boolc                 C  sH   | j }t| }|j}t| j}||v rdS |||< t| }|||< dS )NFT)_keyr!   r#   weakref
_listen_fnr"   )r-   r/   r*   r+   	owner_ref
listen_refr)   r   r   r   _stored_in_collectionx   s   r7   c                 C  sZ   | j }t| }t| j}|j}||d  |st|= |tv r+t| }||d  d S d S N)r2   r!   r3   r#   r4   r'   r"   )r-   r/   r*   r+   r6   r5   r)   r   r   r   _removed_from_collection   s   r9   newowneroldownerelementsIterable[_ListenerFnType]c              	   C  s   |sd S |j }| j }t| }t| }|D ]<}t |}z|| }	W n	 ty*   Y qw zt|	 }
W n	 ty:   Y qw ||
v rH|
| |ksGJ n||
|< |	||< qd S r8   )r#   r"   r3   KeyErrorr!   )r:   r;   r<   oldowner_refnewowner_refold_listener_to_keynew_listener_to_key	listen_fnr6   r*   r+   r   r   r   _stored_in_collection_multi   s.   

rD   c                 C  sT   |sd S | j }t| }|D ]}t |}|| }t| }||d  |s't|= qd S r8   )r#   r"   r3   r!   r'   )r/   r<   r5   r)   rC   r6   r*   r+   r   r   r   _clear   s   
rE   c                   @  s   e Zd ZU dZdZded< ded< ded< d	ed
< ded< ded< 	d;d<ddZed=ddZd>ddZ	d?ddZ
d@dd ZdAd!d"ZdBd$d%Z	&	&	&		&dCdDd-d.ZedEd/d0ZdFd5d6ZdGd7d8ZdFd9d:ZdS )H	_EventKeyz$Represent :func:`.listen` arguments.)target
identifierfnfn_keyfn_wrapdispatch_targetr   rG   strrH   _ListenerFnTyperI   _ListenerFnKeyTyperJ   r   rL   Optional[_ListenerFnType]_fn_wrapNc                 C  sP   || _ || _|| _t|tjrt|jt|jf| _	nt|| _	|| _
|| _d S r8   )rG   rH   rI   
isinstancetypes
MethodTypeid__func____self__rJ   rK   rL   )selfrG   rH   rI   rL   rQ   r   r   r   __init__   s   

z_EventKey.__init__r%   _EventKeyTupleTypec                 C  s   t | j| j| jfS r8   )rU   rG   rH   rJ   rX   r   r   r   r2      s   z_EventKey._keyrK   r.   c                 C  s(   || j u r| S t| j| j| j| j|dS N)rQ   )r4   rF   rG   rH   rI   rL   )rX   rK   r   r   r   with_wrapper  s   
z_EventKey.with_wrapperc                 C  s(   || j u r| S t| j| j| j|| jdS r\   )rL   rF   rG   rH   rI   rK   )rX   rL   r   r   r   with_dispatch_target  s   
z_EventKey.with_dispatch_targetargskwr&   c                 O  s   | dd}| dd}| dd}| j| j| j}}}t|j|}	|	||}
| |
} t| jjj| j}t	|dr@|
  |sD|rW| tj| j|dj|i | d S | jjj| g|R i | d S )NonceF_once_unless_exceptionnamed_sa_warn)retry_on_exception)r'   rL   rH   r4   getattrr   _adjust_fn_specr]   _eventshasattrrd   r   	only_oncelisten_listen)rX   r_   r`   ra   once_unless_exceptionrc   rG   rH   rI   dispatch_collectionadjusted_fnstub_functionr   r   r   rk     s4   



 z_EventKey.listenc                 C  st   | j }|tvrtd| j| j| jf t|}| D ]\}}| }| }|d ur7|d ur7|	| 
| qd S )Nz*No listeners found for event %s / %r / %s )r2   r!   r   InvalidRequestErrorrG   rH   rI   r'   itemsremover]   )rX   r*   r+   collection_reflistener_ref
collectionlistener_fnr   r   r   rs   <  s   
z_EventKey.remover1   c                 C  s
   | j tv S )z6Return True if this event key is registered to listen.)r2   r!   r[   r   r   r   containsM  s   
z_EventKey.containsF	propagateinsertrc   retvalOptional[bool]asyncioc           
      C  sV   | j | j}}t|j|}||j}	|r|	  |r#|	| | d S |	| | d S r8   )rL   rH   rf   r   
for_modify_set_asynciorz   append)
rX   ry   rz   rc   r{   r}   rG   rH   rn   r~   r   r   r   base_listenQ  s   z_EventKey.base_listenc                 C  s   | j p| jS r8   )rK   rI   r[   r   r   r   r4   f  s   z_EventKey._listen_fnr/   r0   list_Deque[_ListenerFnType]c                 C     t | |r|| j dS dS NTF)r7   r   r4   rX   r/   r   r   r   r   append_to_listj     
z_EventKey.append_to_listc                 C  s   t | | || j d S r8   )r9   rs   r4   r   r   r   r   remove_from_listu  s   
z_EventKey.remove_from_listc                 C  r   r   )r7   
appendleftr4   r   r   r   r   prepend_to_list}  r   z_EventKey.prepend_to_listr8   )
rG   r   rH   rM   rI   rN   rL   r   rQ   rP   )r%   rZ   )rK   rN   r%   r.   )rL   r   r%   r.   )r_   r   r`   r   r%   r&   )r%   r&   )r%   r1   )FFFNF)ry   r1   rz   r1   rc   r1   r{   r|   r}   r1   r%   r&   )r%   rN   )r/   r0   r   r   r%   r1   )r/   r0   r   r   r%   r&   )r   r   r   r   r   r   rY   propertyr2   r]   r^   rk   rs   rx   r   r4   r   r   r   r   r   r   r   rF      s:   
 	



 


rF   )r#   r$   r%   r&   )r-   r.   r/   r0   r%   r1   )r-   r.   r/   r0   r%   r&   )r:   r0   r;   r0   r<   r=   r%   r&   )r/   r0   r<   r=   r%   r&   ).r   
__future__r   collectionsrS   typingr   r   r   r   r   r   r	   r
   r   r   r   r3    r   r   TYPE_CHECKINGattrr   baser   rN   intrO   rM   rZ   r   r   _RefCollectionToListenerTypedefaultdictdictr!   r   _ListenerToEventKeyTyper"   r,   r7   r9   rD   rE   rF   r   r   r   r   <module>   s^   	






$