o
    y¬´\²  ã                   @   sì   d 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 G dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZeee
ee	eiZdS )zRelationship dependencies.

é   )Ú
attributes)Úexc)Úsync)Ú
unitofwork)Úutil)Ú
MANYTOMANY)Ú	MANYTOONE)Ú	ONETOMANYé   )Úsqlc                   @   sš   e Zd Zdd„ Zedd„ ƒZdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd%dd„Zd d!„ Zd"d#„ Zd$S )&ÚDependencyProcessorc                 C   s¢   || _ |j| _|j| _|j| _|j| _|j| _|j| _|j| _|j| _|j	| _	| jr/t
j| _nt
j| _| jr;t
j| _nt
j| _|j| _| j jsOt d| j  ¡‚d S )Nz|Can't build a DependencyProcessor for relationship %s. No target attributes to populate between parent and child are present)ÚpropÚcascadeÚmapperÚparentÚ	secondaryÚ	directionÚpost_updateÚpassive_deletesÚpassive_updatesÚenable_typechecksr   ÚPASSIVE_NO_INITIALIZEÚ_passive_delete_flagÚPASSIVE_OFFÚ_passive_update_flagÚkeyÚsynchronize_pairsÚsa_excÚArgumentError©Úselfr   © r!   úK/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/orm/dependency.pyÚ__init__   s0   

þÿÿzDependencyProcessor.__init__c                 C   s   t |j |ƒS ©N)Ú_direction_to_processorr   )Úclsr   r!   r!   r"   Úfrom_relationship6   s   z%DependencyProcessor.from_relationshipc                 C   s   | j j | j¡ |¡S )z¤return True if the given object instance has a parent,
        according to the ``InstrumentedAttribute`` handled by this
        ``DependencyProcessor``.

        )r   Úclass_managerÚget_implr   Ú	hasparent©r    Ústater!   r!   r"   r*   :   s   zDependencyProcessor.hasparentc                 C   s   |  | d¡ dS )z•establish actions and dependencies related to a flush.

        These actions will operate on all relevant states in
        the aggregate.

        TN)Úregister_preprocessor©r    Úuowr!   r!   r"   Úper_property_preprocessorsB   s   z.DependencyProcessor.per_property_preprocessorsc              	   C   sz   t  || dd¡}t  || dd¡}t  || jj¡}t  || jj¡}t  || jj¡}t  || jj¡}|  |||||||¡ d S ©NFT)r   Ú
ProcessAllÚSaveUpdateAllr   Úprimary_base_mapperr   Ú	DeleteAllÚper_property_dependencies)r    r/   Ú
after_saveÚbefore_deleteÚparent_savesÚchild_savesÚparent_deletesÚchild_deletesr!   r!   r"   Úper_property_flush_actionsK   s.   ÿÿÿÿùz.DependencyProcessor.per_property_flush_actionsc                 C   sà  | j j}t ||¡}t ||¡}|rt || dd¡}d|_nt || dd¡}d|_||jvr@||jvs5J ‚|df|dfg}	d}
nd}
|sXt || jj	¡}d }}||jv rWd}nt || jj	¡}d }}||jv rkd}|D ]€}|j
| j j ||j|r~| jntj¡}|s…qm|r˜t || d|¡}|r—t ||¡}nt || d|¡}|r¨t ||¡}|
rÚg }	|D ]+\}}||jvrºd}n|j| \}}|rÌt ||¡df}nt ||¡df}|	 |¡ q®|	D ]\}}|  ||||||||¡ qÜqmdS )zèestablish actions and dependencies related to a flush.

        These actions will operate on all relevant states
        individually.    This occurs only if there are cycles
        in the 'aggregated' version of events.

        TFN)NN)r   r4   r   r3   r5   r2   ÚdisabledÚcyclesr   Úbase_mapperÚmanagerr   ÚimplÚget_all_pendingÚdictr   r   r   ÚProcessStateÚDeleteStateÚSaveUpdateStateÚstatesÚappendÚper_state_dependencies)r    r/   rH   ÚisdeleteÚchild_base_mapperr:   r<   r8   r7   Úchild_actionsÚchild_in_cyclesr9   r;   Úparent_in_cyclesr,   Úsum_Úchild_stateÚchildÚchild_actionÚdeletedÚlistonlyÚchildisdeleter!   r!   r"   Úper_state_flush_actionsg   sŒ   	
ÿ
€
ÿû€

þ
þøÿÓz+DependencyProcessor.per_state_flush_actionsc                 C   ó   dS ©NFr!   ©r    Ú	uowcommitrH   r!   r!   r"   Úpresort_deletes×   ó   z#DependencyProcessor.presort_deletesc                 C   rX   rY   r!   rZ   r!   r!   r"   Úpresort_savesÚ   r]   z!DependencyProcessor.presort_savesc                 C   ó   d S r$   r!   rZ   r!   r!   r"   Úprocess_deletesÝ   r]   z#DependencyProcessor.process_deletesc                 C   r_   r$   r!   rZ   r!   r!   r"   Úprocess_savesà   r]   z!DependencyProcessor.process_savesc                 C   sp   |r| j r	tj}n| jtu rtj}ntj}|D ]}| || j|¡}|r*| 	¡ s* dS q|o7| j
j o7| j|jv S )NT)r   r   r   r   r   ÚPASSIVE_NO_FETCH_RELATEDr   Úget_attribute_historyr   Úemptyr   Ú_is_self_referentialr   Úmappers)r    r[   rH   rK   ÚpassiveÚsÚhistoryr!   r!   r"   Úprop_has_changesã   s   

€ÿ
ýz$DependencyProcessor.prop_has_changesc                 C   s–   | j jr|d u rt d| j f ¡‚|d urG| jj|| j d�sI| jj|dd�r8t d|j| j | jj| jdœ ¡‚t d|j| j | jjdœ ¡‚d S d S )Nz-Can't flush None value found in collection %s)Úallow_subtypesTaE  Attempting to flush an item of type %(x)s as a member of collection "%(y)s". Expected an object of type %(z)s or a polymorphic subclass of this type. If %(x)s is a subclass of %(z)s, configure mapper "%(zm)s" to load this subtype polymorphically, or set enable_typechecks=False to allow any subtype to be accepted for flush. )ÚxÚyÚzÚzmz•Attempting to flush an item of type %(x)s as a member of collection "%(y)s". Expected an object of type %(z)s or a polymorphic subclass of this type.)rl   rm   rn   )r   Úuselistr   Ú
FlushErrorr   Ú_canloadr   Úclass_r+   r!   r!   r"   Ú_verify_canloadù   s8   ÿÿÿ
ü÷ÿýûÿêz#DependencyProcessor._verify_canloadc                 C   ó   t ƒ ‚r$   ©ÚNotImplementedError)r    r,   rR   ÚassociationrowÚ	clearkeysr[   r!   r!   r"   Ú_synchronize"  ó   z DependencyProcessor._synchronizec                 C   s>   | j jsd S tt| jgdd„ | j jD ƒ ƒƒ}| d|ft¡S )Nc                 S   s   g | ]}|j ‘qS r!   )r   )Ú.0Úpr!   r!   r"   Ú
<listcomp>*  s    zCDependencyProcessor._get_reversed_processed_set.<locals>.<listcomp>Úreverse_key)r   Ú_reverse_propertyÚtupleÚsortedr   ÚmemoÚset)r    r/   Úprocess_keyr!   r!   r"   Ú_get_reversed_processed_set%  s   ÿz/DependencyProcessor._get_reversed_processed_setFc                 C   s:   |D ]}|r
|d ur|  |dd„ | jjD ƒ¡  d S qd S )Nc                 S   s   g | ]\}}|‘qS r!   r!   )r|   ÚlÚrr!   r!   r"   r~   2  s    z4DependencyProcessor._post_update.<locals>.<listcomp>)Úregister_post_updater   r   )r    r,   r[   ÚrelatedÚis_m2o_deleterl   r!   r!   r"   Ú_post_update.  s   ÿüÿz DependencyProcessor._post_updatec                 C   ru   r$   rv   ©r    r[   r,   r!   r!   r"   Ú_pks_changed6  r{   z DependencyProcessor._pks_changedc                 C   s   d| j j| jf S )Nz%s(%s))Ú	__class__Ú__name__r   )r    r!   r!   r"   Ú__repr__9  s   zDependencyProcessor.__repr__N)F)r�   Ú
__module__Ú__qualname__r#   Úclassmethodr'   r*   r0   r=   rW   r\   r^   r`   ra   rj   rt   rz   r†   rŒ   rŽ   r‘   r!   r!   r!   r"   r      s&    
	p)
	r   c                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚOneToManyDPc           
   
   C   s˜   | j r/t || jjd¡}t || jjd¡}	|j ||f||f||f||	f|	|f|	|fg¡ d S |j ||f||f||f||f||f||f||fg¡ d S r1   ©r   r   ÚPostUpdateAllr   r4   ÚdependenciesÚupdate)
r    r/   r9   r:   r;   r<   r7   r8   Úchild_post_updatesÚchild_pre_updatesr!   r!   r"   r6   >  s4   

ÿ
ÿúÿùÿz%OneToManyDP.per_property_dependenciesc	                 C   sî   | j rVt || jjd¡}	t || jjd¡}
|s8|r'|j ||f||	fg¡ d S |j ||f||f||	fg¡ d S |rH|j ||
f|
|fg¡ d S |j ||
f|
|fg¡ d S |si|j ||f||f||fg¡ d S |j ||f||fg¡ d S r1   r–   )r    r/   Úsave_parentÚdelete_parentrS   r7   r8   rK   rV   rš   r›   r!   r!   r"   rJ   g  sR   
ÿ
ÿþÿýÿþÿþÿýÿÿz"OneToManyDP.per_state_dependenciesc                 C   s¨   | j j o
| jdk }|D ]D}| || j| j¡}|rQ|jD ]}|d ur;|  |¡du r;| j jr6|j	|dd� q| 	|¡ q|rQ|j
D ]}|d urP|j	|d| jd� qAqd S )NÚallFT©rK   Údelete©Ú	operationr   )r   r    r   rc   r   r   rT   r*   Údelete_orphanÚregister_objectÚ	unchangedr   )r    r[   rH   Úshould_null_fksr,   ri   rR   r!   r!   r"   r\   ª  s*   ÿ
ÿ

€
ÿ€ñzOneToManyDP.presort_deletesc              	   C   s4  |  d| ft¡}|D ]�}|  ||¡}|r| jrtj}ntj}| || j|¡}|r}|j	D ]}|d ur;|j
|dd| jd� q+| |j	¡ |jD ]7}| jjsV|j
|dd| jd� qE|  |¡du r||j
|dd| jd� | j d|¡D ]\}	}
}}|j
|dd� qnqE|r—|r—|jD ]}|d ur–|j
|d| jd	| jd
� q„q
d S )NÚchildren_addedTÚadd)Úcancel_deleter¢   r   Fr    ©rK   r¢   r   rŸ   z	pk changer¡   )rƒ   r„   rŽ   r   r   r   r   rc   r   Úaddedr¤   r   r™   rT   r   r£   r*   r   Úcascade_iteratorr¥   )r    r[   rH   r§   r,   Úpks_changedrg   ri   rR   ÚcÚmÚst_Údct_r!   r!   r"   r^   Å  sf   

ü€
üüÿ€
û€ÓzOneToManyDP.presort_savesc              
   C   sò   | j s| jdksu| d| ft¡}|D ]d}| || j| j¡}|rt|jD ]$}|d urF|  |¡du rF|  	||d d|d¡ | j rF|rF|  
|||g¡ q"| j sN| jjstt|jƒ |¡D ]}|d urs|  	||d d|d¡ | j rs|rs|  
|||g¡ qVqd S d S )Nrž   r§   FT)r   r   rƒ   r„   rc   r   r   rT   r*   rz   rŒ   r   r    r¥   Ú
difference)r    r[   rH   r§   r,   ri   rR   r!   r!   r"   r`   ý  s>   
ÿ
ÿ
€
ÿÿ
ÿ€äzOneToManyDP.process_deletesc              
   C   sÀ   |D ][}|  || jtj¡}|r]|jD ]}|  ||d d|d¡ |d ur-| jr-|  |||g¡ q|jD ]}| j	j
sF|  |¡sF|  ||d d|d¡ q1|  ||¡r]|jD ]}|  ||d d|d¡ qPqd S r1   )rc   r   r   r   r«   rz   r   rŒ   rT   r   r£   r*   rŽ   r¥   ©r    r[   rH   r,   ri   rR   r!   r!   r"   ra   )  s6   
ÿ
ÿ€
ÿÿ€
ÿ€êzOneToManyDP.process_savesc           	   	   C   sr   |}|}|   |¡ |d u s| js| |¡rd S |r%t || j| jj¡ d S t || j	|| j| jj|| j
o5|¡ d S r$   )rt   r   Ú
is_deletedr   Úclearr   r   r   Úpopulater   r   )	r    r,   rR   rx   ry   r[   r­   ÚsourceÚdestr!   r!   r"   rz   D  s(   
ÿÿùzOneToManyDP._synchronizec                 C   ó   t  ||| j| jj¡S r$   ©r   Úsource_modifiedr   r   r   r�   r!   r!   r"   rŽ   [  ó   ÿzOneToManyDP._pks_changedN)r�   r’   r“   r6   rJ   r\   r^   r`   ra   rz   rŽ   r!   r!   r!   r"   r•   =  s    )C8,r•   c                   @   sP   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z		ddd„Z
dS )ÚManyToOneDPc                 C   s"   t  | |¡ | jj t|ƒ¡ d S r$   )r   r#   r   Ú_dependency_processorsrI   ÚDetectKeySwitchr   r!   r!   r"   r#   b  s   zManyToOneDP.__init__c           
   
   C   sŒ   | j r2t || jjd¡}t || jjd¡}	|j ||f||f||f||	f||	f|	|f|	|fg¡ d S |j ||f||f||f||fg¡ d S r1   ©r   r   r—   r   r4   r˜   r™   )
r    r/   r9   r:   r;   r<   r7   r8   Úparent_post_updatesÚparent_pre_updatesr!   r!   r"   r6   f  s0   
ÿ
ÿùÿüÿz%ManyToOneDP.per_property_dependenciesc	                 C   sê   | j rI|s/t || jjd¡}	|r|j ||	f|	|fg¡ d S |j ||f||f||	fg¡ d S t || jjd¡}
|j ||
f|
|f|
|fg¡ d S |sf|s[|j ||f||fg¡ d S |j ||fg¡ d S |rs|j ||fg¡ d S d S r1   rÀ   )r    r/   rœ   r�   rS   r7   r8   rK   rV   rÁ   rÂ   r!   r!   r"   rJ   Ž  sF   
ÿþÿýÿ
ÿýÿÿÿz"ManyToOneDP.per_state_dependenciesc                 C   s¨   | j js| j jrP|D ]G}| || j| j¡}|rO| j jr | ¡ }n| ¡ }|D ](}|d u r-q&|j|dd| j	d� | j
 d|¡}|D ]\}}	}
}|j|
dd� q@q&q
d S d S )NTr    rª   rŸ   )r   r    r£   rc   r   r   ÚsumÚnon_deletedr¤   r   r   r¬   )r    r[   rH   r,   ri   ÚtodeleterR   Útr®   r¯   r°   r±   r!   r!   r"   r\   È  s2   
ÿ
üÿ€ìzManyToOneDP.presort_deletesc                 C   sš   |D ]H}|j |d| jd� | jjrJ| || j| j¡}|rJ|jD ]*}|  |¡du rI|j |dd| jd� | j	 
d|¡}|D ]\}}}	}
|j |	dd� q;qqd S )Nr¨   r¡   FTr    rª   rŸ   )r¤   r   r   r£   rc   r   r   rT   r*   r   r¬   )r    r[   rH   r,   ri   rR   rÆ   r®   r¯   r°   r±   r!   r!   r"   r^   à  s(   
ÿ
ü€îzManyToOneDP.presort_savesc                 C   sz   | j r5| jjs7| jdks9|D ],}|  |d d d|¡ |r4| j r4| || j| j¡}|r4| j||| 	¡ dd� qd S d S d S d S )Nrž   T)r‹   )
r   r   r£   r   rz   rc   r   r   rŒ   rÃ   )r    r[   rH   r,   ri   r!   r!   r"   r`   õ  s&   ÿþ


ÿÿ€ðzManyToOneDP.process_deletesc              
   C   sb   |D ],}|  || jtj¡}|r.|jr"|jD ]}|  ||d d|d¡ q| jr.|  ||| ¡ ¡ qd S )NFr¨   )	rc   r   r   r   r«   rz   r   rŒ   rÃ   r³   r!   r!   r"   ra   
  s   
ÿ
ÿ€õzManyToOneDP.process_savesNc              	   C   s¨   |d u s| j s| |¡rd S |d ur,|d ur,|j |¡s,t dt |¡|| jf ¡ d S |s2|d u r>t	 
|| j| jj¡ d S |  |¡ t	 || j|| j| jj|d¡ d S )NúGObject of type %s not in session, %s operation along '%s' won't proceedF)r   r´   ÚsessionÚ_contains_stater   ÚwarnÚ
mapperutilÚstate_class_strr   r   rµ   r   r   rt   r¶   r   ©r    r,   rR   rx   ry   r[   r¢   r!   r!   r"   rz     s8   	ÿÿ
ÿþÿ
ùzManyToOneDP._synchronizer$   )r�   r’   r“   r#   r6   rJ   r\   r^   r`   ra   rz   r!   r!   r!   r"   r½   a  s    (:ùr½   c                   @   sh   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )r¿   a”  For many-to-one relationships with no one-to-many backref,
    searches for parents through the unit of work when a primary
    key has changed and updates them.

    Theoretically, this approach could be expanded to support transparent
    deletion of objects referenced via many-to-one as well, although
    the current attribute system doesn't do enough bookkeeping for this
    to be efficient.

    c                 C   s<   | j jr| jr	d S ddd„ | j jD ƒv rd S | | d¡ d S )NFc                 s   s   � | ]}|j V  qd S r$   )r   )r|   r   r!   r!   r"   Ú	<genexpr>R  s
   € ÿ
ÿz=DetectKeySwitch.per_property_preprocessors.<locals>.<genexpr>)r   r€   r   r-   r.   r!   r!   r"   r0   M  s   þz*DetectKeySwitch.per_property_preprocessorsc                 C   s6   t  || jj¡}t  || dd¡}|j ||fg¡ d S rY   )r   r3   r   r@   r2   r˜   r™   )r    r/   r9   r7   r!   r!   r"   r=   Z  s   z*DetectKeySwitch.per_property_flush_actionsc                 C   r_   r$   r!   )r    r/   rH   rK   r!   r!   r"   rW   _  r]   z'DetectKeySwitch.per_state_flush_actionsc                 C   r_   r$   r!   rZ   r!   r!   r"   r\   b  r]   zDetectKeySwitch.presort_deletesc                 C   s   | j s|  ||¡ d S d S r$   ©r   Ú_process_key_switches)r    r/   rH   r!   r!   r"   r^   e  s   ýzDetectKeySwitch.presort_savesc                 C   s"   |s| j r|  ||¡}t|ƒS dS rY   )r   Ú_key_switchersÚbool)r    r/   rH   rK   Údr!   r!   r"   rj   k  s   
z DetectKeySwitch.prop_has_changesc                 C   s   J ‚r$   r!   rZ   r!   r!   r"   r`   r  r]   zDetectKeySwitch.process_deletesc                 C   s   | j sJ ‚|  ||¡ d S r$   rÏ   rZ   r!   r!   r"   ra   u  s   
zDetectKeySwitch.process_savesc                 C   sZ   |  d| fdd„ ¡\}}| |¡}|D ]}||vr*|  ||¡r%| |¡ q| |¡ q|S )NÚpk_switchersc                   S   s   t ƒ t ƒ fS r$   )r„   r!   r!   r!   r"   Ú<lambda>  s    z0DetectKeySwitch._key_switchers.<locals>.<lambda>)rƒ   ÚunionrŽ   r¨   )r    r/   rH   ÚswitchedÚnotswitchedÚ	allstatesrh   r!   r!   r"   rÑ   }  s   ÿ

€zDetectKeySwitch._key_switchersc              
   C   s¶   |   ||¡}|rW|jj ¡ D ]J}t|j| jjƒsq|j}| | j	¡j
||| jd�}|tjurV|d urVt || j	 ¡}||v rV| |d| j¡ t || j|| j| jj|| j¡ qd S d S )N)rg   F)rÑ   rÈ   Úidentity_mapÚ
all_statesÚ
issubclassrs   r   rD   r)   r   Úgetr   r   ÚPASSIVE_NO_RESULTÚinstance_stater¤   r   r   r¶   r   r   r   )r    Údeplistr[   Ú	switchersr,   Údict_rŠ   Úrelated_stater!   r!   r"   rÐ   ‹  s8   ÿ
ÿù€íz%DetectKeySwitch._process_key_switchesc                 C   s    t |jƒot ||| j| jj¡S r$   )rÒ   r   r   r»   r   r   r   r�   r!   r!   r"   rŽ   ª  s   ÿzDetectKeySwitch._pks_changedN)r�   r’   r“   Ú__doc__r0   r=   rW   r\   r^   rj   r`   ra   rÑ   rÐ   rŽ   r!   r!   r!   r"   r¿   A  s    r¿   c                   @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚManyToManyDPc              
   C   s:   |j  ||f||f||f||f||f||f||fg¡ d S r$   ©r˜   r™   )r    r/   r9   r:   r;   r<   r7   r8   r!   r!   r"   r6   ±  s   ôÿz&ManyToManyDP.per_property_dependenciesc	           	      C   s\   |s |r|j  ||f||fg¡ d S |j  ||f||fg¡ d S |j  ||f||fg¡ d S r$   ræ   )	r    r/   rœ   r�   rS   r7   r8   rK   rV   r!   r!   r"   rJ   Í  s   ÿÿÿz#ManyToManyDP.per_state_dependenciesc                 C   s*   | j s|D ]}| || j| j¡ qd S d S r$   )r   rc   r   r   )r    r[   rH   r,   r!   r!   r"   r\   æ  s   
ÿûzManyToManyDP.presort_deletesc           
      C   s¶   | j s|D ]}|  ||¡r| || jtj¡}q| jjsd S |D ]9}| || jtj¡}|rX|j	D ](}|  
|¡du rW|j|dd| jd� | j d|¡D ]\}}}}	|j|dd� qIq/qd S )NFTr    rª   rŸ   )r   rŽ   rc   r   r   r   r   r£   r   rT   r*   r¤   r   r   r¬   )
r    r[   rH   r,   ri   rR   r®   r¯   r°   r±   r!   r!   r"   r^   ò  s8   
ÿ€
ÿ
üÿ€ðzManyToManyDP.presort_savesc              
      sÎ   g }g }g }|   |¡}tƒ }|D ]C‰ | ˆ | j| j¡}|rS| ¡ D ]#}	|	d u s1|d ur2ˆ |	f|v r2q!i }
|  ˆ |	|
d|d¡s?q!| |
¡ q!| ‡ fdd„| ¡ D ƒ¡ q|d ur]| |¡ |  	||||¡ d S )NFr    c                 3   ó   � | ]}|ˆ fV  qd S r$   r!   ©r|   r®   ©r,   r!   r"   rÎ   3  ó   € z/ManyToManyDP.process_deletes.<locals>.<genexpr>)
r†   r„   rc   r   r   Ú	non_addedrz   rI   r™   Ú	_run_crud)r    r[   rH   Úsecondary_deleteÚsecondary_insertÚsecondary_updateÚ	processedÚtmpri   rR   rx   r!   ré   r"   r`     s@   

ÿú€
ÿzManyToManyDP.process_deletesc              
      s€  g }g }g }|   |¡}tƒ }|D ]œ‰ | j o|  |ˆ ¡}|r"tj}	ntj}	| ˆ | j|	¡}
|
r¬|
j	D ]}|d ur?ˆ |f|v r?q2i }|  
ˆ ||d|d¡sLq2| |¡ q2|
jD ]}|d urbˆ |f|v rbqUi }|  
ˆ ||d|d¡soqU| |¡ qU| ‡ fdd„|
j	|
j D ƒ¡ |r¬|
jD ]!}i }t ˆ | j|d| jj¡ t || j|d| jj¡ | |¡ qŠq|d ur¶| |¡ |  ||||¡ d S )NFr¨   r    c                 3   rç   r$   r!   rè   ré   r!   r"   rÎ   f  rê   z-ManyToManyDP.process_saves.<locals>.<genexpr>Úold_)r†   r„   r   rŽ   r   r   r   rc   r   r«   rz   rI   rT   r™   r¥   r   r   r   r   r   Úsecondary_synchronize_pairsrì   )r    r[   rH   rí   rî   rï   rð   rñ   Úneed_cascade_pksrg   ri   rR   rx   r!   ré   r"   ra   <  s|   
ÿ
ÿ
ú 
ûû€
ÿzManyToManyDP.process_savesc                    s  |j  | j¡}|r?|d ‰ | j tj‡ fdd„| jjD ƒŽ ¡}| ||¡}| 	¡ r?|j
t|ƒkr?t d| jjt|ƒ|j
f ¡‚|rw|d ‰ | j tj‡ fdd„| jjD ƒŽ ¡}| ||¡}| 	¡ rw|j
t|ƒkrwt d| jjt|ƒ|j
f ¡‚|r†| j ¡ }| ||¡ d S d S )Né    c                    s,   g | ]}|j ˆ v r|tj|j |jd �k‘qS )©Útype_©r   r   Ú	bindparamÚtyperè   ©rx   r!   r"   r~   �  s
    
þz*ManyToManyDP._run_crud.<locals>.<listcomp>zRDELETE statement on table '%s' expected to delete %d row(s); Only %d were matched.c                    s0   g | ]}|j ˆ v r|tjd |j  |jd�k‘qS )rò   rö   rø   rè   rû   r!   r"   r~   §  s
    
þzRUPDATE statement on table '%s' expected to update %d row(s); Only %d were matched.)ÚtransactionÚ
connectionr   r   r    r   Úand_r®   ÚexecuteÚsupports_sane_multi_rowcountÚrowcountÚlenr   ÚStaleDataErrorÚdescriptionr™   Úinsert)r    r[   rî   rï   rí   rý   Ú	statementÚresultr!   rû   r"   rì   „  s^   
þÿÿ	ÿýþÿ

þÿÿ	ÿýþÿ

þzManyToManyDP._run_crudc                 C   s€   |   |¡ |d u rdS |d ur(|j |¡s(|js&t dt |¡|| jf ¡ dS t	 
|| j|| jj¡ t	 
|| j|| jj¡ dS )NFrÇ   T)rt   rÈ   rÉ   rT   r   rÊ   rË   rÌ   r   r   Úpopulate_dictr   r   r   ró   rÍ   r!   r!   r"   rz   Á  s*   
þÿÿüzManyToManyDP._synchronizec                 C   r¹   r$   rº   r�   r!   r!   r"   rŽ   â  r¼   zManyToManyDP._pks_changedN)r�   r’   r“   r6   rJ   r\   r^   r`   ra   rì   rz   rŽ   r!   r!   r!   r"   rå   °  s    "(H=!rå   N)rä   Ú r   r   r   r   r   rË   Ú
interfacesr   r   r	   r   r   Úobjectr   r•   r½   r¿   rå   r%   r!   r!   r!   r"   Ú<module>   s8     &  & ao  ;ý