// var dbFile = "/usr/db/data.db"; var dbFile = "/mnt/usb/data.db"; // var dbFile = '/Users/patrickjmcd/data.db'; var dString_to_sqlite = function(dString){ /** * Takes a date string in the form YYYYMMDD_HHmmSS and returns it in SQLite format (YYYY-MM-DD HH:mm:SS) * @param {String} dString * @return {String} sqliteString */ var re = /(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})/; var fd = re.exec(dString); if (fd){ var sqliteString = ""; return sqliteString.concat(fd[1], "-", fd[2], "-", fd[3], " ", fd[4], ":", fd[5], ":", fd[6]); } else { return null; } }; var sqlite_to_dString = function(sqliteDate){ /** * Takes a sqlite date string in the form YYYY-MM-DD HH:mm:SS and returns it in format YYYYMMDD_HHmmSS * @param {String} sqliteDate * @return {String} dString */ var re = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/; var fd = re.exec(sqliteDate); if (fd){ var dString = ""; return dString.concat(fd[1], fd[2], fd[3], "_", fd[4], fd[5], fd[6]); } else { return null; } }; exports.getAllTags = function(req, res){ var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); db.serialize(function(){ var query = "SELECT * FROM tags WHERE deleted = 0"; var prepQuery = db.prepare(query); prepQuery.all(function(err, rows) { prepQuery.finalize(); db.close(); if (err) { res.json({status:"error", message:err}); console.log(err); } else { res.json({status:"OK", tags:rows}); } }); }); }; exports.createTag = function(req, res){ var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); db.serialize(function(){ var query = "INSERT INTO tags (tagName, units, minExpected, maxExpected, vanityName, description) VALUES (?, ?, ?, ?, ?, ?)"; var prepQuery = db.prepare(query); prepQuery.run(req.body.tagName, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.vanityName, req.body.description, function(err){ prepQuery.finalize(); db.close(); if (err) { res.json({status:"error", message:err}); console.log(err); } else { res.json({status:"OK"}); } }); }); }; exports.getTag = function(req, res){ var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); db.serialize(function(){ var query = "SELECT * FROM tags WHERE id = ?"; var prepQuery = db.prepare(query); prepQuery.all(req.params.id, function(err, rows) { prepQuery.finalize(); db.close(); if (err) { res.json({status:"error", message:err}); console.log(err); } else { res.json({status:"OK", tags:rows}); } }); }); }; exports.updateTag = function(req, res){ var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); db.serialize(function(){ var query = "UPDATE tags set tagName = ?, units = ?, minExpected = ?, maxExpected = ?, vanityName = ?, description = ? WHERE id = ?"; var prepQuery = db.prepare(query); prepQuery.run(req.body.tagName, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.vanityName, req.body.description, req.body.id, function(err) { prepQuery.finalize(); db.close(); if (err) { res.json({status:"error", message:err}); console.log(err); } else { res.json({status:"OK"}); } }); }); }; exports.deleteTag = function(req, res){ var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); db.serialize(function(){ var query = "UPDATE tags SET deleted = 1 WHERE id = ?"; var prepQuery = db.prepare(query); prepQuery.run(req.params.tag, function(err) { prepQuery.finalize(); db.close(); if (err) { res.json({status:"error", message:err}); console.log(err); } else { res.json({status:"OK"}); } }); }); }; exports.seriesTagValues = function(req, res){ var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); db.serialize(function(){ var query = "SELECT * FROM vals WHERE tagID = ? AND dateAdded > DATETIME('now', '-1 HOUR')"; var prepQuery = db.prepare(query); prepQuery.all(parseInt(req.params.tag), function(err, rows){ prepQuery.finalize(); db.close(); if (err){ console.log(err); res.json({status:"error", message:err, query:query}); } else { res.json({status:"OK", tag: req.params.tag, vals:rows}); } }); }); }; exports.seriesTagValuesBetween = function(req, res){ var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); db.serialize(function(){ var query = "SELECT * FROM vals WHERE tagID = ? AND dateAdded >= DATETIME(?) AND dateAdded <= DATETIME(?)"; var prepQuery = db.prepare(query); prepQuery.all(parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime), function(err, rows){ prepQuery.finalize(); db.close(); if (err){ console.log(err); res.json({status:"error", message:err, query:query}); } else { res.json({status:"OK", tag: req.params.tag, startDatetime: dString_to_sqlite(req.params.startDatetime), endDatetime: dString_to_sqlite(req.params.endDatetime), vals:rows}); } }); }); }; exports.allDataCSV = function(req, res){ var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); db.serialize(function(){ var query = "SELECT v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN vals v ON t.id = v.tagID"; var prepQuery = db.prepare(query); prepQuery.all( function(err, rows){ prepQuery.finalize(); db.close(); if (err){ console.log(err); res.json({status:"error", message:err, query:query}); } else { var csvString = ""; var h = ["ID", "Tag Name", "Value", "DateAdded"]; csvString = csvString + h.join(",") + "\r"; for (var i= 0; i < rows.length; i++){ var r = [rows[i].id, rows[i].vanityName, rows[i].val, rows[i].dateAdded]; csvString = csvString + r.join(",") + "\r"; } res.set('Content-Type', 'text/csv'); res.set('Content-Disposition', "attachment;filename=tagdata.csv"); res.send(csvString); } }); }); }; exports.seriesCSV = function(req, res){ var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); db.serialize(function(){ var query = "SELECT * FROM vals WHERE tagID = ? AND dateAdded > DATETIME('now', '-1 HOUR')"; var prepQuery = db.prepare(query); prepQuery.all(parseInt(req.params.tag), function(err, rows){ prepQuery.finalize(); db.close(); if (err){ console.log(err); res.json({status:"error", message:err, query:query}); } else { var csvString = ""; var h = ["ID", "Value", "DateAdded"]; csvString = csvString + h.join(",") + "\r"; for (var i= 0; i < rows.length; i++){ var r = [rows[i].id, rows[i].val, rows[i].dateAdded]; csvString = csvString + r.join(",") + "\r"; } res.set('Content-Type', 'text/csv'); res.set('Content-Disposition', "attachment;filename=tagdata.csv"); res.send(csvString); } }); }); }; exports.seriesCSVBetween = function(req, res){ var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); db.serialize(function(){ var query = "SELECT * FROM vals WHERE tagID = ? AND dateAdded >= DATETIME(?) AND dateAdded <= DATETIME(?)"; var prepQuery = db.prepare(query); prepQuery.all(parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime), function(err, rows){ prepQuery.finalize(); db.close(); if (err){ console.log(err); res.json({status:"error", message:err, query:query}); } else { var csvString = ""; var h = ["ID", "Value", "DateAdded"]; csvString = csvString + h.join(",") + "\r"; for (var i= 0; i < rows.length; i++){ var r = [rows[i].id, rows[i].val, rows[i].dateAdded]; csvString = csvString + r.join(",") + "\r"; } res.set('Content-Type', 'text/csv'); res.set('Content-Disposition', "attachment;filename=tagdata.csv"); res.send(csvString); } }); }); }; exports.latestValueSingleTag = function(req, res){ var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); db.serialize(function(){ var query = "SELECT * FROM vals WHERE id = (SELECT MAX(id) FROM vals WHERE tagID = ?)"; var prepQuery = db.prepare(query); prepQuery.all(req.params.tag, function(err, rows) { console.log(rows); prepQuery.finalize(); db.close(); if (err) { res.json({status:"error", message:err}); console.log(err); } else { res.json({status:"OK", tag_val:rows[0]}); } }); }); }; exports.latestValueAllTags = function(req, res){ var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); db.serialize(function(){ var query = "SELECT t.tagName as tagName, t.vanityName as vanityName, t.description as description, t.units as units, t.id as t_id, t.minExpected as min, t.maxExpected as max, MAX(v.id) as v_id, v.val as val, v.dateAdded as dtime FROM vals v JOIN tags t ON v.tagID = t.id WHERE t.deleted = 0 GROUP BY v.tagID"; var prepQuery = db.prepare(query); prepQuery.all(req.params.id, function(err, rows) { prepQuery.finalize(); db.close(); if (err) { res.json({status:"error", message:err}); console.log(err); } else { res.json({status:"OK", vals:rows}); } }); }); }; exports.checkLoggerStatus = function(req, res){ var fs = require('fs'); // var ps = require("ps-node"); var running = require("is-running"); fs.readFile('/root/tagserver.pid', function (derr,ddata) { if (derr) { console.log("Problem getting PID of tagserver"); res.json({status:"error", message: "Problem getting PID of tagserver"}); } else { res.json({status: "OK", running: running(ddata)}); } }); }; exports.restartLogger = function(req, res){ var exec = require('child_process').exec; exec('/etc/init.d/loggers start', function(error, stdout, stderr){ if (error){ res.json({status:"error", message:error}); } else { res.json({status:"OK"}); } }); }; exports.getSetup = function(req, res){ var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); var query = "SELECT parameter, val, dateAdded FROM config GROUP BY parameter;"; var prepQuery = db.prepare(query); prepQuery.all(req.params.id, function(err, rows) { prepQuery.finalize(); db.close(); if (err) { res.json({status:"error", message:err}); console.log(err); } else { res.json({status:"OK", config:rows}); } }); }; exports.updateSetup = function(req, res){ var exec = require('child_process').exec; var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(dbFile); console.log(req.body.parameter, req.body.val); db.serialize(function(){ var query = db.prepare('INSERT INTO config (parameter, val) VALUES (?, ?)'); query.run(req.body.parameter, req.body.val, function(err) { query.finalize(); db.close(); if (err) { console.log({runErr:err}); res.json({status:"error", message:err, query:query}); } else { res.redirect("/#/setup"); exec('/etc/init.d/loggers stop', function(error, stdout, stderr){ if (error){ console.log({status:"error", message:error, query:query}); } setTimeout(function(){ exec('/etc/init.d/loggers start', function(error, stdout, stderr){ if (error){ console.log({status:"error", message:error, query:query}); } }); },5000); }); } }); }); };