
^Q\#                 @   s  d  d l  m Z 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 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 Gd d   d e  Z  d S)    )absolute_importunicode_literalsN)defaultdict)copy)url)connections)ugettext_lazyungettext_lazy)Panel)views)SQLSelectForm)unwrap_cursorwrap_cursor)contrasting_color_generatorreformat_sql)render_stacktracec             C   s   |  d k r d d  l  } i t d  | j j 6t d  | j j 6t d  | j j 6t d  | j j 6t d  | j j 6} n t |    | j	 |  S)N
postgresqlr   Z
AutocommitzRead uncommittedzRead committedzRepeatable readZSerializable)
psycopg2.extensions_
extensionsZISOLATION_LEVEL_AUTOCOMMITZ ISOLATION_LEVEL_READ_UNCOMMITTEDZISOLATION_LEVEL_READ_COMMITTEDZISOLATION_LEVEL_REPEATABLE_READZISOLATION_LEVEL_SERIALIZABLE
ValueErrorget)vendorlevelpsycopg2choices r   R/var/www/dbchiro/venv/build/django-debug-toolbar/debug_toolbar/panels/sql/panel.pyget_isolation_level_display   s    r   c             C   s   |  d k r d d  l  } i t d  | j j 6t d  | j j 6t d  | j j 6t d  | j j 6t d  | j j 6} n t |    | j	 |  S)Nr   r   IdleZActivezIn transactionzIn errorUnknown)
r   r   r   ZTRANSACTION_STATUS_IDLEZTRANSACTION_STATUS_ACTIVEZTRANSACTION_STATUS_INTRANSZTRANSACTION_STATUS_INERRORZTRANSACTION_STATUS_UNKNOWNr   r   )r   r   r   r   r   r   r   get_transaction_status_display$   s    r!   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   S)SQLPanelze
    Panel that displays information about the SQL queries run while processing
    the request.
    c                si   t  t |   j | |   d d   t D |  _ d |  _ d |  _ g  |  _ i  |  _ i  |  _	 i  |  _
 d  S)Nc             S   s&   i  |  ] } t  t | j  |  q Sr   )lenr   queries).0kr   r   r   
<dictcomp>:   s   	 z%SQLPanel.__init__.<locals>.<dictcomp>r   )superr"   __init__r   _offset	_sql_time_num_queries_queries
_databases_transaction_status_transaction_ids)selfargskwargs)	__class__r   r   r)   8   s    					zSQLPanel.__init__c             C   s   | t  k r d  St  | j } | s' d  S| j d k rE | j   } n t | j   |  j j |  } | |  j | <| s} d  S| | k r | r t j   j	 |  j
 | <q d  |  j
 | <n  |  j
 | S)Nr   )r   
connectionr   Zget_transaction_statusr   r/   r   uuiduuid4hexr0   )r1   aliasconnZ
cur_statuslast_statusr   r   r   get_transaction_idB   s"    zSQLPanel.get_transaction_idc             K   s   |  j  j | | f  | |  j k rG i | d d 6d d 6|  j | <n. |  j | d | d 7<|  j | d d 7<|  j | d 7_ |  j d 7_ d  S)Nduration
time_spent   Znum_queries)r-   appendr.   r+   r,   )r1   r9   r3   r   r   r   record]   s    zSQLPanel.recordZSQLc             C   s#   t  d d |  j  |  j |  j f S)Nz%d query in %.2fmsz%d queries in %.2fms)__r,   r+   )r1   r   r   r   nav_subtitlen   s    	zSQLPanel.nav_subtitlec             C   s*   t  |  j  } t d d |  i | d 6S)Nz%SQL queries from %(count)d connectionz&SQL queries from %(count)d connectionscount)r#   r.   rB   )r1   rD   r   r   r   titles   s    zSQLPanel.titlezdebug_toolbar/panels/sql.htmlc             C   sC   t  d t j d d t  d t j d d t  d t j d d g S)Nz^sql_select/$name
sql_selectz^sql_explain/$sql_explainz^sql_profile/$sql_profile)r   r   rG   rH   rI   )clsr   r   r   get_urls|   s    zSQLPanel.get_urlsc             C   s(   x! t  j   D] } t | |   q Wd  S)N)r   allr   )r1   r5   r   r   r   enable_instrumentation   s    zSQLPanel.enable_instrumentationc             C   s%   x t  j   D] } t |  q Wd  S)N)r   rL   r   )r1   r5   r   r   r   disable_instrumentation   s    z SQLPanel.disable_instrumentationc                s  t      t   f d d    } t d d    } |  j rd } t d t |  j  d  } x t |  j j    D] \ } } d d d g }	 | d }
 d | d | |	 |
 <|
 } xb |	 |
 | k  rt d |	 |
 d  } |	 |
 | 7<| d	 7} | d
 k rd } n  | |	 | <q W|	 | d <qu Wi  } d  } d } x|  j D]\ } } | | | d d	 7<| j	 d  } | j	 |  } | | k r| rd |  j | d	 d	 d <n  | | | <| rd | d <qn  | rd | d <n  | | d <d | k rt
 | d | d  | d <n  d | k rDt | d | d  | d <n  t d d  d t |   | d <| d rt | d  | d <n  |  j | d | d <y7 | d |  j d | d <d | d d | | d <Wn& t k
 rd | d <d | d <Yn X| | d <| d | d | d  <| | d 7} t | d!  | d! <| d	 7} | | d! | d" <qEW| rd |  j | d	 d	 d <qn  t      f d# d$   | j   D } x\ |  j D]Q \ } } y0 | | | d \ } }
 | | d% <|
 | d& <Wqt k
 rYqXqWx] |  j j   D]L \ } } y+ t d' d(   | | j   D  | d% <Wqt k
 rbYqXqW|  j i t |  j j   d) d* d   d+ 6d, d-   |  j D d. 6|  j d/ 6 d  S)0Nc                  s
   t     S)N)nextr   )colorsr   r   <lambda>   s    z)SQLPanel.generate_stats.<locals>.<lambda>c               S   s
   t  t  S)N)r   intr   r   r   r   rQ      s    r   g      p@g      @      r?      Z	rgb_colorZraw_sqltrans_idTZ
ends_transZstarts_transZin_transr9   Z	iso_levelr   Ztrans_statusZauto_idinitialformZsqlr=   d   Zwidth_ratiog      Y@Zwidth_ratio_relativeZstart_offsetZ
end_offsetZ
stacktraceZtrace_colorc                s8   i  |  ]. \ } }   f d  d   | j    D |  q S)c                s7   i  |  ]- \ } } | d  k r | t     f |  q S)rU   )rO   )r%   queryduplicate_count)query_colorsr   r   r'      s   		z6SQLPanel.generate_stats.<locals>.<dictcomp>.<dictcomp>)items)r%   r9   r$   )r\   r   r   r'      s   	z+SQLPanel.generate_stats.<locals>.<dictcomp>r[   Zduplicate_colorc             s   s   |  ] } | d  Vq d S)r   Nr   )r%   er   r   r   	<genexpr>   s    z*SQLPanel.generate_stats.<locals>.<genexpr>keyc             S   s   |  d d S)Nr?   r>   r   )xr   r   r   rQ      s    Z	databasesc             S   s   g  |  ] \ } } |  q Sr   r   )r%   aqr   r   r   
<listcomp>   s   	 z+SQLPanel.generate_stats.<locals>.<listcomp>r$   Zsql_time)r   r   r-   rR   r#   r.   	enumeratevaluesminr   r   r!   r   r   r   r+   ZeroDivisionErrorr   r]   KeyErrorsumZrecord_statssorted)r1   requestresponseZtrace_colorsZquery_duplicatesZwidth_ratio_tallyfactorndbZrgbcolornnZncZ	trans_idsrV   ir9   rZ   Zlast_trans_idZduplicates_countZ
alias_infor   )rP   r\   r   generate_stats   s    		"

	







	
	+		"zSQLPanel.generate_stats)__name__
__module____qualname____doc__r)   r<   rA   r   Z	nav_titlepropertyrC   rE   templateclassmethodrK   rM   rN   rt   r   r   )r4   r   r"   3   s   
r"   )!
__future__r   r   r6   collectionsr   r   Zdjango.conf.urlsr   Z	django.dbr   Zdjango.utils.translationr   r   r	   rB   Zdebug_toolbar.panelsr
   Zdebug_toolbar.panels.sqlr   Zdebug_toolbar.panels.sql.formsr   Z!debug_toolbar.panels.sql.trackingr   r   Zdebug_toolbar.panels.sql.utilsr   r   Zdebug_toolbar.utilsr   r   r!   r"   r   r   r   r   <module>   s   