o
    Df                     @   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yA   dd	lmZ Y nw 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   Y/home/ubuntu/webapp/venv/lib/python3.10/site-packages/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   s2   i | _ i | _d| _d| _td urt| t d S 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   sj   | j r"z| j| W S  ty!   t|fi | }| j|< | Y S w dd | D }t|fdti|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>	poolclass)r   r   KeyErrorr   itemsr   )r   dburikwargsenginer   r   r   
get_engine+   s   zSessionManager.get_engineFc                 K   sR   | j |fi |}| jr"|s|| jvrt|d| j|< || j| fS |t|dfS )N)bind)r$   r   r   r   )r   r!   short_lived_sessionsr"   r#   r   r   r   create_session7   s   zSessionManager.create_sessionc                 C   sr   | j s7d}	 ztj| W n! ty/   |tk r,td|dd}t|d  |d7 }n Y nw nqd| _ d S d S )Nr   Tr
   i     )	r   ResultModelBasemetadata
create_allr   PREPARE_MODELS_MAX_RETRIESr   timesleep)r   r#   retriessleep_amount_msr   r   r   prepare_models?   s&   


zSessionManager.prepare_modelsc                 K   s&   | j |fi |\}}| | | S r   )r'   r1   )r   r!   r"   r#   r   r   r   r   session_factoryV   s   
zSessionManager.session_factoryN)F)
__name__
__module____qualname____doc__r   r   r$   r'   r1   r2   r   r   r   r   r	      s    
r	   )r6   r-   kombu.utils.compatr   
sqlalchemyr   sqlalchemy.excr   sqlalchemy.ormr   sqlalchemy.poolr   celery.utils.timer   r   ImportErrorsqlalchemy.ext.declarativer)   __all__r,   r   r	   r   r   r   r   <module>   s$    