Class: MockRedis::Database

Inherits:
Object
  • Object
show all
Includes:
HashMethods, InfoMethod, ListMethods, SetMethods, SortMethod, StringMethods, 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, #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, #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, #hset, #hsetnx, #hvals, #mapped_hmget, #mapped_hmset

Constructor Details

#initialize(base, *args) ⇒ Database

Returns a new instance of Database.



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

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

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



22
23
24
# File 'lib/mock_redis/database.rb', line 22

def data
  @data
end

#expire_timesObject (readonly)

Returns the value of attribute expire_times.



22
23
24
# File 'lib/mock_redis/database.rb', line 22

def expire_times
  @expire_times
end

Instance Method Details

#auth(_) ⇒ Object

Redis commands go below this line and above ‘private’



38
# File 'lib/mock_redis/database.rb', line 38

def auth(_) 'OK' end

#bgrewriteaofObject



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

def bgrewriteaof() "Background append only file rewriting started" end

#bgsaveObject



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

def bgsave() "Background saving started" end

#connected?Boolean

Returns:

  • (Boolean)


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

def connected?
  true
end

#dbsizeObject



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

def dbsize
  data.keys.length
end

#del(*keys) ⇒ Object



56
57
58
59
60
61
62
63
64
65
# File 'lib/mock_redis/database.rb', line 56

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



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

def disconnect
  nil
end

#echo(msg) ⇒ Object



67
68
69
# File 'lib/mock_redis/database.rb', line 67

def echo(msg)
  msg.to_s
end

#exists(key) ⇒ Object



102
103
104
# File 'lib/mock_redis/database.rb', line 102

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

#expire(key, seconds) ⇒ Object



71
72
73
# File 'lib/mock_redis/database.rb', line 71

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.



300
301
302
303
304
305
306
307
308
309
310
# File 'lib/mock_redis/database.rb', line 300

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



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

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



106
107
108
109
# File 'lib/mock_redis/database.rb', line 106

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

#initialize_copy(source) ⇒ Object



30
31
32
33
34
# File 'lib/mock_redis/database.rb', line 30

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

#keys(format = '*') ⇒ Object



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

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

#lastsaveObject



126
127
128
# File 'lib/mock_redis/database.rb', line 126

def lastsave
  @base.now.to_i
end

#persist(key) ⇒ Object



130
131
132
133
134
135
136
137
# File 'lib/mock_redis/database.rb', line 130

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

#pexpire(key, ms) ⇒ Object



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

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



88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/mock_redis/database.rb', line 88

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



139
140
141
# File 'lib/mock_redis/database.rb', line 139

def ping
  'PONG'
end

#pttl(key) ⇒ Object



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

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



143
144
145
# File 'lib/mock_redis/database.rb', line 143

def quit
  'OK'
end

#randomkeyObject



147
148
149
# File 'lib/mock_redis/database.rb', line 147

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

#rename(key, newkey) ⇒ Object



151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/mock_redis/database.rb', line 151

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



165
166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/mock_redis/database.rb', line 165

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



179
180
181
# File 'lib/mock_redis/database.rb', line 179

def save
  'OK'
end

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



115
116
117
118
119
120
121
122
123
124
# File 'lib/mock_redis/database.rb', line 115

def scan(cursor, opts = {})
  count = (opts[:count] || 10).to_i
  match = opts[:match] || '*'

  keys = data.keys
  limit = cursor + count
  next_cursor = limit >= keys.length ? '0' : limit.to_s

  [next_cursor, keys[cursor..limit].grep(redis_pattern_to_ruby_regex(match))]
end

#ttl(key) ⇒ Object



183
184
185
186
187
188
189
190
191
# File 'lib/mock_redis/database.rb', line 183

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



203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/mock_redis/database.rb', line 203

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