/* * @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 } } }