U
    d                     @   s   d Z ddl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 zdd	lmZ W n  ek
r   dd	lmZ Y nX e Zd
ZdZdd ZG dd dZdS )zSQLAlchemy session.    N)register_after_fork)create_engine)DatabaseError)sessionmaker)NullPool) get_exponential_backoff_interval)declarative_base)SessionManager
   c                 C   s   |    d S N)_after_fork)session r   D/tmp/pip-unpacked-wheel-mu1yl971/celery/backends/database/session.py_after_fork_cleanup_session   s    r   c                   @   sB   e Zd ZdZdd Zdd Zdd Zdd	d
Zdd Zdd Z	dS )r	   zManage SQLAlchemy sessions.c                 C   s.   i | _ i | _d| _d| _td k	r*t| t d S )NF)_engines	_sessionsforkedpreparedr   r   selfr   r   r   __init__    s    zSessionManager.__init__c                 C   s
   d| _ d S )NT)r   r   r   r   r   r   (   s    zSessionManager._after_forkc                 K   sn   | j rDz| j| W S  tk
r@   t|f| }| j|< | Y S X n&dd | D }t|fdti|S d S )Nc                 S   s    i | ]\}}| d s||qS )pool)
startswith).0kvr   r   r   
<dictcomp>3   s    
 z-SessionManager.get_engine.<locals>.<dictcomp>Z	poolclass)r   r   KeyErrorr   itemsr   )r   dburikwargsenginer   r   r   
get_engine+   s    zSessionManager.get_engineFc                 K   sN   | j |f|}| jr@|s"|| jkr2t|d| j|< || j| fS |t|dfS )N)bind)r#   r   r   r   )r   r    Zshort_lived_sessionsr!   r"   r   r   r   create_session7   s    zSessionManager.create_sessionc                 C   sn   | j sjd}ztj| W qd tk
r^   |tk rXtd|dd}t|d  |d7 }n Y q
X qdq
d| _ d S )Nr   r
   i  T   )	r   ResultModelBasemetadataZ
create_allr   PREPARE_MODELS_MAX_RETRIESr   timesleep)r   r"   retriesZsleep_amount_msr   r   r   prepare_models?   s"       
zSessionManager.prepare_modelsc                 K   s"   | j |f|\}}| | | S r   )r%   r-   )r   r    r!   r"   r   r   r   r   session_factoryV   s    
zSessionManager.session_factoryN)F)
__name__
__module____qualname____doc__r   r   r#   r%   r-   r.   r   r   r   r   r	      s   
r	   )r2   r*   Zkombu.utils.compatr   Z
sqlalchemyr   Zsqlalchemy.excr   Zsqlalchemy.ormr   Zsqlalchemy.poolr   Zcelery.utils.timer   r   ImportErrorZsqlalchemy.ext.declarativer'   __all__r)   r   r	   r   r   r   r   <module>   s    