o
    Uh
                     @   s   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mZ d dlmZmZ d dlmZ eeZd	ed
efddZeeZee e	edddZeddedZd
eeddf fddZed
eeddf fddZdS )    )	Generator)contextmanager)
quote_plus)OperationalError)create_engine)Sessionsessionmaker)Settingssettings)
get_logger	_settingsreturnc              
   C   sp   | j }| j}| j}| j}| j}t|}|s%d| d| d| d| }|S d| d| d| d| d| 
}|S )a  
    Build a SQLAlchemy URL based on the provided settings.

    Parameters
    ----------
        _settings (Settings): An instance of the Settings class
        containing the PostgreSQL connection details.

    Returns
    -------
        str: The generated SQLAlchemy URL.
    zmysql+pymysql://@:/)SQL_HOSTSQL_PORTSQL_DBSQL_USERSQL_PASSr   )r   DB_HOSTDB_PORTDB_NAMEDB_USERDB_PASSencoded_passworddatabase_url r   2/var/www/html/RetailAPI/app/database/main/mysql.py+build_sqlalchemy_database_url_from_settings   s   "r   Ti  )futurepool_recycleF)
autocommit	autoflushbindNc               
   c   \    t  } z$z| V  W n ty! } zd|}t|  d}~ww W |   dS |   w )z
    Get the database session.

    Returns
    -------
        db: The database session.

    Raises
    ------
        OperationalError: If an error occurs while accessing the database.
    =An error occurred while getting the database session. Error: N)_session_localr   logger	exceptionclosedbeerror_messager   r   r   get_db4   s   


r/   c               
   c   r%   )z
    Context manager that creates a database session and yields
    it for use in a 'with' statement.

    Yields
    ------
    Session: A database session.
    r&   N)r'   	Exceptionr(   r)   r*   r+   r   r   r   
get_ctx_dbK   s   



r1   )collections.abcr   
contextlibr   urllib.parser   pymysqlr   
sqlalchemyr   sqlalchemy.ormr   r   
app.configr	   r
   app.logr   __name__r(   strr   SQLALCHEMY_DATABASE_URLprint_enginer'   r/   r1   r   r   r   r   <module>   s*    