a
    ~g!                     @  s  U d Z ddlmZ ddlZddl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
 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 erdZerdndZndZdZedddZedeed f ZedZejejkreej dddddZe Zde d< ddd d!d"Z!d#d#d d$d%Z"eej#d&f Z$G d'd dZ%G d(d& d&Z&d/dd)dd*d+d,Z'G d-d. d.Z(dS )0a  Logging control and utilities.

Control of logging for SA can be performed from the regular python logging
module.  The regular dotted module namespace is used, starting at
'sqlalchemy'.  For class-level logging, the class name is appended.

The "echo" keyword parameter, available on SQLA :class:`_engine.Engine`
and :class:`_pool.Pool` objects, corresponds to a logger specific to that
instance only.

    )annotationsN)Any)Optional)overload)Set)Type)TypeVar)Union   )py311)py38)LiteralT   F_IT
Identified)bounddebug
sqlalchemyzlogging.LoggerNone)loggerreturnc                 C  s*   t tj}|t d | | d S )Nz.%(asctime)s %(levelname)s %(name)s %(message)s)loggingStreamHandlersysstdoutsetFormatter	Formatter
addHandler)r   handler r   S/var/www/html/emsaiapi.evdpl.com/venv/lib/python3.9/site-packages/sqlalchemy/log.py_add_default_handler:   s
    r!   zSet[Type[Identified]]_logged_classesType[Identified]str)clsr   c                 C  s   t | dd p| jd | j S )N_sqla_logger_namespace.)getattr
__module____name__r%   r   r   r    _qual_logger_name_for_clsE   s    r,   z	Type[_IT]c                   s>   t t|   fdd| _ fdd| _ | _t|  | S )Nc                   s     tjS N)isEnabledForr   DEBUGselfr   r   r    <lambda>N   s   zclass_logger.<locals>.<lambda>c                   s     tjS r-   )r.   r   INFOr0   r2   r   r    r3   Q   s   )r   	getLoggerr,   _should_log_debug_should_log_infor   r"   addr+   r   r2   r    class_loggerL   s    
r9   InstanceLoggerc                   @  sJ   e Zd ZU dZdZded< ded< ded< d	d
ddZd	d
ddZdS )r   r   NzOptional[str]logging_name_IdentifiedLoggerTyper   _EchoFlagType_echoboolr   c                 C  s   | j tjS r-   )r   r.   r   r/   r0   r   r   r    r6   e   s    zIdentified._should_log_debugc                 C  s   | j tjS r-   )r   r.   r   r4   r0   r   r   r    r7   h   s    zIdentified._should_log_info)r*   r)   __qualname__	__slots__r;   __annotations__r6   r7   r   r   r   r    r   \   s   
c                   @  s   e Zd ZU dZejejejejdZde	d< dZ
ddddd	Zdd
d
ddddZdd
d
ddddZdd
d
ddddZeZdd
d
ddddZdd
d
ddddZdd
d
ddddZddd
d
ddddZddddd Zdd!d"d#Zd$S )%r:   a  A logger adapter (wrapper) for :class:`.Identified` subclasses.

    This allows multiple instances (e.g. Engine or Pool instances)
    to share a logger, but have its verbosity controlled on a
    per-instance basis.

    The basic functionality is to return a logging level
    which is based on an instance's echo setting.

    Default implementation is:

    'debug' -> logging.DEBUG
    True    -> logging.INFO
    False   -> Effective level of underlying logger (
    logging.WARNING by default)
    None    -> same as False
    )NFTr   r=   r>   )echor   r$   )rD   namec                 C  s8   || _ t|| _| j| tjkr4| jjs4t| j d S r-   )rD   r   r5   r   	_echo_mapr4   handlersr!   )r1   rD   rE   r   r   r    __init__   s    zInstanceLogger.__init__r   r   )msgargskwargsr   c                 O  s    | j tj|g|R i | dS )z/Delegate a debug call to the underlying logger.N)logr   r/   r1   rI   rJ   rK   r   r   r    r      s    zInstanceLogger.debugc                 O  s    | j tj|g|R i | dS )z/Delegate an info call to the underlying logger.N)rL   r   r4   rM   r   r   r    info   s    zInstanceLogger.infoc                 O  s    | j tj|g|R i | dS )z1Delegate a warning call to the underlying logger.N)rL   r   WARNINGrM   r   r   r    warning   s    zInstanceLogger.warningc                 O  s    | j tj|g|R i | dS )zB
        Delegate an error call to the underlying logger.
        NrL   r   ERRORrM   r   r   r    error   s    zInstanceLogger.errorc                 O  s(   d|d< | j tj|g|R i | dS )z4Delegate an exception call to the underlying logger.r
   exc_infoNrQ   rM   r   r   r    	exception   s    zInstanceLogger.exceptionc                 O  s    | j tj|g|R i | dS )z2Delegate a critical call to the underlying logger.N)rL   r   CRITICALrM   r   r   r    critical   s    zInstanceLogger.criticalint)levelrI   rJ   rK   r   c                 O  sn   | j jj|krdS | j| j }|tjkr2| j  }||krjtrR|	ddt
 |d< | j j|||fi | dS )zDelegate a log call to the underlying logger.

        The level here is determined by the echo
        flag as well as that of the underlying logger, and
        logger._log() is called directly.

        N
stacklevelr
   )r   managerdisablerF   rD   r   NOTSETgetEffectiveLevel
STACKLEVELgetSTACKLEVEL_OFFSET_log)r1   rY   rI   rJ   rK   Zselected_levelr   r   r    rL      s    

zInstanceLogger.logr?   )rY   r   c                 C  s   | j jj|krdS ||  kS )z)Is this logger enabled for level 'level'?F)r   r[   r\   r^   r1   rY   r   r   r    r.      s    zInstanceLogger.isEnabledForr@   c                 C  s$   | j | j }|tjkr | j }|S )z+What's the effective level for this logger?)rF   rD   r   r]   r   r^   rc   r   r   r    r^      s    

z InstanceLogger.getEffectiveLevelN)r*   r)   rA   __doc__r   r]   r4   r/   rF   rC   rB   rH   r   rN   rP   warnrS   rU   rW   rL   r.   r^   r   r   r   r    r:   l   s&   
r=   )instanceechoflagr   c                 C  sT   | j rdt| j| j f }n
t| j}|| _|dv r@t|}n
t||}|| _dS )zEcreate a logger for an instance that implements :class:`.Identified`.z%s.%s)FNN)r;   r,   	__class__r>   r   r5   r:   r   )rf   rg   rE   r   r   r   r    instance_logger   s    

ri   c                   @  s`   e Zd ZdZeddd dddZeddddd	dZd
dddddZddddddZdS )echo_propertya}      When ``True``, enable log output for this element.

    This has the effect of setting the Python logging level for the namespace
    of this element's class and object reference.  A value of boolean ``True``
    indicates that the loglevel ``logging.INFO`` will be set for the logger,
    whereas the string value ``debug`` will set the loglevel to
    ``logging.DEBUG``.
    zLiteral[None]r#   )rf   ownerr   c                 C  s   d S r-   r   r1   rf   rk   r   r   r    __get__  s    zecho_property.__get__r   r=   c                 C  s   d S r-   r   rl   r   r   r    rm     s    zOptional[Identified]z#Union[echo_property, _EchoFlagType]c                 C  s   |d u r| S |j S d S r-   )r>   rl   r   r   r    rm     s    r   )rf   valuer   c                 C  s   t ||d d S )N)rg   )ri   )r1   rf   rn   r   r   r    __set__  s    zecho_property.__set__N)r*   r)   rA   rd   r   rm   ro   r   r   r   r    rj     s   
rj   )N))rd   
__future__r   r   r   typingr   r   r   r   r   r   r	   utilr   r   util.typingr   r_   ra   r   r?   r=   r5   
rootloggerrY   r]   setLevelWARNr!   setr"   rC   r,   r9   Loggerr<   r   r:   ri   rj   r   r   r   r    <module>	   sB   
y 