B 4]`@sdZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z d d Z Gd d d e Z Gd dde Z Gddde ZGddde ZGddde eZGdddeZGdddeZGdddeZGdddeZGdddeZGdd d eZd!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) topologicalcsj|jfdd}fdd}fdd}tj|d|ddd tj|d |ddd tj|d |ddd d S) z\Establish event listeners on object attributes which handle cascade-on-set/append. csn|dkr dS|j}|rj|jr&|d|jjj}t|}|jj rj|j sV|j krj| |sj| ||S)Nzcollection append)session_warn_on_events_flush_warningmanagermapper_propsrinstance_state_cascade save_updatecascade_backrefskey_contains_state_save_or_update_state)stateitem initiatorsessprop item_state)rL/opt/alt/python37/lib64/python3.7/site-packages/sqlalchemy/orm/unitofwork.pyappend s    z$track_cascade_events..appendcs|dkr dS|j}|jjj}|r>|jr>||jr8dnd|dk r|tjk r|tj k r|j j rt |}|j |r|r||jkr||nd|_dS)Nzcollection removezrelated attribute deleteT)r r r rr r Zuselistr NEVER_SETPASSIVE_NO_RESULTr delete_orphanr _is_orphan_newexpungeZ_orphaned_outside_of_session)rrrrrr)rrrremove6s"       z$track_cascade_events..removecs||kr |S|j}|r|jr&|d|jjj}|dk rrt|}|jj rr|j s^|j krr| |sr| ||dk r|tjk r|tjk r|jjrt|}||jkr|j|r|||S)Nzrelated attribute set)r r r r r rrrrrrrrrrr r!r#r"r$)rZnewvalueZoldvaluerrrZnewvalue_stateZoldvalue_state)rrrset_Xs,        z"track_cascade_events..set_rT)rawZretvalr%setN)rrZlisten)Z descriptorrrr%r&r)rrtrack_cascade_eventss  " %r)c@seZdZddZeddZddZddZd d Zd d Z e j fd dZ ddZ ddZd'ddZddZddZejddZddZdd Zd!d"Zd#d$Zd%d&ZdS)(UOWTransactioncCsR||_i|_tt|_tt|_i|_i|_t|_ i|_ tdd|_ dS)NcSs ttfS)N)r(rrrrz)UOWTransaction.__init__..) r rr defaultdictr(depsmapperspresort_actionspostsort_actions dependenciesstatespost_update_states)selfr rrr__init__s  zUOWTransaction.__init__cCs t|jS)N)boolr3)r5rrrhas_workszUOWTransaction.has_workcCsB|jr>y||tjWn$tjk r<|j|gdSXdS)zVreturn true if the given state is expired and was deleted previously. TF)ZexpiredZ _load_expiredr PASSIVE_OFForm_excZObjectDeletedErrorr _remove_newly_deleted)r5rrrrwas_already_deletedsz"UOWTransaction.was_already_deletedcCs||jko|j|dS)zWreturn true if the given state is marked as deleted within this uowtransaction.)r3)r5rrrr is_deletedszUOWTransaction.is_deletedcCs,||jkr|j|S||j|<}|SdS)N)r)r5rZ callable_retrrrmemos  zUOWTransaction.memocCs |j|d}|df|j|<dS)z;remove pending actions for a state from the uowtransaction.r=TN)r3)r5risdeleterrrremove_state_actionssz#UOWTransaction.remove_state_actionsc Csd||f}||jkr|j|\}}}|tj@s|tj@r|j|j}|||jtjtjB}|rp|jrp| }n|}|||f|j|<nJ|j|j}|||j|tjB}|r|jr| }n|}|||f|j|<|S)zOfacade to attributes.get_state_history(), including caching of results.history) rZSQL_OKr implZ get_historydictr9ZLOAD_AGAINST_COMMITTEDZ uses_objectsZas_state) r5rrZpassiveZhashkeyrCZ state_historyZcached_passiverDrrrget_attribute_historys,          z$UOWTransaction.get_attribute_historycCs|df|jkS)NT)r0)r5 processorrrrhas_depszUOWTransaction.has_depcCs&||f}||jkr"t|||j|<dS)N)r0 Preprocess)r5rG fromparentrrrrregister_preprocessors z$UOWTransaction.register_preprocessorFNcCs|j|s8|js4|dk r4tdt|||fdS||jkr~|jj }||j kr^| ||j | |||f|j|<n|s|s|r|df|j|<dS)NzJObject of type %s not in session, %s operation along '%s' will not proceedFT) r rZdeletedrwarnorm_utilZstate_class_strr3r r r/_per_mapper_flush_actionsadd)r5rrAlistonlyZ cancel_deleteZ operationrr rrrregister_object s     zUOWTransaction.register_objectcCs0|jjj}|j|\}}||||dS)N)r r base_mapperr4rOupdate)r5rZpost_update_colsr r3colsrrrregister_post_update-s  z#UOWTransaction.register_post_updatecCsnt||j}t||j}|j||fx|jD]}||q0Wx&|jD]}|jrVqJ|j }||qJWdS)N) SaveUpdateAllrR DeleteAllr2rOZ_dependency_processorsZper_property_preprocessorsZ relationshipsZviewonlyZ_dependency_processor)r5r ZsavesZdeletesdeprrrrrN3s    z(UOWTransaction._per_mapper_flush_actionscCstddS)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. cSs |dj|dj|djkS)Nr=r)rgetrr)tuprrrr+Lr,z0UOWTransaction._mapper_for_dep..)rZ PopulateDict)r5rrr_mapper_for_depAs zUOWTransaction._mapper_for_depcs|jfdd|DS)zmFilter the given list of InstanceStates to those relevant to the given DependencyProcessor. cs g|]}|jjfr|qSr)r r ).0s)rXmapper_for_deprr Usz8UOWTransaction.filter_states_for_dep..)r[)r5rXr3r)rXr^rfilter_states_for_depOsz$UOWTransaction.filter_states_for_depccsF||f}x8|jjD],}x&|j|D]}|j||kr"|Vq"WqWdS)N)rRself_and_descendantsr/r3)r5r rArPZchecktuprrrrstates_for_mapper_hierarchyWs z*UOWTransaction.states_for_mapper_hierarchycs^x4d}x$tjD]}|rd}qW|sPqWtjtj_}|r@t fdd|D}xtjD]}d|ks|dj s|dj s| |rj |q||d|krj |xn||dD]}j ||dfqWq||d|kr|j |x*||dD]}j |d|fqWq|Wtdd jD|S) z}Generate the full, unsorted collection of PostSortRecs as well as dependency pairs for this UOWTransaction. FTc3s |]}|t|fVqdS)N)r(per_state_flush_actions)r\rec)r5rr wsz3UOWTransaction._generate_actions..Nr=rcSsg|]}|js|qSr)disabled)r\arrrr_sz4UOWTransaction._generate_actions..)listr0valuesexecuterZ find_cyclesr2r1cyclesrErf issupersetr%rOr( difference)r5r?actionrkZconvertZedgerXr)r5r_generate_actions^s:        z UOWTransaction._generate_actionscCsl|}|jrFxXt|j|D]"}x|r>|}|||q$WqWn"x t|j|D]}||qVWdS)N) rorkrZsort_as_subsetsr2popexecute_aggregatesortrj)r5r1r&nrdrrrrjs zUOWTransaction.executecCsZ|js dSt|j}tdd|jD}||}|rF|j||rV|j|dS)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. Ncss|]\}\}}|r|VqdS)Nr)r\r]rArPrrrresz8UOWTransaction.finalize_flush_changes..)r3r(itemsrmr r;Z_register_persistent)r5r3Zisdelotherrrrfinalize_flush_changess   z%UOWTransaction.finalize_flush_changes)FFFNN)__name__ __module__ __qualname__r6propertyr8r<r>r@rBrZPASSIVE_NO_INITIALIZErFrHrKrQrUrNrZmemoized_propertyr[r`rbrorjrvrrrrr*s,-  . 4r*c@seZdZddZdS)IterateMappersMixincs2jr$tfddjjjDSjjjSdS)Nc3s"|]}j|jfr|VqdS)N)r[dependency_processor)r\m)r5uowrrresz/IterateMappersMixin._mappers..)rJiterr|parentrar )r5r~r)r5r~r_mapperss  zIterateMappersMixin._mappersN)rwrxryrrrrrr{sr{c@s eZdZdZddZddZdS)rI)r|rJ processedsetup_flush_actionscCs||_||_t|_d|_dS)NF)r|rJr(rr)r5r|rJrrrr6szPreprocess.__init__cCst}t}xZ||D]L}xF|j||jD]0}|j|\}}|s0|rV||q0||q0WqW|r|j|||j ||r|j |||j ||s|r|j s|j ||ds|j ||dr|j |d|_ dSdSdS)NTF)r(rr/rmrr3rOr|Zpresort_deletesrSZ presort_savesrZprop_has_changesZper_property_flush_actions)r5r~Z delete_statesZ save_statesr rrArPrrrrjs2      zPreprocess.executeN)rwrxry __slots__r6rjrrrrrIsrIc@s eZdZdZddZddZdS) PostSortRec)rfcGs@|f|}||jkr|j|St||j|<}d|_|SdS)NF)r1object__new__rf)clsr~argsrr?rrrrs    zPostSortRec.__new__cCs||dS)N)rj)r5r~recsrrrrqszPostSortRec.execute_aggregateN)rwrxryrrrqrrrrrs rc@s8eZdZdZddZddZddZdd Zd d Zd S) ProcessAll)r|rArJcCs*||_||_||_|j|jj|dS)N)r|rArJr.rrRrO)r5r~r|rArJrrrr6s zProcessAll.__init__cCs2||}|jr |j||n|j||dS)N) _elementsrAr|process_deletes process_saves)r5r~r3rrrrjs zProcessAll.executecCstgS)N)r)r5r~rrrrcsz"ProcessAll.per_state_flush_actionscCsd|jj|j|jfS)Nz%s(%s, isdelete=%s)) __class__rwr|rA)r5rrr__repr__%szProcessAll.__repr__ccsNxH||D]:}x4|j|D]&}|j|\}}||jkr|s|VqWq WdS)N)rr/r3rA)r5r~r rrArPrrrr,s zProcessAll._elementsN) rwrxryrr6rjrcrrrrrrr s rc@s eZdZdZddZddZdS) PostUpdateAll)r rAcCs||_||_dS)N)r rA)r5r~r rArrrr67szPostUpdateAll.__init__cs:jj\}}fdd|D}tj||dS)Ncs$g|]}j|djkr|qS)r=)r3rA)r\r])r5r~rrr_=sz)PostUpdateAll.execute..)r4r rZ post_update)r5r~r3rTr)r5r~rrj;szPostUpdateAll.executeN)rwrxryrr6rjrrrrr4src@s0eZdZdZddZddZddZdd Zd S) rV)r cCs||_||jkstdS)N)r rRAssertionError)r5r~r rrrr6EszSaveUpdateAll.__init__cCs t|j||jdd|dS)NF)rsave_objr rb)r5r~rrrrjIszSaveUpdateAll.executec cst||jdd}|jj}t||}x,|D]$}t||}|j||f|Vq,Wx.|j|jD]}| ||}| ||dqbWdS)NF) rhrbr rRrWSaveUpdateStater2rOr.r`rc) r5r~r3rRZ delete_allrrnrXstates_for_proprrrrcPs     z%SaveUpdateAll.per_state_flush_actionscCsd|jj|jfS)Nz%s(%s))rrwr )r5rrrraszSaveUpdateAll.__repr__N)rwrxryrr6rjrcrrrrrrVBs rVc@s0eZdZdZddZddZddZdd Zd S) rW)r cCs||_||jkstdS)N)r rRr)r5r~r rrrr6hszDeleteAll.__init__cCs t|j||jdd|dS)NTF)r delete_objr rb)r5r~rrrrjlszDeleteAll.executec cst||jdd}|jj}t||}x,|D]$}t||}|j||f|Vq,Wx.|j|jD]}| ||}| ||dqbWdS)NTF) rhrbr rRrV DeleteStater2rOr.r`rc) r5r~r3rRZsave_allrrnrXrrrrrcss     z!DeleteAll.per_state_flush_actionscCsd|jj|jfS)Nz%s(%s))rrwr )r5rrrrszDeleteAll.__repr__N)rwrxryrr6rjrcrrrrrrWes rWc@s(eZdZdZddZddZddZdS) ProcessState)r|rArcCs||_||_||_dS)N)r|rAr)r5r~r|rArrrrr6szProcessState.__init__csj|j|j|jfdd|D}|||jgdd|D}rZ||n ||dS)Ncs.g|]&}|jkr|jkr|jkr|qSr)rr|rA)r\r)cls_r|rArrr_s  z2ProcessState.execute_aggregate..cSsg|] }|jqSr)r)r\rrrrr_s)rr|rAdifference_updaterrr)r5r~rour_recsr3r)rr|rArrqs zProcessState.execute_aggregatecCs d|jj|jt|j|jfS)Nz%s(%s, %s, delete=%s))rrwr|rM state_strrrA)r5rrrrs  zProcessState.__repr__N)rwrxryrr6rqrrrrrrsrc@s(eZdZdZddZddZddZdS) r)rr cCs||_|jj|_dS)N)rr rR)r5r~rrrrr6szSaveUpdateState.__init__csN|j|jfdd|D}||t|jgdd|D|dS)Ncs$g|]}|jkr|jkr|qSr)rr )r\r)rr rrr_sz5SaveUpdateState.execute_aggregate..cSsg|] }|jqSr)r)r\rrrrr_s)rr rrrr)r5r~rrr)rr rrqs  z!SaveUpdateState.execute_aggregatecCsd|jjt|jfS)Nz%s(%s))rrwrMrr)r5rrrrszSaveUpdateState.__repr__N)rwrxryrr6rqrrrrrrs rc@s(eZdZdZddZddZddZdS) r)rr cCs||_|jj|_dS)N)rr rR)r5r~rrrrr6szDeleteState.__init__cs`|j|jfdd|D}|||jgdd|D}tfdd|DdS)Ncs$g|]}|jkr|jkr|qSr)rr )r\r)rr rrr_sz1DeleteState.execute_aggregate..cSsg|] }|jqSr)r)r\rrrrr_scsg|]}j|dr|qS)r=)r3)r\r])r~rrr_s)rr rrrr)r5r~rrr3r)rr r~rrqs zDeleteState.execute_aggregatecCsd|jjt|jfS)Nz%s(%s))rrwrMrr)r5rrrrszDeleteState.__repr__N)rwrxryrr6rqrrrrrrs rN)__doc__rrr:rrrMrrr)rr*r{rIrrrrVrWrrrrrrrs*       i> 2(###