
    LCj                     $   d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZ  e
       Z ee      Z eej                   ej"                  ej$                  ej&                  d      Z eed	e
      Zdeedf   fdZed        ZdefdZddZy)u  
Async database session management.

Uses SQLAlchemy's async engine with asyncpg — the API serving layer is
async (FastAPI), so the DB driver must be too, or every DB call would
block an event loop thread. The Celery workers, which are synchronous
processes, use a separate sync engine (see app/db/sync_session.py) since
mixing async DB calls into a sync Celery task is more trouble than it's
worth.
    )AsyncGenerator)asynccontextmanager)AsyncSessionasync_sessionmakercreate_async_engine)get_settings)
get_loggerT)	pool_sizemax_overflowechopool_pre_pingF)expire_on_commitclass_returnNc                 P  K   t               4 d{   } 	 |  	 | j                          d{    ddd      d{    y7 4# t        $ r | j                          d{  7    w xY w7 ># | j                          d{  7   w xY w7 N# 1 d{  7  sw Y   yxY ww)uF   FastAPI dependency — one session per request, always closed cleanly.N_session_factory	Exceptionrollbackclosesessions    ;C:\Crop_Prediction\Backend\crop-ai-system\app\db\session.pyget_db_sessionr   #   s     ! " "W	"M
 --/!!" " "  	""$$$	 "'--/!!" " " "   B&AB&BABA/BB& BB&A,$A'%A,,A1/B1BB
BBB&B#BB#B&c                 P  K   t               4 d{   } 	 |  	 | j                          d{    ddd      d{    y7 4# t        $ r | j                          d{  7    w xY w7 ># | j                          d{  7   w xY w7 N# 1 d{  7  sw Y   yxY ww)zIFor use outside of FastAPI's dependency injection (e.g. startup scripts).Nr   r   s    r   db_session_contextr   /   s       ! " "W	"M
 --/!!" " "  	""$$$	 "'--/!!" " " "r   c                  .  K   	 t         j                         4 d {   } | j                  d        d {    d d d       d {    y7 /7 7 	# 1 d {  7  sw Y   yxY w# t        $ r"}t        j                  d|        Y d }~yd }~ww xY ww)Nc                      y )N )cs    r   <lambda>z%check_db_connection.<locals>.<lambda>?   s        TzDatabase health check failed: F)_engineconnectrun_syncr   loggererror)connexcs     r   check_db_connectionr+   <   s     ??$ 	0 	0--///	0 	0	0/	0 	0 	0 	0 5cU;<s   BA' AA' AAAA' AA' BA' AA' A$AA$ A' #B$A' '	B0BBBBc                  H   K   t         j                          d{    y7 w)zGCalled on application shutdown to close all pooled connections cleanly.N)r$   disposer    r#   r   dispose_enginer.   F   s     
//
s   " ")r   N)__doc__collections.abcr   
contextlibr   sqlalchemy.ext.asyncior   r   r   app.core.configr   app.core.logging_configr	   settings__name__r'   DATABASE_URLDB_POOL_SIZEDB_MAX_OVERFLOWDB_ECHOr$   r   r   r   boolr+   r.   r    r#   r   <module>r<      s   	 + * X X ( .>	H	
##))			 &gl[ 	"n\4-?@ 	" 	" 	"4 r#   