Class: Aclatraz::Store::Riak

Inherits:
Object
  • Object
show all
Includes:
Helpers
Defined in:
lib/aclatraz/store/riak.rb

Overview

The most optimal way to store roles in riak database is pack everything in a single key name, eg:

:suspect_id/:role_name 
:suspect_id/:role_name/:ClassName 
:suspect_id/:role_name/:ObjectClass/object_id

Instance Method Summary collapse

Methods included from Helpers

#camelize, #member_id

Constructor Details

#initialize(bucket_name, *args) ⇒ Riak

:nodoc:



20
21
22
# File 'lib/aclatraz/store/riak.rb', line 20

def initialize(bucket_name, *args) # :nodoc:
  @backend = ::Riak::Client.new(*args).bucket(bucket_name)
end

Instance Method Details

#check(role, member, object = nil) ⇒ Object



43
44
45
46
47
# File 'lib/aclatraz/store/riak.rb', line 43

def check(role, member, object=nil)
  @backend.exists?(pack(role.to_s, member_id(member), object)) or begin
    object && !object.is_a?(Class) ? check(role, member, object.class) : false
  end
end

#clearObject



53
54
55
56
57
# File 'lib/aclatraz/store/riak.rb', line 53

def clear
  # not optimal... yea but there is no other way to clear all keys 
  # in the riak bucket -_-"
  @backend.keys.each {|key| @backend.delete(key) }
end

#delete(role, member, object = nil) ⇒ Object



49
50
51
# File 'lib/aclatraz/store/riak.rb', line 49

def delete(role, member, object=nil)
  @backend.delete(pack(role.to_s, member_id(member), object))
end

#roles(member = nil) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
# File 'lib/aclatraz/store/riak.rb', line 31

def roles(member=nil)
  roles = []
  # Also this can be a little bit slow...
  @backend.keys.each do |key|
    @backend.exists?(key) ? perm = unpack(key) : next
    if perm.size == 2 && (!member || (member && perm[0].to_s == member_id(member)))
      roles.push(perm[1])
    end
  end
  roles.compact.uniq
end

#set(role, member, object = nil) ⇒ Object



24
25
26
27
28
29
# File 'lib/aclatraz/store/riak.rb', line 24

def set(role, member, object=nil)
  obj = @backend.new(pack(role.to_s, member_id(member), object))
  obj.content_type = "text/plain"
  obj.data = "1"
  obj.store
end