- VERSION 5.09.08

- Se cambio el codigo para que en lugar de esperar un mapa con los parametros del query y nombres de los parametros (par1, par2, etc) paradefinir el ordenamiento, ahora se espera una lista [1,"2",3], y el orden de los parametros se toma directamente del orden en el que se mandan, de la misma forma que en B4A.
This commit is contained in:
2025-09-08 22:04:15 -06:00
parent 2f9569b585
commit 48dbd1f034
4 changed files with 86 additions and 63 deletions

View File

@@ -5,10 +5,6 @@ Type=Class
Version=10.3
@EndOfDesignText@
' Handler class for JSON requests from Web Clients (JavaScript/axios)
' VERSIÓN 16 (Comentarios y Mensajes en Español):
' - Se añaden comentarios detallados a la versión con mensajes de error en español.
' - Revisa que el 'query' exista en config.properties antes de continuar.
' - Asegura que la conexión a la BD se cierre en todos los 'Return' para evitar fugas.
Sub Class_Globals
' Declara una variable privada para mantener una instancia del conector RDC.
' Este objeto maneja la comunicación con la base de datos.
@@ -62,9 +58,17 @@ Sub Handle(req As ServletRequest, resp As ServletResponse)
' Extrae los datos necesarios del JSON.
Dim execType As String = RootMap.GetDefault("exec", "") ' Tipo de ejecución: "executeQuery" o "executeCommand".
Dim queryName As String = RootMap.Get("query") ' Nombre del comando SQL (definido en config.properties).
Dim paramsMap As Map = RootMap.Get("params") ' Un mapa con los parámetros para la consulta.
' Log(RootMap)
Dim queryName As String = RootMap.Get("query") ' Nombre del comando SQL (definido en config.properties).
' Se obtiene "params" como una Lista en lugar de un Mapa.
Dim paramsList As List = RootMap.Get("params")
' Si la lista de parámetros es nula (no se proporcionó en el JSON),
' la inicializamos como una lista vacía para evitar errores más adelante.
If paramsList = Null Or paramsList.IsInitialized = False Then
paramsList.Initialize
End If
' Verifica si en el JSON se especificó un nombre de base de datos diferente con la clave "dbx".
If RootMap.Get("dbx") <> Null Then DB = RootMap.Get("dbx") ' Si se especifica, usamos la BD indicada, si no, se queda "DB1".
@@ -75,35 +79,12 @@ Sub Handle(req As ServletRequest, resp As ServletResponse)
Return
End If
' Prepara una lista para almacenar las claves de los parámetros.
Dim paramKeys As List
paramKeys.Initialize
' Si el mapa de parámetros existe y está inicializado...
If paramsMap <> Null And paramsMap.IsInitialized Then
' ...itera sobre todas las claves y las añade a la lista 'paramKeys'.
For Each key As String In paramsMap.Keys
paramKeys.Add(key)
Next
End If
' Ordena las claves alfabéticamente. Esto es crucial para asegurar que los parámetros
' se pasen a la consulta SQL en un orden consistente y predecible.
paramKeys.Sort(True)
' Prepara una lista para almacenar los valores de los parámetros en el orden correcto.
Dim orderedParams As List
orderedParams.Initialize
' Itera sobre la lista de claves ya ordenada.
For Each key As String In paramKeys
' Añade el valor correspondiente a cada clave a la lista 'orderedParams'.
orderedParams.Add(paramsMap.Get(key))
Next
' Obtiene una conexión a la base de datos del pool de conexiones.
con = Connector.GetConnection(DB)
' Obtiene la cadena SQL del archivo de configuración usando el nombre de la consulta (queryName).
Dim sqlCommand As String = Connector.GetCommand(DB, queryName)
' <<< INICIO NUEVA VALIDACIÓN: VERIFICAR SI EL COMANDO EXISTE >>>
' <<< INICIO VALIDACIÓN: VERIFICAR SI EL COMANDO EXISTE >>>
' Comprueba si el comando SQL (query) especificado en el JSON fue encontrado en el archivo de configuración.
If sqlCommand = Null Or sqlCommand = "null" Or sqlCommand.Trim = "" Then
' Si no se encontró el comando, crea un mensaje de error claro.
@@ -117,7 +98,7 @@ Sub Handle(req As ServletRequest, resp As ServletResponse)
' Detiene la ejecución del método Handle para esta petición.
Return
End If
' <<< FIN NUEVA VALIDACIÓN >>>
' <<< FIN VALIDACIÓN >>>
' Comprueba el tipo de ejecución solicitado ("executeQuery" o "executeCommand").
If execType.ToLowerCase = "executequery" Then
@@ -125,15 +106,15 @@ Sub Handle(req As ServletRequest, resp As ServletResponse)
Dim rs As ResultSet
' Si el comando SQL contiene placeholders ('?'), significa que espera parámetros.
If sqlCommand.Contains("?") or orderedParams.Size > 0 Then
' Se usa 'paramsList' directamente en lugar de 'orderedParams'.
If sqlCommand.Contains("?") Or paramsList.Size > 0 Then
' =================================================================
' === VALIDACIÓN DE CONTEO DE PARÁMETROS ==========================
' =================================================================
' Calcula cuántos parámetros espera la consulta contando el número de '?'.
Dim expectedParams As Int = sqlCommand.Length - sqlCommand.Replace("?", "").Length
' Obtiene cuántos parámetros se recibieron.
Dim receivedParams As Int = orderedParams.Size
' Compara si la cantidad de parámetros esperados y recibidos es diferente.
' Obtiene cuántos parámetros se recibieron de la lista.
Dim receivedParams As Int = paramsList.Size
Log($"expectedParams: ${expectedParams}, receivedParams: ${receivedParams}"$)
@@ -146,8 +127,8 @@ Sub Handle(req As ServletRequest, resp As ServletResponse)
Return
End If
' =================================================================
' Ejecuta la consulta pasando el comando SQL y la lista ordenada de parámetros.
rs = con.ExecQuery2(sqlCommand, orderedParams)
' Ejecuta la consulta pasando el comando SQL y la lista de parámetros.
rs = con.ExecQuery2(sqlCommand, paramsList)
Else
' Si no hay '?', ejecuta la consulta directamente sin parámetros.
rs = con.ExecQuery(sqlCommand)
@@ -193,7 +174,7 @@ Sub Handle(req As ServletRequest, resp As ServletResponse)
' === VALIDACIÓN DE CONTEO DE PARÁMETROS (para Comandos) ==========
' =================================================================
Dim expectedParams As Int = sqlCommand.Length - sqlCommand.Replace("?", "").Length
Dim receivedParams As Int = orderedParams.Size
Dim receivedParams As Int = paramsList.Size
If expectedParams <> receivedParams Then
SendErrorResponse(resp, 400, $"Número de parametros equivocado para '${queryName}'. Se esperaban ${expectedParams} y se recibieron ${receivedParams}."$)
' Cierra la conexión antes de salir.
@@ -205,7 +186,7 @@ Sub Handle(req As ServletRequest, resp As ServletResponse)
End If
' Ejecuta el comando que no devuelve resultados (NonQuery) con sus parámetros.
con.ExecNonQuery2(sqlCommand, orderedParams)
con.ExecNonQuery2(sqlCommand, paramsList)
' Envía una respuesta de éxito con un mensaje de confirmación.
SendSuccessResponse(resp, CreateMap("message": "Command executed successfully"))
@@ -262,5 +243,3 @@ Private Sub SendErrorResponse(resp As ServletResponse, statusCode As Int, errorM
resp.ContentType = "application/json"
resp.Write(jsonGenerator.ToString)
End Sub