Class: MockRedis::Database

Inherits:
Object
  • Object
show all
Includes:
HashMethods, InfoMethod, ListMethods, SetMethods, SortMethod, StringMethods, UtilityMethods, ZsetMethods
Defined in:
lib/mock_redis/database.rb

Constant Summary

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

Methods included from InfoMethod

#info

Methods included from SortMethod

#sort

Methods included from ZsetMethods

#zadd, #zcard, #zcount, #zincrby, #zinterstore, #zrange, #zrangebyscore, #zrank, #zrem, #zremrangebyrank, #zremrangebyscore, #zrevrange, #zrevrangebyscore, #zrevrank, #zscan, #zscan_each, #zscore, #zunionstore

Methods included from StringMethods

#[], #[]=, #append, #bitcount, #decr, #decrby, #get, #getbit, #getrange, #getset, #incr, #incrby, #incrbyfloat, #mapped_mget, #mapped_mset, #mapped_msetnx, #mget, #mset, #msetnx, #set, #setbit, #setex, #setnx, #setrange, #strlen

Methods included from SetMethods

#sadd, #scard, #sdiff, #sdiffstore, #sinter, #sinterstore, #sismember, #smembers, #smove, #spop, #srandmember, #srem, #sscan, #sscan_each, #sunion, #sunionstore

Methods included from ListMethods

#blpop, #brpop, #brpoplpush, #lindex, #linsert, #llen, #lpop, #lpush, #lpushx, #lrange, #lrem, #lset, #ltrim, #rpop, #rpoplpush, #rpush, #rpushx

Methods included from HashMethods

#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.



26
27
28
29
30
# File 'lib/mock_redis/database.rb', line 26

def initialize(base, *_args)
  @base = base
  @data = MockRedis::IndifferentHash.new
  @expire_times = []
end

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



24
25
26
# File 'lib/mock_redis/database.rb', line 24

def data
  @data
end

#expire_timesObject (readonly)

Returns the value of attribute expire_times.



24
25
26
# File 'lib/mock_redis/database.rb', line 24

def expire_times
  @expire_times
end

Instance Method Details

#auth(_) ⇒ Object

Redis commands go below this line and above ‘private’



40
41
42
# File 'lib/mock_redis/database.rb', line 40

def auth(_)
  'OK'
end

#bgrewriteaofObject



44
45
46
# File 'lib/mock_redis/database.rb', line 44

def bgrewriteaof
  'Background append only file rewriting started'
end

#bgsaveObject



48
49
50
# File 'lib/mock_redis/database.rb', line 48

def bgsave
  'Background saving started'
end

#connected?Boolean

Returns:

  • (Boolean)


56
57
58
# File 'lib/mock_redis/database.rb', line 56

def connected?
  true
end

#dbsizeObject



60
61
62
# File 'lib/mock_redis/database.rb', line 60

def dbsize
  data.keys.length
end

#del(*keys) ⇒ Object



64
65
66
67
68
69
70
71
72
73
# File 'lib/mock_redis/database.rb', line 64

def del(*keys)
  keys = keys.flatten.map(&:to_s)
  assert_has_args(keys, 'del')

  keys.
    find_all { |key| data[key] }.
    each { |k| persist(k) }.
    each { |k| data.delete(k) }.
    length
end

#disconnectObject



52
53
54
# File 'lib/mock_redis/database.rb', line 52

def disconnect
  nil
end

#echo(msg) ⇒ Object



75
76
77
# File 'lib/mock_redis/database.rb', line 75

def echo(msg)
  msg.to_s
end

#eval(*args) ⇒ Object



238
239
# File 'lib/mock_redis/database.rb', line 238

def eval(*args)
end

#evalsha(*args) ⇒ Object



235
236
# File 'lib/mock_redis/database.rb', line 235

def evalsha(*args)
end

#exists(key) ⇒ Object



110
111
112
# File 'lib/mock_redis/database.rb', line 110

def exists(key)
  data.key?(key)
end

#expire(key, seconds) ⇒ Object



79
80
81
# File 'lib/mock_redis/database.rb', line 79

def expire(key, seconds)
  pexpire(key, seconds.to_i * 1000)
end

#expire_keysObject

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.



321
322
323
324
325
326
327
328
329
330
331
# File 'lib/mock_redis/database.rb', line 321

def expire_keys
  now = @base.now

  to_delete = expire_times.take_while do |(time, _key)|
    (time.to_r * 1_000).to_i <= (now.to_r * 1_000).to_i
  end

  to_delete.each do |(_time, key)|
    del(key)
  end
end

#expireat(key, timestamp) ⇒ Object



88
89
90
91
92
93
94
# File 'lib/mock_redis/database.rb', line 88

def expireat(key, timestamp)
  unless looks_like_integer?(timestamp.to_s)
    raise Redis::CommandError, 'ERR value is not an integer or out of range'
  end

  pexpireat(key, timestamp.to_i * 1000)
end

#flushdbObject



114
115
116
117
# File 'lib/mock_redis/database.rb', line 114

def flushdb
  data.keys.each { |k| del(k) }
  'OK'
end

#initialize_copy(_source) ⇒ Object



32
33
34
35
36
# File 'lib/mock_redis/database.rb', line 32

def initialize_copy(_source)
  @data = @data.clone
  @data.keys.each { |k| @data[k] = @data[k].clone }
  @expire_times = @expire_times.map(&:clone)
end

#keys(format = '*') ⇒ Object



119
120
121
# File 'lib/mock_redis/database.rb', line 119

def keys(format = '*')
  data.keys.grep(redis_pattern_to_ruby_regex(format))
end

#lastsaveObject



137
138
139
# File 'lib/mock_redis/database.rb', line 137

def lastsave
  @base.now.to_i
end

#persist(key) ⇒ Object



141
142
143
144
145
146
147
148
# File 'lib/mock_redis/database.rb', line 141

def persist(key)
  if exists(key) && has_expiration?(key)
    remove_expiration(key)
    true
  else
    false
  end
end

#pexpire(key, ms) ⇒ Object



83
84
85
86
# File 'lib/mock_redis/database.rb', line 83

def pexpire(key, ms)
  now_ms = (@base.now.to_r * 1000).to_i
  pexpireat(key, now_ms + ms.to_i)
end

#pexpireat(key, timestamp_ms) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/mock_redis/database.rb', line 96

def pexpireat(key, timestamp_ms)
  unless looks_like_integer?(timestamp_ms.to_s)
    raise Redis::CommandError, 'ERR value is not an integer or out of range'
  end

  if exists(key)
    timestamp = Rational(timestamp_ms.to_i, 1000)
    set_expiration(key, @base.time_at(timestamp))
    true
  else
    false
  end
end

#pingObject



150
151
152
# File 'lib/mock_redis/database.rb', line 150

def ping
  'PONG'
end

#pttl(key) ⇒ Object



204
205
206
207
208
209
210
211
212
# File 'lib/mock_redis/database.rb', line 204

def pttl(key)
  if !exists(key)
    -2
  elsif has_expiration?(key)
    (expiration(key).to_r * 1000).to_i - (@base.now.to_r * 1000).to_i
  else
    -1
  end
end

#quitObject



154
155
156
# File 'lib/mock_redis/database.rb', line 154

def quit
  'OK'
end

#randomkeyObject



158
159
160
# File 'lib/mock_redis/database.rb', line 158

def randomkey
  data.keys[rand(data.length)]
end

#rename(key, newkey) ⇒ Object



162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/mock_redis/database.rb', line 162

def rename(key, newkey)
  if !data.include?(key)
    raise Redis::CommandError, 'ERR no such key'
  elsif key == newkey
    raise Redis::CommandError, 'ERR source and destination objects are the same'
  end
  data[newkey] = data.delete(key)
  if has_expiration?(key)
    set_expiration(newkey, expiration(key))
    remove_expiration(key)
  end
  'OK'
end

#renamenx(key, newkey) ⇒ Object



176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/mock_redis/database.rb', line 176

def renamenx(key, newkey)
  if !data.include?(key)
    raise Redis::CommandError, 'ERR no such key'
  elsif key == newkey
    raise Redis::CommandError, 'ERR source and destination objects are the same'
  end
  if exists(newkey)
    false
  else
    rename(key, newkey)
    true
  end
end

#saveObject



190
191
192
# File 'lib/mock_redis/database.rb', line 190

def save
  'OK'
end

#scan(cursor, opts = {}) ⇒ Object



123
124
125
# File 'lib/mock_redis/database.rb', line 123

def scan(cursor, opts = {})
  common_scan(data.keys, cursor, opts)
end

#scan_each(opts = {}, &block) ⇒ Object



127
128
129
130
131
132
133
134
135
# File 'lib/mock_redis/database.rb', line 127

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



232
233
# File 'lib/mock_redis/database.rb', line 232

def script(subcommand, *args)
end

#ttl(key) ⇒ Object



194
195
196
197
198
199
200
201
202
# File 'lib/mock_redis/database.rb', line 194

def ttl(key)
  if !exists(key)
    -2
  elsif has_expiration?(key)
    expiration(key).to_i - @base.now.to_i
  else
    -1
  end
end

#type(key) ⇒ Object



214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
# File 'lib/mock_redis/database.rb', line 214

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'
  else
    raise ArgumentError, "Not sure how #{data[key].inspect} got in here"
  end
end