grunig-nodes
Version:
Grünig Nodes Library
265 lines (245 loc) • 13.9 kB
JavaScript
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);
};