115 lines
3.2 KiB
TypeScript
115 lines
3.2 KiB
TypeScript
/*
|
|
* @project: TERA
|
|
* @version: Development (beta)
|
|
* @license: MIT (not for evil)
|
|
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
|
* Web: https://terafoundation.org
|
|
* Twitter: https://twitter.com/terafoundation
|
|
* Telegram: https://t.me/terafoundation
|
|
*/
|
|
|
|
"use strict";
|
|
import * as fs from 'fs'
|
|
|
|
export default class Db {
|
|
DBMap;
|
|
LastHash;
|
|
WasUpdate: number;
|
|
WasCheckPathDB: boolean;
|
|
|
|
constructor() {
|
|
this.DBMap = {}
|
|
}
|
|
CheckPathDB() {
|
|
var Path = global.GetDataPath("DB");
|
|
global.CheckCreateDir(Path)
|
|
}
|
|
CloseDBFile(name: string, bdelete?: boolean) {
|
|
this.LastHash = undefined
|
|
this.WasUpdate = 1
|
|
var Item = this.DBMap[name];
|
|
if (Item) {
|
|
let bDelete = bdelete;
|
|
let Name = name;
|
|
fs.close(Item.fd, function(err) {
|
|
if (!err) {
|
|
if (bDelete) {
|
|
var fname = global.GetDataPath("DB/" + Name);
|
|
fs.unlink(fname, function(err) {
|
|
if (err)
|
|
global.ToLog(err)
|
|
})
|
|
}
|
|
} else {
|
|
global.ToLog(err)
|
|
}
|
|
})
|
|
delete this.DBMap[name]
|
|
}
|
|
}
|
|
OpenDBFile(name: string, bWrite?: boolean, bExist?: boolean) {
|
|
if (bWrite && global.READ_ONLY_DB) {
|
|
global.ToLogTrace("CANNOT WRITE - DB IN READ_ONLY MODE!!!")
|
|
process.exit()
|
|
}
|
|
if (bWrite) {
|
|
CheckStartOneProcess(name + "-run")
|
|
}
|
|
this.LastHash = undefined
|
|
this.WasUpdate = 1
|
|
var Item = this.DBMap[name];
|
|
if (Item === undefined) {
|
|
if (!this.WasCheckPathDB) {
|
|
this.CheckPathDB()
|
|
this.WasCheckPathDB = true
|
|
}
|
|
var fname = global.GetDataPath("DB/" + name);
|
|
if (!fs.existsSync(fname)) {
|
|
if (bExist) {
|
|
this.DBMap[name] = null
|
|
return null;
|
|
}
|
|
var fd = fs.openSync(fname, "w+");
|
|
fs.closeSync(fd)
|
|
}
|
|
var fd = fs.openSync(fname, "r+");
|
|
var stat = fs.statSync(fname);
|
|
var size = stat.size;
|
|
Item = { name: name, fname: fname, fd: fd, size: size, FillRows: 0, CountRows: 0, }
|
|
this.DBMap[name] = Item
|
|
}
|
|
return Item;
|
|
}
|
|
};
|
|
var MapCheckProcess = {};
|
|
var BlockDB = new Db();
|
|
|
|
function CheckStartOneProcess(Name) {
|
|
if (global.UpdateMode)
|
|
return;
|
|
if (global.READ_ONLY_DB || MapCheckProcess[Name])
|
|
return;
|
|
MapCheckProcess[Name] = 1;
|
|
var path = global.GetDataPath("DB/" + Name);
|
|
if (fs.existsSync(path)) {
|
|
fs.unlinkSync(path);
|
|
}
|
|
try {
|
|
BlockDB.OpenDBFile(Name);
|
|
} catch (e) {
|
|
global.ToLog("****** DETECT START ANOTHER PROCESS for: " + Name);
|
|
global.ToLogTrace("EXIT Err " + e);
|
|
process.exit();
|
|
}
|
|
};
|
|
global.CheckStartOneProcess = CheckStartOneProcess;
|
|
declare global {
|
|
namespace NodeJS {
|
|
interface Global {
|
|
//#region dapp.ts
|
|
CheckStartOneProcess: Function;
|
|
//#endregion
|
|
}
|
|
}
|
|
}
|