id`dZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z d Z Gd d e Z Gd d e Z Gdde ZGdde ZGdde eZGddeZGddeZGddeZGddeZGddeZGddeZd S)!zThe internals for the unit of work system. The session's flush() process passes objects to a contextual object here, which assembles flush tasks based on mappers and their properties, organizes them in order of dependency, and executes.  attributes)exc) persistence)util)event) topologicalc|jfd}fd}fd}tj|d|ddtj|d|ddtj|d|ddd S) z\Establish event listeners on object attributes which handle cascade-on-set/append. c@|dS|j}|r|jr|d|jjj}t j|}|jj r<|j s |j kr*| |s| ||S)Nzcollection append)session_warn_on_events_flush_warningmanagermapper_propsrinstance_state_cascade save_updatecascade_backrefskey_contains_state_save_or_update_statestateitem initiatorsessprop item_staters N/opt/cloudlinux/venv/lib/python3.11/site-packages/sqlalchemy/orm/unitofwork.pyappendz$track_cascade_events..append s < F}  7# 9##$7888='.s3D#2488J ) 7* 7.1Y].B.B,,Z88/C**:666 c|dS|j}|jjj}|r%|jr||jrdnd||tjuru|tj uri|j j r_tj |}|j |r3|r ||jvr||dSd|_dSdSdSdSdSdS)Nzcollection removezrelated attribute deleteT)r rrrrruselistr NEVER_SETPASSIVE_NO_RESULTr delete_orphanr _is_orphan_newexpunge_orphaned_outside_of_sessionrs r!removez$track_cascade_events..remove6s# < F}}#*3/  D(    <0##/     J000J888 +9$2488J{%%j11 CCJ$)33LL&&&&& ?CJ;;;!  008888  C Cr#c6||ur|S|j}|r|jr|d|jjj}|\t j|}|jj r<|j s |j kr*| |s| ||t|t jurf|t jurX|jjrLt j|}||jvr/|j|r|||S)Nzrelated attribute set)r rrrrrrrrrrrrrr&r'r(r*r)r+) rnewvalueoldvaluerrrnewvalue_stateoldvalue_staters r!set_z"track_cascade_events..set_XsB x  O}  +# =##$;<<<='.s3D#!+!:8!D!DM-?.?252F2F 00@@3G..~>>>$J$888J$@@@M/A",!:8!D!D!TY..4;3I3I"44.LL***r#r"T)rawretvalr-setN)rr listen) descriptorrr"r-r3rs @r!track_cascade_eventsr9s (C, C C C C CD#####J LXv4EEEE LXv4EEEE LUDd4@@@@@@r#ceZdZdZedZdZdZdZdZ e j fdZ dZ d Z dd Zd ZdZejdZdZdZdZdZdZd S)UOWTransactionc||_i|_tjt|_tjt|_i|_i|_t |_ i|_ tjd|_ dS)Nc:ttfSN)r6r#r!z)UOWTransaction.__init__..sCEE355>r#) r rr defaultdictr6depsmapperspresort_actionspostsort_actions dependenciesstatespost_update_states)selfr s r!__init__zUOWTransaction.__init__s  $S)) ',, " !#  EE  #'"23I3I"J"Jr#c*t|jSr>)boolrGrIs r!has_workzUOWTransaction.has_worksDK   r#c|jrS ||tjn1#tj$r|j|gYdSwxYwdS)zZReturn ``True`` if the given state is expired and was deleted previously. TF)expired _load_expiredr PASSIVE_OFForm_excObjectDeletedErrorr _remove_newly_deletedrIrs r!was_already_deletedz"UOWTransaction.was_already_deletedss =  ##E:+ABBBB-    22E7;;;tt us **AAc:||jvo|j|dS)z[Return ``True`` if the given state is marked as deleted within this uowtransaction.rGrVs r! is_deletedzUOWTransaction.is_deleteds" #= E(:1(==r#cZ||jvr |j|S|x|j|<}|Sr>r)rIr callable_rets r!memozUOWTransaction.memos8 $/ ! !?3' ')2 4DOC 3Jr#cD|j|d}|df|j|<dS)z;Remove pending actions for a state from the uowtransaction.rYTNrZ)rIrisdeletes r!remove_state_actionsz#UOWTransaction.remove_state_actionss,;u%a(&- Er#c6d||f}||jvr|j|\}}}|tjzs|tjzrr|j|j}|||jtjtjz}|r|jr| }n|}|||f|j|<nh|j|j}|||j|tjz}|r|jr| }n|}|||f|j|<|S)zOFacade to attributes.get_state_history(), including caching of results.history) rSQL_OKrimpl get_historydictrRLOAD_AGAINST_COMMITTED uses_objectsas_state) rIrrpassivehashkeyrd state_historycached_passiverfs r!get_attribute_historyz$UOWTransaction.get_attribute_historysN eS) do % %59_W5M 2G]N #Z%66 Mj// M}S).**J*Z-NN ,t0,$+$4$4$6$6MM$+M,3]G+L(=%*D&&uz7Z-N#NG (4, ( ' 0 0 2 2 ' (/'HDOG $r#c|df|jvS)NT)rD)rI processors r!has_depzUOWTransaction.has_deps4 D$888r#cT||f}||jvrt|||j|<dSdSr>)rD Preprocess)rIrr fromparentrs r!register_preprocessorz$UOWTransaction.register_preprocessors?*% d* * *(29j(I(ID  % % % + *r#FNc |j|s;|js2|0tjdt j|d|d|ddS||jvrW|jj }||j vr| ||j | |||f|j|<n|s|s|r |df|j|<dS)NzObject of type z not in session, z operation along 'z' will not proceedFT) r rdeletedrwarnorm_utilstate_class_strrGrrrC_per_mapper_flush_actionsadd)rIrralistonly cancel_delete operationrrs r!register_objectzUOWTransaction.register_object s|++E22 = Y%:  /6666 444I 5  # #])FT\))..v666 L $ $U + + +"*H!5DK   7 7] 7&.%6 E"tr#c|jjj}|j|\}}||||dSr>)rr base_mapperrHr~update)rIrpost_update_colsrrGcolss r!register_post_updatez#UOWTransaction.register_post_update-sK%1.v6  5 $%%%%%r#c,t||j}t||j}|j||f|jD]}|||jD]&}|jr |j }||'dSr>) SaveUpdateAllr DeleteAllrFr~_dependency_processorsper_property_preprocessors relationshipsviewonly_dependency_processor)rIrsavesdeletesdeprs r!r}z(UOWTransaction._per_mapper_flush_actions3sdF$677D&"455 ug.///0 1 1C  * *4 0 0 0 0( 1 1D} ,C  * *4 0 0 0 0  1 1r#c,tjdS)areturn a dynamic mapping of (Mapper, DependencyProcessor) to True or False, indicating if the DependencyProcessor operates on objects of that Mapper. The result is stored in the dictionary persistently once calculated. cr|dj|dj|djuS)NrYr)rgetrr)tups r!r@z0UOWTransaction._mapper_for_dep..Ls+A ))#a&*55QDr#)r PopulateDictrMs r!_mapper_for_depzUOWTransaction._mapper_for_depAs D D   r#c2|jfd|DS)zmFilter the given list of InstanceStates to those relevant to the given DependencyProcessor. c<g|]}|jjf|Sr?)rr).0srmapper_for_deps r! z8UOWTransaction.filter_states_for_dep..Us-MMMa^QY5Es4K%LMMMMr#)r)rIrrGrs ` @r!filter_states_for_depz$UOWTransaction.filter_states_for_depOs+ -MMMMM6MMMMr#c#zK||f}|jjD]'}|j|D]}|j||kr|V(dSr>)rself_and_descendantsrCrG)rIrrarchecktuprs r!states_for_mapper_hierarchyz*UOWTransaction.states_for_mapper_hierarchyWsfh'(=  Ff-  ;u%11KKK   r#c  d}tjD]}|rd}|snFt jjtjx_}|r1tfd|D}tjD]}d|vs/|dj s"|dj s| |rj |Q|d|vrNj |||dD]$}j ||df%|d|vrMj |||dD]$}j |d|f%tdjD|S)z}Generate the full, unsorted collection of PostSortRecs as well as dependency pairs for this UOWTransaction. TFc3`K|](}|t|fV)dSr>)r6per_state_flush_actions)rrecrIs r! z3UOWTransaction._generate_actions..vsOBEc#55d;;<<=r#NrYrc g|] }|j | Sr?disabled)ras r!rz4UOWTransaction._generate_actions..s I I I1aj IQ I I Ir#)listrDvaluesexecuter find_cyclesrFrEcyclesrhr issupersetr-r~r6 difference)rIr^actionrconvertedgers` r!_generate_actionsz UOWTransaction._generate_actions^sV Ct3::<<==  >>$''C    +6  tD$9$@$@$B$BCC    f  >IOGT.// > >DLLAw'!Aw'!((..! %,,T2222!W&&%,,T222&tAw/>>)--sDGn====>!W&&%,,T222&tAw/>>)--tAwn==== I I-4466 I I I  *V   r#c:|}|jrMtj|j|D]0}|r,|}||||,1dStj|j|D]}||dSr>) rrr sort_as_subsetsrFpopexecute_aggregatesortr)rIrEr3nrs r!rzUOWTransaction.executes1133 ; "#3!#3 4 44 A''d3334 4 4#'(9;KLL " " D!!!! " "r#c>|jsdSt|j}td|jD}||}|r|j||r|j|dSdS)zMark processed objects as clean / deleted after a successful flush(). This method is called within the flush() method after the execute() method has succeeded and the transaction has been committed. Nc3*K|]\}\}}| |VdSr>r?)rrrars r!rz8UOWTransaction.finalize_flush_changes..sD  +1*xh       r#)rGr6itemsrr rU_register_persistent)rIrGisdelothers r!finalize_flush_changesz%UOWTransaction.finalize_flush_changess{  FT[!!  /3{/@/@/B/B     !!%((  6 L . .u 5 5 5  5 L - -e 4 4 4 4 4 5 5r#)FFFNN)__name__ __module__ __qualname__rJpropertyrNrWr[r_rbrPASSIVE_NO_INITIALIZErprsrwrrr}rmemoized_propertyrrrrrrr?r#r!r;r;sn+K+K+KZ!!X!   >>> ...#-"B----^999JJJ     D&&& 1 1 1      NNN   222h""",55555r#r;ceZdZdZdS)IterateMappersMixincjr+tfdjjjDSjjjS)Nc3DK|]}j|jf|VdSr>)rdependency_processor)rmrIuows r!rz/IterateMappersMixin._mappers..sM&4+D'EFr#)rviterrparentrrrIrs``r!_mapperszIterateMappersMixin._mapperssf ? I29N  ,3H Hr#N)rrrrr?r#r!rrs(IIIIIr#rceZdZdZdZdZdS)ru)rrv processedsetup_flush_actionscV||_||_t|_d|_dSNF)rrvr6rr)rIrrvs r!rJzPreprocess.__init__s*$8!$#(   r#ct}t}||D]i}|j||jD]A}|j|\}}|s-|r||,||Bj|r5|j|||j ||r5|j |||j ||s|rb|j sY|j ||ds|j ||dr!|j |d|_ dSdSNTF)r6rrCrrrGr~rpresort_deletesr presort_savesrprop_has_changesper_property_flush_actions)rIr delete_states save_statesrrrars r!rzPreprocess.executes ee mmC(( / /FV,77GG / /'*z%'8$8//%))%0000#...  /  1  % 5 5c= I I I N ! !- 0 0 0  /  % 3 3C E E E N ! !+ . . .  K + 0):: 0,==e 0)DDSIII+/(45r#Nrrr __slots__rJrr?r#r!rurus9I))) !!!!!r#ruceZdZdZdZdZdS) PostSortRecrc|f|z}||jvr |j|St|x|j|<}d|_|Sr)rEobject__new__r)clsrargsrr^s r!rzPostSortRec.__new__sSftm #& & &', ,.4nnS.A.A AC  % CLJr#c0||dSr>)r)rIrrecss r!rzPostSortRec.execute_aggregates Sr#N)rrrrrrr?r#r!rrs7Ir#rc0eZdZdZdZdZdZdZdZdS) ProcessAll)rrarvc||_||_||_|j|jj|dSr>)rrarvrBrrr~)rIrrrarvs r!rJzProcessAll.__init__sK$8!  $ %,89==      r#c||}|jr|j||dS|j||dSr>) _elementsrarprocess_deletes process_saves)rIrrGs r!rzProcessAll.executes\$$ = A  % 5 5c6 B B B B B  % 3 3C @ @ @ @ @r#c tgSr>)rrs r!rz"ProcessAll.per_state_flush_actionss Bxxr#c@|jjd|jd|jdS)N(z , isdelete=)) __class__rrrarMs r!__repr__zProcessAll.__repr__%s/ N # # #  % % % MMM  r#c#K||D]3}|j|D]#}|j|\}}||jkr|s|V$4dSr>)rrCrGra)rIrrrrars r!rzProcessAll._elements,ssmmC((  FV,  '*z%'8$8t},,X,KKK   r#N) rrrrrJrrrrr?r#r!rr sg@I   AAA        r#rceZdZdZdZdZdS) PostUpdateAllrrac"||_||_dSr>r)rIrrras r!rJzPostUpdateAll.__init__7s   r#cjj\}}fd|D}tjj||dS)NcLg|] }j|djk|!SrY)rGra)rrrIrs r!rz)PostUpdateAll.execute..=s0IIIsz!}Q'74='H'H!'H'H'Hr#)rHrr post_update)rIrrGrs`` r!rzPostUpdateAll.execute;sR-dk: IIIIIVIII VS$?????r#Nrr?r#r!rr4s<$I!!!@@@@@r#rc*eZdZdZdZdZdZdZdS)rrc||_dSr>rrIrrs r!rJzSaveUpdateAll.__init__E  r#cptj|j||jdd|dSr)rsave_objrrrs r!rzSaveUpdateAll.executeIs@ K  + +DK F F      r#c#Kt||jdd}|jj}t ||}|D]2}t ||}|j||f|V3|j|jD]/}| ||}| ||d0dSr) rrrrrSaveUpdateStaterFr~rBrr) rIrrGr delete_allrrrstates_for_props r!rz%SaveUpdateAll.per_state_flush_actionsPs  + +DK F F  k- sK00   E%S%00F   &*!5 6 6 6LLLL8DK( E EC!77VDDO  ' '_e D D D D E Er#c0|jjd|jdSNrrrrrrMs r!rzSaveUpdateAll.__repr__a>222DKKK@@r#NrrrrrJrrrr?r#r!rrBs]I,,,   EEE"AAAAAr#rc*eZdZdZdZdZdZdZdS)rrc||_dSr>rrs r!rJzDeleteAll.__init__hr r#cptj|j||jdd|dSr)r delete_objrrrs r!rzDeleteAll.executels@ K  + +DKu E E      r#c#Kt||jdd}|jj}t ||}|D]2}t ||}|j||f|V3|j|jD]/}| ||}| ||d0dSr) rrrrr DeleteStaterFr~rBrr) rIrrGrsave_allrrrrs r!rz!DeleteAll.per_state_flush_actionsss  + +DKu E E  k-  k22  E!e,,F   (F!3 4 4 4LLLL8DK( D DC!77VDDO  ' '_d C C C C D Dr#c0|jjd|jdSrrrMs r!rzDeleteAll.__repr__rr#Nrr?r#r!rres]I,,,   DDD"AAAAAr#rc$eZdZdZdZdZdZdS) ProcessStaterrarc0||_||_||_dSr>r)rIrrrars r!rJzProcessState.__init__s$8!   r#c |j|j|jfd|D}|||jgd|Dz}r||dS||dS)NcJg|]}|jur|jur |ju| Sr?)rrra)rrcls_rras r!rz2ProcessState.execute_aggregate..sN   {d""&*>>> h&& '&&r#cg|] }|j Sr?rrr#s r!rz2ProcessState.execute_aggregate.. ; ; ;Q ; ; ;r#)rrradifference_updaterrr)rIrrour_recsrGr$rras @@@r!rzProcessState.execute_aggregates~#8=          x(((* ; ;( ; ; ;;  < 0 0f = = = = = . .sF ; ; ; ; ;r#ct|jjd|jdtj|jd|jdS)Nrz, z , delete=r)rrrr{ state_strrrarMs r!rzProcessState.__repr__sE N # # #  % % %  tz * * * * MMM   r#NrrrrrJrrr?r#r!rrsF;I <<<$     r#rc$eZdZdZdZdZdZdS)r rrc6||_|jj|_dSr>rrrrIrrs r!rJzSaveUpdateState.__init__ l. r#c|j|jfd|D}||tj|jgd|Dz|dS)Nc8g|]}|ju |ju|Sr?rrrr#r$rs r!rz5SaveUpdateState.execute_aggregate..8   q{d22qx67I7IA7I7I7Ir#cg|] }|j Sr?r&r's r!rz5SaveUpdateState.execute_aggregate..s#>#>#>AG#>#>#>r#)rrr)rr r)rIrrr*r$rs @@r!rz!SaveUpdateState.execute_aggregates~         x((( TZL#>#>X#>#>#>>     r#cT|jjdtj|jdSrrrr{r,rrMs r!rzSaveUpdateState.__repr__0 N # # #  tz * * * *  r#Nr-r?r#r!r r sF!I///         r#r c$eZdZdZdZdZdZdS)rr/c6||_|jj|_dSr>r1r2s r!rJzDeleteState.__init__r3r#c|j|jfd|D}|||jgd|Dz}t jfd|DdS)Nc8g|]}|ju |ju|Sr?r6r7s r!rz1DeleteState.execute_aggregate..r8r#cg|] }|j Sr?r&r's r!rz1DeleteState.execute_aggregate..r(r#c:g|]}j|d|SrrZ)rrrs r!rz1DeleteState.execute_aggregate..s);;;1#*Q-*:;Q;;;r#)rrr)rrr)rIrrr*rGr$rs ` @@r!rzDeleteState.execute_aggregates~         x(((* ; ;( ; ; ;; ;;;;;;;S     r#cT|jjdtj|jdSrr;rMs r!rzDeleteState.__repr__r<r#Nr-r?r#r!rrsF!I///         r#rN)__doc__rrrSrrr{r r r9rr;rrurrrrrrr rr?r#r!rFsfAfAfARy5y5y5y5y5Vy5y5y5x I I I I I& I I I/////$///d     &    % % % % % $k% % % P @ @ @ @ @K @ @ @ A A A A AK A A AF A A A A A A A AF      ;    F     k   2     +     r#