Converted to CoffeeScript, data in MySQL
This commit is contained in:
99
www/app.coffee
Normal file
99
www/app.coffee
Normal file
@@ -0,0 +1,99 @@
|
||||
express = require('express')
|
||||
path = require('path')
|
||||
fs = require('fs')
|
||||
logger = require('morgan')
|
||||
methodOverride = require('method-override')
|
||||
bodyParser = require('body-parser')
|
||||
errorHandler = require('errorhandler')
|
||||
app = express()
|
||||
fns = undefined
|
||||
|
||||
app.locals.DB_TYPE = 'MySQL'
|
||||
# or "MySQL"
|
||||
|
||||
###*
|
||||
* Configuration
|
||||
###
|
||||
|
||||
if app.locals.DB_TYPE == 'MySQL'
|
||||
fns = require('./functions_MySQL.coffee')
|
||||
mysql = require('mysql')
|
||||
db_config =
|
||||
host: 'localhost'
|
||||
user: 'website'
|
||||
password: 'henrypump'
|
||||
database: 'poconsole'
|
||||
app.locals.pool = mysql.createPool(db_config)
|
||||
|
||||
handleDisconnect = ->
|
||||
console.log 'Handling db disconnect gracefully'
|
||||
app.locals.db = mysql.createConnection(db_config)
|
||||
app.locals.db.connect (err) ->
|
||||
if err
|
||||
console.log 'error when connecting to db:', err
|
||||
setTimeout handleDisconnect, 2000
|
||||
return
|
||||
app.locals.db.on 'error', (err) ->
|
||||
console.log 'db error', err
|
||||
if err.code == 'PROTOCOL_CONNECTION_LOST'
|
||||
handleDisconnect()
|
||||
else
|
||||
throw err
|
||||
return
|
||||
return
|
||||
handleDisconnect()
|
||||
else
|
||||
fns = require('./functions_SQLite.coffee')
|
||||
|
||||
app.set 'port', process.env.PORT or 80
|
||||
app.set 'views', path.join(__dirname, 'views')
|
||||
app.engine '.html', require('ejs').renderFile
|
||||
app.set 'view engine', 'html'
|
||||
#app.use(favicon(__dirname + '/public/img/favicon.ico'));
|
||||
app.use logger('dev')
|
||||
app.use methodOverride()
|
||||
app.use bodyParser.json()
|
||||
app.use bodyParser.urlencoded(extended: true)
|
||||
#app.use(express["static"](path.join(__dirname, 'public')));
|
||||
app.use express.static(__dirname + '/public')
|
||||
app.use '/bower_components', express.static(__dirname + '/bower_components')
|
||||
app.use '/node_modules', express.static(__dirname + '/node_modules')
|
||||
|
||||
###*
|
||||
* Routes
|
||||
###
|
||||
|
||||
angular = (req, res) ->
|
||||
res.render 'angularIndex'
|
||||
return
|
||||
|
||||
app.post '/json/tag/add', fns.createTag # Adds a tag to the scan list
|
||||
app.post '/json/tag/update/', fns.updateTag # Updates tag data
|
||||
app.get '/json/tag/delete/:tag', fns.deleteTag # Removes a tag from the scan list
|
||||
app.get '/json/tag/:id', fns.getTag # Gets a specific tag in the scan list
|
||||
app.get '/json/tag', fns.getAllTags # Lists all tags in the scan list
|
||||
app.get '/json/val/:tag', fns.latestValueSingleTag # 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/valBetween/:tag/:startDatetime/:endDatetime', fns.seriesTagValuesBetween # Gets the values of a tag between the start time and end time
|
||||
app.get '/json/CSV/all', fns.allDataCSV # Gets a CSV of all values stored
|
||||
app.get '/json/CSV/:tag/:startDatetime/:endDatetime', fns.seriesCSVBetween # Gets a CSV of the values of a tag between the start time and end time
|
||||
app.get '/json/CSV/:tag/:hours', fns.seriesCSV # Gets a CSV of the values of a tag for the last x hours
|
||||
app.get '/json/all', fns.latestValueAllTags # Gets the latest values of all tags in the scan list
|
||||
app.get '/json/config', fns.getSetup # Gets the contents of the config table
|
||||
app.post '/json/config', fns.updateSetup # Adds a new parameter to the config table
|
||||
app.get '/json/logger/status', fns.checkLoggerStatus # Gets the status of the data logger
|
||||
app.get '/json/logger/restart', fns.restartLogger # Restarts the data logger
|
||||
app.get '*', angular
|
||||
|
||||
###*
|
||||
* Start Server
|
||||
###
|
||||
|
||||
connectionsArray = []
|
||||
s_port = 3000
|
||||
server = app.listen(s_port, ->
|
||||
host = server.address().address
|
||||
port = server.address().port
|
||||
console.log 'POConsole listening at http://%s:%s', host, port
|
||||
return
|
||||
)
|
||||
@@ -8,13 +8,17 @@ CREATE TABLE IF NOT EXISTS poconsole.tag_classes(
|
||||
|
||||
CREATE TABLE IF NOT EXISTS poconsole.tags(
|
||||
id int(11) NOT NULL AUTO_INCREMENT,
|
||||
name TEXT,
|
||||
name varchar(128),
|
||||
class int(11),
|
||||
tag varchar(128),
|
||||
description varchar(128),
|
||||
data_type varchar(32),
|
||||
change_threshold float,
|
||||
guarantee_sec integer(11),
|
||||
map_function varchar(64),
|
||||
units varchar(64),
|
||||
minExpected varchar(64),
|
||||
maxExpected varchar(64),
|
||||
deleted INT NULL DEFAULT 0,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
@@ -23,7 +27,7 @@ CREATE TABLE IF NOT EXISTS poconsole.tags(
|
||||
CREATE TABLE IF NOT EXISTS poconsole.tag_vals(
|
||||
id int(11) NOT NULL AUTO_INCREMENT,
|
||||
dtime datetime,
|
||||
name varchar(128),
|
||||
tagID int,
|
||||
val float,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
CREATE TABLE IF NOT EXISTS tags (
|
||||
id INTEGER PRIMARY KEY,
|
||||
tagName TEXT,
|
||||
vanityName TEXT,
|
||||
tag TEXT,
|
||||
name TEXT,
|
||||
description TEXT,
|
||||
units TEXT,
|
||||
minExpected REAL,
|
||||
|
||||
380
www/functions_MySQL.coffee
Normal file
380
www/functions_MySQL.coffee
Normal file
@@ -0,0 +1,380 @@
|
||||
# var dbFile = "/usr/db/data.db";
|
||||
dbFile = '/mnt/usb/data.db'
|
||||
# var dbFile = '/Users/patrickjmcd/data.db';
|
||||
|
||||
|
||||
dString_to_sqlite = (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
|
||||
###
|
||||
|
||||
re = /(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})/
|
||||
fd = re.exec(dString)
|
||||
if fd
|
||||
sqliteString = ''
|
||||
sqliteString.concat fd[1], '-', fd[2], '-', fd[3], ' ', fd[4], ':', fd[5], ':', fd[6]
|
||||
else
|
||||
null
|
||||
|
||||
|
||||
sqlite_to_dString = (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
|
||||
###
|
||||
|
||||
re = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/
|
||||
fd = re.exec(sqliteDate)
|
||||
if fd
|
||||
dString = ''
|
||||
dString.concat fd[1], fd[2], fd[3], '_', fd[4], fd[5], fd[6]
|
||||
else
|
||||
null
|
||||
|
||||
|
||||
getAllTags = (callback) ->
|
||||
query = 'SELECT * FROM tags WHERE deleted = 0'
|
||||
req.app.locals.db.query query, (err, rows, fields) ->
|
||||
if err
|
||||
return callback(err, null)
|
||||
console.log err
|
||||
else
|
||||
return callback(null, rows)
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
exports.getAllTags = (req, res) ->
|
||||
query = 'SELECT * FROM tags WHERE deleted = 0'
|
||||
req.app.locals.db.query query, (err, rows, fields) ->
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
tags: rows
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
exports.createTag = (req, res) ->
|
||||
query = 'INSERT INTO tags (tagName, units, minExpected, maxExpected, vanityName, description) VALUES (?, ?, ?, ?, ?, ?)'
|
||||
req.app.locals.db.query query, [req.body.tagName, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.vanityName, req.body.description], (err, results) ->
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json status: 'OK'
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
exports.getTag = (req, res) ->
|
||||
query = 'SELECT * FROM tags WHERE id = ?'
|
||||
req.app.locals.db.query query, [req.params.id], (err, rows) ->
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
tags: rows
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
exports.updateTag = (req, res) ->
|
||||
query = 'UPDATE tags set tagName = ?, units = ?, minExpected = ?, maxExpected = ?, vanityName = ?, description = ? WHERE id = ?'
|
||||
req.app.locals.db.query query, [req.body.tagName, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.vanityName, req.body.description, req.body.id], (err, results) ->
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
return
|
||||
return
|
||||
|
||||
exports.deleteTag = (req, res) ->
|
||||
query = 'UPDATE tags SET deleted = 1 WHERE id = ?'
|
||||
req.app.locals.db.query query, [req.params.tag], (err, results) ->
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
return
|
||||
return
|
||||
|
||||
exports.seriesTagValues = (req, res) ->
|
||||
query = 'SELECT * FROM tag_vals WHERE tagID = ? AND dateAdded >= DATE_SUB(NOW(), INTERVAL 1 HOUR)'
|
||||
req.app.locals.db.query query, [parseInt(req.params.tag)], (err, rows) ->
|
||||
if err
|
||||
console.log err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
query: query
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
tag: req.params.tag
|
||||
vals: rows
|
||||
return
|
||||
return
|
||||
|
||||
exports.seriesTagValuesBetween = (req, res) ->
|
||||
query = 'SELECT * FROM tag_vals WHERE tagID = ? AND dtime >= ? AND dtime <= ?'
|
||||
req.app.locals.db.query query, [parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime)], (err, rows) ->
|
||||
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
|
||||
return
|
||||
return
|
||||
|
||||
createCSVrow = (header, dataRow) ->
|
||||
i = header.indexOf(dataRow.vanityName)
|
||||
csvRow = dataRow.id.toString() + ',' + dataRow.dateAdded + ','
|
||||
if i >= 0
|
||||
j = 2
|
||||
while j < header.length
|
||||
if j == i
|
||||
csvRow = csvRow + dataRow.val.toString() + ','
|
||||
else
|
||||
csvRow = csvRow + ','
|
||||
j++
|
||||
csvRow = csvRow.slice(0, -1) + '\u000d'
|
||||
return csvRow
|
||||
return
|
||||
|
||||
exports.allDataCSV = (req, res) ->
|
||||
query = 'SELECT v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN tag_vals v ON t.id = v.tagID'
|
||||
req.app.locals.db.query query, (err, rows) ->
|
||||
if err
|
||||
console.log err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
query: query
|
||||
else
|
||||
getAllTags (err, tags) ->
|
||||
if err
|
||||
console.log err
|
||||
else
|
||||
csvString = ''
|
||||
da = [
|
||||
'id'
|
||||
'DateAdded'
|
||||
]
|
||||
tagVanityNames = tags.map((t) ->
|
||||
t.vanityName
|
||||
)
|
||||
h = da.concat(tagVanityNames)
|
||||
console.log h
|
||||
csvString = csvString + h.join(',') + '\u000d'
|
||||
i = 0
|
||||
while i < rows.length
|
||||
csvString = csvString + createCSVrow(h, rows[i])
|
||||
i++
|
||||
res.set 'Content-Type', 'text/csv'
|
||||
res.set 'Content-Disposition', 'attachment;filename=tagdata.csv'
|
||||
res.send csvString
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
exports.seriesCSV = (req, res) ->
|
||||
query = 'SELECT v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN tag_vals v ON t.id = v.tagID WHERE tagID = ? AND v.dateAdded > DATETIME(\'now\', \'-1 HOUR\')'
|
||||
req.app.locals.db.query query, [parseInt(req.params.tag)], (err, rows) ->
|
||||
if err
|
||||
console.log err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
query: query
|
||||
else
|
||||
csvString = ''
|
||||
h = [
|
||||
'id'
|
||||
'DateAdded'
|
||||
rows[0].vanityName
|
||||
]
|
||||
csvString = csvString + h.join(',') + '\u000d'
|
||||
i = 0
|
||||
while i < rows.length
|
||||
csvString = csvString + [
|
||||
rows[i].id
|
||||
rows[i].dateAdded
|
||||
rows[i].val
|
||||
].join(',') + '\u000d'
|
||||
i++
|
||||
res.set 'Content-Type', 'text/csv'
|
||||
res.set 'Content-Disposition', 'attachment;filename=tagdata.csv'
|
||||
res.send csvString
|
||||
return
|
||||
return
|
||||
|
||||
exports.seriesCSVBetween = (req, res) ->
|
||||
query = 'SELECT v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN tag_vals v ON t.id = v.tagID WHERE tagID = ? AND dateAdded >= DATETIME(?) AND dateAdded <= DATETIME(?)'
|
||||
req.app.locals.db.query query, [parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime)], (err, rows) ->
|
||||
if err
|
||||
console.log err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
query: query
|
||||
else
|
||||
csvString = ''
|
||||
h = [
|
||||
'id'
|
||||
'DateAdded'
|
||||
rows[0].vanityName
|
||||
]
|
||||
csvString = csvString + h.join(',') + '\u000d'
|
||||
i = 0
|
||||
while i < rows.length
|
||||
csvString = csvString + [
|
||||
rows[i].id
|
||||
rows[i].dateAdded
|
||||
rows[i].val
|
||||
].join(',') + '\u000d'
|
||||
i++
|
||||
res.set 'Content-Type', 'text/csv'
|
||||
res.set 'Content-Disposition', 'attachment;filename=tagdata.csv'
|
||||
res.send csvString
|
||||
return
|
||||
return
|
||||
|
||||
exports.latestValueSingleTag = (req, res) ->
|
||||
query = 'SELECT * FROM tag_vals WHERE id = (SELECT MAX(id) FROM tag_vals WHERE tagID = ?)'
|
||||
req.app.locals.db.query query, [req.params.tag], (err, rows) ->
|
||||
console.log rows
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
tag_val: rows[0]
|
||||
return
|
||||
return
|
||||
|
||||
exports.latestValueAllTags = (req, res) ->
|
||||
query = 'SELECT t.tag as tagName, t.name as vanityName, 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.dtime as dtime FROM tag_vals v JOIN tags t ON v.tagID = t.id WHERE t.deleted = 0 GROUP BY v.tagID'
|
||||
req.app.locals.db.query query, [req.params.id], (err, rows) ->
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
vals: rows
|
||||
return
|
||||
return
|
||||
|
||||
exports.checkLoggerStatus = (req, res) ->
|
||||
fs = require('fs')
|
||||
# var ps = require("ps-node");
|
||||
running = require('is-running')
|
||||
fs.readFile '/root/tagserver.pid', (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)
|
||||
return
|
||||
return
|
||||
|
||||
exports.restartLogger = (req, res) ->
|
||||
exec = require('child_process').exec
|
||||
exec '/etc/init.d/loggers start', (error, stdout, stderr) ->
|
||||
if error
|
||||
res.json
|
||||
status: 'error'
|
||||
message: error
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
return
|
||||
return
|
||||
|
||||
exports.getSetup = (req, res) ->
|
||||
query = 'SELECT parameter, val, dateAdded FROM config GROUP BY parameter;'
|
||||
req.app.locals.db.query query, [req.params.id], (err, rows) ->
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
config: rows
|
||||
return
|
||||
return
|
||||
|
||||
exports.updateSetup = (req, res) ->
|
||||
exec = require('child_process').exec
|
||||
query = 'INSERT INTO config (parameter, val) VALUES (?, ?)';
|
||||
req.app.locals.db.query query, [req.body.parameter, req.body.val], (err) ->
|
||||
if err
|
||||
console.log runErr: err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
query: query
|
||||
else
|
||||
res.redirect '/#/setup'
|
||||
exec '/etc/init.d/loggers stop', (error, stdout, stderr) ->
|
||||
if error
|
||||
console.log
|
||||
status: 'error'
|
||||
message: error
|
||||
query: query
|
||||
setTimeout (->
|
||||
exec '/etc/init.d/loggers start', (error, stdout, stderr) ->
|
||||
if error
|
||||
console.log
|
||||
status: 'error'
|
||||
message: error
|
||||
query: query
|
||||
return
|
||||
return
|
||||
), 5000
|
||||
return
|
||||
return
|
||||
return
|
||||
return
|
||||
@@ -76,5 +76,5 @@ exports.allTags = function(req, res){
|
||||
};
|
||||
|
||||
exports.allValues = function(req, res){
|
||||
res.json(status:"error", message:"not implemented"});
|
||||
res.json({status:"error", message:"not implemented"});
|
||||
};
|
||||
|
||||
482
www/functions_SQLite.coffee
Normal file
482
www/functions_SQLite.coffee
Normal file
@@ -0,0 +1,482 @@
|
||||
# var dbFile = "/usr/db/data.db";
|
||||
dbFile = '/mnt/usb/data.db'
|
||||
# var dbFile = '/Users/patrickjmcd/data.db';
|
||||
|
||||
|
||||
dString_to_sqlite = (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
|
||||
###
|
||||
|
||||
re = /(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})/
|
||||
fd = re.exec(dString)
|
||||
if fd
|
||||
sqliteString = ''
|
||||
sqliteString.concat fd[1], '-', fd[2], '-', fd[3], ' ', fd[4], ':', fd[5], ':', fd[6]
|
||||
else
|
||||
null
|
||||
|
||||
|
||||
sqlite_to_dString = (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
|
||||
###
|
||||
|
||||
re = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/
|
||||
fd = re.exec(sqliteDate)
|
||||
if fd
|
||||
dString = ''
|
||||
dString.concat fd[1], fd[2], fd[3], '_', fd[4], fd[5], fd[6]
|
||||
else
|
||||
null
|
||||
|
||||
|
||||
getAllTags = (callback) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
db.serialize ->
|
||||
query = 'SELECT * FROM tags WHERE deleted = 0'
|
||||
prepQuery = db.prepare(query)
|
||||
prepQuery.all (err, rows) ->
|
||||
prepQuery.finalize()
|
||||
db.close()
|
||||
if err
|
||||
return callback(err, null)
|
||||
console.log err
|
||||
else
|
||||
return callback(null, rows)
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
exports.getAllTags = (req, res) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
db.serialize ->
|
||||
query = 'SELECT * FROM tags WHERE deleted = 0'
|
||||
prepQuery = db.prepare(query)
|
||||
prepQuery.all (err, rows) ->
|
||||
prepQuery.finalize()
|
||||
db.close()
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
tags: rows
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
exports.createTag = (req, res) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
db.serialize ->
|
||||
query = 'INSERT INTO tags (tagName, units, minExpected, maxExpected, vanityName, description) VALUES (?, ?, ?, ?, ?, ?)'
|
||||
prepQuery = db.prepare(query)
|
||||
prepQuery.run req.body.tagName, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.vanityName, req.body.description, (err) ->
|
||||
prepQuery.finalize()
|
||||
db.close()
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json status: 'OK'
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
exports.getTag = (req, res) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
db.serialize ->
|
||||
query = 'SELECT * FROM tags WHERE id = ?'
|
||||
prepQuery = db.prepare(query)
|
||||
prepQuery.all req.params.id, (err, rows) ->
|
||||
prepQuery.finalize()
|
||||
db.close()
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
tags: rows
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
exports.updateTag = (req, res) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
db.serialize ->
|
||||
query = 'UPDATE tags set tagName = ?, units = ?, minExpected = ?, maxExpected = ?, vanityName = ?, description = ? WHERE id = ?'
|
||||
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, (err) ->
|
||||
prepQuery.finalize()
|
||||
db.close()
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
exports.deleteTag = (req, res) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
db.serialize ->
|
||||
query = 'UPDATE tags SET deleted = 1 WHERE id = ?'
|
||||
prepQuery = db.prepare(query)
|
||||
prepQuery.run req.params.tag, (err) ->
|
||||
prepQuery.finalize()
|
||||
db.close()
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
exports.seriesTagValues = (req, res) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
db.serialize ->
|
||||
query = 'SELECT * FROM vals WHERE tagID = ? AND dateAdded > DATETIME(\'now\', \'-1 HOUR\')'
|
||||
prepQuery = db.prepare(query)
|
||||
prepQuery.all parseInt(req.params.tag), (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
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
exports.seriesTagValuesBetween = (req, res) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
db.serialize ->
|
||||
query = 'SELECT * FROM vals WHERE tagID = ? AND dateAdded >= DATETIME(?) AND dateAdded <= DATETIME(?)'
|
||||
prepQuery = db.prepare(query)
|
||||
prepQuery.all parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime), (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
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
createCSVrow = (header, dataRow) ->
|
||||
i = header.indexOf(dataRow.vanityName)
|
||||
csvRow = dataRow.id.toString() + ',' + dataRow.dateAdded + ','
|
||||
if i >= 0
|
||||
j = 2
|
||||
while j < header.length
|
||||
if j == i
|
||||
csvRow = csvRow + dataRow.val.toString() + ','
|
||||
else
|
||||
csvRow = csvRow + ','
|
||||
j++
|
||||
csvRow = csvRow.slice(0, -1) + '\u000d'
|
||||
return csvRow
|
||||
return
|
||||
|
||||
exports.allDataCSV = (req, res) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
db.serialize ->
|
||||
query = 'SELECT v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN vals v ON t.id = v.tagID'
|
||||
prepQuery = db.prepare(query)
|
||||
prepQuery.all (err, rows) ->
|
||||
prepQuery.finalize()
|
||||
db.close()
|
||||
if err
|
||||
console.log err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
query: query
|
||||
else
|
||||
getAllTags (err, tags) ->
|
||||
if err
|
||||
console.log err
|
||||
else
|
||||
csvString = ''
|
||||
da = [
|
||||
'id'
|
||||
'DateAdded'
|
||||
]
|
||||
tagVanityNames = tags.map((t) ->
|
||||
t.vanityName
|
||||
)
|
||||
h = da.concat(tagVanityNames)
|
||||
console.log h
|
||||
csvString = csvString + h.join(',') + '\u000d'
|
||||
i = 0
|
||||
while i < rows.length
|
||||
csvString = csvString + createCSVrow(h, rows[i])
|
||||
i++
|
||||
res.set 'Content-Type', 'text/csv'
|
||||
res.set 'Content-Disposition', 'attachment;filename=tagdata.csv'
|
||||
res.send csvString
|
||||
return
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
exports.seriesCSV = (req, res) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
db.serialize ->
|
||||
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\')'
|
||||
prepQuery = db.prepare(query)
|
||||
prepQuery.all parseInt(req.params.tag), (err, rows) ->
|
||||
prepQuery.finalize()
|
||||
db.close()
|
||||
if err
|
||||
console.log err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
query: query
|
||||
else
|
||||
csvString = ''
|
||||
h = [
|
||||
'id'
|
||||
'DateAdded'
|
||||
rows[0].vanityName
|
||||
]
|
||||
csvString = csvString + h.join(',') + '\u000d'
|
||||
i = 0
|
||||
while i < rows.length
|
||||
csvString = csvString + [
|
||||
rows[i].id
|
||||
rows[i].dateAdded
|
||||
rows[i].val
|
||||
].join(',') + '\u000d'
|
||||
i++
|
||||
res.set 'Content-Type', 'text/csv'
|
||||
res.set 'Content-Disposition', 'attachment;filename=tagdata.csv'
|
||||
res.send csvString
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
exports.seriesCSVBetween = (req, res) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
db.serialize ->
|
||||
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(?)'
|
||||
prepQuery = db.prepare(query)
|
||||
prepQuery.all parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime), (err, rows) ->
|
||||
prepQuery.finalize()
|
||||
db.close()
|
||||
if err
|
||||
console.log err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
query: query
|
||||
else
|
||||
csvString = ''
|
||||
h = [
|
||||
'id'
|
||||
'DateAdded'
|
||||
rows[0].vanityName
|
||||
]
|
||||
csvString = csvString + h.join(',') + '\u000d'
|
||||
i = 0
|
||||
while i < rows.length
|
||||
csvString = csvString + [
|
||||
rows[i].id
|
||||
rows[i].dateAdded
|
||||
rows[i].val
|
||||
].join(',') + '\u000d'
|
||||
i++
|
||||
res.set 'Content-Type', 'text/csv'
|
||||
res.set 'Content-Disposition', 'attachment;filename=tagdata.csv'
|
||||
res.send csvString
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
exports.latestValueSingleTag = (req, res) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
db.serialize ->
|
||||
query = 'SELECT * FROM vals WHERE id = (SELECT MAX(id) FROM vals WHERE tagID = ?)'
|
||||
prepQuery = db.prepare(query)
|
||||
prepQuery.all req.params.tag, (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]
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
exports.latestValueAllTags = (req, res) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
db.serialize ->
|
||||
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'
|
||||
prepQuery = db.prepare(query)
|
||||
prepQuery.all req.params.id, (err, rows) ->
|
||||
prepQuery.finalize()
|
||||
db.close()
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
vals: rows
|
||||
return
|
||||
return
|
||||
return
|
||||
|
||||
exports.checkLoggerStatus = (req, res) ->
|
||||
fs = require('fs')
|
||||
# var ps = require("ps-node");
|
||||
running = require('is-running')
|
||||
fs.readFile '/root/tagserver.pid', (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)
|
||||
return
|
||||
return
|
||||
|
||||
exports.restartLogger = (req, res) ->
|
||||
exec = require('child_process').exec
|
||||
exec '/etc/init.d/loggers start', (error, stdout, stderr) ->
|
||||
if error
|
||||
res.json
|
||||
status: 'error'
|
||||
message: error
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
return
|
||||
return
|
||||
|
||||
exports.getSetup = (req, res) ->
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
query = 'SELECT parameter, val, dateAdded FROM config GROUP BY parameter;'
|
||||
prepQuery = db.prepare(query)
|
||||
prepQuery.all req.params.id, (err, rows) ->
|
||||
prepQuery.finalize()
|
||||
db.close()
|
||||
if err
|
||||
res.json
|
||||
status: 'error'
|
||||
message: err
|
||||
console.log err
|
||||
else
|
||||
res.json
|
||||
status: 'OK'
|
||||
config: rows
|
||||
return
|
||||
return
|
||||
|
||||
exports.updateSetup = (req, res) ->
|
||||
exec = require('child_process').exec
|
||||
sqlite3 = require('sqlite3').verbose()
|
||||
db = new (sqlite3.Database)(dbFile)
|
||||
console.log req.body.parameter, req.body.val
|
||||
db.serialize ->
|
||||
query = db.prepare('INSERT INTO config (parameter, val) VALUES (?, ?)')
|
||||
query.run req.body.parameter, req.body.val, (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', (error, stdout, stderr) ->
|
||||
if error
|
||||
console.log
|
||||
status: 'error'
|
||||
message: error
|
||||
query: query
|
||||
setTimeout (->
|
||||
exec '/etc/init.d/loggers start', (error, stdout, stderr) ->
|
||||
if error
|
||||
console.log
|
||||
status: 'error'
|
||||
message: error
|
||||
query: query
|
||||
return
|
||||
return
|
||||
), 5000
|
||||
return
|
||||
return
|
||||
return
|
||||
return
|
||||
@@ -14,7 +14,8 @@
|
||||
"serve-favicon": "*",
|
||||
"sqlite3": "*",
|
||||
"n3-charts": "*",
|
||||
"is-running": "*"
|
||||
"is-running": "*",
|
||||
"coffee-script": "*"
|
||||
},
|
||||
"devDependencies": {},
|
||||
"scripts": {
|
||||
|
||||
@@ -9,12 +9,12 @@
|
||||
<div class="well" ng-if="message"><h3 class="text-danger">{{message}}</h3></div>
|
||||
<form>
|
||||
<div class="form-group">
|
||||
<label for="tagName">Tag Name</label>
|
||||
<input type="text" ng-model="newTag.tagName" class="form-control" id="tagName" placeholder="Tag Name Here">
|
||||
<label for="tag">Tag</label>
|
||||
<input type="text" ng-model="newTag.tag" class="form-control" id="tag" placeholder="Tag Name Here">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="vanityName">Vanity Name</label>
|
||||
<input type="text" ng-model="newTag.vanityName" class="form-control" id="vanityName" placeholder="Vanity Name Here">
|
||||
<label for="name">Name</label>
|
||||
<input type="text" ng-model="newTag.name" class="form-control" id="name" placeholder="Vanity Name Here">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="description">Description</label>
|
||||
@@ -53,12 +53,12 @@
|
||||
<div class="well" ng-if="message"><h3 class="text-danger">{{message}}</h3></div>
|
||||
<form>
|
||||
<div class="form-group">
|
||||
<label for="tagName">Tag Name</label>
|
||||
<input type="text" ng-model="editTag.tagName" class="form-control" id="tagName" placeholder="Tag Name Here">
|
||||
<label for="tag">Tag Name</label>
|
||||
<input type="text" ng-model="editTag.tag" class="form-control" id="tag" placeholder="Tag Name Here">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="vanityName">Vanity Name</label>
|
||||
<input type="text" ng-model="editTag.vanityName" class="form-control" id="vanityName" placeholder="Vanity Name Here">
|
||||
<label for="name">Vanity Name</label>
|
||||
<input type="text" ng-model="editTag.name" class="form-control" id="name" placeholder="Vanity Name Here">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="description">Description</label>
|
||||
@@ -96,7 +96,7 @@
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="well" ng-if="message"><h3 class="text-danger">{{message}}</h3></div>
|
||||
<h3>Are you sure you want to delete the tag {{dTag.vanityName}} ({{dTag.tagName}})?</h3>
|
||||
<h3>Are you sure you want to delete the tag {{dTag.name}} ({{dTag.tag}})?</h3>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-primary" data-dismiss="modal">NO!!!!!!</button>
|
||||
@@ -146,7 +146,7 @@
|
||||
<tbody>
|
||||
<tr ng-repeat="tag in tags">
|
||||
<td>{{tag.id}}</td>
|
||||
<td><a href="/#/tag/{{tag.id}}">{{tag.vanityName}}</a> <i class="fa fa-info-circle" data-toggle="popover" title="{{tag.vanityName}}" data-content="Tag Name: {{tag.tagName}} </br>Details: {{tag.description}}"></i></td>
|
||||
<td><a href="/#/tag/{{tag.id}}">{{tag.name}}</a> <i class="fa fa-info-circle" data-toggle="popover" title="{{tag.name}}" data-content="Tag Name: {{tag.tag}} </br>Details: {{tag.description}}"></i></td>
|
||||
<td>{{tag.minExpected}}</td>
|
||||
<td>{{tag.maxExpected}}</td>
|
||||
<td>{{tag.units}}</td>
|
||||
@@ -167,6 +167,3 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user