B
    `%                 @   s  d dl mZ d dlmZ d dlmZ d dlZd dlZd dlZd dl	m
Z
mZ d dlmZ d dlmZmZmZmZ e Zyd dlmZ d d	lmZ eed
dd Zeeddd Zd;ddZeeddd Zeeddd Zeeddd Zeeddd Z eedd d! Z!eed"d#d$ Z"eed%d&d' Z#eed(d)d* Z$eed+d,d- Z%eed.d/d0 Z&d1Z'W n e(k
r   d2Z'Y nX d3d4 Z)G d5d6 d6eZ*G d7d8 d8e+Z,d9d: Z-dS )<    )HTTPBadRequest)get_current_request)view_configN)json	url_quote)
DebugPanel)ROOT_ROUTE_NAMESTATIC_PATH
format_sqltext_)event)EngineZbefore_cursor_executec             C   s   t | dt  d S )Npdtb_start_timer)setattrtime)conncursorstmtparamscontextexecmany r   h/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/pyramid_debugtoolbar/panels/sqla.py_before_cursor_execute   s    r   Zafter_cursor_executec          	   C   s   t   }t }|d k	r~t|dr~tT |jj}t| j|t	| j< |j
}	|| j d }
|	t	| j|
|||d W d Q R X t| d d S )Npdtb_sqla_queriesi  )	engine_idduration	statement
parametersr   r   )r   r   hasattrlockregistrypdtb_sqla_enginesweakrefrefengineidr   r   appenddelattr)r   r   r   r   r   r   Z
stop_timerrequestenginesqueriesr   r   r   r   _after_cursor_execute   s    r,    c          	   C   sp   t  }|dk	rlt|drltJ |jj}t| j|t| j< |j	}|
t| jdd| ddd W dQ R X dS )z;
        Abstract logger for transactional events

        Nr   r   z-- [event] %sr-   )r   r   r   r   r   )r   r   r    r!   r"   r#   r$   r%   r&   r   r'   )r   r   r   r)   r*   r+   r   r   r   _transactional_event_logger0   s    r.   beginc             C   s   t | d d S )Nr/   )r.   )r   r   r   r   _beginE   s    r0   commitc             C   s   t | d d S )Nr1   )r.   )r   r   r   r   _commitI   s    r2   rollbackc             C   s   t | d d S )Nr3   )r.   )r   r   r   r   	_rollbackM   s    r4   Z	savepointc             C   s   t | d|  d S )Nzsavepoint %s)r.   )r   namer   r   r   
_savepointQ   s    r6   Zrollback_savepointc             C   s   d| }t | || d S )Nzrollback_savepoint %s)r.   )r   r5   r   r   r   r   r   _rollback_savepointU   s    r7   Zrelease_savepointc             C   s   d| }t | || d S )Nzrelease_savepoint %s)r.   )r   r5   r   r   r   r   r   _release_savepointZ   s    r8   Zbegin_twophasec             C   s   d| }t | | d S )Nzbegin_twophase %s)r.   )r   xidr   r   r   r   _begin_twophase_   s    r:   Zprepare_twophasec             C   s   d| }t | | d S )Nzprepare_twophase %s)r.   )r   r9   r   r   r   r   _prepare_twophased   s    r;   Zcommit_twophasec             C   s   d||f }t | | d S )Nzcommit_twophase %s %s)r.   )r   r9   is_preparedr   r   r   r   _commit_twophasei   s    r=   Zrollback_twophasec             C   s   d||f }t | | d S )Nzrollback_twophase %s %s)r.   )r   r9   r<   r   r   r   r   _rollback_twophasen   s    r>   TFc             C   s   | S )Nr   )xr   r   r   <lambda>x       r@   c                   sh   e Zd ZdZdZdZedZedZdd Z	e
dd	 Ze
d
d Zdd Z fddZdd Z  ZS )SQLADebugPanelzx
    Panel that displays the SQL generated by SQLAlchemy plus the time each
    SQL statement took in milliseconds.
    
sqlalchemyz8pyramid_debugtoolbar.panels:templates/sqlalchemy.dbtmakozSQLAlchemy QueriesZ
SQLAlchemyc             C   s>   g  | _ |_t|jdr$|jj| _ni  | _|j_|j| _d S )Nr"   )r+   r   r   r!   r"   r*   pdtb_id)selfr)   r   r   r   __init__   s
    zSQLADebugPanel.__init__c             C   s   | j r
dS dS d S )NTF)r+   )rE   r   r   r   has_content   s    zSQLADebugPanel.has_contentc             C   s   | j rdt| j  S d S )Nz%d)r+   len)rE   r   r   r   nav_subtitle   s    zSQLADebugPanel.nav_subtitlec             C   s   g }xt | jD ]\}}|d }|  d}d}ytt|d }W n8 tk
r`   Y n& t	k
rr   Y n t
k
r   Y nX ||d |d t|||d |||d |d	 qW |t| jd	| _d S )
Nr   selectr-   r   r   r   r   )	r   r   sqlZraw_sqlr   r   	is_selectr   query_index)r+   textr*   )	enumerater+   striplower
startswithr   r   dumps	TypeError
ValueErrorUnicodeDecodeErrorr'   r
   r   r*   data)rE   responserW   indexqueryr   rL   r   r   r   r   process_response   s4    zSQLADebugPanel.process_responsec                s   | j s
dS tt| |S )Nz"No queries in executed in request.)r+   superrB   render_content)rE   r)   )	__class__r   r   r]      s    zSQLADebugPanel.render_contentc             C   s   | j |j|t|tdS )N)rD   	route_urlZstatic_path	root_path)rD   r_   Z
static_urlr	   r   )rE   r)   r   r   r   render_vars   s    zSQLADebugPanel.render_vars)__name__
__module____qualname____doc__r5   template_titleZ	nav_titlerF   propertyrG   rI   r[   r]   ra   __classcell__r   r   )r^   r   rB   {   s   $rB   c               @   sD   e Zd Zdd Zdd Zeddddd	 Zed
dddd ZdS )SQLAlchemyViewsc             C   s
   || _ d S )N)r)   )rE   r)   r   r   r   rF      s    zSQLAlchemyViews.__init__c             C   sX   | j jd }| j j|}|d kr*tddd |jD d }t| j jd }|j| S )N
request_idzNo history found for request.c             S   s   g | ]}|j d kr|qS )rC   )r5   ).0pr   r   r   
<listcomp>   s    z.SQLAlchemyViews.find_query.<locals>.<listcomp>r   rM   )r)   Z	matchdictZpdtb_historygetr   Zpanelsintr+   )rE   rl   ZtoolbarZ	sqlapanelrM   r   r   r   
find_query   s    zSQLAlchemyViews.find_queryzdebugtoolbar.sql_selectz?pyramid_debugtoolbar.panels:templates/sqlalchemy_select.dbtmako)Z
route_nameZrendererc             C   s   |   }|d }|d }|d }|  ds:td|sFtd| jjjj}|t	|  }|
||}| | t|t|d dS )	Nr   r   r   rJ   zNot a SELECT SQL statementzNo valid database enginer   )resultheadersrK   r   )rr   rQ   rP   rR   r   r)   r!   parent_registryr"   rq   executefetchallkeysr
   float)rE   
query_dictr   r   r   r*   r%   rs   r   r   r   
sql_select   s    zSQLAlchemyViews.sql_selectzdebugtoolbar.sql_explainz@pyramid_debugtoolbar.panels:templates/sqlalchemy_explain.dbtmakoc       	      C   s   |   }|d }|d }|d }|s,td| jjjj}|t|  }|jdr\d| }nd| }|	||}|
 | t|tt|d d	S )
Nr   r   r   zNo valid database engineZsqlitezEXPLAIN QUERY PLAN %sz
EXPLAIN %sr   )rs   rt   rK   strr   )rr   r   r)   r!   ru   r"   rq   r5   rR   rv   rw   rx   r
   r|   ry   )	rE   rz   r   r   r   r*   r%   rZ   rs   r   r   r   sql_explain   s"    
zSQLAlchemyViews.sql_explainN)rb   rc   rd   rF   rr   r   r{   r}   r   r   r   r   rk      s   	rk   c             C   s0   |  dd |  dd | t | t d S )Nzdebugtoolbar.sql_selectz-/{request_id}/sqlalchemy/select/{query_index}zdebugtoolbar.sql_explainz./{request_id}/sqlalchemy/explain/{query_index})Z	add_routeZadd_debugtoolbar_panelrB   scanrb   )configr   r   r   	includeme  s    
r   )r-   ).Zpyramid.httpexceptionsr   Zpyramid.threadlocalr   Zpyramid.viewr   	threadingr   r#   Zpyramid_debugtoolbar.compatr   r   Zpyramid_debugtoolbar.panelsr   Zpyramid_debugtoolbar.utilsr   r	   r
   r   Lockr    rC   r   Zsqlalchemy.engine.baser   Zlistens_forr   r,   r.   r0   r2   r4   r6   r7   r8   r:   r;   r=   r>   Zhas_sqlaImportErrorrg   rB   objectrk   r   r   r   r   r   <module>   s@   

QL