mirror of
https://github.com/KeymonSoft/jRDC-Multi.git
synced 2026-04-17 12:56:23 +00:00
- fix(handlers, logs): Reporte robusto de AffectedRows (simbólico) y limpieza de tabla de errores - Aborda dos problemas críticos para la estabilidad y fiabilidad del servidor: el manejo del conteo de filas afectadas en DMLs y la gestión del crecimiento de la tabla de logs de errores. - Cambios Principales: 1. Fix AffectedRows (ExecuteBatch V1 y DBHandlerJSON): Dada la imposibilidad de capturar el conteo de filas afectadas real (Null) de forma segura o la falla total en tiempo de ejecución (Method: ExecNonQuery2 not matched) al usar reflexión, se revierte la lógica a la llamada directa de ExecNonQuery2. Si el comando DML se ejecuta sin lanzar una excepción SQL, se reporta simbólicamente '1' fila afectada al cliente (en el Protocolo V1 y en la respuesta JSON para executecommand) para confirmar el éxito de la operación. 2. Limpieza de Tabla de Errores: Se corrigió la subrutina Main.borraArribaDe15000Logs para incluir la tabla `errores` en la limpieza periódica. Esto asegura que el log de errores no crezca indefinidamente, manteniendo solo los 15,000 registros más recientes y realizando la optimización de espacio en disco con `vacuum`.
70 lines
3.5 KiB
QBasic
70 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)
|
|
Log("Cache: " & Main.LOG_CACHE_THRESHOLD & "|" & Main.ErrorLogCache.Size)
|
|
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 |