dns-setting
Version:
dns management: query, modify, shield corresponding domain name resolution
136 lines (132 loc) • 3.53 kB
JavaScript
;
var s3 = require('sqlite3');
var fs = require('fs');
const dbp = "./db";
const sqlite3 = s3.verbose();
const dbName = `${dbp}/dns.db`;
function read(src) {
try {
return fs.readFileSync(src).toString();
} catch (error) {
console.error("read file error", src);
return null;
}
}
function hook(fun) {
const db = new sqlite3.Database(dbName);
let r = new Promise((res, rej) => fun(db, res, rej));
db.close();
return r;
}
function serialize() {
try {
fs.rmSync(dbName);
} catch (e) {}
hook((db) => {
db.serialize(() => {
db.exec(read(`${dbp}/serialize.sql`));
});
});
}
const evmt = process.env;
if (evmt.serialize) {
serialize();
}
function getWhere(data, not = []) {
let keyList = Object.keys(data);
let result = {};
let where = keyList
.flatMap((k) => {
if (not.includes(k) || (data[k] ?? null) === null) {
return [];
}
if (/Like$/.test(k)) {
result[`\$${k}`] = "%" + data[k] + "%";
return `${k.replace(/Like$/, "")} like \$${k}`;
}
result[`\$${k}`] = data[k];
return `${k} = \$${k}`;
})
.join(" and ");
if (where) {
where = `where ${where}`;
}
return { where, data: result };
}
function getSet(data, not = []) {
let keyList = Object.keys(data);
let result = {};
let str = keyList
.flatMap((k) => {
if (not.includes(k) || (data[k] ?? null) === null) {
return [];
}
result[`\$${k}`] = data[k];
return `${k} = \$${k}`;
})
.join(" , ");
if (str) {
str = `SET ${str}`;
}
return { set: str, data: result };
}
function all(query, data) {
return hook((db, res, rej) => {
db.all(query.trim(), data, function (error, rows) {
if (error) rej(error);
else res(rows);
});
});
}
function tableList(name, match) {
if ((match.isUsing ?? null) !== null) match.isUsing = match.isUsing ? 1 : 0;
let { where, data } = getWhere(match);
let query = `SELECT * FROM ${name} ${where}`;
return all(query, data);
}
function updateItem(name, id, info) {
if (info.isUsing ?? null === null) info.isUsing = 1;
info.isUsing = info.isUsing ? 1 : 0;
let { set, data } = getSet({ ...info });
let query = `UPDATE ${name} ${set} where id = $id`;
return hook((db, res, rej) => {
db.run(query, { ...data, $id: id }, function (error) {
if (error) rej(error);
res();
});
});
}
function getInsert(info) {
if (info.isUsing ?? null === null) info.isUsing = 1;
info.isUsing = info.isUsing ? 1 : 0;
let key = Object.keys(info);
let key2 = key.map((k) => `\$${k}`);
let data = Object.fromEntries(key2.map((k, i) => [k, info[key[i]]]));
return { key, key1: key, key2, data };
}
function insertItem(name, info) {
let { key1, key2, data } = getInsert({ ...info });
let query = `INSERT INTO ${name} (${key1}) VALUES (${key2})`;
return hook((db, res, rej) => {
db.run(query, { ...data }, function (error, data) {
if (error) rej(error);
db.get(`select last_insert_rowid() as id from ${name} LIMIT 1;`, function (error, data) {
if (error) rej(error);
res(data.id);
});
});
});
}
function deleteItem(name, id) {
let query = `DELETE FROM ${name} WHERE id = $id`;
return hook((db, res, rej) => {
db.run(query, { $id: id }, function (error, data) {
if (error) rej(error);
res(data);
});
});
}
exports.deleteItem = deleteItem;
exports.insertItem = insertItem;
exports.tableList = tableList;
exports.updateItem = updateItem;