Commit d325c984 authored by antoor's avatar antoor

Optimizing the database operation code

优化数据库操作代码
parent 464c23d6
/** /**
* Shell数据库管理模块 * Shell数据库管理模块
* 更新:2016/04/28 * 更新:2016/06/28
* 作者:蚁逅 <https://github.com/antoor>
*/ */
'use strict'; 'use strict';
...@@ -10,13 +9,10 @@ const fs = require('fs'), ...@@ -10,13 +9,10 @@ const fs = require('fs'),
dns = require('dns'), dns = require('dns'),
path = require('path'), path = require('path'),
CONF = require('./config'), CONF = require('./config'),
// Logger = require('./logger'),
// logger = null,
// logger = require('log4js').getLogger('Database'),
Datastore = require('nedb'), Datastore = require('nedb'),
qqwry = require("geoips").info(); qqwry = require("geoips").info();
let logger; var logger;
class Database { class Database {
...@@ -80,6 +76,36 @@ class Database { ...@@ -80,6 +76,36 @@ class Database {
}); });
} }
/**
* 根据URL解析出IP&&地理位置
* @param {String} url URL地址
* @return {Promise} ip, addr
*/
_url2ip(url) {
return new Promise((res, rej) => {
// 解析domain
const urlArr = url.match(/(\w+):\/\/([\w\.\-]+)[:]?([\d]*)([\s\S]*)/i);
// 无效url
if (!urlArr || urlArr.length < 3) {
return rej('Unable to resolve domain name from URL');
}
// 获取IP
const domain = urlArr[2];
dns.lookup(domain, (err, ip) => {
if (err) {
return rej(err.toString());
}
// 获取地理位置
const _addr = qqwry.searchIP(ip);
return res({
ip: ip,
addr: `${_addr.Country} ${_addr.Area}`
});
})
})
}
/** /**
* 添加shell数据 * 添加shell数据
* @param {Object} event ipcMain对象 * @param {Object} event ipcMain对象
...@@ -87,31 +113,27 @@ class Database { ...@@ -87,31 +113,27 @@ class Database {
*/ */
addShell(event, opts) { addShell(event, opts) {
logger.info('addShell', opts); logger.info('addShell', opts);
// 获取目标IP以及地理位置
// 1. 获取域名 this._url2ip(opts['url'])
let parse = opts['url'].match(/(\w+):\/\/([\w\.\-]+)[:]?([\d]*)([\s\S]*)/i); .then((ret) => {
if (!parse || parse.length < 3) { return event.returnValue = 'Unable to resolve domain name from URL' }; this.cursor.insert({
// 2. 获取域名IP category: opts['category'] || 'default',
dns.lookup(parse[2], (err, ip) => { url: opts['url'],
if (err) { return event.returnValue = err.toString() }; pwd: opts['pwd'],
// 3. 查询IP对应物理位置 type: opts['type'],
const addr = qqwry.searchIP(ip); ip: ret['ip'],
// 插入数据库 addr: ret['addr'],
this.cursor.insert({ encode: opts['encode'],
category: opts['category'] || 'default', encoder: opts['encoder'],
url: opts['url'], ctime: +new Date,
pwd: opts['pwd'], utime: +new Date
type: opts['type'], }, (_err, _ret) => {
ip: ip, event.returnValue = _err || _ret;
addr: `${addr.Country} ${addr.Area}`, });
encode: opts['encode'], })
encoder: opts['encoder'], .catch((_err) => {
ctime: +new Date, event.returnValue = _err;
utime: +new Date })
}, (err, ret) => {
event.returnValue = err || ret;
});
});
} }
/** /**
...@@ -122,33 +144,29 @@ class Database { ...@@ -122,33 +144,29 @@ class Database {
*/ */
editShell(event, opts) { editShell(event, opts) {
logger.warn('editShell', opts); logger.warn('editShell', opts);
// 获取目标IP以及地理位置
// 1. 获取域名 this._url2ip(opts['url'])
let parse = opts['url'].match(/(\w+):\/\/([\w\.\-]+)[:]?([\d]*)([\s\S]*)/i); .then((ret) => {
if (!parse || parse.length < 3) { return event.returnValue = 'Unable to resolve domain name from URL' }; this.cursor.update({
// 2. 获取域名IP _id: opts['_id']
dns.lookup(parse[2], (err, ip) => { }, {
if (err) { return event.returnValue = err.toString() }; $set: {
// 3. 查询IP对应物理位置 ip: ret['ip'],
const addr = qqwry.searchIP(ip); addr: ret['addr'],
// 更新数据库 url: opts['url'],
this.cursor.update({ pwd: opts['pwd'],
_id: opts['_id'] type: opts['type'],
}, { encode: opts['encode'],
$set: { encoder: opts['encoder'],
ip: ip, utime: +new Date
addr: `${addr.Country} ${addr.Area}`, }
url: opts['url'], }, (_err, _ret) => {
pwd: opts['pwd'], event.returnValue = _err || _ret;
type: opts['type'], })
encode: opts['encode'],
encoder: opts['encoder'],
utime: +new Date
}
}, (err, num) => {
event.returnValue = err || num;
}) })
}); .catch((_err) => {
event.returnValue = _err;
});
} }
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment