]>
git.saurik.com Git - redis.git/blob - client-libraries/ruby/lib/redis.rb
b10c42bf35497d5bc91f34bf865d799f56bfefea
3 require File
.join(File
.dirname(__FILE__
),'server')
4 require File
.join(File
.dirname(__FILE__
),'pipeline')
6 class RedisError
< StandardError
8 class RedisRenameError
< StandardError
22 def initialize(opts={})
23 @opts = {:host => 'localhost
', :port => '6379', :db => 0}.merge(opts)
24 $debug = @opts[:debug]
26 @server = Server.new(@opts[:host], @opts[:port], (@opts[:timeout]||10))
30 pipeline = Pipeline.new(self)
36 "#{host}:#{port} -> #{@db}"
48 execute_command("QUIT\r\n", true)
52 execute_command("PING\r\n") == PONG
57 execute_command("SELECT #{index}\r\n")
61 execute_command("FLUSHDB\r\n") == OK
65 puts "Warning!\nFlushing
*ALL
* databases!
\n5 Seconds to Hit ^C!
"
66 trap('INT') {quit; return false}
68 execute_command("FLUSHALL
\r\n") == OK
72 execute_command("LASTSAVE
\r\n").to_i
76 execute_command("BGSAVE
\r\n") == OK
81 x = execute_command("INFO
\r\n")
83 k,v = kv.split(':', 2)
84 k,v = k.chomp, v = v.chomp
91 execute_command("KEYS
#{glob}\r\n").split(' ')
94 def rename!(oldkey
, newkey
)
95 execute_command("RENAME #{oldkey} #{newkey}\r\n")
98 def rename(oldkey
, newkey
)
99 case execute_command("RENAMENX #{oldkey} #{newkey}\r\n")
101 raise RedisRenameError
, "source key: #{oldkey} does not exist"
103 raise RedisRenameError
, "target key: #{oldkey} already exists"
105 raise RedisRenameError
, "source and destination keys are the same"
112 execute_command("EXISTS #{key}\r\n") == 1
116 execute_command("DEL #{key}\r\n") == 1
124 execute_command("GET #{key}\r\n")
128 execute_command("MGET #{keys.join(' ')}\r\n")
131 def incr(key
, increment
=nil)
133 execute_command("INCRBY #{key} #{increment}\r\n")
135 execute_command("INCR #{key}\r\n")
139 def decr(key
, decrement
=nil)
141 execute_command("DECRBY #{key} #{decrement}\r\n")
143 execute_command("DECR #{key}\r\n")
148 execute_command("RANDOMKEY\r\n")
152 case i
= execute_command("LLEN #{key}\r\n")
154 raise RedisError
, "key: #{key} does not hold a list value"
161 execute_command("TYPE #{key}\r\n")
164 def push_tail(key
, val
)
165 execute_command("RPUSH #{key} #{value_to_wire(val)}\r\n")
168 def push_head(key
, val
)
169 execute_command("LPUSH #{key} #{value_to_wire(val)}\r\n")
173 execute_command("LPOP #{key}\r\n")
177 execute_command("RPOP #{key}\r\n")
180 def list_set(key
, index
, val
)
181 execute_command("LSET #{key} #{index} #{value_to_wire(val)}\r\n") == OK
184 def list_range(key
, start
, ending
)
185 execute_command("LRANGE #{key} #{start} #{ending}\r\n")
188 def list_trim(key
, start
, ending
)
189 execute_command("LTRIM #{key} #{start} #{ending}\r\n")
192 def list_index(key
, index
)
193 execute_command("LINDEX #{key} #{index}\r\n")
196 def list_rm(key
, count
, val
)
197 case num
= execute_command("LREM #{key} #{count} #{value_to_wire(val)}\r\n")
199 raise RedisError
, "key: #{key} does not exist"
201 raise RedisError
, "key: #{key} does not hold a list value"
207 def set_add(key
, member
)
208 case execute_command("SADD #{key} #{value_to_wire(member)}\r\n")
214 raise RedisError
, "key: #{key} contains a non set value"
218 def set_delete(key
, member
)
219 case execute_command("SREM #{key} #{value_to_wire(member)}\r\n")
225 raise RedisError
, "key: #{key} contains a non set value"
230 case i
= execute_command("SCARD #{key}\r\n")
232 raise RedisError
, "key: #{key} contains a non set value"
238 def set_member
?(key
, member
)
239 case execute_command("SISMEMBER #{key} #{value_to_wire(member)}\r\n")
245 raise RedisError
, "key: #{key} contains a non set value"
250 Set
.new(execute_command("SMEMBERS #{key}\r\n"))
253 def set_intersect(*keys
)
254 Set
.new(execute_command("SINTER #{keys.join(' ')}\r\n"))
257 def set_inter_store(destkey
, *keys
)
258 execute_command("SINTERSTORE #{destkey} #{keys.join(' ')}\r\n")
262 Set
.new(execute_command("SUNION #{keys.join(' ')}\r\n"))
265 def set_union_store(destkey
, *keys
)
266 execute_command("SUNIONSTORE #{destkey} #{keys.join(' ')}\r\n")
270 Set
.new(execute_command("SDIFF #{keys.join(' ')}\r\n"))
273 def set_diff_store(destkey
, *keys
)
274 execute_command("SDIFFSTORE #{destkey} #{keys.join(' ')}\r\n")
277 def set_move(srckey
, destkey
, member
)
278 execute_command("SMOVE #{srckey} #{destkey} #{value_to_wire(member)}\r\n") == 1
281 def sort(key
, opts
={})
283 cmd
<< " BY #{opts[:by]}" if opts
[:by]
284 cmd
<< " GET #{[opts[:get]].flatten * ' GET '}" if opts
[:get]
285 cmd
<< " INCR #{opts[:incr]}" if opts
[:incr]
286 cmd
<< " DEL #{opts[:del]}" if opts
[:del]
287 cmd
<< " DECR #{opts[:decr]}" if opts
[:decr]
288 cmd
<< " #{opts[:order]}" if opts
[:order]
289 cmd
<< " LIMIT #{opts[:limit].join(' ')}" if opts
[:limit]
298 def set(key
, val
, expiry
=nil)
299 s
= execute_command("SET #{key} #{value_to_wire(val)}\r\n") == OK
300 return expire(key
, expiry
) if s
&& expiry
305 execute_command("DBSIZE\r\n")
308 def expire(key
, expiry
=nil)
309 execute_command("EXPIRE #{key} #{expiry}\r\n") == 1
312 def set_unless_exists(key
, val
)
313 execute_command("SETNX #{key} #{value_to_wire(val)}\r\n") == 1
319 puts
"bulk_reply read value is #{x.inspect}" if $debug
322 puts
"error in bulk_reply #{e}" if $debug
328 puts
"writing: #{data}" if $debug
333 length
= read_proto
unless length
> 0
334 res
= @socket.read(length
)
335 puts
"read is #{res.inspect}" if $debug
341 puts
"mb res is #{res.inspect}" if $debug
343 Integer(res
).times
do
345 puts
"curren vf is #{vf.inspect}" if $debug
347 puts
"current list is #{list.inspect}" if $debug
355 raise RedisError
if (r
== "\r" || r
== "\n")
362 def status_code_reply
365 if res
.index('-') == 0
366 raise RedisError
, res
375 def execute_command(command
, ignore_response
=false)
377 unless ss
.object_id
== @socket.object_id
379 puts
"Socket changed, selecting DB" if $debug
380 unless command
[0..6] == 'SELECT'
381 #BTM - Ugh- DRY but better than infinite recursion
382 write("SELECT #{@db}\r\n")
387 get_response
unless ignore_response
388 rescue Errno
::ECONNRESET, Errno
::EPIPE, NoMethodError
, Timeout
::Error => e
389 raise RedisError
, "Connection error"
394 puts
"reply_type is #{rtype.inspect}" if $debug
405 raise RedisError
, single_line
407 raise RedisError
, "Unknown response.."
417 while buff
[-2..-1] !
= "\r\n"
420 puts
"single_line value is #{buff[0..-3].inspect}" if $debug
426 socket
= @server.socket
427 while res
= socket
.read(8096)
428 break if res
.size !
= 8096
430 #Timeout or server down
431 rescue Errno
::ECONNRESET, Errno
::EPIPE, Errno
::ECONNREFUSED => e
433 puts
"Client (#{server.inspect}) disconnected from server: #{e.inspect}\n" if $debug
435 rescue Timeout
::Error => e
436 #BTM - Ignore this error so we don't go into an endless loop
437 puts
"Client (#{server.inspect}) Timeout\n" if $debug
439 rescue NoMethodError
=> e
440 puts
"Client (#{server.inspect}) tryin server that is down: #{e.inspect}\n Dying!" if $debug
441 raise Errno::ECONNREFUSED
447 res = @socket.readline
449 puts "read_proto is
#{x.inspect}\n\n" if $debug
454 def value_to_wire(value)
455 value_str = value.to_s
456 if value_str.respond_to?(:bytesize)
457 value_size = value_str.bytesize
459 value_size = value_str.size
461 "#{value_size}\r\n#{value_str}"