]>
git.saurik.com Git - redis.git/blob - client-libraries/ruby_2/rubyredis.rb
620bab179a52563ea61c4e14c6796e3a91a482f3
1 # RubyRedis is an alternative implementatin of Ruby client library written
2 # by Salvatore Sanfilippo.
4 # The aim of this library is to create an alternative client library that is
5 # much simpler and does not implement every command explicitly but uses
6 # method_missing instead.
12 "set"=>true, "setnx"=>true, "rpush"=>true, "lpush"=>true, "lset"=>true,
13 "lrem"=>true, "sadd"=>true, "srem"=>true, "sismember"=>true,
14 "echo"=>true, "getset"=>true, "smove"=>true
17 ConvertToBool
= lambda
{|r
| r
== 0 ? false : r
}
20 "exists" => ConvertToBool
,
21 "sismember"=> ConvertToBool
,
22 "sadd"=> ConvertToBool
,
23 "srem"=> ConvertToBool
,
24 "smove"=> ConvertToBool
,
25 "move"=> ConvertToBool
,
26 "setnx"=> ConvertToBool
,
27 "del"=> ConvertToBool
,
28 "renamenx"=> ConvertToBool
,
29 "expire"=> ConvertToBool
,
30 "keys" => lambda
{|r
| r
.split(" ")},
34 k
,v
= kv
.split(':', 2)
35 k
,v
= k
.chomp
, v
= v
.chomp
42 def initialize(opts
={})
43 opts
= {:host => 'localhost', :port => '6379', :db => 0}.merge(opts
)
51 "Redis Client connected to #{@host}:#{@port} against DB #{@db}"
55 @sock = TCPSocket
.new(@host, @port, 0)
56 call_command(["select",@db]) if @db !
= 0
59 def method_missing(*argv)
63 def call_command(argv)
64 # this wrapper to raw_call_command handle reconnection on socket
65 # error. We try to reconnect just one time, otherwise let the error
68 raw_call_command(argv)
69 rescue Errno
::ECONNRESET
72 raw_call_command(argv)
76 def raw_call_command(argv)
78 argv[0] = argv[0].to_s
.downcase
79 if BulkCommands
[argv[0]]
81 argv[-1] = bulk
.length
83 @sock.write(argv.join(" ")+
"\r\n")
84 @sock.write(bulk+
"\r\n") if bulk
86 # Post process the reply if needed
87 processor
= ReplyProcessor
[argv[0]]
88 processor
? processor
.call(read_reply
) : read_reply
92 raise "SELECT not allowed, use the :db option when creating the object"
105 raise Errno
::ECONNRESET,"Connection lost" if !line
114 bulklen = line[1..-1].to_i
115 return nil if bulklen == -1
116 data = @sock.read(bulklen)
120 objects = line[1..-1].to_i
121 return nil if bulklen == -1