
    ,h                       S r SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr	  SS	K
Jr  SS
K
Jr  SSK
Jr  SSKJr  SSKJr  SSKJr   " S S5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r\\\\\\0rg)zRelationship dependencies.

    )annotations   )
attributes)exc)sync)
unitofwork)util)
MANYTOMANY)	MANYTOONE)	ONETOMANY   )sqlc                      \ rS rSrS r\S 5       rS rS rS r	S r
S rS	 rS
 rS rS rS rS rS rSS jrS rS rSrg)DependencyProcessor   c                (   Xl         UR                  U l        UR                  U l        UR                  U l        UR                  U l        UR
                  U l        UR                  U l        UR                  U l        UR                  U l        UR                  U l	        U R                  (       a  [        R                  U l        O[        R                  U l        U R                  (       a  [        R                  U l        O[        R                  U l        U R                  R                  < SUR                   < 3U l        UR                   U l        U R                   R$                  (       d#  [&        R(                  " SU R                   -  5      eg )N_z|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	_sort_keykeysort_keysynchronize_pairssa_excArgumentError)selfr   s     Q/var/www/auris/envauris/lib/python3.13/site-packages/sqlalchemy/orm/dependency.py__init__DependencyProcessor.__init__   s   	||kkkk++#33#33!%!7!7(2(H(HD%(2(>(>D%(2(H(HD%(2(>(>D%#';;#8#8$((C88yy**&&$&*ii0  +    c                4    [         UR                     " U5      $ N)_direction_to_processorr   )clsr   s     r)   from_relationship%DependencyProcessor.from_relationship;   s    &t~~6t<<r,   c                ~    U R                   R                  R                  U R                  5      R	                  U5      $ )zreturn True if the given object instance has a parent,
according to the ``InstrumentedAttribute`` handled by this
``DependencyProcessor``.

)r   class_managerget_implr#   	hasparentr(   states     r)   r6   DependencyProcessor.hasparent?   s.     {{((11$((;EEeLLr,   c                (    UR                  U S5        g)z}establish actions and dependencies related to a flush.

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

TN)register_preprocessorr(   uows     r)   per_property_preprocessors.DependencyProcessor.per_property_preprocessorsG   s     	!!$-r,   c           	        [         R                  " XSS5      n[         R                  " XSS5      n[         R                  " XR                  R                  5      n[         R                  " XR
                  R                  5      n[         R                  " XR                  R                  5      n[         R                  " XR
                  R                  5      nU R                  UUUUUUU5        g NFT)r   
ProcessAllSaveUpdateAllr   primary_base_mapperr   	DeleteAllper_property_dependencies)r(   r=   
after_savebefore_deleteparent_saveschild_savesparent_deleteschild_deletess           r)   per_property_flush_actions.DependencyProcessor.per_property_flush_actionsP   s    **3eTB
"--ctD!//00
 !..00
 $--00
 #,,00
 	&&	
r,   c                   U R                   R                  n[        R                  " X5      n[        R                  " X5      nU(       a   [        R
                  " XSS5      nSUl        O[        R
                  " XSS5      nSUl        XQR                  ;  a  XaR                  ;  d   eUS4US4/n	Sn
OSn
U(       d?  [        R                  " XR                  R                  5      nS=pXR                  ;   a  SnO>[        R                  " XR                  R                  5      nS=pXR                  ;   a  SnU GH  nUR                  U R                     R                  R                  UUR                  U(       a  U R                  O[         R"                  5      nU(       d  Ml  U(       a6  [        R$                  " XSU5      nW(       a  [        R&                  " X5      nO5[        R$                  " XSU5      nW(       a  [        R(                  " X5      nU
(       a~  / n	U Hv  u  nnUUR*                  ;  a  SnOLUR*                  U   u  nnU(       a  [        R&                  " UU5      S4nO[        R(                  " UU5      S4nU	R-                  U5        Mx     W	 H  u  nnU R/                  UUUUWWUU5        M      GM     g)zestablish 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   rD   r   rC   rE   rB   disabledcyclesr   base_mappermanagerr#   implget_all_pendingdictr   r   r   ProcessStateDeleteStateSaveUpdateStatestatesappendper_state_dependencies)r(   r=   rZ   isdeletechild_base_mapperrJ   rL   rH   rG   child_actionschild_in_cyclesrI   rK   parent_in_cyclesr8   sum_child_statechildchild_actiondeletedlistonlychildisdeletes                         r)   per_state_flush_actions+DependencyProcessor.per_state_flush_actionsl   s    !KK;; ..sF",,SD
 &11#T4HM%)M"#..s%FJ"&J jj(
 !

222 *51M43HIM#O"O %33[[,,L .21Nzz)#' '11#{{7N7NON(,,L+#'  E ==*//??

   --#99D  * 7 74 O#%/%;%;C%GN'44SuM
##-#=#=c#IL "*.&K"#**4'3.1jj.E+(" * 6 6sK H $,L !+ : :3 L %,L "((6 +/& 0=+m++ " !!	 0=_ r,   c                    gNF r(   	uowcommitrZ   s      r)   presort_deletes#DependencyProcessor.presort_deletes       r,   c                    grl   rm   rn   s      r)   presort_saves!DependencyProcessor.presort_saves   rr   r,   c                    g r.   rm   rn   s      r)   process_deletes#DependencyProcessor.process_deletes       r,   c                    g r.   rm   rn   s      r)   process_saves!DependencyProcessor.process_saves   ry   r,   c                   U(       a  U R                   (       a"  [        R                  [        R                  -  nOEU R                  [
        L a  [        R                  nO![        R                  [        R                  -  nU H?  nUR                  XPR                  U5      nU(       d  M(  UR                  5       (       a  M?    g   U=(       a;    U R                  R                  (       + =(       a    U R                  UR                  ;   $ )NT)r   r   r   INCLUDE_PENDING_MUTATIONSr   r   PASSIVE_NO_FETCH_RELATEDr    get_attribute_historyr#   emptyr   _is_self_referentialr   mappers)r(   ro   rZ   r]   passiveshistorys          r)   prop_has_changes$DependencyProcessor.prop_has_changes   s    4//00667  ^^y( !99G &&)M)MM  A  55a7KGww}}   5		6665KK9#4#44r,   c                R   U R                   R                  (       a'  Uc$  [        R                  " SU R                   < 35      eUb  U R                  R                  XR                  (       + S9(       d  U R                  R                  USS9(       aP  [        R                  " SUR                  U R                   U R                  R                  U R                  S.-  5      e[        R                  " SUR                  U R                   U R                  R                  S.-  5      eg g )Nz+Can't flush None value found in collection )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zmzAttempting 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.)r   r   r   )r   uselistr   
FlushErrorr   _canloadr   class_r7   s     r)   _verify_canload#DependencyProcessor._verify_canload
  s    99..#'99/  t{{';';&<&<"< (< (
 {{##E$#?nn= #\\!YY![[//"kk	 $ nn! #\\!YY![[//	 -(
r,   c                    [        5       er.   NotImplementedError)r(   r8   rd   associationrow	clearkeysro   s         r)   _synchronize DependencyProcessor._synchronize3      !##r,   c           	        U R                   R                  (       d  g [        [        U R                  /U R                   R                   Vs/ s H  o"R                  PM     sn-   5      5      nUR                  SU4[        5      $ s  snf )Nreverse_key)r   _reverse_propertytuplesortedr#   memoset)r(   r=   pprocess_keys       r)   _get_reversed_processed_set/DependencyProcessor._get_reversed_processed_set6  sj    yy**DHH:		0K0K L0K10K LLM
 xx4c:: !Ms   Bc           
         U HI  nU(       a  Uc  M  UR                  XR                  R                   VVs/ s H  u  pgUPM	     snn5          g    g s  snnf r.   )register_post_updater   r%   )r(   r8   ro   relatedis_m2o_deleter   lrs           r)   _post_update DependencyProcessor._post_update?  sL    A AM..))*E*EF*E$!A*EF   Gs   Ac                    [        5       er.   r   r(   ro   r8   s      r)   _pks_changed DependencyProcessor._pks_changedG  r   r,   c                R    U R                   R                  < SU R                  < S3$ )N())	__class____name__r   )r(   s    r)   __repr__DependencyProcessor.__repr__J  s    >>22DII>>r,   )r   r!   r   r   r   r#   r   r   r   r   r   r   r   r$   N)F)r   
__module____qualname____firstlineno__r*   classmethodr1   r6   r>   rM   ri   rp   rt   rw   r{   r   r   r   r   r   r   r   __static_attributes__rm   r,   r)   r   r      sk    : = =M.
8pd@'R$;$?r,   r   c                  D    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
rg)OneToManyDPiN  c           
     t   U R                   (       a~  [        R                  " XR                  R                  S5      n[        R                  " XR                  R                  S5      n	UR
                  R                  X64X&4Xh4Xy4X4X4/5        g UR
                  R                  X&4Xc4Xe4X44XT4Xs4Xu4/5        g rA   r   r   PostUpdateAllr   rD   dependenciesupdate)
r(   r=   rI   rJ   rK   rL   rG   rH   child_post_updateschild_pre_updatess
             r)   rF   %OneToManyDP.per_property_dependenciesO  s     !+!9!9[[44e" !+ 8 8[[44d! ## -!.4"6&7&6	 ##!.-/ 1"3"0"2
r,   c	                   U R                   (       a  [        R                  " XR                  R                  S5      n	[        R                  " XR                  R                  S5      n
U(       dI  U(       a   UR
                  R                  XE4XY4/5        g UR
                  R                  X%4XE4XY4/5        g U(       a   UR
                  R                  Xj4X4/5        g UR
                  R                  Xj4X4/5        g U(       d"  UR
                  R                  X%4XT4X$4/5        g UR
                  R                  Xd4XC4/5        g rA   r   )r(   r=   save_parentdelete_parentre   rG   rH   r]   rh   r   r   s              r)   r\   "OneToManyDP.per_state_dependenciesx  sN    !+!9!9[[44e" !+ 8 8[[44d!  $$++)6'< $$++(5)6'< !$$++*>.> $$++*>.> ## -. / ##.0MNr,   c                (   U R                   R                  (       + =(       a    U R                  S:X  + nU H  nUR                  X@R                  U R
                  5      nU(       d  M2  UR                   H\  nUc  M  U R                  U5      SL d  M  U R                   R                  (       a  UR                  USS9  MK  UR                  U5        M^     U(       d  M  UR                   H#  nUc  M  UR                  USU R                  S9  M%     M     g )NallFTr]   delete	operationr   )r   r   r   r   r#   r   rf   r6   delete_orphanregister_object	unchangedr   r(   ro   rZ   should_null_fksr8   r   rd   s          r)   rp   OneToManyDP.presort_deletes  s    
 ###ID,@,@E(I 	 E55xx!:!:G w$__E(T^^E-Be-K<<55%55ed5K%55e< - #?!(!2!2 ,%55 %		 6  "3 r,   c           
        UR                  SU 4[        5      nU R                  R                  (       + =(       a    U R                  S:X  + nU GH  nU R                  X5      nU(       a  U R                  (       a"  [        R                  [        R                  -  nO![        R                  [        R                  -  nUR                  XPR                  U5      nU(       Ga  UR                   H$  n	U	c  M  UR                  U	SSU R                  S9  M&     UR!                  UR                  5        UR"                   H  n	U R                  R                  (       d'  U(       a  UR                  U	SSU R                  S9  MC  ME  U R%                  U	5      SL d  M[  UR                  U	SSU R                  S9  U R&                  R)                  SU	5       H  u  ppUR                  USS	9  M     M     U(       d  GM  U(       d  GM  UR*                   H/  n	U	c  M  UR                  U	SU R                  S
U R                  S9  M1     GM     g )Nchildren_addedr   Tadd)cancel_deleter   r   Fr   r]   r   r   r   z	pk changer   )r   r   r   r   r   r   r   r   r   r~   r    r   r#   addedr   r   r   rf   r6   r   cascade_iteratorr   )r(   ro   rZ   r   r   r8   pks_changedr   r   rd   cmst_dct_s                 r)   rt   OneToManyDP.presort_saves  s   ")94(@#F *** 2((E1 	
 E++I=K$"6"644 ::;  ** ::; 
  55eXXwOG$]]E(!11!*.&+!%	 2  + %%gmm4$__E<<55*%55 %).*2%)YY	 6  + .%7!11!%)&.!%	 2  04{{/K/K$e0OA# &55cD5I0! -* {7!(!2!2 ,%55 % % $ 4 4*5%)YY 6  "3e r,   c           
        U R                   (       d  U R                  S:X  Gdg  UR                  SU 4[        5      nU GHG  nUR	                  X@R
                  U R                  5      nU(       d  M3  UR                   Hb  nUc  M  U R                  U5      SL d  M  U R                  XFS SUS5        U R                   (       d  MF  U(       d  MO  U R                  XaU/5        Md     U R                   (       d  U R                  R                  (       a  M  [        UR                  5      R                  U5       HL  nUc  M  U R                  XFS SUS5        U R                   (       d  M0  U(       d  M9  U R                  XaU/5        MN     GMJ     g g )Nr   r   FT)r   r   r   r   r   r#   r   rf   r6   r   r   r   r   r   
difference)r(   ro   rZ   r   r8   r   rd   s          r)   rw   OneToManyDP.process_deletes  sM    4#7#75#@&^^-=t,DcJN#9988T%>%> 7!(!- $u 5 > -- %dD)U  $///EE $ 1 1%UG L "1 ''t||/B/B/B%():):%;%F%F*&E  %0 $ 1 1$)$i!" $(#3#3#3$($5$5(-5'%&&#   $Ar,   c           
        U R                   R                  (       + =(       a    U R                  S:X  + nU GH1  nUR                  X@R                  [
        R                  5      nU(       d  M7  UR                   HC  nU R                  XFS SUS5        Uc  M  U R                  (       d  M0  U R                  XaU/5        ME     UR                   HV  nU(       d  M  U R                   R                  (       a  M)  U R                  U5      (       a  MA  U R                  XFS SUS5        MX     U R                  X5      (       d  GM	  UR                   H  nU R                  XFS SUS5        M     GM4     g )Nr   FT)r   r   r   r   r#   r   r   r   r   r   r   rf   r6   r   r   r   s          r)   r{   OneToManyDP.process_savesD  s1   *** 2((E1 	
 E55xx!A!AG w$]]E%%dE9e (T-=-=-=))%UGD + %__E' $ : : : $u 5 5))!$i - $$Y66!(!2!2))!$y$ "3/ r,   c           
        UnUnU R                  U5        Ub'  U R                  (       d  UR                  U5      (       a  g U(       a6  [        R                  " XR
                  U R                  R                  5        g [        R                  " UU R                  UU R
                  U R                  R                  UU R                  =(       a    U5        g r.   )r   r   
is_deletedr   clearr   r   r%   populater   r   )	r(   r8   rd   r   r   ro   r   sourcedests	            r)   r   OneToManyDP._synchronizef  s     U#<  Y%9%9$%?%?JJt[[$))*E*EFMM		++$$4r,   c                n    [         R                  " XU R                  U R                  R                  5      $ r.   r   source_modifiedr   r   r%   r   s      r)   r   OneToManyDP._pks_changed}  *    ##dkk499+F+F
 	
r,   rm   N)r   r   r   r   rF   r\   rp   rt   rw   r{   r   r   r   rm   r,   r)   r   r   N  s0    'R?B6BH%&X D.
r,   r   c                  J    \ rS rSrS rS rS rS rS rS r	S r
 SS
 jrSrg	)ManyToOneDPi  c                    [         R                  X5        U R                  R                   H'  nUR                  R                  [        U5      5        M)     g r.   )r   r*   r   self_and_descendants_dependency_processorsr[   DetectKeySwitch)r(   r   r   s      r)   r*   ManyToOneDP.__init__  s=    $$T0kk66F))001FG 7r,   c           
     l   U R                   (       a  [        R                  " XR                  R                  S5      n[        R                  " XR                  R                  S5      n	UR
                  R                  X64X&4Xh4Xi4Xy4X4X4/5        g UR
                  R                  X64Xb4X%4XE4/5        g rA   r   r   r   r   rD   r   r   )
r(   r=   rI   rJ   rK   rL   rG   rH   parent_post_updatesparent_pre_updatess
             r)   rF   %ManyToOneDP.per_property_dependencies  s     ",":":[[44e# ",!9!9[[44d" ## -!.54"7'7'8
 ## -.!1#3	r,   c	                   U R                   (       a  U(       dt  [        R                  " XR                  R                  S5      n	U(       a   UR
                  R                  XY4X4/5        g UR
                  R                  X%4XE4XY4/5        g [        R                  " XR                  R                  S5      n
UR
                  R                  Xj4X4X4/5        g U(       dE  U(       d   UR
                  R                  XE4XR4/5        g UR
                  R                  XR4/5        g U(       a  UR
                  R                  X44/5        g g rA   r   )r(   r=   r   r   re   rG   rH   r]   rh   r  r  s              r)   r\   "ManyToOneDP.per_state_dependencies  s@    &0&>&>88%'# !$$++'=0? $$++(5)6'= &0%=%=88$&"   ''&;+;+:    ''"/*1JK   ''*)B(CD   ''-)F(GH r,   c           	        U R                   R                  (       d  U R                   R                  (       a  U H  nUR                  X0R                  U R
                  5      nU(       d  M2  U R                   R                  (       a  UR                  5       nOUR                  5       nU H\  nUc  M  UR                  USSU R                  S9  U R                  R                  SU5      nU H  u  ppUR                  U
SS9  M     M^     M     g g )NTr   r   r   )r   r   r   r   r#   r   sumnon_deletedr   r   r   r   )r(   ro   rZ   r8   r   todeleterd   tr   r   r   r   s               r)   rp   ManyToOneDP.presort_deletes  s    <<$,,"<"<#9988T%>%> 7||11#*;;=#*#6#6#8!) =$!11!%)&.!%	 2  !KK885I/0OA#%55cD5I 01 "*   #=r,   c           	        U H  nUR                  USU R                  S9  U R                  R                  (       d  M;  UR	                  X0R
                  U R                  5      nU(       d  Mj  UR                   Hm  nU R                  U5      SL d  M  UR                  USSU R                  S9  U R                  R                  SU5      nU H  u  pxpUR                  U	SS9  M     Mo     M     g )Nr   r   FTr   r   r   )r   r   r   r   r   r#   r   rf   r6   r   r   )r(   ro   rZ   r8   r   rd   r
  r   r   r   r   s              r)   rt   ManyToOneDP.presort_saves   s    E%%eu499%M||)))#9988T%>%> 7!(>>%0E9%55 %)-*2%)YY	 6  !% < <Xu MA34c ) 9 9# 9 M 45 "1 r,   c                   U R                   (       a  U R                  R                  (       d  U R                  S:X  d  U H  nU R	                  US S SU5        U(       d  M!  U R                   (       d  M4  UR                  X0R                  U R                  5      nU(       d  Mc  U R                  X1UR                  5       SS9  M     g g g g )Nr   T)r   )
r   r   r   r   r   r   r#   r   r   r  )r(   ro   rZ   r8   r   s        r)   rw   ManyToOneDP.process_deletes  s    LL..((E1
  !!%tT9E5T---'==xx)B)BG w))!gkkm4 *    2 / r,   c           
        U H  nUR                  X0R                  [        R                  5      nU(       d  M6  UR                  (       a)  UR                   H  nU R                  X5S SUS5        M     O'UR                  (       a  U R                  US S SUS5        U R                  (       d  M  U R                  X1UR                  5       5        M     g )NFr   Tr   )
r   r#   r   r   r   r   rf   r   r   r  )r(   ro   rZ   r8   r   rd   s         r)   r{   ManyToOneDP.process_saves)  s    E55xx!A!AG w==!())!$y% "/ __%%tT4H ###%%eF r,   Nc           	     T   Ub'  U R                   (       d  UR                  U5      (       a  g Ube  Ubb  UR                  R                  U5      (       dB  [        R
                  " S[        R                  " U5      < SU< SU R                  < S35        g U(       d  Uc6  [        R                  " XR                  U R                  R                  5        g U R                  U5        [        R                  " UU R                  UU R                  U R                  R                  US5        g )NObject of type  not in session,  operation along '' won't proceedF)r   r   session_contains_stater	   warn
mapperutilstate_class_strr   r   r   r   r%   r   r   r   r(   r8   rd   r   r   ro   r   s          r)   r   ManyToOneDP._synchronize;  s     =  Y%9%9%%@%@ !!%%55e<<II --e4iL
 JJukk499+F+FG  'MM		++r,   rm   r.   )r   r   r   r   r*   rF   r\   rp   rt   rw   r{   r   r   rm   r,   r)   r   r     s6    H
%N6IpJ0N*(G2 &r,   r   c                  Z    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rSrg)r   id  ax  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                    U R                   R                  (       a4  U R                  (       a  g SS U R                   R                   5       ;   a  g UR                  U S5        g )NFc              3  :   #    U  H  nUR                   v   M     g 7fr.   )r   ).0r   s     r)   	<genexpr>=DetectKeySwitch.per_property_preprocessors.<locals>.<genexpr>u  s       ; (( ;s   )r   r   r   r;   r<   s     r)   r>   *DetectKeySwitch.per_property_preprocessorsp  sO    99&&##  $		 ; ;  !!$.r,   c                    [         R                  " XR                  R                  5      n[         R                  " XSS5      nUR
                  R                  X#4/5        g rl   )r   rC   r   rR   rB   r   r   )r(   r=   rI   rG   s       r)   rM   *DetectKeySwitch.per_property_flush_actions}  sJ    !//[[5L5LM**3eUC
,!; <=r,   c                    g r.   rm   )r(   r=   rZ   r]   s       r)   ri   'DetectKeySwitch.per_state_flush_actions  ry   r,   c                    g r.   rm   rn   s      r)   rp   DetectKeySwitch.presort_deletes  ry   r,   c                J    U R                   (       d  U R                  X!5        g g r.   r   _process_key_switches)r(   r=   rZ   s      r)   rt   DetectKeySwitch.presort_saves  s     ## &&v3 $r,   c                l    U(       d-  U R                   (       a  U R                  X5      n[        U5      $ grl   )r   _key_switchersbool)r(   r=   rZ   r]   ds        r)   r    DetectKeySwitch.prop_has_changes  s)    D00##C0A7Nr,   c                     er.   rm   rn   s      r)   rw   DetectKeySwitch.process_deletes  s    ur,   c                L    U R                   (       d   eU R                  X!5        g r.   r,  rn   s      r)   r{   DetectKeySwitch.process_saves  s!    
 ####""65r,   c                    UR                  SU 4S 5      u  p4UR                  U5      nU HD  nXe;  d  M
  U R                  X5      (       a  UR                  U5        M3  UR                  U5        MF     U$ )Npk_switchersc                 *    [        5       [        5       4$ r.   )r   rm   r,   r)   <lambda>0DetectKeySwitch._key_switchers.<locals>.<lambda>  s    SUCENr,   )r   unionr   r   )r(   r=   rZ   switchednotswitched	allstatesr   s          r)   r0  DetectKeySwitch._key_switchers  sm     #T"$:!
 NN;/	A!$$S,,LLOOOA&  r,   c           
        U R                  X!5      nU(       Gal  UR                  R                  R                  5        GHB  n[	        UR
                  U R                  R
                  5      (       d  M5  UR                  nUR                  U R                  5      R                  XEU R                  S9nU[        R                  Ld  M  Uc  M  U R                  R                  (       a  U(       d  M  US   nOUn[        R                   " U5      nX;   d  M  UR#                  USU R$                  5        [&        R(                  " UU R*                  UU R                  U R                  R,                  UU R$                  5        GME     g g )N)r   r   F)r0  r  identity_map
all_states
issubclassr   r   rV   r5   r#   getr!   r   PASSIVE_NO_RESULTr   r   instance_stater   r   r   r   r   r%   )	r(   deplistro   	switchersr8   dict_r   related_objrelated_states	            r)   r-  %DetectKeySwitch._process_key_switches  s3   ''	;	 #**77BBD!%,,0B0BCC

..266$*C*C 7  :#?#??+yy((&$&-aj&-$.$=$=k$JM$1!11!5$*>*> ) KK! KK II77% 00- E r,   c                    [        UR                  5      =(       a6    [        R                  " XU R                  U R
                  R                  5      $ r.   )r1  r#   r   r   r   r   r%   r   s      r)   r   DetectKeySwitch._pks_changed  s9    EII 
4#7#7dkk499+F+F$
 	
r,   rm   N)r   r   r   r   __doc__r>   rM   ri   rp   rt   r   rw   r{   r0  r-  r   r   rm   r,   r)   r   r   d  s?    	/>
46#J
r,   r   c                  J    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSrg)ManyToManyDPi  c           
     V    UR                   R                  X&4X64Xe4Xr4Xt4Xu4Xs4/5        g r.   r   r   )r(   r=   rI   rJ   rK   rL   rG   rH   s           r)   rF   &ManyToManyDP.per_property_dependencies  sI     	*)+ -/.,	
r,   c	                    U(       dG  U(       a   UR                   R                  X%4XT4/5        g UR                   R                  X%4XE4/5        g UR                   R                  Xd4Xc4/5        g r.   rU  )	r(   r=   r   r   re   rG   rH   r]   rh   s	            r)   r\   #ManyToManyDP.per_state_dependencies  st       ''!.0JK   ''!.0JK ##.0NOr,   c                    U R                   (       d0  U H)  nUR                  X0R                  U R                  5        M+     g g r.   )r   r   r#   r   )r(   ro   rZ   r8   s       r)   rp   ManyToManyDP.presort_deletes  s;     ##  //88T%>%>  	 $r,   c           	     b   U R                   (       dK  U HE  nU R                  X5      (       d  M  UR                  X0R                  [        R
                  5        MG     U R                  R                  (       d  g U H  nUR                  X0R                  [        R                  5      nU(       d  M6  UR                   Hk  nU R                  U5      SL d  M  UR                  USSU R                  S9  U R                  R                  SU5       H  u  pgpUR                  USS9  M     Mm     M     g )NFTr   r   r   )r   r   r   r#   r   r    r   r   r   rf   r6   r   r   r   r   )
r(   ro   rZ   r8   r   rd   r   r   r   r   s
             r)   rt   ManyToManyDP.presort_saves  s   ##  $$Y6633xx)?)?   ||)) E55xx!A!AG w$__E~~e,5!11!%)&.!%	 2  04{{/K/K$e0OA# &55cD5I0 - r,   c           
       ^ / n/ n/ nU R                  U5      n[        5       nU H  mUR                  TU R                  U R                  5      nU(       d  M3  UR                  5        HC  n	U	b  Ub
  TU	4U;   a  M  0 n
U R                  TU	U
SUS5      (       d  M2  UR                  U
5        ME     UR                  U4S jUR                  5        5       5        M     Ub  UR                  U5        U R                  XXS5        g )NFr   c              3  *   >#    U  H  oT4v   M
     g 7fr.   rm   r!  r   r8   s     r)   r"  /ManyToManyDP.process_deletes.<locals>.<genexpr>[  s     C/B!u:/B   )
r   r   r   r#   r   	non_addedr   r[   r   	_run_crud)r(   ro   rZ   secondary_deletesecondary_insertsecondary_update	processedtmpr   rd   r   r8   s              @r)   rw   ManyToManyDP.process_deletes<  s   44Y?	eE  55txx!:!:G w$..0E}!-5%.I2M %'N,,&!   !$++N; 1" 

Cw/@/@/BCC1 4  S!)9	
r,   c           
       ^ / n/ n/ nU R                  U5      n[        5       nU GH  mU R                  (       + =(       a    U R                  UT5      nU(       a"  [        R
                  [        R                  -  n	O![        R                  [        R                  -  n	UR                  TU R                  U	5      n
U
(       d  M  U
R                   H?  nUb
  TU4U;   a  M  0 nU R                  TXSUS5      (       d  M.  UR                  U5        MA     U
R                   H@  nUb
  TU4U;   a  M  0 nU R                  TUUSUS5      (       d  M/  UR                  U5        MB     UR                  U4S jU
R                  U
R                  -    5       5        U(       d  GMy  U
R                   H  n0 n[         R                  " TU R"                  USU R$                  R&                  5        [         R                  " UU R(                  USU R$                  R*                  5        UR                  U5        M     GM     Ub  UR                  U5        U R-                  XXS5        g )NFr   r   c              3  *   >#    U  H  oT4v   M
     g 7fr.   rm   r_  s     r)   r"  -ManyToManyDP.process_saves.<locals>.<genexpr>  s     O/N!u:/Nra  old_)r   r   r   r   r   r    r~   r   r   r#   r   r   r[   rf   r   r   r   r   r   r%   r   secondary_synchronize_pairsrc  )r(   ro   rZ   rd  re  rf  rg  rh  need_cascade_pksr   r   rd   r   r8   s                @r)   r{   ManyToManyDP.process_savesd  s=   44Y?	eE#'#7#77  D<M<M5=  ** ::;  44 ::;   55eTXXwOGw$]]E ,%91L %'N,,ueY  !$++N; + %__E ,%91L %'N,,&!   !$++N; - 

Ow}}w/NOO##!(!2!2)+! KK*" II77 ! KK*" IIAA )//?# "3W |  S!)9	
r,   c                v   UR                   R                  U R                  5      nU(       Ga"  US   nU R                  R	                  5       R                  [        R                  " U R                  R                   Vs/ s HA  nUR                  U;   d  M  U[        R                  " UR                  UR                  S9:H  PMC     sn6 5      nUR                  X5      n	U	R                  5       (       a\  U	R                  [        U5      :w  aC  [         R"                  " SU R                  R$                  [        U5      U	R                  4-  5      eU(       Ga%  US   nU R                  R'                  5       R                  [        R                  " U R                  R                   Vs/ s HD  nUR                  U;   d  M  U[        R                  " SUR                  -   UR                  S9:H  PMF     sn6 5      nUR                  X5      n	U	R                  5       (       a\  U	R                  [        U5      :w  aC  [         R"                  " SU R                  R$                  [        U5      U	R                  4-  5      eU(       a,  U R                  R)                  5       nUR                  X5        g g s  snf s  snf )Nr   )type_zRDELETE statement on table '%s' expected to delete %d row(s); Only %d were matched.rm  zRUPDATE statement on table '%s' expected to update %d row(s); Only %d were matched.)transaction
connectionr   r   r   wherer   and_r   r#   	bindparamtypeexecutesupports_sane_multi_rowcountrowcountlenr   StaleDataErrordescriptionr   insert)
r(   ro   re  rf  rd  rt  r   r   	statementresults
             r)   rc  ManyToManyDP._run_crud  sM    **55dkkB
-a0N--/55 "&!1!1!1A55N2 @S]]155??!1I  ''	DF 3355//S)9%::((7 22,-  -a0N--/55 "&!1!1!1A55N2 IS]]6AEE>HH!1I  ''	DF 3355//S)9%::((7 22,-  --/Iy; a4s   >J10J1(J6 3J6c           	        U R                  U5        Uc  gUbs  UR                  R                  U5      (       dS  UR                  (       dA  [        R
                  " S[        R                  " U5      < SU< SU R                  < S35        g[        R                  " XR                  X0R                  R                  5        [        R                  " UU R                  UU R                  R                  5        g)NFr  r  r  r  T)r   r  r  rf   r	   r  r  r  r   r   populate_dictr   r%   r   rn  r  s          r)   r   ManyToManyDP._synchronize  s     	U# =Y%6%6%F%Fu%M%M==		 "11%8)TYYP
 ;;		0K0K	
 	KKII11		
 r,   c                n    [         R                  " XU R                  U R                  R                  5      $ r.   r   r   s      r)   r   ManyToManyDP._pks_changed  r   r,   rm   N)r   r   r   r   rF   r\   rp   rt   rw   r{   rc  r   r   r   rm   r,   r)   rS  rS    s6    
62
 JD&
PK
Z;<z@
r,   rS  N)rQ  
__future__r    r   r   r   r   r	   r  
interfacesr
   r   r   r&   r   r   r   r   r   rS  r/   rm   r,   r)   <module>r     s    #       " ! !   n? n?b	r
% r
j	^% ^Br
) r
jx
& x
x	 {{ r,   