-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgps_db.js
135 lines (117 loc) · 3.81 KB
/
gps_db.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
const sql = require('sqlite3').verbose();
const fs = require('fs');
const util = require('util');
let cfg = JSON.parse(fs.readFileSync('config.json', 'utf-8'));
let result = {};
var db = new sql.Database(cfg.DATABASE_NAME);
if (!fs.exists(cfg.DATABASE_NAME)) { init_new_db(); }
function init_new_db() {
q = 'CREATE TABLE IF NOT EXISTS clients(' +
'client_id INTEGER PRIMARY KEY,' +
' client_key TEXT);';
db.run(q);
q = 'CREATE TABLE IF NOT EXISTS gps_records(' +
'record_id INTEGER PRIMARY KEY, ' +
'client_id INTEGER, ' +
'utc_time TEXT, ' +
'lat_deg REAL, ' +
'lon_deg REAL, ' +
'alt_m REAL, ' +
'speed REAL);';
db.run(q);
db.close( () => {
console.log('\t\t\tdatabase closed...');
}); // force comp;etion before moving forward
}
//function to validate geojson looks as expected
function valid_geo(obj) {
is_valid = false;
if ("class" in obj &&
obj.class == "TPV" &&
"mode" in obj &&
obj.mode == 3 &&
"time" in obj &&
"lat" in obj &&
"lon" in obj &&
"alt" in obj &&
"speed" in obj) {
is_valid = true;
}
return is_valid;
}
function consume(obj, client_id) {
records = obj.payload.split('\n');
rejected = 0;
db.parallelize( () => {
for (var i = 0; i < records.length; i++) {
try {
gps = JSON.parse(records[i]);
} catch(err) {
rejected += 1;
continue;
}
if (valid_geo(gps)) {
var q = util.format("INSERT INTO gps_records " +
"(client_id, utc_time, lat_deg, lon_deg, alt_m, speed) VALUES " +
"(%d, '%s', %d, %d, %d, %d);",
client_id, gps.time, gps.lat, gps.lon, gps.alt, gps.speed);
db.run(q);
}
}
});
db.close( () => {
console.log('\t\t\tdatabase closed...');
}); // force comp;etion before moving forward
result = {rejected: rejected, inserted: records.length - rejected};
}
function retrieve(obj, client_id) {
var q = util.format("SELECT utc_time, lat_deg, lon_deg, alt_m, speed " +
"FROM gps_records WHERE client_id = %d;", client_id);
db.serialize( () => {
db.all(q, (err, rows) => { result = rows; });
});
db.close( () => {
console.log('\t\t\tdatabase closed...');
}); // force comp;etion before moving forward
}
var gps_db = {
db: db,
open: () => {
db = new sql.Database(cfg.DATABASE_NAME, (err) => {
console.log('\t\t\tdatabase opened...');
});
},
new_client: (client_key) => {
q = "INSERT INTO clients (client_key) VALUES (?);";
db.run(q, client_key);
db.close( () => {
console.log('\t\t\tdatabase closed...');
}); // force comp;etion before moving forward
return result;
},
new_record: (obj) => {
var q = util.format("SELECT client_id FROM clients WHERE client_key = '%s';",
obj.client_key);
db.all(q, (err, row) => {
if (row[0].client_id) {
consume(obj, row[0].client_id);
} else {
console.log("could not find " + obj.client_key);
}
});
return result;
},
fetch_all: (obj) => {
var q = util.format("SELECT client_id FROM clients WHERE client_key = '%s';",
obj.client_key);
db.all(q, (err, row) => {
if (row[0].client_id) {
retrieve(obj, row[0].client_id);
} else {
console.log("could not find " + obj.client_key);
}
});
return result;
}
}
module.exports = gps_db;