o
    =a&!                     @   s   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 e	e
Z	 e	e
Z	 dd Zd	d
 Zdd Zdd Zdd ZG dd d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`.

    )absolute_importN   )exc)utilc                 C   sT   t r| t vrd S t | }| D ]}|tv r't| }||  |s't| qd S N)_collection_to_keypopvalues_key_to_collection)reflistener_to_keykeydispatch_reg r   O/var/www/html/gps/gps/lib/python3.10/site-packages/sqlalchemy/event/registry.py_collection_gced5   s   


r   c                 C   sH   | j }t| }|j}t| j}||v rdS |||< t| }|||< dS )NFT)_keyr
   r   weakref
_listen_fnr   )	event_keyownerr   r   	owner_ref
listen_refr   r   r   r   _stored_in_collectionC   s   r   c                 C   sX   | j }t| }t| j}|j}||d  |st|= |tv r*t| }|| d S d S r   )r   r
   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   _removed_from_collectionV   s   r   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 r   )r   r   r   KeyErrorr
   )	newowneroldownerelementsold_listener_to_keynew_listener_to_key	listen_fnr   r   r   r   r   r   _stored_in_collection_multig   s.   

r"   c                 C   sT   |sd S | j } t|  }|D ]}t |}|| }t| }|| d  |s't|= qd S r   )r   r   r   r
   r   )r   r   r   r!   r   r   r   r   r   r   _clear   s   
r#   c                   @   s   e Zd ZdZdZdddZedd Zdd	 Zd
d Z	dd Z
dd Zdd Z					dddZedd Zdd Zdd Zdd ZdS )	_EventKeyz$Represent :func:`.listen` arguments.)target
identifierfnfn_keyfn_wrapdispatch_targetNc                 C   sP   || _ || _|| _t|tjrt|jt|jf| _	nt|| _	|| _
|| _d S r   )r%   r&   r'   
isinstancetypes
MethodTypeid__func____self__r(   r)   r*   )selfr%   r&   r'   r*   _fn_wrapr   r   r   __init__   s   

z_EventKey.__init__c                 C   s   t | j| j| jfS r   )r.   r%   r&   r(   r1   r   r   r   r      s   z_EventKey._keyc                 C   s(   || j u r| S t| j| j| j| j|dS N)r2   )r   r$   r%   r&   r'   r*   )r1   r)   r   r   r   with_wrapper   s   
z_EventKey.with_wrapperc                 C   s(   || j u r| S t| j| j| j|| jdS r5   )r*   r$   r%   r&   r'   r)   )r1   r*   r   r   r   with_dispatch_target   s   
z_EventKey.with_dispatch_targetc                 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   r*   r&   r   getattrdispatch_adjust_fn_specr6   _eventshasattrr;   r   	only_oncelisten_listen)r1   argskwr8   once_unless_exceptionr:   r%   r&   r'   dispatch_collectionadjusted_fnstub_functionr   r   r   rC      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 )r   r
   r   InvalidRequestErrorr%   r&   r'   r   itemsremover6   )r1   r   r   collection_reflistener_ref
collectionlistener_fnr   r   r   rM      s   
z_EventKey.removec                 C   s
   | j tv S )z6Return True if this event key is registered to listen.)r   r
   r4   r   r   r   contains   s   
z_EventKey.containsFc           
      C   sV   | j | j}}t|j|}||j}	|r|	  |r#|	| | d S |	| | d S r   )r*   r&   r=   r>   
for_modify_set_asyncioinsertappend)
r1   	propagaterU   r:   retvalasyncior%   r&   rH   rS   r   r   r   base_listen   s   	z_EventKey.base_listenc                 C   s   | j p| jS r   )r)   r'   r4   r   r   r   r     s   z_EventKey._listen_fnc                 C      t | |r|| j dS dS NTF)r   rV   r   r1   r   list_r   r   r   append_to_list     
z_EventKey.append_to_listc                 C   s   t | | || j d S r   )r   rM   r   r]   r   r   r   remove_from_list   s   
z_EventKey.remove_from_listc                 C   r[   r\   )r   
appendleftr   r]   r   r   r   prepend_to_list$  r`   z_EventKey.prepend_to_listr   )FFFNF)__name__
__module____qualname____doc__	__slots__r3   propertyr   r6   r7   rC   rM   rR   rZ   r   r_   ra   rc   r   r   r   r   r$      s,    
	
 

r$   )rg   
__future__r   collectionsr,   r    r   r   defaultdictdictr
   r   r   r   r   r"   r#   objectr$   r   r   r   r   <module>   s"   


 