From a71339483f29cee28f3462d289e448da4c907c28 Mon Sep 17 00:00:00 2001 From: Cherokee Date: Tue, 3 Jun 2014 16:28:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=9A=E4=B8=AA=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E4=B8=8B=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上一版本的代码不支持同时连接多个ssdb,原因是因为net连接的部分作为一个module的普通方法,被进程中的其他js共用了,因此申明多个连接时前面的net连接会被后面的覆盖。 解决: 参照redis nodejs client,将net连接及监听的代码独立出来,每次connect的时候new 一个实例,同时支持多个连接,直接在SSDB.js上修改,调用方式不变。 --- SSDB.js | 882 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 443 insertions(+), 439 deletions(-) diff --git a/SSDB.js b/SSDB.js index 2280ae0..e0330b5 100644 --- a/SSDB.js +++ b/SSDB.js @@ -11,447 +11,451 @@ var net = require('net'); // timeout: microseconds, if ommitted, it will be treated as listener // callback(err, ssdb) + +var SSDBConnect = function(host, port, timeout, listener){ + var self = this; + var recv_buf = new Buffer(0); + var callbacks = []; + var connected = false; + + if(typeof(timeout) == 'function'){ + listener = timeout; + timeout = 0; + } + listener = listener || function(){}; + + var sock = new net.Socket(); + sock.on('error', function(e){ + if(!connected){ + listener('connect_failed', e); + }else{ + var callback = callbacks.shift(); + if(callback)callback(['error']); + } + }); + sock.connect(port, host, function(){ + connected = true; + sock.setNoDelay(true); + sock.setKeepAlive(true); + sock.setTimeout(timeout); + listener(0, self); + }); + + self.close = function(){ + sock.end(); + } + + self.request = function(cmd, params, callback){ + var arr = [cmd].concat(params); + self.send_request(arr); + callbacks.push(callback || function(){}); + } + + function build_buffer(arr){ + var bs = []; + var size = 0; + for(var i = 0; i < arr.length; i++){ + var arg = arr[i]; + if(arg instanceof Buffer){ + // + }else{ + arg = new Buffer(arg.toString()); + } + bs.push(arg); + size += arg.length; + } + var ret = new Buffer(size); + var offset = 0; + for(var i=0; i 0){ + var resp = parse(); + if(!resp){ + break; + } + resp[0] = resp[0].toString(); + var callback = callbacks.shift(); + callback(resp); + } + }); + + function memchr(buf, ch, start){ + start = start || 0; + ch = typeof(ch) == 'string'? ch.charCodeAt(0) : ch; + for(var i=start; i recv_buf.length){ + // not finished + //console.log(spos + len, recv_buf.length); + //console.log('not finish'); + return null; + } + //var data = recv_buf.substr(spos, len); + var data = recv_buf.slice(spos, spos + len); + spos += len; + ret.push(data); + + //pos = recv_buf.indexOf('\n', spos); + pos = memchr(recv_buf, '\n', spos); + if(pos == -1){ + // not finished + console.log('error 3'); + return null; + } + // '\n', or '\r\n' + //if(recv_buf.charAt(spos) != '\n' && recv_buf.charAt(spos) != '\r' && recv_buf.charAt(spos+1) != '\n'){ + var cr = '\r'.charCodeAt(0); + var lf = '\n'.charCodeAt(0); + if(recv_buf[spos] != lf && recv_buf[spos] != cr && recv_buf[spos+1] != lf){ + // error + console.log('error 4 ' + recv_buf[spos]); + return null; + } + spos = pos + 1; + } + return ret; + } + + // callback(err, val); + // err: 0 on sucess, or error_code(string) on error + self.get = function(key, callback){ + self.request('get', [key], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + var val = resp[1]; + callback(err, val); + } + }); + } + + // callback(err); + self.set = function(key, val, callback){ + self.request('set', [key, val], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + callback(err); + } + }); + } + + // callback(err); + self.del = function(key, callback){ + self.request('del', [key], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + callback(err); + } + }); + } + + // callback(err, {index:[], items:{key:score}}) + self.scan = function(key_start, key_end, limit, callback){ + self.request('scan', [key_start, key_end, limit], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + if(resp.length % 2 != 1){ + callback('error'); + }else{ + var data = {index: [], items: {}}; + for(var i=1; i 0){ - var resp = parse(); - if(!resp){ - break; - } - resp[0] = resp[0].toString(); - var callback = callbacks.shift(); - callback(resp); - } - }); - - function memchr(buf, ch, start){ - start = start || 0; - ch = typeof(ch) == 'string'? ch.charCodeAt(0) : ch; - for(var i=start; i recv_buf.length){ - // not finished - //console.log(spos + len, recv_buf.length); - //console.log('not finish'); - return null; - } - //var data = recv_buf.substr(spos, len); - var data = recv_buf.slice(spos, spos + len); - spos += len; - ret.push(data); - - //pos = recv_buf.indexOf('\n', spos); - pos = memchr(recv_buf, '\n', spos); - if(pos == -1){ - // not finished - console.log('error 3'); - return null; - } - // '\n', or '\r\n' - //if(recv_buf.charAt(spos) != '\n' && recv_buf.charAt(spos) != '\r' && recv_buf.charAt(spos+1) != '\n'){ - var cr = '\r'.charCodeAt(0); - var lf = '\n'.charCodeAt(0); - if(recv_buf[spos] != lf && recv_buf[spos] != cr && recv_buf[spos+1] != lf){ - // error - console.log('error 4 ' + recv_buf[spos]); - return null; - } - spos = pos + 1; - } - return ret; - } - - // callback(err, val); - // err: 0 on sucess, or error_code(string) on error - self.get = function(key, callback){ - self.request('get', [key], function(resp){ - if(callback){ - var err = resp[0] == 'ok'? 0 : resp[0]; - var val = resp[1]; - callback(err, val); - } - }); - } - - // callback(err); - self.set = function(key, val, callback){ - self.request('set', [key, val], function(resp){ - if(callback){ - var err = resp[0] == 'ok'? 0 : resp[0]; - callback(err); - } - }); - } - - // callback(err); - self.del = function(key, callback){ - self.request('del', [key], function(resp){ - if(callback){ - var err = resp[0] == 'ok'? 0 : resp[0]; - callback(err); - } - }); - } - - // callback(err, {index:[], items:{key:score}}) - self.scan = function(key_start, key_end, limit, callback){ - self.request('scan', [key_start, key_end, limit], function(resp){ - if(callback){ - var err = resp[0] == 'ok'? 0 : resp[0]; - if(resp.length % 2 != 1){ - callback('error'); - }else{ - var data = {index: [], items: {}}; - for(var i=1; i