U
    cc                     @   sp   d Z ddlmZ ddlmZ ddlmZ ddlmZ dd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd ZdS )zgprivate module containing functions used for copying data
between instances based on join conditions.

   )
attributes)exc)util   c                 C   s  | j }|j }|D ]\}	}
z(|j|	 }| j|j j| |tj}W n6 tj	k
rv } zt
d||	||
| W 5 d }~X Y nX z(|j|
 }|j|j j|||d  W n6 tj	k
r } zt
d||	||
| W 5 d }~X Y nX |r|	jr|
jr|
|	rd|jd||
f< qd S )NFTZpk_cascaded)dict_columntopropertymanagerkeyimplgetr   PASSIVE_OFFr   UnmappedColumnError_raise_col_to_propsetprimary_keyZ
references)sourcesource_mapperdestdest_mappersynchronize_pairs	uowcommitZflag_cascaded_pkssource_dictZ	dest_dictlrpropvalueerr r   7/tmp/pip-unpacked-wheel-8u86ls_i/sqlalchemy/orm/sync.pypopulate   s4    	
  $
$r   c                 C   s   |D ]\}}z|j | }| |j }W n6 tjk
rZ } ztd||||| W 5 d }~X Y nX z|j | }|| |j< W q tjk
r   td|||| Y qX qd S )NFT)r   r	   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   bulk_populate_inherit_keys>   s    
$
r    c                 C   s   |D ]\}}|j r>|| | j|tjkr>td|t| f z|| | j|d  W q tj	k
r } zt
dd |||| W 5 d }~X Y qX qd S )NzKDependency rule tried to blank-out primary key column '%s' on instance '%s'T)r   _get_state_attr_by_columnr   orm_utilZ	_none_setAssertionErrorZ	state_strZ_set_state_attr_by_columnr   r   r   )r   r   r   r   r   r   r   r   r   clearN   s     r$   c           
      C   s   |D ]\}}z*| |  |}|j| | j|tjd}W n6 tjk
rl }	 ztd||d ||	 W 5 d }	~	X Y nX |||j	< ||||j	 < qd S N)ZpassiveF)
Z_get_committed_attr_by_columnobjr!   r   r   r   r   r   r   r	   )
r   r   r   Z
old_prefixr   r   r   Zoldvaluer   r   r   r   r   update`   s         
$
r'   c                 C   sn   |D ]d\}}z|j | | j|tjd}W n6 tjk
r\ } ztd||d || W 5 d }~X Y nX |||j< qd S r%   )r!   r   r   r   r   r   r   r	   )r   r   Zdict_r   r   r   r   r   r   r   r   populate_dicto   s       
$r(   c           	      C   sz   |D ]p\}}z|j | }W n6 tjk
rP } ztd||d|| W 5 d}~X Y nX | ||jtj}t|j	r dS qdS )zpreturn true if the source object has changes from an old to a
    new value on the given synchronize pairs

    FNT)
r   r   r   r   Zget_attribute_historyr	   r   ZPASSIVE_NO_INITIALIZEboolZdeleted)	r   r   r   r   r   r   r   r   historyr   r   r   source_modified{   s    $  
r+   c                 C   sD   | r"t jtd||f |d nt jtd|||f |d d S )NzCan't execute sync rule for destination column '%s'; mapper '%s' does not map this column.  Try using an explicit `foreign_keys` collection which does not include this column (or use a viewonly=True relation).)Zreplace_contextzCan't execute sync rule for source column '%s'; mapper '%s' does not map this column.  Try using an explicit `foreign_keys` collection which does not include destination column '%s' (or use a viewonly=True relation).)r   Zraise_r   r   )Zisdestr   Zsource_columnr   Zdest_columnr   r   r   r   r      s"    r   N)__doc__ r   r   r   r"   r   r    r$   r'   r(   r+   r   r   r   r   r   <module>   s   +