Ë
    LµCjó  ã                   ó$  — 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àûÜò Ü�‰Ð5°c°UÐ;Ô<Üûðü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#   