mgmt-iot-web
Version:
web platform to configure and interact with iot devices using mqtt
249 lines (208 loc) • 6.85 kB
JavaScript
var mysql = require('mysql2');
var config = require('../../config/env');
var httpStatus = require('http-status-codes');
var response = require('./response');
var pool;
var self = module.exports = {
connect : (config, cb)=>{
pool = mysql.createPool({
connectionLimit : config.db.conn_limit,
host : config.db.host,
port : config.db.port,
user : config.db.user,
password : config.db.pwd,
database : config.db.name,
debug : false
});
pool.getConnection(function(err,connection){
if(err) {
log.error("ISSUE WITH MYSQL \n" + err);
process.exit(1);
} else {
setInterval(function(){self.pingMySQL(connection);}, 3600000); // 1 hour
connection.on('error', function(err) {
log.error("Mysql error: "+err.code); // 'ER_BAD_DB_ERROR'
});
cb();
}
});
},
getConnection : (cb)=>{
pool.getConnection(function(err, connection) {
cb(err,connection);
});
},
pingMySQL : (connection)=>{
connection.ping(function (err) {
if (err) throw err;
log.debug(String(Date.now())+'Server responded to ping');
});
},
get_non_persistent_db_connection : (db_name,cb)=>{
let pool2 = mysql.createPool({
connectionLimit : config.db.conn_limit,
host : config.db.host,
user : config.db.user,
password : config.db.pwd,
database : db_name,
debug : false,
multipleStatements: true
});
pool2.getConnection(function(err,connection){
cb(err,connection);
});
},
close_db_connection : (connection)=>{
if(connection != null){
connection.destroy();
}
},
getLoad : (req,res,next)=>{
getLoad((err,rows)=>{
if(!err) response.send(res,rows);
else response.error(res,httpStatus.INTERNAL_SERVER_ERROR,err);
});
},
queryRow : async (query)=>{
return new Promise((resolve,reject) => {
self.getConnection((err,conn)=>{
if(err) return reject(err);
conn.query(query,function(err,rows){
self.close_db_connection(conn);
if(err) return reject(err)
else return resolve(rows);
});
});
});
},
insert : async(table, data) => {
return new Promise((resolve, reject) => {
self.getConnection((err, conn) => {
if (err) return reject(err);
let query = "";
let values = [];
if (typeof data === "object") {
const keys = Object.keys(data);
values = Object.values(data).map(v =>
(v !== null && typeof v === "object") ? JSON.stringify(v) : v
);
const placeholders = values.map(() => '?').join(', ');
query = `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders})`;
} else {
return reject("data passed is not an object");
}
query = mysql.format(query, values);
conn.query(query, function (err, rows) {
self.close_db_connection(conn);
if (err) return reject(err)
else return resolve(rows);
});
});
});
},
update : async (table, data, filter) => {
return new Promise((resolve, reject) => {
self.getConnection((err, conn) => {
if (err) return reject(err);
let query = "";
let values = [];
if (typeof data === "object") {
const keys = Object.keys(data);
values = Object.values(data);
query = `UPDATE ${table} SET ${keys.map(key => `\`${key}\` = ?`).join(', ')}`;
} else {
return reject("data passed is not an object");
}
if (typeof filter === "object") {
const filterKeys = Object.keys(filter);
const filterValues = Object.values(filter);
query += ` WHERE ${filterKeys.map(key => `${key} = ?`).join(' AND ')}`;
values.push(...filterValues);
} else {
return reject("filter passed is not an object");
}
query = mysql.format(query, values);
conn.query(query, function (err, rows) {
self.close_db_connection(conn);
if (err) return reject(err);
else return resolve(rows);
});
});
});
},
delete : async(table,filter)=>{
return new Promise((resolve,reject) => {
self.getConnection((err,conn)=>{
if(err) return reject(err);
let query = "";
if(typeof filter === "object"){
let values = [];
query = `DELETE FROM ${table} WHERE `;
for (let key in filter){
if(values.length > 0)
query += " AND ";
query += key + " = ?"
values.push(filter[key]);
}
query = mysql.format(query,values);
}else{
return reject("filter passed is not an object");
}
conn.query(query,function(err,rows){
self.close_db_connection(conn);
if(err) return reject(err)
else return resolve(rows);
});
});
});
},
tableExists : async(tableName)=>{
return new Promise((resolve,reject) => {
if(!tableName)
return reject('Table name not specified');
self.getConnection((err,conn)=>{
if(err) return reject(err);
let query = `
SELECT COUNT(*) as count
FROM information_schema.tables
WHERE table_name = ?
`;
const table = [tableName];
query = mysql.format(query,table);
conn.query(query,function(err,rows){
self.close_db_connection(conn);
if(err) return reject(err)
else{
if (rows?.length > 0){
return resolve(rows[0]?.count > 0);
}else{
return false;
}
}
});
});
});
},
}
function getLoad(cb){
self.getConnection((err,conn) => {
if(err) cb(err,null)
else{
/*
var query = `SELECT @@version,@@max_connections,@@sql_select_limit,@@performance_schema_events_transactions_history_size,@@innodb_io_capacity,@@innodb_io_capacity_max,@@innodb_buffer_pool_load_now,@@innodb_buffer_pool_load_at_startup,@@innodb_api_trx_level;`;
*/
var query = `SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME IN ('Bytes_sent', 'Bytes_received');`
var table = [];
query = mysql.format(query,table);
conn.query(query,function(err,rows){
self.close_db_connection(conn);
if(err) cb(err,null);
else if(rows.length > 0){
let sum = Number(rows[0].VARIABLE_VALUE) + Number(rows[1].VARIABLE_VALUE)
cb(null,sum);
}
else cb(null,null);
});
}
});
}