redis-roc 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/redis-roc.rb +2 -0
- data/lib/roc/ext/redis_ext.rb +20 -0
- data/lib/roc/objects/base.rb +81 -0
- data/lib/roc/objects/float.rb +32 -0
- data/lib/roc/objects/hash.rb +134 -0
- data/lib/roc/objects/integer.rb +51 -0
- data/lib/roc/objects/list.rb +204 -0
- data/lib/roc/objects/lock.rb +53 -0
- data/lib/roc/objects/set.rb +148 -0
- data/lib/roc/objects/sorted_set.rb +217 -0
- data/lib/roc/objects/string.rb +116 -0
- data/lib/roc/objects/time.rb +62 -0
- data/lib/roc/objects.rb +11 -0
- data/lib/roc/store/object_initializers.rb +74 -0
- data/lib/roc/store/redis_eval.rb +7 -0
- data/lib/roc/store/redis_store.rb +76 -0
- data/lib/roc/store/roc_store.rb +11 -0
- data/lib/roc/store/transient_eval.rb +42 -0
- data/lib/roc/store/transient_store.rb +1425 -0
- data/lib/roc/store.rb +2 -0
- data/lib/roc/types/all_types.rb +41 -0
- data/lib/roc/types/array_type.rb +106 -0
- data/lib/roc/types/method_generators.rb +38 -0
- data/lib/roc/types/scalar_type.rb +58 -0
- data/lib/roc/types/sortable_type.rb +32 -0
- data/lib/roc/version.rb +3 -0
- metadata +114 -0
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'roc/objects/base'
|
2
|
+
require 'roc/types/array_type'
|
3
|
+
require 'roc/types/sortable_type'
|
4
|
+
|
5
|
+
module ROC
|
6
|
+
class Set < Base
|
7
|
+
include ROC::Types::ArrayType
|
8
|
+
include ROC::Types::SortableType
|
9
|
+
extend ROC::Types::MethodGenerators
|
10
|
+
|
11
|
+
nonserializing_method :sadd
|
12
|
+
alias add sadd
|
13
|
+
|
14
|
+
zero_arg_method :scard
|
15
|
+
alias card scard
|
16
|
+
|
17
|
+
nonserializing_method :sismember
|
18
|
+
alias ismember sismember
|
19
|
+
alias ismember? sismember
|
20
|
+
alias is_member? sismember
|
21
|
+
alias include? sismember
|
22
|
+
|
23
|
+
zero_arg_method :smembers
|
24
|
+
alias members smembers
|
25
|
+
|
26
|
+
zero_arg_method :spop
|
27
|
+
|
28
|
+
zero_arg_method :srandmember
|
29
|
+
alias randmmember srandmember
|
30
|
+
alias rand_member srandmember
|
31
|
+
|
32
|
+
nonserializing_method :srem
|
33
|
+
alias rem srem
|
34
|
+
|
35
|
+
def smove(other_set, val)
|
36
|
+
self.call :smove, other_set.key, val
|
37
|
+
end
|
38
|
+
alias move smove
|
39
|
+
alias move_into smove
|
40
|
+
|
41
|
+
def sinter(*other_sets)
|
42
|
+
self.call :sinter, *other_sets.map{|s| s.key}
|
43
|
+
end
|
44
|
+
alias inter sinter
|
45
|
+
alias intersect sinter
|
46
|
+
alias :& :sinter ## to make rdoc parser happy
|
47
|
+
|
48
|
+
def sunion(*other_sets)
|
49
|
+
self.call :sunion, *other_sets.map{|s| s.key}
|
50
|
+
end
|
51
|
+
alias union sunion
|
52
|
+
alias | sunion
|
53
|
+
|
54
|
+
def sdiff(*other_sets)
|
55
|
+
self.call :sdiff, *other_sets.map{|s| s.key}
|
56
|
+
end
|
57
|
+
alias diff sdiff
|
58
|
+
alias - sdiff
|
59
|
+
|
60
|
+
def sinterstore(*other_sets)
|
61
|
+
self.call :sinterstore, *other_sets.map{|s| s.key}
|
62
|
+
end
|
63
|
+
alias interstore sinterstore
|
64
|
+
alias inter_store sinterstore
|
65
|
+
alias set_as_intersect_of sinterstore
|
66
|
+
|
67
|
+
def sunionstore(*other_sets)
|
68
|
+
self.call :sunionstore, *other_sets.map{|s| s.key}
|
69
|
+
end
|
70
|
+
alias unionstore sunionstore
|
71
|
+
alias union_store sunionstore
|
72
|
+
alias set_as_union_of sunionstore
|
73
|
+
|
74
|
+
def sdiffstore(*other_sets)
|
75
|
+
self.call :sdiffstore, *other_sets.map{|s| s.key}
|
76
|
+
end
|
77
|
+
alias diffstore sdiffstore
|
78
|
+
alias diff_store sdiffstore
|
79
|
+
alias set_as_diff_of sdiffstore
|
80
|
+
|
81
|
+
## helpers
|
82
|
+
|
83
|
+
def to_hash
|
84
|
+
hsh = {}
|
85
|
+
self.smembers.each do |val|
|
86
|
+
hsh[val] = true
|
87
|
+
end
|
88
|
+
hsh
|
89
|
+
end
|
90
|
+
alias to_h to_hash
|
91
|
+
|
92
|
+
## implement (if posible) destructive methods that would otherwise raise
|
93
|
+
|
94
|
+
def delete(val)
|
95
|
+
if self.srem(val)
|
96
|
+
val
|
97
|
+
else
|
98
|
+
nil
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def push(*objs)
|
103
|
+
if 1 == objs.size
|
104
|
+
self.sadd(objs[0])
|
105
|
+
elsif objs.size > 1
|
106
|
+
self.storage.multi do
|
107
|
+
objs.each do |obj|
|
108
|
+
self.sadd(obj)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
self
|
113
|
+
end
|
114
|
+
|
115
|
+
def <<(obj)
|
116
|
+
self.push(obj)
|
117
|
+
end
|
118
|
+
|
119
|
+
def pop(*args)
|
120
|
+
if 0 == args.size
|
121
|
+
self.spop
|
122
|
+
elsif 1 == args.size
|
123
|
+
(self.storage.multi do
|
124
|
+
args[0].times do
|
125
|
+
self.spop
|
126
|
+
end
|
127
|
+
end).reverse
|
128
|
+
else
|
129
|
+
raise ArgumentError, "wrong number of arguments (#{args.size} for 1)"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
## implementing ArrayType ##
|
134
|
+
|
135
|
+
def clobber(vals)
|
136
|
+
self.storage.multi do
|
137
|
+
self.forget
|
138
|
+
vals.each{|v| self << v}
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
alias values smembers
|
143
|
+
|
144
|
+
alias size scard
|
145
|
+
alias length scard
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,217 @@
|
|
1
|
+
require 'roc/objects/base'
|
2
|
+
require 'roc/types/array_type'
|
3
|
+
require 'roc/types/sortable_type'
|
4
|
+
|
5
|
+
module ROC
|
6
|
+
class SortedSet < Base
|
7
|
+
include ROC::Types::ArrayType
|
8
|
+
include ROC::Types::SortableType
|
9
|
+
extend ROC::Types::MethodGenerators
|
10
|
+
|
11
|
+
def zadd(score, val)
|
12
|
+
self.call :zadd, score, val
|
13
|
+
end
|
14
|
+
alias add zadd
|
15
|
+
|
16
|
+
zero_arg_method :zcard
|
17
|
+
alias card zcard
|
18
|
+
|
19
|
+
def zrange(start_index, stop_index, opts={})
|
20
|
+
self.call :zrange, start_index, stop_index, opts
|
21
|
+
end
|
22
|
+
alias range zrange
|
23
|
+
|
24
|
+
def zrevrange(start_index, stop_index, opts={})
|
25
|
+
self.call :zrevrange, start_index, stop_index, opts
|
26
|
+
end
|
27
|
+
alias revrange zrevrange
|
28
|
+
|
29
|
+
def zrangebyscore(min, max, opts={})
|
30
|
+
self.call :zrangebyscore, min, max, opts
|
31
|
+
end
|
32
|
+
alias rangebyscore zrangebyscore
|
33
|
+
|
34
|
+
def zrevrangebyscore(max, min, opts={})
|
35
|
+
self.call :zrevrangebyscore, max, min, opts
|
36
|
+
end
|
37
|
+
alias revrangebyscore zrevrangebyscore
|
38
|
+
|
39
|
+
def zcount (min, max)
|
40
|
+
self.call :zcount, min, max
|
41
|
+
end
|
42
|
+
alias count zcount
|
43
|
+
|
44
|
+
nonserializing_method :zrank
|
45
|
+
alias rank zrank
|
46
|
+
|
47
|
+
nonserializing_method :zrevrank
|
48
|
+
alias revrank zrevrank
|
49
|
+
|
50
|
+
nonserializing_method :zscore
|
51
|
+
alias score zscore
|
52
|
+
|
53
|
+
def zincrby(by, val)
|
54
|
+
self.call :zincrby, by, val
|
55
|
+
end
|
56
|
+
alias incrby zincrby
|
57
|
+
|
58
|
+
nonserializing_method :zrem
|
59
|
+
alias rem zrem
|
60
|
+
|
61
|
+
def zremrangebyscore(min, max)
|
62
|
+
self.call :zremrangebyscore, min, max
|
63
|
+
end
|
64
|
+
alias remrangebyscore zremrangebyscore
|
65
|
+
|
66
|
+
def zremrangebyrank(start, stop)
|
67
|
+
self.call :zremrangebyrank, start, stop
|
68
|
+
end
|
69
|
+
alias remrangebyrank zremrangebyrank
|
70
|
+
|
71
|
+
def zinterstore(*other_sorted_sets)
|
72
|
+
opts = if other_sorted_sets.last.is_a?(::Hash)
|
73
|
+
other_sorted_sets.pop
|
74
|
+
else
|
75
|
+
{}
|
76
|
+
end
|
77
|
+
|
78
|
+
self.call :zinterstore, [*other_sorted_sets].map{|s| s.key}, opts
|
79
|
+
end
|
80
|
+
alias interstore zinterstore
|
81
|
+
alias inter_store zinterstore
|
82
|
+
alias set_as_intersect_of zinterstore
|
83
|
+
|
84
|
+
def zunionstore(*other_sorted_sets)
|
85
|
+
opts = if other_sorted_sets.last.is_a?(::Hash)
|
86
|
+
other_sorted_sets.pop
|
87
|
+
else
|
88
|
+
{}
|
89
|
+
end
|
90
|
+
self.call :zunionstore, [*other_sorted_sets].map{|s| s.key}, opts
|
91
|
+
end
|
92
|
+
alias unionstore zunionstore
|
93
|
+
alias union_store zunionstore
|
94
|
+
alias set_as_union_of zunionstore
|
95
|
+
|
96
|
+
## shortcut methods
|
97
|
+
|
98
|
+
def [](range_or_num, num=nil)
|
99
|
+
if range_or_num.is_a?(::Integer)
|
100
|
+
if num.nil?
|
101
|
+
self.zrange(range_or_num, range_or_num)[0]
|
102
|
+
elsif num >= 0
|
103
|
+
self.zrange(range_or_num, range_or_num + num - 1)
|
104
|
+
else
|
105
|
+
raise ArgumentError, 'second arg to [] must be a non-neg integer'
|
106
|
+
end
|
107
|
+
elsif range_or_num.is_a?(Range)
|
108
|
+
self.zrange(range_or_num.first, (range_or_num.exclude_end? ? range_or_num.last - 1 : range_or_num.last))
|
109
|
+
else
|
110
|
+
if num.nil?
|
111
|
+
self.values.slice(range_or_num)
|
112
|
+
else
|
113
|
+
self.values.slice(range_or_num, num)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
alias slice []
|
118
|
+
|
119
|
+
def first
|
120
|
+
self.zrange(0, 0)[0]
|
121
|
+
end
|
122
|
+
|
123
|
+
def last
|
124
|
+
self.zrange(-1, -1)[0]
|
125
|
+
end
|
126
|
+
|
127
|
+
def include?(val)
|
128
|
+
!self.zrank(val).nil?
|
129
|
+
end
|
130
|
+
|
131
|
+
def index(val)
|
132
|
+
self.zrank(val)
|
133
|
+
end
|
134
|
+
|
135
|
+
def reverse
|
136
|
+
self.zrevrange(0, -1)
|
137
|
+
end
|
138
|
+
|
139
|
+
# helpers
|
140
|
+
|
141
|
+
def decrby(by, val)
|
142
|
+
self.zincrby -by, val
|
143
|
+
end
|
144
|
+
|
145
|
+
def increment(val, by=nil)
|
146
|
+
self.zincrby( (by || 1), val )
|
147
|
+
end
|
148
|
+
|
149
|
+
def decrement(val, by=nil)
|
150
|
+
self.zincrby( -(by || 1), val )
|
151
|
+
end
|
152
|
+
|
153
|
+
def to_hash
|
154
|
+
hsh = {}
|
155
|
+
vals_with_scores = self.zrangebyscore('-inf', '+inf', :with_scores => true)
|
156
|
+
i = 0
|
157
|
+
l = vals_with_scores.size
|
158
|
+
while i < l
|
159
|
+
hsh[vals_with_scores[i]] = vals_with_scores[i+1]
|
160
|
+
i += 2
|
161
|
+
end
|
162
|
+
hsh
|
163
|
+
end
|
164
|
+
alias to_h to_hash
|
165
|
+
|
166
|
+
## implement (if posible) destructive methods that would otherwise raise
|
167
|
+
|
168
|
+
def delete(val)
|
169
|
+
if self.zrem(val)
|
170
|
+
val
|
171
|
+
else
|
172
|
+
nil
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def <<(val_and_score)
|
177
|
+
if val_and_score.is_a?(Array)
|
178
|
+
self.zadd *val_and_score
|
179
|
+
elsif val_and_score.is_a?(::Hash) && val_and_score.has_key?(:value) && val_and_score.has_key?(:score)
|
180
|
+
self.zadd(val_and_score[:score], val_and_score[:value])
|
181
|
+
else
|
182
|
+
raise ArgumentError, 'an Array or a Hash required'
|
183
|
+
end
|
184
|
+
self
|
185
|
+
end
|
186
|
+
|
187
|
+
def push(*objs)
|
188
|
+
if 1 == objs.size
|
189
|
+
self << objs[0]
|
190
|
+
elsif objs.size > 1
|
191
|
+
self.storage.multi do
|
192
|
+
objs.each do |obj|
|
193
|
+
self << obj
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
self
|
198
|
+
end
|
199
|
+
|
200
|
+
## implementing ArrayType ##
|
201
|
+
|
202
|
+
def clobber(vals)
|
203
|
+
self.storage.multi do
|
204
|
+
self.forget
|
205
|
+
vals.each{|v| self << v}
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
def values(opts = {})
|
210
|
+
self.zrange(0, -1, opts)
|
211
|
+
end
|
212
|
+
|
213
|
+
alias size zcard
|
214
|
+
alias length zcard
|
215
|
+
|
216
|
+
end
|
217
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'roc/objects/base'
|
2
|
+
require 'roc/types/scalar_type'
|
3
|
+
|
4
|
+
module ROC
|
5
|
+
class String < Base
|
6
|
+
include ROC::Types::ScalarType
|
7
|
+
extend ROC::Types::MethodGenerators
|
8
|
+
|
9
|
+
delegate_methods :on => '', :to => :value
|
10
|
+
|
11
|
+
attr_reader :encoding
|
12
|
+
|
13
|
+
def to_string
|
14
|
+
self.value.to_s
|
15
|
+
end
|
16
|
+
alias to_s to_string
|
17
|
+
|
18
|
+
## redis methods ##
|
19
|
+
|
20
|
+
nonserializing_method :append
|
21
|
+
alias << append
|
22
|
+
alias concat append
|
23
|
+
|
24
|
+
def getrange(first_index, last_index)
|
25
|
+
self.call :getrange, first_index, last_index
|
26
|
+
end
|
27
|
+
alias substr getrange
|
28
|
+
alias substring getrange
|
29
|
+
|
30
|
+
nonserializing_method :getbit
|
31
|
+
|
32
|
+
def setbit(index, val)
|
33
|
+
self.call :setbit, index, val
|
34
|
+
end
|
35
|
+
|
36
|
+
def setrange(start_index, val)
|
37
|
+
self.call :setrange, start_index, val
|
38
|
+
end
|
39
|
+
alias splice setrange
|
40
|
+
|
41
|
+
zero_arg_method :strlen
|
42
|
+
alias bytesize strlen
|
43
|
+
|
44
|
+
## shortcut methods
|
45
|
+
|
46
|
+
def getbyte(ind)
|
47
|
+
val = self.getrange(ind, ind)
|
48
|
+
if val.nil? || ('' == val)
|
49
|
+
nil
|
50
|
+
else
|
51
|
+
val.bytes.to_a[0]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def setbyte(ind, int)
|
56
|
+
self.setrange(ind, int.chr)
|
57
|
+
int
|
58
|
+
end
|
59
|
+
|
60
|
+
def empty?
|
61
|
+
0 == self.strlen
|
62
|
+
end
|
63
|
+
|
64
|
+
def chr
|
65
|
+
self.getrange(0, 0)
|
66
|
+
end
|
67
|
+
|
68
|
+
## implement (if posible) destructive methods that would otherwise raise
|
69
|
+
|
70
|
+
def replace(val)
|
71
|
+
self.set(val)
|
72
|
+
val
|
73
|
+
end
|
74
|
+
|
75
|
+
def clear
|
76
|
+
self.replace('')
|
77
|
+
end
|
78
|
+
|
79
|
+
def force_encoding(enc)
|
80
|
+
@encoding = enc
|
81
|
+
end
|
82
|
+
|
83
|
+
## raise destructive methods if not implemted
|
84
|
+
|
85
|
+
def insert(ind, val)
|
86
|
+
raise NotImplementedError
|
87
|
+
end
|
88
|
+
|
89
|
+
## implementing scalar type required methods ##
|
90
|
+
|
91
|
+
def serialize(val)
|
92
|
+
## use the encoding of the first val were sent unless expicitly set
|
93
|
+
if @encoding.nil?
|
94
|
+
@encoding = if val.respond_to?(:encoding)
|
95
|
+
val.encoding
|
96
|
+
else
|
97
|
+
'US-ASCII'
|
98
|
+
end
|
99
|
+
end
|
100
|
+
if val.respond_to?(:encode)
|
101
|
+
val.encode(@encoding)
|
102
|
+
else
|
103
|
+
val
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def deserialize(val)
|
108
|
+
if @encoding.nil? || !val.respond_to?(:force_encoding)
|
109
|
+
val
|
110
|
+
else
|
111
|
+
val.force_encoding(@encoding)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'roc/objects/base'
|
2
|
+
module ROC
|
3
|
+
class Time < Base
|
4
|
+
include ROC::Types::ScalarType
|
5
|
+
|
6
|
+
delegate_methods :on => ::Time.now, :to => :value
|
7
|
+
|
8
|
+
def to_time
|
9
|
+
v = self.value
|
10
|
+
if v.nil?
|
11
|
+
::Time.at(0)
|
12
|
+
else
|
13
|
+
v
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
self.to_time.to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
## implement (if posible) destructive methods that would otherwise raise
|
22
|
+
|
23
|
+
def localtime(offset=nil)
|
24
|
+
if (0 == ::Time.now.method(:localtime).arity) && !offset.nil?
|
25
|
+
raise ArgumentError, "1.8 Time#localtime doesn't take an arg"
|
26
|
+
else
|
27
|
+
@offset = offset
|
28
|
+
end
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
32
|
+
## implementing scalar type required methods ##
|
33
|
+
|
34
|
+
def serialize(val)
|
35
|
+
if ::Time.now.respond_to?(:nsec)
|
36
|
+
val.to_i.to_s + '.' + val.nsec.to_s ##strait to_f loses precision
|
37
|
+
else
|
38
|
+
val.to_i.to_s + '.' + val.usec.to_s ##strait to_f loses precision
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def deserialize(val)
|
43
|
+
if val.nil?
|
44
|
+
nil
|
45
|
+
else
|
46
|
+
parts = val.split('.')
|
47
|
+
t = if ::Time.now.respond_to?(:nsec)
|
48
|
+
::Time.at(parts[0].to_i, (parts[1].to_i / 1000))
|
49
|
+
else
|
50
|
+
::Time.at(parts[0].to_i, parts[1].to_i)
|
51
|
+
end
|
52
|
+
if defined?(@offset)
|
53
|
+
if ::Time.now.method(:localtime).arity > 0
|
54
|
+
t.localtime(@offset)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
t
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
data/lib/roc/objects.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'roc/objects/string'
|
2
|
+
require 'roc/objects/integer'
|
3
|
+
require 'roc/objects/float'
|
4
|
+
require 'roc/objects/time'
|
5
|
+
require 'roc/objects/lock'
|
6
|
+
|
7
|
+
require 'roc/objects/list'
|
8
|
+
require 'roc/objects/set'
|
9
|
+
require 'roc/objects/sorted_set'
|
10
|
+
|
11
|
+
require 'roc/objects/hash'
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module ROC
|
2
|
+
module Store
|
3
|
+
module ObjectInitializers
|
4
|
+
|
5
|
+
def init(klass, key, *seed_data_and_options)
|
6
|
+
klass.new(key, self, *seed_data_and_options)
|
7
|
+
end
|
8
|
+
|
9
|
+
def find(key)
|
10
|
+
if klass = class_for_key(key)
|
11
|
+
init(klass, key)
|
12
|
+
else
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def class_for_key(key)
|
18
|
+
case t = self.call(:type, key)
|
19
|
+
when 'string'
|
20
|
+
ROC::String
|
21
|
+
when 'list'
|
22
|
+
ROC::List
|
23
|
+
when 'set'
|
24
|
+
ROC::Set
|
25
|
+
when 'zset'
|
26
|
+
ROC::SortedSet
|
27
|
+
when 'hash'
|
28
|
+
ROC::Hash
|
29
|
+
when 'none'
|
30
|
+
nil
|
31
|
+
else
|
32
|
+
raise "unknown type: #{t}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def init_string(key, *seed_data_and_options)
|
37
|
+
init(ROC::String, key, *seed_data_and_options)
|
38
|
+
end
|
39
|
+
|
40
|
+
def init_integer(key, *seed_data_and_options)
|
41
|
+
init(ROC::Integer, key, *seed_data_and_options)
|
42
|
+
end
|
43
|
+
|
44
|
+
def init_float(key, *seed_data_and_options)
|
45
|
+
init(ROC::Float, key, *seed_data_and_options)
|
46
|
+
end
|
47
|
+
|
48
|
+
def init_time(key, *seed_data_and_options)
|
49
|
+
init(ROC::Time, key, *seed_data_and_options)
|
50
|
+
end
|
51
|
+
|
52
|
+
def init_lock(key, *seed_data_and_options)
|
53
|
+
init(ROC::Lock, key, *seed_data_and_options)
|
54
|
+
end
|
55
|
+
|
56
|
+
def init_list(key, *seed_data_and_options)
|
57
|
+
init(ROC::List, key, *seed_data_and_options)
|
58
|
+
end
|
59
|
+
|
60
|
+
def init_set(key, *seed_data_and_options)
|
61
|
+
init(ROC::Set, key, *seed_data_and_options)
|
62
|
+
end
|
63
|
+
|
64
|
+
def init_sorted_set(key, *seed_data_and_options)
|
65
|
+
init(ROC::SortedSet, key, *seed_data_and_options)
|
66
|
+
end
|
67
|
+
|
68
|
+
def init_hash(key, *seed_data_and_options)
|
69
|
+
init(ROC::Hash, key, *seed_data_and_options)
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
if RUBY_VERSION.match(/^1\.8/)
|
2
|
+
require 'rubygems'
|
3
|
+
end
|
4
|
+
require 'redis'
|
5
|
+
require 'roc/ext/redis_ext'
|
6
|
+
require 'roc/store/roc_store'
|
7
|
+
require 'roc/store/object_initializers'
|
8
|
+
|
9
|
+
require 'forwardable'
|
10
|
+
|
11
|
+
module ROC
|
12
|
+
module Store
|
13
|
+
class RedisStore < ROCStore
|
14
|
+
include ObjectInitializers
|
15
|
+
extend Forwardable
|
16
|
+
|
17
|
+
attr_reader :connection
|
18
|
+
|
19
|
+
def initialize(connection)
|
20
|
+
if connection.is_a?(Redis)
|
21
|
+
@connection = connection
|
22
|
+
else
|
23
|
+
@connection = Redis.connect(connection)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def call(method_name, *args)
|
28
|
+
self.connection.send method_name, *args
|
29
|
+
end
|
30
|
+
|
31
|
+
def_delegators :connection, :watch, :unwatch, :flushdb
|
32
|
+
|
33
|
+
def multi
|
34
|
+
@in_multi = true
|
35
|
+
if block_given?
|
36
|
+
ret = self.connection.multi do
|
37
|
+
yield
|
38
|
+
end
|
39
|
+
@in_multi = false
|
40
|
+
else
|
41
|
+
ret = self.connection.multi
|
42
|
+
end
|
43
|
+
ret
|
44
|
+
end
|
45
|
+
|
46
|
+
def exec
|
47
|
+
ret = self.connection.exec
|
48
|
+
if @in_multi
|
49
|
+
@in_multi = false
|
50
|
+
end
|
51
|
+
ret
|
52
|
+
end
|
53
|
+
|
54
|
+
def discard
|
55
|
+
ret = self.connection.discard
|
56
|
+
if @in_multi
|
57
|
+
@in_multi = false
|
58
|
+
end
|
59
|
+
ret
|
60
|
+
end
|
61
|
+
|
62
|
+
def in_multi?
|
63
|
+
!!@in_multi
|
64
|
+
end
|
65
|
+
|
66
|
+
def inspect
|
67
|
+
"<#{self.class} @connection=#{self.connection.inspect}>"
|
68
|
+
end
|
69
|
+
|
70
|
+
def enable_eval
|
71
|
+
require 'roc/store/redis_eval'
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|