o
    ՂiS                  
   @   s   d Z ddlmZmZ ddlmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlZeeZeejdd	d
ddddddZeeddd ZeddedZdadd Ze
dd Zdd Zdd Ze
dd ZdS )z7
Database session management with multi-tenant support
    )create_engineevent)sessionmakerSession)Pool)contextmanager)settingsN      Ti  Futf8z-c client_encoding=utf8)client_encodingoptions)	pool_sizemax_overflowpool_pre_pingpool_recycleechoconnect_argsconnectc              
   C   s   t | dr"t| jtr| j nt| j }d|v r"td dS | jj }d|v r3td dS z| 	 }|
d |  td W dS  tyc } ztd|  W Y d}~dS d}~ww )	z
    Reset search_path to public on new connections
    This ensures a clean state for each connection

    Note: SQLite doesn't support search_path, so we skip it for SQLite connections
    driversqlitez*Skipping search_path for SQLite connectionNzDSkipping search_path for SQLite connection (detected via class name)zSET search_path TO publicz3Set search_path to public for PostgreSQL connectionzFailed to set search_path: )hasattr
isinstancer   strlowerloggerdebug	__class____name__cursorexecuteclose	Exceptionwarning)
dbapi_connconnection_recorddriver_name
conn_classr   e r)   6/lsinfo/ai/hellotax_ai/base_platform/app/db/session.pyset_search_path   s$   
	$


r+   )
autocommit	autoflushbindc                  C   s,   t d u rttdd } | rt| dddda t S )NDATA_CENTER_DATABASE_URL   T)r   r   r   )
_dc_enginegetattrr   r   )dc_urlr)   r)   r*   _get_dc_engineB   s
   r4   c                  c   sB    t  } | sd V  d S t| d }z
|V  W |  d S |  w )N)r.   )r4   r   r!   )enginesessionr)   r)   r*   get_data_center_dbJ   s   r7   c                  c   s
   ddl m}  ddlm} t }zL|  }|r%||| td|  n||d td |V  W z||d W n tyV } zt	d|  W Y d}~nd}~ww |
  dS z||d W n ty } zt	d|  W Y d}~nd}~ww |
  w )z
    Database session dependency for FastAPI with tenant isolation support

    Automatically sets PostgreSQL search_path based on tenant context.
    r   get_current_tenant_idTenantSchemaManagerz'Database session created for tenant_id=Nz*Database session created for public schemaError resetting search_path: )app.core.tenant_contextr9   app.db.tenant_schemar;   SessionLocalr+   r   r   r"   r#   r!   )r9   r;   db	tenant_idr(   r)   r)   r*   get_dbX   s4   

rB   c                  c   s@    t  } zddlm} || d | V  W |   dS |   w )z
    Get database session without tenant isolation

    Use this for operations that need to access public schema only,
    such as tenant management, user authentication, etc.
    r   r:   N)r?   r>   r;   r+   r!   )r@   r;   r)   r)   r*   get_db_without_tenanty   s   rC   c                  c   sP   ddl m}  ddlm} ddlm} t }ziz|  }|r$||| n||d |V  |  W n# t	yU } z|
  tdt|  |dt| d}~ww W z||d W n t	yy } ztd|  W Y d}~nd}~ww |  dS z||d W n t	y } ztd|  W Y d}~nd}~ww |  w )	uy   
    事务感知的数据库会话上下文管理器

    自动处理事务提交和回滚，确保数据一致性
    r   r8   r:   )DatabaseErrorNz"Transaction failed, rolling back: zDatabase transaction failed: r<   )r=   r9   r>   r;   app.core.exceptionsrD   r?   r+   commitr"   rollbackr   errorr   r#   r!   )r9   r;   rD   r@   rA   r(   r)   r)   r*   get_db_with_transaction   sB   
rI   )__doc__
sqlalchemyr   r   sqlalchemy.ormr   r   sqlalchemy.poolr   
contextlibr   
app.configr   logging	getLoggerr   r   DATABASE_URLr5   listens_forr+   r?   r1   r4   r7   rB   rC   rI   r)   r)   r)   r*   <module>   s<    



!