ruby-redis 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/LICENSE +9 -0
  2. data/README +90 -0
  3. data/bin/ruby-redis +12 -0
  4. data/bin/ruby-redis.compiled.rbc +243 -0
  5. data/lib/redis/bin.rb +74 -0
  6. data/lib/redis/bin.rbc +1325 -0
  7. data/lib/redis/buftok.rbc +2658 -0
  8. data/lib/redis/config.rb +46 -0
  9. data/lib/redis/config.rbc +1009 -0
  10. data/lib/redis/connection.rb +69 -0
  11. data/lib/redis/connection.rbc +1354 -0
  12. data/lib/redis/database.rb +109 -0
  13. data/lib/redis/database.rbc +2275 -0
  14. data/lib/redis/hashes.rb +72 -0
  15. data/lib/redis/hashes.rbc +1843 -0
  16. data/lib/redis/hiredis.rbc +658 -0
  17. data/lib/redis/keys.rb +165 -0
  18. data/lib/redis/keys.rbc +3386 -0
  19. data/lib/redis/lists.rb +227 -0
  20. data/lib/redis/lists.rbc +5241 -0
  21. data/lib/redis/logger.rb +81 -0
  22. data/lib/redis/logger.rbc +2106 -0
  23. data/lib/redis/protocol.rb +170 -0
  24. data/lib/redis/protocol.rbc +3735 -0
  25. data/lib/redis/pubsub.rb +153 -0
  26. data/lib/redis/pubsub.rbc +3447 -0
  27. data/lib/redis/reader.rb +164 -0
  28. data/lib/redis/reader.rbc +2769 -0
  29. data/lib/redis/send.rbc +1268 -0
  30. data/lib/redis/sender.rb +49 -0
  31. data/lib/redis/sender.rbc +1057 -0
  32. data/lib/redis/server.rb +62 -0
  33. data/lib/redis/server.rbc +1177 -0
  34. data/lib/redis/sets.rb +105 -0
  35. data/lib/redis/sets.rbc +2800 -0
  36. data/lib/redis/strict.rb +67 -0
  37. data/lib/redis/strict.rbc +1419 -0
  38. data/lib/redis/strings.rb +144 -0
  39. data/lib/redis/strings.rbc +3338 -0
  40. data/lib/redis/synchrony.rb +58 -0
  41. data/lib/redis/synchrony.rbc +1397 -0
  42. data/lib/redis/version.rb +7 -0
  43. data/lib/redis/version.rbc +180 -0
  44. data/lib/redis/zsets.rb +281 -0
  45. data/lib/redis/zsets.rbc +6596 -0
  46. data/lib/redis.rb +215 -0
  47. data/lib/redis.rbc +4391 -0
  48. metadata +117 -0
@@ -0,0 +1,170 @@
1
+ require File.expand_path '../redis', File.dirname(__FILE__)
2
+ require 'eventmachine'
3
+ require_relative 'reader'
4
+ require_relative 'sender'
5
+
6
+ class Redis
7
+
8
+ # Use to respond with raw protocol
9
+ # Response["+",data,"\n\r"]
10
+ # Response::OK
11
+ # Response[]
12
+ class Response < Array
13
+ OK = self["+OK\r\n".freeze].freeze
14
+ PONG = self["+PONG\r\n".freeze].freeze
15
+ NIL_MB = self["*-1\r\n".freeze].freeze
16
+ QUEUED = self["+QUEUED\r\n".freeze].freeze
17
+ end
18
+
19
+ class Watcher
20
+ include EventMachine::Deferrable
21
+
22
+ attr_reader :bound
23
+
24
+ def initialize
25
+ @watched = []
26
+ @bound = true
27
+ errback { unbind }
28
+ callback { unbind }
29
+ end
30
+
31
+ def bind database, *keys
32
+ return unless @bound
33
+ keys.each do |key|
34
+ entry = [database, key]
35
+ next if @watched.include? entry
36
+ @watched << entry
37
+ (database.watchers[key] ||= []).push self
38
+ end
39
+ end
40
+
41
+ def unbind
42
+ return unless @bound
43
+ @watched.each do |database, key|
44
+ key_df_list = database.watchers[key]
45
+ next unless key_df_list
46
+ key_df_list.delete_if { |e| e == self }
47
+ end
48
+ @bound = false
49
+ end
50
+
51
+ end
52
+
53
+ module Protocol
54
+
55
+ include Sender
56
+
57
+ # Typically raised by redis_QUIT
58
+ class CloseConnection < Exception
59
+ end
60
+
61
+ def initialize *args
62
+ @reader = Reader.new
63
+ @multi = nil
64
+ @deferred = nil
65
+ @watcher = nil
66
+ super
67
+ end
68
+
69
+ def unbind
70
+ @deferred.unbind if @deferred
71
+ @watcher.unbind if @watcher
72
+ end
73
+
74
+ # Companion to send_data.
75
+ def send_redis data
76
+ if EventMachine::Deferrable === data
77
+ @deferred.unbind if @deferred and @deferred != data
78
+ @deferred = data
79
+ elsif Response === data
80
+ data.each do |item|
81
+ send_data item
82
+ end
83
+ elsif Integer === data
84
+ send_data ":#{data}\r\n"
85
+ else
86
+ super
87
+ end
88
+ end
89
+
90
+ def redis_WATCH *keys
91
+ @watcher ||= Watcher.new
92
+ @watcher.bind @database, *keys
93
+ Response::OK
94
+ end
95
+
96
+ def redis_UNWATCH
97
+ if @watcher
98
+ @watcher.unbind
99
+ @watcher = nil
100
+ end
101
+ Response::OK
102
+ end
103
+
104
+ def redis_MULTI
105
+ raise 'MULTI nesting not allowed' if @multi
106
+ @multi = []
107
+ Response::OK
108
+ end
109
+
110
+ def redis_DISCARD
111
+ redis_UNWATCH
112
+ @multi = nil
113
+ Response::OK
114
+ end
115
+
116
+ def redis_EXEC
117
+ if @watcher
118
+ still_bound = @watcher.bound
119
+ redis_UNWATCH
120
+ unless still_bound
121
+ @multi = nil
122
+ return Response::NIL_MB
123
+ end
124
+ end
125
+ send_data "*#{@multi.size}\r\n"
126
+ response = []
127
+ @multi.each do |strings|
128
+ result = call_redis *strings
129
+ if EventMachine::Deferrable === result
130
+ result.unbind
131
+ send_redis nil
132
+ else
133
+ send_redis result
134
+ end
135
+ end
136
+ @multi = nil
137
+ Response[]
138
+ end
139
+
140
+ def call_redis command, *arguments
141
+ send "redis_#{command.upcase}", *arguments
142
+ rescue Exception => e
143
+ raise e if CloseConnection === e
144
+ # Redis.logger.warn "#{command.dump}: #{e.class}:/#{e.backtrace[0]} #{e.message}"
145
+ # e.backtrace[1..-1].each {|bt|Redis.logger.warn bt}
146
+ Response["-ERR #{e.class.name}: #{e.message}\r\n" ]
147
+ end
148
+
149
+ # Process incoming redis protocol
150
+ def receive_data data
151
+ @reader.feed data
152
+ until (strings = @reader.gets) == false
153
+ # Redis.logger.warn "#{strings.collect{|a|a.dump}.join ' '}"
154
+ if @multi and !%w{MULTI EXEC DEBUG DISCARD}.include?(strings[0].upcase)
155
+ @multi << strings
156
+ send_redis Response::QUEUED
157
+ else
158
+ send_redis call_redis *strings
159
+ end
160
+ end
161
+ rescue Exception => e
162
+ if CloseConnection === e
163
+ close_connection_after_writing
164
+ else
165
+ send_data "-ERR #{e.class.name}: #{e.message}\r\n"
166
+ end
167
+ end
168
+
169
+ end
170
+ end