UNPKG

dns-setting

Version:

dns management: query, modify, shield corresponding domain name resolution

136 lines (132 loc) 3.53 kB
'use strict'; 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;