tera/src/core/db/db.ts

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
}
}
}