mirror of
https://github.com/KeymonSoft/jRDC-Multi.git
synced 2026-04-17 21:06:24 +00:00
- feat: Implementa control de logs de SQLite granular por DBKey y corrige la concurrencia del Timer en Hot-Swap.
- Este commit introduce una mejora crucial en el rendimiento y la flexibilidad del servidor al permitir el control detallado del registro de logs en SQLite (users.db) por cada base de datos configurada (DB1, DB2, etc.).
- Cambios Principales y Beneficios:
1. Control Granular de Logs: Se reemplazó el flag de control global de logs por un mapa (SQLiteLoggingStatusByDB), permitiendo al administrador deshabilitar el costoso proceso de escritura de query_logs y errores para bases de datos específicas mediante la propiedad enableSQLiteLogs en sus archivos .properties correspondientes.
2. Estabilización del Timer y Hot-Swap:
◦ Se corrigió un problema de concurrencia y estado asegurando que timerLogs se inicialice incondicionalmente, resolviendo el error IllegalStateException: Interval must be larger than 0 que ocurría durante el reload.
◦ El Timer de limpieza (borraArribaDe15000Logs y VACUUM) ahora se activa solo si al menos una base de datos tiene el logging habilitado (IsAnySQLiteLoggingEnabled), minimizando el overhead de E/S de disco cuando los logs no se requieren.
3. Recarga Dinámica de Estado: El comando manager?command=reload ahora lee la configuración enableSQLiteLogs de todos los conectores nuevos y actualiza atómicamente el estado global de logs, aplicando los cambios sin requerir un reinicio del servidor.
69 lines
3.5 KiB
QBasic
69 lines
3.5 KiB
QBasic
B4J=true
|
|
Group=Default Group
|
|
ModulesStructureVersion=1
|
|
Type=StaticCode
|
|
Version=10.3
|
|
@EndOfDesignText@
|
|
' Archivo: ParameterValidationUtils.bas
|
|
' Módulo de utilidad: ParameterValidationUtils
|
|
' Centraliza la lógica de validación y ajuste de parámetros SQL.
|
|
' Ahora soporta recorte de parámetros excesivos.
|
|
|
|
Sub Process_Globals
|
|
' El Type ParameterValidationResult está declarado en Main.bas, no se declara aquí.
|
|
End Sub
|
|
|
|
' Valida y ajusta la lista de parámetros para la ejecución SQL, aplicando la lógica de tolerancia.
|
|
' Retorna un ParameterValidationResult indicando éxito/error y los parámetros a usar.
|
|
Public Sub ValidateAndAdjustParameters (CommandName As String, DBKey As String, sqlCommand As String, receivedParams As List, IsToleranceEnabled As Boolean) As ParameterValidationResult
|
|
Dim res As ParameterValidationResult
|
|
res.Initialize
|
|
res.Success = True ' Asumimos éxito inicialmente
|
|
|
|
' Log(">>>> IsToleranceEnabled: " & IsToleranceEnabled)
|
|
|
|
' Aseguramos que receivedParams esté inicializada, incluso si está vacía o Null
|
|
If receivedParams = Null Or receivedParams.IsInitialized = False Then
|
|
receivedParams.Initialize ' Inicializa una lista vacía si es Null o no inicializada.
|
|
End If
|
|
|
|
' Contar cuántos '?' hay en la sentencia SQL para saber cuántos parámetros se esperan.
|
|
Dim expectedParams As Int = sqlCommand.Length - sqlCommand.Replace("?", "").Length
|
|
Dim receivedParamsSize As Int = receivedParams.Size
|
|
|
|
If receivedParamsSize < expectedParams Then
|
|
' Caso 1: Se recibieron MENOS parámetros de los esperados. Esto es un error.
|
|
res.Success = False
|
|
res.ErrorMessage = $"ERROR: Número de parámetros insuficiente para "${CommandName}" (DB: ${DBKey}). Se esperaban ${expectedParams} y se recibieron ${receivedParamsSize}."$
|
|
Log(res.ErrorMessage)
|
|
Main.LogServerError("ERROR", "ParameterValidationUtils.ValidateAndAdjustParameters", res.ErrorMessage, DBKey, CommandName, Null) ' <-- Nuevo Log
|
|
Return res
|
|
Else If receivedParamsSize > expectedParams Then
|
|
' Caso 2: Se recibieron MÁS parámetros de los esperados.
|
|
If IsToleranceEnabled Then ' Solo recortamos si la tolerancia está habilitada
|
|
Dim adjustedParams As List
|
|
adjustedParams.Initialize
|
|
For i = 0 To expectedParams - 1
|
|
adjustedParams.Add(receivedParams.Get(i))
|
|
Next
|
|
res.ParamsToExecute = adjustedParams
|
|
res.Success = True
|
|
Dim WarningMsg As String = $"ADVERTENCIA: Se recibieron más parámetros de los esperados para "${CommandName}" (DB: ${DBKey}). Se esperaban ${expectedParams} y se recibieron ${receivedParamsSize}. Se ajustó la lista de parámetros a ${expectedParams} elementos."$
|
|
Log(WarningMsg)
|
|
Main.LogServerError("ADVERTENCIA", "ParameterValidationUtils.ValidateAndAdjustParameters", WarningMsg, DBKey, CommandName, Null) ' <-- Nuevo Log [6]
|
|
Else
|
|
' Si la tolerancia NO está habilitada, esto es un error crítico.
|
|
res.Success = False
|
|
res.ErrorMessage = $"ERROR: Número de parámetros excesivo para "${CommandName}" (DB: ${DBKey}). Se esperaban ${expectedParams} y se recibieron ${receivedParamsSize}. La tolerancia a parámetros de más está DESHABILITADA."$
|
|
Log(res.ErrorMessage)
|
|
Main.LogServerError("ERROR", "ParameterValidationUtils.ValidateAndAdjustParameters", res.ErrorMessage, DBKey, CommandName, Null)
|
|
Return res
|
|
End If
|
|
Else
|
|
' Caso 3: Se recibieron el número EXACTO de parámetros. Todo bien.
|
|
res.ParamsToExecute = receivedParams ' Usamos la lista original tal cual.
|
|
res.Success = True ' Confirmamos éxito.
|
|
End If
|
|
|
|
Return res
|
|
End Sub |