exports.init = function (dbname) { return [ "CREATE TABLE sources (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT);", "CREATE TABLE datapoints (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT, type INTEGER);", "CREATE TABLE ts_number (id INTEGER, ts INTEGER, val REAL, ack BOOLEAN, _from INTEGER, q INTEGER, PRIMARY KEY(id, ts));", "CREATE TABLE ts_string (id INTEGER, ts INTEGER, val TEXT, ack BOOLEAN, _from INTEGER, q INTEGER, PRIMARY KEY(id, ts));", "CREATE TABLE ts_bool (id INTEGER, ts INTEGER, val BOOLEAN, ack BOOLEAN, _from INTEGER, q INTEGER, PRIMARY KEY(id, ts));" ]; }; exports.destroy = function (dbname) { return [ "DROP TABLE ts_number;", "DROP TABLE ts_string;", "DROP TABLE ts_bool;", "DROP TABLE sources;", "DROP TABLE datapoints;" ]; }; exports.getFirstTs = function (dbname, db) { return "SELECT id, MIN(ts) AS ts FROM " + db + " GROUP BY id;"; }; exports.insert = function (dbname, index, state, from, db) { if (state.val === null) state.val = 'NULL'; else if (db === "ts_bool") state.val = state.val ? 1 : 0; else if (db === "ts_string") state.val = "'" + state.val.toString().replace(/'/g, '') + "'"; return "INSERT INTO " + db + " (id, ts, val, ack, _from, q) VALUES(" + index + ", " + state.ts + ", " + state.val + ", " + (state.ack ? 1 : 0) + ", " + (from || 0) + ", " + (state.q || 0) + ");"; }; exports.retention = function (dbname, index, db, retention) { var d = new Date(); d.setSeconds(-retention); var query = "DELETE FROM " + db + " WHERE"; query += " id=" + index; query += " AND ts < " + d.getTime(); query += ";"; return query; }; exports.getIdSelect = function (dbname, name) { if (!name) { return "SELECT id, type, name FROM datapoints;"; } else { return "SELECT id, type, name FROM datapoints WHERE name='" + name + "';"; } }; exports.getIdInsert = function (dbname, name, type) { return "INSERT INTO datapoints (name, type) VALUES('" + name + "', " + type + ");"; }; exports.getIdUpdate = function (dbname, id, type) { return "UPDATE datapoints SET type = " + type + " WHERE id = " + id + ";"; }; exports.getFromSelect = function (dbname, from) { if (!from) { return "SELECT id, name FROM sources;"; } else { return "SELECT id FROM sources WHERE name='" + from + "';"; } }; exports.getFromInsert = function (dbname, from) { return "INSERT INTO sources (name) VALUES('" + from + "');"; }; exports.getHistory = function (dbname, db, options) { var query = "SELECT ts, val" + (!options.id ? (", " + db + ".id as id") : "") + (options.ack ? ", ack" : "") + (options.from ? (", sources.name as 'from'") : "") + (options.q ? ", q" : "") + " FROM " + db; if (options.from) { query += " INNER JOIN sources ON sources.id=" + db + "._from"; } var where = ""; if (options.id) { where += " " + db + ".id=" + options.id; } if (options.end) { where += (where ? " AND" : "") + " " + db + ".ts < " + options.end; } if (options.start) { where += (where ? " AND" : "") + " " + db + ".ts >= " + options.start; //add last value before start var subQuery; var subWhere; subQuery = " SELECT ts, val" + (!options.id ? (", " + db + ".id as id") : "") + (options.ack ? ", ack" : "") + (options.from ? (", sources.name as 'from'") : "") + (options.q ? ", q" : "") + " FROM " + db; if (options.from) { subQuery += " INNER JOIN sources ON sources.id=" + db + "._from"; } subWhere = ""; if (options.id) { subWhere += " " + db + ".id=" + options.id; } if (options.ignoreNull) { //subWhere += (subWhere ? " AND" : "") + " val <> NULL"; } subWhere += (subWhere ? " AND" : "") + " " + db + ".ts < " + options.start; if (subWhere) subQuery += " WHERE " + subWhere; subQuery += " ORDER BY " + db + ".ts DESC LIMIT 1"; where += " UNION SELECT * from (" + subQuery + ")"; //add next value after end subQuery = " SELECT ts, val" + (!options.id ? (", " + db + ".id as id") : "") + (options.ack ? ", ack" : "") + (options.from ? (", sources.name as 'from'") : "") + (options.q ? ", q" : "") + " FROM " + db; if (options.from) { subQuery += " INNER JOIN sources ON sources.id=" + db + "._from"; } subWhere = ""; if (options.id) { subWhere += " " + db + ".id=" + options.id; } if (options.ignoreNull) { //subWhere += (subWhere ? " AND" : "") + " val <> NULL"; } subWhere += (subWhere ? " AND" : "") + " " + db + ".ts >= " + options.end; if (subWhere) subQuery += " WHERE " + subWhere; subQuery += " ORDER BY " + db + ".ts ASC LIMIT 1"; where += " UNION SELECT * from (" + subQuery + ") "; } if (where) query += " WHERE " + where; query += " ORDER BY ts"; if (!options.start && options.count) { query += " DESC LIMIT " + options.count; } else { query += " ASC"; } query += ";"; return query; };