UNPKG

grunig-nodes

Version:

Grünig Nodes Library

265 lines (245 loc) 13.9 kB
module.exports = function(RED) { function G_StorageManager(config) { RED.nodes.createNode(this, config); var node = this; var mysql = require('mysql'); var mssql = require('mssql'); node.databaseConfig = RED.nodes.getNode(config.database); if (this.databaseConfig) { } else { // Keine Konfigurationsnode konfiguriert node.console.warn();("Keine Konfigurationsnode konfiguriert"); } // MySQL-Verbindungsinformationen var host = node.databaseConfig.host; var port = node.databaseConfig.port; var user = node.databaseConfig.user; var password = node.databaseConfig.password; var database = node.databaseConfig.database; var mssqlSelected = node.databaseConfig.mssql; node.status({fill:"red",shape:"ring",text:"disconnected"}); var connection; var connected = false; var sqlResult = null; var msgData = null; connect(); // Verbindung zur MySQL-Datenbank herstellen, wenn gültige Verbindungsinformationen vorhanden sind function connect() { node.status({ fill: "green", shape: "ring", text: "connecting..." }); if (host && port && user && password && database) { if (mssqlSelected) { // MSSQL-Konfiguration const sqlConfig = { user: user, password: password, server: host, port: parseInt(port, 10), // Port in Zahl umwandeln database: database, options: { encrypt: true, enableArithAbort: true, trustServerCertificate: true // Akzeptiert selbstsignierte Zertifikate } }; connection = new mssql.ConnectionPool(sqlConfig); connection.connect().then(() => { node.status({ fill: "green", shape: "dot", text: "connected to MSSQL" }); connected = true; }).catch(err => { node.status({ fill: "red", shape: "ring", text: "ERROR: " + err.message }); node.error("Error connecting to MSSQL: " + err.message); }); } else { // MySQL-Verbindung connection = mysql.createConnection({ host: host, port: port, user: user, password: password, database: database }); connection.connect(function (err) { if (err) { node.status({ fill: "red", shape: "ring", text: "ERROR: " + err.message }); node.error("Error connecting to MySQL: " + err.message); } else { node.status({ fill: "green", shape: "dot", text: "connected to MySQL" }); connected = true; } }); } } else { node.error("Missing connection information"); } } // Function to close the database connection function disconnect() { if (mssqlSelected && connection) { connection.close().then(() => { node.status({ fill: "red", shape: "ring", text: "disconnected from MSSQL" }); connected = false; }).catch(err => { node.error("Error disconnecting from MSSQL: " + err.message); }); } else if (connection) { connection.end(err => { if (err) { node.error("Error disconnecting from MySQL: " + err.message); } else { node.status({ fill: "red", shape: "ring", text: "disconnected from MySQL" }); connected = false; } }); } } function getSQLresult(topic, callback) { try { if (connection && topic) { connection.query(topic, function(error, results, fields) { if (error) { node.error("Error executing MySQL query: " + error.message); return callback(error, null); } // Ergebnis zur Nachricht hinzufügen und senden callback(null, results); }); } } catch (error) { node.error("Error executing MySQL query: " + error.message); callback(error, null); } } // Nachrichtenverarbeitungsfunktion node.on('input', function(msg) { if (!connection || connected === false) { host = node.databaseConfig.host; port = node.databaseConfig.port; user = node.databaseConfig.user; password = node.databaseConfig.password; database = node.databaseConfig.database; connect(); } else { if (msg.topic.includes("ProcessControl/Storage") && !msg.topic.includes("ProcessControl/Storage/Status")) { var frameIDs = msg.payload.FrameId; var location = msg.payload.StorageLocation; var count = frameIDs.length; var totalIDs = count; var successfulIDs = 0; var failedIDs = 0; var failedFrames = []; var successfulFrames = []; for (var i = 0; i < count; i++) { (function(i) { var frameID = frameIDs[i]; var storage = location; var topic = ` SELECT FrameData.StorageLocation FROM FrameId JOIN FrameData ON FrameId.FKey_FrameData = FrameData.PKey_FrameData WHERE FrameId.FrameId = '` + frameID + `'`; if (!frameID || !storage) { node.error("frameID or storage is missing"); } else { getSQLresult(topic, function(error, result) { if (error) { node.error("Error executing MySQL query: " + error.message); } else { if (!result || /^\s*$/.test(result)) { failedIDs++; failedFrames[failedIDs] = {FrameID: frameID, Storage: storage}; } else { successfulIDs++; successfulFrames[successfulIDs] = {FrameID: frameID, Storage: storage}; } var checkedIDs = successfulIDs + failedIDs; var msgData; if (checkedIDs === totalIDs) { // Erfolgreiche Frames hinzufügen for (var i = 1; i <= successfulIDs; i++) { if (mssqlSelected) { var topic = ` UPDATE FrameData SET FrameData.StorageLocation = '${successfulFrames[i].Storage}' FROM FrameData JOIN FrameId ON FrameData.PKey_FrameData = FrameId.FKey_FrameData WHERE FrameId.FrameId = '${successfulFrames[i].FrameID}'; `; } else { var topic = ` UPDATE FrameData JOIN FrameId ON FrameData.PKey_FrameData = FrameId.FKey_FrameData SET FrameData.StorageLocation = '${successfulFrames[i].Storage}' WHERE FrameId.FrameId = '${successfulFrames[i].FrameID}'; `; } if (successfulFrames[i].Storage && successfulFrames[i].FrameID) { getSQLresult(topic, function(error, result) { if (error) { node.error("Error executing MySQL query: " + error.message); } else { } }); msgData = [{ payload: { FrameID: successfulFrames[i].FrameID, Storage: successfulFrames[i].Storage }, measurement: "Storage" }]; node.send([msgData,]); } else { node.error("storage or frameID is missing"); } } if (failedIDs > 0) { // Fehlgeschlagene Frames hinzufügen var failedFrameIDs = ""; for (var j = 1; j <= failedIDs; j++) { if (failedFrameIDs === "") { failedFrameIDs = failedFrames[j].FrameID; } else { failedFrameIDs = failedFrameIDs + ", " + failedFrames[j].FrameID; } } // Payload-Objekte erstellen msgData = [{ payload : { Success: false, Message: "FrameID: " + failedFrameIDs + " not found" }, topic: "GRUNIG/ProcessControl/Storage/Status" }]; } else { msgData = [{ payload : { Success: true, Message: "Successful", }, topic: "GRUNIG/ProcessControl/Storage/Status" }]; } node.send([,msgData]); } } }); } })(i); } } } }); // Node wird geschlossen node.on('close', function() { disconnect(); }); } // Node-Typ registrieren RED.nodes.registerType("G-StorageManager", G_StorageManager); };