mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 00:50:50 +00:00
Initial version of an alternative Ruby client added
This commit is contained in:
parent
1350d27e59
commit
4a327b4af9
74
client-libraries/ruby_2/rubyredis.rb
Normal file
74
client-libraries/ruby_2/rubyredis.rb
Normal file
@ -0,0 +1,74 @@
|
||||
# RubyRedis is an alternative implementatin of Ruby client library written
|
||||
# by Salvatore Sanfilippo.
|
||||
#
|
||||
# The aim of this library is to create an alternative client library that is
|
||||
# much simpler and does not implement every command explicitly but uses
|
||||
# method_missing instead.
|
||||
|
||||
require 'socket'
|
||||
|
||||
class RedisClient
|
||||
BulkCommands = {
|
||||
"set"=>true, "setnx"=>true, "rpush"=>true, "lpush"=>true, "lset"=>true,
|
||||
"lrem"=>true, "sadd"=>true, "srem"=>true, "sismember"=>true,
|
||||
"echo"=>true, "getset"=>true, "smove"=>true
|
||||
}
|
||||
|
||||
def initialize(opts={})
|
||||
opts = {:host => 'localhost', :port => '6379', :db => 0}.merge(opts)
|
||||
@host = opts[:host]
|
||||
@port = opts[:port]
|
||||
@db = opts[:db]
|
||||
@sock = connect_to_server
|
||||
end
|
||||
|
||||
def to_s
|
||||
"Redis Client connected to #{@host}:#{@port} against DB #{@db}"
|
||||
end
|
||||
|
||||
def connect_to_server
|
||||
TCPSocket.new(@host, @port, 0)
|
||||
end
|
||||
|
||||
def method_missing(*argv)
|
||||
call_command(argv)
|
||||
end
|
||||
|
||||
def call_command(argv)
|
||||
bulk = nil
|
||||
argv[0] = argv[0].to_s.downcase
|
||||
if BulkCommands[argv[0]]
|
||||
bulk = argv[-1]
|
||||
argv[-1] = bulk.length
|
||||
end
|
||||
@sock.write(argv.join(" ")+"\r\n")
|
||||
@sock.write(bulk+"\r\n") if bulk
|
||||
read_reply
|
||||
end
|
||||
|
||||
def read_reply
|
||||
line = @sock.gets
|
||||
case line[0..0]
|
||||
when "-"
|
||||
raise line.strip
|
||||
when "+"
|
||||
line[1..-1].strip
|
||||
when ":"
|
||||
line[1..-1].to_i
|
||||
when "$"
|
||||
bulklen = line[1..-1].to_i
|
||||
return nil if bulklen == -1
|
||||
data = @sock.read(bulklen)
|
||||
@sock.read(2) # CRLF
|
||||
data
|
||||
when "*"
|
||||
objects = line[1..-1].to_i
|
||||
return nil if bulklen == -1
|
||||
res = []
|
||||
objects.times {
|
||||
res << read_reply
|
||||
}
|
||||
res
|
||||
end
|
||||
end
|
||||
end
|
Loading…
x
Reference in New Issue
Block a user