mirror of
https://github.com/KeymonSoft/jRDC-Multi.git
synced 2026-04-18 05:09:32 +00:00
- feat: Implementa tolerancia de parámetros configurable y mejora estabilidad general del servidor. - La tolerancia de parametros permite que si un query requiere 3 parametros y se mandan 4, NO mande un error, solo manda a la base de datos los parametros correctos y tira los extras, y guarda una "ADVERTENCIA" en el Log de errores. - Este commit introduce la funcionalidad de `parameterTolerance` configurable y aborda varias mejoras críticas para la estabilidad y eficiencia del jRDC2-Multi. - Principales cambios y beneficios: - **Tolerancia de Parámetros**: Añade la propiedad `parameterTolerance` en `config.properties` para controlar el manejo de parámetros de más. Cuando está habilitada, recorta los parámetros excesivos; si está deshabilitada (modo estricto, por defecto), genera un error, aumentando la robustez de la validación. - **Inicialización Multi-DB Confiable**: Corrige la lógica de inicialización en `Main.AppStart` para `RDCConnector` de DB3 y DB4, asegurando que cada base de datos tenga su propio *pool* de conexiones correctamente configurado. - **Optimización de Ejecución SQL**: Elimina llamadas duplicadas a `ExecQuery2` y `ExecNonQuery2` en `DBHandlerB4X.bas`, garantizando que solo los parámetros validados se utilicen y evitando ejecuciones redundantes en la base de datos. - **Refactorización y Limpieza**: Se eliminó la declaración duplicada de `ActiveRequestsCountByDB` en `Main.bas` y la subrutina `Handle0` obsoleta en `Manager.bas`, mejorando la claridad y mantenibilidad del código.
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 |