]> git.saurik.com Git - redis.git/commitdiff
Initial version of an alternative Ruby client added
authorantirez <antirez@gmail.com>
Wed, 20 May 2009 14:36:12 +0000 (16:36 +0200)
committerantirez <antirez@gmail.com>
Wed, 20 May 2009 14:36:12 +0000 (16:36 +0200)
client-libraries/ruby_2/rubyredis.rb [new file with mode: 0644]

diff --git a/client-libraries/ruby_2/rubyredis.rb b/client-libraries/ruby_2/rubyredis.rb
new file mode 100644 (file)
index 0000000..958210d
--- /dev/null
@@ -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