o
    ѷ6i                     @  s   d dl m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 G dd dZG dd dZd+ddZd,ddZd-ddZedd.d"d#Zd/d&d'Zd0d)d*ZdS )1    )annotationsN)defaultdict)TracebackType)Any)	Generator)DEFAULT_DB_ALIAS)connections)BaseDatabaseWrapper)Modelc                   @  s4   e Zd ZdZdddd	ZdddZedddZdS )WeightedAverageRatez
    Adapted from percona-toolkit - provides a weighted average counter to keep
    at a certain rate of activity (row iterations etc.).
          ?target_tfloatweightreturnNonec                 C  s   || _ d| _d| _|| _dS )zi
        target_t - Target time for t in update()
        weight - Weight of previous n/t values
        g        N)r   avg_navg_tr   )selfr   r    r   W/var/www/hoanhtaovolam_webdjango/env/lib/python3.10/site-packages/django_mysql/utils.py__init__   s   
zWeightedAverageRate.__init__ninttc                 C  sN   | j r| jr| j | j | | _ | j| j | | _n|| _ || _t| j| j S )a  
        Update weighted average rate.  Param n is generic; it's how many of
        whatever the caller is doing (rows, checksums, etc.).  Param s is how
        long this n took, in seconds (hi-res or not).

        Parameters:
            n - Number of operations (rows, etc.)
            t - Amount of time in seconds that n took

        Returns:
            n adjusted to meet target_t based on weighted decaying avg rate
        )r   r   r   r   avg_rater   )r   r   r   r   r   r   update   s   zWeightedAverageRate.updatec                 C  s,   z| j | j W S  ty   | j d  Y S w )NgMbP?)r   r   ZeroDivisionErrorr   r   r   r   r   5   s
   zWeightedAverageRate.avg_rateN)r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   )__name__
__module____qualname____doc__r   r   propertyr   r   r   r   r   r      s    

r   c                   @  s$   e Zd ZdZdddZdddZdS )	StopWatchz,
    Context manager for timing a block
    r   c                 C  s   t   | _| S N)time
start_timer   r   r   r   	__enter__C   s   
zStopWatch.__enter__exc_typetype[BaseException] | None	exc_valueBaseException | Noneexc_tracebackTracebackType | Noner   c                 C  s   t   | _| j| j | _d S r%   )r&   end_timer'   
total_time)r   r)   r+   r-   r   r   r   __exit__G   s   
zStopWatch.__exit__N)r   r$   )r)   r*   r+   r,   r-   r.   r   r   )r   r    r!   r"   r(   r1   r   r   r   r   r$   >   s    
r$   total_secondsr   r   strc                 C  sp   | d }| d d }| d }g }|dkr| t|dg |s!|r*| t|dg | t|dg d|S )Ni  <   r   hms )extendr3   join)r2   hoursminutessecondsoutr   r   r   format_durationQ   s   
r?   settings_dictdict[str, Any]	list[str]c           	      C  s$  dg}| d  d| d }| d  d| d }| d  d| d }| d  d	| d
 }| d  d| d }| d  di  d}| d  d}|rP|d| g7 }|rY|d| g7 }|rb|d| g7 }|rwd|v rp|d| g7 }n|d| g7 }|r|d| g7 }|r|d| g7 }|r||g7 }|S )z
    Copied from django 1.8 MySQL backend DatabaseClient - where the runshell
    commandline creation has been extracted and made callable like so.
    mysqlOPTIONSdbNAMEuserUSERpasswdPASSWORDhostHOSTportPORTsslcaread_default_filez--defaults-file=%sz	--user=%sz--password=%s/z--socket=%sz	--host=%sz	--port=%sz--ssl-ca=%s)get)	r@   argsrE   rG   rI   rK   rM   certdefaults_filer   r   r   settings_to_cmd_args_   s2   
rW   stringc                 C  s"   |  ddd}dtd |S )N
 )replacesplitr:   filter)rX   bitsr   r   r   collapse_spaces   s   r_   )usingmodelr
   field_namesr`   c                  s<  t |stddd | jjD   fdd|D }t |t |kr6t|dd |D  }tdd	| td
d |D }t|}t| 	 ,}|
dj|d| jjf|  tt}| D ]\}	}
}||	 | qaW d   n1 sxw   Y  dd | D }z|| W S  ty   tdd	| d w )zp
    Returns the name of the index existing on field_names, or raises KeyError
    if no such index exists.
    z At least one field name requiredc                 S  s   i | ]}|j |qS r   name.0fieldr   r   r   
<dictcomp>   s    zindex_name.<locals>.<dictcomp>c                   s   g | ]
}| v r | qS r   r   )rf   rd   existing_fieldsr   r   
<listcomp>   s    zindex_name.<locals>.<listcomp>c                 S  s   h | ]}|j qS r   rc   re   r   r   r   	<setcomp>   s    zindex_name.<locals>.<setcomp>zFields do not exist: ,c                 s  s    | ]}|j V  qd S r%   )columnre   r   r   r   	<genexpr>   s    zindex_name.<locals>.<genexpr>a5  SELECT `INDEX_NAME`, `SEQ_IN_INDEX`, `COLUMN_NAME`
               FROM INFORMATION_SCHEMA.STATISTICS
               WHERE TABLE_SCHEMA = DATABASE() AND
                     TABLE_NAME = %s AND
                     COLUMN_NAME IN {list_sql}
               ORDER BY `INDEX_NAME`, `SEQ_IN_INDEX` ASC
            )list_sqlNc                 S  s   i | ]	\}}t ||qS r   )tuple)rf   kvr   r   r   rh      s    zThere is no index on ())len
ValueError_metafieldssetr:   rq   get_list_sqlr   cursorexecuteformatdb_tabler   listfetchallappenditemsKeyError)ra   r`   rb   rx   unfound_namescolumn_namesrp   r{   indexes
index_name_column_nameindexes_by_columnsr   ri   r   r      s8   	
r   sequencelist[str] | tuple[str, ...]c                 C  s   d ddd | D S )Nz({})rm   c                 s  s    | ]}d V  qdS )z%sNr   )rf   xr   r   r   ro      s    zget_list_sql.<locals>.<genexpr>)r}   r:   )r   r   r   r   rz      s   rz   *Generator[BaseDatabaseWrapper, None, None]c                  c  sD    t gtttt h  } | D ]}t| }|jdkr||fV  qd S )NrC   )r   r   ry   r   vendor)
conn_namesalias
connectionr   r   r   mysql_connections   s   

r   )r2   r   r   r3   )r@   rA   r   rB   )rX   r3   r   r3   )ra   r
   rb   r3   r`   r3   r   r3   )r   r   r   r3   )r   r   )
__future__r   r&   collectionsr   typesr   typingr   r   	django.dbr   r   django.db.backends.base.baser	   django.db.modelsr
   r   r$   r?   rW   r_   r   rz   r   r   r   r   r   <module>   s$    /


#
)