o
    i!                     @   s  d dl mZ d dl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 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 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& da'da(dd Z)dd Z*e+de,eddeddde- eej.dd d!pej.d"d d!eej.d#d d!pej.d$d d!e$d d%e*dd& d'e/fd(d)Z0i Z1d'e,e/e/f fd*d+Z2d'e3e/ fd,d-Z4d.e/d'e/fd/d0Z5d1d2 Z6d3d4 Z7d5d6 Z8d7d8 Z9d9d: Z:d;d< Z;dS )=    )import_moduleN)wrap_function_wrapper)config)Pin)dbapi)patched_connect_async_factory)Psycopg3FetchTracedAsyncCursor)Psycopg3TracedAsyncCursor)patched_connect_factory)Psycopg3FetchTracedCursor)Psycopg3TracedCursor)_patch_extensions)_unpatch_extensions)get_psycopg2_extensions)schematize_database_operation)schematize_service_name)asbool)unwrap)_DBM_Propagator)default_sql_injectorc               	   C   sT   t du stdu r(ztd} | jjd a | jjd aW dS  ttfy'   Y dS w dS )z`Get psycopg3 original method references, avoiding top-level evaluation to avoid circular importsNpsycopgconnect)_original_connect_original_async_connectr   
Connection__dict__AsyncConnectionImportErrorAttributeError)psycopg_import r    Z/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/psycopg/patch.py_get_psycopg3_original_methods    s   r"   c                 C   sR   t jd D ]}t|dr#t|jdr#t||jjr#|j| |   S qt| |S )N_patched_modulessql
Composable)r   r   hasattrr$   
isinstancer%   SQL_default_sql_injector)dbm_commentsql_statementpsycopg_moduler    r    r!   _psycopg_sql_injector-   s   

r-   r   postgreszpostgres.query
postgresql)database_providerDD_PSYCOPG_TRACE_FETCH_METHODSF)defaultDD_PSYCOPG2_TRACE_FETCH_METHODSDD_PSYCOPG_TRACE_CONNECTDD_PSYCOPG2_TRACE_CONNECTquery)_default_service_dbapi_span_name_prefix_dbapi_span_operation_namer#   trace_fetch_methodstrace_connect_dbm_propagator	dbms_namereturnc                   C   s   dS )N r    r    r    r    r!   get_versionM      r@   c                   C   s
   dddS )Nz>=3.0.0z>=2.9.10r   psycopg2r    r    r    r    r!   _supported_versionsT   s   
rD   c                   C   s   t S N)PATCHED_VERSIONSr    r    r    r!   get_versionsX   rA   rG   versionc                 C   s"   d tdd | dd d S )N.c                 S   s   |  dd S )N r   )split)xr    r    r!   <lambda>]   s    z format_version.<locals>.<lambda>   )joinmaprK   )rH   r    r    r!   format_version\   s   "rQ   c               	   c   sL    d} | D ]}zt |}tt|ddt|< |V  W q ty#   Y qw d S )NrB   __version__r?   )r   rQ   getattrrF   r   )module_namesmodule_namemoduler    r    r!   _psycopg_modules`   s   
rW   c                  C      t  D ]} t|  qd S rE   )rW   _patchr,   r    r    r!   patchn      

r[   c                 C   s   t | ddrdS d| _ttjd|  | jdkr8t| }|tjd< t| t	| dt
|  tjd	 |  dS t  t	| dt
|  t	| d
t|  t	| dt|  t	| jdt
|  t	| jdt|  tjd	 |  dS )zjPatch monkey patches psycopg's connection function
    so that the connection's functions are traced.
    _datadog_patchFNT)_configrC   _extensions_to_patchr   r#   CursorAsyncCursor)rS   r]   r   r   r   onto__name__r   r   _wr
   addr"   #init_cursor_from_connection_factoryr   r   r   )r,   _psycopg2_extensionsr    r    r!   rY   s   s"   

rY   c                  C   rX   rE   )rW   _unpatchrZ   r    r    r!   unpatch   r\   ri   c                 C   s   t | ddrId| _| jdkrt| d t| }t| nt| d t| d t| d td ur3t| j_t	d ur;t	| j
_t| }|rK||  d S d S d S )Nr]   FrC   r   r`   ra   )rS   r]   rc   _ur   r   r   r   r   r   r   r   get_fromremove_from)r,   rg   pinr    r    r!   rh      s$   






rh   c                    s    fdd}|S )Nc                    s8  | dd }|s*t|}tdd t|D d }|d ur!| |}|s*| |i |S t| }tj}|r<|j	r<d}nd}t
|  jrK|rHtnt}	n|rOtnt}	t| jj}
d|
v rd|vrd }tt|D ]}t|| rw| |} nqh|d u r|j}| |||d|}n| |g|R i |}|	|||dS )	N
connectionc                 s   s$    | ]\}}t |tjr|V  qd S rE   )r'   r   TracedConnection).0irL   r    r    r!   	<genexpr>   s   " z[init_cursor_from_connection_factory.<locals>.init_cursor_from_connection.<locals>.<genexpr>TFrow_factory)rn   rs   )cursorrm   cfg)poplistnext	enumerater   rk   cloner   r   r:   
issubclassra   r   r	   r   r   inspect	signature__init__
parametersrangelencallablers   )wrapped_cursor_cls_argskwargsrn   indexrm   ru   r:   traced_cursor_clsargs_mappingrs   rq   rt   rZ   r    r!   init_cursor_from_connection   s:   


zHinit_cursor_from_connection_factory.<locals>.init_cursor_from_connectionr    )r,   r   r    rZ   r!   rf      s   +rf   )<	importlibr   r|   oswraptr   rd   ddtracer   ddtrace._trace.pinr   ddtrace.contribr   1ddtrace.contrib.internal.psycopg.async_connectionr   -ddtrace.contrib.internal.psycopg.async_cursorr   r	   +ddtrace.contrib.internal.psycopg.connectionr
   'ddtrace.contrib.internal.psycopg.cursorr   r   +ddtrace.contrib.internal.psycopg.extensionsr   r   r   ddtrace.internal.schemar   r   ddtrace.internal.utils.formatsr   ddtrace.internal.utils.wrappersr   rj   (ddtrace.propagation._database_monitoringr   r   r)   r   r   r"   r-   _adddictsetgetenvstrr@   rF   rD   rw   rG   rQ   rW   r[   rY   ri   rh   rf   r    r    r    r!   <module>   sp    

 