Skip to content
This repository has been archived by the owner on Jun 3, 2023. It is now read-only.

Commit

Permalink
0.9.6. PM2 remove from project
Browse files Browse the repository at this point in the history
  • Loading branch information
gunyakov committed Mar 2, 2023
1 parent cf1ac9d commit c10ea3c
Show file tree
Hide file tree
Showing 27 changed files with 1,636 additions and 8,131 deletions.
63 changes: 10 additions & 53 deletions src/db.js → DB/db.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ const CRC32 = require("crc-32");
//Sqlite3 Promise wrapper
//------------------------------------------------------------------------------
let sqlite3 = require('./sqlite3-promise.js');
sqlite3 = new sqlite3();
//------------------------------------------------------------------------------
//DB handler for tile storage based on sqlite3 promise version
//------------------------------------------------------------------------------
Expand All @@ -24,8 +23,6 @@ class DB {
//----------------------------------------------------------------------------
constructor() {
this.arrDB = {};
this.dbOpened = 0;
this.service();
}
//----------------------------------------------------------------------------
//Function to generate full folder path to DB file
Expand Down Expand Up @@ -85,10 +82,10 @@ class DB {
dbState = await sqlite3.open(dbName);
if(dbState) {
//Create table to store tiles
await sqlite3.run(dbName, "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));");
await sqlite3.run(dbName, "CREATE_STORAGE_TABLE");
//Create index for tiles table
await sqlite3.run(dbName, "CREATE INDEX IF NOT EXISTS t_v_idx on t (v)");
Log.make("info", "DB", "CREATE -> " + dbName);
await sqlite3.run(dbName, "CREATE_INDEX");
Log.info("DB", "CREATE -> " + dbName);
}
}
//If DB file is present
Expand All @@ -98,7 +95,7 @@ class DB {
//If we open DB successfully
if(dbState) {
//Make log
Log.make("info", "DB", "OPEN -> " + dbName);
Log.info("DB", "OPEN-> " + dbName);
}
}
//If DB file opened/created successfully
Expand Down Expand Up @@ -128,7 +125,7 @@ class DB {
//Try to get DB
await this.getDB(z, x, y, storage);
//SQL request to DB
let sql = getFull ? "SELECT s, b, d, h, v FROM t WHERE x = ? AND y = ?;" : "SELECT s, d, h, v FROM t WHERE x = ? AND y = ?;";
let sql = getFull ? "SELECT_TILE_FULL" : "SELECT_TILE_INFO";
//Request tile from DB
let results = await sqlite3.all(dbName, sql, [x, y]);
//If request to DB is finished
Expand All @@ -145,7 +142,7 @@ class DB {
//If request return undefined state
else {
//Make log
Log.make("error", "DB", "request problem in " + dbName);
Log.error("DB", "request problem in " + dbName);
//Set DB open mode to force
return false;
}
Expand All @@ -163,7 +160,7 @@ class DB {
//Получаем время запроса
let timeStamp = await this.time();
//Заносим изображение в базу
let results = await sqlite3.run(dbName, "INSERT INTO t VALUES (?, ?, ?, ?, ?, ?, ?, ?);", [x, y, mapVersion, "", parseInt(size), Math.abs(CRC32.bstr(new Buffer.from( blob, 'binary' ).toString('utf8'))), timeStamp, blob]);
let results = await sqlite3.run(dbName, "INSERT_TILE", [x, y, mapVersion, "", parseInt(size), Math.abs(CRC32.bstr(new Buffer.from( blob, 'binary' ).toString('utf8'))), timeStamp, blob]);
//Если запрос вернул результат
if(results) {
return true;
Expand Down Expand Up @@ -196,11 +193,11 @@ class DB {
//If tile present in DB
if(tile !== false) {
//Update tile in DB
results = await sqlite3.run(dbName, "UPDATE t SET v = ?, s = ?, h = ?, d = ?, b = ? WHERE x = ? AND y = ?;", [mapVersion, parseInt(size), Math.abs(CRC32.bstr(new Buffer.from( blob, 'binary' ).toString('utf8'))), timeStamp, blob, x, y]);
results = await sqlite3.run(dbName, "UPDATE_TILE", [mapVersion, parseInt(size), Math.abs(CRC32.bstr(new Buffer.from( blob, 'binary' ).toString('utf8'))), timeStamp, blob, x, y]);
//If request to DB return true state
if(results) {
//Make log
Log.make("success", "DB", "UPDATE -> " + dbName);
Log.success("DB", "UPDATE -> " + dbName);
//Return
return true;
}
Expand All @@ -213,7 +210,7 @@ class DB {
//If request to DB return false state
if(results === false) {
//Make log
Log.make("error", "DB", "UPDATE -> " + dbName);
Log.error("DB", "UPDATE -> " + dbName);
//Return error
return false;
}
Expand All @@ -223,46 +220,6 @@ class DB {
}
}
//----------------------------------------------------------------------------
//Service function to close DB file when reach iddle time out
//----------------------------------------------------------------------------
async service() {
//Run neverended cycle
while(true) {
//Go throught DB list
for (let [key, value] of Object.entries(this.arrDB)) {
//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 && this.arrDB[key]['state'] == "open") {
//Close DB
let result = await sqlite3.close(value.name);
//If DB closed
if(result) {
//Make log
Log.make("info", "DB", "CLOSE -> " + value.name);
}
//If some error during closing DB
else {
//Make log
Log.make("error", "DB", "CLOSE -> " + value.name);
}
//Set DB close state
this.arrDB[key]['state'] = "closed";
//Decrease DB counter
this.dbOpened--;
}
}
//Run function each 5 seconds
await wait(5000);
}
}
//----------------------------------------------------------------------------
//Return counter of opened DB
//----------------------------------------------------------------------------
async getDBCounter() {
return this.dbOpened;
}
//----------------------------------------------------------------------------
//UNIX TIMESTAMP
//----------------------------------------------------------------------------
async time() {
Expand Down
56 changes: 56 additions & 0 deletions DB/queries.js
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 = ?;"
}
204 changes: 204 additions & 0 deletions DB/sqlite3-promise.js
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 renamed Marks.db3 → POI.db3
Binary file not shown.
Loading

0 comments on commit c10ea3c

Please sign in to comment.