diff --git a/www/app.js b/www/app.js index 293322f..fa2fe11 100644 --- a/www/app.js +++ b/www/app.js @@ -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); diff --git a/www/dbcreate.sql b/www/dbcreate_MySQL.sql similarity index 100% rename from www/dbcreate.sql rename to www/dbcreate_MySQL.sql diff --git a/www/dbcreate_SQLite.sql b/www/dbcreate_SQLite.sql new file mode 100644 index 0000000..de8f702 --- /dev/null +++ b/www/dbcreate_SQLite.sql @@ -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 +) diff --git a/www/functions.js b/www/functions_MySQL.js similarity index 78% rename from www/functions.js rename to www/functions_MySQL.js index 7d4f04e..462ac2d 100644 --- a/www/functions.js +++ b/www/functions_MySQL.js @@ -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"}); }; diff --git a/www/functions_SQLite.js b/www/functions_SQLite.js new file mode 100644 index 0000000..5b31cfe --- /dev/null +++ b/www/functions_SQLite.js @@ -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"}); +};