From 81f0222ff6735a3d2328a952f9fb77f86b62a1cf Mon Sep 17 00:00:00 2001 From: Martin Donnelly Date: Sun, 13 Nov 2016 22:21:18 +0000 Subject: [PATCH] bus system --- index.js | 4 +- lib/mqtt/mqttClient.js | 208 +++++++++++++++++++------------------ lib/server/db-connector.js | 24 +++++ lib/server/db-mdot.js | 125 ++++++++++++++++++++++ lib/server/db-meeting.js | 53 ++++++++++ lib/server/db-save.js | 154 +++++++++++++++++++++++++++ lib/server/db-track.js | 84 +++++++++++++++ package.json | 51 +++++---- server/create_meeting.sql | 33 ++++++ server/dbconfig.js | 55 ++++++++++ server/insert_track.sql | 53 ++++++++++ server/restore_meeting.sql | 114 ++++++++++++++++++++ 12 files changed, 837 insertions(+), 121 deletions(-) create mode 100644 lib/server/db-connector.js create mode 100644 lib/server/db-mdot.js create mode 100644 lib/server/db-meeting.js create mode 100644 lib/server/db-save.js create mode 100644 lib/server/db-track.js create mode 100644 server/create_meeting.sql create mode 100644 server/dbconfig.js create mode 100644 server/insert_track.sql create mode 100644 server/restore_meeting.sql diff --git a/index.js b/index.js index 0b11851..da3dfda 100644 --- a/index.js +++ b/index.js @@ -10,7 +10,7 @@ var busEmitter = new EventEmitter(); var mqttClient = require('./lib/mqtt/mqttClient'); -var mqttConnect = require('./lib/mqtt/mqttConnect'); +//var mqttConnect = require('./lib/mqtt/mqttConnect'); var mqtt = new mqttClient.mqttClient(); @@ -23,8 +23,10 @@ mqttConnect.doConnection(); mqttConnect.connectWS(); */ +/* setTimeout(function(){ 'use strict'; mqtt.lightsIn(); },15000); +*/ diff --git a/lib/mqtt/mqttClient.js b/lib/mqtt/mqttClient.js index 58deb20..7ecc4f6 100644 --- a/lib/mqtt/mqttClient.js +++ b/lib/mqtt/mqttClient.js @@ -5,6 +5,8 @@ var logger = require('log4js').getLogger(); var EventEmitter = require('events'); +// var db = require('../server/db-connector').dbConnection; + //var nano = require('nano')('http://martind2000:1V3D4m526i@localhost:5984'); //var nano = require('nano')('http://localhost:5984'); var busEmitter = new EventEmitter(); @@ -12,132 +14,136 @@ var busEmitter = new EventEmitter(); var db_name = 'mqtt'; //var dbCouch = nano.use(db_name); +var bus = Minibus.create(); + +bus.on('send', function (mode) { + var url = ['https://maker.ifttt.com/trigger/', mode, '/with/key/cWvECkeiyAPwmiOPBkXL2D'].join(''); + + request(url, function (error, response, body) { + if (!error && response.statusCode === 200) { + console.log(body); + } + }); + }); + +var mqttClient = function () { + + var orgId = ''; + var userName = ''; + var appKey = 'bob'; + + this.livingRoom = { + temp: 0, + last: 0 + }; + var mode = 'FanOff'; + var d = new Date(); + this.lastMsg = d.getTime(); -var mqttClient = function() { - - var orgId = ''; - var userName = ''; - var appKey = 'bob'; - this.livingRoom = { - temp: 0, - last: 0 - }; - var mode = 'FanOff'; - -var d = new Date(); -this.lastMsg = d.getTime(); - - - this.fanTimer = function() { - 'use strict'; - var now = new Date; - var mod = 900000 - (now.getTime() % 900000); + this.fanTimer = function () { + 'use strict'; + var now = new Date; + var mod = 900000 - (now.getTime() % 900000); // var - if (mode === 'FanOff') { -console.log('Fans off, temp should be <= 19.5'); - mode = (parseFloat(this.livingRoom.temp) <= 19.5) ? 'FanOn' : 'FanOff'; - } else { -console.log('Fans on, temp should not be less than 21.5'); - mode = (parseFloat(this.livingRoom.temp) <= 21.5) ? 'FanOn' : 'FanOff'; - } + if (mode === 'FanOff') { + console.log('Fans off, temp should be <= 19.5'); + mode = (parseFloat(this.livingRoom.temp) <= 19.5) ? 'FanOn' : 'FanOff'; + } else { + console.log('Fans on, temp should not be less than 22.5'); + mode = (parseFloat(this.livingRoom.temp) <= 22.5) ? 'FanOn' : 'FanOff'; + } -var n = new Date(); -n = n.getTime() - this.lastMsg; - console.log('Last msg',n); + var n = new Date(); + n = n.getTime() - this.lastMsg; + console.log('Last msg', n); - if (n >= 600000) { -console.error('No message received for over 10 minutes'); - mode = 'FanOff'; - } + if (n >= 600000) { + console.error('No message received for over 10 minutes'); + mode = 'FanOff'; + } - var url = ['https://maker.ifttt.com/trigger/',mode,'/with/key/cWvECkeiyAPwmiOPBkXL2D'].join(''); + logger.info('LR temp:', this.livingRoom.temp); + bus.emit('send', mode); - logger.info('LR temp:', this.livingRoom.temp); - - request(url, function(error, response, body) { - if (!error && response.statusCode === 200) { - console.log(body); - } - }); - - - setTimeout(this.fanTimer.bind(this),mod + 10); - }; - - this.lighting = 'lights'; - - this.connected = false; - - var options = { - keepalive: 3600, - clientId: 'a:' + orgId + ':' + Date.now(), - username: userName, - password: new Buffer(appKey) - - }; - - this.client = mqtt.connect('mqtt://' + orgId + 'silvrtree.co.uk', options); - - this.client.on('connect', function() { - connected = true; - logger.info('Connected to SIlvr Broker'); - this.fanTimer(); - }.bind(this)); - - this.client.subscribe('livingroomTemp'); - this.client.on('message', function(topic, message) { - - var json = JSON.parse(message.toString()); - logger.debug(json); - logger.debug(json.temp); - - this.livingRoom.temp = parseFloat(json.temp); -var d = new Date(); -this.lastMsg = d.getTime(); - - }.bind(this)); - - this.isConnected = function() { - return this.connected; - }; + setTimeout(this.fanTimer.bind(this), mod + 10); + }; + this.lighting = 'lights'; + this.connected = false; + var options = { + keepalive: 3600, + clientId: 'a:' + orgId + ':' + Date.now(), + username: userName, + password: new Buffer(appKey) }; -/* -Client = mqtt.connect(); + this.client = mqtt.connect('mqtt://' + orgId + 'silvrtree.co.uk', options); -client.subscribe('presence'); -client.on('message', function(topic, message) { - console.log(message); -}); + this.client.on('connect', function () { + connected = true; + logger.info('Connected to SIlvr Broker'); + this.fanTimer(); + }.bind(this)); + + this.client.subscribe('livingroomTemp'); + + this.client.on('message', function (topic, message) { + + var json = JSON.parse(message.toString()); + logger.debug(json); + logger.debug(json.temp); + + this.livingRoom.temp = parseFloat(json.temp); + + if (this.livingRoom.temp >= 23) { + bus.emit('send', 'FanOff'); + } + var d = new Date(); + this.lastMsg = d.getTime(); + + }.bind(this)); + + this.isConnected = function () { + return this.connected; + }; + + +}; + +/* + Client = mqtt.connect(); + + client.subscribe('presence'); + client.on('message', function(topic, message) { + console.log(message); + }); */ +mqttClient.prototype.lightsIn = function () { -mqttClient.prototype.lightsIn = function() { + var destinationName = 'lightsIn'; + this.client.publish(destinationName, '0'); + var destinationName = 'lightsIn'; + this.client.publish(destinationName, '1'); +}; - var destinationName = 'lightsIn'; - this.client.publish(destinationName, '0'); - var destinationName = 'lightsIn'; - this.client.publish(destinationName, '1'); - }; +mqttClient.prototype.lightsOut = function () { -mqttClient.prototype.lightsOut = function() { - - var destinationName = 'lightsOut'; - this.client.publish(destinationName, 'f'); - destinationName = 'lightsOut'; - this.client.publish(destinationName, 'g'); - }; + var destinationName = 'lightsOut'; + this.client.publish(destinationName, 'f'); + destinationName = 'lightsOut'; + this.client.publish(destinationName, 'g'); +}; module.exports.mqttClient = mqttClient; diff --git a/lib/server/db-connector.js b/lib/server/db-connector.js new file mode 100644 index 0000000..d112fff --- /dev/null +++ b/lib/server/db-connector.js @@ -0,0 +1,24 @@ +'uses strict'; +/** + * + * User: Martin Donnelly + * Date: 2016-03-11 + * Time: 10:22 + * + */ + +var pgp = require('pg-promise')(); + +var amazonCN = { + dbinstance:'silvrdb', + host: 'silvrdb.cipyprijvzsw.eu-west-1.rds.amazonaws.com', + port: 5432, + database: 'heat', + user: 'martind2000', + password: '1V3D4m526i' +}; + +const cn = amazonCN; + + +exports.dbConnection = pgp(cn); diff --git a/lib/server/db-mdot.js b/lib/server/db-mdot.js new file mode 100644 index 0000000..4f4820b --- /dev/null +++ b/lib/server/db-mdot.js @@ -0,0 +1,125 @@ +'use strict'; +var logger = require('log4js').getLogger(); + +var Sugar = require('sugar-date'); + + + +module.exports = function(db) { + var module = {}; + module.deviceIds = ['CENSIS-LoRa-1','CENSIS-LoRa-2','CENSIS-LoRa-3','CENSIS-LoRa-4','HIE-mobile-1','HIE-demo','HIE-mobile-2','HIE-smart-campus-1','HIE-smart-campus-2','HIE-smart-campus-3','HIE-smart-campus-4','HIE-smart-campus-5','HIE-smart-campus-6','HIE-smart-campus-7','HIE-mDot-1']; + + module.roomIds = ['CENSIS-LoRa-1','CENSIS-LoRa-2','CENSIS-LoRa-3','CENSIS-LoRa-4']; + + module.sqlGetMeetingByRoom = function(roomId,returnObj) { + logger.debug('mdot:sqlGetMeetingByRoom', roomId); + + return new Promise(function(resolve, reject) { + db.any('select distinct * from meeting where locationid=$1 order by start asc;', [roomId + 1]) + .then(function(d) { + returnObj.occupancy = d; + return resolve(returnObj); + }) + .catch((err)=> { + logger.error(err); + return reject(err); + }); + }); + + }; + + module.sqlAllGetDecoded = function(deviceId) { + logger.debug('mdot:sqlAllGetDecoded'); + return new Promise(function(resolve, reject) { + db.any('select distinct * from decoded where deviceid=$1 order by timestamp asc;', [deviceId]) + .then(function(d) { + return resolve(d); + }) + .catch((err)=> { + logger.error(err); + return reject(err); + }); + }); + }; + + module.sqlRangedGetDecoded = function(params) { + logger.debug('mdot:sqlRangedGetDecoded'); + return new Promise(function(resolve, reject) { + db.any('select * from decoded where deviceid=$1 and timestamp between $2 and $3 order by timestamp asc;', [params.deviceID, params.startTS, params.endTS]) + .then(function(d) { + return resolve(d); + }) + .catch((err)=> { + logger.error(err); + return reject(err); + }); + + }); + + }; + + + + module.doGet = function(params) { + var self = this; + var _obj = {}; + var room; + return new Promise(function(resolve, reject) { + logger.debug('mdot.doGet', params); + + _obj.deviceID = module.deviceIds.indexOf(params.id); + room = _obj.deviceID; + + if (params.hasOwnProperty('start') && params.hasOwnProperty('end')) { + + logger.debug('params.start',params.start); + logger.debug('params.start',Sugar.Date.create(params.start)); + _obj.startTS = Sugar.Date.create(params.start); + _obj.endTS = Sugar.Date.create(params.end); + + logger.info(_obj); + + self.sqlRangedGetDecoded(_obj) + .then(function(d) { + + self.sqlGetMeetingByRoom(room) + .then(function() { + // nothing done + }) + .catch(function(e) { + logger.error(e); + reject(e); + }); + + resolve(d); + }) + .catch(function(e) { + logger.error(e); + reject(e); + }); + + } else { + + self.sqlAllGetDecoded(_obj.deviceID) + .then(function(d) { + var obj = {data: d}; + return self.sqlGetMeetingByRoom(room,obj); + }) + .then(function(combined) { + resolve(combined); + }) + .catch(function(e) { + logger.error(e); + reject(e); + }); + + } + + + }); + }; + + + return module; +}; + diff --git a/lib/server/db-meeting.js b/lib/server/db-meeting.js new file mode 100644 index 0000000..e228cd8 --- /dev/null +++ b/lib/server/db-meeting.js @@ -0,0 +1,53 @@ +'use strict'; +var logger = require('log4js').getLogger(); + +module.exports = function(db) { + var module = {}; + + module.sqlInsertMeeting = function(data) { + let _data = data; + + logger.debug('sqlInsertMeeting', _data.locationid, _data.timestamp); + return new Promise(function(resolve, reject) { + db.none('INSERT into meeting(locationid, logged, count, start, "end") Values( ${locationid}, ${timestamp}, ${count}, ${start}, ${end})', _data) + .then(()=> { + return resolve('ok'); + }) + .catch((err)=> { + return reject(err); + }); + + }); + + }; + + + module.addNewMeeting = function(data) { + logger.debug('addNewMeeting'); + var self = this; + return new Promise((resolve, reject) => { + + let _data = {}; + _data.timestamp = new Date(); + _data.locationid = data.locationid; + _data.count = data.count; + _data.start = new Date(data.start); + _data.end = new Date(data.end); + + console.log('_data', _data); + + self.sqlInsertMeeting(_data) + .then((d)=> { + logger.debug('Postgres returns', d); + return resolve({reply: 'track inserted'}); + }) + .catch((err)=> { + return reject(err); + }); + }); + }; + + + return module; +}; + diff --git a/lib/server/db-save.js b/lib/server/db-save.js new file mode 100644 index 0000000..df4fb8d --- /dev/null +++ b/lib/server/db-save.js @@ -0,0 +1,154 @@ +'use strict'; + +var atob = require('atob'); + +module.exports = function(db) { + var module = {}; + module.deviceIds = ['CENSIS-LoRa-1','CENSIS-LoRa-2','CENSIS-LoRa-3','CENSIS-LoRa-4','HIE-mobile-1','HIE-demo','HIE-mobile-2','HIE-smart-campus-1','HIE-smart-campus-2','HIE-smart-campus-3','HIE-smart-campus-4','HIE-smart-campus-5','HIE-smart-campus-6','HIE-smart-campus-7','HIE-mDot-1']; + + module.doBulkInsert = function(bulkData) { + return new Promise(function(resolve, reject) { + db.tx(function(t) { + // t = this; + // creating a sequence of transaction queries: + + // returning a promise that determines a successful transaction: + return this.batch(bulkData); // all of the queries are to be resolved; + }) + .then(function(data) { + return resolve(data); + }) + .catch(function(error) { + return reject(error); + }); + }); + }; + + + module.sqlInsertRawEvent = function(data) { + let _data = data; + console.log('sqlInsertRawEvent'); + return new Promise(function(resolve, reject) { + db.func('insert_raw', + [_data.timestamp, _data.event]) + .then(()=> { + return resolve('ok'); + }) + .catch((err)=> { + console.error(err); + return reject(err); + }); + }); + }; + + module.sqlInsertDecoded = function(data) { + let _data = data; + return new Promise(function(resolve, reject) { + db.func('insert_decoded', + [_data.deviceid, _data.timestamp, _data.lux, _data.co2, _data.temp, _data.humidity, _data.sound]) + .then(()=> { + return resolve('ok'); + }) + .catch((err)=> { + console.error(err); + return reject(err); + }); + }); + + }; + + module.genRawQuery = function(data) { + const timestamp = new Date(data.timestamp['$date']); + return db.func('insert_raw', [timestamp, data.device_type, data.device_id, data.evt_type, data.evt]); + }; + + module.addNewEvent = function(data) { + console.log('addNewEvent'); + var self = this; + return new Promise((resolve, reject) => { + + let _data = {}; + _data.timestamp = new Date(); + _data.event = data; + + self.sqlInsertRawEvent(_data) + .then((d)=> { + console.log('Postgres returns', d); + return resolve({reply: 'raw event inserted'}); + }) + .catch((err)=> { + console.error(err); + return reject(err); + }); + }); + }; + + module.addProcessedEvent = function(data) { + // console.log('addProcessedEvent'); + var self = this; + return new Promise((resolve, reject) => { + + let _data = self.rawBreaker(data); + + self.sqlInsertDecoded(_data) + .then((d)=> { + // console.log('Postgres returns', d); + return resolve({reply: 'Processed event inserted',data:_data}); + }) + .catch((err)=> { + console.error(err); + return reject(err); + }); + + + }); + + }; + + module.decoder = function(data) { + var _obj = {}; + var _data = atob(data).split(''); + + var bytes = _data.map(i => i.charCodeAt()); + + _obj.light = parseInt('0x' + ('0' + bytes[0]).substr(-2) + ('0' + bytes[1]).substr(-2)); + _obj.co2 = parseInt(_data[2] + _data[3] + _data[4] + _data[5] + _data[6], 10); + _obj.temp = (parseInt(_data[7] + _data[8] + _data[9] + _data[10] + _data[11], 10) - 1000) / 10; + _obj.humid = (parseInt(_data[12] + _data[13] + _data[14] + _data[15] + _data[16], 10) / 10); + _obj.noise = parseInt('0x' + ('0' + bytes[17]).substr(-2) + ('0' + bytes[18]).substr(-2)); + _obj.binData = bytes; + // console.log(_obj); + return _obj; + }; + + module.rawBreaker = function(data) { + var self = this; + var workObj = {}; + + var device_name = data.topic.split('/')[4]; + // console.log('Device_name', device_name); + workObj.deviceid = self.deviceIds.indexOf(device_name); + + if (data.hasOwnProperty('data')) { + + var _data = self.decoder(data.data); + + workObj.lux = _data.light; + workObj.co2 = _data.co2; + workObj.temp = _data.temp; + workObj.humidity = _data.humid; + workObj.sound = _data.noise; + workObj.timestamp = new Date(); + + return workObj; + } else { + console.error('Data does not have base64 data'); + + return null; + } + + }; + + return module; +}; + diff --git a/lib/server/db-track.js b/lib/server/db-track.js new file mode 100644 index 0000000..16f6670 --- /dev/null +++ b/lib/server/db-track.js @@ -0,0 +1,84 @@ +'use strict'; +var logger = require('log4js').getLogger(); + +module.exports = function(db) { + var module = {}; + module.deviceIds = ['CENSIS-LoRa-1','CENSIS-LoRa-2','CENSIS-LoRa-3','CENSIS-LoRa-4','HIE-mobile-1','HIE-demo','HIE-mobile-2','HIE-smart-campus-1','HIE-smart-campus-2','HIE-smart-campus-3','HIE-smart-campus-4','HIE-smart-campus-5','HIE-smart-campus-6','HIE-smart-campus-7','HIE-mDot-1']; + + + module.sqlInsertTrack = function(data) { + let _data = data; + + logger.debug('sqlInsertTrack', _data.locationid, _data.timestamp); + return new Promise(function(resolve, reject) { + db.func('insert_track', + [_data.locationid, _data.timestamp, _data.count, _data.total]) + .then(()=> { + return resolve('ok'); + }) + .catch((err)=> { + return reject(err); + }); + }); + + }; + + module.sqlGetTracksByID = function(locationId) { + logger.debug('track:sqlGetTracksByID', locationId); + return new Promise(function(resolve, reject) { + db.any('select * from track where locationid=$1;', [locationId]) + .then(function(d) { + return resolve(d); + }) + .catch((err)=> { + logger.error(err); + return reject(err); + }); + }); + }; + + module.addNewTrack = function(data) { + logger.debug('addNewTrack'); + var self = this; + return new Promise((resolve, reject) => { + + let _data = {}; + _data.timestamp = new Date(); + _data.locationid = data.locationid; + _data.count = data.count; + _data.total = data.total; + + self.sqlInsertTrack(_data) + .then((d)=> { + logger.debug('Postgres returns', d); + return resolve({reply: 'track inserted'}); + }) + .catch((err)=> { + return reject(err); + }); + }); + }; + + + module.doGet = function(params) { + var self = this; + return new Promise(function(resolve, reject) { + console.log('track.doGet', params); + + self.sqlGetTracksByID(params.locationid) + .then(function(d) { + resolve(d); + }) + .catch(function(e) { + logger.error(e); + reject(e); + }); + + + + }); + }; + + return module; +}; + diff --git a/package.json b/package.json index 578964d..f00f40b 100644 --- a/package.json +++ b/package.json @@ -7,33 +7,47 @@ "test": "test" }, "dependencies": { + "atob": "^2.0.3", + "babel-preset-es2015": "^6.14.0", + "basic-authentication": "^1.6.2", "body-parser": "^1.15.1", + "btoa": "^1.1.2", + "cfenv": "1.0.x", "cookie-parser": "*", - "ejs": "*", + "ejs": "^2.5.2", "errorhandler": "*", + "events": "^1.1.1", "express": "^4.13.4", "express-session": "*", + "express-session-lw": "^1.0.9", + "gulp-babel": "^6.1.2", + "gulp-banner": "^0.1.3", "htmlparser": "^1.7.7", + "log4js": "^0.6.36", "method-override": "*", "minibus": "^3.1.0", "morgan": "*", - "mqtt": "^1.10.0", + "mqtt": "^2.0.0", "mqtt_over_websockets": "0.0.1", "node-localstorage": "^1.1.2", - "request": "^2.72.0", - "websocket": "^1.0.22" + "pg-promise": "^5.2.7", + "request": "^2.75.0", + "request-promise": "^4.1.1", + "sugar-date": "^2.0.0", + "uuid-pure": "^1.0.10", + "websocket": "^1.0.23", + "ws": "^1.1.1" }, "devDependencies": { "after": "^0.8.1", - "apn": "^1.7.5", + "apn": "^2.0.0", "apns": "^0.1.0", - "basic-authentication": "^1.6.2", + "basic-authentication": "^1.7.0", "chai": "^3.5.0", - "cheerio": "^0.20.0", + "cheerio": "^0.22.0", "clone": "^1.0.2", "del": "^2.2.0", "elapsed": "0.0.7", - "events": "^1.1.1", "gulp": "^3.9.1", "gulp-autoprefixer": "^3.1.0", "gulp-cache": "^0.4.5", @@ -41,9 +55,9 @@ "gulp-cssmin": "^0.1.7", "gulp-cssnano": "^2.1.2", "gulp-debug": "^2.1.2", - "gulp-google-webfonts": "0.0.12", + "gulp-google-webfonts": "0.0.14", "gulp-html-replace": "^1.5.5", - "gulp-htmlmin": "^2.0.0", + "gulp-htmlmin": "^3.0.0", "gulp-inject": "^4.0.0", "gulp-jshint": "^2.0.1", "gulp-jsmin": "^0.1.5", @@ -52,21 +66,20 @@ "gulp-rename": "^1.2.2", "gulp-size": "^2.1.0", "gulp-strip-debug": "^1.1.0", - "gulp-uglify": "^1.5.3", + "gulp-uglify": "^2.0.0", "jshint": "^2.9.2", - "jsonfile": "^2.3.1", + "jsonfile": "^2.4.0", "log4js": "^0.6.36", - "mocha": "^2.4.5", + "mocha": "^3.0.2", "mqtt-ws": "^0.2.0", - "nano": "^6.2.0", "node-cron": "^1.1.1", "require-dir": "^0.3.0", - "should": "^8.3.1", + "should": "^11.0.0", "string": "^3.3.1", - "sugar": "^1.4.1", - "sugar-date": "^1.5.1", - "superagent": "^1.7.2", - "supertest": "^1.1.0" + "sugar": "^2.0.1", + "sugar-date": "^2.0.0", + "superagent": "^2.3.0", + "supertest": "^2.0.0" }, "scripts": { "test": "mocha --recursive --reporter spec --bail --check-leaks --timeout 3000", diff --git a/server/create_meeting.sql b/server/create_meeting.sql new file mode 100644 index 0000000..da8181f --- /dev/null +++ b/server/create_meeting.sql @@ -0,0 +1,33 @@ +-- Sequence: public.meeting_id_seq + +-- DROP SEQUENCE public.meeting_id_seq; + +CREATE SEQUENCE public.meeting_id_seq + INCREMENT 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + START 1 + CACHE 1; +ALTER TABLE public.meeting_id_seq + OWNER TO postgres; + + + +-- Table: public.meeting + +-- DROP TABLE public.meeting; + +CREATE TABLE public.meeting +( + id integer NOT NULL DEFAULT nextval('meeting_id_seq'::regclass), + locationid integer, + logged timestamp with time zone, + count smallint, + start timestamp with time zone, + "end" timestamp with time zone +) +WITH ( + OIDS=FALSE +); +ALTER TABLE public.meeting + OWNER TO postgres; diff --git a/server/dbconfig.js b/server/dbconfig.js new file mode 100644 index 0000000..879d173 --- /dev/null +++ b/server/dbconfig.js @@ -0,0 +1,55 @@ +/** + * + * User: Martin Donnelly + * Date: 2016-04-04 + * Time: 14:46 + * + */ +var exec = require('child_process').exec; + + + +function run_script() { + 'use strict'; + exec('psql postgres://amlrxqev:K11cvCplk0--oNafsYj4ISN-rVQmVS3y@jumbo.db.elephantsql.com:5432/amlrxqev -f ../sql/mdot.sql', function(err) { + if (err !== null) { + console.log('exec error: ', err); + return -1; + } else { + // addUsers(); + console.log('All done...'); + + } + }); + +} + +function prepare_db() { + exec('psql -Upostgres -d oBrand -h localhost -f ./obrand.sql', function(err) { + if (err !== null) { + console.log('exec error: ' + err); + return -1; + } else { + addUsers(); + + } + }); +} + + +function createDB() { + 'use strict'; + exec('createdb -Upostgres -h localhost heat', function(err) { + if (err !== null) { + console.log('exec error: ' + err); + return -1; + } else { + prepare_db(); + + } + }); +} + + +createDB(); +//run_script(); diff --git a/server/insert_track.sql b/server/insert_track.sql new file mode 100644 index 0000000..bbac8f4 --- /dev/null +++ b/server/insert_track.sql @@ -0,0 +1,53 @@ + +-- Sequence: public.track_id_seq + +-- DROP SEQUENCE public.track_id_seq; + +CREATE SEQUENCE public.track_id_seq + INCREMENT 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + START 1 + CACHE 1; +ALTER TABLE public.track_id_seq + OWNER TO postgres; + + + +-- Table: public.track + +-- DROP TABLE public.track; + +CREATE TABLE public.track +( + id bigint NOT NULL DEFAULT nextval('track_id_seq'::regclass), + locationid integer, + logged timestamp with time zone, + count smallint, + total integer +) +WITH ( + OIDS=FALSE +); +ALTER TABLE public.track + OWNER TO postgres; + + +-- + +CREATE OR REPLACE FUNCTION public.insert_track( + _locationid integer, + _logged timestamp with time zone, + _count smallint, + _total integer) + RETURNS void AS +$BODY$ + +BEGIN + INSERT into track(locationid, logged, count, total) Values( _locationid, _logged, _count, _total); +END; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; +ALTER FUNCTION public.insert_track(integer, timestamp with time zone, smallint, integer) + OWNER TO postgres; diff --git a/server/restore_meeting.sql b/server/restore_meeting.sql new file mode 100644 index 0000000..41d83c6 --- /dev/null +++ b/server/restore_meeting.sql @@ -0,0 +1,114 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 9.5.1 +-- Dumped by pg_dump version 9.5.1 + +-- Started on 2016-08-18 15:46:39 BST + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SET check_function_bodies = false; +SET client_min_messages = warning; +SET row_security = off; + +SET search_path = public, pg_catalog; + +SET default_tablespace = ''; + +SET default_with_oids = false; + +-- +-- TOC entry 188 (class 1259 OID 63387) +-- Name: meeting; Type: TABLE; Schema: public; Owner: postgres +-- + +DROP SEQUENCE public.meeting_id_seq; +DROP TABLE public.meeting; + + +CREATE TABLE meeting ( + id integer NOT NULL, + locationid integer, + logged timestamp with time zone, + count smallint, + start timestamp with time zone, + "end" timestamp with time zone +); + + +ALTER TABLE meeting OWNER TO postgres; + +-- +-- TOC entry 187 (class 1259 OID 63385) +-- Name: meeting_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE meeting_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE meeting_id_seq OWNER TO postgres; + +-- +-- TOC entry 2387 (class 0 OID 0) +-- Dependencies: 187 +-- Name: meeting_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE meeting_id_seq OWNED BY meeting.id; + + +-- +-- TOC entry 2266 (class 2604 OID 63390) +-- Name: id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY meeting ALTER COLUMN id SET DEFAULT nextval('meeting_id_seq'::regclass); + + +-- +-- TOC entry 2382 (class 0 OID 63387) +-- Dependencies: 188 +-- Data for Name: meeting; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY meeting (id, locationid, logged, count, start, "end") FROM stdin; +3 1 2016-08-18 15:39:26+01 4 2016-08-04 13:00:00+01 2016-08-04 13:45:00+01 +4 1 2016-08-18 15:39:51+01 11 2014-08-04 14:00:00+01 2014-08-04 14:45:00+01 +5 1 2016-08-18 15:40:29+01 2 2016-08-04 14:45:00+01 2016-08-04 14:55:00+01 +6 1 2016-08-18 15:40:55+01 3 2016-08-04 15:04:00+01 2016-08-04 16:06:00+01 +7 1 2016-08-18 15:41:25+01 2 2016-08-05 11:05:00+01 2016-08-05 12:15:00+01 +8 1 2016-08-18 15:41:47+01 1 2016-08-05 14:10:00+01 2016-08-05 14:25:00+01 +9 1 2016-08-18 15:42:08+01 4 2016-08-05 15:00:00+01 2016-08-05 15:30:00+01 +10 1 2016-08-18 15:42:37+01 4 2016-08-05 15:30:00+01 2016-08-05 16:23:00+01 +11 1 2016-08-18 15:43:02+01 8 2016-08-08 11:00:00+01 2016-08-08 12:12:00+01 +12 1 2016-08-18 15:43:29+01 7 2016-08-08 15:37:00+01 2016-08-08 16:50:00+01 +13 1 2016-08-18 15:44:10+01 5 2016-08-09 10:02:00+01 2016-08-09 10:15:00+01 +14 1 2016-08-18 15:44:34+01 6 2016-08-09 10:15:00+01 2016-08-09 12:05:00+01 +15 1 2016-08-18 15:44:52+01 1 2016-08-09 13:05:00+01 2016-08-09 13:10:00+01 +\. + + +-- +-- TOC entry 2388 (class 0 OID 0) +-- Dependencies: 187 +-- Name: meeting_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('meeting_id_seq', 15, true); + + +-- Completed on 2016-08-18 15:46:39 BST + +-- +-- PostgreSQL database dump complete +-- +