ERROR: [2012-10-22 13:52:59.256] 4202 EE "i am a bad boy" NetBlackHole listened at "10241" NetBlackHole listened at "10241"
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | ||
| 5 | 1 | var fs = require('fs'), path = require('path'); |
| 6 | ||
| 7 | 1 | exports.setmode = function(path, mode) { |
| 8 | 3 | exports.fileset(path, function(file) { |
| 9 | 3 | fs.chmodSync(file, mode); |
| 10 | }); | |
| 11 | }; | |
| 12 | ||
| 13 | 1 | exports.parseProperties = function (file) { |
| 14 | 4 | var data = {}; |
| 15 | ||
| 16 | 4 | try { |
| 17 | 4 | fs.readFileSync(file, 'utf8').trim().split('\n').forEach(function(line) { |
| 18 | 40 | if (/^(#|!)/.test(line)) { |
| 19 | 8 | return; |
| 20 | } | |
| 21 | 32 | var match = line.match(/^\s*(.+?)\s*=\s*(.*)\s*$/); |
| 22 | 32 | if (!match) { |
| 23 | 8 | return; |
| 24 | } | |
| 25 | ||
| 26 | 24 | data[match[1].trim()] = match[2].trim(); |
| 27 | }); | |
| 28 | } catch (e) { | |
| 29 | } | |
| 30 | ||
| 31 | 4 | return data; |
| 32 | }; | |
| 33 | ||
| 34 | 1 | exports.fileset = function(dir, callback) { |
| 35 | 18 | if (!fs.statSync(dir).isDirectory()) { |
| 36 | 6 | callback(dir); |
| 37 | 6 | return; |
| 38 | } | |
| 39 | ||
| 40 | 11 | fs.readdirSync(dir).forEach(function(file) { |
| 41 | 61 | var who = path.normalize(dir + '/' + file); |
| 42 | 61 | if (fs.statSync(who).isDirectory()) { |
| 43 | 8 | exports.fileset(who, callback); |
| 44 | } else { | |
| 45 | 53 | callback(who); |
| 46 | } | |
| 47 | }); | |
| 48 | }; | |
| 49 | ||
| 50 | 1 | exports.init = function(file, root, force) { |
| 51 | ||
| 52 | /** | |
| 53 | * @æ ¹è·¯å¾ | |
| 54 | */ | |
| 55 | 5 | var _dirroot = path.normalize(root ? root : __dirname + '/../'); |
| 56 | ||
| 57 | 5 | var _fixpath = function(dir) { |
| 58 | 32 | if ('/' != dir.charAt(0)) { |
| 59 | 7 | dir = path.normalize(_dirroot + '/' + dir); |
| 60 | } | |
| 61 | ||
| 62 | 32 | return dir; |
| 63 | }; | |
| 64 | ||
| 65 | /** | |
| 66 | * @é»è®¤å±æ§ | |
| 67 | */ | |
| 68 | 5 | var _defaults = file ? exports.parseProperties(_fixpath(file)) : {}; |
| 69 | 5 | for (var i in force) { |
| 70 | 3 | _defaults[i] = force[i]; |
| 71 | } | |
| 72 | ||
| 73 | /** | |
| 74 | * @ä»»å¡ | |
| 75 | */ | |
| 76 | 5 | var _task = []; |
| 77 | ||
| 78 | 5 | var _me = {}; |
| 79 | ||
| 80 | /* {{{ public function property() */ | |
| 81 | 5 | _me.property = function() { |
| 82 | 2 | return _defaults; |
| 83 | }; | |
| 84 | /* }}} */ | |
| 85 | ||
| 86 | /* {{{ public function $() */ | |
| 87 | 5 | _me.$ = function (key, _def) { |
| 88 | 12 | return (undefined === _defaults[key]) ? _def : _defaults[key]; |
| 89 | }; | |
| 90 | /* }}} */ | |
| 91 | ||
| 92 | /* {{{ public function makeconf() */ | |
| 93 | /** | |
| 94 | * éè¿æ¨¡ççæé ç½®æä»¶ | |
| 95 | * | |
| 96 | * @access public | |
| 97 | * @return void | |
| 98 | */ | |
| 99 | 5 | _me.makeconf = function (source, target, values) { |
| 100 | 3 | values = values || {}; |
| 101 | 3 | source = path.normalize(source); |
| 102 | ||
| 103 | 3 | try { |
| 104 | 3 | var isdir = fs.statSync(target).isDirectory(); |
| 105 | } catch (e) { | |
| 106 | 2 | var isdir = false; |
| 107 | } | |
| 108 | ||
| 109 | 3 | exports.fileset(source, function (fname) { |
| 110 | 8 | var _text = fs.readFileSync(_fixpath(fname), 'utf-8'); |
| 111 | 8 | var match = _text.match(/##(.+?)##/g); |
| 112 | 8 | if (match) { |
| 113 | 5 | match.forEach(function(item) { |
| 114 | 14 | var i = item.slice(2, item.length - 2); |
| 115 | 14 | if (undefined !== values[i]) { |
| 116 | 4 | _text = _text.replace(item, values[i]); |
| 117 | } else { | |
| 118 | 10 | var v = _me.$(i); |
| 119 | 10 | if (undefined !== v) { |
| 120 | 2 | _text = _text.replace(item, v); |
| 121 | } | |
| 122 | } | |
| 123 | }); | |
| 124 | } | |
| 125 | ||
| 126 | 8 | var _save = ''; |
| 127 | 8 | if (!isdir && '/' !== target.charAt(target.length - 1)) { |
| 128 | 2 | _save = _fixpath(target); |
| 129 | } else { | |
| 130 | 6 | _save = _fixpath(target + '/' + fname.replace(source, '')); |
| 131 | } | |
| 132 | 8 | _me.makedir(path.dirname(_save)); |
| 133 | 8 | fs.writeFileSync(_save, _text, 'utf-8'); |
| 134 | }); | |
| 135 | }; | |
| 136 | /* }}} */ | |
| 137 | ||
| 138 | /* {{{ public function makedir() */ | |
| 139 | 5 | _me.makedir = function(dir, mode) { |
| 140 | 12 | dir = _fixpath(dir); |
| 141 | 12 | if (!path.existsSync(dir)) { |
| 142 | 1 | var p = path.dirname(dir); |
| 143 | 1 | if (p && p != dir) { |
| 144 | 1 | _me.makedir(p); |
| 145 | } | |
| 146 | 1 | fs.mkdirSync(dir, mode || 493/** 0755 */); |
| 147 | } | |
| 148 | 12 | return _me; |
| 149 | }; | |
| 150 | /* }}} */ | |
| 151 | ||
| 152 | 5 | return _me; |
| 153 | ||
| 154 | }; | |
| 155 |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | var Config = require(__dirname + '/config.js'); |
| 4 | 1 | var Log = require(__dirname + '/log.js'); |
| 5 | 1 | var Extend = require(__dirname + '/extend.js'); |
| 6 | 1 | var Mysql = require(__dirname + '/mysql.js'); |
| 7 | ||
| 8 | /** | |
| 9 | * @åæ¾å¯¹è±¡ç对象å表 | |
| 10 | */ | |
| 11 | 1 | var __objects_list = {}; |
| 12 | ||
| 13 | /** | |
| 14 | * @keyå½ä¸å | |
| 15 | */ | |
| 16 | 1 | function _idx_normalize(idx) { |
| 17 | 19 | return idx.trim().toLowerCase(); |
| 18 | } | |
| 19 | ||
| 20 | /* {{{ public function cleanAll() */ | |
| 21 | /** | |
| 22 | * Remove objects from the factory | |
| 23 | */ | |
| 24 | 1 | function cleanAll(/*key*/) { |
| 25 | 54 | switch (arguments.length) { |
| 26 | case 0: | |
| 27 | 53 | __objects_list = {}; |
| 28 | 53 | break; |
| 29 | ||
| 30 | default: | |
| 31 | 1 | delete __objects_list[_idx_normalize(arguments[0])]; |
| 32 | 1 | break; |
| 33 | } | |
| 34 | ||
| 35 | 54 | return exports; |
| 36 | } | |
| 37 | 1 | exports.cleanAll = cleanAll; |
| 38 | /* }}} */ | |
| 39 | ||
| 40 | /* {{{ public function setObject() */ | |
| 41 | /** | |
| 42 | * @param {String} key, indexName of the Object | |
| 43 | * @param {Object} obj | |
| 44 | * @return null | |
| 45 | */ | |
| 46 | 1 | function setObject(key, obj, _clone) { |
| 47 | 6 | if (obj) { |
| 48 | 6 | __objects_list[_idx_normalize(key)] = _clone ? Extend.clone(obj) : obj; |
| 49 | } | |
| 50 | } | |
| 51 | 1 | exports.setObject = setObject; |
| 52 | /* }}} */ | |
| 53 | ||
| 54 | /* {{{ public function getObject() */ | |
| 55 | /** | |
| 56 | * visit an object according by indexName (key) | |
| 57 | */ | |
| 58 | 1 | function getObject(key, _clone) { |
| 59 | 12 | key = _idx_normalize(key); |
| 60 | 12 | if (undefined === __objects_list[key]) { |
| 61 | 3 | return null; |
| 62 | } | |
| 63 | ||
| 64 | 9 | return _clone ? Extend.clone(__objects_list[key]) : __objects_list[key]; |
| 65 | } | |
| 66 | 1 | exports.getObject = getObject; |
| 67 | /* }}} */ | |
| 68 | ||
| 69 | /* {{{ public function setMysql() */ | |
| 70 | 1 | function setMysql(key, obj) { |
| 71 | 1 | if (!obj.query) { |
| 72 | 0 | obj = Mysql.create(obj); |
| 73 | } | |
| 74 | 1 | return setObject('#mysql/' + key, obj, false); |
| 75 | } | |
| 76 | 1 | exports.setMysql = setMysql; |
| 77 | /* }}} */ | |
| 78 | ||
| 79 | /* {{{ public function getMysql() */ | |
| 80 | 1 | function getMysql(key) { |
| 81 | 1 | var mysql = getObject('#mysql/' + key, false); |
| 82 | 1 | return mysql ? mysql : require(__dirname + '/blackhole/mysql.js').create(); |
| 83 | } | |
| 84 | 1 | exports.getMysql = getMysql; |
| 85 | /* }}} */ | |
| 86 | ||
| 87 | /* {{{ public function setLog() */ | |
| 88 | 1 | function setLog(key, obj) { |
| 89 | 1 | if (!obj.debug || 'function' != typeof(obj.debug)) { |
| 90 | 0 | obj = Log.create(obj); |
| 91 | } | |
| 92 | 1 | return setObject('#log/' + key, obj, false); |
| 93 | } | |
| 94 | 1 | exports.setLog = setLog; |
| 95 | /* }}} */ | |
| 96 | ||
| 97 | /* {{{ public function getLog() */ | |
| 98 | 1 | function getLog(key) { |
| 99 | 2 | var _log = getObject('#log/' + key, false); |
| 100 | 2 | return _log ? _log : require(__dirname + '/blackhole/log.js').create(); |
| 101 | } | |
| 102 | 1 | exports.getLog = getLog; |
| 103 | /* }}} */ | |
| 104 | ||
| 105 | /* {{{ public function setConfig() */ | |
| 106 | 1 | exports.setConfig = function(key, obj) { |
| 107 | 0 | if (!obj.get || 'function' !== typeof(obj.get)) { |
| 108 | 0 | obj = Config.create(obj); |
| 109 | } | |
| 110 | ||
| 111 | 0 | return setObject('#config/' + key, obj, false); |
| 112 | } | |
| 113 | /* }}} */ | |
| 114 | ||
| 115 | /* {{{ public function getConfig() */ | |
| 116 | 1 | exports.getConfig = function(key) { |
| 117 | 0 | var _conf = getObject('#config/' + key, false); |
| 118 | 0 | return _conf ? _conf : require(__dirname + '/blackhole/config.js').create(); |
| 119 | }; | |
| 120 | /* }}} */ | |
| 121 |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | ||
| 5 | 1 | var fs = require('fs'); |
| 6 | 1 | var extend = require(__dirname + '/extend.js'); |
| 7 | ||
| 8 | 1 | exports.create = function(file) { |
| 9 | ||
| 10 | /* {{{ config file parse() */ | |
| 11 | 8 | var value = {}; |
| 12 | 8 | var _call = null; |
| 13 | 8 | switch (file.split('.').pop().trim().toLowerCase()) { |
| 14 | case 'json': | |
| 15 | 1 | _call = parse_json_file; |
| 16 | 1 | break; |
| 17 | ||
| 18 | case 'ini': | |
| 19 | 6 | _call = parse_ini_file; |
| 20 | 6 | break; |
| 21 | ||
| 22 | default: | |
| 23 | 1 | _call = parse_js_file; |
| 24 | 1 | break; |
| 25 | } | |
| 26 | ||
| 27 | 8 | value = _call(file); |
| 28 | /* }}} */ | |
| 29 | ||
| 30 | 8 | var _me = {}; |
| 31 | 8 | _me.get = function(key, _default) { |
| 32 | 15 | return (undefined === value[key]) ? _default : extend.clone(value[key]); |
| 33 | }; | |
| 34 | ||
| 35 | 8 | _me.all = function() { |
| 36 | 2 | return value; |
| 37 | }; | |
| 38 | ||
| 39 | 8 | _me.find = function(prefix) { |
| 40 | 2 | var map = {}; |
| 41 | 2 | if (!prefix) { |
| 42 | 1 | return map; |
| 43 | } | |
| 44 | 1 | for (var i in value) { |
| 45 | 7 | if (0 === i.indexOf(prefix + ':')) { |
| 46 | 1 | map[i.slice(1 + prefix.length)] = extend.clone(value[i]); |
| 47 | } | |
| 48 | } | |
| 49 | 1 | return map; |
| 50 | }; | |
| 51 | ||
| 52 | 8 | return _me; |
| 53 | }; | |
| 54 | ||
| 55 | /* {{{ function parse_js_file() */ | |
| 56 | 1 | function parse_js_file(fname) { |
| 57 | 1 | return require(fname); |
| 58 | } | |
| 59 | /* }}} */ | |
| 60 | ||
| 61 | /* {{{ function parse_json_file() */ | |
| 62 | 1 | function parse_json_file(fname) { |
| 63 | 1 | var _text = fs.readFileSync(fname, 'utf8').trim().replace(/'/g, '"'); |
| 64 | 1 | return JSON.parse(_text); |
| 65 | } | |
| 66 | /* }}} */ | |
| 67 | ||
| 68 | /* {{{ function parse_ini_file() */ | |
| 69 | 1 | function parse_ini_file(fname) { |
| 70 | 6 | var data = {}; |
| 71 | 6 | var sect = null; |
| 72 | ||
| 73 | 6 | var lines = fs.readFileSync(fname, 'utf8').trim().split('\n'); |
| 74 | 6 | lines.forEach(function(line) { |
| 75 | 43 | line = line.trim(); |
| 76 | 43 | if (!line.length || ';' == line.slice(0, 1)) { |
| 77 | 18 | return; |
| 78 | } | |
| 79 | ||
| 80 | 25 | var match = line.match(/^\s*\[([^\]]+)\]\s*$/); |
| 81 | 25 | if (match) { |
| 82 | 7 | sect = match[1]; |
| 83 | 7 | data[sect] = {}; |
| 84 | } else { | |
| 85 | 18 | var match = line.match(/^\s*([^=\s]+)\s*=\s*(.*)\s*$/); |
| 86 | 18 | if (!match) { |
| 87 | 1 | return; |
| 88 | } | |
| 89 | ||
| 90 | 17 | var key = match[1]; |
| 91 | 17 | var tmp = _clean(match[2]); |
| 92 | 17 | if (sect) { |
| 93 | 5 | data[sect][key] = tmp; |
| 94 | } else { | |
| 95 | 12 | data[key] = tmp; |
| 96 | } | |
| 97 | } | |
| 98 | }); | |
| 99 | 6 | return data; |
| 100 | } | |
| 101 | /* }}} */ | |
| 102 | ||
| 103 | /* {{{ function _clean() */ | |
| 104 | 1 | function _clean(val) { |
| 105 | ||
| 106 | 17 | if (/^-?(\d|\.)+$/.test(val)) { |
| 107 | 5 | return val - 0; |
| 108 | } | |
| 109 | ||
| 110 | 12 | var _me = []; |
| 111 | ||
| 112 | 12 | val = val.replace(/^("|')+/, '').replace(/("|')+$/, ''); |
| 113 | 12 | for (var i = 0; i < val.length; i++) { |
| 114 | 160 | var the = val.slice(i, i + 1); |
| 115 | 160 | if ('\\' == the) { |
| 116 | 1 | i++; |
| 117 | 1 | _me.push(val.slice(i, i + 1)); |
| 118 | } else { | |
| 119 | 159 | _me.push(the); |
| 120 | } | |
| 121 | } | |
| 122 | ||
| 123 | 12 | return _me.join(''); |
| 124 | } | |
| 125 | /* }}} */ | |
| 126 |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | ||
| 5 | /* {{{ public function clone() */ | |
| 6 | 1 | var clone = exports.clone = function(obj) { |
| 7 | 76 | var _type = typeof(obj); |
| 8 | 76 | if ('object' == _type && null !== obj) { |
| 9 | 22 | var _me = Array.isArray(obj) ? [] : {}; |
| 10 | 22 | for (var i in obj) { |
| 11 | 39 | _me[i] = clone(obj[i]); |
| 12 | } | |
| 13 | 22 | return _me; |
| 14 | } | |
| 15 | ||
| 16 | 54 | return obj; |
| 17 | } | |
| 18 | /* }}} */ | |
| 19 | ||
| 20 | /* {{{ public function concat() */ | |
| 21 | /** | |
| 22 | * buffer concat | |
| 23 | */ | |
| 24 | 1 | var concat = exports.concat = function() { |
| 25 | ||
| 26 | 1 | var chunk = []; |
| 27 | 1 | var total = 0; |
| 28 | ||
| 29 | 1 | var _me = {}; |
| 30 | 1 | _me.push = function (data) { |
| 31 | 4 | if (data instanceof Buffer) { |
| 32 | 3 | chunk.push(data); |
| 33 | 3 | total += data.length; |
| 34 | } | |
| 35 | }; | |
| 36 | ||
| 37 | 1 | _me.all = function () { |
| 38 | 4 | if (0 == chunk.length) { |
| 39 | 1 | return new Buffer(0); |
| 40 | } | |
| 41 | ||
| 42 | 3 | if (1 == chunk.length) { |
| 43 | 1 | return chunk[0]; |
| 44 | } | |
| 45 | ||
| 46 | 2 | var data = new Buffer(total), pos = 0; |
| 47 | 2 | chunk.forEach(function(item) { |
| 48 | 5 | item.copy(data, pos); |
| 49 | 5 | pos += item.length; |
| 50 | }); | |
| 51 | ||
| 52 | 2 | return data; |
| 53 | }; | |
| 54 | ||
| 55 | 1 | return _me; |
| 56 | } | |
| 57 | /* }}} */ | |
| 58 | ||
| 59 | /* {{{ public function escape() */ | |
| 60 | /** | |
| 61 | * 对å符串è¿è¡å®å ¨è½¬ä¹ | |
| 62 | * @param {String} str | |
| 63 | * @param {String} charset, default utf-8 | |
| 64 | * @return {String} | |
| 65 | */ | |
| 66 | 1 | var __escapemap = { |
| 67 | '\'' : '\\\'', | |
| 68 | '"' : '\\\"', | |
| 69 | '\\' : '\\\\', | |
| 70 | '\0' : '\\0', | |
| 71 | '\n' : '\\n', | |
| 72 | '\r' : '\\r', | |
| 73 | '\b' : '\\b', | |
| 74 | '\t' : '\\t', | |
| 75 | '\x1a': '\\Z', /**< EOF */ | |
| 76 | }; | |
| 77 | 1 | var escape = exports.escape = function(str) { |
| 78 | 2 | if ('number' === (typeof str)) { |
| 79 | 1 | return str; |
| 80 | } | |
| 81 | ||
| 82 | 1 | var _char = []; |
| 83 | 1 | for (var i = 0, m = str.length; i < m; i++) { |
| 84 | 11 | var _me = str.charAt(i); |
| 85 | 11 | if (__escapemap[_me]) { |
| 86 | 4 | _me = __escapemap[_me]; |
| 87 | } | |
| 88 | 11 | _char.push(_me); |
| 89 | } | |
| 90 | ||
| 91 | 1 | return _char.join(''); |
| 92 | } | |
| 93 | /* }}} */ | |
| 94 |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | ||
| 5 | 1 | var fs = require('fs'); |
| 6 | 1 | var moment = require('moment'); |
| 7 | ||
| 8 | /** | |
| 9 | * @log level defination | |
| 10 | */ | |
| 11 | 1 | var DEBUG = exports.DEBUG = 0x01; |
| 12 | 1 | var NOTICE = exports.NOTICE = 0x02; |
| 13 | 1 | var WARN = exports.WARN = 0x04; |
| 14 | 1 | var ERROR = exports.ERROR = 0x08; |
| 15 | 1 | var ALL = exports.ALL = 0xff; |
| 16 | ||
| 17 | /* {{{ private function _flush_time() */ | |
| 18 | 1 | function _flush_time() { |
| 19 | 3 | return moment().format('YYYY-MM-DD HH:mm:ss.SSS'); |
| 20 | } | |
| 21 | ||
| 22 | 1 | var _timenow = _flush_time(); |
| 23 | ||
| 24 | /* }}} */ | |
| 25 | ||
| 26 | 1 | function serialize(info) { |
| 27 | 11 | return JSON.stringify(info); |
| 28 | } | |
| 29 | ||
| 30 | /* {{{ private function _print() */ | |
| 31 | 1 | function _print(msg, color) { |
| 32 | 1 | console.log(msg); |
| 33 | } | |
| 34 | /* }}} */ | |
| 35 | ||
| 36 | 1 | var _objects = []; |
| 37 | 1 | var _timer = setInterval(function() { |
| 38 | 2 | _timenow = _flush_time(); |
| 39 | 2 | _objects.forEach(function (log) { |
| 40 | 0 | if (log && log.flush) { |
| 41 | 0 | log.flush(); |
| 42 | } | |
| 43 | }); | |
| 44 | }, 500); | |
| 45 | 1 | process.on('exit', function () { |
| 46 | 2 | _objects.forEach(function (log) { |
| 47 | 6 | if (log && log.close) { |
| 48 | 6 | log.close(); |
| 49 | } | |
| 50 | }); | |
| 51 | 2 | _objects = []; |
| 52 | }); | |
| 53 | ||
| 54 | 1 | var _exceptionLoger = null; |
| 55 | 1 | exports.setExceptionLogger = function (options) { |
| 56 | 1 | _exceptionLoger = exports.create(options); |
| 57 | }; | |
| 58 | ||
| 59 | 1 | exports.exception = function (error, info) { |
| 60 | 2 | if (_exceptionLoger) { |
| 61 | 2 | _exceptionLoger._excep(error, info); |
| 62 | } | |
| 63 | }; | |
| 64 | ||
| 65 | 1 | exports.create = function(options) { |
| 66 | ||
| 67 | 6 | var _options = { |
| 68 | 'file' : '', | |
| 69 | 'level' : ALL & ~DEBUG, | |
| 70 | 'buffer': 16 * 1024, | |
| 71 | }; | |
| 72 | ||
| 73 | 6 | for (var i in options) { |
| 74 | 11 | _options[i] = options[i]; |
| 75 | } | |
| 76 | ||
| 77 | 6 | var _stream = null; |
| 78 | 6 | if (_options.file) { |
| 79 | 6 | try { |
| 80 | 6 | _stream = fs.createWriteStream(_options.file, { |
| 81 | 'flags' : 'a+', 'encoding' : 'utf8', 'mode' : 420 /** 0644 */, | |
| 82 | }); | |
| 83 | } catch (e) { | |
| 84 | } | |
| 85 | } | |
| 86 | ||
| 87 | 6 | var _buffers = []; |
| 88 | 6 | var _bufsize = 0; |
| 89 | ||
| 90 | 6 | function _build(type, tag, info) { |
| 91 | 9 | return [type + ':', '[' + _timenow + ']', process.pid, tag.trim().toUpperCase(), serialize(info)].join("\t") |
| 92 | 6 | }; |
| 93 | ||
| 94 | 6 | function _write(msg) { |
| 95 | 10 | if (!_stream) { |
| 96 | 1 | _print(msg); |
| 97 | 1 | return; |
| 98 | } | |
| 99 | ||
| 100 | 9 | _buffers.push(msg); |
| 101 | 9 | _bufsize += msg.length; |
| 102 | 9 | if (_bufsize >= _options.buffer) { |
| 103 | 1 | _flush_stream(); |
| 104 | } | |
| 105 | } | |
| 106 | ||
| 107 | /* {{{ private function _flush_stream() */ | |
| 108 | 6 | function _flush_stream() { |
| 109 | 7 | if (_buffers.length < 1) { |
| 110 | 1 | return; |
| 111 | } | |
| 112 | 6 | _stream.write(_buffers.join("\n") + "\n"); |
| 113 | 6 | _buffers = []; |
| 114 | 6 | _bufsize = 0; |
| 115 | } | |
| 116 | ||
| 117 | 6 | var _self = {}; |
| 118 | ||
| 119 | /* }}} */ | |
| 120 | ||
| 121 | /* {{{ public function debug() */ | |
| 122 | 6 | _self.debug = function(tag, info) { |
| 123 | 3 | if (DEBUG & _options.level) { |
| 124 | 1 | _write(_build('DEBUG', tag, info)); |
| 125 | } | |
| 126 | }; | |
| 127 | /* }}} */ | |
| 128 | ||
| 129 | /* {{{ public function notice() */ | |
| 130 | 6 | _self.notice = function(tag, info) { |
| 131 | 4 | if (NOTICE & _options.level) { |
| 132 | 3 | _write(_build('NOTICE', tag, info)); |
| 133 | } | |
| 134 | }; | |
| 135 | /* }}} */ | |
| 136 | ||
| 137 | /* {{{ public function warn() */ | |
| 138 | 6 | _self.warn = function(tag, info) { |
| 139 | 1 | if (WARN & _options.level) { |
| 140 | 1 | _write(_build('WARN', tag, info)); |
| 141 | } | |
| 142 | }; | |
| 143 | /* }}} */ | |
| 144 | ||
| 145 | /* {{{ public function error() */ | |
| 146 | 6 | _self.error = function(tag, info) { |
| 147 | 4 | if (ERROR & _options.level) { |
| 148 | 4 | _write(_build('ERROR', tag, info)); |
| 149 | } | |
| 150 | }; | |
| 151 | /* }}} */ | |
| 152 | ||
| 153 | /* {{{ public function close() */ | |
| 154 | 6 | _self.close = function() { |
| 155 | 9 | if (_stream) { |
| 156 | 6 | _flush_stream(); |
| 157 | 6 | _stream.end(); |
| 158 | 6 | _stream = null; |
| 159 | } | |
| 160 | }; | |
| 161 | /* }}} */ | |
| 162 | ||
| 163 | /* {{{ private function _excep() */ | |
| 164 | 6 | _self._excep = function (error, info) { |
| 165 | 2 | if (!(error instanceof Error)) { |
| 166 | 1 | return; |
| 167 | } | |
| 168 | ||
| 169 | 1 | if (!error.name) { |
| 170 | 0 | error.name = 'UnknownException'; |
| 171 | 1 | } else if (error.name.indexOf('Exception') < 0) { |
| 172 | 1 | error.name = error.name + 'Exception'; |
| 173 | } | |
| 174 | ||
| 175 | 1 | var msg = [_timenow + ' ' + error.stack]; |
| 176 | 1 | for (var key in info) { |
| 177 | 2 | msg.push(key + ': ' + serialize(info[key])); |
| 178 | } | |
| 179 | 1 | msg.push(_timenow, ''); |
| 180 | 1 | _write(msg.join("\n")); |
| 181 | }; | |
| 182 | /* }}} */ | |
| 183 | ||
| 184 | 6 | _self.flush = _flush_stream; |
| 185 | 6 | _objects.push(_self); |
| 186 | ||
| 187 | 6 | return _self; |
| 188 | ||
| 189 | } | |
| 190 |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | ||
| 5 | 1 | var util = require('util'); |
| 6 | 1 | var events = require('events'); |
| 7 | 1 | var mysql = require('mysql'); |
| 8 | ||
| 9 | 1 | var READONLY = exports.READONLY = 1; |
| 10 | 1 | var WRITABLE = exports.WRITABLE = 2; |
| 11 | ||
| 12 | /* {{{ function _writable() */ | |
| 13 | ||
| 14 | 1 | var _writable = function (c, f) { |
| 15 | 3 | c.query("SHOW VARIABLES LIKE 'READ_ONLY%'", function (error, res) { |
| 16 | 3 | f = f || function () {}; |
| 17 | 3 | if (error) { |
| 18 | 0 | return f(error, false); |
| 19 | } | |
| 20 | ||
| 21 | 3 | var r = {}; |
| 22 | 3 | for (var i = 0; i < res.length; i++) { |
| 23 | 3 | r = res[i]; |
| 24 | 3 | if (r && r.Variable_name && 'read_only' === r.Variable_name.toLowerCase()) { |
| 25 | 3 | return f(null, r.Value && r.Value.match(/^(off)$/i) ? true : false); |
| 26 | } | |
| 27 | } | |
| 28 | ||
| 29 | 0 | f(null, false); |
| 30 | }); | |
| 31 | }; | |
| 32 | ||
| 33 | /* }}} */ | |
| 34 | ||
| 35 | /* {{{ function _heartbeat() */ | |
| 36 | /** | |
| 37 | * @ XXX: ç¨åç¬çä¸ä¸ªè¿æ¥å¤çå¿è·³ | |
| 38 | */ | |
| 39 | 1 | var _heartbeat = function (_self, next) { |
| 40 | 3 | _writable(_self._handle, function (error, yes) { |
| 41 | 3 | if (error) { |
| 42 | 0 | _self._status = 0; |
| 43 | } else { | |
| 44 | 3 | _self._status = yes ? (READONLY | WRITABLE) : READONLY; |
| 45 | 3 | _self.emit('ready', _self._status); |
| 46 | } | |
| 47 | ||
| 48 | 3 | next && setTimeout(next, 30000); |
| 49 | }); | |
| 50 | }; | |
| 51 | /* }}} */ | |
| 52 | ||
| 53 | /* {{{ function errorHandle() */ | |
| 54 | 1 | var errorHandle = function (_self) { |
| 55 | 3 | _self._handle.on('error', function (error) { |
| 56 | ||
| 57 | /** | |
| 58 | * @ å夿å¼è¿æ¥ | |
| 59 | */ | |
| 60 | 0 | if (_self._status < 0) { |
| 61 | 0 | return; |
| 62 | } | |
| 63 | ||
| 64 | 0 | _self._status = 0; |
| 65 | 0 | _self.emit('error', error); |
| 66 | ||
| 67 | /** | |
| 68 | * @ å°è¯éè¿ | |
| 69 | */ | |
| 70 | 0 | if (!error.fatal || 'PROTOCOL_CONNECTION_LOST' !== error.code) { |
| 71 | 0 | return; |
| 72 | } | |
| 73 | ||
| 74 | 0 | _self._handle = mysql.createConnection(_self._handle.config); |
| 75 | 0 | errorHandle(_self); |
| 76 | }); | |
| 77 | }; | |
| 78 | /* }}} */ | |
| 79 | ||
| 80 | 1 | var Agent = function (options) { |
| 81 | ||
| 82 | 3 | events.EventEmitter.call(this); |
| 83 | ||
| 84 | 3 | this._status = 0; |
| 85 | ||
| 86 | 3 | this._handle = mysql.createConnection(options); |
| 87 | ||
| 88 | 3 | errorHandle(this); |
| 89 | 3 | var _self = this; |
| 90 | 3 | _self._handle.connect(function (error) { |
| 91 | 3 | _heartbeat(_self); |
| 92 | }); | |
| 93 | ||
| 94 | }; | |
| 95 | 1 | util.inherits(Agent, events.EventEmitter); |
| 96 | ||
| 97 | 1 | Agent.prototype.query = function (sql, options, callback) { |
| 98 | ||
| 99 | 6 | if ('function' === (typeof options)) { |
| 100 | 6 | callback = options; |
| 101 | } | |
| 102 | ||
| 103 | 6 | var _self = this; |
| 104 | 6 | _self._handle.query(sql, function (error, res) { |
| 105 | 6 | callback(error, res); |
| 106 | 6 | var p = _self._handle._protocol; |
| 107 | 6 | if (p && p._queue && !p._queue.length) { |
| 108 | 0 | _self.emit('ready', _self._status); |
| 109 | } | |
| 110 | }); | |
| 111 | }; | |
| 112 | ||
| 113 | 1 | Agent.prototype.close = function (callback) { |
| 114 | 0 | var _self = this; |
| 115 | 0 | _self._status = -1; |
| 116 | 0 | _self._handle.end(function (error) { |
| 117 | 0 | callback && callback(error); |
| 118 | 0 | _self._handle = null; |
| 119 | }); | |
| 120 | }; | |
| 121 | ||
| 122 | 1 | exports.create = function (options) { |
| 123 | 2 | return new Agent(options); |
| 124 | }; | |
| 125 | ||
| 126 | 1 | exports.createPool = function (options) { |
| 127 | ||
| 128 | 1 | var _options = { |
| 129 | 'poolsize' : 4, | |
| 130 | }; | |
| 131 | 1 | for (var i in options) { |
| 132 | 1 | _options[i] = options[i]; |
| 133 | } | |
| 134 | ||
| 135 | 1 | var r_queue = []; |
| 136 | ||
| 137 | 1 | var w_queue = []; |
| 138 | ||
| 139 | 1 | var r_stack = []; |
| 140 | ||
| 141 | 1 | var w_stack = []; |
| 142 | ||
| 143 | 1 | var conns = []; |
| 144 | ||
| 145 | 1 | var _me = {}; |
| 146 | ||
| 147 | /* {{{ public function addserver() */ | |
| 148 | ||
| 149 | 1 | _me.addserver = function (config) { |
| 150 | ||
| 151 | 1 | var m = new Agent(config); |
| 152 | 1 | var i = conns.push(m); |
| 153 | ||
| 154 | 1 | m.on('ready', function (flag) { |
| 155 | 1 | if ((flag & WRITABLE) > 0) { |
| 156 | 1 | w_stack.push(i); |
| 157 | 0 | } else if ((flag & READONLY) > 0) { |
| 158 | 0 | r_stack.push(i); |
| 159 | } | |
| 160 | }); | |
| 161 | }; | |
| 162 | ||
| 163 | /* }}} */ | |
| 164 | ||
| 165 | /* {{{ public function query() */ | |
| 166 | ||
| 167 | 1 | _me.query = function (sql, options, callback) { |
| 168 | 0 | if (sql.match(/^(SELECT|SHOW|DESC|DESCRIBE|KILL)\s+/i)) { |
| 169 | 0 | r_queue.push('a'); |
| 170 | } else { | |
| 171 | 0 | w_queue.push('a'); |
| 172 | } | |
| 173 | }; | |
| 174 | ||
| 175 | /* }}} */ | |
| 176 | ||
| 177 | 1 | return _me; |
| 178 | }; | |
| 179 |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | ||
| 5 | 1 | var Redis = require('redis'); |
| 6 | ||
| 7 | 1 | exports.create = function(servers, options) { |
| 8 | ||
| 9 | /** | |
| 10 | * @æºå¨å表 | |
| 11 | */ | |
| 12 | 5 | var _servers = ['127.0.0.1:6379']; |
| 13 | 5 | if (servers) { |
| 14 | 5 | _servers = Array.isArray(servers) ? servers : servers.split(','); |
| 15 | } | |
| 16 | ||
| 17 | /** | |
| 18 | * @è¿æ¥é ç½® | |
| 19 | */ | |
| 20 | 5 | var _options = { |
| 21 | 'timeout' : 50, | |
| 22 | }; | |
| 23 | 5 | for (var i in options) { |
| 24 | 2 | _options[i] = options[i]; |
| 25 | } | |
| 26 | 5 | if (!_options.connect_timeout) { |
| 27 | 5 | _options.connect_timeout = _options.timeout; |
| 28 | } | |
| 29 | ||
| 30 | /** | |
| 31 | * @è¿æ¥å¯¹è±¡ | |
| 32 | */ | |
| 33 | 5 | var _handles = {}; |
| 34 | ||
| 35 | /** | |
| 36 | * @对象key | |
| 37 | */ | |
| 38 | 5 | var _handkey = []; |
| 39 | ||
| 40 | /** | |
| 41 | * @è¿æ¥è®¡æ°å¨ | |
| 42 | */ | |
| 43 | 5 | var _connnum = 0; |
| 44 | ||
| 45 | /** | |
| 46 | * @请æ±éå | |
| 47 | */ | |
| 48 | 5 | var _queue = require(__dirname + '/queue.js').create(_options); |
| 49 | 5 | var _AfterRedisConnected = function (callback, onerr) { |
| 50 | 15 | if (_handkey.length < 1) { |
| 51 | 7 | _queue.push(callback, onerr); |
| 52 | } else { | |
| 53 | 8 | callback(); |
| 54 | } | |
| 55 | }; | |
| 56 | ||
| 57 | /** | |
| 58 | * @è¿æ¥å½æ° | |
| 59 | */ | |
| 60 | 5 | var _connect = function (item) { |
| 61 | 10 | var _conn; |
| 62 | 10 | var _me = item.split(':'); |
| 63 | ||
| 64 | 10 | if (_me.length > 1) { |
| 65 | 10 | _conn = Redis.createClient(_me[1], _me[0], _options); |
| 66 | } else { | |
| 67 | 0 | _conn = Redis.createClient(item, _options); |
| 68 | } | |
| 69 | ||
| 70 | 10 | _conn.removeAllListeners('error'); |
| 71 | 10 | _conn.on('error', function (error) { |
| 72 | 0 | require(__dirname + '/log.js').exception(error); |
| 73 | }); | |
| 74 | 10 | _conn.once('ready', function () { |
| 75 | 8 | var p = (_connnum++); |
| 76 | 8 | _handles[p] = _conn; |
| 77 | 8 | _handkey = Object.keys(_handles); |
| 78 | ||
| 79 | 8 | _conn.on('error', function (error) { |
| 80 | 0 | delete _handles[p]; |
| 81 | 0 | _handkey = Object.keys(_handles); |
| 82 | 0 | setTimeout(function () { |
| 83 | 0 | _connect(item); |
| 84 | }, 100); | |
| 85 | }); | |
| 86 | ||
| 87 | 8 | var c; |
| 88 | 8 | while (c = _queue.shift()) { |
| 89 | 6 | c(); |
| 90 | } | |
| 91 | }); | |
| 92 | }; | |
| 93 | 5 | _servers.forEach(_connect); |
| 94 | ||
| 95 | /** | |
| 96 | * @è·åè¿æ¥ | |
| 97 | */ | |
| 98 | 5 | var _getconn = function(key) { |
| 99 | ||
| 100 | 14 | var idx = 5381; |
| 101 | 14 | key = (key instanceof Buffer) ? key : new Buffer(key); |
| 102 | 14 | for (var i = 0, len = key.length; i < len; i++) { |
| 103 | 78 | idx = (idx << 5 + idx) + key[i]; |
| 104 | } | |
| 105 | 14 | idx = _handkey[Math.abs(idx) % _handkey.length]; |
| 106 | ||
| 107 | 14 | return _handles[idx]; |
| 108 | }; | |
| 109 | ||
| 110 | /** | |
| 111 | * @redis对象 | |
| 112 | */ | |
| 113 | 5 | var _me = {}; |
| 114 | ||
| 115 | /* {{{ public function set() */ | |
| 116 | 5 | _me.get = function(key, callback) { |
| 117 | 6 | _AfterRedisConnected(function () { |
| 118 | 6 | _getconn(key).get(key, function(error, result) { |
| 119 | 6 | callback(error, result && result.length ? result : null); |
| 120 | }) | |
| 121 | }, callback); | |
| 122 | }; | |
| 123 | /* }}} */ | |
| 124 | ||
| 125 | /* {{{ public function set() */ | |
| 126 | 5 | _me.set = function(key, value, callback, expire) { |
| 127 | 9 | _AfterRedisConnected(function () { |
| 128 | 8 | _getconn(key).setex(key, expire || 86400, value, function(error, result) { |
| 129 | 8 | callback(error); |
| 130 | }) | |
| 131 | }, callback); | |
| 132 | }; | |
| 133 | /* }}} */ | |
| 134 | ||
| 135 | /* {{{ public function delete() */ | |
| 136 | 5 | _me.delete = function(key, callback) { |
| 137 | 2 | _me.set(key, '', callback); |
| 138 | }; | |
| 139 | /* }}} */ | |
| 140 | ||
| 141 | 5 | return _me; |
| 142 | }; |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | ||
| 5 | 1 | exports.create = function(fn, options) { |
| 6 | ||
| 7 | /** | |
| 8 | * @æé å¨ | |
| 9 | */ | |
| 10 | 2 | var _creator = fn; |
| 11 | ||
| 12 | /** | |
| 13 | * @é ç½®å±æ§ | |
| 14 | */ | |
| 15 | /* {{{ _options */ | |
| 16 | 2 | var _options = { |
| 17 | 'size' : 10, /**< æå¤§è¿æ¥æ° */ | |
| 18 | 'idle' : 30000, /**< ç©ºé²æ¶é´ */ | |
| 19 | }; | |
| 20 | 2 | for (var i in options) { |
| 21 | 4 | _options[i] = options[i]; |
| 22 | } | |
| 23 | /* }}} */ | |
| 24 | ||
| 25 | /** | |
| 26 | * @对象å表 | |
| 27 | */ | |
| 28 | /* {{{ _objects */ | |
| 29 | /** | |
| 30 | * @被å ç¨çID | |
| 31 | */ | |
| 32 | 2 | var _stacks = []; |
| 33 | 2 | var _objects = []; |
| 34 | ||
| 35 | 2 | var _connect = function() { |
| 36 | 7 | _stacks.push(_objects.push({ |
| 37 | '_up' : Date.now(), | |
| 38 | '_me' : _creator(), | |
| 39 | 'use' : 0, | |
| 40 | }) - 1); | |
| 41 | }; | |
| 42 | /* }}} */ | |
| 43 | ||
| 44 | /** | |
| 45 | * @è°ç¨è¯·æ± | |
| 46 | */ | |
| 47 | /* {{{ _execute() */ | |
| 48 | 2 | var _callback = []; |
| 49 | 2 | var _execute = function() { |
| 50 | 588 | while (_callback.length && _stacks.length) { |
| 51 | 2 | var cb = _callback.shift(); |
| 52 | 2 | var id = _stacks.pop(); |
| 53 | 2 | cb(_objects[id]._me, id); |
| 54 | 2 | _objects[id].use = 1; |
| 55 | 2 | _objects[id]._up = Date.now(); |
| 56 | //delete cb; | |
| 57 | } | |
| 58 | 588 | if (_callback.length) { |
| 59 | 586 | process.nextTick(_execute); |
| 60 | } | |
| 61 | }; | |
| 62 | /* }}} */ | |
| 63 | ||
| 64 | /** | |
| 65 | * @ç©ºé²æ£æ¥å®æ¶å¨ | |
| 66 | */ | |
| 67 | /* {{{ _timer */ | |
| 68 | 2 | var _timer = setInterval(function() { |
| 69 | 20 | var now = Date.now() - _options.idle; |
| 70 | 20 | var ids = []; |
| 71 | 20 | var obj = []; |
| 72 | 20 | _objects.forEach(function(item) { |
| 73 | 53 | if (item._up >= now || item.use > 0) { |
| 74 | 49 | ids.push(obj.push(item) - 1); |
| 75 | 49 | return; |
| 76 | } | |
| 77 | ||
| 78 | 4 | if (item._me.close && 'function' === (typeof item._me.close)) { |
| 79 | 4 | item._me.close(); |
| 80 | } | |
| 81 | }); | |
| 82 | 20 | _objects= obj; |
| 83 | 20 | _stacks = ids; |
| 84 | }, Math.ceil(_options.idle / 10)); | |
| 85 | /* }}} */ | |
| 86 | ||
| 87 | 2 | var _me = {}; |
| 88 | ||
| 89 | /* {{{ public function get() */ | |
| 90 | /** | |
| 91 | * è·åä¸ä¸ªèµæº | |
| 92 | * | |
| 93 | * @access public | |
| 94 | * @param {Function} callback | |
| 95 | * @param {Integer} timeout | |
| 96 | */ | |
| 97 | 2 | _me.get = function(callback, timeout) { |
| 98 | 10 | if (!_stacks.length && _objects.length < _options.size) { |
| 99 | 7 | _connect(); |
| 100 | } | |
| 101 | ||
| 102 | 10 | if (_stacks.length) { |
| 103 | 8 | var id = _stacks.pop(); |
| 104 | 8 | callback(_objects[id]._me, id); |
| 105 | 8 | _objects[id].use = 1; |
| 106 | 8 | _objects[id]._up = Date.now(); |
| 107 | } else { | |
| 108 | 2 | _callback.push(callback); |
| 109 | 2 | process.nextTick(_execute); |
| 110 | } | |
| 111 | }; | |
| 112 | /* }}} */ | |
| 113 | ||
| 114 | /* {{{ public function free() */ | |
| 115 | /** | |
| 116 | * éæ¾è¢«éå®çèµæº | |
| 117 | * | |
| 118 | * @access public | |
| 119 | */ | |
| 120 | 2 | _me.free = function(id) { |
| 121 | 10 | if (_objects[id] && _objects[id].use > -1) { |
| 122 | 9 | _objects[id].use = 0; |
| 123 | 9 | _stacks.push(id); |
| 124 | } | |
| 125 | }; | |
| 126 | /* }}} */ | |
| 127 | ||
| 128 | /* {{{ public function remove() */ | |
| 129 | /** | |
| 130 | * ä»è¿æ¥æ± ä¸ç§»é¤ï¼ç¨äºè¿æ¥åºé®é¢æ¶è°ç¨ | |
| 131 | * @param {Integer} id | |
| 132 | */ | |
| 133 | 2 | _me.remove = function(id) { |
| 134 | 1 | var obj = _objects[id]; |
| 135 | 1 | if (obj) { |
| 136 | 1 | obj.use = -1; |
| 137 | 1 | obj._up = 0; |
| 138 | } | |
| 139 | ||
| 140 | 1 | _stacks = _stacks.filter(function(item) { |
| 141 | 2 | return id !== item; |
| 142 | }); | |
| 143 | }; | |
| 144 | /* }}} */ | |
| 145 | ||
| 146 | 2 | return _me; |
| 147 | ||
| 148 | }; |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | ||
| 5 | 1 | var extend = require(__dirname + '/extend.js'); |
| 6 | ||
| 7 | 1 | exports.create = function(size) { |
| 8 | ||
| 9 | 4 | var _size = parseInt(size, 10); |
| 10 | 4 | var _ceil = Math.ceil(_size * 1.4); |
| 11 | 4 | var _floo = Math.floor(_size * 0.8); |
| 12 | ||
| 13 | 4 | var _list = []; |
| 14 | ||
| 15 | 4 | var _stat = { |
| 16 | 'q' : 0, /**< æ¥è¯¢æ¬¡æ°(query) */ | |
| 17 | 's' : 0, /**< æ¥è¯¢æ¥é¿(steps) */ | |
| 18 | 'm' : 0, /**< æªå½ä¸æ¬¡æ°(miss) */ | |
| 19 | }; | |
| 20 | ||
| 21 | 4 | var _self = {}; |
| 22 | ||
| 23 | /* {{{ private function _search() */ | |
| 24 | 4 | function _search(key) { |
| 25 | 27 | var _is = false; |
| 26 | 27 | _stat.q++; |
| 27 | 27 | for (var i = 0, m = _list.length; i < m; i++) { |
| 28 | 33 | if (_list[i].k === key) { |
| 29 | 15 | _is = true; |
| 30 | 15 | break; |
| 31 | } | |
| 32 | } | |
| 33 | 27 | _stat.s += i; |
| 34 | 27 | _stat.m ++; |
| 35 | ||
| 36 | 27 | return _is ? i : -1; |
| 37 | } | |
| 38 | /* }}} */ | |
| 39 | ||
| 40 | /* {{{ public function set() */ | |
| 41 | 4 | _self.set = function(key, value) { |
| 42 | 9 | var key = key.trim(); |
| 43 | 9 | var pos = _search(key); |
| 44 | 9 | var itm = {'i':0,'k':key,'v':value}; |
| 45 | ||
| 46 | 9 | if (pos >= 0) { |
| 47 | 1 | _list[pos] = itm; |
| 48 | } else { | |
| 49 | 8 | if (_list.length >= _ceil) { |
| 50 | 1 | _list = _list.slice(0, _floo); |
| 51 | } | |
| 52 | 8 | _list.push(itm); |
| 53 | } | |
| 54 | ||
| 55 | 9 | return _self; |
| 56 | }; | |
| 57 | /* }}} */ | |
| 58 | ||
| 59 | /* {{{ public function get() */ | |
| 60 | 4 | _self.get = function(key) { |
| 61 | 18 | var pos = _search(key.trim()); |
| 62 | 18 | if (pos < 0) { |
| 63 | 4 | return null; |
| 64 | } | |
| 65 | 14 | var itm = _list[pos]; |
| 66 | 14 | itm.i++; |
| 67 | 14 | if (pos > 0) { |
| 68 | 5 | var i = Math.min(pos, itm.i * itm.i); |
| 69 | 5 | var t = _list[pos -i]; |
| 70 | 5 | _list[pos - i] = itm; |
| 71 | 5 | _list[pos] = { |
| 72 | 'i' : 0, | |
| 73 | 'k' : t.k, | |
| 74 | 'v' : t.v, | |
| 75 | }; | |
| 76 | } | |
| 77 | ||
| 78 | 14 | return extend.clone(itm.v); |
| 79 | }; | |
| 80 | /* }}} */ | |
| 81 | ||
| 82 | /* {{{ public function clean() */ | |
| 83 | 4 | _self.clean = function() { |
| 84 | 2 | _list = []; |
| 85 | 2 | return _self; |
| 86 | }; | |
| 87 | /* }}} */ | |
| 88 | ||
| 89 | /* {{{ public function status() */ | |
| 90 | 4 | _self.status = function() { |
| 91 | 3 | return _stat; |
| 92 | }; | |
| 93 | /* }}} */ | |
| 94 | ||
| 95 | 4 | return _self; |
| 96 | } | |
| 97 |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | ||
| 5 | 1 | exports.create = function (callback) { |
| 6 | ||
| 7 | /** | |
| 8 | * @ çå¾ çäºä»¶å表 | |
| 9 | */ | |
| 10 | 4 | var waits = {}; |
| 11 | ||
| 12 | /** | |
| 13 | * @ æå è¿åçé误 | |
| 14 | */ | |
| 15 | 4 | var error = null; |
| 16 | ||
| 17 | 4 | var _me = {}; |
| 18 | ||
| 19 | 4 | _me.wait = function (evt, cb) { |
| 20 | 8 | waits[evt] = true; |
| 21 | 8 | cb && cb(); |
| 22 | }; | |
| 23 | ||
| 24 | 4 | _me.emit = function (evt, e) { |
| 25 | 11 | if (!waits[evt]) { |
| 26 | 1 | return; |
| 27 | } | |
| 28 | ||
| 29 | 10 | if (e && !error) { |
| 30 | 1 | error = e; |
| 31 | } | |
| 32 | 10 | process.nextTick(function () { |
| 33 | 10 | delete waits[evt]; |
| 34 | 10 | for (var key in waits) { |
| 35 | 6 | return; |
| 36 | } | |
| 37 | ||
| 38 | 4 | callback(error); |
| 39 | }); | |
| 40 | }; | |
| 41 | ||
| 42 | 4 | return _me; |
| 43 | }; | |
| 44 |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | 1 | function noop() { |
| 5 | } | |
| 6 | ||
| 7 | 1 | exports.create = function() { |
| 8 | 2 | return { |
| 9 | 'debug' : noop, | |
| 10 | 'notice' : noop, | |
| 11 | 'warn' : noop, | |
| 12 | 'error' : noop, | |
| 13 | 'close' : noop, | |
| 14 | 'flush' : noop, | |
| 15 | }; | |
| 16 | } |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | 1 | exports.create = function() { |
| 5 | ||
| 6 | 1 | var _me = {}; |
| 7 | ||
| 8 | 1 | _me.get = function(key, _default) { |
| 9 | 1 | return _default; |
| 10 | }; | |
| 11 | ||
| 12 | 1 | _me.all = function() { |
| 13 | 1 | return {}; |
| 14 | }; | |
| 15 | ||
| 16 | 1 | return _me; |
| 17 | }; | |
| 18 |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | ||
| 5 | 1 | var _mysql = {}; |
| 6 | 1 | _mysql.query = function (sql, callback) { |
| 7 | 1 | callback(new Error('MysqlBlackhole')); |
| 8 | }; | |
| 9 | ||
| 10 | 1 | exports.create = function () { |
| 11 | 1 | return _mysql; |
| 12 | }; | |
| 13 | ||
| 14 | 1 | exports.createPool = function () { |
| 15 | 0 | var _me = {}; |
| 16 | 0 | _me.query = _mysql.query; |
| 17 | 0 | _me.addserver = function (mysql) { |
| 18 | }; | |
| 19 | ||
| 20 | 0 | return _me; |
| 21 | }; | |
| 22 |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | ||
| 5 | /* {{{ exports getkey() */ | |
| 6 | /** | |
| 7 | * æé key | |
| 8 | */ | |
| 9 | 1 | var cacheindex = function(key) { |
| 10 | ||
| 11 | 30 | key = (key instanceof Buffer) ? key : new Buffer(key); |
| 12 | ||
| 13 | 30 | var hash1 = 5381; |
| 14 | 30 | var hash2 = 0; |
| 15 | 30 | for (var i = 0, len = key.length; i < len; i++) { |
| 16 | 369 | hash1 = (hash1 << 5 + hash1) + key[i]; |
| 17 | 369 | hash2 = (hash2 << 4) ^ (hash2 >> 28) ^ key[i]; |
| 18 | } | |
| 19 | ||
| 20 | 30 | return ([hash1, hash2, key.length]).join(':'); |
| 21 | }; | |
| 22 | 1 | exports.getkey = cacheindex; |
| 23 | /* }}} */ | |
| 24 | ||
| 25 | /* {{{ function MemoryStore() */ | |
| 26 | /** | |
| 27 | * æ°æ®åå¨å¨å åä¸ | |
| 28 | */ | |
| 29 | 1 | var MemoryStore = function(size) { |
| 30 | ||
| 31 | 1 | var _pool = require(__dirname + '/mstack.js').create(size || 2000); |
| 32 | ||
| 33 | 1 | var _me = {}; |
| 34 | ||
| 35 | 1 | _me.set = function(key, value, callback) { |
| 36 | 1 | _pool.set(key, value); |
| 37 | 1 | callback(null); |
| 38 | }; | |
| 39 | ||
| 40 | 1 | _me.get = function(key, callback) { |
| 41 | 2 | callback(null, _pool.get(key)); |
| 42 | }; | |
| 43 | ||
| 44 | 1 | _me.delete = function(key, callback) { |
| 45 | 1 | _pool.clean(); |
| 46 | 1 | callback(null); |
| 47 | }; | |
| 48 | ||
| 49 | 1 | return _me; |
| 50 | }; | |
| 51 | /* }}} */ | |
| 52 | ||
| 53 | 1 | var __instances = {}; |
| 54 | 1 | exports.create = function(name, store, keeper, options) { |
| 55 | ||
| 56 | 8 | name = name.trim().toLowerCase(); |
| 57 | 8 | if (undefined !== __instances[name]) { |
| 58 | 2 | return __instances[name]; |
| 59 | } | |
| 60 | ||
| 61 | /* {{{ private variable _conf */ | |
| 62 | 6 | var _conf = { |
| 63 | 'tag_flush_interval' : 5000, | |
| 64 | 'tag_max_expire_time' : 7 * 86400000, | |
| 65 | }; | |
| 66 | 6 | for (var key in options) { |
| 67 | 2 | _conf[key] = options[key]; |
| 68 | } | |
| 69 | /* }}} */ | |
| 70 | ||
| 71 | /* {{{ private variable _res */ | |
| 72 | /** | |
| 73 | * @ç¼ååå¨å¼æ | |
| 74 | */ | |
| 75 | 6 | var _res = store; |
| 76 | ||
| 77 | 6 | if (!_res || !_res.set || !_res.get || !_res.delete) { |
| 78 | 1 | _res = MemoryStore(); |
| 79 | 1 | var serialize = function(value) { |
| 80 | 1 | return value; |
| 81 | }; | |
| 82 | 1 | var unserialize = function(value) { |
| 83 | 2 | return value; |
| 84 | }; | |
| 85 | } else { | |
| 86 | 5 | var serialize = function(value) { |
| 87 | 8 | return JSON.stringify((value instanceof Buffer) ? value.toString() : value); |
| 88 | }; | |
| 89 | 5 | var unserialize = function(value) { |
| 90 | 14 | try { |
| 91 | 14 | return JSON.parse(value.toString()); |
| 92 | } catch (e) { | |
| 93 | 0 | return null; |
| 94 | } | |
| 95 | }; | |
| 96 | } | |
| 97 | /* }}} */ | |
| 98 | ||
| 99 | /* {{{ private variable _sync */ | |
| 100 | /** | |
| 101 | * @Tag忥弿 | |
| 102 | */ | |
| 103 | 6 | var _sync = keeper; |
| 104 | ||
| 105 | /** | |
| 106 | * @Tagæ°æ®æ´æ°æ¶é´ | |
| 107 | */ | |
| 108 | 6 | var _tags = {}; |
| 109 | ||
| 110 | /** | |
| 111 | * @ææ´æ°çtag | |
| 112 | */ | |
| 113 | 6 | var _upds = {}; |
| 114 | ||
| 115 | /** | |
| 116 | * @æ°æ®åæ¥æ¶é´ | |
| 117 | */ | |
| 118 | 6 | var _time = Date.now() - _conf.tag_max_expire_time; |
| 119 | ||
| 120 | 6 | var sync_tag_time = function() { |
| 121 | 1390 | for (var key in _upds) { |
| 122 | 119 | (function() { |
| 123 | 119 | var t = _upds[key]; |
| 124 | 119 | _sync.write(key, t, function(error) { |
| 125 | 119 | if (error && (!_upds[key] || t > _upds[key])) { |
| 126 | 119 | _upds[key] = t; |
| 127 | } | |
| 128 | }); | |
| 129 | })(); | |
| 130 | 119 | delete _upds[key]; |
| 131 | } | |
| 132 | ||
| 133 | 1390 | _sync.load(function(error, _data) { |
| 134 | 1390 | if (error) { |
| 135 | 0 | return; |
| 136 | } | |
| 137 | ||
| 138 | 1390 | for (var idx in _data) { |
| 139 | 2768 | _tags[idx] = _tags[idx] ? Math.max(_data[idx], _tags[idx]) : _data[idx]; |
| 140 | 2768 | _time = Math.max(_time, _tags[idx]); |
| 141 | } | |
| 142 | }, _time); | |
| 143 | }; | |
| 144 | /* }}} */ | |
| 145 | ||
| 146 | /* {{{ private variable timer */ | |
| 147 | /** | |
| 148 | * @tagæ°æ®åæ¥å®æ¶å¨ | |
| 149 | */ | |
| 150 | 6 | var timer = null; |
| 151 | 6 | if (_sync) { |
| 152 | 2 | timer = setInterval(sync_tag_time, _conf.tag_flush_interval); |
| 153 | } | |
| 154 | /* }}} */ | |
| 155 | ||
| 156 | 6 | var _me = __instances[name] = {}; |
| 157 | ||
| 158 | /* {{{ public function set() */ | |
| 159 | /** | |
| 160 | * Set cache value | |
| 161 | * | |
| 162 | * @param {String} key | |
| 163 | * @param {Object} value | |
| 164 | * @param {Function} callback | |
| 165 | * @param {Integer} expire | |
| 166 | * @param {Array} tags | |
| 167 | */ | |
| 168 | 6 | _me.set = function(key, value, callback, expire, tags) { |
| 169 | 9 | var now = Date.now(); |
| 170 | 9 | expire = expire || 86400000; |
| 171 | 9 | _res.set(cacheindex(name + '#' + key), serialize({ |
| 172 | 'i' : now, /**< æ°æ®åå ¥æ¶é´ */ | |
| 173 | 'e' : now + expire, /**< æ°æ®è¿ææ¶é´ */ | |
| 174 | 'k' : key, /**< æ°æ®key */ | |
| 175 | 'v' : value, /**< æ°æ®å¼ */ | |
| 176 | 't' : tags ? (Array.isArray(tags) ? tags : [tags]) : [], | |
| 177 | }), callback, Math.floor(expire / 1000)); | |
| 178 | }; | |
| 179 | /* }}} */ | |
| 180 | ||
| 181 | /* {{{ public function get() */ | |
| 182 | 6 | _me.get = function(key, callback) { |
| 183 | 18 | var now = Date.now(); |
| 184 | 18 | _res.get(cacheindex(name + '#' + key), function(error, value) { |
| 185 | 18 | if (error || !value) { |
| 186 | 2 | callback(error, null); |
| 187 | 2 | return; |
| 188 | } | |
| 189 | ||
| 190 | 16 | value = unserialize(value); |
| 191 | 16 | if (!value.i || !value.e || !value.k || undefined === value.v) { |
| 192 | 1 | callback(new Error('UnExpectCacheValue')); |
| 193 | 1 | return; |
| 194 | } | |
| 195 | ||
| 196 | /** | |
| 197 | * @time expire or key does not match | |
| 198 | */ | |
| 199 | 15 | if (value.e < now || value.k != key) { |
| 200 | 1 | callback(null, null); |
| 201 | 1 | return; |
| 202 | 14 | }; |
| 203 | ||
| 204 | /** | |
| 205 | * @tag expire | |
| 206 | */ | |
| 207 | 14 | var _list = Array.isArray(value.t) ? value.t : []; |
| 208 | 14 | var _len = _list.unshift('__global__'); |
| 209 | 14 | for (var i = 0; i < _len; i++) { |
| 210 | 31 | var idx = _list[i]; |
| 211 | 31 | if (_tags[idx] && value.i <= _tags[idx]) { |
| 212 | 4 | callback(null, null); |
| 213 | 4 | return; |
| 214 | } | |
| 215 | } | |
| 216 | ||
| 217 | 10 | callback(null, value.v, value.e - now); |
| 218 | }); | |
| 219 | }; | |
| 220 | /* }}} */ | |
| 221 | ||
| 222 | /* {{{ public function unset() */ | |
| 223 | 6 | _me.unset = function(key, callback) { |
| 224 | 2 | _res.delete(cacheindex(name + '#' + key), callback); |
| 225 | }; | |
| 226 | /* }}} */ | |
| 227 | ||
| 228 | /* {{{ public function tagrm() */ | |
| 229 | /** | |
| 230 | * æ ¹æ®tagå é¤ç¼å | |
| 231 | * | |
| 232 | * @param {String} tag | |
| 233 | * @param {Integer} delay time (ms) | |
| 234 | */ | |
| 235 | 6 | _me.tagrm = function(tag, delay, flush) { |
| 236 | 4 | var tag = tag ? tag.trim() : '__global__'; |
| 237 | 4 | var now = Date.now(); |
| 238 | 4 | if (delay) { |
| 239 | 1 | delay = parseInt(delay, 10); |
| 240 | 1 | now += delay ? delay : 0; |
| 241 | } | |
| 242 | ||
| 243 | 4 | _upds[tag] = now; |
| 244 | 4 | _tags[tag] = now; |
| 245 | 4 | if (flush && _sync) { |
| 246 | 0 | _sync.write(tag, now, function(error){}); |
| 247 | } | |
| 248 | }; | |
| 249 | /* }}} */ | |
| 250 | ||
| 251 | 6 | return _me; |
| 252 | } |
| Line | Hits | Source |
|---|---|---|
| 1 | /* vim: set expandtab tabstop=2 shiftwidth=2 foldmethod=marker: */ | |
| 2 | ||
| 3 | 1 | "use strict"; |
| 4 | ||
| 5 | 1 | var _extend = function (a, b) { |
| 6 | 11 | for (var i in b) { |
| 7 | 13 | a[i] = b[i]; |
| 8 | } | |
| 9 | 11 | return a; |
| 10 | }; | |
| 11 | ||
| 12 | 1 | var _error = function (name, message) { |
| 13 | 4 | var o = new Error(message); |
| 14 | 4 | o.name = name; |
| 15 | 4 | return o; |
| 16 | }; | |
| 17 | ||
| 18 | 1 | exports.create = function (options) { |
| 19 | ||
| 20 | /** | |
| 21 | * @éå屿§ | |
| 22 | */ | |
| 23 | 11 | var _options = _extend({ |
| 24 | 'timeout' : 0, /**< è¶ æ¶æ¶é´(ms) */ | |
| 25 | 'maxitem' : 0, /**< æå¤§è®°å½æ° */ | |
| 26 | }, options); | |
| 27 | ||
| 28 | ||
| 29 | /** | |
| 30 | * @对象æ | |
| 31 | */ | |
| 32 | 11 | var _queues = []; |
| 33 | ||
| 34 | 11 | var _me = {}; |
| 35 | ||
| 36 | 11 | _me.size = function () { |
| 37 | 21 | return _queues.length; |
| 38 | }; | |
| 39 | ||
| 40 | /* {{{ public function push() */ | |
| 41 | /** | |
| 42 | * push an item to queue | |
| 43 | * | |
| 44 | * @access public | |
| 45 | * @param {Object} o | |
| 46 | * @param {Function} onerr | |
| 47 | */ | |
| 48 | 11 | _me.push = function (o, onerr) { |
| 49 | 19 | var idx = _queues.length; |
| 50 | 19 | if (_options.maxitem && idx >= _options.maxitem) { |
| 51 | 2 | onerr && onerr(_error('QueueIsFull', 'Already ' + idx + ' items in the queue.'), o); |
| 52 | 2 | return; |
| 53 | } | |
| 54 | ||
| 55 | 17 | _queues.push({ |
| 56 | 'o' : o, | |
| 57 | 's' : 0, | |
| 58 | }); | |
| 59 | 17 | if (_options.timeout && onerr) { |
| 60 | 10 | (function () { |
| 61 | 10 | var m = _queues[idx]; |
| 62 | 10 | m.t = setTimeout(function () { |
| 63 | 3 | m.s = 1; |
| 64 | 3 | var pos = _queues.indexOf(m); |
| 65 | 3 | if (pos >= 0) { |
| 66 | 3 | _queues.splice(pos, 1); |
| 67 | } | |
| 68 | ||
| 69 | 3 | onerr(_error('QueuedTimeout', 'Item queued timeout after ' + _options.timeout + 'ms.'), o); |
| 70 | }, _options.timeout); | |
| 71 | })(); | |
| 72 | } | |
| 73 | ||
| 74 | 17 | return _me; |
| 75 | }; | |
| 76 | /* }}} */ | |
| 77 | ||
| 78 | /* {{{ public function shift() */ | |
| 79 | /** | |
| 80 | * to get an item from the head | |
| 81 | * | |
| 82 | * @access public | |
| 83 | */ | |
| 84 | 11 | _me.shift = function () { |
| 85 | 25 | var obj; |
| 86 | 25 | while (_queues.length) { |
| 87 | 14 | obj = _queues.shift(); |
| 88 | 14 | obj.t && clearTimeout(obj.t); |
| 89 | 14 | if (obj.s < 1) { |
| 90 | 14 | return obj.o; |
| 91 | } | |
| 92 | } | |
| 93 | ||
| 94 | 11 | return null; |
| 95 | }; | |
| 96 | /* }}} */ | |
| 97 | ||
| 98 | 11 | return _me; |
| 99 | }; | |
| 100 | ||
| 101 | 1 | exports.createPriorityQueue = function(options) { |
| 102 | ||
| 103 | /** | |
| 104 | * @éå对象 | |
| 105 | */ | |
| 106 | 1 | var slots = {}; |
| 107 | ||
| 108 | /** | |
| 109 | * @访é®é¡ºåº | |
| 110 | */ | |
| 111 | 1 | var order = []; |
| 112 | ||
| 113 | 1 | var _me = {}; |
| 114 | ||
| 115 | 1 | _me.size = function (p) { |
| 116 | 5 | if (undefined !== p && null !== p) { |
| 117 | 1 | return slots[p] ? slots[p].size() : 0; |
| 118 | } | |
| 119 | ||
| 120 | 4 | var n = 0; |
| 121 | 4 | for (var i in slots) { |
| 122 | 7 | n += slots[i].size(); |
| 123 | } | |
| 124 | ||
| 125 | 4 | return n; |
| 126 | }; | |
| 127 | ||
| 128 | 1 | _me.push = function (o, p, onerr) { |
| 129 | 4 | p = Math.max(0, p && + p | 0 || 0); |
| 130 | 4 | if (!slots[p]) { |
| 131 | 3 | slots[p] = exports.create(options); |
| 132 | 3 | order = Object.keys(slots).sort(function (a, b) { |
| 133 | 3 | return a - b; |
| 134 | }); | |
| 135 | } | |
| 136 | 4 | slots[p].push(o, onerr); |
| 137 | ||
| 138 | 4 | return _me; |
| 139 | }; | |
| 140 | ||
| 141 | 1 | _me.shift = function () { |
| 142 | 6 | for (var i = 0, m = order.length; i < m; i++) { |
| 143 | 10 | var s = slots[order[i]]; |
| 144 | 10 | if (s.size()) { |
| 145 | 4 | return s.shift(); |
| 146 | } | |
| 147 | } | |
| 148 | 2 | return null; |
| 149 | }; | |
| 150 | ||
| 151 | 1 | return _me; |
| 152 | ||
| 153 | } | |
| 154 | /* }}} */ | |
| 155 |