Новый движок БД
This commit is contained in:
152
server/db/JembaDb/utils.js
Normal file
152
server/db/JembaDb/utils.js
Normal file
@@ -0,0 +1,152 @@
|
||||
const fsCB = require('fs');
|
||||
const fs = fsCB.promises;
|
||||
const zlib = require('zlib');
|
||||
|
||||
function sleep(ms) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
function sleepWithStop(ms, cb = () => {}) {
|
||||
return new Promise(resolve => {
|
||||
const timer = setTimeout(resolve, ms);
|
||||
cb(() => { clearTimeout(timer); resolve(); });
|
||||
});
|
||||
}
|
||||
|
||||
function unionSet(arrSet) {
|
||||
if (!arrSet.length)
|
||||
return new Set();
|
||||
|
||||
let max = 0;
|
||||
let size = arrSet[0].size;
|
||||
for (let i = 1; i < arrSet.length; i++) {
|
||||
if (arrSet[i].size > size) {
|
||||
max = i;
|
||||
size = arrSet[i].size;
|
||||
}
|
||||
}
|
||||
|
||||
const result = new Set(arrSet[max]);
|
||||
for (let i = 0; i < arrSet.length; i++) {
|
||||
if (i === max)
|
||||
continue;
|
||||
|
||||
for (const elem of arrSet[i]) {
|
||||
result.add(elem);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function intersectSet(arrSet) {
|
||||
if (!arrSet.length)
|
||||
return new Set();
|
||||
|
||||
let min = 0;
|
||||
let size = arrSet[0].size;
|
||||
for (let i = 1; i < arrSet.length; i++) {
|
||||
if (arrSet[i].size < size) {
|
||||
min = i;
|
||||
size = arrSet[i].size;
|
||||
}
|
||||
}
|
||||
|
||||
const result = new Set();
|
||||
for (const elem of arrSet[min]) {
|
||||
let inAll = true;
|
||||
for (let i = 0; i < arrSet.length; i++) {
|
||||
if (i === min)
|
||||
continue;
|
||||
if (!arrSet[i].has(elem)) {
|
||||
inAll = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (inAll)
|
||||
result.add(elem);
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
async function pathExists(path) {
|
||||
try {
|
||||
await fs.access(path);
|
||||
return true;
|
||||
} catch(e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
async function appendFileToFile(nameFrom, nameTo) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const readStream = fsCB.createReadStream(nameFrom);
|
||||
readStream.on('error', (err) => {
|
||||
reject(err);
|
||||
});
|
||||
|
||||
const writeStream = fsCB.createWriteStream(nameTo, {flags: 'a'});
|
||||
|
||||
writeStream.on('error', (err) => {
|
||||
reject(err);
|
||||
});
|
||||
|
||||
writeStream.on('close', () => {
|
||||
resolve();
|
||||
});
|
||||
|
||||
readStream.pipe(writeStream);
|
||||
});
|
||||
}
|
||||
|
||||
function esc(obj) {
|
||||
return JSON.stringify(obj).replace(/@/g, '\\x40');
|
||||
}
|
||||
|
||||
function paramToArray(param) {
|
||||
return (Array.isArray(param) ? param : [param]);
|
||||
}
|
||||
|
||||
function cloneDeep(obj) {
|
||||
return JSON.parse(JSON.stringify(obj));
|
||||
}
|
||||
|
||||
//async
|
||||
function deflate(buf, compressionLevel) {
|
||||
return new Promise((resolve, reject) => {
|
||||
zlib.deflateRaw(buf, {level: compressionLevel}, (err, b) => {
|
||||
if (err)
|
||||
reject(err);
|
||||
resolve(b);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
//async
|
||||
function inflate(buf) {
|
||||
return new Promise((resolve, reject) => {
|
||||
zlib.inflateRaw(buf, (err, b) => {
|
||||
if (err)
|
||||
reject(err);
|
||||
resolve(b);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
sleep,
|
||||
sleepWithStop,
|
||||
unionSet,
|
||||
intersectSet,
|
||||
pathExists,
|
||||
appendFileToFile,
|
||||
esc,
|
||||
paramToArray,
|
||||
cloneDeep,
|
||||
deflate,
|
||||
inflate,
|
||||
};
|
||||
Reference in New Issue
Block a user