Files
DataLogger-Generic/www/functions_SQLite.js
Patrick McDonagh 11bdf2542f Finished CSV functions
Data is now returned with columns for each tag
2016-02-22 18:15:23 -06:00

424 lines
12 KiB
JavaScript

// 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;
}
};
var getAllTags = function(callback){
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) {
return callback(err, null);
console.log(err);
} else {
return callback(null, rows);
}
});
});
};
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});
}
});
});
};
var createCSVrow = function(header, dataRow){
var i = header.indexOf(dataRow.vanityName);
var csvRow = dataRow.id.toString() + "," + dataRow.dateAdded + ",";
if (i >= 0){
for (var j = 2; j < header.length; j++){
if (j == i){
csvRow = csvRow + dataRow.val.toString()+ ",";
} else {
csvRow = csvRow + ",";
}
}
csvRow = csvRow.slice(0, -1) + "\r";
return csvRow;
}
};
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 {
getAllTags(function(err,tags){
if (err){
console.log(err);
} else {
var csvString = "";
var da = ["id", "DateAdded"];
var tagVanityNames = tags.map(function(t){return t.vanityName;});
var h = da.concat(tagVanityNames);
console.log(h);
csvString = csvString + h.join(",") + "\r";
for (var i= 0; i < rows.length; i++){
csvString = csvString + createCSVrow(h, rows[i]);
}
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 v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN vals v ON t.id = v.tagID WHERE tagID = ? AND v.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", "DateAdded", rows[0].vanityName];
csvString = csvString + h.join(",") + "\r";
for (var i= 0; i < rows.length; i++){
csvString = csvString + [rows[i].id, rows[i].dateAdded, rows[i].val].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 v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN vals v ON t.id = v.tagID 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", "DateAdded", rows[0].vanityName];
csvString = csvString + h.join(",") + "\r";
for (var i= 0; i < rows.length; i++){
csvString = csvString + [rows[i].id, rows[i].dateAdded, rows[i].val].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);
});
}
});
});
};