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.



289
290
291
292
293
294
295
296
297
298
299
300
301
# File 'lib/mock_redis/database.rb', line 289

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

  expire_times.slice!(0, to_delete.length)
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



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

def lastsave
  @base.now.to_i
end

#persist(key) ⇒ Object



119
120
121
122
123
124
125
126
# File 'lib/mock_redis/database.rb', line 119

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



128
129
130
# File 'lib/mock_redis/database.rb', line 128

def ping
  'PONG'
end

#pttl(key) ⇒ Object



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

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



132
133
134
# File 'lib/mock_redis/database.rb', line 132

def quit
  'OK'
end

#randomkeyObject



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

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

#rename(key, newkey) ⇒ Object



140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/mock_redis/database.rb', line 140

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



154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/mock_redis/database.rb', line 154

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



168
169
170
# File 'lib/mock_redis/database.rb', line 168

def save
  'OK'
end

#ttl(key) ⇒ Object



172
173
174
175
176
177
178
179
180
# File 'lib/mock_redis/database.rb', line 172

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



192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'lib/mock_redis/database.rb', line 192

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