Added MySQL/MariaDB support for reports.

Ylian Saint-Hilaire committed Sep 9, 2021 at 10:09 UTC ce8b2a6bd873f70bcaf3b9d03ffe4124e3b14637
2 files changed +18
db.js
+15
@@ -1166,6 +1166,14 @@ module.exports.CreateDB = function (parent, func) {
1166 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);
1167 }
1168 };
1169 + obj.GetEventsTimeRange = function (ids, domain, msgids, start, end, func) {
1170 + //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);
1171 + if (ids.indexOf('*') >= 0) {
1172 + sqlDbQuery('SELECT doc FROM events WHERE ((domain = ?) AND (time BETWEEN ? AND ?)) ORDER BY time', [domain, start, end], func);
1173 + } else {
1174 + 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);
1175 + }
1176 + };
1177 //obj.GetUserLoginEvents = function (domain, username, func) { } // TODO
1178 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); };
1179 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) {
1597 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);
1598 }
1599 };
1600 + obj.GetEventsTimeRange = function (ids, domain, msgids, start, end, func) {
1601 + if (obj.databaseType == 1) {
1602 + 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);
1603 + } else {
1604 + 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);
1605 + }
1606 + };
1607 obj.GetUserLoginEvents = function (domain, userid, func) {
1608 if (obj.databaseType == 1) {
1609 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);
meshuser.js
+3
@@ -5420,6 +5420,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
5420 if ((user.siteadmin & SITERIGHT_MANAGEUSERS) != 0) { ids = ['*']; }
5421
5422 // Get the events in the time range
5423 + // MySQL or MariaDB query will ignore the MsgID filter.
5424 db.GetEventsTimeRange(ids, domain.id, [5, 10, 12], new Date(command.start * 1000), new Date(command.end * 1000), function (err, docs) {
5425 if (err != null) return;
5426 var data = { groups: {} };
@@ -5437,6 +5438,8 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
5438
5439 // Rows
5440 for (var i in docs) {
5441 + 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.
5442 +
5443 var entry = { time: docs[i].time.valueOf() };
5444
5445 // UserID