mirror of
https://github.com/KeymonSoft/jRDC-Multi.git
synced 2026-04-17 21:06:24 +00:00
- 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:
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user