From ce8b2a6bd873f70bcaf3b9d03ffe4124e3b14637 Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Thu, 9 Sep 2021 10:09:18 -0700 Subject: [PATCH] Added MySQL/MariaDB support for reports. --- db.js | 15 +++++++++++++++ meshuser.js | 3 +++ 2 files changed, 18 insertions(+) diff --git a/db.js b/db.js index c44caf46..a7b14647 100644 --- a/db.js +++ b/db.js @@ -1166,6 +1166,14 @@ module.exports.CreateDB = function (parent, func) { sqlDbQuery('SELECT doc FROM events JOIN eventids ON id = fkid WHERE (domain = ? AND userid = ? AND target IN (?)) GROUP BY id ORDER BY time DESC LIMIT ?', [domain, userid, ids, limit], func); } }; + obj.GetEventsTimeRange = function (ids, domain, msgids, start, end, func) { + //obj.eventsfile.find({ domain: domain, $or: [{ ids: { $in: ids } }], msgid: { $in: msgids }, time: { $gte: start, $lte: end } }).project({ type: 0, _id: 0, domain: 0, ids: 0, node: 0 }).sort({ time: 1 }).toArray(func); + if (ids.indexOf('*') >= 0) { + sqlDbQuery('SELECT doc FROM events WHERE ((domain = ?) AND (time BETWEEN ? AND ?)) ORDER BY time', [domain, start, end], func); + } else { + sqlDbQuery('SELECT doc FROM events JOIN eventids ON id = fkid WHERE ((domain = ?) AND (target IN (?)) AND (time BETWEEN ? AND ?)) GROUP BY id ORDER BY time', [domain, ids, start, end], func); + } + }; //obj.GetUserLoginEvents = function (domain, username, func) { } // TODO obj.GetNodeEventsWithLimit = function (nodeid, domain, limit, func) { sqlDbQuery('SELECT doc FROM events WHERE (nodeid = ?) AND (domain = ?) ORDER BY time DESC LIMIT ?', [nodeid, domain, limit], func); }; obj.GetNodeEventsSelfWithLimit = function (nodeid, domain, userid, limit, func) { sqlDbQuery('SELECT doc FROM events WHERE (nodeid = ?) AND (domain = ?) AND ((userid = ?) OR (userid IS NULL)) ORDER BY time DESC LIMIT ?', [nodeid, domain, userid, limit], func); }; @@ -1589,6 +1597,13 @@ module.exports.CreateDB = function (parent, func) { obj.eventsfile.find({ domain: domain, $or: [{ ids: { $in: ids } }, { username: username }] }, { type: 0, _id: 0, domain: 0, ids: 0, node: 0 }).sort({ time: -1 }).limit(limit, func); } }; + obj.GetEventsTimeRange = function (ids, domain, msgids, start, end, func) { + if (obj.databaseType == 1) { + obj.eventsfile.find({ domain: domain, $or: [{ ids: { $in: ids } }], msgid: { $in: msgids }, time: { $gte: start, $lte: end } }, { type: 0, _id: 0, domain: 0, ids: 0, node: 0 }).sort({ time: 1 }).exec(func); + } else { + obj.eventsfile.find({ domain: domain, $or: [{ ids: { $in: ids } }], msgid: { $in: msgids }, time: { $gte: start, $lte: end } }, { type: 0, _id: 0, domain: 0, ids: 0, node: 0 }).sort({ time: 1 }, func); + } + }; obj.GetUserLoginEvents = function (domain, userid, func) { if (obj.databaseType == 1) { obj.eventsfile.find({ domain: domain, action: { $in: ['authfail', 'login'] }, userid: userid, msgArgs: { $exists: true } }, { action: 1, time: 1, msgid: 1, msgArgs: 1, tokenName: 1 }).sort({ time: -1 }).exec(func); diff --git a/meshuser.js b/meshuser.js index 105fca5a..78ab0b74 100644 --- a/meshuser.js +++ b/meshuser.js @@ -5420,6 +5420,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use if ((user.siteadmin & SITERIGHT_MANAGEUSERS) != 0) { ids = ['*']; } // Get the events in the time range + // MySQL or MariaDB query will ignore the MsgID filter. db.GetEventsTimeRange(ids, domain.id, [5, 10, 12], new Date(command.start * 1000), new Date(command.end * 1000), function (err, docs) { if (err != null) return; var data = { groups: {} }; @@ -5437,6 +5438,8 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use // Rows for (var i in docs) { + if ((docs[i].msgid != 5) && (docs[i].msgid != 10) && (docs[i].msgid != 12)) continue; // If MySQL or MariaDB query, we can't filter on MsgID, so we have to do it here. + var entry = { time: docs[i].time.valueOf() }; // UserID