From 2fe25a493ef81c50801ae590456a8121fcd6bedd Mon Sep 17 00:00:00 2001 From: Alexandr Lozovyuk Date: Tue, 12 Mar 2019 09:18:38 +0200 Subject: [PATCH 01/16] Update SSDB.js Update Buffer usage --- SSDB.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SSDB.js b/SSDB.js index bba75b7..4d9346c 100644 --- a/SSDB.js +++ b/SSDB.js @@ -13,7 +13,7 @@ var net = require('net'); // callback(err, ssdb) exports.connect = function(host, port, timeout, listener){ var self = this; - var recv_buf = new Buffer(0); + var recv_buf = Buffer.alloc(0); var callbacks = []; var connected = false; @@ -59,12 +59,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 Date: Wed, 13 Mar 2019 12:15:06 +0200 Subject: [PATCH 02/16] add hclear command --- SSDB.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/SSDB.js b/SSDB.js index 4d9346c..43ae87b 100644 --- a/SSDB.js +++ b/SSDB.js @@ -458,6 +458,15 @@ exports.connect = function(host, port, timeout, listener){ } }); } + + self.hclear = function(key, callback){ + self.request('hclear', [key], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + callback(err); + } + }); + } return self; } From 9bc81dc77f5fd397f1086dc5140598cfe5f23cda Mon Sep 17 00:00:00 2001 From: aleks_raiden Date: Wed, 13 Mar 2019 12:51:12 +0200 Subject: [PATCH 03/16] test --- SSDB.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SSDB.js b/SSDB.js index 43ae87b..b8fc7ae 100644 --- a/SSDB.js +++ b/SSDB.js @@ -34,6 +34,8 @@ exports.connect = function(host, port, timeout, listener){ } }); sock.connect(port, host, function(){ + console.log('Socket connected!'); + connected = true; sock.setNoDelay(true); sock.setKeepAlive(true); From 264c22b15b6ed8d468cdef48098b4beba12d9e09 Mon Sep 17 00:00:00 2001 From: aleks_raiden Date: Wed, 13 Mar 2019 19:24:36 +0200 Subject: [PATCH 04/16] All hash commands done! --- SSDB.js | 229 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 209 insertions(+), 20 deletions(-) diff --git a/SSDB.js b/SSDB.js index b8fc7ae..f9a3a73 100644 --- a/SSDB.js +++ b/SSDB.js @@ -25,7 +25,8 @@ exports.connect = function(host, port, timeout, listener){ listener = listener || function(){}; var sock = new net.Socket(); - sock.on('error', function(e){ + sock.on('error', function(e){ + console.log('333'); if(!connected){ listener('connect_failed', e); }else{ @@ -33,13 +34,26 @@ exports.connect = function(host, port, timeout, listener){ callback(['error']); } }); - sock.connect(port, host, function(){ - console.log('Socket connected!'); - + + 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({port:8888, host:'localhost'}, function(){ + //console.log('Socket connected!'); connected = true; sock.setNoDelay(true); sock.setKeepAlive(true); - sock.setTimeout(timeout); + sock.setTimeout(0); //timeout); listener(0, self); }); @@ -91,25 +105,14 @@ exports.connect = function(host, port, timeout, listener){ bs.push('\n'); } bs.push('\n'); + var req = build_buffer(bs); + sock.write(req); //console.log('write ' + req.length + ' bytes'); //console.log('write: ' + req); } - 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); - } - }); - function memchr(buf, ch, start){ start = start || 0; ch = typeof(ch) == 'string'? ch.charCodeAt(0) : ch; @@ -432,13 +435,17 @@ exports.connect = function(host, port, timeout, listener){ // callback(err, []) self.hlist = function(name_start, name_end, limit, callback){ + if (typeof(limit) == 'function'){ + callback = limit; + limit = 9223372036854775807; //max elements at hash + } self.request('hlist', [name_start, name_end, limit], function(resp){ if(callback){ var err = resp[0] == 'ok'? 0 : resp[0]; var data = []; for(var i=1; i Date: Wed, 13 Mar 2019 20:19:24 +0200 Subject: [PATCH 05/16] All KV ops, exclude bit operations --- SSDB.js | 298 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 267 insertions(+), 31 deletions(-) diff --git a/SSDB.js b/SSDB.js index f9a3a73..7310adc 100644 --- a/SSDB.js +++ b/SSDB.js @@ -185,28 +185,34 @@ exports.connect = function(host, port, timeout, listener){ // callback(err, val); // err: 0 on sucess, or error_code(string) on error + + ////////////////// 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]; @@ -214,18 +220,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){ @@ -234,21 +273,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 Date: Wed, 13 Mar 2019 23:25:01 +0200 Subject: [PATCH 06/16] All list command --- SSDB.js | 240 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 239 insertions(+), 1 deletion(-) diff --git a/SSDB.js b/SSDB.js index 7310adc..13e39fa 100644 --- a/SSDB.js +++ b/SSDB.js @@ -548,7 +548,7 @@ exports.connect = function(host, port, timeout, listener){ }); } - ////////////////////////////////////////////// + ////////////////// Hash // callback(val) self.hget = function(name, key, callback){ @@ -808,6 +808,244 @@ exports.connect = function(host, port, timeout, listener){ } + ////////////////// List + + //qpush_front name item1 item2 ... Adds one or more than one element to the head of the queue. + self.qpush_front = function(name, v, callback){ + v.unshift( name ); + + self.request('qpush_front', v, function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + callback(err, parseInt( resp[1].toString() )); + } + }); + } + + //qpush name item1 item2 ... Alias of `qpush_back`. + self.qpush = function(name, v, callback){ + self.qpush_front(name, v, callback); + } + + //qpush_back name item1 item2 ... Adds an or more than one element to the end of the queue. + self.qpush_back = function(name, v, callback){ + v.unshift( name ); + + self.request('qpush_back', v, function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + callback(err, parseInt( resp[1].toString() )); + } + }); + } + + //qpop_front name size Pop out one or more elements from the head of a queue. + self.qpop_front = function(name, size, callback){ + size = parseInt(size); + + self.request('qpop_front', [name, size], function(resp){ + if(callback){ + var err = resp[0] == 'ok'? 0 : resp[0]; + var data = []; + for(var i=1; i Date: Wed, 13 Mar 2019 23:54:16 +0200 Subject: [PATCH 07/16] All SortedSet's commands --- SSDB.js | 301 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 283 insertions(+), 18 deletions(-) diff --git a/SSDB.js b/SSDB.js index 13e39fa..a0473bb 100644 --- a/SSDB.js +++ b/SSDB.js @@ -446,16 +446,15 @@ exports.connect = function(host, port, timeout, listener){ }); } - ////////////////////////////////////////////// + ////////////////// Sorted set - // callback(score) + //zget name key Get the score related to the specified key of a zset self.zget = function(name, key, callback){ self.request('zget', [name, key], function(resp){ if(callback){ var err = resp[0] == 'ok'? 0 : resp[0]; if(resp.length == 2){ - var score = parseInt(resp[1]); - callback(err, score); + callback(err, parseInt(resp[1])); }else{ var score = 0; callback('error'); @@ -464,14 +463,13 @@ exports.connect = function(host, port, timeout, listener){ }); } - // callback(size) + //zsize name Return the number of pairs of a zset. self.zsize = function(name, callback){ self.request('zsize', [name], function(resp){ if(callback){ var err = resp[0] == 'ok'? 0 : resp[0]; if(resp.length == 2){ - var size = parseInt(resp[1]); - callback(err, size); + callback(err, parseInt(resp[1])); }else{ var score = 0; callback('error'); @@ -480,7 +478,7 @@ exports.connect = function(host, port, timeout, listener){ }); } - // callback(err); + //zset name key score Set the score of the key of a zset. self.zset = function(name, key, score, callback){ self.request('zset', [name, key, score], function(resp){ if(callback){ @@ -490,7 +488,7 @@ exports.connect = function(host, port, timeout, listener){ }); } - // callback(err); + //zdel name key Delete specified key of a zset. self.zdel = function(name, key, callback){ self.request('zdel', [name, key], function(resp){ if(callback){ @@ -500,7 +498,7 @@ exports.connect = function(host, port, timeout, listener){ }); } - // callback(err, {index:[], items:{key:score}}) + //zscan name key_start score_start score_end limit List key-score pairs where key-score in range (key_start+score_start, score_end]. self.zscan = function(name, key_start, score_start, score_end, limit, callback){ self.request('zscan', [name, key_start, score_start, score_end, limit], function(resp){ if(callback){ @@ -518,36 +516,303 @@ exports.connect = function(host, port, timeout, listener){ }); } - // callback(err, []) + //zlist name_start name_end limit List zset names in range (name_start, name_end]. self.zlist = function(name_start, name_end, limit, callback){ + if (typeof(limit) == 'function'){ + callback = limit; + limit = 9223372036854775807; + } + self.request('zlist', [name_start, name_end, limit], function(resp){ if(callback){ var err = resp[0] == 'ok'? 0 : resp[0]; var data = []; for(var i=1; i Date: Wed, 13 Mar 2019 23:56:29 +0200 Subject: [PATCH 08/16] cleanup --- SSDB.js | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/SSDB.js b/SSDB.js index a0473bb..1a1cca1 100644 --- a/SSDB.js +++ b/SSDB.js @@ -1301,15 +1301,6 @@ exports.connect = function(host, port, timeout, listener){ }); } - - - - - - - - - ////////////////// Server command @@ -1386,17 +1377,9 @@ exports.connect = function(host, port, timeout, listener){ ////////////////// IP Filter @todo - - - - - - - - return self; } From 80452bd7efd206392049fd11ebe9ebbd30094b5e Mon Sep 17 00:00:00 2001 From: aleks_raiden Date: Thu, 14 Mar 2019 00:07:20 +0200 Subject: [PATCH 09/16] fix --- SSDB.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SSDB.js b/SSDB.js index 1a1cca1..a1ae5ba 100644 --- a/SSDB.js +++ b/SSDB.js @@ -778,7 +778,7 @@ exports.connect = function(host, port, timeout, listener){ } //zrange name offset limit Returns a range of key-score pairs by index range [offset, offset + limit). - self.zrange = function(name, offset limit, callback){ + self.zrange = function(name, offset, limit, callback){ if (typeof(limit) == 'function'){ callback = limit; limit = 9223372036854775807; From 64e839de2b84a58efc4386736cfe9586f7f328a3 Mon Sep 17 00:00:00 2001 From: aleks_raiden Date: Thu, 14 Mar 2019 00:08:42 +0200 Subject: [PATCH 10/16] fix --- SSDB.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SSDB.js b/SSDB.js index a1ae5ba..f3b88a4 100644 --- a/SSDB.js +++ b/SSDB.js @@ -796,7 +796,7 @@ exports.connect = function(host, port, timeout, listener){ } //zrrange name offset limit Returns a range of key-score pairs by index range [offset, offset + limit), in reverse order. - self.zrrange = function(name, offset limit, callback){ + self.zrrange = function(name, offset, limit, callback){ if (typeof(limit) == 'function'){ callback = limit; limit = 9223372036854775807; From 63e8e099707d9985948c1481a9cda8c938f16b46 Mon Sep 17 00:00:00 2001 From: aleks_raiden Date: Thu, 14 Mar 2019 00:09:49 +0200 Subject: [PATCH 11/16] fix --- SSDB.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SSDB.js b/SSDB.js index f3b88a4..900edc0 100644 --- a/SSDB.js +++ b/SSDB.js @@ -857,7 +857,7 @@ exports.connect = function(host, port, timeout, listener){ if(resp.length % 2 != 1){ callback('error'); }else{ - var data{}; + var data = {}; for(var i=1; i Date: Thu, 14 Mar 2019 00:25:28 +0200 Subject: [PATCH 12/16] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1974c72..c874c17 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nodessdb", - "version": "1.0.0", + "version": "1.0.1", "description": "SSDB nodejs Client", "main": "SSDB.js", "scripts": { From 383cf3b3b5a1dda9f3bec5c8ddac404fb5071890 Mon Sep 17 00:00:00 2001 From: aleks_raiden Date: Thu, 14 Mar 2019 00:29:20 +0200 Subject: [PATCH 13/16] fix --- SSDB.js | 22 ++++++++++------------ package.json | 2 +- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/SSDB.js b/SSDB.js index 900edc0..fd22c9e 100644 --- a/SSDB.js +++ b/SSDB.js @@ -10,23 +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 = 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){ - console.log('333'); if(!connected){ listener('connect_failed', e); }else{ @@ -48,7 +48,7 @@ exports.connect = function(host, port, timeout, listener){ } }); - sock.connect({port:8888, host:'localhost'}, function(){ + sock.connect(opts, function(){ //console.log('Socket connected!'); connected = true; sock.setNoDelay(true); @@ -106,9 +106,7 @@ exports.connect = function(host, port, timeout, listener){ } bs.push('\n'); - var req = build_buffer(bs); - - sock.write(req); + sock.write( build_buffer(bs) ); //console.log('write ' + req.length + ' bytes'); //console.log('write: ' + req); } diff --git a/package.json b/package.json index 1974c72..dfa4247 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nodessdb", - "version": "1.0.0", + "version": "1.0.2", "description": "SSDB nodejs Client", "main": "SSDB.js", "scripts": { From c3db033104ad9025c289eb67ac8533a1bd7bbff7 Mon Sep 17 00:00:00 2001 From: aleks_raiden Date: Thu, 21 Mar 2019 17:21:00 +0200 Subject: [PATCH 14/16] fix --- SSDB.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/SSDB.js b/SSDB.js index fd22c9e..aa1f761 100644 --- a/SSDB.js +++ b/SSDB.js @@ -1075,7 +1075,10 @@ exports.connect = function(opts, listener){ //qpush_front name item1 item2 ... Adds one or more than one element to the head of the queue. self.qpush_front = function(name, v, callback){ - v.unshift( name ); + if (typeof(v) == 'array') + v.unshift( name ); + else + v = [name, v]; self.request('qpush_front', v, function(resp){ if(callback){ From 1e38282e3a32c14d79236a1106e95d283ed8c50d Mon Sep 17 00:00:00 2001 From: aleks_raiden Date: Thu, 21 Mar 2019 17:50:02 +0200 Subject: [PATCH 15/16] fix 2 --- SSDB.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/SSDB.js b/SSDB.js index aa1f761..7b99bbb 100644 --- a/SSDB.js +++ b/SSDB.js @@ -184,6 +184,17 @@ exports.connect = function(opts, 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 @@ -1075,6 +1086,8 @@ exports.connect = function(opts, listener){ //qpush_front name item1 item2 ... Adds one or more than one element to the head of the queue. self.qpush_front = function(name, v, callback){ + console.log( typeof(v) ); + if (typeof(v) == 'array') v.unshift( name ); else @@ -1095,7 +1108,10 @@ exports.connect = function(opts, listener){ //qpush_back name item1 item2 ... Adds an or more than one element to the end of the queue. self.qpush_back = function(name, v, callback){ - v.unshift( name ); + if (typeof(v) == 'array') + v.unshift( name ); + else + v = [name, v]; self.request('qpush_back', v, function(resp){ if(callback){ From 807d9844f0f8e264a5038d2e337872aa80827e8a Mon Sep 17 00:00:00 2001 From: Alexandr Lozovyuk Date: Thu, 21 Mar 2019 18:11:44 +0200 Subject: [PATCH 16/16] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dfa4247..2316c1a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nodessdb", - "version": "1.0.2", + "version": "1.0.3", "description": "SSDB nodejs Client", "main": "SSDB.js", "scripts": {