Ë
    ‡ŸžgÌ  ã                   ó”   — d Z ddlZddlmZmZ ddlmZmZ ddlZddlZddl	m
Z
mZ  ej                  e«      Zd„ Zd„ Zdd	„Zd
„ Zd„ Zy)uL  
MÃ³dulo de acceso a datos - MVP v1.0

Implementa todas las operaciones de base de datos del sistema:
- ConexiÃ³n y gestiÃ³n de sesiones
- Consultas de mediciones y sensores
- Operaciones de actualizaciÃ³n
- GestiÃ³n de transacciones

Este mÃ³dulo centraliza el acceso a datos para mantener consistencia
y facilitar optimizaciones.
é    N)ÚErrorÚconnect)ÚdatetimeÚ	timedeltaé   )Ú	DB_CONFIGÚ
BATCH_SIZEc                 óæ  — d}|t         d   k  ry	 t        j                  j                  t         d   t         d   t         d   t         d   | ¬«      }|j	                  «       rt
        j                  d| › �«       |S 	 |t         d   k  rŒyt
        j                  d«       y# t        $ rI}t
        j                  d	|d
z   › d|› �«       |d
z  }t        j                  t         d   «       Y d}~Œpd}~ww xY w)uÑ   
    Establece conexiÃ³n con la base de datos con reintentos.
    
    Args:
        db_name (str): Nombre de la base de datos
        
    Returns:
        Connection: Objeto de conexiÃ³n o None si falla
    r   Úretry_attemptsÚhostÚportÚuserÚpassword)r   r   r   r   ÚdatabasezConectado a la base de datos: zIntento é   z
 fallido: Úretry_delayNu2   No se pudo establecer conexiÃ³n a la base de datos)r   ÚmysqlÚ	connectorr   Úis_connectedÚloggerÚinfor   ÚerrorÚtimeÚsleep)Údb_nameÚretry_countÚ
connectionÚes       ú6/Users/jma/desarrollo/EV-Temp_rev04/src/db/database.pyr   r      sõ   € ð €KØ
œ	Ð"2Ñ3Ò
3ð	1ÜŸ™×0Ñ0Ü˜vÑ&Ü˜vÑ&Ü˜vÑ&Ü" :Ñ.Ø ð 1ó ˆJð ×&Ñ&Ô(Ü—‘Ð<¸W¸IÐFÔGØ!Ð!ð )ð œ	Ð"2Ñ3Ó
3ô" ‡L�LÐEÔFØøô ò 	1Ü�L‰L˜8 K°!¡OÐ#4°J¸q¸cÐBÔCØ˜1ÑˆKÜ�J‰J”y Ñ/×0Ñ0ûð	1ús   �A)B Â	C0Â'?C+Ã+C0c                 ó<  — | sg S 	 | j                  «       }d}|j                  |«       |j                  «       |j                  «        S # t        $ r4}t
        j                  d|› �«       g cY d}~j                  «        S d}~ww xY w# j                  «        w xY w)zq
    Obtiene lista de sensores activos.
    
    Returns:
        list: [(id_modbus, dmac, id_entrada), ...]
    zá
        SELECT 
            m.idModbus,
            m.dmac,
            e.idEntrada
        FROM modbus m
        JOIN entradas e ON e.idModbus = m.idModbus
        WHERE m.estado = 1 
        AND m.dmac IS NOT NULL
        z#Error obteniendo sensores activos: N)ÚcursorÚexecuteÚfetchallÚcloser   r   r   )Úconnr!   Úqueryr   s       r   Úget_active_sensorsr'   7   s†   € ñ Øˆ	ðØ—‘“ˆð	ˆð 	�‰�uÔØ�‰Ó ð
 	�‰�øô	 ò Ü�‰Ð:¸1¸#Ð>Ô?ØŒ	à�‰�ûð	ûð 	�‰�ús/   †2A	 Á		BÁBÁ+BÁ,B	 ÂBÂB	 Â	Bc                 ó&  — | sg S d}	 |r;t         j                  d«       t         j                  d| j                  «       › �«       | j                  d¬«      }|rt         j                  d«       	 | j	                  «        |rt         j                  d«       | j                  «        |rt         j                  d	«       d
}|r|d|› �z  }|rt         j                  d|› �«       |j                  |«       |j                  «       }|r!t         j                  dt        |«      › �«       |ru|D �cg c]  }|d   ‘Œ	 }}dj                  dj                  dgt        |«      z  «      «      }	|r"t         j                  dt        |«      › d�«       |j                  |	|«       | j                  «        |rt         j                  d«       ||r)|j                  «        |rt         j                  d«       S S S # t
        $ r%}|rt         j                  d|› �«       Y d}~�Œ…d}~ww xY wc c}w # t        $ r¯}t         j                  d|› �«       |rt         j                  dd¬«       	 | j	                  «        |rt         j                  d«       n#  |rt         j                  d«       Y nxY wg cY d}~|r)|j                  «        |rt         j                  d«       S S S d}~ww xY w# |r)|j                  «        |rt         j                  d«       w w w xY w)uÎ   
    Obtiene mediciones no procesadas.
    
    Args:
        conn: ConexiÃ³n a la base de datos
        debug (bool): Flag para modo debug
        limit (int, opcional): LÃ­mite de registros a obtener
    Nz&Iniciando get_unprocessed_measurementsu   Estado conexiÃ³n: T©ÚbufferedzCursor creadozRollback previo ejecutadozError en rollback previo: u   Nueva transacciÃ³n iniciadaaf  
        SELECT 
            b.id,
            b.dmac,
            b.temp/10.0 as temp,
            b.fecha,
            e.idEntrada
        FROM bandeja_blue b
        JOIN modbus m ON b.dmac = m.dmac
        JOIN entradas e ON e.idModbus = m.idModBus
        WHERE b.procesado_el IS NULL
        AND b.temp IS NOT NULL
        ORDER BY b.fecha ASC
        z LIMIT zEjecutando query: zResultados obtenidos: r   z•
            UPDATE bandeja_blue 
            SET procesado_el = NOW()
            WHERE id IN ({})
            AND procesado_el IS NULL
            ú,ú%sz Ejecutando marca de procesados: z
 registroszCommit ejecutado exitosamentezCursor cerradozError obteniendo mediciones: zStack trace completo:)Úexc_infou$   Rollback ejecutado despuÃ©s de errorz$Error ejecutando rollback post-error)r   Údebugr   r!   ÚrollbackÚ	ExceptionÚstart_transactionr"   r#   ÚlenÚformatÚjoinÚcommitr$   r   r   )
r%   r.   Úlimitr!   r   r&   ÚresultsÚrowÚidsÚ
mark_querys
             r   Úget_unprocessed_measurementsr;   U   s³  € ñ Øˆ	à€FðV/ÙÜ�L‰LÐAÔBÜ�L‰LÐ-¨d×.?Ñ.?Ó.AÐ-BÐCÔDà—‘ d�Ó+ˆáÜ�L‰L˜Ô)ð	?Ø�M‰MŒOÙÜ—‘Ð8Ô9ð
 	×ÑÔ ÙÜ�L‰LÐ6Ô7ðˆñ Ø�w˜u˜gÐ&Ñ&ˆEáÜ�L‰LÐ-¨e¨WÐ5Ô6à�‰�uÔØ—/‘/Ó#ˆáÜ�L‰LÐ1´#°g³,°Ð@ÔAñ Ø%,Ö-˜c�3�q“6Ð-ˆCÐ-ð÷
 ‘�s—x‘x  ¬¨S«Ñ 1Ó2Ó3ð ñ Ü—‘Ð?ÄÀCÃ¸zÈÐTÔUà�N‰N˜: sÔ+à�‰ŒÙÜ�L‰LÐ8Ô9àñ Ø�L‰LŒNÙÜ—‘Ð-Õ.ð ð øôK ò 	?ÙÜ—‘Ð9¸!¸Ð=Ô>ÿùð	?üòJ .øô& ò Ü�‰Ð4°Q°CÐ8Ô9ÙÜ�L‰LÐ0¸4ˆLÔ@ð	EØ�M‰MŒOÙÜ—‘ÐCÔDùð	EÙÜ—‘ÐCÔDüØŒ	áØ�L‰LŒNÙÜ—‘Ð-Õ.ð ð ûðûñ Ø�L‰LŒNÙÜ—‘Ð-Õ.ð ð ús€   ˆA&H( Á/'G2 ÂBH( Ä-H#Ä9BH( Ç2	H Ç;HÈH( ÈH È H( È(	K È11KÉ#'JÊ
KÊJ&Ê$KÊ*K Ê+K# ËK Ë K# Ë#-Lc                 óÞ  — | r|syd}	 | j                  d¬«      }| j                  «        dj                  dgt        |«      z  «      }d|› d�}|j	                  ||«       | j                  «        	 |r|j                  «        yy# t        $ rE}| j                  «        t        j                  d	|› �«       Y d}~|r|j                  «        yyd}~ww xY w# |r|j                  «        w w xY w)
z6
    Marca un lote de mediciones como procesadas.
    FNTr)   r+   r,   zT
        UPDATE bandeja_blue 
        SET procesado_el = NOW()
        WHERE id IN (z+)
        AND procesado_el IS NULL
        z*Error marcando registros como procesados: )r!   r1   r4   r2   r"   r5   r$   r   r/   r   r   )r%   r9   r!   Úplaceholdersr&   r   s         r   Úmark_as_processed_batchr>   »   sé   € ñ ‘sØà€FðØ—‘ d�Ó+ˆØ×ÑÔ à—x‘x  ¬¨S«Ñ 1Ó2ˆðð #�^ð $	ðˆð 	�‰�u˜cÔ"Ø�‰ŒØñ Ø�L‰L�Nð øô ò Ø�‰ŒÜ�‰ÐAÀ!ÀÐEÔFÛáØ�L‰L�Nð ûðûñ
 Ø�L‰L�Nð ús*   ‰A(B Â	CÂ(CÂ7C ÃCÃC ÃC,c                 ó`  — | r|sy	 | j                  «       }d}|j                  ||«       | j                  «        	 |j                  «        y# t        $ rB}t
        j                  d|› �«       | j                  «        Y d}~j                  «        yd}~ww xY w# j                  «        w xY w)uü   
    Inserta lote de registros estadÃ­sticos.
    
    Args:
        conn: ConexiÃ³n a base de datos
        registros (list): Lista de tuplas (idSistema, idEntrada, fecha, ...)
        
    Returns:
        bool: True si la operaciÃ³n fue exitosa
    Fz™
        INSERT INTO registros 
        (idSistema, idEntrada, fecha, medio, maximo, minimo, desvio)
        VALUES (%s, %s, %s, %s, %s, %s, %s)
        Tu*   Error insertando registros estadÃ­sticos: N)r!   Úexecutemanyr5   r$   r   r   r   r/   )r%   Ú	registrosr!   r&   r   s        r   Úinsert_registros_batchrB   Ù   s“   € ñ ‘yØðØ—‘“ˆðˆð
 	×Ñ˜5 )Ô,Ø�‰ŒØð 	�‰�øô ò Ü�‰ÐAÀ!ÀÐEÔFØ�‰ŒÛà�‰�ûðûð
 	�‰�ús)   ‡4A Á	BÁ(BÁ>B ÂBÂB ÂB-)FN)Ú__doc__Úmysql.connectorr   r   r   r   r   r   ÚloggingÚconfig.settingsr   r	   Ú	getLoggerÚ__name__r   r'   r;   r>   rB   © ó    r   ú<module>rK      sK   ðñó ß *ß (Û Û ß 3à	ˆ×	Ñ	˜8Ó	$€òò>ó<c/òLó<rJ   