Module: Seabright::ObjectBase
- Included in:
- RedisObject
- Defined in:
- lib/redis_object/base.rb
Defined Under Namespace
Modules: ClassMethods
Instance Method Summary
collapse
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(sym, *args, &block) ⇒ Object
192
193
194
195
196
197
198
199
200
201
|
# File 'lib/redis_object/base.rb', line 192
def method_missing(sym, *args, &block)
super if sym == :class
if sym.to_s =~ SetPattern
return super if args.size > 1
send(:set,sym.to_s.gsub(SetPattern,'').to_sym,*args)
else
return super if !args.empty?
send(:get,sym)
end
end
|
Instance Method Details
#[](k) ⇒ Object
92
93
94
|
# File 'lib/redis_object/base.rb', line 92
def [](k)
get(k)
end
|
#[]=(k, v) ⇒ Object
176
177
178
|
# File 'lib/redis_object/base.rb', line 176
def []=(k,v)
set(k,v)
end
|
#_get(k) ⇒ Object
83
84
85
86
87
88
89
90
|
# File 'lib/redis_object/base.rb', line 83
def _get(k)
if is_ref_key?(k) && (v = get_reference(store.hget(hkey, k.to_s)))
define_setter_getter(k)
elsif v = store.hget(hkey, k.to_s)
define_setter_getter(k)
end
v
end
|
#clean_id(i) ⇒ Object
37
38
39
|
# File 'lib/redis_object/base.rb', line 37
def clean_id(i)
self.class.clean_id(i)
end
|
#define_setter_getter(key) ⇒ Object
112
113
114
115
116
117
118
119
|
# File 'lib/redis_object/base.rb', line 112
def define_setter_getter(key)
define_access(key) do
get(key)
end
define_access("#{key.to_s}=") do |val|
set(key,val)
end
end
|
#delete! ⇒ Object
49
50
51
52
53
54
55
56
57
58
59
60
61
|
# File 'lib/redis_object/base.rb', line 49
def delete!
store.del key
store.del hkey
store.del reserve_key
store.srem(self.class.plname, key)
dereference_all!
nil
end
|
#dereference_all! ⇒ Object
63
64
65
|
# File 'lib/redis_object/base.rb', line 63
def dereference_all!
end
|
#filter_gotten_value(k, v) ⇒ Object
77
78
79
80
81
|
# File 'lib/redis_object/base.rb', line 77
def filter_gotten_value(k,v)
self.class.get_filters.inject(v) do |acc, filter|
filter.call(self, k, acc)
end
end
|
#generate_id ⇒ Object
20
21
22
|
# File 'lib/redis_object/base.rb', line 20
def generate_id
self.class.generate_id
end
|
#get(k) ⇒ Object
73
74
75
|
# File 'lib/redis_object/base.rb', line 73
def get(k)
filter_gotten_value(k, (cached_hash_values[k.to_s] || _get(k)))
end
|
#get_reference(hkey) ⇒ Object
158
159
160
161
162
163
|
# File 'lib/redis_object/base.rb', line 158
def get_reference(hkey)
if o = RedisObject.find_by_key(hkey)
return o
end
nil
end
|
#id ⇒ Object
28
29
30
|
# File 'lib/redis_object/base.rb', line 28
def id
@id || get(id_sym) || set(id_sym, generate_id)
end
|
#initialize(ident = {}) ⇒ Object
4
5
6
7
8
9
10
11
12
13
14
|
# File 'lib/redis_object/base.rb', line 4
def initialize(ident={})
if ident && (ident.class == String || (ident.class == Symbol && (ident = ident.to_s)))
load(ident.dup)
elsif ident && ident.class == Hash
ident[id_sym] ||= generate_id
if load(ident[id_sym])
mset(ident.dup)
end
end
self
end
|
#is_ref_key?(k) ⇒ Boolean
151
152
153
154
155
156
|
# File 'lib/redis_object/base.rb', line 151
def is_ref_key?(k)
if store.sismember(ref_field_key,k.to_s)
return true
end
false
end
|
#is_set?(k) ⇒ Boolean
96
97
98
|
# File 'lib/redis_object/base.rb', line 96
def is_set?(k)
store.hexists(hkey, k.to_s)
end
|
#load(o_id) ⇒ Object
32
33
34
35
|
# File 'lib/redis_object/base.rb', line 32
def load(o_id)
@id = clean_id(o_id)
true
end
|
#mset(dat) ⇒ Object
100
101
102
103
104
105
106
107
108
109
110
|
# File 'lib/redis_object/base.rb', line 100
def mset(dat)
dat = self.class.mset_filters.inject(dat) do |acc,filter|
filter.call(self, acc)
end
store.hmset(hkey, *(dat.inject([]){|acc,(k,v)| acc << [k,v] }.flatten))
cached_hash_values.merge!(dat)
dat.each do |k,v|
define_setter_getter(k)
end
dat
end
|
#new_id(complexity = 8) ⇒ Object
16
17
18
|
# File 'lib/redis_object/base.rb', line 16
def new_id(complexity = 8)
self.class.new_id(complexity)
end
|
#raw ⇒ Object
Also known as:
inspect, actual
67
68
69
|
# File 'lib/redis_object/base.rb', line 67
def raw
store.hgetall(hkey).inject({}) {|acc,(k,v)| acc[k.to_sym] = enforce_format(k,v); acc }
end
|
#reserve(k) ⇒ Object
24
25
26
|
# File 'lib/redis_object/base.rb', line 24
def reserve(k)
self.class.reserve(k)
end
|
#save ⇒ Object
41
42
43
44
45
46
47
|
# File 'lib/redis_object/base.rb', line 41
def save
set(:class, self.class.name)
set(id_sym,clean_id(id))
set(:key, key)
store.sadd(self.class.plname, key)
store.del(reserve_key)
end
|
#set(k, v) ⇒ Object
126
127
128
129
130
131
132
133
134
135
136
|
# File 'lib/redis_object/base.rb', line 126
def set(k,v)
(k,v) = self.class.set_filters.inject([k,v]) do |acc,filter|
filter.call(self,*acc) unless acc.nil? or acc[0].nil?
end
return nil if k.nil?
return set_ref(k,v) if v.is_a?(RedisObject)
store.hset(hkey, k.to_s, v.to_s)
cached_hash_values[k.to_s] = v
define_setter_getter(k)
v
end
|
#set_ref(k, v) ⇒ Object
138
139
140
141
142
143
144
145
|
# File 'lib/redis_object/base.rb', line 138
def set_ref(k,v)
return unless v.is_a?(RedisObject)
track_ref_key(k)
store.hset(hkey, k.to_s, v.hkey)
cached_hash_values[k.to_s] = v
define_setter_getter(k)
v
end
|
#setnx(k, v) ⇒ Object
165
166
167
168
169
170
171
172
173
174
|
# File 'lib/redis_object/base.rb', line 165
def setnx(k,v)
(k,v) = self.class.set_filters.inject([k,v]) do |acc,filter|
filter.call(self,*acc)
end
if success = store.hsetnx(hkey, k.to_s, v.to_s)
cached_hash_values[k.to_s] = v
define_setter_getter(k)
end
success
end
|
#track_ref_key(k) ⇒ Object
147
148
149
|
# File 'lib/redis_object/base.rb', line 147
def track_ref_key(k)
store.sadd(ref_field_key, k.to_s)
end
|
#undefine_setter_getter(key) ⇒ Object
121
122
123
124
|
# File 'lib/redis_object/base.rb', line 121
def undefine_setter_getter(key)
undefine_access(key)
undefine_access("#{key.to_s}=")
end
|
#unset(*k) ⇒ Object
180
181
182
183
184
185
186
|
# File 'lib/redis_object/base.rb', line 180
def unset(*k)
store.hdel(hkey, k.map(&:to_s))
k.each do |ky|
cached_hash_values.delete ky.to_s
undefine_setter_getter(ky)
end
end
|