o
    QDi'                     @   sL  d dl Z d dlZd dlZd dlZd dl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mZ zd dlZejjjZejjjZW n% eyi   zd dlmZ d dlmZ W n eyf   dZdZY nw Y nw ejd	d
dZdd e	 d! D Z"G dd de#Z$dd Z%dd Z&G dd dZ'G dd de'Z(G dd de'Z)dS )    N)perf_counter)apps)settings)	force_str)get_stack_traceget_template_info)Json)STATUS_IN_TRANSACTIONzdebug-toolbar-allow-sqlT)defaultc                 C   s   h | ]}|j jqS  )_metadb_table).0mr   r   Z/var/www/Datamplify/venv/lib/python3.10/site-packages/debug_toolbar/panels/sql/tracking.py	<setcomp>!   s    r   debug_toolbarc                   @   s   e Zd ZdZdS )SQLQueryTriggeredz+Thrown when template panel triggers a queryN)__name__
__module____qualname____doc__r   r   r   r   r   &   s    r   c                    sb   t  jtjjjrd S t ds/ j _ j _	d  _
 fdd} fdd}| _| _d S d S )N_djdt_cursorc                     sH    j } j| i |}|d u r|S t rtnt}t|j||j |S N)	_djdt_loggerr   	allow_sqlgetNormalCursorMixinExceptionCursorMixinpatch_cursor_wrapper_with_mixin	__class__cursorargskwargsloggerr!   mixin
connectionr   r   r!   :   s   
zwrap_cursor.<locals>.cursorc                     sR    j } j| i |}|d ur't|ts't rtnt}t|j	||j
 |S |S r   )r   _djdt_chunked_cursor
isinstanceDjDTCursorWrapperMixinr   r   r   r   r   r    r!   r"   r'   r   r   chunked_cursorJ   s   
z#wrap_cursor.<locals>.chunked_cursor)r*   r!   djangotest	testcases_DatabaseFailurehasattrr   r,   r)   r   )r(   r!   r,   r   r'   r   wrap_cursor*   s   	

r2   c                 C   s   G dd d|| }|S )Nc                   @   s   e Zd ZdS )z:patch_cursor_wrapper_with_mixin.<locals>.DjDTCursorWrapperN)r   r   r   r   r   r   r   DjDTCursorWrapper[   s    r3   r   )base_wrapperr&   r3   r   r   r   r   Z   s   r   c                       s   e Zd Z fddZ  ZS )r+   c                    s   t  || || _d S r   )super__init__r%   )selfr!   dbr%   r    r   r   r6   b   s   
zDjDTCursorWrapperMixin.__init__)r   r   r   r6   __classcell__r   r   r9   r   r+   a   s    r+   c                   @   s   e Zd ZdZdd ZdS )r   z_
    Wraps a cursor and raises an exception on any operation.
    Used in Templates panel.
    c                 C   s   t  r   )r   )r7   attrr   r   r   __getattr__n   s   z ExceptionCursorMixin.__getattr__N)r   r   r   r   r<   r   r   r   r   r   h   s    r   c                       sT   e Zd ZdZdd Zdd Zdd Zd fd	d
	Zd fdd	Z fddZ	  Z
S )r   z*
    Wraps a cursor and logs queries.
    c                    s   t rt|t rt|dr||jS t|dr||jS t|ttfr- fdd|D S t|tr= fdd|	 D S t
j
t
jt
jf}t|t|| dS )Nobjadaptedc                    s   g | ]}  |qS r   _decode)r   elementr7   r   r   
<listcomp>   s    z-NormalCursorMixin._decode.<locals>.<listcomp>c                    s   i | ]
\}}|  |qS r   r?   )r   keyvaluerB   r   r   
<dictcomp>   s    z-NormalCursorMixin._decode.<locals>.<dictcomp>)strings_only)PostgresJsonr*   r1   dumpsr=   r>   tuplelistdictitemsdatetimedatetimer   )r7   paramCONVERT_TYPESr   rB   r   r@   w   s   


zNormalCursorMixin._decodec                 C   s6   d| j _z| j j| j||W | j| j _S | j| j _w )z0Get the last executed query from the connection.N)r8   r   opslast_executed_queryr!   r%   r7   sqlparamsr   r   r   _last_executed_query   s   z&NormalCursorMixin._last_executed_queryc                    s  | j j}| j j}|dkr| j j}|jj}t }z| |W t }	|	| d }
d}tt	 t
| |}W d    n1 s@w   Y  t }|dkrbt tsbt tr\ d n
 | nt  |||  ||
 |tdd|d}|dkrz|j}W n |jy   d}Y nw |jj}|tkr|tkr| j|}n	| j|}nd }|||jj|d	 t d
 rt fddtD s| jj di | S S t }	|	| d }
d}tt	 t
| |}W d    n1 sw   Y  t }|dkrt tst tr d n
 | nt  |||  ||
 |tdd|d}|dkrpz|j}W n |jyF   d}Y nw |jj}|tkrc|tkr\| j|}n	| j|}nd }|||jj|d	 t d
 rt fddtD s| jj di | w w )N
postgresqli   zutf-8   )skip)vendoraliasrV   durationraw_sqlrW   
stacktracetemplate_infounknown)trans_idtrans_status	iso_levelSKIP_TOOLBAR_QUERIESc                 3   s    | ]}| v V  qd S r   r   )r   tablerV   r   r   	<genexpr>   s    
z,NormalCursorMixin._record.<locals>.<genexpr>r   )!r8   r^   r]   r(   infotransaction_statusr   
contextlibsuppress	TypeErrorjsonrI   r@   r   r*   strbytesdecode	as_stringrX   r   isolation_levelInternalErrorr	   r%   current_transaction_idnew_transaction_idupdatedt_settings
get_configany
DDT_MODELSrecord)r7   methodrV   rW   r^   r]   conninitial_conn_status
start_time	stop_timer_   _paramsrb   r$   rf   final_conn_statusrd   r   ri   r   _record   s   











zNormalCursorMixin._recordNc                       |  t j||S r   )r   r5   callproc)r7   procnamerW   r9   r   r   r         zNormalCursorMixin.callprocc                    r   r   )r   r5   executerU   r9   r   r   r      r   zNormalCursorMixin.executec                    r   r   )r   r5   executemany)r7   rV   
param_listr9   r   r   r      r   zNormalCursorMixin.executemanyr   )r   r   r   r   r@   rX   r   r   r   r   r:   r   r   r9   r   r   r   s    Vr   )*rm   contextvarsrN   rp   rP   r   django.test.testcasesr-   django.appsr   r   r   rz   debug_toolbar.sanitizer   debug_toolbar.utilsr   r   psycopgtypesJsonbrH   pqTransactionStatusINTRANSr	   ImportErrorpsycopg2._jsonr   psycopg2.extensions
ContextVarr   get_app_config
get_modelsr}   	Exceptionr   r2   r   r+   r   r   r   r   r   r   <module>   sD    
0
