ó
    h3¦gù  ã                   óÒ   • S r SSKrSSKrSSKJrJr  SSKJr  SSKJr  \R                  " \
5      r0 rS\4S jrS\4S	 jrSS
\4S jjrS
\S\4S jrS rSS jrS rSS jrSS jrg)uW   
MÃ³dulo de Base de Datos - MVP v1.0

Maneja conexiones y operaciones de base de datos
é    N)ÚErrorÚpoolingé   )Ú	DB_CONFIG)ÚdatetimeÚdb_namec                 ó~  • U [         ;  a|   SU  3S[        S   [        S   [        S   [        S   U S.n[        R                  R                  R
                  " S0 UD6[         U '   [        R                  SU  35        [         U    $ [         U    $ ! [         a"  n[        R                  S	U 35         S
nAg
S
nAff = f)z¦
Obtiene o crea un pool de conexiones para una base de datos

Args:
    db_name: Nombre de la base de datos
    
Returns:
    MySQLConnectionPool: Pool de conexiones
Úpool_é   ÚhostÚportÚuserÚpassword)Ú	pool_nameÚ	pool_sizer   r   r   r   ÚdatabasezPool de conexiones creado para z"Error creando pool de conexiones: N© )
Úconnection_poolsr   ÚmysqlÚ	connectorr   ÚMySQLConnectionPoolÚloggerÚinfor   Úerror)r   Úpool_configÚes      Ú./var/www/blue/EV-Temp_rev04/src/db/database.pyÚget_connection_poolr      sÄ   € ð Ô&Ó&ð	à$ W IÐ.ØÜ! &Ñ)Ü! &Ñ)Ü! &Ñ)Ü% jÑ1Ø#ñˆKô ).¯©×(?Ñ(?×(SÒ(SÑ(bÐVaÑ(bÔ˜WÑ%Ü�K‰KÐ9¸'¸ÐCÔDô
 ˜GÑ$Ð$Ô˜GÑ$Ð$øô	 ó 	Ü�L‰LÐ=¸a¸SÐAÔBÜûð	ús   ŒA2B Â
B<ÂB7Â7B<c                 ó¨   • [        U 5      nU(       a   UR                  5       $ g! [         a"  n[        R	                  SU 35         SnAgSnAff = f)u�   
Obtiene una conexiÃ³n del pool

Args:
    db_name: Nombre de la base de datos
    
Returns:
    MySQLConnection: ConexiÃ³n a la base de datos
u%   Error obteniendo conexiÃ³n del pool: N)r   Úget_connectionr   r   r   ©r   Úpoolr   s      r   Úconnectr#   /   sY   € ô ˜wÓ'€DÞð	FØ×&Ñ&Ó(Ð(ð øô ó 	FÜ�L‰LÐ@ÀÀÐD×EÐEØûð	Fús   ”% ¥
A¯AÁAÚqueryc                 óF  • Sn U R                  SS9nUR                  X=(       d    S5        U(       a6  U R                  5         SUR                  4U(       a  UR	                  5         $ $ SUR                  5       4U(       a  UR	                  5         $ $ ! [         ae  n[        R                  SU 35        U (       a  U(       a  U R                  5         S[        U5      4s SnAU(       a  UR	                  5         $ $ SnAff = f! U(       a  UR	                  5         f f = f)uõ   
Ejecuta una query con manejo de errores

Args:
    connection: ConexiÃ³n a la base de datos
    query: Query SQL
    params: ParÃ¡metros para la query
    commit: Si se debe hacer commit
    
Returns:
    tuple: (success, result/error_message)
NT)Ú
dictionaryr   zError ejecutando query: F)ÚcursorÚexecuteÚcommitÚrowcountÚcloseÚfetchallr   r   r   ÚrollbackÚstr)Ú
connectionr$   Úparamsr)   r'   r   s         r   Úexecute_queryr1   A   sï   € ð €FðØ×"Ñ"¨dÐ"Ð3ˆØ�‰�uŸl¨Ô+æØ×ÑÔØ˜Ÿ™Ð(ö Ø�L‰L�Nð ð ˜Ÿ™Ó*Ð*ö Ø�L‰L�Nð øô ó Ü�‰Ð/°¨sÐ3Ô4Þž&Ø×ÑÔ!Ø”c˜!“fˆ}Ôö Ø�L‰L�Nð ûðûö Ø�L‰L�Nð ús7   „AB Á*B Â
DÂAC>Ã DÃ!D Ã>DÄD ÄD Úparams_listc                 óÆ  • Sn U R                  5       nUR                  X5        U R                  5         SUR                  4U(       a  UR	                  5         $ $ ! [
         a^  n[        R                  SU 35        U (       a  U R                  5         S[        U5      4s SnAU(       a  UR	                  5         $ $ SnAff = f! U(       a  UR	                  5         f f = f)uè   
Ejecuta una query mÃºltiple veces con diferentes parÃ¡metros

Args:
    connection: ConexiÃ³n a la base de datos
    query: Query SQL
    params_list: Lista de parÃ¡metros
    
Returns:
    tuple: (success, rowcount/error_message)
NTzError en executemany: F)
r'   Úexecutemanyr)   r*   r+   r   r   r   r-   r.   )r/   r$   r2   r'   r   s        r   Úexecute_manyr5   c   s¿   € ð €FðØ×"Ñ"Ó$ˆØ×Ñ˜5Ô.Ø×ÑÔØ�V—_‘_Ð$ö Ø�L‰L�Nð øô ó Ü�‰Ð-¨a¨SÐ1Ô2ÞØ×ÑÔ!Ø”c˜!“fˆ}Ôö Ø�L‰L�Nð ûðûö Ø�L‰L�Nð ús/   „>A Á
CÁ%;B>Â CÂ!C Â>CÃC ÃC c                  ó  • [         R                  5        H.  u  p UR                  5         [        R	                  SU  35        M0     [         R                  5         g! [
         a&  n[        R                  SU  SU 35         SnAMr  SnAff = f)z$Cierra todos los pools de conexioneszPool cerrado para zError cerrando pool z: N)r   Úitemsr+   r   r   r   r   Úclearr!   s      r   Úclose_all_poolsr9   €   sy   € ä)×/Ñ/Ö1‰ˆð	@Ø�J‰JŒLÜ�K‰KÐ,¨W¨IÐ6Ö7ñ 2ô ×ÑÕøô ó 	@Ü�L‰LÐ/°¨y¸¸1¸#Ð>×?Ò?ûð	@ús   ›(AÁ
BÁ&BÂBc                 óæ  •  U R                  5       nSnUR                  U5        UR                  5       nU(       a"  [        R	                  S[        U5       S35        US[        5       ;   a  UR                  5         $ $ ! [         aC  n[        R                  SU 35        / s SnAS[        5       ;   a  WR                  5         $ $ SnAff = f! S[        5       ;   a  WR                  5         f f = f)zz
Obtiene mediciones no procesadas de la tabla bandeja_blue

Returns:
    list: [(id, dmac, temp, fecha, id_entrada), ...]
a�  
            SELECT 
                bb.id,
                bb.dmac,
                bb.temp,
                bb.fecha,
                e.idEntrada
            FROM bandeja_blue bb
            JOIN modbus m ON bb.dmac = m.dmac
            JOIN entradas e ON m.idModbus = e.idModbus
            WHERE bb.procesado_el IS NULL
            ORDER BY bb.fecha
            LIMIT 1000
        z
Obtenidas z mediciones sin procesarr'   z*Error obteniendo mediciones sin procesar: N)
r'   r(   r,   r   ÚdebugÚlenÚlocalsr+   r   r   )Úconnr;   r'   r$   Úmeasurementsr   s         r   Úget_unprocessed_measurementsr@   �   sÍ   € ðØ—‘“ˆðˆð 	�‰�uÔØ—‘Ó(ˆæÜ�L‰L˜:¤c¨,Ó&7Ð%8Ð8PÐQÔRàð ”v“xÓØ�L‰L�Nð  øô	 ó Ü�‰ÐAÀ!ÀÐEÔFØŒ	à”v“xÓØ�L‰L�Nð  ûð	ûð ”v“xÓØ�L‰L�Nð  ús0   ‚AA? Á?
CÂ	CÂ"CÂ#C ÃCÃC Ã!C0c                 ó�  •  U R                  5       nSnUR                  U5        UR                  5       S[        5       ;   a  UR	                  5         $ $ ! [
         aC  n[        R                  SU 35        / s SnAS[        5       ;   a  WR	                  5         $ $ SnAff = f! S[        5       ;   a  WR	                  5         f f = f)z\
Obtiene lista de sensores activos

Returns:
    list: [(sensor_id, dmac, id_entrada), ...]
zÝ
            SELECT 
                m.idModbus,
                m.dmac,
                e.idEntrada
            FROM modbus m
            JOIN entradas e ON m.idModbus = e.idModbus
            WHERE m.estado = 1
        r'   z#Error obteniendo sensores activos: N)r'   r(   r,   r=   r+   r   r   r   )r>   r'   r$   r   s       r   Úget_active_sensorsrB   ¶   s©   € ðØ—‘“ˆðˆð 	�‰�uÔØ�‰Ó ð ”v“xÓØ�L‰L�Nð  øô	 ó Ü�‰Ð:¸1¸#Ð>Ô?ØŒ	à”v“xÓØ�L‰L�Nð  ûð	ûð ”v“xÓØ�L‰L�Nð  ús/   ‚2A Á
B!ÁBÁ7B!Á8B$ ÂB!Â!B$ Â$!Cc                 óH  • U(       d  g U R                  5       nSR                  S/[        U5      -  5      nSU S3n[        R                  " 5       /U-   nUR                  XV5        U R                  5         U(       a"  [        R                  S[        U5       S35        S	[        5       ;   a  WR                  5         gg! [         a2  nU R                  5         [        R                  SU 35         SnANWSnAff = f! S	[        5       ;   a  WR                  5         f f = f)
z_
Marca un lote de mediciones como procesadas

Args:
    ids (list): Lista de IDs de mediciones
NÚ,z%sz]
            UPDATE bandeja_blue 
            SET procesado_el = %s
            WHERE id IN (z
)
        z	Marcadas z mediciones como procesadasz+Error marcando mediciones como procesadas: r'   )r'   Újoinr<   r   Únowr(   r)   r   r;   r   r-   r   r=   r+   )r>   Úidsr;   r'   Úplaceholdersr$   r0   r   s           r   Úmark_as_processed_batchrI   Ò   sû   € ö ØðØ—‘“ˆØ—x‘x  ¬¨S«Ñ 1Ó2ˆðð '˜ð (	ðˆô
 —,’,“.Ð! CÑ'ˆà�‰�uÔ%Ø�‰ŒæÜ�L‰L˜9¤S¨£X JÐ.IÐJÔKð ”v“xÓØ�L‰L�Nð  øô	 ó HØ�‰ŒÜ�‰ÐBÀ1À#ÐF×GÑGûðHûð ”v“xÓØ�L‰L�Nð  ús*   ŠBC Ã
C=Ã(C8Ã3D  Ã8C=Ã=D  Ä !D!c                 óÒ  • U(       d  g U R                  5       nSnUR                  XA5        U R                  5         U(       a"  [        R	                  S[        U5       S35        S[        5       ;   a  WR                  5         gg! [         a2  nU R                  5         [        R                  SU 35         SnANWSnAff = f! S[        5       ;   a  WR                  5         f f = f)u–   
Inserta un lote de registros estadÃ­sticos

Args:
    registros (list): Lista de tuplas (idSistema, idEntrada, fecha, medio, maximo, minimo, desvio)
NzÁ
            INSERT IGNORE INTO registros 
                (idSistema, idEntrada, fecha, medio, maximo, minimo, desvio)
            VALUES 
                (%s, %s, %s, %s, %s, %s, %s)
        zInsertados u    registros estadÃ­sticoszError insertando registros: r'   )r'   r4   r)   r   r;   r<   r   r-   r   r=   r+   )r>   Ú	registrosr;   r'   r$   r   s         r   Úinsert_registros_batchrL   ó   s¿   € ö ØðØ—‘“ˆðˆð 	×Ñ˜5Ô,Ø�‰ŒæÜ�L‰L˜;¤s¨9£~Ð&6Ð6NÐOÔPð ”v“xÓØ�L‰L�Nð  øô	 ó 9Ø�‰ŒÜ�‰Ð3°A°3Ð7×8Ñ8ûð9ûð ”v“xÓØ�L‰L�Nð  ús*   ŠAB Â
CÂ(B=Â8C Â=CÃC Ã!C&)NF)F)Ú__doc__ÚloggingÚmysql.connectorr   r   r   Úconfig.settingsr   r   Ú	getLoggerÚ__name__r   r   r.   r   r#   r1   Úlistr5   r9   r@   rB   rI   rL   r   ó    r   Ú<module>rU      s†   ðñó Û ß *Ý 'Ý à	×	Ò	˜8Ó	$€ð Ð ð% ô %ð:�Sô ñ$  Sõ  ðD Cð °dô ò:	ô $òLô8õBrT   