o
    ói                     @  s   U d dl mZ d dl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ddZeed	d
Zi Zded< i Zded< d ddZd!d"ddZd!d#ddZee
jZeee
jZee
jZ			d$d%ddZdd ZdS )&    )annotationsN)create_engine)declarative_basesessionmakerscoped_session)Config)resolve_db_nameDB_POOL_SIZE5DB_MAX_OVERFLOW10zdict[str, object]_ENGINE_CACHEzdict[str, sessionmaker]_SESSION_FACTORY_CACHEdb_namestrreturnc                 C  s0   t j dt j dt j dt j dt j d|  S )Nz://:@/)r   	DB_ENGINEDB_USERDB_PASSWORDDB_HOSTDB_PORT)r    r   '/var/www/html/flask_server/config/db.pybuild_database_url   s   r   
str | Nonec                 C  s@   | pt j}t|}|d u rtt|ddttdd}|t|< |S )NTi  )pool_pre_pingpool_recycle	pool_sizemax_overflowfuture)r   DB_NAMEr   getr   r   
_POOL_SIZE_MAX_OVERFLOW)r   resolved_db_nameenginer   r   r   
get_engine   s   

r)   r   c                 C  s<   | pt j}t|}|d u rtt|dddd}|t|< |S )NFT)bind
autocommit	autoflushr"   )r   r#   r   r$   r   r)   )r   r'   factoryr   r   r   get_session_factory+   s   

r.   hostnamerouting_keyc                 C  sB   |rt | S | s|rt| |d}|tjkrt S t | S t S )zCDevuelve una Session; sin contexto tenant cae al DB_* transicional.)r/   r0   )r.   r   r   r#   SessionLocal)r/   r0   r   r'   r   r   r   get_session@   s   


r2   c                 C  s   t | _| jddd}| S )u   
    Adjunta una fábrica de sesión a la app Flask y configura teardown.

    Luego en cualquier lugar con contexto de app se puede usar:
        from flask import current_app
        session = current_app.session()
    Nc                 S  s   t   d S N)r1   remove)excr   r   r   remove_sessionZ   s   z#init_db_app.<locals>.remove_sessionr3   )r1   sessionteardown_appcontext)appr6   r   r   r   init_db_appP   s   r:   )r   r   r   r   r3   )r   r   )r   r   r   r   )NNN)r/   r   r0   r   r   r   )
__future__r   os
sqlalchemyr   sqlalchemy.ormr   r   r   config.baser   config.db_routerr   Baseintgetenvr%   r&   r   __annotations__r   r   r)   r.   r#   r(   r1   DATABASE_URLr2   r:   r   r   r   r   <module>   s,   


