ruby-redis 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +9 -0
- data/README +90 -0
- data/bin/ruby-redis +12 -0
- data/bin/ruby-redis.compiled.rbc +243 -0
- data/lib/redis/bin.rb +74 -0
- data/lib/redis/bin.rbc +1325 -0
- data/lib/redis/buftok.rbc +2658 -0
- data/lib/redis/config.rb +46 -0
- data/lib/redis/config.rbc +1009 -0
- data/lib/redis/connection.rb +69 -0
- data/lib/redis/connection.rbc +1354 -0
- data/lib/redis/database.rb +109 -0
- data/lib/redis/database.rbc +2275 -0
- data/lib/redis/hashes.rb +72 -0
- data/lib/redis/hashes.rbc +1843 -0
- data/lib/redis/hiredis.rbc +658 -0
- data/lib/redis/keys.rb +165 -0
- data/lib/redis/keys.rbc +3386 -0
- data/lib/redis/lists.rb +227 -0
- data/lib/redis/lists.rbc +5241 -0
- data/lib/redis/logger.rb +81 -0
- data/lib/redis/logger.rbc +2106 -0
- data/lib/redis/protocol.rb +170 -0
- data/lib/redis/protocol.rbc +3735 -0
- data/lib/redis/pubsub.rb +153 -0
- data/lib/redis/pubsub.rbc +3447 -0
- data/lib/redis/reader.rb +164 -0
- data/lib/redis/reader.rbc +2769 -0
- data/lib/redis/send.rbc +1268 -0
- data/lib/redis/sender.rb +49 -0
- data/lib/redis/sender.rbc +1057 -0
- data/lib/redis/server.rb +62 -0
- data/lib/redis/server.rbc +1177 -0
- data/lib/redis/sets.rb +105 -0
- data/lib/redis/sets.rbc +2800 -0
- data/lib/redis/strict.rb +67 -0
- data/lib/redis/strict.rbc +1419 -0
- data/lib/redis/strings.rb +144 -0
- data/lib/redis/strings.rbc +3338 -0
- data/lib/redis/synchrony.rb +58 -0
- data/lib/redis/synchrony.rbc +1397 -0
- data/lib/redis/version.rb +7 -0
- data/lib/redis/version.rbc +180 -0
- data/lib/redis/zsets.rb +281 -0
- data/lib/redis/zsets.rbc +6596 -0
- data/lib/redis.rb +215 -0
- data/lib/redis.rbc +4391 -0
- metadata +117 -0
data/lib/redis.rb
ADDED
@@ -0,0 +1,215 @@
|
|
1
|
+
# for Ruby older than 1.9
|
2
|
+
unless Kernel.respond_to?(:require_relative)
|
3
|
+
module Kernel
|
4
|
+
def require_relative(path)
|
5
|
+
require File.join(File.dirname(caller[0]), path.to_str)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'eventmachine'
|
11
|
+
class Redis < EventMachine::Connection ; end
|
12
|
+
|
13
|
+
require_relative 'redis/version'
|
14
|
+
require_relative 'redis/reader'
|
15
|
+
require_relative 'redis/sender'
|
16
|
+
|
17
|
+
class Redis
|
18
|
+
|
19
|
+
include Sender
|
20
|
+
|
21
|
+
class Command
|
22
|
+
include EventMachine::Deferrable
|
23
|
+
def initialize connection
|
24
|
+
@connection = connection
|
25
|
+
self.errback do |msg|
|
26
|
+
# game over on timeout
|
27
|
+
@connection.close_connection unless msg
|
28
|
+
end
|
29
|
+
end
|
30
|
+
# EventMachine older than 1.0.0.beta.4 doesn't return self
|
31
|
+
test = self.new nil
|
32
|
+
unless self === test.callback{}
|
33
|
+
def callback; super; self; end
|
34
|
+
def errback; super; self; end
|
35
|
+
def timeout *args; super; self; end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def initialize options={}
|
40
|
+
if defined? Hiredis and defined? Hiredis::Reader
|
41
|
+
@reader = Hiredis::Reader.new
|
42
|
+
else
|
43
|
+
@reader = Reader.new
|
44
|
+
end
|
45
|
+
@queue = []
|
46
|
+
@pubsub_callback = proc{}
|
47
|
+
end
|
48
|
+
|
49
|
+
def unbind
|
50
|
+
@queue.each { |d| d.fail RuntimeError.new 'connection closed' }
|
51
|
+
@queue.clear
|
52
|
+
end
|
53
|
+
|
54
|
+
# Pub/Sub works by sending all orphaned messages to this callback.
|
55
|
+
# It is simple and fast but not tolerant to programming errors.
|
56
|
+
# Subclass Redis and/or create a defensive layer if you need to.
|
57
|
+
def pubsub_callback &block
|
58
|
+
@pubsub_callback = block
|
59
|
+
end
|
60
|
+
|
61
|
+
def receive_data data
|
62
|
+
@reader.feed data
|
63
|
+
until (data = @reader.gets) == false
|
64
|
+
deferrable = @queue.shift
|
65
|
+
if deferrable
|
66
|
+
if Exception === data
|
67
|
+
deferrable.fail data
|
68
|
+
else
|
69
|
+
deferrable.succeed data
|
70
|
+
end
|
71
|
+
else
|
72
|
+
@pubsub_callback.call data
|
73
|
+
end
|
74
|
+
end
|
75
|
+
rescue Exception => e
|
76
|
+
@queue.shift.fail e unless @queue.empty?
|
77
|
+
close_connection
|
78
|
+
end
|
79
|
+
|
80
|
+
def method_missing method, *args, &block
|
81
|
+
deferrable = Command.new self
|
82
|
+
if [:subscribe, :psubscribe, :unsubscribe, :punsubscribe].include? method
|
83
|
+
deferrable.callback do |data|
|
84
|
+
deferrable.succeed nil
|
85
|
+
@pubsub_callback.call data
|
86
|
+
end
|
87
|
+
end
|
88
|
+
if transform = self.class.transforms[method]
|
89
|
+
deferrable.callback do |data|
|
90
|
+
begin
|
91
|
+
deferrable.succeed transform.call data
|
92
|
+
rescue Exception => e
|
93
|
+
deferrable.fail e
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
deferrable.callback &block if block
|
98
|
+
@queue.push deferrable
|
99
|
+
send_redis args.reduce([method]){ |arr, arg|
|
100
|
+
if Hash === arg
|
101
|
+
arr += arg.to_a.flatten 1
|
102
|
+
else
|
103
|
+
arr << arg
|
104
|
+
end
|
105
|
+
}
|
106
|
+
deferrable
|
107
|
+
end
|
108
|
+
|
109
|
+
# Yielded by multi_exec to proxy and collect commands
|
110
|
+
class Multi < Command
|
111
|
+
include Enumerable
|
112
|
+
def initialize *args
|
113
|
+
super
|
114
|
+
@commands = []
|
115
|
+
end
|
116
|
+
def each
|
117
|
+
@commands.each {|x|yield x}
|
118
|
+
end
|
119
|
+
def size
|
120
|
+
@commands.size
|
121
|
+
end
|
122
|
+
def method_missing method, *args, &block
|
123
|
+
command = @connection.send method, *args, &block
|
124
|
+
proxy = Command.new @connection
|
125
|
+
command.callback do |status|
|
126
|
+
@commands << proxy
|
127
|
+
end
|
128
|
+
command.errback do |err|
|
129
|
+
@commands << err
|
130
|
+
proxy.fail err
|
131
|
+
end
|
132
|
+
proxy
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# Wrap around multi and exec. Leaves the raw calls
|
137
|
+
# to multi and exec open for custom implementations.
|
138
|
+
def multi_exec
|
139
|
+
self.multi.errback do |r|
|
140
|
+
# This usually happens in the case of a programming error.
|
141
|
+
# Sometimes it is called when the connection breaks.
|
142
|
+
self.close_connection
|
143
|
+
end
|
144
|
+
error = nil
|
145
|
+
begin
|
146
|
+
yield redis_multi = Multi.new(self)
|
147
|
+
rescue Exception => e
|
148
|
+
error = e
|
149
|
+
end
|
150
|
+
redis_exec = self.exec
|
151
|
+
if error
|
152
|
+
EM.next_tick { redis_exec.fail error }
|
153
|
+
end
|
154
|
+
redis_exec.callback do |results|
|
155
|
+
# Normalized results include syntax errors and original references.
|
156
|
+
# Command callbacks are meant to run before exec callbacks.
|
157
|
+
if results == nil
|
158
|
+
redis_exec.succeed nil
|
159
|
+
else
|
160
|
+
normalized_results = []
|
161
|
+
redis_multi.each do |command|
|
162
|
+
if Exception === command
|
163
|
+
normalized_results << command
|
164
|
+
else
|
165
|
+
result = results.shift
|
166
|
+
normalized_results << result
|
167
|
+
if Exception === result
|
168
|
+
command.fail result
|
169
|
+
else
|
170
|
+
command.succeed result
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
redis_exec.succeed normalized_results
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
# Some data is best transformed into a Ruby type. You can set up global
|
180
|
+
# transforms here that are automatically attached to command callbacks.
|
181
|
+
# Redis.transforms[:mycustom1] = Redis.transforms[:exists] # boolean
|
182
|
+
# Redis.transforms[:mycustom2] = proc { |data| MyType.new data }
|
183
|
+
def self.transforms
|
184
|
+
@@transforms ||= lambda {
|
185
|
+
boolean = lambda { |tf| tf[0] == 1 ? true : false }
|
186
|
+
hash = lambda { |hash| Hash[*hash] }
|
187
|
+
{
|
188
|
+
#keys
|
189
|
+
:exists => boolean,
|
190
|
+
:expire => boolean,
|
191
|
+
:expireat => boolean,
|
192
|
+
:move => boolean,
|
193
|
+
:persist => boolean,
|
194
|
+
:renamenx => boolean,
|
195
|
+
#strings
|
196
|
+
:msetnx => boolean,
|
197
|
+
:setnx => boolean,
|
198
|
+
#hashes
|
199
|
+
:hexists => boolean,
|
200
|
+
:hgetall => hash,
|
201
|
+
:hset => boolean,
|
202
|
+
:hsetnx => boolean,
|
203
|
+
#sets
|
204
|
+
:sismember => boolean,
|
205
|
+
:smove => boolean,
|
206
|
+
:srem => boolean,
|
207
|
+
#zsets
|
208
|
+
:zrem => boolean,
|
209
|
+
}
|
210
|
+
}.call
|
211
|
+
end
|
212
|
+
|
213
|
+
|
214
|
+
end
|
215
|
+
|