419 lines
15 KiB
CoffeeScript
419 lines
15 KiB
CoffeeScript
# 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 = (pool, callback) ->
|
|
pool.getConnection (err, db)->
|
|
query = 'SELECT * FROM tags WHERE deleted = 0'
|
|
db.query query, (err, rows, fields) ->
|
|
db.release()
|
|
if err
|
|
return callback(err, null)
|
|
console.log err
|
|
else
|
|
return callback(null, rows)
|
|
undefined
|
|
|
|
|
|
exports.getAllTags = (req, res) ->
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'SELECT * FROM tags WHERE deleted = 0'
|
|
db.query query, (err, rows, fields) ->
|
|
if err
|
|
res.json
|
|
status: 'error'
|
|
message: err
|
|
console.log err
|
|
else
|
|
res.json
|
|
status: 'OK'
|
|
tags: rows
|
|
undefined
|
|
|
|
|
|
exports.createTag = (req, res) ->
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'INSERT INTO tags (tag, units, minExpected, maxExpected, name, description, class, guarantee_sec, change_threshold, data_type) VALUES (?, ?, ?, ?, ?, ?, 5, ?, ?, ?)'
|
|
db.query query, [req.body.tag, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.name, req.body.description, req.body.guarantee_sec, req.body.change_threshold, req.body.data_type], (err, results) ->
|
|
if err
|
|
res.json
|
|
status: 'error'
|
|
message: err
|
|
console.log err
|
|
else
|
|
res.json status: 'OK'
|
|
undefined
|
|
|
|
|
|
exports.getTag = (req, res) ->
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'SELECT * FROM tags WHERE id = ?'
|
|
db.query query, [req.params.id], (err, rows) ->
|
|
db.release()
|
|
if err
|
|
res.json
|
|
status: 'error'
|
|
message: err
|
|
console.log err
|
|
else
|
|
res.json
|
|
status: 'OK'
|
|
tags: rows
|
|
undefined
|
|
|
|
|
|
exports.updateTag = (req, res) ->
|
|
console.log(req.body)
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'UPDATE tags set tag = ?, units = ?, minExpected = ?, maxExpected = ?, name = ?, description = ?, guarantee_sec = ?, change_threshold = ?, data_type = ? WHERE id = ?'
|
|
db.query query, [req.body.tag, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.name, req.body.description, req.body.guarantee_sec, req.body.change_threshold, req.body.data_type, req.body.id], (err, results) ->
|
|
db.release()
|
|
if err
|
|
res.json
|
|
status: 'error'
|
|
message: err
|
|
console.log err
|
|
else
|
|
res.json
|
|
status: 'OK'
|
|
undefined
|
|
|
|
exports.deleteTag = (req, res) ->
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'UPDATE tags SET deleted = 1 WHERE id = ?'
|
|
db.query query, [req.params.tag], (err, results) ->
|
|
db.release()
|
|
if err
|
|
res.json
|
|
status: 'error'
|
|
message: err
|
|
console.log err
|
|
else
|
|
res.json
|
|
status: 'OK'
|
|
undefined
|
|
|
|
exports.seriesTagValues = (req, res) ->
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'SELECT * FROM tag_vals WHERE tagID = ? AND dateAdded >= DATE_SUB(NOW(), INTERVAL 1 HOUR)'
|
|
db.query query, [parseInt(req.params.tag)], (err, rows) ->
|
|
db.release()
|
|
if err
|
|
console.log err
|
|
res.json
|
|
status: 'error'
|
|
message: err
|
|
query: query
|
|
else
|
|
res.json
|
|
status: 'OK'
|
|
tag: req.params.tag
|
|
vals: rows
|
|
undefined
|
|
|
|
exports.seriesTagValuesBetween = (req, res) ->
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'SELECT * FROM tag_vals WHERE tagID = ? AND dtime >= ? AND dtime <= ?'
|
|
db.query query, [parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime)], (err, rows) ->
|
|
db.release()
|
|
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
|
|
undefined
|
|
|
|
createCSVrow = (header, dataRow) ->
|
|
i = header.indexOf(dataRow.name)
|
|
csvRow = dataRow.id.toString() + ',' + dataRow.dtime + ','
|
|
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) ->
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'SELECT v.id, t.name, v.val, v.dtime FROM tags t JOIN tag_vals v ON t.id = v.tagID'
|
|
db.query query, (err, rows) ->
|
|
db.release()
|
|
if err
|
|
console.log err
|
|
res.json
|
|
status: 'error'
|
|
message: err
|
|
query: query
|
|
else
|
|
getAllTags req.app.locals.pool, (err, tags) ->
|
|
if err
|
|
console.log err
|
|
else
|
|
csvString = ''
|
|
da = [
|
|
'id'
|
|
'DateAdded'
|
|
]
|
|
tagVanityNames = tags.map((t) ->
|
|
t.name
|
|
)
|
|
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
|
|
undefined
|
|
|
|
exports.seriesCSV = (req, res) ->
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'SELECT v.id, t.name, 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\')'
|
|
db.query query, [parseInt(req.params.tag)], (err, rows) ->
|
|
db.release()
|
|
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
|
|
undefined
|
|
|
|
exports.seriesCSVBetween = (req, res) ->
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'SELECT v.id, t.name, v.val, v.dtime FROM tags t JOIN tag_vals v ON t.id = v.tagID WHERE tagID = ? AND v.dtime >= ? AND v.dtime <= ?'
|
|
db.query query, [parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime)], (err, rows) ->
|
|
db.release()
|
|
if err
|
|
console.log err
|
|
res.json
|
|
status: 'error'
|
|
message: err
|
|
query: query
|
|
else
|
|
csvString = ''
|
|
h = [
|
|
'id'
|
|
'DateAdded'
|
|
rows[0].name
|
|
]
|
|
csvString = csvString + h.join(',') + '\u000d'
|
|
i = 0
|
|
while i < rows.length
|
|
csvString = csvString + [
|
|
rows[i].id
|
|
rows[i].dtime
|
|
rows[i].val
|
|
].join(',') + '\u000d'
|
|
i++
|
|
res.set 'Content-Type', 'text/csv'
|
|
res.set 'Content-Disposition', 'attachment;filename=tagdata.csv'
|
|
res.send csvString
|
|
undefined
|
|
|
|
exports.latestValueSingleTag = (req, res) ->
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'SELECT * FROM tag_vals WHERE id = (SELECT MAX(id) FROM tag_vals WHERE tagID = ?)'
|
|
db.query query, [req.params.tag], (err, rows) ->
|
|
db.release()
|
|
console.log rows
|
|
if err
|
|
res.json
|
|
status: 'error'
|
|
message: err
|
|
console.log err
|
|
else
|
|
res.json
|
|
status: 'OK'
|
|
tag_val: rows[0]
|
|
undefined
|
|
|
|
exports.latestValueAllTags = (req, res) ->
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'SELECT v1.id as id, v1.dtime as dtime, t.id as t_id, t.name as name, t.tag as tag, v1.val as val, t.units as units, t.description as description, t.minExpected as minExpected, t.maxExpected as maxExpected FROM tag_vals v1 LEFT JOIN tags t ON t.id = v1.tagID WHERE v1.id = (SELECT v2.id FROM tag_vals v2 WHERE v2.tagID = v1.tagID ORDER BY v2.id DESC LIMIT 1)'
|
|
db.query query, [req.params.id], (err, rows) ->
|
|
db.release()
|
|
if err
|
|
res.json
|
|
status: 'error'
|
|
message: err
|
|
console.log err
|
|
else
|
|
res.json
|
|
status: 'OK'
|
|
vals: rows
|
|
undefined
|
|
|
|
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) ->
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'SELECT parameter, val, dateAdded FROM config GROUP BY parameter;'
|
|
db.query query, [req.params.id], (err, rows) ->
|
|
db.release()
|
|
if err
|
|
res.json
|
|
status: 'error'
|
|
message: err
|
|
console.log err
|
|
else
|
|
res.json
|
|
status: 'OK'
|
|
config: rows
|
|
undefined
|
|
|
|
exports.updateSetup = (req, res) ->
|
|
exec = require('child_process').exec
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'INSERT INTO config (parameter, val) VALUES (?, ?)';
|
|
db.query query, [req.body.parameter, req.body.val], (err) ->
|
|
db.release()
|
|
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
|
|
), 5000
|
|
undefined
|
|
|
|
exports.clearValues = (req, res) ->
|
|
if req.params.id
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'DELETE FROM tag_vals WHERE tagID = ?;';
|
|
db.query query, [req.params.id], (err) ->
|
|
db.release()
|
|
if err
|
|
res.json
|
|
status: 'error'
|
|
message: err
|
|
console.log err
|
|
else
|
|
res.json
|
|
status: 'OK'
|
|
else
|
|
req.app.locals.pool.getConnection (err, db) ->
|
|
query = 'DELETE FROM tag_vals WHERE id >= 0;';
|
|
db.query query, (err) ->
|
|
db.release()
|
|
if err
|
|
res.json
|
|
status: 'error'
|
|
message: err
|
|
console.log err
|
|
else
|
|
res.json
|
|
status: 'OK'
|
|
undefined
|