const mysql = require('mysql'); const databaseConfig = require('../config/databaseConfig'); const utils = require('./utils'); const connection = mysql.createConnection({ host: databaseConfig.database_host, user: databaseConfig.database_user, password: databaseConfig.database_password, database: databaseConfig.database_database }); const nodesTable = `${databaseConfig.database_database}.nodes`; connection.connect() /** Get all nodes the server knows about regardless of status * @param {*} callback Callback function */ exports.getAllNodes = (callback) => { const sqlQuery = `SELECT * FROM ${nodesTable}` runSQL(sqlQuery, (rows) => { return callback(rows); }) } /** Get all nodes that have the online status set true (are online) * @param callback Callback function */ exports.getOnlineNodes = (callback) => { const sqlQuery = `SELECT * FROM ${nodesTable} WHERE online = 1;` runSQL(sqlQuery, (rows) => { return callback(rows); }) } /** Get info on a node based on ID * @param nodeId The ID of the node * @param callback Callback function */ exports.getNodeInfoFromId = (nodeId, callback) => { const sqlQuery = `SELECT * FROM ${nodesTable} WHERE id = ${nodeId}` runSQL(sqlQuery, (rows) => { // Call back the first (and theoretically only) row // Specify 0 so downstream functions don't have to worry about it return callback(rows[0]); }) } /** Add a new node to the DB * @param nodeObject Node information object * @param callback Callback function */ exports.addNewNode = (nodeObject, callback) => { if (!nodeObject.name) throw new Error("No name provided"); const name = nodeObject.name, ip = nodeObject.ip, port = nodeObject.port, location = nodeObject.location, nearbySystems = utils.JsonToBuffer(nodeObject.nearbySystems), online = nodeObject.online; const sqlQuery = `INSERT INTO ${nodesTable} (name, ip, port, location, nearbySystems, online) VALUES ('${name}', '${ip}', ${port}, '${location}', '${nearbySystems}', ${online})`; runSQL(sqlQuery, (rows) => { return callback(rows); }) } /** Update the known info on a node * @param nodeObject Node information object * @param callback Callback function */ exports.updateNodeInfo = (nodeObject, callback) => { const name = nodeObject.name, ip = nodeObject.ip, port = nodeObject.port, location = nodeObject.location, online = nodeObject.online; let queryParams = [], nearbySystems = nodeObject.nearbySystems; if (name) queryParams.push(`name = '${name}'`); if (ip) queryParams.push(`ip = '${ip}'`); if (port) queryParams.push(`port = ${port}`); if (location) queryParams.push(`location = '${location}'`); if (nearbySystems) { nearbySystems = utils.JsonToBuffer(nearbySystems) queryParams.push(`nearbySystems = '${nearbySystems}'`); } if (typeof online === "boolean") { if (online) queryParams.push(`online = 1`); else queryParams.push(`online = 0`); } let sqlQuery = `UPDATE ${nodesTable} SET` if (!queryParams || queryParams.length === 0) return callback(undefined); if (queryParams.length === 1) { sqlQuery = `${sqlQuery} ${queryParams[0]}` } else { let i = 0; for (const param of queryParams) { if (i === queryParams.length-1) { sqlQuery = `${sqlQuery} ${param}` i += 1; } else { sqlQuery = `${sqlQuery} ${param},` i += 1; } } } sqlQuery = `${sqlQuery} WHERE id = ${nodeObject.id};` runSQL(sqlQuery, (rows) => { if (rows.affectedRows === 1) return callback(true); else return callback(rows); }) } // Function to run and handle SQL errors function runSQL(sqlQuery, callback, error = (err) => { console.log(err); throw err; }) { connection.query(sqlQuery, (err, rows) => { if (err) return error(err); //console.log('The rows are:', rows); return callback(rows); }) } exports.closeConnection = () => { connection.end() }