completed tag series function and added SQLite compatibility

This commit is contained in:
Patrick McDonagh
2016-01-22 14:06:43 -06:00
parent 22b27cc849
commit 10443f3c34
5 changed files with 242 additions and 38 deletions

View File

@@ -6,35 +6,42 @@ var express = require('express'),
bodyParser = require('body-parser'),
errorHandler = require('errorhandler');
var app = express();
var fns;
app.locals.DB_TYPE = "SQLite"; // or "MySQL"
/**
* Configuration
*/
var mysql = require('mysql');
var db_config = {
host: 'localhost',
user: 'website',
password: 'henrypump'
};
var handleDisconnect = function () {
console.log("Handling db disconnect gracefully");
app.locals.db = mysql.createConnection(db_config);
app.locals.db.connect(function (err) {
if (err) {
console.log('error when connecting to db:', err);
setTimeout(handleDisconnect, 2000);
}
});
app.locals.db.on('error', function (err) {
console.log('db error', err);
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
handleDisconnect();
} else {
throw err;
}
});
};
handleDisconnect();
if (app.locals.DB_TYPE == "MySQL"){
fns = require('./functions_MySQL.js');
var mysql = require('mysql');
var db_config = {
host: 'localhost',
user: 'website',
password: 'henrypump'
};
var handleDisconnect = function () {
console.log("Handling db disconnect gracefully");
app.locals.db = mysql.createConnection(db_config);
app.locals.db.connect(function (err) {
if (err) {
console.log('error when connecting to db:', err);
setTimeout(handleDisconnect, 2000);
}
});
app.locals.db.on('error', function (err) {
console.log('db error', err);
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
handleDisconnect();
} else {
throw err;
}
});
};
handleDisconnect();
} else {
fns = require('./functions_SQLite.js');
}
app.set('port', process.env.PORT || 80);
app.set('views', path.join(__dirname, 'views'));
@@ -52,17 +59,18 @@ app.use(express.static(path.join(__dirname, 'public')));
/**
* Routes
*/
var fns = require('./functions.js');
var angular = function(req, res) {
res.render('angularIndex');
};
app.get('/json/add/:tagName/:units', fns.addTag); // Adds a tag to the scan list
app.get('/json/remove/:tag', fns.removeTag); // Removes a tag from the scan list
app.get('/json/val/:tag', fns.latestTagValue); // Gets the latest value of a single tag
app.get('/json/series/:tag/:hours', fns.seriesTagValues); // Gets all the values of a tag for the last X hours
app.get('/json/tags', fns.allTags); // Lists all tags in the scan list
app.get('/json/all', fns.allValues); // Gets the latest values of all tags in the scan list
app.get('/json/get/id/:tagName', fns.tagID); // Gets the id for a tag name
app.get('/json/get/tagName/:tagID', fns.tagName); // Gets the tagName for an ID
app.get('/json/add/:tagName/:units', fns.addTag); // Adds a tag to the scan list
app.get('/json/remove/:tag', fns.removeTag); // Removes a tag from the scan list
app.get('/json/val/:tag', fns.latestTagValue); // Gets the latest value of a single tag
app.get('/json/series/:tag/:hours', fns.seriesTagValues); // Gets all the values of a tag for the last X hours
app.get('/json/tags', fns.allTags); // Lists all tags in the scan list
app.get('/json/all', fns.allValues); // Gets the latest values of all tags in the scan list
app.get('*', angular);

14
www/dbcreate_SQLite.sql Normal file
View File

@@ -0,0 +1,14 @@
CREATE TABLE IF NOT EXISTS tags (
id INTEGER PRIMARY KEY,
tagName TEXT,
dateAdded TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
units TEXT,
deleted INTEGER DEFAULT 0
);
CREATE TABLE IF NOT EXISTS values (
id INTEGER PRIMARY KEY,
tagID INTEGER,
val REAL,
dateAdded TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

View File

@@ -22,7 +22,7 @@ exports.addTag = function(req, res){
res.json({status:"error", message:err});
console.log(err);
} else {
res.json({status:"success"});
res.json({status:"OK"});
}
});
};
@@ -34,7 +34,7 @@ exports.removeTag = function(req, res){
res.json({status:"error", message:err});
console.log(err);
} else {
res.json({status:"success"});
res.json({status:"OK"});
}
});
};
@@ -46,13 +46,21 @@ exports.latestTagValue = function(req, res){
res.json({status:"error", message:err});
console.log(err);
} else {
res.json({status:"success", tag_val:rows[0]});
res.json({status:"OK", tag_val:rows[0]});
}
});
};
exports.seriesTagValues = function(req, res){
res.json("not implemented");
var query = "SELECT * FROM TagData.values WHERE tagID = "+ req.params.tag +" AND dateAdded > DATE_SUB(NOW(),INTERVAL "+ req.params.hours +" HOUR)";
req.app.locals.db.query(query, function(err, rows, fields) {
if (err){
console.log(err);
res.json({status:"error", message:err, query:query});
} else {
res.json({status:"OK", tag: req.params.tag, values:rows});
}
});
};
exports.allTags = function(req, res){
@@ -62,11 +70,11 @@ exports.allTags = function(req, res){
res.json({status:"error", message:err});
console.log(err);
} else {
res.json({status:"success", tags:rows});
res.json({status:"OK", tags:rows});
}
});
};
exports.allValues = function(req, res){
res.json("not implemented");
res.json(status:"error", message:"not implemented"});
};

174
www/functions_SQLite.js Normal file
View File

@@ -0,0 +1,174 @@
var dbFile = "/mnt/usb/data.db"
// app.get('/json/add/:tag', fns.addTag); // Adds a tag to the scan list
// app.get('/json/remove/:tag', fns.removeTag); // Removes a tag from the scan list
// app.get('/json/val/:tag', fns.latestTagValue); // Gets the latest value of a single tag
// app.get('/json/series/:tag/:hours', fns.seriesTagValues); // Gets all the values of a tag for the last X hours
// app.get('/json/tags', fns.allTags); // Lists all tags in the scan list
// app.get('/json/all', fns.allValues); // Gets the latest values of all tags in the scan list
var getTagID = function(tagName, cb){
//Returns function(err, id)
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);
db.serialize(function(){
var query = "SELECT id FROM TagData.tags WHERE tagName = ?";
var prepQuery = db.prepare(query);
prepQuery.all(tagName, function(err, rows){
prepQuery.finalize();
db.close();
if (err){
cb(err, null);
} else {
cb(null, rows[0].id);
}
})
});
};
var getTagName = function(tagID, cb){
//Returns function(err, tagName)
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);
db.serialize(function(){
var query = "SELECT tagName FROM TagData.tags WHERE id = ?";
var prepQuery = db.prepare(query);
prepQuery.all(tagID, function(err, rows){
prepQuery.finalize();
db.close();
if (err){
cb(err, null);
} else {
cb(null, rows[0].tagName);
}
})
});
};
exports.tagID = function(req, res){
getTagID(req.params.tagName, function(err, id){
if (err){
console.log(err);
res.json({status:"error", message:err});
} else {
res.json({status: "OK", tagName: req.params.tagName, id: id});
}
})
};
exports.getTagName = function(req, res){
getTagName(req.params.tagID, function(err, tagName){
if (err){
console.log(err);
res.json({status:"error", message:err});
} else {
res.json({status: "OK", tagID: req.params.tagID, tagName: tagName});
}
})
};
exports.addTag = function(req, res){
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);
db.serialize(function(){
var query = "INSERT INTO TagData.tags (tagName, units) VALUES (?, ?)";
var preqQuery = db.prepare(query);
prepQuery.run(req.params.tagName, req.params.units, function(err){
prepQuery.finalize();
db.close();
if (err) {
res.json({status:"error", message:err});
console.log(err);
} else {
res.json({status:"OK"});
}
});
});
};
exports.removeTag = function(req, res){
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);
db.serialize(function(){
var query = "UPDATE TagData.tags SET deleted = 1 WHERE id = ?";
var preqQuery = 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.latestTagValue = function(req, res){
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);
db.serialize(function(){
var query = "SELECT * FROM TagData.values WHERE id = (SELECT MAX(id) FROM TagData.values WHERE tagID = (SELECT id FROM TagData.tags WHERE tagName = ?))";
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", tag_val:rows[0]});
}
});
});
};
exports.seriesTagValues = function(req, res){
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);
db.serialize(function(){
var query = "SELECT * FROM TagData.values WHERE tagID = ? AND dateAdded > DATE_SUB(NOW(),INTERVAL ? HOUR)";
var prepQuery = db.prepare(query);
prepQuery.all(req.params.tag, req.params.hours, 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, values:rows});
}
})
});
};
exports.allTags = function(req, res){
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);
db.serialize(function(){
var query = "SELECT * FROM TagData.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.allValues = function(req, res){
res.json({status: "error", message: "not implemented"});
};