Class: MockRedis::Database
- Inherits:
-
Object
- Object
- MockRedis::Database
show all
- Includes:
- ConnectionMethod, GeospatialMethods, HashMethods, InfoMethod, ListMethods, SetMethods, SortMethod, StreamMethods, StringMethods, UtilityMethods, ZsetMethods
- Defined in:
- lib/mock_redis/database.rb
Constant Summary
GeospatialMethods::D_R, GeospatialMethods::EARTH_RADIUS_IN_METERS, GeospatialMethods::LAT_RANGE, GeospatialMethods::LNG_RANGE, GeospatialMethods::STEP, GeospatialMethods::UNITS
Constants included
from InfoMethod
InfoMethod::ALL_INFO, InfoMethod::CLIENTS_INFO, InfoMethod::COMMAND_STATS_COMBINED_INFO, InfoMethod::COMMAND_STATS_SOLO_INFO, InfoMethod::CPU_INFO, InfoMethod::DEFAULT_INFO, InfoMethod::KEYSPACE_INFO, InfoMethod::MEMORY_INFO, InfoMethod::PERSISTENCE_INFO, InfoMethod::REPLICATION_INFO, InfoMethod::SERVER_INFO, InfoMethod::STATS_INFO
Instance Attribute Summary collapse
Instance Method Summary
collapse
-
#auth(_) ⇒ Object
-
#bgrewriteaof ⇒ Object
-
#bgsave ⇒ Object
-
#call(command, &_block) ⇒ Object
Redis commands go below this line and above ‘private’.
-
#connected? ⇒ Boolean
-
#dbsize ⇒ Object
-
#del(*keys) ⇒ Object
(also: #unlink)
-
#disconnect ⇒ Object
(also: #close)
-
#dump(key) ⇒ Object
-
#echo(msg) ⇒ Object
-
#eval(*args) ⇒ Object
-
#evalsha(*args) ⇒ Object
-
#exists(*keys) ⇒ Object
-
#exists?(*keys) ⇒ Boolean
-
#expire(key, seconds) ⇒ Object
-
#expire_keys ⇒ Object
This method isn’t private, but it also isn’t a Redis command, so it doesn’t belong up above with all the Redis commands.
-
#expireat(key, timestamp) ⇒ Object
-
#flushdb ⇒ Object
-
#initialize(base, *_args) ⇒ Database
constructor
A new instance of Database.
-
#initialize_copy(_source) ⇒ Object
-
#keys(format = '*') ⇒ Object
-
#lastsave ⇒ Object
-
#now ⇒ Object
(also: #time)
-
#persist(key) ⇒ Object
-
#pexpire(key, ms) ⇒ Object
-
#pexpireat(key, timestamp_ms) ⇒ Object
-
#ping(response = 'PONG') ⇒ Object
-
#pttl(key) ⇒ Object
-
#quit ⇒ Object
-
#randomkey ⇒ Object
-
#rename(key, newkey) ⇒ Object
-
#renamenx(key, newkey) ⇒ Object
-
#restore(key, ttl, value, replace: false) ⇒ Object
-
#save ⇒ Object
-
#scan(cursor, opts = {}) ⇒ Object
-
#scan_each(opts = {}, &block) ⇒ Object
-
#script(subcommand, *args) ⇒ Object
-
#ttl(key) ⇒ Object
-
#type(key) ⇒ Object
#connection
#xadd, #xlen, #xrange, #xread, #xrevrange, #xtrim
#geodist, #geohash, #geopos
Methods included from InfoMethod
#info
Methods included from SortMethod
#sort
#zadd, #zcard, #zcount, #zincrby, #zinterstore, #zmscore, #zpopmax, #zpopmin, #zrange, #zrangebyscore, #zrank, #zrem, #zremrangebyrank, #zremrangebyscore, #zrevrange, #zrevrangebyscore, #zrevrank, #zscan, #zscan_each, #zscore, #zunionstore
#append, #bitcount, #bitfield, #decr, #decrby, #get, #getbit, #getdel, #getrange, #getset, #incr, #incrby, #incrbyfloat, #mapped_mget, #mapped_mset, #mapped_msetnx, #mget, #mset, #msetnx, #psetex, #set, #setbit, #setex, #setnx, #setrange, #strlen
Methods included from SetMethods
#sadd, #sadd?, #scard, #sdiff, #sdiffstore, #sinter, #sinterstore, #sismember, #smembers, #smismember, #smove, #spop, #srandmember, #srem, #sscan, #sscan_each, #sunion, #sunionstore
#blmove, #blpop, #brpop, #brpoplpush, #lindex, #linsert, #llen, #lmove, #lpop, #lpush, #lpushx, #lrange, #lrem, #lset, #ltrim, #rpop, #rpoplpush, #rpush, #rpushx
#hdel, #hexists, #hget, #hgetall, #hincrby, #hincrbyfloat, #hkeys, #hlen, #hmget, #hmset, #hscan, #hscan_each, #hset, #hsetnx, #hvals, #mapped_hmget, #mapped_hmset
Constructor Details
#initialize(base, *_args) ⇒ Database
Returns a new instance of Database.
32
33
34
35
36
|
# File 'lib/mock_redis/database.rb', line 32
def initialize(base, *_args)
@base = base
@data = MockRedis::IndifferentHash.new
@expire_times = []
end
|
Instance Attribute Details
#data ⇒ Object
Returns the value of attribute data.
30
31
32
|
# File 'lib/mock_redis/database.rb', line 30
def data
@data
end
|
#expire_times ⇒ Object
Returns the value of attribute expire_times.
30
31
32
|
# File 'lib/mock_redis/database.rb', line 30
def expire_times
@expire_times
end
|
Instance Method Details
#auth(_) ⇒ Object
50
51
52
|
# File 'lib/mock_redis/database.rb', line 50
def auth(_)
'OK'
end
|
#bgrewriteaof ⇒ Object
54
55
56
|
# File 'lib/mock_redis/database.rb', line 54
def bgrewriteaof
'Background append only file rewriting started'
end
|
#bgsave ⇒ Object
58
59
60
|
# File 'lib/mock_redis/database.rb', line 58
def bgsave
'Background saving started'
end
|
#call(command, &_block) ⇒ Object
Redis commands go below this line and above ‘private’
46
47
48
|
# File 'lib/mock_redis/database.rb', line 46
def call(command, &_block)
public_send(command[0].downcase, *command[1..])
end
|
#connected? ⇒ Boolean
68
69
70
|
# File 'lib/mock_redis/database.rb', line 68
def connected?
true
end
|
#dbsize ⇒ Object
72
73
74
|
# File 'lib/mock_redis/database.rb', line 72
def dbsize
data.keys.length
end
|
#del(*keys) ⇒ Object
Also known as:
unlink
76
77
78
79
80
81
82
83
84
85
|
# File 'lib/mock_redis/database.rb', line 76
def del(*keys)
keys = keys.flatten.map(&:to_s)
keys.
find_all { |key| data[key] }.
each { |k| persist(k) }.
each { |k| data.delete(k) }.
length
end
|
#disconnect ⇒ Object
Also known as:
close
62
63
64
|
# File 'lib/mock_redis/database.rb', line 62
def disconnect
nil
end
|
#dump(key) ⇒ Object
138
139
140
141
|
# File 'lib/mock_redis/database.rb', line 138
def dump(key)
value = data[key]
value ? Marshal.dump(value) : nil
end
|
#echo(msg) ⇒ Object
88
89
90
|
# File 'lib/mock_redis/database.rb', line 88
def echo(msg)
msg.to_s
end
|
#eval(*args) ⇒ Object
285
|
# File 'lib/mock_redis/database.rb', line 285
def eval(*args); end
|
#evalsha(*args) ⇒ Object
283
|
# File 'lib/mock_redis/database.rb', line 283
def evalsha(*args); end
|
#exists(*keys) ⇒ Object
124
125
126
|
# File 'lib/mock_redis/database.rb', line 124
def exists(*keys)
keys.count { |key| data.key?(key) }
end
|
#exists?(*keys) ⇒ Boolean
128
129
130
131
|
# File 'lib/mock_redis/database.rb', line 128
def exists?(*keys)
keys.each { |key| return true if data.key?(key) }
false
end
|
#expire(key, seconds) ⇒ Object
92
93
94
95
96
|
# File 'lib/mock_redis/database.rb', line 92
def expire(key, seconds)
assert_valid_integer(seconds)
pexpire(key, seconds.to_i * 1000)
end
|
#expire_keys ⇒ Object
This method isn’t private, but it also isn’t a Redis command, so it doesn’t belong up above with all the Redis commands.
373
374
375
376
377
378
379
380
381
382
383
384
|
# File 'lib/mock_redis/database.rb', line 373
def expire_keys
now_sec, miliseconds = now
now_ms = now_sec * 1_000 + miliseconds
to_delete = expire_times.take_while do |(time, _key)|
(time.to_r * 1_000).to_i <= now_ms
end
to_delete.each do |(_time, key)|
del(key)
end
end
|
#expireat(key, timestamp) ⇒ Object
106
107
108
109
110
|
# File 'lib/mock_redis/database.rb', line 106
def expireat(key, timestamp)
assert_valid_integer(timestamp)
pexpireat(key, timestamp.to_i * 1000)
end
|
#flushdb ⇒ Object
133
134
135
136
|
# File 'lib/mock_redis/database.rb', line 133
def flushdb
data.each_key { |k| del(k) }
'OK'
end
|
#initialize_copy(_source) ⇒ Object
38
39
40
41
42
|
# File 'lib/mock_redis/database.rb', line 38
def initialize_copy(_source)
@data = @data.clone
@data.each_key { |k| @data[k] = @data[k].clone }
@expire_times = @expire_times.map(&:clone)
end
|
#keys(format = '*') ⇒ Object
154
155
156
|
# File 'lib/mock_redis/database.rb', line 154
def keys(format = '*')
data.keys.grep(redis_pattern_to_ruby_regex(format))
end
|
#lastsave ⇒ Object
172
173
174
|
# File 'lib/mock_redis/database.rb', line 172
def lastsave
now.first
end
|
#now ⇒ Object
Also known as:
time
254
255
256
257
258
|
# File 'lib/mock_redis/database.rb', line 254
def now
current_time = @base.options[:time_class].now
miliseconds = (current_time.to_r - current_time.to_i) * 1_000
[current_time.to_i, miliseconds.to_i]
end
|
#persist(key) ⇒ Object
176
177
178
179
180
181
182
183
|
# File 'lib/mock_redis/database.rb', line 176
def persist(key)
if exists?(key) && has_expiration?(key)
remove_expiration(key)
true
else
false
end
end
|
#pexpire(key, ms) ⇒ Object
98
99
100
101
102
103
104
|
# File 'lib/mock_redis/database.rb', line 98
def pexpire(key, ms)
assert_valid_integer(ms)
now, miliseconds = @base.now
now_ms = (now * 1000) + miliseconds
pexpireat(key, now_ms + ms.to_i)
end
|
#pexpireat(key, timestamp_ms) ⇒ Object
112
113
114
115
116
117
118
119
120
121
122
|
# File 'lib/mock_redis/database.rb', line 112
def pexpireat(key, timestamp_ms)
assert_valid_integer(timestamp_ms)
if exists?(key)
timestamp = Rational(timestamp_ms.to_i, 1000)
set_expiration(key, @base.time_at(timestamp))
true
else
false
end
end
|
#ping(response = 'PONG') ⇒ Object
185
186
187
|
# File 'lib/mock_redis/database.rb', line 185
def ping(response = 'PONG')
response
end
|
#pttl(key) ⇒ Object
241
242
243
244
245
246
247
248
249
250
251
252
|
# File 'lib/mock_redis/database.rb', line 241
def pttl(key)
now, miliseconds = @base.now
now_ms = now * 1000 + miliseconds
if !exists?(key)
-2
elsif has_expiration?(key)
(expiration(key).to_r * 1000).to_i - now_ms
else
-1
end
end
|
#quit ⇒ Object
189
190
191
|
# File 'lib/mock_redis/database.rb', line 189
def quit
'OK'
end
|
#randomkey ⇒ Object
193
194
195
|
# File 'lib/mock_redis/database.rb', line 193
def randomkey
data.keys[rand(data.length)]
end
|
#rename(key, newkey) ⇒ Object
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
# File 'lib/mock_redis/database.rb', line 197
def rename(key, newkey)
unless data.include?(key)
raise Redis::CommandError, 'ERR no such key'
end
if key != newkey
data[newkey] = data.delete(key)
if has_expiration?(key)
set_expiration(newkey, expiration(key))
remove_expiration(key)
end
end
'OK'
end
|
#renamenx(key, newkey) ⇒ Object
213
214
215
216
217
218
219
220
221
222
223
224
|
# File 'lib/mock_redis/database.rb', line 213
def renamenx(key, newkey)
unless data.include?(key)
raise Redis::CommandError, 'ERR no such key'
end
if exists?(newkey)
false
else
rename(key, newkey)
true
end
end
|
#restore(key, ttl, value, replace: false) ⇒ Object
143
144
145
146
147
148
149
150
151
152
|
# File 'lib/mock_redis/database.rb', line 143
def restore(key, ttl, value, replace: false)
if !replace && exists?(key)
raise Redis::CommandError, 'BUSYKEY Target key name already exists.'
end
data[key] = Marshal.load(value) if ttl > 0
pexpire(key, ttl)
end
'OK'
end
|
#save ⇒ Object
226
227
228
|
# File 'lib/mock_redis/database.rb', line 226
def save
'OK'
end
|
#scan(cursor, opts = {}) ⇒ Object
158
159
160
|
# File 'lib/mock_redis/database.rb', line 158
def scan(cursor, opts = {})
common_scan(data.keys, cursor, opts)
end
|
#scan_each(opts = {}, &block) ⇒ Object
162
163
164
165
166
167
168
169
170
|
# File 'lib/mock_redis/database.rb', line 162
def scan_each(opts = {}, &block)
return to_enum(:scan_each, opts) unless block_given?
cursor = 0
loop do
cursor, keys = scan(cursor, opts)
keys.each(&block)
break if cursor == '0'
end
end
|
#script(subcommand, *args) ⇒ Object
281
|
# File 'lib/mock_redis/database.rb', line 281
def script(subcommand, *args); end
|
#ttl(key) ⇒ Object
230
231
232
233
234
235
236
237
238
239
|
# File 'lib/mock_redis/database.rb', line 230
def ttl(key)
if !exists?(key)
-2
elsif has_expiration?(key)
now, = @base.now
expiration(key).to_i - now
else
-1
end
end
|
#type(key) ⇒ Object
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
|
# File 'lib/mock_redis/database.rb', line 261
def type(key)
if !exists?(key)
'none'
elsif hashy?(key)
'hash'
elsif stringy?(key)
'string'
elsif listy?(key)
'list'
elsif sety?(key)
'set'
elsif zsety?(key)
'zset'
elsif streamy?(key)
'stream'
else
raise ArgumentError, "Not sure how #{data[key].inspect} got in here"
end
end
|