o
    ib                  
   @   s  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 e de!eded dd de"fddZ#de!e"e"f fddZ$ej%dej&dej'dej(dej)d iZ*d!d" Z+G d#d$ d$ej,Z-G d%d& d&ej,Z.d'd( Z/d)d* Z0dS )+    N)config)Pin)_SPAN_MEASURED_KEY)	SPAN_KIND)dbapi)trace_utils)_convert_to_string)SpanKind)	SpanTypes)db)net)core)	COMPONENT)schematize_database_operation)schematize_service_name)unwrap)_DBM_Propagator)traceraiomysqlmysqlquery)_default_service_dbm_propagatorreturnc                   C   s   t tddS )N__version__ )getattrr    r   r   [/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/aiomysql/patch.pyget_version!   s   r   c                   C   s   ddiS )Nr   z>=0.1.0r   r   r   r   r   _supported_versions%   s   r    hostportuserr   c           	         sp   | |i |I d H }i }t  D ]\}}t||r$tt||d ||< qd|tj< t|}t|d	| |S )Nr   )tags)
CONN_ATTR_BY_TAGitemshasattrr   r   r   SYSTEMAIOTracedConnectionr   onto)	connect_func_argskwargsconnr$   tagattrcr   r   r   patched_connect2   s   

r3   c                       sH   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	  Z
S )AIOTracedCursorz<TracedCursor wraps a aiomysql cursor and traces its queries.c                    s,   t t| | ||  tddd| _d S )Nzmysql.queryr   )database_provider)superr4   __init__r*   r   _self_datadog_name)selfcursorpin	__class__r   r   r7   B   s   
zAIOTracedCursor.__init__c           	         s6  t | }|r| s||i |I d H }|S tj| jt|tj	|t
jdi}|ttj	j |ttj |td ||j || tdtj	|||fj}|r]|j\}}}z#||i |I d H }|W |tj| j |d| j W  d    S |tj| j |d| j w 1 sw   Y  d S )N)serviceresource	span_type   zaiomysql.executezdb.rownumber)r   get_fromenabledr   tracer8   r   ext_servicer   r   r
   SQL_set_tag_strr   integration_namer   r	   CLIENT
set_metricr   set_tagsr$   r   dispatch_with_resultsresultvaluer   ROWCOUNTrowcount	rownumber)	r9   methodr?   
extra_tagsr-   r.   r;   rM   sr   r   r   _trace_methodG   sB   

zAIOTracedCursor._trace_methodc                    s2   | j | jj|ddi|g|R i |I d H }|S )Nzsql.executemanytrue)rU   __wrapped__executemanyr9   r   r-   r.   rM   r   r   r   rX   k   s   zAIOTracedCursor.executemanyc                    s.   | j | jj|i |g|R i |I d H }|S N)rU   rW   executerY   r   r   r   r[   q   s   (zAIOTracedCursor.executec                    s   | S rZ   r   r9   r   r   r   
__aenter__v   s   zAIOTracedCursor.__aenter__c                       | j j|i |I d H S rZ   rW   	__aexit__r9   r-   r.   r   r   r   r`   z      zAIOTracedCursor.__aexit__)__name__
__module____qualname____doc__r7   rU   rX   r[   r]   r`   __classcell__r   r   r<   r   r4   ?   s    $r4   c                       s:   e Zd Zdef fdd	Zdd Zdd Zdd	 Z  ZS )
r)   Nc                    s<   t t| | t|}|pt|d}||  || _d S )N)r>   )r6   r)   r7   r   _get_vendorr   r*   _self_cursor_cls)r9   r/   r;   
cursor_clsnamedb_pinr<   r   r   r7      s
   


zAIOTracedConnection.__init__c                    sB   j j|i | ts S  fdd}t | S )Nc                     s    I d H }  | S rZ   )ri   )r:   ctx_managerr;   r9   r   r   _wrap_cursor   s   
z0AIOTracedConnection.cursor.<locals>._wrap_cursor)rW   r:   r   rB   type)r9   r-   r.   ro   r   rm   r   r:      s   
zAIOTracedConnection.cursorc                    s   | j  I d H S rZ   )rW   r]   r\   r   r   r   r]      s   zAIOTracedConnection.__aenter__c                    r^   rZ   r_   ra   r   r   r   r`      rb   zAIOTracedConnection.__aexit__)	rc   rd   re   r4   r7   r:   r]   r`   rg   r   r   r<   r   r)   ~   s
    	r)   c                   C   s*   t tddrd S dt_ttjdt d S )N__datadog_patchFT_connect)r   r   rq   wraptwrap_function_wrapper
connectionr3   r   r   r   r   patch   s   rv   c                   C   s&   t tddrdt_ttjd d S d S )Nrq   Frr   )r   r   rq   r   ru   r   r   r   r   unpatch   s   rw   )1r   rs   ddtracer   ddtrace._trace.pinr   ddtrace.constantsr   r   ddtrace.contribr   r   $ddtrace.contrib.internal.trace_utilsr   ddtrace.extr	   r
   r   r   ddtrace.internalr   ddtrace.internal.constantsr   ddtrace.internal.schemar   r   ddtrace.internal.utils.wrappersr   (ddtrace.propagation._database_monitoringr   ddtrace.tracer   _adddictstrr   r    TARGET_HOSTTARGET_PORTSERVER_ADDRESSUSERNAMEr%   r3   ObjectProxyr4   r)   rv   rw   r   r   r   r   <module>   sP    		?*