diff --git a/TODO b/TODO index e40a7ed44..02a5f5772 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,5 @@ BEFORE REDIS 1.0.0-rc1 - * S*STORE should allow as dest key one of the source keys * Warning if using default config, with hint about 'redis-server redis.conf' * Add number of keys for every DB in INFO * maxmemory support diff --git a/client-libraries/ruby_2/rubyredis.rb b/client-libraries/ruby_2/rubyredis.rb index 77b0e9d27..e4921a23b 100644 --- a/client-libraries/ruby_2/rubyredis.rb +++ b/client-libraries/ruby_2/rubyredis.rb @@ -14,6 +14,35 @@ class RedisClient "echo"=>true, "getset"=>true, "smove"=>true } + ConvertToBool = lambda{|r| r == 0 ? false : r} + + ReplyProcessor = { + "exists" => ConvertToBool, + "sismember"=> ConvertToBool, + "sadd"=> ConvertToBool, + "srem"=> ConvertToBool, + "smove"=> ConvertToBool, + "move"=> ConvertToBool, + "setnx"=> ConvertToBool, + "del"=> ConvertToBool, + "renamenx"=> ConvertToBool, + "expire"=> ConvertToBool, + "keys" => lambda{|r| r.split(" ")}, + "info" => lambda{|r| + info = {} + r.each_line {|kv| + k,v = kv.split(':', 2) + k,v = k.chomp, v = v.chomp + info[k.to_sym] = v + } + info + } + } + + def convert_to_bool(r) + r == 0 ? false : r + end + def initialize(opts={}) opts = {:host => 'localhost', :port => '6379', :db => 0}.merge(opts) @host = opts[:host] @@ -52,12 +81,15 @@ class RedisClient bulk = nil argv[0] = argv[0].to_s.downcase if BulkCommands[argv[0]] - bulk = argv[-1] + bulk = argv[-1].to_s argv[-1] = bulk.length end @sock.write(argv.join(" ")+"\r\n") @sock.write(bulk+"\r\n") if bulk - read_reply + + # Post process the reply if needed + processor = ReplyProcessor[argv[0]] + processor ? processor.call(read_reply) : read_reply end def select(*args) diff --git a/redis.c b/redis.c index fbd1bc3df..6adf521ba 100644 --- a/redis.c +++ b/redis.c @@ -2973,7 +2973,7 @@ static void sinterGenericCommand(redisClient *c, robj **setskeys, int setsnum, r robj *lenobj = NULL, *dstset = NULL; int j, cardinality = 0; - if (!dv) oom("sinterCommand"); + if (!dv) oom("sinterGenericCommand"); for (j = 0; j < setsnum; j++) { robj *setobj; @@ -3151,7 +3151,6 @@ static void sunionDiffGenericCommand(redisClient *c, robj **setskeys, int setsnu deleteKey(c->db,dstkey); dictAdd(c->db->dict,dstkey,dstset); incrRefCount(dstkey); - server.dirty++; } /* Cleanup */