const { dialog } = require('electron');
const mysql = require('mysql');
const file = require('../util-functions/file');
/**
* API de mysql
*@type {mysql.Connection|null}
*/
let mysqlAPI = null;
/** Clase de conexion a la base de datos */
class Database {
/**
* Retorna una instancia del objeto de conexion MYSQL
*/
get _mysqlAPI() {
return mysqlAPI;
}
/**
* @callback callbackInsert
* @param {string|mysql.MysqlError|null} error error al insertar en la BD.
*/
/**
* Inserta elemento en la base de datos
* @param {string} sql string SQL.
* @param {Object} data Objeto de consulta
* @param {callbackInsert} callback respuesta al insertar en la bd
*/
insert( sql, data, callback ) {
mysqlAPI.query( sql, data, callback );
}
/**
* Obtiene el total de registros en la BD.
* @param {string} sql string SQL.
* @param {Object} data Objeto de consulta
* @param {callbackConsult} callback respuesta al consultar en la bd
*/
getTotalRecords( sql, callback ) {
mysqlAPI.query( sql, callback );
}
/**
* @callback callbackConsult
* @param {string|Error|null} error error al insertar en la BD.
* @param {Array<Object>} results arreglo de objetos producto de la consulta
*/
/**
* Inserta elemento en la base de datos
* @param {string} sql string SQL.
* @param {Object|null} pagination paginacion de la tabla
* @param {number} pagination.start inicio de la paginacion
* @param {number} pagination.limit final de la paginacion
* @param {callbackConsult} callback respuesta al consultar en la bd
*/
consult( sql, paginacion, callback ) {
mysqlAPI.query( sql, paginacion, callback );
}
/**
* Busca registros en la BD.
* @param {string} sql string SQL.
* @param {Object} data Objeto de consulta
* @param {callbackConsult} callback respuesta al consultar en la bd
*/
find( sql, data, callback ) {
mysqlAPI.query( sql, data, callback );
}
/**
* @callback callbackUpdate
* @param {string|Error|null} error error al insertar en la BD.
*/
/**
* Busca registros en la BD.
* @param {string} sql string SQL.
* @param {Object} data Objeto de consulta
* @param {callbackUpdate} callback respuesta al momento de actualizar
*/
update( sql, data, callback ) {
mysqlAPI.query( sql, data, callback );
}
/**
* @callback callbackDelete
* @param {string|Error|null} error error al insertar en la BD.
*/
/**
* Busca registros en la BD.
* @param {string} sql string SQL.
* @param {Object} data Objeto de consulta
* @param {callbackDelete} callback respuesta al momento de eliminar registro
*/
delete( sql, data, callback ) {
mysqlAPI.query( sql, data, callback );
}
/** * Cierra la conexion a la BD */
static closeConnection() {
if ( !mysqlAPI ) {
return;
}
mysqlAPI.end(( error ) => {
if ( error ) {
throw error;
}
console.log('Conexion cerrada exitosamente');
});
}
/**
* Pasea el formato string a un SQL valido para la base de datos
* @param {string} query consulta SQL
* @param {Object} values objeto de consulta
* @returns {string} retorna la consulta valida.
*/
static sqlParse( query, values ) {
if ( !values ) {
return query;
}
return query.replace( /\:(\w+)/g, ( function( text, result ) {
/*
El devuelve el sql transformado
recibe 2 parametros
1.- texto, que es la cadena a transformar
2.- es el resultado de la búsqueda
según la documentación de replace debe devolver un string
*/
if ( values.hasOwnProperty( result ) ){
return this.escape( values[result] );
}
return text;
}).bind( this ));
}
/** Se conecta a la base de datos */
static connect() {
let user = null
try {
let data = file.readFile('/users-productos-app.json');
let arregloConexion = JSON.parse( data );
let key = 'root_2';
if ( !arregloConexion.hasOwnProperty( key ) ) {
throw {
title: 'Error !!',
message: 'Verificar si el usuario de conexión existe en el servicio de Base de Datos'
};
}
user = arregloConexion[ key ];
} catch ( error ) {
dialog.showErrorBox( error.title, error.message );
console.log( error );
return;
}
mysqlAPI = mysql.createConnection({
host: user['host'],
user: user['username'],
password: user['password'],
database: user['database'],
port: user['port'],
multipleStatements: true // permite la ejecucion de multiples query en una sola instruccion SQL
});
mysqlAPI.config.queryFormat = Database.sqlParse;
mysqlAPI.connect(( error ) => {
if ( error ) {
dialog.showErrorBox('Conexion Base de Datos', 'Error al conectar, verificar si los parametros de conexión son correctos');
console.log( error );
return;
};
console.log('Base de datos en linea!!');
});
}
}
module.exports = {
Database
};