
    g                       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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 d0dZd Zd Zd Zd Z d Z!ddddddZ"ddddd Z#d! Z$d" Z%d#dd#d$d%Z&d#ddd&d'Z'd( Z(d) Z)d* Z*d+ Z+d, Z,d- Z-d. Z.d/ Z/y)1zprivate module containing functions used to emit INSERT, UPDATE
and DELETE statements on behalf of a :class:`_orm.Mapper` and its descending
mappers.

The functions here are called only by the unit of work functions
in unitofwork.py.

    )annotations)chain)groupby)zip_longestN   )
attributes)exc)loading)sync)	state_str   )future)sql)util)cursor)	operators)BooleanClauseList)LABEL_STYLE_TABLENAME_PLUS_COLFc           	        |s.| j                   s"t        | |      D ]  }t        | |g|d        yg }g }t        | ||      D ]:  \  }}}}	}
}}|
s|r|j	                  ||||	|f       &|j	                  ||||	f       < | j
                  j                         D ]K  \  }}||j                  vrt        ||      }t        |||      }t        | ||||       t        | ||||       M t        | |t        d |D        d |D                     y)a;  Issue ``INSERT`` and/or ``UPDATE`` statements for a list
    of objects.

    This is called within the context of a UOWTransaction during a
    flush operation, given a list of states to be flushed.  The
    base mapper in an inheritance hierarchy handles the inserts/
    updates for all descendant mappers.

    T)singleNc              3  4   K   | ]  \  }}}}||||d f  yw)FN ).0state
state_dictmapper
connections        [/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py	<genexpr>zsave_obj.<locals>.<genexpr>i   s+      ;UJ
 
FJ>s   c              3  6   K   | ]  \  }}}}}||||d f  yw)TNr   )r   r   r   r   r   update_version_ids         r   r   zsave_obj.<locals>.<genexpr>m   s4      	% 
FJ=	s   )batch_sort_statessave_obj_organize_states_for_saveappend_sorted_tablesitems_pks_by_table_collect_insert_commands_collect_update_commands_emit_update_statements_emit_insert_statements _finalize_insert_update_commandsr   )base_mapperstatesuowtransactionr   r   states_to_updatestates_to_insertdict_r   r   has_identity
row_switchr!   tableinsertupdates                   r   r$   r$   (   so    +++!+v6 	HE[5'>$G	H 
#;	GH 	:##vz3DE ##UE6:$FGH  %3399; 
v,,,)%1AB)E#3
 	 	
 	 	
#
2 %?O	 &		
    c                    t        t        | ||            }| j                  j                         D ]>  \  j                  vrfd|D        }t        | |||      }t        | ||       @ y)z\Issue UPDATE statements on behalf of a relationship() which
    specifies post_update.

    c           
   3     K   | ]G  \  }}}}|j                   v r2||||j                  j                  ||j                        nd f I y wN)r)   version_id_col#_get_committed_state_attr_by_column)r   r   r   
sub_mapperr   r   r7   s        r   r   zpost_update.<locals>.<genexpr>   so      
 :z:z
000 
 ,,8 >>z6+@+@ 
s   AAN)list _organize_states_for_post_updater'   r(   r)   _collect_post_update_commands_emit_post_update_statements)r/   r0   r1   post_update_colsr2   r9   r   r7   s         @@r   post_updaterF   {   s     (fnM %3399;  
v,,,
 >N
$ /8H
 	%	
5 
r:   c                ~   t        t        | ||            }| j                  }t        t        |j	                                     D ]L  }||   }||j
                  vr|j                  r|j                  r0t        | |||      }t        | ||||       N |D ]%  \  }}	}}
}|j                  j                  ||
|       ' y)zIssue ``DELETE`` statements for a list of objects.

    This is called within the context of a UOWTransaction during a
    flush operation.

    N)rA   _organize_states_for_deleter'   reversedkeysr)   inheritspassive_deletes_collect_delete_commands_emit_delete_statementsdispatchafter_delete)r/   r0   r1   states_to_deletetable_to_mapperr7   r   deleter   r   r   r!   s               r   
delete_objrT      s     #KH "00O$33567 
 ',,,__!7!7)0@
 	 	

2 
@ 	$$VZ?@r:   c              #    K   t        | ||      D ]  \  }}}}t        |j                        }|j                  xs |j                  |      }dx}	}
|s|j                  j                  |||       n|j                  j                  |||       |j                  r|j                  |||       |s||j                  j                  v r|j                  j                  |   }t        j                  |      }|j                  |      s{|j                  |      s1t        j                  dt!        |      d|dt!        |             n9| j#                  d|t!        |      t!        |             |j%                  |       |}	|s|	r;|j&                  /|j)                  |	r|	n||	r|	j*                  n||j&                        }
||||||	|
f  yw)aT  Make an initial pass across a set of states for INSERT or
    UPDATE.

    This includes splitting out into distinct lists for
    each, calling before_insert/before_update, obtaining
    key information for each state including its dictionary,
    mapper, the connection to use for the execution per state,
    and the identity flag.

    NzNew instance z with identity key z$ conflicts with persistent instance zPdetected row switch for identity %s.  will update %s, remove %s from transaction)_connections_for_statesboolkey_identity_key_from_staterO   before_insertbefore_update_validate_polymorphic_identitysessionidentity_mapr   instance_statewas_already_deleted
is_deletedr   warnr   
_log_debugremove_state_actionsr>   r?   dict)r/   r0   r1   r   r4   r   r   r5   instance_keyr6   r!   instanceexistings                r   r%   r%      s     -D^V- A
(ufj EIIyyJF$C$CE$J)--
& OO))&*eDOO))&*eD0011&%G  6 6 C CC%--::<HH!00:H!55h?%00:II %U+\9X;NP  **& %!%(!(+ #77A!)JJF,A,A,M & J J(
e#-
5%%! 
 	
sA
s   GGc                    t        | ||      S )zMake an initial pass across a set of states for UPDATE
    corresponding to post_update.

    This includes obtaining key information for each state
    including its dictionary, mapper, the connection to use for
    the execution per state.

    )rV   )r/   r0   r1   s      r   rB   rB   #  s     #;GGr:   c              #     K   t        | ||      D ]Y  \  }}}}|j                  j                  |||       |j                  |j	                  |||j                        }nd}|||||f [ yw)zMake an initial pass across a set of states for DELETE.

    This includes calling out before_delete and obtaining
    key information for each state including its dictionary,
    mapper, the connection to use for the execution per state.

    N)rV   rO   before_deleter>   r?   )r/   r0   r1   r   r4   r   r   r!   s           r   rH   rH   /  s      -D^V- D(ufj 	%%fj%@  , & J Juf33! !%eVZ1BCCDs   A+A-r   )bulkreturn_defaultsrender_nullsinclude_bulk_keysc          	   #    K   |D ]<  \  }}}| |j                   vri }	i }
|j                  |    }|j                  |    }t        |      j	                        D ]n  }|   }||   }|||vr|s|sHt        |d      st        |t        j                        r"t        |d      r|j                         n||
|<   `||	|j                  <   p |sO|j                  |    j                  |	      j                  |
D cg c]  }|j                   c}      D ]  }d|	|<   	 |r|rf|j                  |    j                  |	      }|j                  j!                  |j"                  |       r|j$                  |    j                  |	      }nd}ndx}}|j&                  durO|j(                  C|j(                  |j*                  |    v r(|j'                  d      |	|j(                  j                  <   |rN|j,                  r&|	j/                  |j0                  |j2                         |r|	j5                  fd|D               ||	|||
||f ? yc c}w w)zSIdentify sets of values to use in INSERT statements for a
    list of states.

    N__clause_element__TFc              3  ,   K   | ]  }||   f  y wr=   r   r   kr   s     r   r   z+_collect_insert_commands.<locals>.<genexpr>  s     LQq*Q-0L   )r)   _propkey_to_col_insert_cols_evaluating_nonesetintersectionhasattr
isinstancer   ClauseElementrq   rX   _insert_cols_as_none
difference_pk_keys_by_tableissubsetr/   _prefer_eager_defaultsdialect_server_default_col_keysversion_id_generatorr>   _cols_by_table_set_polymorphic_identity
setdefault_polymorphic_attr_keypolymorphic_identityr9   )r7   r3   rl   rm   rn   ro   r   r   r   paramsvalue_paramspropkey_to_col	eval_nonepropkeyvaluecolccolkeyhas_all_pkshas_all_defaultsr   s                       @r   r*   r*   F  s     2B U
-z6:,,,//677>	>*77
C 	(Gw'E )C}I!5l34eS%6%67 u&:; ,,. S! #(sww	("  ++E2F#L9qQUU9:&
 "&v&  !2259BB6JK!!88""E $*#B#B$(6" ! $( -11{ ''u4%%1%%)>)>u)EE060K0K1F6((,,- //!!00&2M2M !L:KLL 	
 		
YU
L :s   C5I8I
EI)rl   use_orm_update_stmtro   c             #  h
  K   |D ]  \  }}}}	||j                   vr|j                   |   }
||j                  }ni }|j                  |   }|rWt        |      j	                        j                  |j                  |         D ci c]  }||   j                  |    }}d}ni }t        |      j	                  |j                        D ]  }|   }||   }t        |d      st        |t        j                        r"t        |d      r|j                         n|||<   U|j                  |   j                  j!                  ||j                  |         dus|||j                  <    |j"                  j$                  du r|j&                  |   j)                  |      }nd}|	|j*                  |j,                  |   v r|su|ss|sq|j.                  j1                         D ]R  }|j                  |j                     j                  j3                  |t4        j6                        }|j8                  sR n 4|j*                  }| xr | }|	||j:                  <   |s|j                  |vr/|j<                  dur!|j=                  |	      }|||j                  <   n&|j<                  du r|r|	||j                  <   n|s|sd}d}|rt        |      j	                  |j                  |         D ci c]!  }||   j:                  j?                  |      # c}t@        jB                  j	                  j1                               r\tE        jF                  ddjI                  fd|
D               dd	
      i |
D ]!  }|j.                  |   j                  }|j                  |   j                  j3                  |t4        jJ                        }|j8                  r{|jL                  rd||f| j4                  v r;d}|j8                  d   |j:                  <   |jO                  |j                  d       n?|jL                  d   |j:                  <   ||v rd}n|jP                  d   |j:                  <   |j:                     	tS        jT                  d|d|       |r|jW                  fd|D               |s|r|jW                         |||||||f |s|jX                  |   D ]*  \  }}t[        j\                  |||||| |j^                         ,  yc c}w c c}w w)at  Identify sets of values to use in UPDATE statements for a
    list of states.

    This function works intricately with the history system
    to determine exactly what values should be updated
    as well as how the row should be matched within an UPDATE
    statement.  Includes some tricky scenarios where the primary
    key of an object might have been changed.

    NTrq   Fz,No primary key value supplied for column(s) z, c              3  T   K   | ]  }|j                      t        |       ! y wr=   )_labelstr)r   r   	pk_paramss     r   r   z+_collect_update_commands.<locals>.<genexpr>3  s(      "'(9QXX3F3NCF"s   ((zY; per-row ORM Bulk UPDATE by Primary Key requires that records contain primary key valuesbupq)codepk_cascadedr   zCan't update table , using NULL for primary key value on column c              3  ,   K   | ]  }||   f  y wr=   r   rs   s     r   r   z+_collect_update_commands.<locals>.<genexpr>\  s     H1jm,Hru   )0r)   _valuesrv   rx   ry   r~   _pk_attr_keys_by_tablerX   committed_staterz   r{   r   r|   rq   managerimplis_equalr/   eager_defaults!_server_onupdate_default_col_keysr   r>   r   _columntopropertyvaluesget_historyr   PASSIVE_NO_INITIALIZEaddedr   r   getr   NONE_SETsa_excInvalidRequestErrorjoinPASSIVE_OFFdeletedpop	unchangedorm_exc
FlushErrorr9   _table_to_equatedr   populatepassive_updates)r1   r7   r2   rl   r   ro   r   r   r   r!   pksr   r   r   r   r   r   r   prophistory	no_paramsvalr   expect_pk_cascadedmequated_pairsr   r   s                             @@r   r+   r+     su    4 
z 	,,,""5)*.66LL//6
  #>2j)F99%@A	 w'++Z-@@F   $F~.;;%% , #7+$W-5"67:3,,<
 #5*>? 002" !% MM'*//88u44W=   
 ',F377O-,0 !!00D8<<UC(6" ! $(  )%%)>)>u)EE<
 #44;;= D#mmDHH5::FFz:+K+KG }} ''C"
7<'7I!2F3:: v---U:112CD"%sww,,5)
 #4swwL"
  #>2??11%8  w'..
w0GGI }})))*:*:*<=00B		 ",/" 99  
 
 I  2237;;--055AA:z'='= ==#OO)5#6)445 .2*07a0@	#**-

377D1 180B	#**-,.*/K,3,=,=a,@Icjj)SZZ(0!,,493@ 1: MMH6GHH\MM)$ 	 	   %+$<$<U$C 	 =!"**	cz.fs<   BT2	T(#B8T2CT26B<T22&T-E/T2	AT2(A
T2c              #  *  K   |D ]  \  }}}}}	|j                   |   }
i }d}|j                  |   D ]  }||
v r1|j                  |||t        j                        ||j
                  <   8||v s|j                  I|j                  |   }|j                  |j                     j                  j                  ||t        j                        }|j                  s|j                  d   }|||j                  <   d} |s|	|j                  |j                  |   v rl|j                  }|	||j
                  <   t        |j                        r<|j                  |vr.|j                   dur |j!                  |	      }|||j                  <   |||||f  yw)zrIdentify sets of values to use in UPDATE statements for a
    list of states within a post_update operation.

    F)passiveNr   T)r)   r   _get_state_attr_by_columnr   r   r   onupdater   r   rX   r   r   r   r   r>   rW   r   )r/   r1   r7   r2   rE   r   r   r   r   r!   r   r   hasdatar   r   r   r   r   s                     r   rC   rC   |  s     
+@ 	 ""5)((/ 	#Ccz%+%E%E:sJ4J4J &F &szz" ((CLL,D//4--166BB:z'G'G ==#MM!,E&+F377O"G	# !-))V-B-B5-II++%6szz" Ov-335@ 556GHC&)F377OVZ??W+@s   A7F:AF$F=BFc              #  f  K   |D ]  \  }}}}}||j                   vri }	|j                   |   D ]A  }
|j                  |||
      x|	|
j                  <   }|(t        j                  d|d|
       |4|j
                  |j                  |   v r||	|j
                  j                  <   |	|f  yw)zSIdentify values to use in DELETE statements for a list of
    states to be deleted.NzCan't delete from table r   )r)   r?   rX   r   r   r>   r   )r/   r1   r7   rQ   r   r   r   r   r!   r   r   r   s               r   rM   rM     s      
! 	,,,''. 	C:::sF377Oe
 }(( 16s< 	 )%%)>)>u)EE0AF6((,,-j  ;!s   AB1AB1T)bookkeepingr   enable_check_rowcountc               @   j                   duxr j                   j                     v d| j                  i}dfd	}	|	 |	|      }
n| j                  df|	      }
t	        |d       D ]%  \  \  }}}}}}d}t        |      }|
}||j                  d      }d}|s |j                  j                      }d	}|rZ|sXj                  j                  d	u r@j                  r4|j                  j                  r |j                  j                      }d	}j                  r|j                  j                         }d	}|j                  j                   }|xr |j                  j"                  }| xr  }|r|D ]z  \  }}}}}}}|j%                  |j'                  |      ||
      }|r5t)        |||||j*                  j,                  d   |d	|j.                  
       ||j0                  z  }|xr |}| n"|sq|xr |}|D ]e  \  }}}}}}}|j%                  |||
      }|r5t)        |||||j*                  j,                  d   |d	|j.                  
       ||j0                  z  }g n|D cg c]  }|d   	 }}|xr |xs |xr t3        |      dk(  }|j%                  |||
      }||j0                  z  }|D ][  \  }}}}}}}|st)        |||||j*                  j,                  d   |d	|j*                  j4                  s|j.                  nd
       ] r>|t3        |      k7  st7        j8                  dj:                  t3        |      |fz        st=        j>                  dj                  j@                  z         ( yc c}w )z`Emit UPDATE statements corresponding to value lists collected
    by _collect_update_commands().Ncompiled_cachec                   t        j                  t        j                        }j                     D ]?  }|j                  |t        j                  |j                  |j                        k(         A r[|j                  j                  t        j                  j                  j                  j                  j                        k(         | | j                  |      }|S j                         j                  |      }|S N)type_)r   _construct_rawr   and_r)   _append_inplacer   	bindparamr   typer>   wherer9   )existing_stmtclausesr   stmtr   needs_version_idr7   s       r   update_stmtz,_emit_update_statements.<locals>.update_stmt  s    #229>>B''. 	C##s}}SZZsxx@@	
 ##%%==))00 //44 $ &&w/D  <<>''0Dr:   r9   c                R    | d   t        | d         t        | d         | d   | d   fS N   r            rx   rW   recs    r   <lambda>z)_emit_update_statements.<locals>.<lambda>  4    FAKQLFF
 r:   r   )_emit_update_table_emit_update_mapperFTexecution_optionsr   r   MUPDATE statement on table '%s' expected to update %d row(s); %d were matched.MDialect %s does not support updated rowcount - versioning cannot be verified.r=   )!r>   r   _compiled_cache_memor   rA   	_annotaterm   r)   r/   r   implicit_returningr   update_returning_server_onupdate_default_cols!_version_id_has_server_side_valuesupports_sane_rowcountsupports_sane_multi_rowcountexecuter   
_postfetchcontextcompiled_parametersreturned_defaultsrowcountlenexecutemanyr   StaleDataErrordescriptionr   rb   dialect_description) r/   r1   r   r7   r9   r   r   r   r   r   cached_stmtr   	paramkeyshasvaluer   r   recordsrows	statementrm   assert_singlerowassert_multirowallow_executemanyr   r   r   r   r   check_rowcountr   multiparamsr   s      ``                           @r   r,   r,     s    	T) 	B!!V%:%:5%AA 
 *;+F+FG. &!"56 "''5(9;G
 
	
	
u 	HY*:K w-	*!++*/+1I  1	1163G3G3NOI"O $""11T9 ((""331	1155e<I #O33!11&2G2GHI"O%--DD  @""?? 	 !0/H8H4H L 	 &&$$\2&7 ' 
 &"		55a8$++ 

"!6!K;K;L> %!6!K;K ' 	 $"**!6=N + A
 #""*!!&II99!<( // AJJ&D9'< 299#s1v99!6 "# D(BS-=-B 
 &&{>O '  

"  	 $"""*!!&II99!<(  ()yy'<'< !" 3 3%)8 s7|#,,9((#g,=>  II3))//0cu~ :s   <N)r   use_orm_insert_stmtr   c               
   |<|}t         j                  }	t        |j                        }
|
xr |j                  xs |}n0d}
|}| j                  d|f|j                        }d| j                  i}	|r!t         j                  j                  |	|      }n|	}d}t        |d       D ]  \  \  }}}}}}|}||j                  ||d      }|r@|s>| j                  |j                  |      r"|j                  r|j                  j                  s|
s|r|st        |      }|D cg c]  }|d   	 }}|j!                  |||      }|st#        ||j$                  j&                        D ]T  \  \  }}}}}}}}}|r7t)        ||||||||d|j$                  j*                  s|j,                  nd
       Ht/        |||       V t        |      }|
s|j                  r|s}t1        |      d	kD  ro|r|j                  j2                  s|s|j                  j4                  rd
}n>|
r7|rd}nd}t7        j8                  d|j                  j:                   d| d      d}nd}|=|s;| j                  |j                  |      r |j<                  |j>                  |   d|i}|j@                  |j=                  |j@                  |      }n|r |j<                  |jB                  d|i}|r*|D cg c]  }|d   	 }}|j!                  |||      }|||}n|jE                  |      }|stG        ||j$                  j&                  |jH                  |jJ                  xs d      D ]  \  \  }}}}}}}}}} }!| tM        jN                  d|z        t#        | |jP                  |         D ]?  \  }"}#|jR                  |#   }$|jU                  |$jV                        1|"||$jV                  <   A |rt)        ||||||||d|!
       t/        |||        h|
rJ |D ]-  \  }}}}}}}}|r$|j!                  |jY                  |      ||      }n|j!                  |||      }|jZ                  }%|%tM        jN                  d|d      t#        |%|jP                  |         D ]C  \  }"}#|jR                  |#   }$|#|v s|jU                  |$jV                        5|"||$jV                  <   E |s|rOt)        |||||||j$                  j&                  d   |d|j$                  j*                  s|j,                  nd
       !t/        |||       0  ||t]        j^                         S |S yc c}w c c}w )z`Emit INSERT statements corresponding to value lists collected
    by _collect_insert_commands().NFr8   r   c                R    | d   t        | d         t        | d         | d   | d   fS r   r   r   s    r   r   z)_emit_insert_statements.<locals>.<lambda>  r   r:   )_emit_insert_table_emit_insert_mapperr   r   r   Tz+ with RETURNING and sort by parameter orderz with RETURNINGz<Can't use explicit RETURNING for bulk INSERT operation with z backend; executemanyz! is not enabled for this dialect.sort_by_parameter_order)r  r   zMulti-row INSERT statement for %s did not produce the correct number of INSERTed rows for RETURNING.  Ensure there are no triggers or special driver issues preventing INSERT from functioning properly.z Single-row INSERT statement for z did not produce a new primary key result being invoked.  Ensure there are no triggers or special driver issues preventing INSERT from functioning properly.r   )0r   
EMPTY_DICTrW   
_returning_sort_by_parameter_orderr   r8   r   
merge_withr   r   r   r   r   insert_returningrA   r   zipr   r   r   r   r   _postfetch_bulk_saver   4insert_executemany_returning_sort_by_parameter_orderinsert_executemany_returningr   r   r   rm   _server_default_colsr>   primary_keysplice_verticallyr   inserted_primary_key_rowsreturned_defaults_rowsr   r   r)   r   r   rX   r   inserted_primary_key_cursornull_dml_result)&r/   r1   r   r7   r8   r   r  r   r   exec_optreturning_is_required_anywaydeterministic_results_reqdreturn_resultr   _r  r   r   r  r  r   r
  resultr   r   r   
mapper_recconnr   last_inserted_paramsdo_executemanydtr  r   pkr   r   r  s&                                         r   r-   r-     s    &)?? (,,?,J,J'K$( =#<<&  	#
 (-$%0"!''5(95<<H$k&A&AB OO66'
 %M
 
	
	
SP 	@Q+/?  	*!++*/+1I  $&=="**E !33%-->> 1 7mG-45c3q65K5'';:K ( F  &.."D"DEL 	""$#(("&*!!&"0(! (.~~'A'A !' 8 8%)" -ZUK?LJ 7mG+((c'lQ>N /"**__2"**GG%)N11J. 44*%--AAB C&&(T)JL  &+N!&"*(#::"**E !:	 9 944U;!0;!I
 $$0%55)),7 6 	  5I55&&@K	 189#s1v99#++{>O ,  '2$,(.(5(G(G(O %::8855;	:P 	!&"& (',,,) 07 #*"4"4!8
 ;E!E#  (+0"007( :GB $.#?#?#DD)~~dhh7?79
488 4: !& * . % % * & 4 , % 1 1ZOu:Px 877 =P 	 $#!+!3!3%,,\:".? "4 " ",!3!3%".? "4 " #)"="=K"*%00 8BD  $'#V%9%9%%@$ 6C  *;;C@</)~~dhh7?35Jtxx06 # & * . % % * & & B B1 E , % ,2>>+E+E %+$<$<)-" 1ZO{=PmSPj & **,,  	 'S 6~ :s   U %U%c                   d| j                   i}j                  duxr j                  j                     v fd}| j                  df|      }j                  r|j                  j                        }t        |d       D ]  \  }}	d}
t        |	      }	|d   }|j                  j                  }|xr |j                  j                  } xs |}|s[|}|	D ]S  \  }}}}}|j                  |||      }t        ||||||j                  j                  d          |
|j                  z  }
U n|	D cg c]
  \  }}}}}| }}}}}}|xs |xr t!        |      dk(  }|j                  |||      }|
|j                  z  }
|	D ]0  \  }}}}}t        ||||||j                  j                  d          2 |r>|
t!        |	      k7  sJt#        j$                  d	j&                  t!        |	      |
fz        s|t)        j*                  d
j                  j,                  z          yc c}}}}}w )zeEmit UPDATE statements corresponding to value lists collected
    by _collect_post_update_commands().r   Nc                    t        j                  t        j                        } j                     D ]?  }| j                  |t        j                  |j                  |j                        k(         A r[| j                  j                  t        j                  j                  j                  j                  j                        k(         j                         j                  |       }|S r   )r   r   r   r   r)   r   r   r   r   r   r>   r9   r   )r   r   r   r   r   r7   s      r   r   z1_emit_post_update_statements.<locals>.update_stmt  s    #229>>B''. 	C##s}}SZZsxx@@	
 ##%%==))00 //44 ||~##G,r:   rF   c                (    | d   t        | d         fS )N   r   )rx   r   s    r   r   z._emit_post_update_statements.<locals>.<lambda>3  s    SVSQ[) r:   r   r   r   r   r   )r   r>   r   r   r   rm   r   rA   r   r   r   r   _postfetch_post_updater   r   r   r   r   r   r   r   rb   r   )r/   r1   r   r7   r9   r   r   r  rX   r  r  r   r  r  r  r	  r   r   r(  r   r   r)  r
  r   s     ``                   @r   rD   rD     s    *;+F+FG 	T) 	B!!V%:%:5%AA 
* !!=%"8+FI//--f.C.CD	  ) HW w-V
%--DD @""?? 	 !10CO -NEL #Az:z6&&v9J '  '"II11!4 

"#$ DK ?E:z4 K 
 -  :S%5%:  "";:K # A AJJDEL 	Az:z6&"II11!4	 s7|#,,9((#g,=>  II3))//0IHDs   H8c                   j                   duxr j                   j                     v fd}| j                  df|      }t        |d       D ]  \  }}|D 	cg c]  \  }	}|		 }
}	}d| j                  i}t        |
      }d}d}rj                  j                  s|j                  j                  r-d}|
D ]%  }	|j                  ||	|	      }||j                  z  }' net        j                  d
|j                  j                  z         |j                  ||
|	       n$j                  ||
|	      }sd}|j                  }| j                  s|dkD  s||k7  s|j                  j                  st        |
      dk(  s:|r't        j                  dj                  ||fz         ct!        j"                  dj                  ||fz         yc c}}	w )z`Emit DELETE statements corresponding to value lists collected
    by _collect_delete_commands().Nc                    t        j                  t        j                        } j                     D ]?  }| j                  |t        j                  |j                  |j                        k(         A r[| j                  j                  t        j                  j                  j                  j                  j                        k(         j                         j                  |       S r   )r   r   r   r   r)   r   r   r   rX   r   r>   rS   r   )r   r   r   need_version_idr7   s     r   delete_stmtz,_emit_delete_statements.<locals>.delete_stmt  s    #229>>B''. 	C##s}}SWWCHH==	
 ##%%==))--V5J5J5O5O ||~##G,,r:   rS   c                    | d   S )Nr   r   r   s    r   r   z)_emit_delete_statements.<locals>.<lambda>  s
    A r:   r   Fr   r   zMDialect %s does not support deleted rowcount - versioning cannot be verified.Tr   zDELETE statement on table '%s' expected to delete %d row(s); %d were matched.  Please set confirm_deleted_rows=False within the mapper configuration to prevent this warning.)r>   r   r   r   r   r   r   r   r   r   r   r   rb   r   confirm_deleted_rowsr   r   r   )r/   r1   r   r7   rS   r6  r  r   recsr   del_objectsr   expectedrows_matched	only_warnr   r5  s     ``            @r   rN   rN   |  s'    	T) 	B!!V%:%:5%AA 
-$ !!8U"3[AI#F,>? B
D8<="4&*v==-{/J/JK{#	 &&CC!!88  * /F"**!6=N + A !AJJ.L	/ 		7 ((<<=
 ""{>O #  "";:K # A # 	::L ,,r!L(""??{#q(
 		= (((LA	B ,,= (((LA	B yB=s   #G!c                   |D ]c  \  }}}}}|j                   r|j                  |j                   D cg c]n  }|j                  r$|j                  rH|j                  |j
                  v s0|j                  s0|j                  s$|j                  |j
                  vr|j                  p c}      }	|	r|j                  |j
                  |	       g }
| j                  du r4|
j                  |j                  j                  |j                               |j                  V|j                  du rH|j                  j                  |j                  v r&|
j                  |j                  j                  g       |
rl| j!                  |      |_        t#        j$                  |      j'                  t(              }t+        j,                  |j.                  ||j                  ||
       |s|j0                  j3                  |||       n|j0                  j5                  |||       |j                  du s(|j                  6||j                  j                     Qt7        j8                  d       yc c}w )zzfinalize state on states that have been inserted or updated,
    including calling after_insert/after_update events.

    TNF)refresh_stateonly_load_propsz2Instance does not contain a non-NULL version value)_readonly_propsunmodified_intersectionexpire_on_flushdeferredrX   re   _expire_attributesr   extend_unloaded_non_objectry   &_server_default_plus_onupdate_propkeysr>   r   _version_id_propunloadedrY   r   selectset_label_styler   r
   load_on_identr]   rO   after_insertafter_updater   r   )r/   r1   r0   r   r   r   r   r5   preadonly
toload_nowr   s               r   r.   r.     s$   
 @F C;z6:|!!44 $33))!"quu

/B -- !

EE3 EEH ((X>
 
 %%-**77AA !!-++u4&&**enn<!!6#:#:#>#>"?@#<<UCEI==(88.D !!&&		# * OO((UCOO((UC ''50%%1&11556>((H CCs   A3I+
c                   | j                   d uxr | j                   | j                  |   v }|j                  |      sA|j                  j                  j
                  }|j                  j                  j                  }	n|rdx}}	ny |rt        |      | j                   gz   }t        | j                  j                  j                        }
|
rg }|D ]t  }|j                  |v s|| j                  v s!||j                     || j                  |   j                  <   |
sMj                  | j                  |   j                         v |
r)r'| j                  j                  j                  |||       |	rP|j                  |j                   |	D cg c])  }|| j                  v r| j                  |   j                  + c}       y y c c}w )Nr   )r>   r   ra   r   compiledprefetch	postfetchrA   rW   class_managerrO   refresh_flushrX   r   r&   rF  re   )r   r1   r7   r   r4   r'  r   r   prefetch_colspostfetch_colsrY  load_evt_attrsr   s                r   r2  r2  *  s    	T) 	B!!V%:%:5%AA 
 $$U+//8800::	 *,+ 	]+v/D/D.EE--66DDEM G55F?qF$<$<<5;AEE]E&**1-112%%f&>&>q&A&E&EF	G %%33>>	
   JJ (000 ((+//	
 s   .G
c
           
        |j                   j                  j                  }
|j                   j                  j                  }|j                   j                  j                  }| j
                  4| j
                  | j                  |   v rt        |
      | j
                  gz   }
t        | j                  j                  j                        }|rg }|r|	}|t        ||      D ]s  \  }}|j                  r|j                   j                  r)| j                  j!                  |      }|sG|||j"                  <   |sYj%                  |j"                         u |
D ]{  }|j"                  |v s|| j                  v s!| j                  |   j"                  }||j"                     ||<   |j&                  j)                  |d       |skj%                  |       } |r)r'| j                  j                  j                  |||       |r1|r/|j+                  |D cg c]  }|j                  r||vr| c}       |rO|j-                  |j.                  |D cg c])  }|| j                  v r| j                  |   j"                  + c}       | j0                  |   D ]*  \  }}t3        j4                  ||||||| j6                         , yc c}w c c}w )zExpire attributes in need of newly persisted database state,
    after an INSERT or UPDATE statement has proceeded for that
    state.N)r   rU  rV  rW  effective_returningr>   r   rA   rW   rX  rO   rY  r  r  isinsertr   r   rX   r&   r   r   rG  rF  re   r   r   r   r   )r   r1   r7   r   r4   r'  r   r   isupdater   rZ  r[  returning_colsrY  r\  row	row_valuer   r   r   pkeyr   r   s                          r   r   r   \  s     NN++44M^^,,66N^^,,@@N 	)!!V%:%:5%AA]+v/D/D.EE--66DDEM?"%c>": 8	3 ??v~~'>'> //33C8&/E$((O$&--dhh78   ,55F?qF$<$<<++A.22D !-E$K!!%%dD1%%d+, %%33>>	
 L 	 (??s.'@ 	
   JJ (000 ((+//	
 #44U; 	
=""	
	
)s   K.K
c                `    | j                   |   D ]  \  }}t        j                  |||        y r=   )r   r   bulk_populate_inherit_keys)r   r4   r7   r   r   s        r   r  r    s5    "44U; A=''q-@Ar:   c              #  D  K   |j                   j                  r|j                   j                  }n|j                  j                  |       }d}t	        | |      D ]C  }|r || |j                               }|j                  j                  }||j                  |f E yw)zReturn an iterator of (state, state.dict, mapper, connection).

    The states are sorted according to _sort_states, then paired
    with the connection they should be using for the given
    unit of work transaction.

    N)	r]   connection_callabletransactionr   r#   objr   r   re   )r/   r1   r0   rh  r   r   r   s          r   rV   rV     s      11,44HH#//::;G
"k62 4,[%))+FJ%%UZZ334s   BB c                F   t        |      }|D ch c]  }|j                  | }}|j                  |       	 t        || j                        }t        |t        j                  d            |z   S c c}w # t
        $ r}t        j                  d|z        |d }~ww xY w)N)rX   z^Could not sort objects by primary key; primary key values must be sortable in Python (was: %s)insert_order)
rx   rX   difference_updatesorted_persistent_sortkey_fn	TypeErrorr   r   operator
attrgetter)r   r0   pendings
persistentpersistent_sortederrs          r   r#   r#     s    &kG$:(9!:J:j)"F99
 	wH//?@
	 ;  ((:<?@
 	s!   A4A4A9 9	B BB )F)0__doc__
__future__r   	itertoolsr   r   r   rq   r   r	   r   r
   r   baser   r   r   r   r   enginer   r   r   sql.elementsr   sql.selectabler   r$   rF   rT   r%   rB   rH   r*   r+   rC   rM   r,   r-   rD   rN   r.   r2  r   r  rV   r#   r   r:   r   <module>r     s    #   !           &  , ;Pf*
Z(@VM
`	HD6 
b
T 
Nb3@l#!Z gb A!H
sl`FHV/
dg
TA
44r:   