o
    Mf)                     @   s   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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 dd Zdd Z G dd deZ!dS )    N)defaultdict)copy)saferepr)connections)path)gettext_lazyngettext_lazy)SignedDataForm)Panel)views)SQLSelectForm)unwrap_cursorwrap_cursor)contrasting_color_generatorreformat_sql)render_stacktracec                 C   d   | dkr)dd l }|jjtd|jjtd|jjtd|jjtd|jjtdi}nt| |	|S )N
postgresqlr   
AutocommitzRead uncommittedzRead committedzRepeatable readSerializable)
psycopg2.extensions
extensionsISOLATION_LEVEL_AUTOCOMMIT_ ISOLATION_LEVEL_READ_UNCOMMITTEDISOLATION_LEVEL_READ_COMMITTEDISOLATION_LEVEL_REPEATABLE_READISOLATION_LEVEL_SERIALIZABLE
ValueErrorgetvendorlevelpsycopg2choices r%   `/var/www/html/analyze/labelStudio/lib/python3.10/site-packages/debug_toolbar/panels/sql/panel.pyget_isolation_level_display      
r'   c                 C   r   )Nr   r   IdleActivezIn transactionzIn errorUnknown)
r   r   TRANSACTION_STATUS_IDLEr   TRANSACTION_STATUS_ACTIVETRANSACTION_STATUS_INTRANSTRANSACTION_STATUS_INERRORTRANSACTION_STATUS_UNKNOWNr   r   r    r%   r%   r&   get_transaction_status_display#   r(   r1   c                       s   e Zd ZdZ fddZdd Zdd ZedZe	d	d
 Z
e	dd ZdZedd Zdd Zdd Zdd Zdd Z  ZS )SQLPanelze
    Panel that displays information about the SQL queries run while processing
    the request.
    c                    sJ   t  j|i | dd tD | _d| _d| _g | _i | _i | _i | _	d S )Nc                 S   s   i | ]
}|t t| jqS r%   )lenr   queries).0kr%   r%   r&   
<dictcomp>;   s    z%SQLPanel.__init__.<locals>.<dictcomp>r   )
super__init__r   _offset	_sql_time_num_queries_queries
_databases_transaction_status_transaction_ids)selfargskwargs	__class__r%   r&   r9   9   s   
zSQLPanel.__init__c                 C   s   |t vrd S t | j}|sd S |jdkr| }nt|j| j|}|| j|< |s-d S ||krA|r<t j	| j
|< nd | j
|< | j
| S )Nr   )r   
connectionr!   get_transaction_statusr   r?   r   uuiduuid4hexr@   )rA   aliasconn
cur_statuslast_statusr%   r%   r&   get_transaction_idC   s"   






zSQLPanel.get_transaction_idc                 K   s   | j ||f || jvr|d dd| j|< n| j| d  |d 7  < | j| d  d7  < |  j|d 7  _|  jd7  _d S )Nduration   )
time_spentnum_queriesrR   rS   )r=   appendr>   r;   r<   )rA   rK   rC   r%   r%   r&   record^   s   
zSQLPanel.recordSQLc                 C   s   t dd| j| j| jf S )Nz%d query in %.2fmsz%d queries in %.2fms)__r<   r;   )rA   r%   r%   r&   nav_subtitleo   s   zSQLPanel.nav_subtitlec                 C   s   t | j}tdd|d|i S )Nz%SQL queries from %(count)d connectionz&SQL queries from %(count)d connectionscount)r3   r>   rW   )rA   rY   r%   r%   r&   titlev   s   
zSQLPanel.titlezdebug_toolbar/panels/sql.htmlc                 C   s.   t dtjddt dtjddt dtjddgS )Nzsql_select/
sql_select)namezsql_explain/sql_explainzsql_profile/sql_profile)r   r   r[   r]   r^   )clsr%   r%   r&   get_urls   s   zSQLPanel.get_urlsc                 C   s   t  D ]}t||  qd S N)r   allr   rA   rF   r%   r%   r&   enable_instrumentation   s   zSQLPanel.enable_instrumentationc                 C   s   t  D ]}t| qd S ra   )r   rb   r   rc   r%   r%   r&   disable_instrumentation   s   
z SQLPanel.disable_instrumentationc              	      s  t   t fdd}tdd }tdd }dd }dd }| jrjd	}td
t| jd  }	t| j D ]G\}
}g d}|
d }d|
d |	  ||< |}|| |	k rztd||  d}||  |7  < |d7 }|dkrpd	}|||< || |	k sU||d< q7i }d }d	}| jD ]\}}|| ||  d7  < || ||  d7  < |	d}|	|}||kr|rd| j|d  d d< |||< |rd|d< |rd|d< ||d< d|v rt
|d |d |d< d|v rt|d |d |d< td tt|djd|d< |d rt|d dd|d< | j| d |d< z|d  | j d! |d"< W n ty2   d	|d"< Y nw ||d#< |d" |d#  |d$< ||d" 7 }t|d% |d%< |d7 }||d%  |d&< q|rjd| j|d  d d< t  fd'd(| D }fd)d(| D }| jD ].\}}z|| || \|d*< |d+< || || \|d,< |d-< W q ty   Y qw | j D ]0\}}z!td.d/ ||  D |d*< td0d/ ||  D |d,< W q ty   Y qw | t| j d1d d2d3d4 | jD | jd5 d S )6Nc                      s   t  S ra   nextr%   )colorsr%   r&   <lambda>       z)SQLPanel.generate_stats.<locals>.<lambda>c                   S      t tS ra   r   intr%   r%   r%   r&   ri      rj   c                   S   rk   ra   rl   r%   r%   r%   r&   ri      rj   c                 S   s   | d S )Nraw_sqlr%   )queryr%   r%   r&   similar_key   s   z,SQLPanel.generate_stats.<locals>.similar_keyc                 S   s,   | d d u rdnt | d }| d t|fS )N
raw_paramsr%   rn   )tupler   )ro   rq   r%   r%   r&   duplicate_key   s   z.SQLPanel.generate_stats.<locals>.duplicate_keyr   g      p@g      @)r   r   r         rQ      	rgb_colortrans_idT
ends_transstarts_transin_transrK   	iso_levelr!   trans_status)initial)auto_idr~   formsql)with_togglerP   d   width_ratiostart_offset
end_offset
stacktracetrace_colorc                    (   i | ]\}}| fd d|  D qS )c                    &   i | ]\}}|d kr||t  fqS rv   rf   )r5   ro   similar_countquery_colorsr%   r&   r7      
    6SQLPanel.generate_stats.<locals>.<dictcomp>.<dictcomp>itemsr5   rK   r4   r   r%   r&   r7          z+SQLPanel.generate_stats.<locals>.<dictcomp>c                    r   )c                    r   r   rf   )r5   ro   duplicate_countr   r%   r&   r7      r   r   r   r   r   r%   r&   r7      r   r   similar_colorr   duplicate_colorc                 s       | ]}|d  V  qdS r   Nr%   r5   er%   r%   r&   	<genexpr>      
z*SQLPanel.generate_stats.<locals>.<genexpr>c                 s   r   r   r%   r   r%   r%   r&   r     r   c                 S   s   | d d  S )NrQ   rR   r%   )xr%   r%   r&   ri     s    )keyc                 S   s   g | ]\}}|qS r%   r%   )r5   aqr%   r%   r&   
<listcomp>  s    z+SQLPanel.generate_stats.<locals>.<listcomp>)	databasesr4   sql_time)r   r   r=   rm   r3   r>   	enumeratevaluesminr   r'   r1   r	   r   r   r~   r   r;   ZeroDivisionErrorr   r   KeyErrorsumrecord_statssorted)rA   requestresponsetrace_colorsquery_similarquery_duplicatesrp   rs   width_ratio_tallyfactorndbrgbcolornnnc	trans_idsrx   irK   ro   last_trans_idquery_similar_colorsquery_duplicates_colors
alias_infor%   )rh   r   r&   generate_stats   s   	






	

zSQLPanel.generate_statsc                 C   s<   |   }dt|dg }|dd}| d|| d S )NzSQL {} queriesr4   r   r   )	get_statsformatr3   r   record_server_timing)rA   r   r   statsrZ   valuer%   r%   r&   generate_server_timing"  s   zSQLPanel.generate_server_timing)__name__
__module____qualname____doc__r9   rO   rU   r   	nav_titlepropertyrX   rZ   templateclassmethodr`   rd   re   r   r   __classcell__r%   r%   rD   r&   r2   3   s$    



 r2   )"rH   collectionsr   r   pprintr   	django.dbr   django.urlsr   django.utils.translationr   r   r   rW   debug_toolbar.formsr	   debug_toolbar.panelsr
   debug_toolbar.panels.sqlr   debug_toolbar.panels.sql.formsr   !debug_toolbar.panels.sql.trackingr   r   debug_toolbar.panels.sql.utilsr   r   debug_toolbar.utilsr   r'   r1   r2   r%   r%   r%   r&   <module>   s"    