
    {hf                     *   d dl Z d dlmZmZmZmZmZmZ d dlm	Z	 d dl
mZ ddddd	d
ddZeeeedf   eeedf      f      ZdZd Zddedeeedf      deeeef      fdZ	 deddedededefdZ	 ddddedeeedf      dedeeeef      fdZy)    N)AnyDictListOptionalTupleUnion)connect)errorsz6dev-rds-mysql.crs0e6k0ssxf.us-east-2.rds.amazonaws.comi  	agencycicz3fU(>C&~I[X5,}%
imparablesT
   )hostportuserpassworddatabaseuse_pureconnection_timeout.i  c                  R  K   t        di t         d{   } | j                          d{   }	 |j                  d       d{    |j                  d       d{    |j	                          d{    | S 7 i7 S7 ;7 $7 # |j	                          d{  7   w xY ww)ul   
    Conexión asíncrona a MySQL con ajustes de sesión
    para reducir bloqueos y esperas por locks.
    Nz6SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTEDz(SET SESSION innodb_lock_wait_timeout = 5 )r	   	DB_CONFIGcursorexecuteclose)cnxcurs     W/var/www/dev.api.imparables.com.co/api_imparables/crm_asincrono/conexion_db/conexion.pyget_connectionr      s     
 $)$
$C


CkkRSSSkkDEEEiikJ %
SEciiksx   B'A?B'BB'B	 BB	  B!B	 %B'8B9B'B'B	 B	 B'	B$B B$$B'sqlparamsreturnc                   K   t                d{   }|j                  d       d{   }	 |j                  | |xs d       d{    |j                          d{   }||j	                          d{    |j	                          d{    S 7 7 o7 R7 <7 %7 # |j	                          d{  7   |j	                          d{  7   w xY ww)u$   
    SELECT → lista de dicts.
    NT)
dictionaryr   )r   r   r   fetchallr   )r   r    r   r   rowss        r   queriesr&   +   s       
 C

d
+
+Ckk#v|,,,\\^#iikiik !
+,# 	 iikiiks   CBCBCB$ 	B
B$ !B"B$ 'C:B ;CB"CCB$ B$  C"C$C8B;9CCCC)
chunk_sizer'   c          
        K   t                d{   }|j                          d{   }	 t        |t              sx|j	                  | |xs d       d{    |j
                  xs d}|j                          d{    ||j                          d{    |j                          d{    S d}|xs g }|s2	 |j                          d{    |j                          d{    yt        dt        |            }t        dt        |      |      D ]  }t        d||z  dz    d| d||z   dz
   d       ||||z    }	d	D ]I  }
	 |j                  | |	       d{    ||j
                  xs dz  }|j                          d{     n t%        j&                  d       d{     ||j                          d{    |j                          d{    S 7 7 7 7 r7 \7 G7 &7 7 7 r# t        j                  $ rr}t!        |d
d      }|dv rB|
dk(  r=|j#                          d{  7   t%        j&                  d       d{  7   Y d}~|j#                          d{  7    d}~ww xY w7 7 7 # |j                          d{  7   |j                          d{  7   w xY ww)u   
    INSERT/UPDATE/DELETE.
    - Si 'params' es tupla -> execute
    - Si 'params' es lista de tuplas -> executemany con chunking y reintento 1×
    Devuelve el número total de filas afectadas.
    Nr   r      zProcesando chunk z (registros z a ))r)      errno)i  i  g?)r   r   
isinstancelistr   rowcountcommitr   maxintrangelenprintexecutemanymysql_errorsDatabaseErrorgetattrrollbackasynciosleep)r   r    r'   r   r   affectedtotal_affecteddataichunkattemptecodes                r   r   r   :   s      
 C


C.&$'++c6<R000||(qH**,N iikiikK &,lB iikiik? C
O,
q#d)Z0 	#A%a:o&9%:,qcQQ[^^_M_L``abc1z>*E " //#u555"cll&7a7N**,&&$ --"""/	#2  iikiika !
 1P 	 	- 6&#11 	"1gt4D|+1!lln,,%mmC000 ,,.((	 #
 	 iikiiks{  K	G(K	G+K	)J G.'J ?G1 J K	G4K	0G71K	6
J K	G:K	,G=-K	2AJ H$H %*HHHJ /J0J 7K	
JK	"J#K	+K	.J 1J 4K	7K	:K	=K	 HHJ	)J I
JI!
J$J *J=J 
>JJ		J K	K	K&J)'K?K KK	i:  c                  K   t                d{   }|j                  dd       d{   }	 t        d| dd  d       t        j                         j                         }|j                  d       d{    |j                  d	       d{    |j                  | |xs d
       d{    g }d}d}	 |j                  |       d{   }	|	sn|dz  }|t        |	      z  }|j                  |	       t        j                         j                         |z
  }
|
dkD  r||
z  nd}t        d| dt        |	       d|dd|dd	       t        j                  d       d{    t        j                         j                         |z
  }|dkD  r||z  nd}t        d|dd|dd|dd       ||j                          d{    |j                          d{    S 7 7 7 v7 `7 E7 (7 7 17 # t        $ r}t        d|         d}~ww xY w# |j                          d{  7   |j                          d{  7   w xY ww)un  
    SELECT masivo optimizado para grandes volúmenes (reemplazo directo de queries).
    Procesa por chunks pero devuelve todas las filas como lista completa.
    
    Args:
        sql: Query SQL
        params: Parámetros de la query
        chunk_size: Tamaño del chunk para streaming
    
    Returns:
        Lista completa de todas las filas como dicts
    NTSSCursor)r#   cursor_classu   🚀 Ejecutando query masiva: d   z...z!SET SESSION sql_buffer_result = 0z&SET SESSION read_buffer_size = 2097152r   r   r)   u   📦 Chunk z: z filas | Total: ,z | Velocidad: z,.0fz
 filas/segu   ✅ Query masiva completada: z
 filas en z.2fzs | Promedio: u   ❌ Error en query masiva: )r   r   r5   r;   get_event_looptimer   	fetchmanyr4   extendr<   r   	Exception)r   r    r'   r   r   
start_timeall_rows
total_rowschunk_countrA   elapsedrate
total_time
final_raterC   s                  r   queries_masivosrW   x   s_    $  
 C

d
D
DC1.s4Cyk=>++-224
 kk=>>>kkBCCCkk#v|,,,
--
33E1K#e*$JOOE",,.335
BG+2Q;:'ADk]"SZL 9$Q ("4[
4 --"""% ( ++-224zA
0:QZ*,A
+Jq>JsCS T#D)5	

  iikiiki !
D 	?C, 4" #  	  +A3/0 iikiiks   IG)IG,IAH 9G/:H G2H 0G51H G8BH (G;)AH 8IG=I#G?$I,I/H 2H 5H 8H ;H =I?I	H
HHH! !I5H86IIII)N)r;   typingr   r   r   r   r   r   mysql.connector.aior	   mysql.connectorr
   r7   r   
ParamsType_DEFAULT_CHUNKr   strr&   r2   r   rW   r       r   <module>r_      s2    : : ' 2 E!	 eE#s(OT%S/-BBCD
 s HU38_$= dSVX[S[nI] " < %	<	<< 	<
 	<@ )-F 	F	FU38_%F 	F
 
$sCx.Fr^   