From 7d70e4845a5de8c833acd273d5ea6812dcecc3b3 Mon Sep 17 00:00:00 2001 From: Daniel Shaw Date: Tue, 15 Nov 2011 00:42:45 -0800 Subject: [PATCH] Variadic store getter returns a hash on multi-get. --- lib/stores/memory.js | 13 ++++++++++++- lib/stores/redis.js | 16 +++++++++++++++- test/stores.memory.test.js | 17 +++++++++++++++++ test/stores.redis.test.js | 19 +++++++++++++++++++ 4 files changed, 63 insertions(+), 2 deletions(-) diff --git a/lib/stores/memory.js b/lib/stores/memory.js index 8b731a7904..6dd44d26d8 100644 --- a/lib/stores/memory.js +++ b/lib/stores/memory.js @@ -83,7 +83,18 @@ Client.prototype.__proto__ = Store.Client; */ Client.prototype.get = function (key, fn) { - fn(null, this.data[key] === undefined ? null : this.data[key]); + var data; + if (arguments.length == 2) data = (this.data[key] === undefined) ? null : this.data[key]; + else { + var self = this + , args = Array.prototype.slice.call(arguments) + , fn = args.pop(); + data = args.reduce(function(acc, k) { + acc[k] = (self.data[k] === undefined) ? null : self.data[k]; + return acc; + }, {}); + } + fn(null, data); return this; }; diff --git a/lib/stores/redis.js b/lib/stores/redis.js index 8fea235f0d..76ad38b00e 100644 --- a/lib/stores/redis.js +++ b/lib/stores/redis.js @@ -211,7 +211,21 @@ Client.prototype.__proto__ = Store.Client; */ Client.prototype.get = function (key, fn) { - this.store.cmd.hget(this.id, key, fn); + if (arguments.length == 2) this.store.cmd.hget(this.id, key, fn); + else { + var cmd = this.store.cmd + , args = Array.prototype.slice.call(arguments) + , fn = args.pop() + , callback = function(err, res) { + if (err) return fn(err); + var data = args.reduce(function(acc, arg, i) { + acc[arg] = (res[i] === undefined) ? null : res[i]; + return acc; + }, {}); + fn(null, data); + }; + cmd.hmget.apply(cmd, [this.id].concat(args, callback)); + } return this; }; diff --git a/test/stores.memory.test.js b/test/stores.memory.test.js index ecf9c96ddc..bd510df4eb 100644 --- a/test/stores.memory.test.js +++ b/test/stores.memory.test.js @@ -71,6 +71,23 @@ module.exports = { }); }, + 'test multi get': function (done) { + var store = new MemoryStore + , client = store.client('test'); + + client.set('b', 'c', function (err) { + client.set('c', 'd', function (err) { + client.get('b','c', function (err, val) { + should.strictEqual(err, null); + should.deepEqual({'b':'c','c':'d'}, val); + + store.destroy(); + done(); + }); + }); + }); + }, + 'test cleaning up clients data': function (done) { var rand1 = Math.abs(Math.random() * Date.now() | 0) , rand2 = Math.abs(Math.random() * Date.now() | 0); diff --git a/test/stores.redis.test.js b/test/stores.redis.test.js index 69848f32a4..ec4df481bd 100644 --- a/test/stores.redis.test.js +++ b/test/stores.redis.test.js @@ -121,6 +121,25 @@ module.exports = { }); }, + 'test multi get': function (done) { + var store = new RedisStore + , rand = 'test-' + Date.now() + , client = store.client(rand); + + client.set('b', 'c', function (err) { + client.set('c', 'd', function (err) { + client.get('b','c', function (err, val) { + console.log(val) + should.strictEqual(err, null); + should.deepEqual({'b':'c','c':'d'}, val); + + store.destroy(); + done(); + }); + }); + }); + }, + 'test cleaning up clients data': function (done) { var rand1 = Math.abs(Math.random() * Date.now() | 0) , rand2 = Math.abs(Math.random() * Date.now() | 0);