This repository has been archived by the owner on Jun 3, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
gunyakov
committed
Mar 2, 2023
1 parent
cf1ac9d
commit c10ea3c
Showing
27 changed files
with
1,636 additions
and
8,131 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
module.exports = { | ||
|
||
SELECT_ALL_POI: "SELECT * FROM poi;", | ||
|
||
SELECT_POI_BY_ID: "SELECT * FROM poi WHERE ID = ?;", | ||
|
||
SELECT_POI_BY_CATEGORY: "SELECT * FROM poi WHERE categoryID = ?;", | ||
|
||
SELECT_POI_BY_BOTH: "SELECT * FROM poi WHERE ID = ? AND categoryID = ?;", | ||
|
||
SELECT_POI_BY_NAME: "SELECT * FROM poi WHERE name = ? ORDER BY ID DESC LIMIT 1;", | ||
|
||
SELECT_POINTS_BY_POI: "SELECT * FROM points WHERE poiID = ?;", | ||
|
||
INSERT_POI: "INSERT INTO poi('categoryID', 'name', 'type', 'color', 'fillColor', 'fillOpacity', 'zoom', 'SWx', 'SWy', 'NEx', 'NEy') VALUES(1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);", | ||
|
||
UPDATE_POI: "UPDATE poi SET SWx = ?, SWy = ?, NEx = ?, NEy = ? WHERE ID = ?;", | ||
|
||
INSERT_POINTS: "INSERT INTO points('poiID', 'x', 'y') VALUES (?, ?, ?);", | ||
|
||
DELETE_POI_BY_ID: "DELETE FROM poi WHERE ID = ?;", | ||
|
||
DELETE_POINTS_BY_POI: "DELETE FROM points WHERE poiID = ?;", | ||
|
||
UPDATE_POI_STYLE: "UPDATE poi SET categoryID = ?, name = ?, width = ?, fillOpacity = ?, color = ?, fillColor = ? WHERE ID = ?;", | ||
|
||
UPDATE_POI_BOUNDS: "UPDATE poi SET SWx = ?, SWy = ?, NEx = ?, NEy = ?, zoom = ? WHERE ID = ?;", | ||
|
||
SELECT_CATEGORY_LIST: "SELECT * FROM category;", | ||
|
||
SELECT_CATEGORY_BY_ID: "SELECT * FROM category WHERE ID = ?;", | ||
|
||
INSERT_CATEGORY: "INSERT INTO category('name', 'parentID') VALUES(?, ?);", | ||
|
||
INSERT_ROUTE: "INSERT INTO routeList('name', 'distance') VALUES(?, ?);", | ||
|
||
INSERT_ROUTE_POINT: "INSERT INTO routeCoords('routeID', 'lat', 'lon', 'date') VALUES(?, ?, ?, 'unixepoch')", | ||
|
||
SELECT_ROUTE_POINTS: "SELECT * FROM routeCoords WHERE routeID=? ORDER BY ID;", | ||
|
||
SELECT_LAST_ROUTE: "SELECT MAX(ID) as IDMAX FROM routeList;", | ||
|
||
SELECT_ALL_ROUTES: "SELECT * FROM routeList;", | ||
|
||
CREATE_STORAGE_TABLE: "CREATE TABLE IF NOT EXISTS t (x INTEGER NOT NULL,y INTEGER NOT NULL,v INTEGER DEFAULT 0 NOT NULL,c TEXT,s INTEGER DEFAULT 0 NOT NULL,h INTEGER DEFAULT 0 NOT NULL,d INTEGER NOT NULL,b BLOB,constraint PK_TB primary key (x,y,v));", | ||
|
||
CREATE_INDEX: "CREATE INDEX IF NOT EXISTS t_v_idx on t (v);", | ||
|
||
SELECT_TILE_FULL: "SELECT s, b, d, h, v FROM t WHERE x = ? AND y = ?;", | ||
|
||
SELECT_TILE_INFO: "SELECT s, d, h, v FROM t WHERE x = ? AND y = ?;", | ||
|
||
INSERT_TILE: "INSERT INTO t VALUES (?, ?, ?, ?, ?, ?, ?, ?);", | ||
|
||
UPDATE_TILE: "UPDATE t SET v = ?, s = ?, h = ?, d = ?, b = ? WHERE x = ? AND y = ?;" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,204 @@ | ||
//------------------------------------------------------------------------------ | ||
//SQL queries | ||
//------------------------------------------------------------------------------ | ||
const queries = require("./queries.js"); | ||
//------------------------------------------------------------------------------ | ||
//SQLITE3 driver | ||
//------------------------------------------------------------------------------ | ||
const sqlite3 = require('sqlite3').verbose(); | ||
//------------------------------------------------------------------------------ | ||
//MD5 to store DB file name in list | ||
//------------------------------------------------------------------------------ | ||
const md5 = require('md5'); | ||
//------------------------------------------------------------------------------ | ||
//Array to store all opened SQLITE DB descriptors | ||
//------------------------------------------------------------------------------ | ||
let arrDBSQLITE3 = {}; | ||
//------------------------------------------------------------------------------ | ||
//Init SQLITE3 Promise Wrapper | ||
//------------------------------------------------------------------------------ | ||
function SQLite3Promise () { | ||
|
||
}; | ||
|
||
SQLite3Promise.prototype.open = function (dbName) { | ||
let dbNameHash = md5(dbName); | ||
if(typeof arrDBSQLITE3[dbNameHash] === "undefined") { | ||
//Create DB entry in list | ||
arrDBSQLITE3[dbNameHash] = { | ||
name: dbName, | ||
time: Math.floor(Date.now() / 1000), | ||
state: "inprogress", | ||
db: false | ||
} | ||
} | ||
if(arrDBSQLITE3[dbNameHash]['state'] != "open") { | ||
return new Promise(function(resolve, reject) { | ||
arrDBSQLITE3[dbNameHash]['db'] = new sqlite3.Database(dbName, | ||
function(err) { | ||
if(err) { | ||
Log.error("SQLITE3", err.message); | ||
resolve(false); | ||
} | ||
else { | ||
Log.info("SQLITE3", "open() " + dbName); | ||
arrDBSQLITE3[dbNameHash]['state'] = "open"; | ||
arrDBSQLITE3[dbNameHash]['time'] = Math.floor(Date.now() / 1000); | ||
resolve(true); | ||
} | ||
} | ||
) | ||
}); | ||
} | ||
else { | ||
return new Promise(function(resolve, reject) { | ||
arrDBSQLITE3[dbNameHash]['time'] = Math.floor(Date.now() / 1000); | ||
resolve(true); | ||
}); | ||
} | ||
}; | ||
|
||
SQLite3Promise.prototype.serialize = function (dbName) { | ||
let dbNameHash = md5(dbName); | ||
return new Promise(function(resolve, reject) { | ||
arrDBSQLITE3[dbNameHash]['db'].serialize(function(err) { | ||
if(err) { | ||
Log.error("SQLITE3", err.message + " " + dbName); | ||
reject(false); | ||
} | ||
else { | ||
Log.info("SQLITE3", "serialize() " + dbName); | ||
resolve(true); | ||
} | ||
}); | ||
}); | ||
}; | ||
|
||
// any query: insert/delete/update | ||
SQLite3Promise.prototype.run = function(dbName, key, params = []) { | ||
let dbNameHash = md5(dbName); | ||
return new Promise(function(resolve, reject) { | ||
let sql = queries[key] ? queries[key] : key; | ||
arrDBSQLITE3[dbNameHash]['db'].run(sql, params, | ||
function(err, result) { | ||
if(err) { | ||
Log.error("SQLITE3", err + " " + dbName); | ||
resolve(false); | ||
} | ||
else { | ||
Log.info("SQLITE3", "run() " + dbName); | ||
this.lastID > 0 ? resolve(this.lastID) : resolve(true); | ||
} | ||
}) | ||
}) | ||
}; | ||
|
||
// first row read | ||
SQLite3Promise.prototype.get = function (dbName, key, params = []) { | ||
let dbNameHash = md5(dbName); | ||
return new Promise(function(resolve, reject) { | ||
let sql = queries[key] ? queries[key] : key; | ||
arrDBSQLITE3[dbNameHash]['db'].get(sql, params, function(err, row) { | ||
if(err) { | ||
Log.error("SQLITE3", err.message + " " + dbName); | ||
resolve(false); | ||
} | ||
else { | ||
Log.info("SQLITE3", "get() " + dbName); | ||
resolve(row); | ||
} | ||
}) | ||
}) | ||
}; | ||
|
||
// set of rows read | ||
SQLite3Promise.prototype.all = function (dbName, key, params = []) { | ||
let dbNameHash = md5(dbName); | ||
return new Promise(function(resolve, reject) { | ||
let sql = queries[key] ? queries[key] : key; | ||
arrDBSQLITE3[dbNameHash]['db'].all(sql, params, function(err, rows) { | ||
if(err) { | ||
Log.error("SQLITE3", err.message + " " + dbName); | ||
resolve(false); | ||
} | ||
else { | ||
Log.info("SQLITE3", "all() " + dbName); | ||
resolve(rows) | ||
} | ||
}) | ||
}) | ||
}; | ||
|
||
// each row returned one by one | ||
SQLite3Promise.prototype.each = function (dbName, key, params, action) { | ||
let dbNameHash = md5(dbName); | ||
return new Promise(function(resolve, reject) { | ||
if(params == undefined) params=[] | ||
var db = arrDBSQLITE3[dbNameHash]['db']; | ||
db.serialize(function() { | ||
let sql = queries[key] ? queries[key] : key; | ||
db.each(sql, params, function(err, row) { | ||
if(err) reject("Read error: " + err.message ) | ||
else { | ||
if(row) { | ||
action(row) | ||
} | ||
} | ||
}) | ||
db.get("", function(err, row) { | ||
resolve(true) | ||
}) | ||
}) | ||
}) | ||
}; | ||
|
||
SQLite3Promise.prototype.close = function (dbName) { | ||
let dbNameHash = md5(dbName); | ||
return new Promise(function(resolve, reject) { | ||
arrDBSQLITE3[dbNameHash]['db'].close(function(err, row) { | ||
if(err) { | ||
Log.error("SQLITE3", err.message + " " + dbName); | ||
resolve(false) | ||
} | ||
else { | ||
Log.info("SQLITE3", "close() " + dbName); | ||
resolve(true) | ||
} | ||
arrDBSQLITE3[dbNameHash]['state'] = "closed"; | ||
}); | ||
}); | ||
}; | ||
|
||
let sqLiteDB = new SQLite3Promise(); | ||
|
||
(async() => { | ||
//Run neverended cycle | ||
while(true) { | ||
//Go throught DB list | ||
for (let [key, value] of Object.entries(arrDBSQLITE3)) { | ||
//Check last DB query time | ||
let dbTimeOpen = Math.floor(Date.now() / 1000) - value.time; | ||
//If last query time more then iddle time settings | ||
if(dbTimeOpen > config.db.OpenTime && arrDBSQLITE3[key]['state'] == "open") { | ||
//Close DB | ||
let result = await sqLiteDB.close(value.name); | ||
//If DB closed | ||
if(result) { | ||
//Make log | ||
Log.info("DB", "CLOSE -> " + value.name); | ||
} | ||
//If some error during closing DB | ||
else { | ||
//Make log | ||
Log.error("DB", "CLOSE -> " + value.name); | ||
} | ||
//Set DB close state | ||
arrDBSQLITE3[key]['state'] = "closed"; | ||
} | ||
} | ||
//Run function each 5 seconds | ||
await wait(5000); | ||
} | ||
})(); | ||
|
||
module.exports = sqLiteDB; |
Binary file not shown.
Oops, something went wrong.