lib/redis.rb in redis-2.2.0 vs lib/redis.rb in redis-2.2.1

- old
+ new

@@ -70,38 +70,45 @@ end # Authenticate to the server. def auth(password) synchronize do - @client.call(:auth, password) + @client.call [:auth, password] end end # Change the selected database for the current connection. def select(db) synchronize do @client.db = db - @client.call(:select, db) + @client.call [:select, db] end end # Get information and statistics about the server. - def info + def info(cmd = nil) synchronize do - reply = @client.call(:info) + reply = @client.call [:info, cmd].compact if reply.kind_of?(String) - Hash[*reply.split(/:|\r\n/).grep(/^[^#]/)] - else - reply + reply = Hash[*reply.split(/:|\r\n/).grep(/^[^#]/)] + + if cmd && cmd.to_s == "commandstats" + # Extract nested hashes for INFO COMMANDSTATS + reply = Hash[reply.map do |k, v| + [k[/^cmdstat_(.*)$/, 1], Hash[*v.split(/,|=/)]] + end] + end end + + reply end end def config(action, *args) synchronize do - reply = @client.call(:config, action, *args) + reply = @client.call [:config, action, *args] if reply.kind_of?(Array) && action == :get Hash[*reply] else reply @@ -110,101 +117,101 @@ end # Remove all keys from the current database. def flushdb synchronize do - @client.call(:flushdb) + @client.call [:flushdb] end end # Remove all keys from all databases. def flushall synchronize do - @client.call(:flushall) + @client.call [:flushall] end end # Synchronously save the dataset to disk. def save synchronize do - @client.call(:save) + @client.call [:save] end end # Asynchronously save the dataset to disk. def bgsave synchronize do - @client.call(:bgsave) + @client.call [:bgsave] end end # Asynchronously rewrite the append-only file. def bgrewriteaof synchronize do - @client.call(:bgrewriteaof) + @client.call [:bgrewriteaof] end end # Get the value of a key. def get(key) synchronize do - @client.call(:get, key) + @client.call [:get, key] end end # Returns the bit value at offset in the string value stored at key. def getbit(key, offset) synchronize do - @client.call(:getbit, key, offset) + @client.call [:getbit, key, offset] end end # Get a substring of the string stored at a key. def getrange(key, start, stop) synchronize do - @client.call(:getrange, key, start, stop) + @client.call [:getrange, key, start, stop] end end # Set the string value of a key and return its old value. def getset(key, value) synchronize do - @client.call(:getset, key, value) + @client.call [:getset, key, value] end end # Get the values of all the given keys. def mget(*keys) synchronize do - @client.call(:mget, *keys) + @client.call [:mget, *keys] end end # Append a value to a key. def append(key, value) synchronize do - @client.call(:append, key, value) + @client.call [:append, key, value] end end def substr(key, start, stop) synchronize do - @client.call(:substr, key, start, stop) + @client.call [:substr, key, start, stop] end end # Get the length of the value stored in a key. def strlen(key) synchronize do - @client.call(:strlen, key) + @client.call [:strlen, key] end end # Get all the fields and values in a hash. def hgetall(key) synchronize do - reply = @client.call(:hgetall, key) + reply = @client.call [:hgetall, key] if reply.kind_of?(Array) Hash[*reply] else reply @@ -213,32 +220,32 @@ end # Get the value of a hash field. def hget(key, field) synchronize do - @client.call(:hget, key, field) + @client.call [:hget, key, field] end end # Delete a hash field. def hdel(key, field) synchronize do - @client.call(:hdel, key, field) + @client.call [:hdel, key, field] end end # Get all the fields in a hash. def hkeys(key) synchronize do - @client.call(:hkeys, key) + @client.call [:hkeys, key] end end # Find all keys matching the given pattern. def keys(pattern = "*") synchronize do - reply = @client.call(:keys, pattern) + reply = @client.call [:keys, pattern] if reply.kind_of?(String) reply.split(" ") else reply @@ -247,130 +254,130 @@ end # Return a random key from the keyspace. def randomkey synchronize do - @client.call(:randomkey) + @client.call [:randomkey] end end # Echo the given string. def echo(value) synchronize do - @client.call(:echo, value) + @client.call [:echo, value] end end # Ping the server. def ping synchronize do - @client.call(:ping) + @client.call [:ping] end end # Get the UNIX time stamp of the last successful save to disk. def lastsave synchronize do - @client.call(:lastsave) + @client.call [:lastsave] end end # Return the number of keys in the selected database. def dbsize synchronize do - @client.call(:dbsize) + @client.call [:dbsize] end end # Determine if a key exists. def exists(key) synchronize do - _bool @client.call(:exists, key) + _bool @client.call [:exists, key] end end # Get the length of a list. def llen(key) synchronize do - @client.call(:llen, key) + @client.call [:llen, key] end end # Get a range of elements from a list. def lrange(key, start, stop) synchronize do - @client.call(:lrange, key, start, stop) + @client.call [:lrange, key, start, stop] end end # Trim a list to the specified range. def ltrim(key, start, stop) synchronize do - @client.call(:ltrim, key, start, stop) + @client.call [:ltrim, key, start, stop] end end # Get an element from a list by its index. def lindex(key, index) synchronize do - @client.call(:lindex, key, index) + @client.call [:lindex, key, index] end end # Insert an element before or after another element in a list. def linsert(key, where, pivot, value) synchronize do - @client.call(:linsert, key, where, pivot, value) + @client.call [:linsert, key, where, pivot, value] end end # Set the value of an element in a list by its index. def lset(key, index, value) synchronize do - @client.call(:lset, key, index, value) + @client.call [:lset, key, index, value] end end # Remove elements from a list. def lrem(key, count, value) synchronize do - @client.call(:lrem, key, count, value) + @client.call [:lrem, key, count, value] end end # Append a value to a list. def rpush(key, value) synchronize do - @client.call(:rpush, key, value) + @client.call [:rpush, key, value] end end # Append a value to a list, only if the list exists. def rpushx(key, value) synchronize do - @client.call(:rpushx, key, value) + @client.call [:rpushx, key, value] end end # Prepend a value to a list. def lpush(key, value) synchronize do - @client.call(:lpush, key, value) + @client.call [:lpush, key, value] end end # Prepend a value to a list, only if the list exists. def lpushx(key, value) synchronize do - @client.call(:lpushx, key, value) + @client.call [:lpushx, key, value] end end # Remove and get the last element in a list. def rpop(key) synchronize do - @client.call(:rpop, key) + @client.call [:rpop, key] end end # Remove and get the first element in a list, or block until one is available. def blpop(*args) @@ -395,152 +402,152 @@ end # Remove the last element in a list, append it to another list and return it. def rpoplpush(source, destination) synchronize do - @client.call(:rpoplpush, source, destination) + @client.call [:rpoplpush, source, destination] end end # Remove and get the first element in a list. def lpop(key) synchronize do - @client.call(:lpop, key) + @client.call [:lpop, key] end end # Get all the members in a set. def smembers(key) synchronize do - @client.call(:smembers, key) + @client.call [:smembers, key] end end # Determine if a given value is a member of a set. def sismember(key, member) synchronize do - _bool @client.call(:sismember, key, member) + _bool @client.call [:sismember, key, member] end end # Add a member to a set. def sadd(key, value) synchronize do - _bool @client.call(:sadd, key, value) + _bool @client.call [:sadd, key, value] end end # Remove a member from a set. def srem(key, value) synchronize do - _bool @client.call(:srem, key, value) + _bool @client.call [:srem, key, value] end end # Move a member from one set to another. def smove(source, destination, member) synchronize do - _bool @client.call(:smove, source, destination, member) + _bool @client.call [:smove, source, destination, member] end end # Remove and return a random member from a set. def spop(key) synchronize do - @client.call(:spop, key) + @client.call [:spop, key] end end # Get the number of members in a set. def scard(key) synchronize do - @client.call(:scard, key) + @client.call [:scard, key] end end # Intersect multiple sets. def sinter(*keys) synchronize do - @client.call(:sinter, *keys) + @client.call [:sinter, *keys] end end # Intersect multiple sets and store the resulting set in a key. def sinterstore(destination, *keys) synchronize do - @client.call(:sinterstore, destination, *keys) + @client.call [:sinterstore, destination, *keys] end end # Add multiple sets. def sunion(*keys) synchronize do - @client.call(:sunion, *keys) + @client.call [:sunion, *keys] end end # Add multiple sets and store the resulting set in a key. def sunionstore(destination, *keys) synchronize do - @client.call(:sunionstore, destination, *keys) + @client.call [:sunionstore, destination, *keys] end end # Subtract multiple sets. def sdiff(*keys) synchronize do - @client.call(:sdiff, *keys) + @client.call [:sdiff, *keys] end end # Subtract multiple sets and store the resulting set in a key. def sdiffstore(destination, *keys) synchronize do - @client.call(:sdiffstore, destination, *keys) + @client.call [:sdiffstore, destination, *keys] end end # Get a random member from a set. def srandmember(key) synchronize do - @client.call(:srandmember, key) + @client.call [:srandmember, key] end end # Add a member to a sorted set, or update its score if it already exists. def zadd(key, score, member) synchronize do - _bool @client.call(:zadd, key, score, member) + _bool @client.call [:zadd, key, score, member] end end # Determine the index of a member in a sorted set. def zrank(key, member) synchronize do - @client.call(:zrank, key, member) + @client.call [:zrank, key, member] end end # Determine the index of a member in a sorted set, with scores ordered from # high to low. def zrevrank(key, member) synchronize do - @client.call(:zrevrank, key, member) + @client.call [:zrevrank, key, member] end end # Increment the score of a member in a sorted set. def zincrby(key, increment, member) synchronize do - @client.call(:zincrby, key, increment, member) + @client.call [:zincrby, key, increment, member] end end # Get the number of members in a sorted set. def zcard(key) synchronize do - @client.call(:zcard, key) + @client.call [:zcard, key] end end # Return a range of members in a sorted set, by index. def zrange(key, start, stop, options = {}) @@ -548,11 +555,11 @@ c.bool :withscores c.bool :with_scores end synchronize do - @client.call(:zrange, key, start, stop, *command.to_a) + @client.call [:zrange, key, start, stop, *command.to_a] end end # Return a range of members in a sorted set, by score. def zrangebyscore(key, min, max, options = {}) @@ -561,18 +568,18 @@ c.bool :withscores c.bool :with_scores end synchronize do - @client.call(:zrangebyscore, key, min, max, *command.to_a) + @client.call [:zrangebyscore, key, min, max, *command.to_a] end end # Count the members in a sorted set with scores within the given values. def zcount(key, start, stop) synchronize do - @client.call(:zcount, key, start, stop) + @client.call [:zcount, key, start, stop] end end # Return a range of members in a sorted set, by index, with scores ordered # from high to low. @@ -581,11 +588,11 @@ c.bool :withscores c.bool :with_scores end synchronize do - @client.call(:zrevrange, key, start, stop, *command.to_a) + @client.call [:zrevrange, key, start, stop, *command.to_a] end end # Return a range of members in a sorted set, by score, with scores ordered # from high to low. @@ -595,39 +602,39 @@ c.bool :withscores c.bool :with_scores end synchronize do - @client.call(:zrevrangebyscore, key, max, min, *command.to_a) + @client.call [:zrevrangebyscore, key, max, min, *command.to_a] end end # Remove all members in a sorted set within the given scores. def zremrangebyscore(key, min, max) synchronize do - @client.call(:zremrangebyscore, key, min, max) + @client.call [:zremrangebyscore, key, min, max] end end # Remove all members in a sorted set within the given indexes. def zremrangebyrank(key, start, stop) synchronize do - @client.call(:zremrangebyrank, key, start, stop) + @client.call [:zremrangebyrank, key, start, stop] end end # Get the score associated with the given member in a sorted set. def zscore(key, member) synchronize do - @client.call(:zscore, key, member) + @client.call [:zscore, key, member] end end # Remove a member from a sorted set. def zrem(key, member) synchronize do - _bool @client.call(:zrem, key, member) + _bool @client.call [:zrem, key, member] end end # Intersect multiple sorted sets and store the resulting sorted set in a new # key. @@ -636,11 +643,11 @@ c.splat :weights c.value :aggregate end synchronize do - @client.call(:zinterstore, destination, keys.size, *(keys + command.to_a)) + @client.call [:zinterstore, destination, keys.size, *(keys + command.to_a)] end end # Add multiple sorted sets and store the resulting sorted set in a new key. def zunionstore(destination, keys, options = {}) @@ -648,106 +655,106 @@ c.splat :weights c.value :aggregate end synchronize do - @client.call(:zunionstore, destination, keys.size, *(keys + command.to_a)) + @client.call [:zunionstore, destination, keys.size, *(keys + command.to_a)] end end # Move a key to another database. def move(key, db) synchronize do - _bool @client.call(:move, key, db) + _bool @client.call [:move, key, db] end end # Set the value of a key, only if the key does not exist. def setnx(key, value) synchronize do - _bool @client.call(:setnx, key, value) + _bool @client.call [:setnx, key, value] end end # Delete a key. def del(*keys) synchronize do - @client.call(:del, *keys) + @client.call [:del, *keys] end end # Rename a key. def rename(old_name, new_name) synchronize do - @client.call(:rename, old_name, new_name) + @client.call [:rename, old_name, new_name] end end # Rename a key, only if the new key does not exist. def renamenx(old_name, new_name) synchronize do - _bool @client.call(:renamenx, old_name, new_name) + _bool @client.call [:renamenx, old_name, new_name] end end # Set a key's time to live in seconds. def expire(key, seconds) synchronize do - _bool @client.call(:expire, key, seconds) + _bool @client.call [:expire, key, seconds] end end # Remove the expiration from a key. def persist(key) synchronize do - _bool @client.call(:persist, key) + _bool @client.call [:persist, key] end end # Get the time to live for a key. def ttl(key) synchronize do - @client.call(:ttl, key) + @client.call [:ttl, key] end end # Set the expiration for a key as a UNIX timestamp. def expireat(key, unix_time) synchronize do - _bool @client.call(:expireat, key, unix_time) + _bool @client.call [:expireat, key, unix_time] end end # Set the string value of a hash field. def hset(key, field, value) synchronize do - _bool @client.call(:hset, key, field, value) + _bool @client.call [:hset, key, field, value] end end # Set the value of a hash field, only if the field does not exist. def hsetnx(key, field, value) synchronize do - _bool @client.call(:hsetnx, key, field, value) + _bool @client.call [:hsetnx, key, field, value] end end # Set multiple hash fields to multiple values. def hmset(key, *attrs) synchronize do - @client.call(:hmset, key, *attrs) + @client.call [:hmset, key, *attrs] end end def mapped_hmset(key, hash) hmset(key, *hash.to_a.flatten) end # Get the values of all the given hash fields. def hmget(key, *fields) synchronize do - @client.call(:hmget, key, *fields) + @client.call [:hmget, key, *fields] end end def mapped_hmget(key, *fields) reply = hmget(key, *fields) @@ -760,59 +767,65 @@ end # Get the number of fields in a hash. def hlen(key) synchronize do - @client.call(:hlen, key) + @client.call [:hlen, key] end end # Get all the values in a hash. def hvals(key) synchronize do - @client.call(:hvals, key) + @client.call [:hvals, key] end end # Increment the integer value of a hash field by the given number. def hincrby(key, field, increment) synchronize do - @client.call(:hincrby, key, field, increment) + @client.call [:hincrby, key, field, increment] end end # Discard all commands issued after MULTI. def discard synchronize do - @client.call(:discard) + @client.call [:discard] end end # Determine if a hash field exists. def hexists(key, field) synchronize do - _bool @client.call(:hexists, key, field) + _bool @client.call [:hexists, key, field] end end # Listen for all requests received by the server in real time. def monitor(&block) synchronize do - @client.call_loop(:monitor, &block) + @client.call_loop([:monitor], &block) end end def debug(*args) synchronize do - @client.call(:debug, *args) + @client.call [:debug, *args] end end + def object(*args) + synchronize do + @client.call [:object, *args] + end + end + # Internal command used for replication. def sync synchronize do - @client.call(:sync) + @client.call [:sync] end end def [](key) get(key) @@ -823,50 +836,50 @@ end # Set the string value of a key. def set(key, value) synchronize do - @client.call(:set, key, value) + @client.call [:set, key, value] end end # Sets or clears the bit at offset in the string value stored at key. def setbit(key, offset, value) synchronize do - @client.call(:setbit, key, offset, value) + @client.call [:setbit, key, offset, value] end end # Set the value and expiration of a key. def setex(key, ttl, value) synchronize do - @client.call(:setex, key, ttl, value) + @client.call [:setex, key, ttl, value] end end # Overwrite part of a string at key starting at the specified offset. def setrange(key, offset, value) synchronize do - @client.call(:setrange, key, offset, value) + @client.call [:setrange, key, offset, value] end end # Set multiple keys to multiple values. def mset(*args) synchronize do - @client.call(:mset, *args) + @client.call [:mset, *args] end end def mapped_mset(hash) mset(*hash.to_a.flatten) end # Set multiple keys to multiple values, only if none of the keys exist. def msetnx(*args) synchronize do - @client.call(:msetnx, *args) + @client.call [:msetnx, *args] end end def mapped_msetnx(hash) msetnx(*hash.to_a.flatten) @@ -891,72 +904,72 @@ c.words :order c.value :store end synchronize do - @client.call(:sort, key, *command.to_a) + @client.call [:sort, key, *command.to_a] end end # Increment the integer value of a key by one. def incr(key) synchronize do - @client.call(:incr, key) + @client.call [:incr, key] end end # Increment the integer value of a key by the given number. def incrby(key, increment) synchronize do - @client.call(:incrby, key, increment) + @client.call [:incrby, key, increment] end end # Decrement the integer value of a key by one. def decr(key) synchronize do - @client.call(:decr, key) + @client.call [:decr, key] end end # Decrement the integer value of a key by the given number. def decrby(key, decrement) synchronize do - @client.call(:decrby, key, decrement) + @client.call [:decrby, key, decrement] end end # Determine the type stored at key. def type(key) synchronize do - @client.call(:type, key) + @client.call [:type, key] end end # Close the connection. def quit synchronize do begin - @client.call(:quit) + @client.call [:quit] rescue Errno::ECONNRESET ensure @client.disconnect end end end # Synchronously save the dataset to disk and then shut down the server. def shutdown synchronize do - @client.call(:shutdown) + @client.call_without_reply [:shutdown] end end # Make the server a slave of another instance, or promote it as master. def slaveof(host, port) synchronize do - @client.call(:slaveof, host, port) + @client.call [:slaveof, host, port] end end def pipelined(options = {}) synchronize do @@ -971,25 +984,25 @@ end # Watch the given keys to determine execution of the MULTI/EXEC block. def watch(*keys) synchronize do - @client.call(:watch, *keys) + @client.call [:watch, *keys] end end # Forget about all watched keys. def unwatch synchronize do - @client.call(:unwatch) + @client.call [:unwatch] end end # Execute all commands issued after MULTI. def exec synchronize do - @client.call(:exec) + @client.call [:exec] end end # Mark the start of a transaction block. def multi @@ -1009,11 +1022,11 @@ end # Post a message to a channel. def publish(channel, message) synchronize do - @client.call(:publish, channel, message) + @client.call [:publish, channel, message] end end def subscribed? synchronize do @@ -1063,11 +1076,11 @@ end end def method_missing(command, *args) synchronize do - @client.call(command, *args) + @client.call [command, *args] end end class CommandOptions def initialize(options) @@ -1105,15 +1118,18 @@ end end private + # Commands returning 1 for true and 0 for false may be executed in a pipeline + # where the method call will return nil. Propagate the nil instead of falsely + # returning false. def _bool(value) - value == 1 + value == 1 if value end def subscription(method, channels, block) - return @client.call(method, *channels) if subscribed? + return @client.call [method, *channels] if subscribed? begin original, @client = @client, SubscribedClient.new(@client) @client.send(method, *channels, &block) ensure