diff --git a/SSDB.js b/SSDB.js index bba75b7..7b99bbb 100644 --- a/SSDB.js +++ b/SSDB.js @@ -10,22 +10,23 @@ var net = require('net'); // timeout: microseconds, if ommitted, it will be treated as listener +// option = unix path or {host, port, timeout} // callback(err, ssdb) -exports.connect = function(host, port, timeout, listener){ +exports.connect = function(opts, listener){ var self = this; - var recv_buf = new Buffer(0); + var recv_buf = Buffer.alloc(0); var callbacks = []; var connected = false; - - if(typeof(timeout) == 'function'){ - listener = timeout; - timeout = 0; + + //timeout = timeout || 0; + //listener = listener || function(){}; + + if (!opts){ + opts = {port:8888, host:'localhost'}; } - timeout = timeout || 0; - listener = listener || function(){}; var sock = new net.Socket(); - sock.on('error', function(e){ + sock.on('error', function(e){ if(!connected){ listener('connect_failed', e); }else{ @@ -33,11 +34,26 @@ exports.connect = function(host, port, timeout, listener){ callback(['error']); } }); - sock.connect(port, host, function(){ + + sock.on('data', function(data){ + recv_buf = build_buffer([recv_buf, data]); + while(recv_buf.length > 0){ + var resp = parse(); + if(!resp){ + break; + } + resp[0] = resp[0].toString(); + var callback = callbacks.shift(); + callback(resp); + } + }); + + sock.connect(opts, function(){ + //console.log('Socket connected!'); connected = true; sock.setNoDelay(true); sock.setKeepAlive(true); - sock.setTimeout(timeout); + sock.setTimeout(0); //timeout); listener(0, self); }); @@ -59,12 +75,12 @@ exports.connect = function(host, port, timeout, listener){ if(arg instanceof Buffer){ // }else{ - arg = new Buffer(arg.toString()); + arg = Buffer.from(arg.toString()); } bs.push(arg); size += arg.length; } - var ret = new Buffer(size); + var ret = Buffer.alloc(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; @@ -180,28 +183,45 @@ exports.connect = function(host, port, timeout, listener){ // callback(err, val); // err: 0 on sucess, or error_code(string) on error + + + self.compact = function(callback){ + self.request('compact', function(resp){ + if(callback){ + let err = resp[0] == 'ok'? 0 : resp[0]; + callback(err, resp[1].toString()); + } + }); + } + + + ////////////////// Key Value + + //get key Get the value related to the specified key 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); + let err = resp[0] == 'ok'? 0 : resp[0]; + callback(err, resp[1].toString()); } }); } - // callback(err); + //set key value Set the value of the key. self.set = function(key, val, callback){ self.request('set', [key, val], function(resp){ if(callback){ - var err = resp[0] == 'ok'? 0 : resp[0]; + let err = resp[0] == 'ok'? 0 : resp[0]; callback(err); } }); } - // callback(err); + //setx key value ttl Set the value of the key, with a time to live. self.setx = function(key, val, ttl, callback){ + if (!ttl) ttl = 0; + ttl = parseInt(ttl); + self.request('setx', [key, val, ttl], function(resp){ if(callback){ var err = resp[0] == 'ok'? 0 : resp[0]; @@ -209,18 +229,51 @@ exports.connect = function(host, port, timeout, listener){ } }); } - - // callback(err); + + //setnx key value Set the string value in argument as value of the key only if the key doesn"t exist. + self.setnx = function(key, val, callback){ + self.request('setnx', [key, val], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + callback(err, parseInt(resp[1].toString())); + } + }); + } + + //expire key ttl Set the time left to live in seconds, only for keys of KV type. + self.expire = function(key, ttl, callback){ + if (!ttl) ttl = 0; + ttl = parseInt(ttl); + + self.request('expire', [key, ttl], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + callback(err, parseInt(resp[1].toString())); + } + }); + } + + //ttl key Returns the time left to live in seconds, only for keys of KV type. self.ttl = function(key, callback){ self.request('ttl', [key], function(resp){ if(callback){ var err = resp[0] == 'ok'? 0 : resp[0]; - callback(err,resp[1].toString()); + callback(err, resp[1].toString()); } }); } - - // callback(err); + + //getset key value Sets a value and returns the previous entry at that key. + self.getset = function(key, val, callback){ + self.request('getset', [key, val], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + callback(err, resp[1].toString()); + } + }); + } + + //del key Delete specified key. self.del = function(key, callback){ self.request('del', [key], function(resp){ if(callback){ @@ -229,21 +282,158 @@ exports.connect = function(host, port, timeout, listener){ } }); } + + //incr key [num] Increment the number stored at key by num. + self.incr = function(key, num, callback){ + if (!num) num = 1; + num = parseInt( num ); + + self.request('incr', [key, num], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + callback(err, parseInt( resp[1].toString() )); + } + }); + } + + //exists key Verify if the specified key exists. + self.exists = function(key, callback){ + self.request('exists', [key], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + callback(err, parseInt( resp[1].toString() )); + } + }); + } + + //bit operations @todo + + + //substr key start size Return part of a string. + self.substr = function(key, start, size, callback){ + if (!start) start = 0; + if (!size) size = 1; + + self.request('substr', [key, start, size], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + callback(err, resp[1].toString()); + } + }); + } + + //strlen key Return the number of bytes of a string. + self.strlen = function(key, callback){ + self.request('strlen', [key], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + callback(err, parseInt( resp[1].toString() )); + } + }); + } + + //rkeys key_start key_end limit List keys in range (key_start, key_end], in reverse order. + self.rkeys = function(key_start, key_end, limit, callback){ + if (typeof(limit) == 'function'){ + callback = limit; + limit = 9223372036854775807; + } + + self.request('rkeys', [key_start, key_end, limit], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + var data = []; + for(var i=1; i