o
    y¬´\È_  ã                   @   s  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mZ ddlmZ ddlm	Z	 d	d
„ Z
G dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deeƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG d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.

é   ©Ú
attributes)Úexc)Úpersistence)Úutilé   )Úevent)Útopologicalc                    sj   |j ‰ ‡ fdd„}‡ fdd„}‡ fdd„}tj| d|ddd	� tj| d
|ddd	� tj| d|ddd	� dS )z\Establish event listeners on object attributes which handle
    cascade-on-set/append.

    c                    sn   |d u rd S | j }|r5|jr| d¡ | jjjˆ  }t |¡}|jj	r5|j
s+ˆ |jkr5| |¡s5| |¡ |S )Nzcollection append)ÚsessionÚ_warn_on_eventsÚ_flush_warningÚmanagerÚmapperÚ_propsr   Úinstance_stateÚ_cascadeÚsave_updateÚcascade_backrefsÚkeyÚ_contains_stateÚ_save_or_update_state©ÚstateÚitemÚ	initiatorÚsessÚpropÚ
item_state©r   © úK/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.pyÚappend    s"   

ÿþ
ÿ
z$track_cascade_events.<locals>.appendc                    sŠ   |d u rd S | j }| jjjˆ  }|r|jr| |jrdnd¡ t |¡}|j	j
rA|j |¡rC|r<||jv r<| |¡ d S d|_d S d S d S )Nzcollection removezrelated attribute deleteT)r
   r   r   r   r   r   Úuselistr   r   r   Údelete_orphanÚ
_is_orphanÚ_newÚexpungeÚ_orphaned_outside_of_sessionr   r   r   r    Úremove6   s    
ÿý

øz$track_cascade_events.<locals>.removec                    sÄ   ||u r|S | j }|r`|jr| d¡ | jjjˆ  }|d ur9t |¡}|jj	r9|j
s/ˆ |jkr9| |¡s9| |¡ |d ur`|tjur`|tjur`|jjr`t |¡}||jv r`|j |¡r`| |¡ |S )Nzrelated attribute set)r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú	NEVER_SETÚPASSIVE_NO_RESULTr#   r%   r$   r&   )r   ÚnewvalueÚoldvaluer   r   r   Únewvalue_stateÚoldvalue_stater   r   r    Úset_R   s8   

ÿþ
ÿ


ÿ
ÿ
z"track_cascade_events.<locals>.set_r!   T)ÚrawÚretvalr(   ÚsetN)r   r   Úlisten)Ú
descriptorr   r!   r(   r/   r   r   r    Útrack_cascade_events   s   %r5   c                   @   s¸   e Zd Zdd„ Zedd„ ƒZdd„ Zdd„ Zd	d
„ Zdd„ Z	e
jfdd„Zdd„ Zdd„ Z					d'dd„Zdd„ Zdd„ Zejdd„ ƒZdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ ZdS )(ÚUOWTransactionc                 C   sR   || _ i | _t t¡| _t t¡| _i | _i | _tƒ | _	i | _
t dd„ ¡| _d S )Nc                   S   s   t ƒ t ƒ fS ©N)r2   r   r   r   r    Ú<lambda>¨   s    z)UOWTransaction.__init__.<locals>.<lambda>)r
   r   r   Údefaultdictr2   ÚdepsÚmappersÚpresort_actionsÚpostsort_actionsÚdependenciesÚstatesÚpost_update_states)Úselfr
   r   r   r    Ú__init__}   s   zUOWTransaction.__init__c                 C   s
   t | jƒS r7   )Úboolr?   ©rA   r   r   r    Úhas_workª   s   
zUOWTransaction.has_workc                 C   sD   |j r z
| |tj¡ W dS  tjy   | j |g¡ Y dS w dS )zVreturn true if the given state is expired and was deleted
        previously.
        TF)ÚexpiredÚ_load_expiredr   ÚPASSIVE_OFFÚorm_excÚObjectDeletedErrorr
   Ú_remove_newly_deleted©rA   r   r   r   r    Úwas_already_deleted®   s   ýþz"UOWTransaction.was_already_deletedc                 C   s   || j v o| j | d S )zWreturn true if the given state is marked as deleted
        within this uowtransaction.é    ©r?   rL   r   r   r    Ú
is_deletedº   s   zUOWTransaction.is_deletedc                 C   s(   || j v r
| j | S |ƒ  | j |< }|S r7   r   )rA   r   Ú	callable_Úretr   r   r    ÚmemoÀ   s   

zUOWTransaction.memoc                 C   s    | j | d }|df| j |< dS )z;remove pending actions for a state from the uowtransaction.rN   TNrO   )rA   r   Úisdeleter   r   r    Úremove_state_actionsÇ   s   z#UOWTransaction.remove_state_actionsc           	      C   sÖ   d||f}|| j v rD| j | \}}}|t j@ sB|t j@ rB|j| j}| ||jt jt jB ¡}|r8|jr8| 	¡ }n|}|||f| j |< |S |j| j}| ||j|t jB ¡}|r_|jr_| 	¡ }n|}|||f| j |< |S )zOfacade to attributes.get_state_history(), including
        caching of results.Úhistory)
r   ÚSQL_OKr   ÚimplÚget_historyÚdictrH   ÚLOAD_AGAINST_COMMITTEDÚuses_objectsÚas_state)	rA   r   r   ÚpassiveÚhashkeyrV   Ústate_historyÚcached_passiverX   r   r   r    Úget_attribute_historyÎ   s6   

ÿþ
ý

ôÿ

z$UOWTransaction.get_attribute_historyc                 C   s   |df| j v S )NT)r<   )rA   Ú	processorr   r   r    Úhas_depý   ó   zUOWTransaction.has_depc                 C   s*   ||f}|| j vrt||ƒ| j |< d S d S r7   )r<   Ú
Preprocess)rA   rc   Ú
fromparentr   r   r   r    Úregister_preprocessor   s   
ÿz$UOWTransaction.register_preprocessorFNc                 C   sž   | j  |¡s|js|d urt dt |¡||f ¡ dS || jvr@|jj	}|| j
vr/|  |¡ | j
|  |¡ ||f| j|< dS |sM|sF|rM|df| j|< dS )NzJObject of type %s not in session, %s operation along '%s' will not proceedFT)r
   r   Údeletedr   ÚwarnÚorm_utilÚstate_class_strr?   r   r   r;   Ú_per_mapper_flush_actionsÚadd)rA   r   rT   ÚlistonlyÚcancel_deleteÚ	operationr   r   r   r   r    Úregister_object  s$   	þÿ


þzUOWTransaction.register_objectc                 C   s0   |j jj}| j| \}}| |¡ | |¡ d S r7   )r   r   Úbase_mapperr@   rn   Úupdate)rA   r   Úpost_update_colsr   r?   Úcolsr   r   r    Úregister_post_update'  s   

z#UOWTransaction.register_post_updatec                 C   sf   t | |jƒ}t| |jƒ}| j ||f¡ |jD ]}| | ¡ q|jD ]}|jr(q"|j	}| | ¡ q"d S r7   )
ÚSaveUpdateAllrs   Ú	DeleteAllr>   rn   Ú_dependency_processorsÚper_property_preprocessorsÚrelationshipsÚviewonlyÚ_dependency_processor)rA   r   ÚsavesÚdeletesÚdepr   r   r   r    rm   -  s   

üz(UOWTransaction._per_mapper_flush_actionsc                 C   s   t  dd„ ¡S )a  return 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.

        c                 S   s    | d j  | d j¡| d ju S )NrN   r   )r   Úgetr   r   )Útupr   r   r    r8   F  ó     z0UOWTransaction._mapper_for_dep.<locals>.<lambda>)r   ÚPopulateDictrD   r   r   r    Ú_mapper_for_dep;  s   
ÿzUOWTransaction._mapper_for_depc                    s   | j ‰‡ ‡fdd„|D ƒS )zmFilter the given list of InstanceStates to those relevant to the
        given DependencyProcessor.

        c                    s    g | ]}ˆ|j jˆ f r|‘qS r   )r   r   ©Ú.0Ús©r�   Úmapper_for_depr   r    Ú
<listcomp>O  r„   z8UOWTransaction.filter_states_for_dep.<locals>.<listcomp>)r†   )rA   r�   r?   r   rŠ   r    Úfilter_states_for_depI  s   z$UOWTransaction.filter_states_for_depc                 c   s@   � ||f}|j jD ]}| j| D ]}| j| |kr|V  qq	d S r7   )rs   Úself_and_descendantsr;   r?   )rA   r   rT   ro   Úchecktupr   r   r   r    Ústates_for_mapper_hierarchyQ  s   €€þÿz*UOWTransaction.states_for_mapper_hierarchyc                    sH  	 d}t ˆ j ¡ ƒD ]	}| ˆ ¡rd}q
|snqt ˆ jt ˆ j ¡ ƒ¡ ˆ _}|r•t	‡ fdd„|D ƒƒ}t ˆ jƒD ][}d|v sN|d j
sN|d j
sN| |¡rUˆ j |¡ q9|d |v ruˆ j |¡ ||d  D ]}ˆ j ||d f¡ qgq9|d |v r”ˆ j |¡ ||d  D ]}ˆ j |d |f¡ q‡q9tdd	„ ˆ j ¡ D ƒƒ |¡S )
z}Generate the full, unsorted collection of PostSortRecs as
        well as dependency pairs for this UOWTransaction.

        TFc                 3   s"   � | ]}|t | ˆ ¡ƒfV  qd S r7   )r2   Úper_state_flush_actions)rˆ   ÚrecrD   r   r    Ú	<genexpr>p  s   € 
ÿz3UOWTransaction._generate_actions.<locals>.<genexpr>NrN   r   c                 S   s   g | ]}|j s|‘qS r   ©Údisabled)rˆ   Úar   r   r    rŒ   ‰  s    z4UOWTransaction._generate_actions.<locals>.<listcomp>)Úlistr<   ÚvaluesÚexecuter	   Úfind_cyclesr>   r=   ÚcyclesrZ   r•   Ú
issupersetr(   rn   r2   Ú
difference)rA   rR   Úactionr›   ÚconvertÚedger�   r   rD   r    Ú_generate_actionsX  sP   
€ú	
ÿÿÿþýÿ€ÿþz UOWTransaction._generate_actionsc                 C   sd   |   ¡ }| jr!t | j|¡D ]}|r| ¡ }| | |¡ |sqd S t | j|¡D ]}| | ¡ q(d S r7   )	r¡   r›   r	   Úsort_as_subsetsr>   ÚpopÚexecute_aggregateÚsortr™   )rA   r=   r/   Únr’   r   r   r    r™   Œ  s   
ÿþ€ýÿzUOWTransaction.executec                 C   s^   | j sdS t| j ƒ}tdd„ | j  ¡ D ƒƒ}| |¡}|r#| j |¡ |r-| j |¡ dS dS )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.

        Nc                 s   s    � | ]\}\}}|r|V  qd S r7   r   )rˆ   r‰   rT   ro   r   r   r    r“   ®  s   € ÿ
ÿz8UOWTransaction.finalize_flush_changes.<locals>.<genexpr>)r?   r2   Úitemsr�   r
   rK   Ú_register_persistent)rA   r?   ÚisdelÚotherr   r   r    Úfinalize_flush_changes¢  s   
ÿ
ÿz%UOWTransaction.finalize_flush_changes)FFFNN)Ú__name__Ú
__module__Ú__qualname__rB   ÚpropertyrE   rM   rP   rS   rU   r   ÚPASSIVE_NO_INITIALIZErb   rd   rh   rr   rw   rm   r   Úmemoized_propertyr†   r�   r�   r¡   r™   r«   r   r   r   r    r6   |   s6    -

ÿ/
ù"
4r6   c                   @   s   e Zd Zdd„ ZdS )ÚIterateMappersMixinc                    s.   ˆ j rt‡ ‡fdd„ˆ jjjD ƒƒS ˆ jjjS )Nc                 3   s$   � | ]}ˆj |ˆ jf r|V  qd S r7   )r†   Údependency_processor)rˆ   Úm©rA   Úuowr   r    r“   »  s   € ý
ÿz/IterateMappersMixin._mappers.<locals>.<genexpr>)rg   Úiterr³   ÚparentrŽ   r   rµ   r   rµ   r    Ú_mappers¹  s
   þ
zIterateMappersMixin._mappersN)r¬   r­   r®   r¹   r   r   r   r    r²   ¸  s    r²   c                   @   ó    e Zd ZdZdd„ Zdd„ ZdS )rf   )r³   rg   Ú	processedÚsetup_flush_actionsc                 C   s   || _ || _tƒ | _d| _d S ©NF)r³   rg   r2   r»   r¼   )rA   r³   rg   r   r   r    rB   Ì  s   
zPreprocess.__init__c                 C   sä   t ƒ }t ƒ }|  |¡D ]$}|j|  | j¡D ]}|j| \}}|s.|r)| |¡ q| |¡ qq|r?| j ||¡ | j 	|¡ |rN| j 
||¡ | j 	|¡ |sR|rp| jsn| j ||d¡se| j ||d¡rn| j |¡ d| _dS dS ©NTF)r2   r¹   r;   r�   r»   r?   rn   r³   Úpresort_deletesrt   Úpresort_savesr¼   Úprop_has_changesÚper_property_flush_actions)rA   r¶   Údelete_statesÚsave_statesr   r   rT   ro   r   r   r    r™   Ò  s>   
€úÿÿÿüzPreprocess.executeN©r¬   r­   r®   Ú	__slots__rB   r™   r   r   r   r    rf   Ä  s    rf   c                   @   rº   )ÚPostSortRecr”   c                 G   s<   | f| }||j v r|j | S t | ¡ |j |< }d|_|S r½   )r=   ÚobjectÚ__new__r•   )Úclsr¶   Úargsr   rR   r   r   r    rÉ   ù  s   


zPostSortRec.__new__c                 C   s   |   |¡ d S r7   )r™   )rA   r¶   Úrecsr   r   r    r¤     re   zPostSortRec.execute_aggregateN)r¬   r­   r®   rÆ   rÉ   r¤   r   r   r   r    rÇ   ö  s    	rÇ   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú
ProcessAll)r³   rT   rg   c                 C   s*   || _ || _|| _|j|jj  |¡ d S r7   )r³   rT   rg   r:   r¸   rs   rn   )rA   r¶   r³   rT   rg   r   r   r    rB   	  s   ÿzProcessAll.__init__c                 C   s4   |   |¡}| jr| j ||¡ d S | j ||¡ d S r7   )Ú	_elementsrT   r³   Úprocess_deletesÚprocess_saves)rA   r¶   r?   r   r   r    r™     s   
zProcessAll.executec                 C   s   t g ƒS r7   )r·   rµ   r   r   r    r‘     s   z"ProcessAll.per_state_flush_actionsc                 C   s   d| j j| j| jf S )Nz%s(%s, isdelete=%s))Ú	__class__r¬   r³   rT   rD   r   r   r    Ú__repr__  s
   ýzProcessAll.__repr__c                 c   sH   � |   |¡D ]}|j| D ]}|j| \}}|| jkr |s |V  qqd S r7   )r¹   r;   r?   rT   )rA   r¶   r   r   rT   ro   r   r   r    rÎ   &  s   €€ýÿzProcessAll._elementsN)	r¬   r­   r®   rÆ   rB   r™   r‘   rÒ   rÎ   r   r   r   r    rÍ     s    rÍ   c                   @   rº   )ÚPostUpdateAll©r   rT   c                 C   s   || _ || _d S r7   rÔ   )rA   r¶   r   rT   r   r   r    rB   1  s   
zPostUpdateAll.__init__c                    s:   ˆj ˆ j \}}‡ ‡fdd„|D ƒ}t ˆ j|ˆ|¡ d S )Nc                    s$   g | ]}ˆj | d  ˆ jkr|‘qS ©rN   )r?   rT   r‡   rµ   r   r    rŒ   7  s   $ z)PostUpdateAll.execute.<locals>.<listcomp>)r@   r   r   Úpost_update)rA   r¶   r?   rv   r   rµ   r    r™   5  s   zPostUpdateAll.executeNrÅ   r   r   r   r    rÓ   .  s    rÓ   c                   @   ó0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )rx   ©r   c                 C   ó   || _ ||ju s
J ‚d S r7   ©r   rs   ©rA   r¶   r   r   r   r    rB   ?  ó   zSaveUpdateAll.__init__c                 C   s    t  | j| | jdd¡|¡ d S r½   )r   Úsave_objr   r�   rµ   r   r   r    r™   C  ó
   ýzSaveUpdateAll.executec           	      c   s‚   � t | | jdd¡ƒ}| jj}t||ƒ}|D ]}t||ƒ}|j ||f¡ |V  q|j| j D ]}| 	||¡}| 
||d¡ q/d S r½   )r—   r�   r   rs   ry   ÚSaveUpdateStater>   rn   r:   r�   r‘   )	rA   r¶   r?   rs   Ú
delete_allr   rž   r�   Ústates_for_propr   r   r    r‘   J  ó   €ÿ

þz%SaveUpdateAll.per_state_flush_actionsc                 C   ó   d| j j| jf S ©Nz%s(%s)©rÑ   r¬   r   rD   r   r   r    rÒ   [  ó   zSaveUpdateAll.__repr__N©r¬   r­   r®   rÆ   rB   r™   r‘   rÒ   r   r   r   r    rx   <  ó    rx   c                   @   r×   )ry   rØ   c                 C   rÙ   r7   rÚ   rÛ   r   r   r    rB   b  rÜ   zDeleteAll.__init__c                 C   s    t  | j| | jdd¡|¡ d S r¾   )r   Ú
delete_objr   r�   rµ   r   r   r    r™   f  rÞ   zDeleteAll.executec           	      c   s‚   � t | | jdd¡ƒ}| jj}t||ƒ}|D ]}t||ƒ}|j ||f¡ |V  q|j| j D ]}| 	||¡}| 
||d¡ q/d S r¾   )r—   r�   r   rs   rx   ÚDeleteStater>   rn   r:   r�   r‘   )	rA   r¶   r?   rs   Úsave_allr   rž   r�   rá   r   r   r    r‘   m  râ   z!DeleteAll.per_state_flush_actionsc                 C   rã   rä   rå   rD   r   r   r    rÒ   ~  ræ   zDeleteAll.__repr__Nrç   r   r   r   r    ry   _  rè   ry   c                   @   ó(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚProcessState©r³   rT   r   c                 C   s   || _ || _|| _d S r7   rî   )rA   r¶   r³   rT   r   r   r   r    rB   …  s   
zProcessState.__init__c                    sl   | j ‰ | j‰| j‰‡ ‡‡fdd„|D ƒ}| |¡ | jgdd„ |D ƒ }ˆr.ˆ ||¡ d S ˆ ||¡ d S )Nc                    s.   g | ]}|j ˆ u r|jˆu r|jˆu r|‘qS r   )rÑ   r³   rT   ©rˆ   Úr©Úcls_r³   rT   r   r    rŒ   Ž  s    


üz2ProcessState.execute_aggregate.<locals>.<listcomp>c                 S   ó   g | ]}|j ‘qS r   ©r   rï   r   r   r    rŒ   –  ó    )rÑ   r³   rT   Údifference_updater   rÏ   rÐ   ©rA   r¶   rÌ   Úour_recsr?   r   rñ   r    r¤   Š  s   þ
zProcessState.execute_aggregatec                 C   s    d| j j| jt | j¡| jf S )Nz%s(%s, %s, delete=%s))rÑ   r¬   r³   rk   Ú	state_strr   rT   rD   r   r   r    rÒ   œ  s   
üzProcessState.__repr__N©r¬   r­   r®   rÆ   rB   r¤   rÒ   r   r   r   r    rí   ‚  s
    rí   c                   @   rì   )	rß   ©r   r   c                 C   ó   || _ |jj| _d S r7   ©r   r   rs   ©rA   r¶   r   r   r   r    rB   ¨  ó   zSaveUpdateState.__init__c                    sN   | j ‰ | j‰‡ ‡fdd„|D ƒ}| |¡ t ˆ| jgdd„ |D ƒ |¡ d S )Nc                    ó$   g | ]}|j ˆ u r|jˆu r|‘qS r   ©rÑ   r   rï   ©rò   r   r   r    rŒ   ¯  ó    z5SaveUpdateState.execute_aggregate.<locals>.<listcomp>c                 S   ró   r   rô   rï   r   r   r    rŒ   ´  rõ   )rÑ   r   rö   r   rÝ   r   )rA   r¶   rÌ   rø   r   r  r    r¤   ¬  s   ÿ
ÿz!SaveUpdateState.execute_aggregatec                 C   ó   d| j jt | j¡f S rä   ©rÑ   r¬   rk   rù   r   rD   r   r   r    rÒ   ·  ó   
þzSaveUpdateState.__repr__Nrú   r   r   r   r    rß   ¥  s
    rß   c                   @   rì   )	rê   rû   c                 C   rü   r7   rý   rþ   r   r   r    rB   Á  rÿ   zDeleteState.__init__c                    s`   | j ‰ | j‰‡ ‡fdd„|D ƒ}| |¡ | jgdd„ |D ƒ }t ˆ‡fdd„|D ƒˆ¡ d S )Nc                    r   r   r  rï   r  r   r    rŒ   È  r  z1DeleteState.execute_aggregate.<locals>.<listcomp>c                 S   ró   r   rô   rï   r   r   r    rŒ   Ì  rõ   c                    s   g | ]}ˆ j | d  r|‘qS rÕ   rO   r‡   )r¶   r   r    rŒ   Î  s    )rÑ   r   rö   r   r   ré   r÷   r   )rò   r   r¶   r    r¤   Å  s   ÿ
ÿzDeleteState.execute_aggregatec                 C   r  rä   r  rD   r   r   r    rÒ   Ñ  r  zDeleteState.__repr__Nrú   r   r   r   r    rê   ¾  s
    rê   N)Ú__doc__Ú r   r   rI   r   r   rk   r   r	   r5   rÈ   r6   r²   rf   rÇ   rÍ   rÓ   rx   ry   rí   rß   rê   r   r   r   r    Ú<module>   s,   c  >2(###