First version that works with MariaDB.

Ylian Saint-Hilaire committed Feb 3, 2020 at 16:50 UTC bb989a4b8277340c46696dde081e7b92c347102b
2 files changed +86 -17
db.js
+85 -16
@@ -323,6 +323,42 @@ module.exports.CreateDB = function (parent, func) {
323 obj.dbRecordsDecryptKey = parent.crypto.createHash('sha384').update(parent.args.dbrecordsdecryptkey).digest("raw").slice(0, 32);
324 }
325
326 +/*
327 +CREATE DATABASE xmeshcentral;
328 +CREATE TABLE xmeshcentral.main(id VARCHAR(256) NOT NULL, type CHAR(32), domain CHAR(64), extra CHAR(255), extraex CHAR(255), doc JSON, PRIMARY KEY(id), CHECK(json_valid(doc)));
329 +CREATE INDEX ndxtypedomainextra ON xmeshcentral.main(type, domain, extra);
330 +CREATE INDEX ndxextra ON xmeshcentral.main(extra);
331 +CREATE INDEX ndxextraex ON xmeshcentral.main(extraex);
332 +
333 +CREATE TABLE xmeshcentral.events(id INT NOT NULL AUTO_INCREMENT, time DATETIME, domain CHAR(64), action CHAR(255), nodeid CHAR(255), userid CHAR(255), doc JSON, PRIMARY KEY(id), CHECK(json_valid(doc)));
334 +CREATE INDEX ndxeventstime ON xmeshcentral.events(time);
335 +CREATE INDEX ndxeventsusername ON xmeshcentral.events(domain, userid, time);
336 +CREATE INDEX ndxeventsdomainnodeidtime ON xmeshcentral.events(domain, nodeid, time);
337 +
338 +CREATE TABLE xmeshcentral.eventids(fkid INT NOT NULL, target CHAR(255), CONSTRAINT fk_eventid FOREIGN KEY (fkid) REFERENCES events (id) ON DELETE CASCADE ON UPDATE RESTRICT);
339 +CREATE INDEX ndxeventids ON xmeshcentral.eventids(target);
340 +
341 +CREATE TABLE xmeshcentral.serverstats(time DATETIME, expire DATETIME, doc JSON, PRIMARY KEY(time), CHECK(json_valid(doc)));
342 +CREATE INDEX ndxserverstattime ON xmeshcentral.serverstats(time);
343 +CREATE INDEX ndxserverstatexpire ON xmeshcentral.serverstats(expire);
344 +CREATE TABLE xmeshcentral.power(id INT NOT NULL AUTO_INCREMENT, time DATETIME, nodeid CHAR(255), doc JSON, PRIMARY KEY(id), CHECK(json_valid(doc)));
345 +CREATE INDEX ndxpowernodeidtime ON xmeshcentral.power(nodeid, time);
346 +CREATE TABLE xmeshcentral.smbios(id CHAR(255), time DATETIME, expire DATETIME, doc JSON, PRIMARY KEY(id), CHECK(json_valid(doc)));
347 +CREATE INDEX ndxsmbiostime ON xmeshcentral.smbios(time);
348 +CREATE INDEX ndxsmbiosexpire ON xmeshcentral.smbios(expire);
349 +CREATE TABLE xmeshcentral.plugin(id INT NOT NULL AUTO_INCREMENT, doc JSON, PRIMARY KEY(id), CHECK(json_valid(doc)));
350 +
351 +INSERT INTO xmeshcentral.events VALUE (null, null, '', 'tstaction', 'nodeid', 'userid', '{ "a":1, "b":2 }');
352 +INSERT INTO xmeshcentral.eventids VALUE (LAST_INSERT_ID(), 'target1');
353 +INSERT INTO xmeshcentral.eventids VALUE (LAST_INSERT_ID(), 'target2');
354 +
355 +show tables;
356 +select * from events;
357 +select * from eventids;
358 +
359 +SELECT doc FROM xmeshcentral.events JOIN eventids ON id = fkid WHERE target IN ("target3") GROUP BY id;
360 +*/
361 +
362 if (parent.args.mariadb) {
363 // Use MariaDB
364 obj.databaseType = 4;
@@ -338,10 +374,13 @@ module.exports.CreateDB = function (parent, func) {
374 'CREATE INDEX ndxextra ON meshcentral.main (extra)',
375 'CREATE INDEX ndxextraex ON meshcentral.main (extraex)',
376 // Events table
341 - 'CREATE TABLE meshcentral.events (id INT NOT NULL AUTO_INCREMENT, time DATETIME, domain CHAR(64), action CHAR(255), nodeid CHAR(255), userid CHAR(255), doc JSON, PRIMARY KEY(id), CHECK (json_valid(doc)))',
342 - 'CREATE INDEX ndxeventstime ON meshcentral.events (time)',
343 - 'CREATE INDEX ndxeventsusername ON meshcentral.events (domain, userid, time)',
344 - 'CREATE INDEX ndxeventsdomainnodeidtime ON meshcentral.events (domain, nodeid, time)',
377 + 'CREATE TABLE meshcentral.events(id INT NOT NULL AUTO_INCREMENT, time DATETIME, domain CHAR(64), action CHAR(255), nodeid CHAR(255), userid CHAR(255), doc JSON, PRIMARY KEY(id), CHECK(json_valid(doc)))',
378 + 'CREATE INDEX ndxeventstime ON meshcentral.events(time)',
379 + 'CREATE INDEX ndxeventsusername ON meshcentral.events(domain, userid, time)',
380 + 'CREATE INDEX ndxeventsdomainnodeidtime ON meshcentral.events(domain, nodeid, time)',
381 + // Events ID table
382 + 'CREATE TABLE meshcentral.eventids(fkid INT NOT NULL, target CHAR(255), CONSTRAINT fk_eventid FOREIGN KEY (fkid) REFERENCES events (id) ON DELETE CASCADE ON UPDATE RESTRICT)',
383 + 'CREATE INDEX ndxeventids ON meshcentral.eventids(target)',
384 // Server stats table
385 'CREATE TABLE meshcentral.serverstats (time DATETIME, expire DATETIME, doc JSON, PRIMARY KEY(time), CHECK (json_valid(doc)))',
386 'CREATE INDEX ndxserverstattime ON meshcentral.serverstats (time)',
@@ -706,8 +745,8 @@ module.exports.CreateDB = function (parent, func) {
745 for (var i in rows) { if (rows[i].doc) { docs.push(performTypedRecordDecrypt(JSON.parse(rows[i].doc))); } }
746 if (func) try { func(null, docs); } catch (ex) { console.log(ex); }
747 })
709 - .catch(function (err) { conn.release(); if (func) try { func(err); } catch (ex) { console.log(ex); } });
710 - }).catch(function (err) { if (func) { try { func(err); } catch (ex) { console.log(ex); } } });
748 + .catch(function (err) { conn.release(); if (func) try { console.log(err); func(err); } catch (ex) { console.log(ex); } });
749 + }).catch(function (err) { if (func) { try { console.log(err); func(err); } catch (ex) { console.log(ex); } } });
750 }
751
752 // Exec on the database
@@ -719,8 +758,8 @@ module.exports.CreateDB = function (parent, func) {
758 conn.release();
759 if (func) try { func(null, rows[0]); } catch (ex) { console.log(ex); }
760 })
722 - .catch(function (err) { conn.release(); if (func) try { func(err); } catch (ex) { console.log(ex); } });
723 - }).catch(function (err) { if (func) { try { func(err); } catch (ex) { console.log(ex); } } });
761 + .catch(function (err) { conn.release(); if (func) try { console.log(err); func(err); } catch (ex) { console.log(ex); } });
762 + }).catch(function (err) { if (func) { try { console.log(err); func(err); } catch (ex) { console.log(ex); } } });
763 }
764
765 // Execute a batch of commands on the database
@@ -728,12 +767,12 @@ module.exports.CreateDB = function (parent, func) {
767 Datastore.getConnection()
768 .then(function (conn) {
769 var Promises = [];
731 - for (var i in queries) { Promises.push(conn.query(queries[i])); }
770 + for (var i in queries) { if (typeof queries[i] == 'string') { Promises.push(conn.query(queries[i])); } else { Promises.push(conn.query(queries[i][0], queries[i][1])); } }
771 Promise.all(Promises)
772 .then(function (rows) { conn.release(); if (func) { try { func(null); } catch (ex) { console.log(ex); } } })
734 - .catch(function (err) { conn.release(); if (func) { try { func(err); } catch (ex) { console.log(ex); } } });
773 + .catch(function (err) { conn.release(); if (func) { try { console.log(err); func(err); } catch (ex) { console.log(ex); } } });
774 })
736 - .catch(function (err) { if (func) { try { func(err); } catch (ex) { console.log(ex); } } });
775 + .catch(function (err) { if (func) { try { console.log(err); func(err); } catch (ex) { console.log(ex); } } });
776 }
777
778 function setupFunctions(func) {
@@ -770,11 +809,41 @@ module.exports.CreateDB = function (parent, func) {
809
810 // Database actions on the events collection
811 obj.GetAllEvents = function (func) { mariaDbQuery('SELECT doc FROM meshcentral.events', null, func); };
773 - obj.StoreEvent = function (event) { mariaDbQuery('INSERT INTO meshcentral.events VALUE (?, ?, ?, ?, ?, ?, ?)', [null, event.time, ((typeof event.domain == 'string') ? event.domain : null), event.action, event.nodeid ? event.nodeid : null, event.userid ? event.userid : null, JSON.stringify(event)], function (err, docs) { }); };
774 - obj.GetEvents = function (ids, domain, func) { console.log('TODO:GetEvents'); func(null, []); };
775 - obj.GetEventsWithLimit = function (ids, domain, limit, func) { console.log('TODO:GetEventsWithLimit'); func(null, []); };
776 - obj.GetUserEvents = function (ids, domain, username, func) { console.log('TODO:GetUserEvents'); func(null, []); };
777 - obj.GetUserEventsWithLimit = function (ids, domain, username, limit, func) { console.log('TODO:GetUserEventsWithLimit'); func(null, []); };
812 + obj.StoreEvent = function (event) {
813 + var batchQuery = [['INSERT INTO meshcentral.events VALUE (?, ?, ?, ?, ?, ?, ?)', [null, event.time, ((typeof event.domain == 'string') ? event.domain : null), event.action, event.nodeid ? event.nodeid : null, event.userid ? event.userid : null, JSON.stringify(event)]]];
814 + for (var i in event.ids) { if (event.ids[i] != '*') { batchQuery.push(['INSERT INTO meshcentral.eventids VALUE (LAST_INSERT_ID(), ?)', [event.ids[i]]]); } }
815 + mariaDbBatchExec(batchQuery, function (err, docs) { });
816 + };
817 + obj.GetEvents = function (ids, domain, func) {
818 + if (ids.indexOf('*') >= 0) {
819 + mariaDbQuery('SELECT doc FROM meshcentral.events WHERE (domain = ?) ORDER BY time DESC', [domain], func);
820 + } else {
821 + mariaDbQuery('SELECT doc FROM meshcentral.events JOIN meshcentral.eventids ON id = fkid WHERE (domain = ? AND target IN (?)) GROUP BY id ORDER BY time DESC', [domain, ids], func);
822 + }
823 + };
824 + obj.GetEventsWithLimit = function (ids, domain, limit, func) {
825 + if (ids.indexOf('*') >= 0) {
826 + mariaDbQuery('SELECT doc FROM meshcentral.events WHERE (domain = ?) ORDER BY time DESC LIMIT ?', [domain, limit], func);
827 + } else {
828 + mariaDbQuery('SELECT doc FROM meshcentral.events JOIN meshcentral.eventids ON id = fkid WHERE (domain = ? AND target IN (?)) GROUP BY id ORDER BY time DESC LIMIT ?', [domain, ids, limit], func);
829 + }
830 + };
831 + obj.GetUserEvents = function (ids, domain, username, func) {
832 + const userid = 'user/' + domain + '/' + username.toLowerCase();
833 + if (ids.indexOf('*') >= 0) {
834 + mariaDbQuery('SELECT doc FROM meshcentral.events WHERE (domain = ? AND userid = ?) ORDER BY time DESC', [domain, userid], func);
835 + } else {
836 + mariaDbQuery('SELECT doc FROM meshcentral.events JOIN meshcentral.eventids ON id = fkid WHERE (domain = ? AND userid = ? AND target IN (?)) GROUP BY id ORDER BY time DESC', [domain, userid, ids, limit], func);
837 + }
838 + };
839 + obj.GetUserEventsWithLimit = function (ids, domain, username, limit, func) {
840 + const userid = 'user/' + domain + '/' + username.toLowerCase();
841 + if (ids.indexOf('*') >= 0) {
842 + mariaDbQuery('SELECT doc FROM meshcentral.events WHERE (domain = ? AND userid = ?) ORDER BY time DESC LIMIT ?', [domain, userid, limit], func);
843 + } else {
844 + mariaDbQuery('SELECT doc FROM meshcentral.events JOIN meshcentral.eventids ON id = fkid WHERE (domain = ? AND userid = ? AND target IN (?)) GROUP BY id ORDER BY time DESC LIMIT ?', [domain, userid, ids, limit], func);
845 + }
846 + };
847 obj.GetNodeEventsWithLimit = function (nodeid, domain, limit, func) { mariaDbQuery('SELECT doc FROM meshcentral.events WHERE (nodeid = ?) AND (domain = ?) ORDER BY time DESC LIMIT ?', [nodeid, domain, limit], func); };
848 obj.GetNodeEventsSelfWithLimit = function (nodeid, domain, userid, limit, func) { mariaDbQuery('SELECT doc FROM meshcentral.events WHERE (nodeid = ?) AND (domain = ?) AND ((userid = ?) OR (userid IS NULL)) ORDER BY time DESC LIMIT ?', [nodeid, domain, userid, limit], func); };
849 obj.RemoveAllEvents = function (domain) { mariaDbQuery('DELETE FROM meshcentral.events', null, function (err, docs) { }); };
package.json
+1 -1
@@ -1,6 +1,6 @@
1 {
2 "name": "meshcentral",
3 - "version": "0.4.8-k",
3 + "version": "0.4.8-l",
4 "keywords": [
5 "Remote Management",
6 "Intel AMT",