
    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#y)    N)defaultdict)copy)connections)path)gettext_lazyngettext)settings)SignedDataForm)Panel)views)SQLSelectForm)wrap_cursor)contrasting_color_generatorreformat_sql)render_stacktracec                    | 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        |       |j!                  |      S # 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 w xY w)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)   	 &&77;M9N&&55q9I7J&&66:K8L&&33Q~5FG.   ;;u#  	& ##>>,##DDa&G ##BBAFVDW##CCQ%F ##@@!NBS
G	s   BB& &B*EEc                 N   | dk(  r	 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#        |       |j%                  |      S # 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 w xY w)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   s>   	 

,,111V9

,,33Qx[

,,44a8H6I

,,44a
m

,,44a	lG&   ;;u  		& ##;;QvY##==q{##>>BR@S##>>*##>>)G		s   CC7 7B*F$#F$c                     | d   S )Nraw_sql )querys    r,   _similar_query_keyrC   O   s        c                 L    | d   dnt        | d         }| d   t        |      fS )N
raw_paramsrA   r@   )tuplerepr)rB   rF   s     r,   _duplicate_query_keyrI   S   s4    \*2eL>Q8RJ )d:.//rD   c                    t        t              }| j                         D ]H  \  \  }}}t        |      }|dkD  st	        |      }	|D ]  }
||
| d<   |	|
| d<    ||xx   |z  cc<   J |j                         D ]  \  }}||   || d<    y )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 19LE$ /).fo&).fo&/ 5MU"M# $//+ 1w#)%=4& 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                 \    t        |   |i | d| _        g | _        i | _        i | _        y )Nr   )super__init__	_sql_time_queries
_databases_transaction_ids)selfargskwargs	__class__s      r,   rb   zSQLPanel.__init__p   s2    $)&) "rD   c                 `    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                 b    | j                   j                  |      }|| 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   s7     ((,,U3
 ..u5HrD   c                 *   | j                   j                  |       |d   }|| j                  vr|d   dd| j                  |<   n7| j                  |   dxx   |d   z  cc<   | j                  |   dxx   dz  cc<   | xj                  |d   z  c_        y )NrW   durationrK   )
time_spentnum_queriesrv   rw   )rd   appendre   rc   )rg   ri   rW   s      r,   recordzSQLPanel.record   s    V$w'$Z0 &DOOE"
 OOE"<0F:4FF0OOE"=1Q61&,,rD   SQLc                 f    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   s<    $--(79

 '
	
 	
rD   c                 P    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   s5    DOO$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   sD      0 0|D!2!2G!2!2G
 	
rD   c                 Z    t        j                         D ]  }t        |       | |_         y N)r   allr   _djdt_loggerrg   
connections     r,   enable_instrumentationzSQLPanel.enable_instrumentation   s(    %//+ 	+J
#&*J#	+rD   c                 D    t        j                         D ]	  }d |_         y r   )r   r   r   r   s     r,   disable_instrumentationz SQLPanel.disable_instrumentation   s     %//+ 	+J&*J#	+rD   c           	      4   t               t        fd      }t        t              }t        t              }| j                  rt	        j
                         d   }d}t        dt        | j                        dz  z        }t        | j                  j                               D ]d  \  }	}
g d}|	dz  }d|	dz  |z  z
  ||<   |}||   |k  r9t        d||   z
  d      }||xx   |z  cc<   |d	z  }|d
kD  rd}|||<   ||   |k  r9||
d<   f i }| j                  D ]  }|d   }||t        |      f   j                  |       ||t        |      f   j                  |       |j                  d      }|j                  |i       }|j                  d      }||k7  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   |kD  |d<   |d   j/                         j1                         j3                  d      |d<   | j                  |   d   |d<   	 |d   | j4                  z  dz  |d <   ||d!<   |d    |d!   z   |d"<   ||d    z  }t9        |d#         |d#<   ||d#      |d$<   |||<    |j                         D ]  }|j                  d      d|d<    t               }t;        || j                  |d%       t;        || j                  |d&       | j=                  t?        | j                  jA                         d' (      | j                  | j4                  d)       y # t6        $ r	 d|d <   Y w xY w)*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8*40!,T!2==$/$:$:$<=T$U! !#doo"6"<=>F"4??#9#9#;< &2A 16F?2E
%j6)S3u:-s3BJ"$J!GBAv CG %j6) #&;&  M 8-g$e-?-F%GHOOPUV&/CE/J'KLSS !99Z0*..ub9
 *z :
 },$037
<0+04n-'(,E*%%')Dh{);*E+& "U*,Jh~)>-E.) !/ -U*L*T*T!f <#/e$#OE%L#(#47L#Li )$**,335@@J k" &*__U%;K%Hk"-,1*,=,NRU+UE-( ):n%&+M&:U>=R&Rl#!U=%99!&7l8K&Ll#'3E,4G'Hm$',e$q8-x  -335 5??:.:04K-5 34 $//<	
 	"DOO\;	
 	#OO))+1N  == NN	
3 ) -+,E-(-s   :NNNc                     | j                         }dj                  t        |j                  dg                   }|j                  dd      }| j	                  d||       y )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  sP      ''EIIi,D(E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	
 	
   /H
 
++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      sW     #  !  @ 1 . & * 8 9 T 1@801O<u O<rD   