minervajs-helmet 1.0.11 → 1.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +213 -46
- package/js/db_mysql.js +103 -16
- package/package.json +5 -3
- package/src/db.js +162 -74
- package/js/OLD db.js +0 -76
- /package/{config → example}/settings.js +0 -0
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
BSD 2-Clause License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2024, Alexander
|
|
3
|
+
Copyright (c) 2024, 2025, Alexander Enrique Escobar O.
|
|
4
4
|
|
|
5
5
|
Redistribution and use in source and binary forms, with or without
|
|
6
6
|
modification, are permitted provided that the following conditions are met:
|
package/README.md
CHANGED
|
@@ -1,64 +1,231 @@
|
|
|
1
1
|
# MinervaJS-Helmet
|
|
2
|
-
Modulo para la gestion de las conección a la base de datos, permite conectarse a varios tipos utilizando sobrecarga de metodos, tolera MySQL y Oracle Client
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
`$ npm i minervajs-helmet `
|
|
3
|
+
## 🛡️ Descripción
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
**MinervaJS-Helmet** es el módulo encargado de la **gestión unificada de conexiones y operaciones de base de datos** dentro del ecosistema **MinervaJS**.
|
|
6
|
+
|
|
7
|
+
Su función principal es abstraer el motor de base de datos (MySQL, PostgreSQL, Oracle, etc.) y exponer una **API homogénea**, permitiendo que el resto del sistema funcione de forma **JSON-driven**, desacoplada y extensible.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 🎯 Objetivos
|
|
12
|
+
|
|
13
|
+
* Centralizar la gestión de conexiones a bases de datos
|
|
14
|
+
* Soportar múltiples motores de forma transparente
|
|
15
|
+
* Proveer una API común para:
|
|
16
|
+
|
|
17
|
+
* Consultas de lectura (SELECT)
|
|
18
|
+
* Operaciones de escritura (INSERT / UPDATE / DELETE / DDL)
|
|
19
|
+
* Procedimientos almacenados
|
|
20
|
+
* Facilitar la construcción de backends genéricos y dinámicos
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 🧱 Arquitectura
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
MinervaJS
|
|
28
|
+
└── Helmet
|
|
29
|
+
├── db_mysql.js
|
|
30
|
+
├── db_postgres.js
|
|
31
|
+
├── db_oracle.js
|
|
32
|
+
└── connections (cache interno)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Helmet actúa como un **dispatcher**, delegando la ejecución a proveedores específicos que implementan un contrato estándar.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 🔌 Contrato estándar de proveedores
|
|
40
|
+
|
|
41
|
+
Cada proveedor de base de datos debe implementar las siguientes funciones:
|
|
42
|
+
|
|
43
|
+
```js
|
|
44
|
+
connect(config)
|
|
45
|
+
query(connection, sql, params = [])
|
|
46
|
+
execute(connection, sql, params = [])
|
|
47
|
+
call(connection, procedureName, params = {})
|
|
48
|
+
close(connection)
|
|
49
|
+
closeAll(config)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Este contrato garantiza que Helmet pueda operar sin conocer los detalles del motor subyacente.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 📦 Instalación
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npm install minervajs-helmet
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
> *(o incluir el módulo directamente dentro del proyecto MinervaJS)*
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## ⚙️ Configuración de base de datos
|
|
67
|
+
|
|
68
|
+
Ejemplo de archivo `database.json`:
|
|
69
|
+
|
|
70
|
+
```json
|
|
10
71
|
{
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
database: 'sql3772729' // 'nombre_db'
|
|
72
|
+
"mysqlMain": {
|
|
73
|
+
"type": "mysql",
|
|
74
|
+
"host": "localhost",
|
|
75
|
+
"port": 3306,
|
|
76
|
+
"user": "user",
|
|
77
|
+
"password": "password",
|
|
78
|
+
"database": "minerva"
|
|
19
79
|
}
|
|
20
80
|
}
|
|
21
81
|
```
|
|
22
82
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
async function main() {
|
|
30
|
-
try {
|
|
31
|
-
// Conexión a MySQL
|
|
32
|
-
const mysqlConnection = await db.connect('my_mysql', config);
|
|
33
|
-
const mysqlResult = await db.query('my_mysql', ' SELECT * FROM test ;', [], config); // Ejemplo con parámetros
|
|
34
|
-
console.log('Resultados de MySQL:', mysqlResult);
|
|
35
|
-
await db.close('my_mysql', config);
|
|
36
|
-
} catch (error) {
|
|
37
|
-
console.error('Error:', error);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
83
|
+
En la instalacion, puedes hacer uso del archivo muestra que esta en *\node_modules\minervajs-helmet\example\settings.js*
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 🚀 Uso básico
|
|
40
88
|
|
|
41
|
-
|
|
89
|
+
```js
|
|
90
|
+
const helmet = require('./helmet');
|
|
91
|
+
const config = require('./database.json');
|
|
42
92
|
```
|
|
43
93
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
### 🔍 Consultas de lectura (SELECT)
|
|
97
|
+
|
|
98
|
+
```js
|
|
99
|
+
const rows = await helmet.query(
|
|
100
|
+
'mysqlMain',
|
|
101
|
+
'SELECT * FROM pais WHERE iso3 = ?',
|
|
102
|
+
['SLV'],
|
|
103
|
+
config
|
|
104
|
+
);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### ✏️ Operaciones de escritura
|
|
110
|
+
|
|
111
|
+
```js
|
|
112
|
+
const result = await helmet.execute(
|
|
113
|
+
'mysqlMain',
|
|
114
|
+
'UPDATE pais SET nombre = ? WHERE iso3 = ?',
|
|
115
|
+
['El Salvador', 'SLV'],
|
|
116
|
+
config
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
console.log(result.rowsAffected);
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
### 🧠 Procedimientos almacenados
|
|
125
|
+
|
|
126
|
+
```js
|
|
127
|
+
const result = await helmet.call(
|
|
128
|
+
'mysqlMain',
|
|
129
|
+
'sp_pais_insert',
|
|
47
130
|
{
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
131
|
+
p_iso3: 'SLV',
|
|
132
|
+
p_nombre: 'El Salvador',
|
|
133
|
+
p_leyenda: 'Centroamérica',
|
|
134
|
+
p_iso2: 'SV',
|
|
135
|
+
p_existe: { out: true }
|
|
52
136
|
},
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
137
|
+
config
|
|
138
|
+
);
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Resultado estándar:**
|
|
142
|
+
|
|
143
|
+
```js
|
|
144
|
+
{
|
|
145
|
+
resultSets: [...],
|
|
146
|
+
out: {
|
|
147
|
+
p_existe: 0
|
|
58
148
|
}
|
|
59
|
-
|
|
149
|
+
}
|
|
60
150
|
```
|
|
61
151
|
|
|
62
|
-
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 🔐 Gestión de conexiones
|
|
155
|
+
|
|
156
|
+
* Una conexión por perfil de base de datos
|
|
157
|
+
* Reutilización automática
|
|
158
|
+
* Cache interno
|
|
159
|
+
* Cierre explícito
|
|
160
|
+
|
|
161
|
+
```js
|
|
162
|
+
await helmet.close('mysqlMain', config);
|
|
163
|
+
await helmet.closeAll(config);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## ⚠️ Manejo de errores
|
|
169
|
+
|
|
170
|
+
Helmet agrega contexto a los errores:
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
[Helmet][mysql][execute] Duplicate entry
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Esto facilita el logging y el diagnóstico.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## 🧩 Integración JSON-driven (MinervaJS)
|
|
181
|
+
|
|
182
|
+
Helmet está diseñado para ejecutarse a partir de manifiestos JSON:
|
|
183
|
+
|
|
184
|
+
```json
|
|
185
|
+
{
|
|
186
|
+
"database": "mysqlMain",
|
|
187
|
+
"procedure": "sp_pais_insert",
|
|
188
|
+
"params": {
|
|
189
|
+
"p_iso3": "$body.iso3",
|
|
190
|
+
"p_nombre": "$body.nombre",
|
|
191
|
+
"p_existe": { "out": true }
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
La API ejecuta la operación sin conocer SQL ni lógica de negocio.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## ✅ Buenas prácticas
|
|
201
|
+
|
|
202
|
+
* Usar `query()` exclusivamente para SELECT
|
|
203
|
+
* Usar `execute()` para DML / DDL
|
|
204
|
+
* Encapsular lógica compleja en Stored Procedures
|
|
205
|
+
* Cerrar conexiones en shutdown de la aplicación
|
|
206
|
+
* Mantener la configuración desacoplada
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 🔮 Evolución futura
|
|
212
|
+
|
|
213
|
+
* Pooling de conexiones
|
|
214
|
+
* Transacciones (`begin / commit / rollback`)
|
|
215
|
+
* Multi-tenant
|
|
216
|
+
* Logging estructurado
|
|
217
|
+
* Métricas
|
|
218
|
+
* Soporte para nuevos motores
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 📌 Conclusión
|
|
223
|
+
|
|
224
|
+
**MinervaJS-Helmet** es el pilar de acceso a datos de MinervaJS.
|
|
225
|
+
|
|
226
|
+
Su diseño modular, homogéneo y desacoplado permite construir aplicaciones dinámicas, escalables y mantenibles, donde la lógica de negocio puede definirse de forma declarativa y evolucionar sin reescribir el backend.
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
63
230
|
|
|
64
231
|
|
package/js/db_mysql.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module js/mysql
|
|
3
3
|
* @name Provider DB js/mysql
|
|
4
|
-
* @description Módulo
|
|
4
|
+
* @description Módulo proveedor MySQL para MinervaJS-Helmet.
|
|
5
|
+
* Implementa operaciones estándar: query, execute y call.
|
|
6
|
+
*
|
|
5
7
|
*/
|
|
6
8
|
|
|
7
9
|
/**
|
|
@@ -19,8 +21,10 @@ const mysql = require('mysql2/promise'); // Usamos mysql2/promise para async/awa
|
|
|
19
21
|
* @param {object} config - Configuración de la conexión.
|
|
20
22
|
* @returns {Promise<mysql.Connection>} Objeto de conexión de MySQL.
|
|
21
23
|
*/
|
|
22
|
-
async function connect(config)
|
|
23
|
-
|
|
24
|
+
async function connect(config)
|
|
25
|
+
{
|
|
26
|
+
try
|
|
27
|
+
{
|
|
24
28
|
const connection = await mysql.createConnection({
|
|
25
29
|
host: config.host,
|
|
26
30
|
port: config.port,
|
|
@@ -29,8 +33,10 @@ async function connect(config) {
|
|
|
29
33
|
database: config.database,
|
|
30
34
|
});
|
|
31
35
|
return connection;
|
|
32
|
-
}
|
|
33
|
-
|
|
36
|
+
}
|
|
37
|
+
catch (error)
|
|
38
|
+
{
|
|
39
|
+
console.error('[MySQL][connect]', error.message);
|
|
34
40
|
throw error; // Re-lanzamos el error para que sea manejado por el llamador
|
|
35
41
|
}
|
|
36
42
|
}
|
|
@@ -42,19 +48,91 @@ async function connect(config) {
|
|
|
42
48
|
* @function query
|
|
43
49
|
* @param {mysql.Connection} connection - Objeto de conexión de MySQL.
|
|
44
50
|
* @param {string} sql - Consulta SQL.
|
|
45
|
-
* @param {Array} [
|
|
51
|
+
* @param {Array} [params] - Parámetros para la consulta.
|
|
46
52
|
* @returns {Promise<Array>} Filas resultantes de la consulta.
|
|
47
53
|
*/
|
|
48
|
-
async function query(connection, sql,
|
|
49
|
-
|
|
50
|
-
|
|
54
|
+
async function query(connection, sql, params = [])
|
|
55
|
+
{
|
|
56
|
+
try
|
|
57
|
+
{
|
|
58
|
+
const [rows, fields] = await connection.execute(sql, params);
|
|
51
59
|
return rows;
|
|
60
|
+
}
|
|
61
|
+
catch (error)
|
|
62
|
+
{
|
|
63
|
+
console.error('[MySQL][query]', error.message);
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Ejecuta una sentencia de escritura (INSERT, UPDATE, DELETE, DDL).
|
|
72
|
+
*/
|
|
73
|
+
async function execute(connection, sql, params = [])
|
|
74
|
+
{
|
|
75
|
+
try {
|
|
76
|
+
const [result] = await connection.execute(sql, params);
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
rowsAffected: result.affectedRows,
|
|
80
|
+
insertId: result.insertId || null
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch (error)
|
|
84
|
+
{
|
|
85
|
+
console.error('[MySQL][execute]', error.message);
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Ejecuta un procedimiento almacenado.
|
|
93
|
+
*
|
|
94
|
+
* Nota:
|
|
95
|
+
* MySQL maneja OUT params mediante variables de sesión (@var).
|
|
96
|
+
*/
|
|
97
|
+
async function call(connection, procedureName, params = {}) {
|
|
98
|
+
try {
|
|
99
|
+
const keys = Object.keys(params);
|
|
100
|
+
const values = [];
|
|
101
|
+
|
|
102
|
+
const placeholders = keys.map(key => {
|
|
103
|
+
if (params[key]?.out) {
|
|
104
|
+
return `@${key}`;
|
|
105
|
+
}
|
|
106
|
+
values.push(params[key]);
|
|
107
|
+
return '?';
|
|
108
|
+
}).join(',');
|
|
109
|
+
|
|
110
|
+
// 1️ - Ejecutar CALL
|
|
111
|
+
const callSQL = `CALL ${procedureName}(${placeholders})`;
|
|
112
|
+
const [resultSets] = await connection.query(callSQL, values);
|
|
113
|
+
|
|
114
|
+
// 2️ - Recuperar OUT params
|
|
115
|
+
const outParams = keys.filter(k => params[k]?.out);
|
|
116
|
+
let out = {};
|
|
117
|
+
|
|
118
|
+
if (outParams.length > 0) {
|
|
119
|
+
const selectOut = `SELECT ${outParams.map(k => `@${k} AS ${k}`).join(',')}`;
|
|
120
|
+
const [rows] = await connection.query(selectOut);
|
|
121
|
+
out = rows[0];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
resultSets,
|
|
126
|
+
out
|
|
127
|
+
};
|
|
52
128
|
} catch (error) {
|
|
53
|
-
console.error('
|
|
129
|
+
console.error('[MySQL][call]', error.message);
|
|
54
130
|
throw error;
|
|
55
131
|
}
|
|
56
132
|
}
|
|
57
133
|
|
|
134
|
+
|
|
135
|
+
|
|
58
136
|
/**
|
|
59
137
|
* Cierra la conexión a la base de datos MySQL.
|
|
60
138
|
*
|
|
@@ -63,13 +141,22 @@ async function query(connection, sql, values = []) {
|
|
|
63
141
|
* @param {mysql.Connection} connection - Objeto de conexión de MySQL.
|
|
64
142
|
* @returns {Promise<void>}
|
|
65
143
|
*/
|
|
66
|
-
async function close(connection)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
144
|
+
async function close(connection)
|
|
145
|
+
{
|
|
146
|
+
try
|
|
147
|
+
{ await connection.end(); }
|
|
148
|
+
catch (error)
|
|
149
|
+
{
|
|
150
|
+
console.error('[MySQL][close]', error.message);
|
|
71
151
|
throw error;
|
|
72
152
|
}
|
|
73
153
|
}
|
|
74
154
|
|
|
75
|
-
module.exports =
|
|
155
|
+
module.exports =
|
|
156
|
+
{
|
|
157
|
+
connect,
|
|
158
|
+
query,
|
|
159
|
+
execute,
|
|
160
|
+
call,
|
|
161
|
+
close
|
|
162
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "minervajs-helmet",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.15",
|
|
4
4
|
"main": "src/db.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
@@ -10,10 +10,12 @@
|
|
|
10
10
|
"Multi DataBase",
|
|
11
11
|
"connect",
|
|
12
12
|
"MySQL",
|
|
13
|
-
"Oracle Client"
|
|
13
|
+
"Oracle Client",
|
|
14
|
+
"PostGres",
|
|
15
|
+
"MinervaJS"
|
|
14
16
|
],
|
|
15
17
|
"author": "alexander.enrique.escobar@gmail.com",
|
|
16
|
-
"license": "
|
|
18
|
+
"license": "BSD-2-Clause",
|
|
17
19
|
"description": "Modulo para la gestion de coneccion a la base de datos, de diferentes tipos mediante el uso de sobre Carga y Herencia de clases",
|
|
18
20
|
"dependencies": {
|
|
19
21
|
"mysql2": "^3.14.0",
|
package/src/db.js
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
*
|
|
3
3
|
* @name MinervaJS-Helmet
|
|
4
4
|
* @module MinervaJS-Helmet
|
|
5
|
-
* @description
|
|
6
|
-
*
|
|
5
|
+
* @description Gestor unificado de conexiones y ejecución de operaciones en múltiples motores de bases de datos.
|
|
7
6
|
*/
|
|
8
7
|
|
|
9
8
|
const postgres = require('../js/db_postgres');
|
|
@@ -27,41 +26,71 @@ const connections = {};
|
|
|
27
26
|
*/
|
|
28
27
|
async function connect(databaseName, config)
|
|
29
28
|
{
|
|
29
|
+
const dbConfig = config[databaseName];
|
|
30
|
+
|
|
31
|
+
if (!dbConfig)
|
|
32
|
+
{ throw new Error(`Configuración de base de datos '${databaseName}' no encontrada.`); }
|
|
33
|
+
|
|
34
|
+
// Ya existe una conexión
|
|
35
|
+
if (connections[databaseName])
|
|
36
|
+
{ return connections[databaseName]; }
|
|
37
|
+
|
|
38
|
+
switch (dbConfig.type)
|
|
39
|
+
{
|
|
40
|
+
case 'postgres':
|
|
41
|
+
connections[databaseName] = await postgres.connect(dbConfig);
|
|
42
|
+
break;
|
|
43
|
+
case 'mysql':
|
|
44
|
+
connections[databaseName] = await mysql.connect(dbConfig);
|
|
45
|
+
break;
|
|
46
|
+
// case 'mariadb':
|
|
47
|
+
// connections[databaseName] = await mariadb.connect(dbConfig);
|
|
48
|
+
// break;
|
|
49
|
+
case 'oracle':
|
|
50
|
+
connections[databaseName] = await oracle.connect(dbConfig);
|
|
51
|
+
break;
|
|
52
|
+
// case 'mongodb':
|
|
53
|
+
// connections[databaseName] = await mongodb.connect(dbConfig);
|
|
54
|
+
// break;
|
|
55
|
+
default:
|
|
56
|
+
throw new Error(`Tipo de base de datos '${dbConfig.type}' no soportado.`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return connections[databaseName];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Dispatcher interno para query / execute / call
|
|
65
|
+
*/
|
|
66
|
+
async function run(databaseName, target, params, config, mode)
|
|
67
|
+
{
|
|
68
|
+
const connection = await connect(databaseName, config);
|
|
30
69
|
const dbConfig = config[databaseName];
|
|
31
|
-
|
|
32
|
-
if (!dbConfig) {
|
|
33
|
-
throw new Error(`Configuración de base de datos '${databaseName}' no encontrada.`);
|
|
34
|
-
}
|
|
35
70
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
71
|
+
try {
|
|
72
|
+
switch (dbConfig.type) {
|
|
73
|
+
case 'postgres':
|
|
74
|
+
return await postgres[mode](connection, target, params);
|
|
75
|
+
|
|
76
|
+
case 'mysql':
|
|
77
|
+
return await mysql[mode](connection, target, params);
|
|
78
|
+
|
|
79
|
+
case 'oracle':
|
|
80
|
+
return await oracle[mode](connection, target, params);
|
|
40
81
|
|
|
41
|
-
|
|
82
|
+
default:
|
|
83
|
+
throw new Error(`Tipo de base de datos '${dbConfig.type}' no soportado.`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (err)
|
|
42
87
|
{
|
|
43
|
-
|
|
44
|
-
connections[databaseName] = await postgres.connect(dbConfig);
|
|
45
|
-
break;
|
|
46
|
-
case 'mysql':
|
|
47
|
-
connections[databaseName] = await mysql.connect(dbConfig);
|
|
48
|
-
break;
|
|
49
|
-
// case 'mariadb':
|
|
50
|
-
// connections[databaseName] = await mariadb.connect(dbConfig);
|
|
51
|
-
// break;
|
|
52
|
-
case 'oracle':
|
|
53
|
-
connections[databaseName] = await oracle.connect(dbConfig);
|
|
54
|
-
break;
|
|
55
|
-
// case 'mongodb':
|
|
56
|
-
// connections[databaseName] = await mongodb.connect(dbConfig);
|
|
57
|
-
// break;
|
|
58
|
-
default:
|
|
59
|
-
throw new Error(`Tipo de base de datos '${dbConfig.type}' no soportado.`);
|
|
88
|
+
throw new Error(`[Helmet][${dbConfig.type}][${mode}] ${err.message}`);
|
|
60
89
|
}
|
|
61
|
-
|
|
62
|
-
return connections[databaseName];
|
|
63
90
|
}
|
|
64
91
|
|
|
92
|
+
|
|
93
|
+
|
|
65
94
|
/**
|
|
66
95
|
* Ejecuta una consulta en la base de datos especificada.
|
|
67
96
|
*
|
|
@@ -75,29 +104,54 @@ async function connect(databaseName, config)
|
|
|
75
104
|
* @throws {Error} Si el tipo de base de datos no es soportado para la operación 'query'.
|
|
76
105
|
* @description Ejecuta una sentencia SQL en la base de datos especificada y devuelve un objeto en un set de datos
|
|
77
106
|
*/
|
|
78
|
-
async function query(databaseName, sql, values = [], config)
|
|
107
|
+
// async function query(databaseName, sql, values = [], config)
|
|
108
|
+
// {
|
|
109
|
+
// const connection = await connect(databaseName, config);
|
|
110
|
+
// const dbConfig = config[databaseName];
|
|
111
|
+
|
|
112
|
+
// switch (dbConfig.type)
|
|
113
|
+
// {
|
|
114
|
+
// case 'postgres':
|
|
115
|
+
// return postgres.query(connection, sql);
|
|
116
|
+
// case 'mysql':
|
|
117
|
+
// return mysql.query(connection, sql, values);
|
|
118
|
+
// // case 'mariadb': // agregamos el caso MariaDB
|
|
119
|
+
// // return mariadb.query(connection, sql, binds);
|
|
120
|
+
// // break;
|
|
121
|
+
// case 'oracle':
|
|
122
|
+
// return oracle.query(connection, sql);
|
|
123
|
+
// // case 'mongodb':
|
|
124
|
+
// // // Adaptar la consulta SQL a la sintaxis de MongoDB
|
|
125
|
+
// // console.warn("La función 'query' no es directamente aplicable a MongoDB con sintaxis SQL.");
|
|
126
|
+
// // return null; // O lanzar un error
|
|
127
|
+
// default:
|
|
128
|
+
// throw new Error(`Tipo de base de datos '${dbConfig.type}' no soportado para la operación 'query'.`);
|
|
129
|
+
// }
|
|
130
|
+
// }
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Ejecuta consultas de lectura (SELECT).
|
|
134
|
+
*/
|
|
135
|
+
async function query(databaseName, sql, params = [], config)
|
|
79
136
|
{
|
|
80
|
-
|
|
81
|
-
|
|
137
|
+
return run(databaseName, sql, params, config, 'query');
|
|
138
|
+
}
|
|
82
139
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
default:
|
|
99
|
-
throw new Error(`Tipo de base de datos '${dbConfig.type}' no soportado para la operación 'query'.`);
|
|
100
|
-
}
|
|
140
|
+
/**
|
|
141
|
+
* Ejecuta sentencias de escritura (INSERT, UPDATE, DELETE, DDL).
|
|
142
|
+
*/
|
|
143
|
+
async function execute(databaseName, sql, params = [], config)
|
|
144
|
+
{
|
|
145
|
+
return run(databaseName, sql, params, config, 'execute');
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Ejecuta procedimientos almacenados o funciones.
|
|
151
|
+
*/
|
|
152
|
+
async function call(databaseName, procedureName, params = {}, config)
|
|
153
|
+
{
|
|
154
|
+
return run(databaseName, procedureName, params, config, 'call');
|
|
101
155
|
}
|
|
102
156
|
|
|
103
157
|
/**
|
|
@@ -112,47 +166,81 @@ async function query(databaseName, sql, values = [], config)
|
|
|
112
166
|
*/
|
|
113
167
|
async function close(databaseName, config)
|
|
114
168
|
{
|
|
115
|
-
if (connections[databaseName])
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
delete connections[databaseName];
|
|
169
|
+
if (!connections[databaseName]) return;
|
|
170
|
+
|
|
171
|
+
const dbConfig = config[databaseName];
|
|
172
|
+
switch (dbConfig.type) {
|
|
173
|
+
case 'postgres':
|
|
174
|
+
await postgres.close(connections[databaseName]);
|
|
175
|
+
break;
|
|
176
|
+
case 'mysql':
|
|
177
|
+
await mysql.close(connections[databaseName]);
|
|
178
|
+
break;
|
|
179
|
+
// case 'mariadb': // agregamos el caso MariaDB
|
|
180
|
+
// await mariadb.close(connections[databaseName]);
|
|
181
|
+
// break;
|
|
182
|
+
case 'oracle':
|
|
183
|
+
await oracle.close(connections[databaseName]);
|
|
184
|
+
break;
|
|
185
|
+
// case 'mongodb':
|
|
186
|
+
// await mongodb.close(connections[databaseName]);
|
|
187
|
+
// break;
|
|
136
188
|
}
|
|
189
|
+
delete connections[databaseName];
|
|
190
|
+
|
|
137
191
|
}
|
|
138
192
|
|
|
139
193
|
|
|
140
194
|
|
|
141
195
|
/**
|
|
142
196
|
* @function
|
|
143
|
-
* @name
|
|
197
|
+
* @name execute
|
|
144
198
|
* @param {string} sql - Sentencia SQL a ejecutar
|
|
145
199
|
* @param {Promise<callback>} callback - objeto, para retornar la promesa
|
|
146
200
|
* @returns {result} result/err - Devuelve un objeto con el set de datos o un objeto err con la respuesta del error
|
|
147
201
|
* @description Ejecuta una sentencia SQL y devuelve un objeto en un set de datos
|
|
148
202
|
*/
|
|
203
|
+
// async function execute(databaseName, sql, values = [], config)
|
|
204
|
+
// {
|
|
205
|
+
// const connection = await connect(databaseName, config);
|
|
206
|
+
// const dbConfig = config[databaseName];
|
|
207
|
+
|
|
208
|
+
// switch (dbConfig.type)
|
|
209
|
+
// {
|
|
210
|
+
// case 'postgres':
|
|
211
|
+
// return postgres.query(connection, sql);
|
|
212
|
+
// case 'mysql':
|
|
213
|
+
// return mysql.query(connection, sql, values);
|
|
214
|
+
// // case 'mariadb': // agregamos el caso MariaDB
|
|
215
|
+
// // return mariadb.query(connection, sql, binds);
|
|
216
|
+
// // break;
|
|
217
|
+
// case 'oracle':
|
|
218
|
+
// return oracle.query(connection, sql);
|
|
219
|
+
// // case 'mongodb':
|
|
220
|
+
// // // Adaptar la consulta SQL a la sintaxis de MongoDB
|
|
221
|
+
// // console.warn("La función 'query' no es directamente aplicable a MongoDB con sintaxis SQL.");
|
|
222
|
+
// // return null; // O lanzar un error
|
|
223
|
+
// default:
|
|
224
|
+
// throw new Error(`Tipo de base de datos '${dbConfig.type}' no soportado para la operación 'query'.`);
|
|
225
|
+
// }
|
|
226
|
+
// }
|
|
149
227
|
|
|
150
|
-
|
|
228
|
+
/**
|
|
229
|
+
* Cierra todas las conexiones activas.
|
|
230
|
+
*/
|
|
231
|
+
async function closeAll(config)
|
|
232
|
+
{
|
|
233
|
+
for (const dbName of Object.keys(connections))
|
|
234
|
+
{ await close(dbName, config); }
|
|
235
|
+
}
|
|
151
236
|
|
|
152
237
|
module.exports =
|
|
153
238
|
{
|
|
154
239
|
connect,
|
|
155
240
|
query,
|
|
241
|
+
execute,
|
|
242
|
+
call,
|
|
156
243
|
close,
|
|
244
|
+
closeAll
|
|
157
245
|
// ... otras funciones comunes
|
|
158
246
|
};
|
package/js/OLD db.js
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module
|
|
3
|
-
* @name db_mysql
|
|
4
|
-
* @description Modulo gestor de la coneccion a la base de datos, MySQL, utiliza el cliente mysql2
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
var mysql = require('mysql');
|
|
8
|
-
var settings = require('../settings');
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @function
|
|
12
|
-
* @name executeSQL
|
|
13
|
-
* @param {string} sql - Sentencia SQL a ejecutar
|
|
14
|
-
* @param {Promise<callback>} callback - objeto, para retornar la promesa
|
|
15
|
-
* @returns {result} result/err - Devuelve un objeto con el set de datos o un objeto err con la respuesta del error
|
|
16
|
-
* @description Ejecuta una sentencia SQL y devuelve un objeto en un set de datos
|
|
17
|
-
*/
|
|
18
|
-
exports.executeSQL = function (sql, callback)
|
|
19
|
-
{
|
|
20
|
-
var con = new mysql.createConnection(settings.dbConfig);
|
|
21
|
-
|
|
22
|
-
con.connect(function(err)
|
|
23
|
-
{
|
|
24
|
-
if (err)
|
|
25
|
-
{
|
|
26
|
-
callback(null, err);
|
|
27
|
-
//throw err;
|
|
28
|
-
}
|
|
29
|
-
if (settings.servConfig.debug){console.log("Connected!");}
|
|
30
|
-
con.query(sql, function (err, result) {
|
|
31
|
-
if (err)
|
|
32
|
-
{
|
|
33
|
-
callback(null, err);
|
|
34
|
-
//throw err;
|
|
35
|
-
}
|
|
36
|
-
if (settings.servConfig.debug){console.log("Sentencia Ejecutada:"+sql);}
|
|
37
|
-
callback(result);
|
|
38
|
-
|
|
39
|
-
con.end();
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* @function
|
|
46
|
-
* @name executeSQLarray
|
|
47
|
-
* @param {string} sql - Sentencia SQL a ejecutar
|
|
48
|
-
* @param {Promise<callback>} callback - objeto, para retornar la promesa
|
|
49
|
-
* @returns {result} result/err - Devuelve un objeto con el set de datos o un objeto err con la respuesta del error
|
|
50
|
-
* @description Ejecuta una sentencia SQL, basado en una serie de argumentos y devuelve un objeto en un set de datos
|
|
51
|
-
*/
|
|
52
|
-
exports.executeSQLarray = function (sql, array, callback)
|
|
53
|
-
{
|
|
54
|
-
var con = new mysql.createConnection(settings.dbConfig);
|
|
55
|
-
|
|
56
|
-
con.connect(function(err)
|
|
57
|
-
{
|
|
58
|
-
if (err)
|
|
59
|
-
{
|
|
60
|
-
callback(null, err);
|
|
61
|
-
//throw err;
|
|
62
|
-
}
|
|
63
|
-
if (settings.servConfig.debug){console.log("Connected!");}
|
|
64
|
-
con.query(sql, array, function (err, result) {
|
|
65
|
-
if (err)
|
|
66
|
-
{
|
|
67
|
-
callback(null, err);
|
|
68
|
-
//throw err;
|
|
69
|
-
}
|
|
70
|
-
if (settings.servConfig.debug){console.log("Sentencia Ejecutada:"+sql);}
|
|
71
|
-
callback(result);
|
|
72
|
-
|
|
73
|
-
con.end();
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
}
|
|
File without changes
|