U
    x^                     @   sL   d Z ddlZddlmZ ddlmZ G dd dejZG d	d
 d
ejZdS )a8  Provides a thread-local transactional wrapper around the root Engine class.

The ``threadlocal`` module is invoked when using the
``strategy="threadlocal"`` flag with :func:`~sqlalchemy.engine.create_engine`.
This module is semi-private and is invoked automatically when the threadlocal
engine strategy is used.
    N   )base   )utilc                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	TLConnectionc                    s   t t| j|| d| _d S Nr   )superr   __init___TLConnection__opencount)selfargkw	__class__ E/tmp/pip-install-dq5v43_d/SQLAlchemy/sqlalchemy/engine/threadlocal.pyr	      s    zTLConnection.__init__c                 C   s   |  j d7  _ | S Nr   )r
   r   r   r   r   _increment_connect   s    zTLConnection._increment_connectc                 C   s(   | j dkrtj|  |  j d8  _ d S r   r
   r   
Connectioncloser   r   r   r   r      s    
zTLConnection.closec                 C   s   d| _ tj|  d S r   r   r   r   r   r   _force_close$   s    zTLConnection._force_close)__name__
__module____qualname__r	   r   r   r   __classcell__r   r   r   r   r      s   r   c                       s   e Zd ZdZeZedd fddZdd Z	dd	 Z
d#ddZdd Zdd Zdd Zdd Zdd Zdd Zdd Z fddZedd Zdd  Zd!d" Z  ZS )$TLEnginezPAn Engine that includes support for thread-local managed
    transactions.

    z1.3a  The 'threadlocal' engine strategy is deprecated, and will be removed in a future release.  The strategy is no longer relevant to modern usage patterns (including that of the ORM :class:`.Session` object) which make use of a :class:`.Connection` object in order to invoke statements.c                    s"   t t| j|| tj | _d S N)r   r   r	   r   	threadinglocal_connections)r   argskwargsr   r   r   r	   1   s    	zTLEngine.__init__c                 K   s   | j f |S r   )_contextual_connect)r   r   r   r   r   contextual_connect=   s    zTLEngine.contextual_connectc                 K   s\   t | jdsd }n
| j }|d ks*|jrT| j| | | jj|f|}t	|| j_|
 S Nconn)hasattrr!   r'   closed_tl_connection_clsZ_wrap_pool_connectpoolconnectweakrefrefr   )r   r   
connectionr   r   r   r$   @   s    
zTLEngine._contextual_connectNc                 C   s2   t | jdsg | j_| jj|  j|d | S )Ntrans)xid)r(   r!   r0   appendr$   begin_twophase)r   r1   r   r   r   r3   R   s    zTLEngine.begin_twophasec                 C   s.   t | jdsg | j_| jj|    | S Nr0   )r(   r!   r0   r2   r$   begin_nestedr   r   r   r   r5   Z   s    
zTLEngine.begin_nestedc                 C   s.   t | jdsg | j_| jj|    | S r4   )r(   r!   r0   r2   r$   beginr   r   r   r   r6   b   s    zTLEngine.beginc                 C   s   | S r   r   r   r   r   r   	__enter__h   s    zTLEngine.__enter__c                 C   s   |d kr|    n|   d S r   )commitrollback)r   type_value	tracebackr   r   r   __exit__k   s    
zTLEngine.__exit__c                 C   s,   t | jdr| jjsd S | jjd   d S Nr0   )r(   r!   r0   preparer   r   r   r   r@   q   s    
zTLEngine.preparec                 C   s2   t | jdr| jjsd S | jjd}|  d S r>   )r(   r!   r0   popr8   r   r0   r   r   r   r8   y   s    
zTLEngine.commitc                 C   s2   t | jdr| jjsd S | jjd}|  d S r>   )r(   r!   r0   rA   r9   rB   r   r   r   r9      s    
zTLEngine.rollbackc                    s   t j | _tt|   d S r   )r   r   r    r!   r   r   disposer   r   r   r   rC      s    zTLEngine.disposec                 C   s(   t | jd p&| j d kp&| j jS r&   )r(   r!   r'   r)   r   r   r   r   r)      s
    
zTLEngine.closedc                 C   s6   | j s2|    | j }|  | j`g | j_d S r   )r)   r$   r   r!   r'   r   r0   )r   r/   r   r   r   r      s    
zTLEngine.closec                 C   s
   d| j  S )NzTLEngine(%r))urlr   r   r   r   __repr__   s    zTLEngine.__repr__)N)r   r   r   __doc__r   r*   r   
deprecatedr	   r%   r$   r3   r5   r6   r7   r=   r@   r8   r9   rC   propertyr)   r   rE   r   r   r   r   r   r   )   s,   
		
r   )	rF   r-    r   r   r   r   ZEnginer   r   r   r   r   <module>   s
   