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 (private)



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)
	# store.smembers(ref_key).each do |k|
	# 	if self.class.find_by_key(k)
	# 		
	# 	end
	# end
	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_idObject



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

#idObject



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

Returns:

  • (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

Returns:

  • (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

#rawObject 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

#saveObject



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