ó
    ¥ gÌ  ã                   ó–   • S r SSKrSSKJrJr  SSKJrJr  SSKrSSKrSSK	J
r
Jr  \R                  " \5      rS rS rSS	 jrS
 rS rg)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                 óô  • SnU[         S   :  a}   [        R                  R                  [         S   [         S   [         S   [         S   U S9nUR	                  5       (       a  [
        R                  SU  35        U$  U[         S   :  a  M}  [
        R                  S5        g! [         aJ  n[
        R                  S	US
-    SU 35        US
-  n[        R                  " [         S   5         SnANtSnAff = f)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       Ú./var/www/blue/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# Â#
C7Â-A C2Ã2C7c                 óH  • U (       d  / $  U R                  5       nSnUR                  U5        UR                  5       UR                  5         $ ! [         a4  n[
        R                  SU 35        / s SnAWR                  5         $ SnAff = f! WR                  5         f = f)z]
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Á1BÁ2B ÂBÂB ÂB!c                 óð  • U (       d  / $ Sn U(       a;  [         R                  S5        [         R                  SU R                  5        35        U R                  SS9nU(       a  [         R                  S5         U R	                  5         U(       a  [         R                  S5        U R                  5         U(       a  [         R                  S	5        S
nU(       a  USU 3-  nU(       a  [         R                  SU 35        UR                  U5        UR                  5       nU(       a!  [         R                  S[        U5       35        U(       az  U Vs/ sH  owS   PM	     nnSR                  SR                  S/[        U5      -  5      5      n	U(       a"  [         R                  S[        U5       S35        UR                  X˜5        U R                  5         U(       a  [         R                  S5        UU(       a.  UR                  5         U(       a  [         R                  S5        $ $ $ ! [
         a*  nU(       a  [         R                  SU 35         SnAGN¸SnAff = fs  snf ! [         aÅ  n[         R                  SU 35        U(       a  [         R                  SSS9   U R	                  5         U(       a  [         R                  S5        O#!   U(       a  [         R                  S5         O= f/ s SnAU(       a.  UR                  5         U(       a  [         R                  S5        $ $ $ SnAff = f! U(       a.  UR                  5         U(       a  [         R                  S5        f f f = f)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ö Ù%,Ó-¡W˜c�q”6¡WˆCÐ-ð÷
 ‘�s—x‘x  ¬¨S«Ñ 1Ó2Ó3ð ö Ü—‘Ð?ÄÀCÃ¸zÈÐTÔUà�N‰N˜:Ô+à�‰ŒÞÜ�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-I, Á;,H0 Â'B0I, ÅI'Å$BI, È0
I$È:IÉI, ÉI$É$I, É,
L;É63L6Ê*,KËL6ËK7Ë5L6Ë;L;Ë<L> Ì6L;Ì;L> Ì>7M5c                 ó
  • U (       a  U(       d  gSn U R                  SS9nU R                  5         SR                  S/[        U5      -  5      nSU S3nUR	                  XA5        U R                  5          U(       a  UR                  5         gg! [         aJ  nU R                  5         [        R                  S	U 35         SnAU(       a  UR                  5         ggSnAff = f! U(       a  UR                  5         f f = f)
z.
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Ô"Ø�‰ŒØö Ø�L‰L�Nð øô ó Ø�‰ŒÜ�‰ÐAÀ!ÀÐEÔFÛæØ�L‰L�Nð ûðûö
 Ø�L‰L�Nð ús*   “A$B Â
C%Â(C ÃC( Ã C%Ã%C( Ã(Dc                 ót  • U (       a  U(       d  g U R                  5       nSnUR                  X15        U R                  5          UR                  5         g! [         aB  n[
        R                  SU 35        U R                  5          SnAWR                  5         gSnAff = f! WR                  5         f = f)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)   ‘3A Á
B"Á (BÂB% ÂB"Â"B% Â%B7)FN)Ú__doc__Úmysql.connectorr   r   r   r   r   r   ÚloggingÚconfig.settingsr   r	   Ú	getLoggerÚ__name__r   r'   r;   r>   rB   © ó    r   Ú<module>rK      sI   ðñó ß *ß (Û Û ß 3à	×	Ò	˜8Ó	$€òò>ô<c/òLó<rJ   