
    7 fJ.                         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
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mZ d dlmZ d Zd Zd Z d Z!d Z" G d de          Z#dS )    N)defaultdict)copy)connections)path)gettext_lazyngettext)settings)SignedDataForm)Panel)views)SQLSelectForm)wrap_cursor)contrasting_color_generatorreformat_sql)render_stacktracec                 T   | dk    r	 dd l }|j        j        t          d          |j        j        t          d          |j        j        t          d          |j        j        t          d          i}n# t          $ 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}Y nw xY wt          |           |                    |          S )N
postgresqlr   zRead uncommittedzRead committedzRepeatable readSerializable
Autocommit)psycopgIsolationLevelREAD_UNCOMMITTED_READ_COMMITTEDREPEATABLE_READSERIALIZABLEImportErrorpsycopg2.extensions
extensionsISOLATION_LEVEL_AUTOCOMMIT ISOLATION_LEVEL_READ_UNCOMMITTEDISOLATION_LEVEL_READ_COMMITTEDISOLATION_LEVEL_REPEATABLE_READISOLATION_LEVEL_SERIALIZABLE
ValueErrorgetvendorlevelr   choicespsycopg2s        T/var/www/equiseq/venv/lib/python3.11/site-packages/debug_toolbar/panels/sql/panel.pyget_isolation_level_displayr-      s=   	NNN &7;M9N9N&5q9I7J7J&6:K8L8L&3Q~5F5FGG  	 	 	&&&& #>,#Da&G G #BAFVDWDW#CQ%F F #@!NBSBS
GGG	     ;;us   A*A3 3BDDc                    | dk    r1	 dd l }|j        j        j        t	          d          |j        j        j        t	          d          |j        j        j        t	          d          |j        j        j        t	          d          |j        j        j        t	          d          i}n# t          $ 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}Y nw xY wt#          |           |                    |          S )Nr   r   IdleActivezIn transactionzIn errorUnknown)r   pqTransactionStatusIDLEr   ACTIVEINTRANSINERRORUNKNOWNr   r   r   TRANSACTION_STATUS_IDLETRANSACTION_STATUS_ACTIVETRANSACTION_STATUS_INTRANSTRANSACTION_STATUS_INERRORTRANSACTION_STATUS_UNKNOWNr%   r&   r'   s        r,   get_transaction_status_displayr>   3   s8   	NNN 
,11V99
,3Qx[[
,4a8H6I6I
,4a
mm
,4a	llGG  		 		 		&&&& #;QvYY#=q{{#>BR@S@S#>*#>)GGG		    ;;us   BB& &BD65D6c                     | d         S )Nraw_sql )querys    r,   _similar_query_keyrC   O   s        c                 n    | d         dnt          | d                   }| d         t          |          fS )N
raw_paramsrA   r@   )tuplerepr)rB   rF   s     r,   _duplicate_query_keyrI   S   s<    \*2eL>Q8R8RJ )d:..//rD   c                 J   t          t                    }|                                 D ]Q\  \  }}}t          |          }|dk    r4t	          |          }	|D ]}
||
| d<   |	|
| d<   ||xx         |z  cc<   R|                                D ]\  }}||         || d<   d S )N   _count_color)r   intitemslennext)query_groups	databasescolorsnamecountsalias_keyquery_groupcountcolorrB   db_infos               r,   _process_query_groupsr]   [   s    F&2&8&8&:&: # #"{K  199LLE$ / /).ooo&).ooo&&5MMMU"MMM#//++ 1 1w#)%=4  1 1rD   c                        e Zd ZdZ fdZd Zd Zd Z ed          Z	e
d             Ze
d             Zd	Zed
             Zd Zd Zd Zd Z xZS )SQLPanelze
    Panel that displays information about the SQL queries run while processing
    the request.
    c                 r     t                      j        |i | d| _        g | _        i | _        i | _        d S )Nr   )super__init__	_sql_time_queries
_databases_transaction_ids)selfargskwargs	__class__s      r,   rb   zSQLPanel.__init__p   sB    $)&))) "rD   c                 J    t          j                    j        }|| j        |<   |S )z`
        Generate and return a new synthetic transaction ID for the specified DB alias.
        )uuiduuid4hexrf   rg   rW   trans_ids      r,   new_transaction_idzSQLPanel.new_transaction_idx   s$     :<<#'/e$rD   c                 h    | j                             |          }||                     |          }|S )zY
        Return the current synthetic transaction ID for the specified DB alias.
        )rf   r&   rq   ro   s      r,   current_transaction_idzSQLPanel.current_transaction_id   s:     (,,U33
 ..u55HrD   c                 (   | j                             |           |d         }|| j        vr|d         dd| j        |<   n<| j        |         dxx         |d         z  cc<   | j        |         dxx         dz  cc<   | xj        |d         z  c_        d S )NrW   durationrK   )
time_spentnum_queriesrv   rw   )rd   appendre   rc   )rg   ri   rW   s      r,   recordzSQLPanel.record   s    V$$$w''$Z0 & &DOE""
 OE"<000F:4FF000OE"=111Q6111&,,rD   SQLc                 b    t          | j                  }t          dd|          || j        dz  S )Nz)%(query_count)d query in %(sql_time).2fmsz+%(query_count)d queries in %(sql_time).2fms)query_countsql_time)rP   rd   r   rc   )rg   r|   s     r,   nav_subtitlezSQLPanel.nav_subtitle   sE    $-((79
 

 '
 
	
 	
rD   c                 V    t          | j                  }t          dd|          d|iz  S )Nz%SQL queries from %(count)d connectionz&SQL queries from %(count)d connectionsrZ   )rP   re   r   )rg   rZ   s     r,   titlezSQLPanel.title   s;    DO$$34
 
 e	 	rD   zdebug_toolbar/panels/sql.htmlc                     t          dt          j        d          t          dt          j        d          t          dt          j        d          gS )Nzsql_select/
sql_select)rU   zsql_explain/sql_explainzsql_profile/sql_profile)r   r   r   r   r   )clss    r,   get_urlszSQLPanel.get_urls   sM      0|DDD!2GGG!2GGG
 	
rD   c                 ^    t          j                    D ]}t          |           | |_        d S N)r   allr   _djdt_loggerrg   
connections     r,   enable_instrumentationzSQLPanel.enable_instrumentation   s<    %/++ 	+ 	+J
###&*J##	+ 	+rD   c                 @    t          j                    D ]	}d |_        
d S r   )r   r   r   r   s     r,   disable_instrumentationz SQLPanel.disable_instrumentation   s.    %/++ 	+ 	+J&*J##	+ 	+rD   c           	      b   t                      t          fd          }t          t                    }t          t                    }| j        rWt	          j                    d         }d}t          dt          | j                  dz  z            }t          | j        
                                          D ]v\  }	}
g d}|	dz  }d|	dz  |z  z
  ||<   |}||         |k     rGt          d||         z
  d          }||xx         |z  cc<   |d	z  }|d
k    rd}|||<   ||         |k     G||
d<   wi }| j        D ]<}|d         }||t          |          f                             |           ||t          |          f                             |           |                    d          }|                    |i           }|                    d          }||k    r|d|d<   |d|d<   |d|d<   d|v rt!          |d         |d                   |d<   d|v rt#          |d         |d                   |d<   t%          d t'          t)          |                    j                  |d<   |d         rt-          |d         d          |d<   |d         |k    |d<   |d                                                                                             d          |d<   | j        |         d         |d<   	 |d         | j        z  dz  |d <   n# t6          $ r d|d <   Y nw xY w||d!<   |d          |d!         z   |d"<   ||d          z  }t9          |d#                   |d#<   ||d#                  |d$<   |||<   >|
                                D ]}|                    d          d|d<   t                      }t;          || j        |d%           t;          || j        |d&           |                     t?          | j                                         d' (          | j        | j        d)           d S )*Nc                  "    t                     S r   )rQ   )rT   s   r,   <lambda>z)SQLPanel.generate_stats.<locals>.<lambda>   s    4<< rD   SQL_WARNING_THRESHOLDr   g      p@g      @)r   r   r         rK      	rgb_colorrW   rp   T
ends_transstarts_transin_trans	iso_levelr(   trans_status)initial)auto_idr   formsql)with_toggleru   is_slowr@   select	is_selectd   width_ratiostart_offset
end_offset
stacktracetrace_colorsimilar	duplicatec                      | d         d          S )NrK   rv   rA   )xs    r,   r   z)SQLPanel.generate_stats.<locals>.<lambda>.  s    AaD<N;N rD   )key)rS   queriesr}   )!r   r   listrd   dt_settings
get_configrN   rP   re   	enumeratevaluesminrC   rx   rI   r&   r-   r>   r
   r   r   r   r   lowerlstrip
startswithrc   ZeroDivisionErrorr   r]   record_statssortedrO   )rg   requestresponsetrace_colorssimilar_query_groupsduplicate_query_groupssql_warning_thresholdwidth_ratio_tallyfactorndbrgbr[   nnnclast_by_aliasrB   rW   rp   
prev_queryprev_trans_idfinal_querygroup_colorsrT   s                          @r,   generate_statszSQLPanel.generate_stats   s   ,.."#7#7#7#788*400!,T!2!2= T	5$/$:$<$<=T$U! !#do"6"6"<=>>F"4?#9#9#;#;<< & &2iiA 16F?2E
%j6))S3u:-s33BJJJ"$JJJ!GBAvv CG %j6)) #&; M 8- 8-g$e-?-F-F%GHOOPUVVV&/CE/J/J'KLSS   !99Z00*..ub99
 *z : :
 },,$037
<0+04n-'(,E*%%'')Dh{);* *E+& "U**,Jh~)>- -E.) !/ -U*L*L*L*T! ! !f < P#/e$#O#O#OE%L#(#47L#Li )$**,,3355@@JJ k" &*_U%;K%Hk"-,1*,=,NRU+UE-((( - - -+,E-(((-(9n%&+M&:U>=R&Rl#!U=%99!&7l8K&L&Ll#'3E,4G'Hm$',e$$  -3355 5 5??:..:04K-244 $/<	
 	
 	
 	"DO\;	
 	
 	
 	#O))++1N1N    = N 	
 	
 	
 	
 	
s   8LL! L!c                     |                                  }d                    t          |                    dg                               }|                    dd          }|                     d||           d S )NzSQL {} queriesr   r}   r   )	get_statsformatrP   r&   record_server_timing)rg   r   r   statsr   values         r,   generate_server_timingzSQLPanel.generate_server_timing5  sk       ''EIIi,D,D(E(EFF		*a((!!*eU;;;;;rD   )__name__
__module____qualname____doc__rb   rq   rs   ry   r   	nav_titlepropertyr~   r   templateclassmethodr   r   r   r   r   __classcell__)rj   s   @r,   r_   r_   j   s        
# # # # #    - - - %I	
 	
 X	
   X /H
 
 [
+ + ++ + +l
 l
 l
\< < < < < < <rD   r_   )$rl   collectionsr   r   	django.dbr   django.urlsr   django.utils.translationr   r   r   debug_toolbarr	   r   debug_toolbar.formsr
   debug_toolbar.panelsr   debug_toolbar.panels.sqlr   debug_toolbar.panels.sql.formsr   !debug_toolbar.panels.sql.trackingr   debug_toolbar.panels.sql.utilsr   r   debug_toolbar.utilsr   r-   r>   rC   rI   r]   r_   rA   rD   r,   <module>r      s    # # # # # #       ! ! ! ! ! !       @ @ @ @ @ @ @ @ 1 1 1 1 1 1 . . . . . . & & & & & & * * * * * * 8 8 8 8 8 8 9 9 9 9 9 9 T T T T T T T T 1 1 1 1 1 1  @  8  0 0 01 1 1O< O< O< O< O<u O< O< O< O< O<rD   