Class: RHACK::Storage

Inherits:
Object show all
Includes:
Redis::Objects
Defined in:
lib/rhack/storage.rb

Defined Under Namespace

Classes: TypeError

Instance Method Summary collapse

Constructor Details

#initialize(type, namespace) ⇒ Storage

Returns a new instance of Storage.



9
10
11
12
# File 'lib/rhack/storage.rb', line 9

def initialize(type, namespace)
  @namespace = namespace
  @type = type
end

Instance Method Details

#__store(key, data, opts = {}) ⇒ Object

TODO: @ opts should apply to redis.command, e.g. “use zadd instead of sadd”



27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/rhack/storage.rb', line 27

def __store(key, data, opts={})
  item_key = "#{@namespace}:#{key}"
  case @type
  when :hash
    redis.hmset item_key, *data.to_a
  when :set
    redis.sadd item_key, data.to_a
  when :zset
    redis.zadd item_key, data.to_a
  end
  data
end

#allObject



85
86
87
88
89
# File 'lib/rhack/storage.rb', line 85

def all
  redis.smembers(@namespace).map_hash {|key|
    [key, redis.fetch(key)]
  }
end

#del(key) ⇒ Object



91
92
93
94
95
# File 'lib/rhack/storage.rb', line 91

def del(key)
  if redis.srem(@namespace, key)
    redis.del "#{@namespace}:#{key}"
  end
end

#exists?(key) ⇒ Boolean Also known as: ex

Returns:

  • (Boolean)


80
81
82
# File 'lib/rhack/storage.rb', line 80

def exists?(key)
  redis.type("#{@namespace}:#{key}") != 'none'
end

#fetch(key) ⇒ Object Also known as: []



54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/rhack/storage.rb', line 54

def fetch(key)
  item_key = "#{@namespace}:#{key}"
  case @type
  when :hash
    redis.hgetall item_key
  when :set
    redis.smembers item_key
  when :zset
    # it will become better if I'll find use case for it
    redis.zrange item_key, 0, -1
  end
end

#fetchex(key, overwrite = nil) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
# File 'lib/rhack/storage.rb', line 68

def fetchex(key, overwrite=nil)
  exists = overwrite.nil? ? exists?(key) : !overwrite
  if exists
    fetch(key)
  else
    if res = yield
      store key, res
      res
    end
  end
end

#inspectObject Also known as: to_s



14
15
16
# File 'lib/rhack/storage.rb', line 14

def inspect
  "<#Storage #{@namespace}: #{@type}>"
end

#keysObject

set пригодится как для массового переноса или обновления всего неймспейса (реже), так и для &-проверки на стороне руби, какие ключи нужных данных вообще стоит дёргать (чаще)



21
22
23
# File 'lib/rhack/storage.rb', line 21

def keys
  Set redis.smembers(@namespace)
end

#store(key, data) ⇒ Object Also known as: []=



40
41
42
43
# File 'lib/rhack/storage.rb', line 40

def store(key, data)
  redis.sadd(@namespace, key)
  __store(key, data)
end

#storenx(key, data) ⇒ Object



46
47
48
49
50
51
52
# File 'lib/rhack/storage.rb', line 46

def storenx(key, data)
  if redis.sadd(@namespace, key)
    __store(key, data)
    true
  else false
  end
end

#wipe!Object



97
98
99
100
101
102
# File 'lib/rhack/storage.rb', line 97

def wipe!
  redis.smembers(@namespace).each {|key|
    redis.del "#{@namespace}:#{key}"
  }
  redis.del @namespace
end