HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-310.pyc
o

���g�i�@s�dZddlmZddlmZddlmZddlmZddlmZddlmZdd	l	m
Z
dd
l	mZddl	m
Zdd
l	mZddl	m
Z
ddl
mZerpddlmZddlmZddlmZddlmZddlmZddlmZdd�ZGdd�d�ZGdd�d�ZGdd�de�ZGdd�d�Z Gdd �d ee �Z!Gd!d"�d"e �Z"Gd#d$�d$e �Z#Gd%d&�d&e �Z$Gd'd(�d(e �Z%Gd)d*�d*e �Z&Gd+d,�d,e �Z'd-S).z�The 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.

�)�annotations)�Any)�Dict)�Optional)�Set)�
TYPE_CHECKING���
attributes)�exc)�util�)�event)�topological)�DependencyProcessor)�MapperProperty)�Mapper)�Session)�SessionTransaction)�
InstanceStatecs�|j��fdd�}�fdd�}�fdd�}tj|d|ddd	�tj|d
|dddd�tj|d|dddd�tj|d
|dddd�dS)z\Establish event listeners on object attributes which handle
    cascade-on-set/append.

    csh|durdS|j}|r2|jr|�d�|jjj�}t�|�}|jj	r2�|j
kr2|�|�s2|�|�|S)Nzcollection append)
�session�_warn_on_events�_flush_warning�manager�mapper�_propsr
�instance_state�_cascade�save_update�key�_contains_state�_save_or_update_state��state�item�	initiator�kw�sess�prop�
item_state�r��D/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/unitofwork.py�append2s

�
�
z$track_cascade_events.<locals>.appendcs�|durdS|j}|jjj�}|r|jr|�|jrdnd�|durO|tjurQ|tj	urS|j
jrUt�|�}|j�
|�rW|rJ||jvrJ|�|�dSd|_dSdSdSdSdSdS)Nzcollection removezrelated attribute deleteT)rrrrrr�uselistr
�	NEVER_SET�PASSIVE_NO_RESULTr�
delete_orphanr�
_is_orphan�_new�expunge�_orphaned_outside_of_sessionr"r*r+r,�removeIs0
��

�

�z$track_cascade_events.<locals>.removec	s�||ur|S|j}|r]|jr|�d�|jjj�}|dur6t�|�}|jj	r6�|j
kr6|�|�s6|�|�|dur]|tj
ur]|tjur]|jjr]t�|�}||jvr]|j�|�r]|�|�|S)Nzrelated attribute set)rrrrrrr
rrrrr r!r/r0r1r3r2r4)	r#�newvalue�oldvaluer%r&r'r(�newvalue_state�oldvalue_stater*r+r,�set_ks4

�
�


�
�
z"track_cascade_events.<locals>.set_�append_wo_mutationT)�raw�include_keyr-)r=�retvalr>r6�setN)rr�listen)�
descriptorr(r-r6r;r+r*r,�track_cascade_events+s "$
���
�rCc@s�eZdZUded<ded<ded<ded<d	ed
<d=dd�Zed
d��Zdd�Zdd�Zdd�Z	dd�Z
ejfdd�Z
dd�Zdd�Z					d>d?d*d+�Zd,d-�Zd.d/�Zejd0d1��Zd2d3�Zd4d5�Zd6d7�Zd@d9d:�Zd@d;d<�ZdS)A�UOWTransactionrrr�transactionzDict[str, Any]r
z7util.defaultdict[Mapper[Any], Set[DependencyProcessor]]�depsz6util.defaultdict[Mapper[Any], Set[InstanceState[Any]]]�mapperscCsR||_i|_t�t�|_t�t�|_i|_i|_t�|_	i|_
t�dd��|_dS)NcSst�t�fS�N)r@r+r+r+r,�<lambda>�sz)UOWTransaction.__init__.<locals>.<lambda>)rr
r�defaultdictr@rFrG�presort_actions�postsort_actions�dependencies�states�post_update_states)�selfrr+r+r,�__init__�szUOWTransaction.__init__cCs
t|j�SrH)�boolrN�rPr+r+r,�has_work�s
zUOWTransaction.has_workcCsD|jr z
|�|tj�WdStjy|j�|g�YdSwdS)zZReturn ``True`` if the given state is expired and was deleted
        previously.
        TF)�expired�
_load_expiredr
�PASSIVE_OFF�orm_exc�ObjectDeletedErrorr�_remove_newly_deleted�rPr#r+r+r,�was_already_deleted�s��z"UOWTransaction.was_already_deletedcCs||jvo|j|dS)z[Return ``True`` if the given state is marked as deleted
        within this uowtransaction.r�rNr[r+r+r,�
is_deleted�szUOWTransaction.is_deletedcCs(||jvr
|j|S|�|j|<}|SrHr	)rPr�	callable_�retr+r+r,�memo�s

zUOWTransaction.memocCs |j|d}|df|j|<dS)z;Remove pending actions for a state from the uowtransaction.rTNr])rPr#�isdeleter+r+r,�remove_state_actions�sz#UOWTransaction.remove_state_actionsc	Cs�d||f}||jvrG|j|\}}}|tj@sE|tj@rE|j|j}|�||jtjtjBtjB�}|r;|j	r;|�
�}n|}|||f|j|<|S|j|j}|�||j|tjBtjB�}|re|j	re|�
�}n|}|||f|j|<|S)zOFacade to attributes.get_state_history(), including
        caching of results.�history)r
�SQL_OKr�impl�get_history�dictrW�LOAD_AGAINST_COMMITTED�NO_RAISE�uses_objects�as_state)	rPr#r�passive�hashkeyrd�
state_history�cached_passiverfr+r+r,�get_attribute_history�sJ

�����

����

z$UOWTransaction.get_attribute_historycCs|df|jvS)NT)rK)rP�	processorr+r+r,�has_dep*�zUOWTransaction.has_depcCs*||f}||jvrt||�|j|<dSdSrH)rK�
Preprocess)rPrr�
fromparentrr+r+r,�register_preprocessor-s
�z$UOWTransaction.register_preprocessorFNr#�InstanceState[Any]rbrR�listonly�
cancel_delete�	operation�
Optional[str]r(�Optional[MapperProperty]�returncCs�|j�|�s|js|durt�dt�|�||f�dS||jvr@|jj	}||j
vr/|�|�|j
|�|�||f|j|<dS|sM|sF|rM|df|j|<dS)NzJObject of type %s not in session, %s operation along '%s' will not proceedFT)
rr �deletedr�warn�orm_util�state_class_strrNrrrG�_per_mapper_flush_actions�add)rPr#rbryrzr{r(rr+r+r,�register_object2s$	��


�zUOWTransaction.register_objectcCs0|jjj}|j|\}}|�|�|�|�dSrH)rr�base_mapperrOr��update)rPr#�post_update_colsrrN�colsr+r+r,�register_post_updateTs

z#UOWTransaction.register_post_updatecCsft||j�}t||j�}|j�||f�|jD]}|�|�q|jD]}|jr(q"|j	}|�|�q"dSrH)
�
SaveUpdateAllr��	DeleteAllrMr��_dependency_processors�per_property_preprocessors�
relationships�viewonly�_dependency_processor)rPr�saves�deletes�depr(r+r+r,r�Zs

�z(UOWTransaction._per_mapper_flush_actionscCst�dd��S)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�|djuS)Nrr)r�getrr()�tupr+r+r,rIs� z0UOWTransaction._mapper_for_dep.<locals>.<lambda>)r�PopulateDictrSr+r+r,�_mapper_for_dephs
�zUOWTransaction._mapper_for_depcs|j���fdd�|D�S)zmFilter the given list of InstanceStates to those relevant to the
        given DependencyProcessor.

        cs g|]}�|jj�fr|�qSr+)rr��.0�s�r��mapper_for_depr+r,�
<listcomp>|r�z8UOWTransaction.filter_states_for_dep.<locals>.<listcomp>)r�)rPr�rNr+r�r,�filter_states_for_depvsz$UOWTransaction.filter_states_for_depccs@�||f}|jjD]}|j|D]}|j||kr|Vqq	dSrH)r��self_and_descendantsrGrN)rPrrbry�checktupr#r+r+r,�states_for_mapper_hierarchy~s����z*UOWTransaction.states_for_mapper_hierarchycs@	d}t�j���D]	}|���rd}q
|snqt��jt�j�����_}|r��fdd�|D�}t�j�D][}d|vsL|dj	sL|dj	sL|�
|�rS�j�|�q7|d|vrs�j�|�||dD]}�j�||df�qeq7|d|vr��j�|�||dD]}�j�|d|f�q�q7dd	��j��D��
|�S)
z}Generate the full, unsorted collection of PostSortRecs as
        well as dependency pairs for this UOWTransaction.

        TFcsi|]
}|t|�����qSr+)r@�per_state_flush_actions)r��recrSr+r,�
<dictcomp>�s�z4UOWTransaction._generate_actions.<locals>.<dictcomp>NrrcSsh|]}|js|�qSr+��disabled)r��ar+r+r,�	<setcomp>�s
��z3UOWTransaction._generate_actions.<locals>.<setcomp>)�listrK�values�executer�find_cyclesrMrL�cyclesr��
issupersetr6r��
difference)rPr`�actionr��convert�edger�r+rSr,�_generate_actions�sP
��	
�
��������z UOWTransaction._generate_actions�NonecCs||��}t|dd�d�}|jr-t�|j|�D]}t|�}|r*|��}|�||�|sqdSt�	|j|�D]}|�
|�q4dS)NcSs|jSrH)�sort_key)r$r+r+r,rI�sz(UOWTransaction.execute.<locals>.<lambda>r*)r��sortedr�r�sort_as_subsetsrMr@�pop�execute_aggregate�sortr�)rPrL�subsetr;�nr�r+r+r,r��s&������zUOWTransaction.executecCsZ|jsdSt|j�}dd�|j��D�}|�|�}|r!|j�|�|r+|j�|�dSdS)z�Mark 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.

        NcSsh|]
\}\}}|r|�qSr+r+)r�r�rbryr+r+r,r��s
��z8UOWTransaction.finalize_flush_changes.<locals>.<setcomp>)rNr@�itemsr�rrZ�_register_persistent)rPrN�isdel�otherr+r+r,�finalize_flush_changes�s
�
�z%UOWTransaction.finalize_flush_changes)rr)FFFNN)r#rxrbrRryrRrzrRr{r|r(r}r~rR)r~r�)�__name__�
__module__�__qualname__�__annotations__rQ�propertyrTr\r^rarcr
�PASSIVE_NO_INITIALIZErqrsrwr�r�r�r�memoized_propertyr�r�r�r�r�r�r+r+r+r,rD�s@

-

�5�"


4rDc@seZdZdZdd�ZdS)�IterateMappersMixinr+cs.�jrt��fdd��jjjD��S�jjjS)Nc3s$�|]
}�j|�jfr|VqdSrH)r��dependency_processor)r��m�rP�uowr+r,�	<genexpr>�s��
�z/IterateMappersMixin._mappers.<locals>.<genexpr>)rv�iterr��parentr�rr�r+r�r,�_mappers�s
�
zIterateMappersMixin._mappersN)r�r�r��	__slots__r�r+r+r+r,r��sr�c@� eZdZdZdd�Zdd�ZdS)ru)r�rv�	processed�setup_flush_actionscCs||_||_t�|_d|_dS�NF)r�rvr@r�r�)rPr�rvr+r+r,rQs
zPreprocess.__init__cCs�t�}t�}|�|�D]$}|j|�|j�D]}|j|\}}|s.|r)|�|�q|�|�qq|r?|j�||�|j�	|�|rN|j�
||�|j�	|�|sR|rp|jsn|j�||d�se|j�||d�rn|j�
|�d|_dSdS�NTF)r@r�rGr�r�rNr�r��presort_deletesr��
presort_savesr��prop_has_changes�per_property_flush_actions)rPr��
delete_states�save_statesrr#rbryr+r+r,r�s>
������zPreprocess.executeN)r�r�r�r�rQr�r+r+r+r,ru�sruc@r�)�PostSortRecr�cGs<|f|}||jvr|j|St�|�|j|<}d|_|Sr�)rL�object�__new__r�)�clsr��argsrr`r+r+r,r�-s


zPostSortRec.__new__cCs|�|�dSrH)r�)rPr��recsr+r+r,r�6rtzPostSortRec.execute_aggregateN)r�r�r�r�r�r�r+r+r+r,r�*s	r�c@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�
ProcessAll)r�rbrvr�cCs:||_d|jj|f|_||_||_|j|jj�|�dS)Nr�)r�r�rbrvrFr�r�r�)rPr�r�rbrvr+r+r,rQ=s��zProcessAll.__init__cCs4|�|�}|jr|j�||�dS|j�||�dSrH)�	_elementsrbr��process_deletes�
process_saves)rPr�rNr+r+r,r�Js
zProcessAll.executecCstg�SrH)r�r�r+r+r,r�Qsz"ProcessAll.per_state_flush_actionscCsd|jj|j|jfS)Nz%s(%s, isdelete=%s))�	__class__r�r�rbrSr+r+r,�__repr__Xs
�zProcessAll.__repr__ccsH�|�|�D]}|j|D]}|j|\}}||jkr |s |Vq
qdSrH)r�rGrNrb)rPr�rr#rbryr+r+r,r�_s����zProcessAll._elementsN)	r�r�r�r�rQr�r�r�r�r+r+r+r,r�:s
r�c@s*eZdZdZdd�Ze�d�dd��ZdS)�
PostUpdateAll)rrbr�cCs||_||_d|j|f|_dS)Nr�)rrb�	_sort_keyr�)rPr�rrbr+r+r,rQjszPostUpdateAll.__init__�sqlalchemy.orm.persistencecsBtjj}�j�j\}}��fdd�|D�}|��j|�|�dS)Ncs$g|]}�j|d�jkr|�qS�r)rNrbr�r�r+r,r�ss$z)PostUpdateAll.execute.<locals>.<listcomp>)r�	preloaded�orm_persistencerOr�post_update)rPr��persistencerNr�r+r�r,r�oszPostUpdateAll.executeN)r�r�r�r�rQr�preload_moduler�r+r+r+r,r�gs
r�c@�:eZdZdZdd�Ze�d�dd��Zdd�Zd	d
�Z	dS)r��rr�cC�$||_d|jf|_||jusJ�dS)Nr��rr�r�r��rPr�rr+r+r,rQ{�zSaveUpdateAll.__init__r�cCs$tjj�|j|�|jdd�|�dSr�)rr�r��save_objrr�r�r+r+r,r���
�zSaveUpdateAll.executec	cs��t|�|jdd��}|jj}t||�}|D]}t||�}|j�||f�|Vq|j|jD]}|�	||�}|�
||d�q/dSr�)r�r�rr�r��SaveUpdateStaterMr�rFr�r�)	rPr�rNr��
delete_allr#r�r��states_for_propr+r+r,r�����

�z%SaveUpdateAll.per_state_flush_actionscC�d|jj|jfS�Nz%s(%s)�r�r�rrSr+r+r,r���zSaveUpdateAll.__repr__N�
r�r�r�r�rQrr�r�r�r�r+r+r+r,r�x�
r�c@r�)r�r�cCr�)Nr�r�r�r+r+r,rQ�r�zDeleteAll.__init__r�cCs$tjj�|j|�|jdd�|�dSr�)rr�r��
delete_objrr�r�r+r+r,r��r�zDeleteAll.executec	cs��t|�|jdd��}|jj}t||�}|D]}t||�}|j�||f�|Vq|j|jD]}|�	||�}|�
||d�q/dSr�)r�r�rr�r��DeleteStaterMr�rFr�r�)	rPr�rNr��save_allr#r�r�r�r+r+r,r��rz!DeleteAll.per_state_flush_actionscCrrrrSr+r+r,r��rzDeleteAll.__repr__Nrr+r+r+r,r��rr�c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�ProcessState)r�rbr#r�cCs"||_d|jf|_||_||_dS�Nr
)r�r�rbr#)rPr�r�rbr#r+r+r,rQ�s
zProcessState.__init__csl|j�|j�|j����fdd�|D�}|�|�|jgdd�|D�}�r.��||�dS��||�dS)Ncs.g|]}|j�ur|j�ur|j�ur|�qSr+)r�r�rb�r��r��cls_r�rbr+r,r��s


�z2ProcessState.execute_aggregate.<locals>.<listcomp>cS�g|]}|j�qSr+�r#rr+r+r,r���)r�r�rb�difference_updater#r�r�)rPr�r��our_recsrNr+rr,r��s�
zProcessState.execute_aggregatecCs d|jj|jt�|j�|jfS)Nz%s(%s, %s, delete=%s))r�r�r�r��	state_strr#rbrSr+r+r,r��s
�zProcessState.__repr__N)r�r�r�r�rQr�r�r+r+r+r,r
�s
r
c@�2eZdZdZdd�Ze�d�dd��Zdd�Zd	S)
r��r#rr�cC�"||_|jj|_d|jjf|_dSr�r#rr�r�r��rPr�r#r+r+r,rQ��
zSaveUpdateState.__init__r�csVtjj}|j�|j���fdd�|D�}|�|�|��|jgdd�|D�|�dS)Nc�$g|]}|j�ur|j�ur|�qSr+�r�rr�rrr+r,r���z5SaveUpdateState.execute_aggregate.<locals>.<listcomp>cSrr+rrr+r+r,r��r)rr�r�r�rrr�r#)rPr�r�r�rr+rr,r��s�
�z!SaveUpdateState.execute_aggregatecC�d|jjt�|j�fSr�r�r�r�rr#rSr+r+r,r���
�zSaveUpdateState.__repr__N�	r�r�r�r�rQrr�r�r�r+r+r+r,r��s
r�c@r)
rrcCr)Nrrrr+r+r,rQrzDeleteState.__init__r�cshtjj}|j�|j���fdd�|D�}|�|�|jgdd�|D�}|���fdd�|D���dS)Ncrr+rrrr+r,r�rz1DeleteState.execute_aggregate.<locals>.<listcomp>cSrr+rrr+r+r,r�rcsg|]}�j|dr|�qSr�r]r�)r�r+r,r�s)rr�r�r�rrr#r)rPr�r�r�rrNr+)rrr�r,r�
s�
�zDeleteState.execute_aggregatecCr rr!rSr+r+r,r�r"zDeleteState.__repr__Nr#r+r+r+r,rs

rN)(�__doc__�
__future__r�typingrrrrr�r
rrXrr�rr�
dependencyr�
interfacesrrrrrrr#rrCrDr�rur�r�r�r�r�r
r�rr+r+r+r,�<module>sD	rO2-%%$