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.
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,227 @@
1
+ require File.expand_path '../redis', File.dirname(__FILE__)
2
+ require 'eventmachine'
3
+
4
+ class Redis
5
+
6
+ module Lists
7
+
8
+ class DeferredPop
9
+ include EventMachine::Deferrable
10
+
11
+ attr_reader :bound
12
+
13
+ def initialize database, timeout_secs, *keys
14
+ @database = database
15
+ @keys = keys
16
+ timeout timeout_secs if timeout_secs > 0
17
+ errback { unbind }
18
+ callback { unbind }
19
+ keys.each do |key|
20
+ (@database.blocked_pops[key] ||= []).push self
21
+ end
22
+ @bound = true
23
+ end
24
+
25
+ def unbind
26
+ return unless @bound
27
+ @keys.each do |key|
28
+ key_df_list = @database.blocked_pops[key]
29
+ next unless key_df_list
30
+ key_df_list.delete_if { |e| e == self }
31
+ end
32
+ @bound = false
33
+ end
34
+
35
+ end
36
+
37
+ def redis_LRANGE key, first, last
38
+ first = redis_i first
39
+ last = redis_i last
40
+ list = @database[key] || []
41
+ first = 0 if first < -list.size
42
+ list[first..last]
43
+ end
44
+
45
+ def redis_LTRIM key, start, stop
46
+ @database[key] = redis_LRANGE key, start, stop
47
+ end
48
+
49
+ def redis_BRPOP *args
50
+ timeout = redis_pos_i args.pop
51
+ args.each do |key|
52
+ list = @database[key]
53
+ if list and list.size > 0
54
+ value = list.pop
55
+ @database.delete key if list.empty?
56
+ return [key, value]
57
+ end
58
+ end
59
+ df = DeferredPop.new(@database, timeout, *args)
60
+ df.errback { send_redis Response::NIL_MB }
61
+ df.callback { |key, value| send_redis [key, value] }
62
+ df
63
+ end
64
+
65
+ def redis_BLPOP *args
66
+ timeout = redis_pos_i args.pop
67
+ args.each do |key|
68
+ list = @database[key]
69
+ if list and list.size > 0
70
+ value = list.shift
71
+ @database.delete key if list.empty?
72
+ return [key, value]
73
+ end
74
+ end
75
+ df = DeferredPop.new(@database, timeout, *args)
76
+ df.errback { send_redis Response::NIL_MB }
77
+ df.callback { |key, value| send_redis [key, value] }
78
+ df
79
+ end
80
+
81
+ def redis_RPOPLPUSH source, destination
82
+ source_list = @database[source]
83
+ return nil unless source_list
84
+ redis_t Array, source_list
85
+ redis_t NilClass, Array, @database[destination]
86
+ value = source_list.pop
87
+ @database.delete source if source_list.empty?
88
+ redis_LPUSH destination, value
89
+ return value
90
+ end
91
+
92
+ def redis_BRPOPLPUSH source, destination, timeout
93
+ source_list = @database[source]
94
+ if source_list
95
+ redis_t Array, source_list
96
+ value = source_list.pop
97
+ @database.delete source if source_list.empty?
98
+ redis_LPUSH destination, value
99
+ return value
100
+ end
101
+ redis_t NilClass, Array, @database[destination]
102
+ df = DeferredPop.new @database, redis_pos_i(timeout), source
103
+ df.errback {send_redis Response::NIL_MB}
104
+ df.callback do |key, value|
105
+ redis_LPUSH destination, value
106
+ send_redis value
107
+ end
108
+ df
109
+ end
110
+
111
+ def redis_RPUSH key, value
112
+ list = @database[key]
113
+ redis_t NilClass, Array, list
114
+ (@database.blocked_pops[key] ||= []).each do |deferrable|
115
+ deferrable.succeed key, value
116
+ return 0
117
+ end
118
+ list = @database[key] = [] unless list
119
+ list.push(value).size
120
+ end
121
+
122
+ def redis_LPUSH key, value
123
+ list = @database[key]
124
+ redis_t NilClass, Array, list
125
+ (@database.blocked_pops[key] ||= []).each do |deferrable|
126
+ deferrable.succeed key, value
127
+ return 0
128
+ end
129
+ list = @database[key] = [] unless list
130
+ list.unshift(value).size
131
+ end
132
+
133
+ def redis_LPUSHX key, value
134
+ list = @database[key]
135
+ return 0 unless Array === list and list.size > 0
136
+ redis_LPUSH key, value
137
+ list.size
138
+ end
139
+
140
+ def redis_RPUSHX key, value
141
+ list = @database[key]
142
+ return 0 unless Array === list and list.size > 0
143
+ redis_RPUSH key, value
144
+ list.size
145
+ end
146
+
147
+ def redis_LINSERT key, mode, pivot, value
148
+ list = @database[key]
149
+ index = list.find_index pivot
150
+ return -1 unless index
151
+ case mode.upcase
152
+ when 'BEFORE'
153
+ list[index,0] = value
154
+ when 'AFTER'
155
+ list[index+1,0] = value
156
+ else
157
+ raise 'only BEFORE|AFTER supported'
158
+ end
159
+ list.size
160
+ end
161
+
162
+ def redis_RPOP key
163
+ list = @database[key]
164
+ return nil unless list
165
+ value = list.pop
166
+ @database.delete key if list.empty?
167
+ value
168
+ end
169
+
170
+ def redis_LPOP key
171
+ list = @database[key]
172
+ return nil unless list
173
+ value = list.shift
174
+ @database.delete key if list.empty?
175
+ value
176
+ end
177
+
178
+ def redis_LLEN key
179
+ list = @database[key] || []
180
+ redis_t Array, list
181
+ list.size
182
+ end
183
+
184
+ def redis_LINDEX key, index
185
+ list = @database[key] || []
186
+ redis_t Array, list
187
+ list[redis_i index]
188
+ end
189
+
190
+ def redis_LSET key, index, value
191
+ list = @database[key] || []
192
+ redis_t Array, list
193
+ raise 'out of range' unless list.size > redis_i(index).abs
194
+ list[redis_i index] = value
195
+ end
196
+
197
+ def redis_LREM key, count, value
198
+ list = @database[key] || []
199
+ count = redis_i count
200
+ size = list.size
201
+ if count == 0
202
+ list.delete value
203
+ elsif count < 0
204
+ i = list.size
205
+ while i > 0 and count < 0
206
+ i -= 1
207
+ if list[i] == value
208
+ list.delete_at i
209
+ count += 1
210
+ end
211
+ end
212
+ else # count > 0
213
+ i = 0
214
+ while i < list.size and count > 0
215
+ if list[i] == value
216
+ list.delete_at i
217
+ count -= 1
218
+ else
219
+ i += 1
220
+ end
221
+ end
222
+ end
223
+ size - list.size
224
+ end
225
+
226
+ end
227
+ end