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)



177
178
179
180
181
182
183
184
185
186
# File 'lib/redis_object/base.rb', line 177

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



86
87
88
# File 'lib/redis_object/base.rb', line 86

def [](k)
	get(k)
end

#[]=(k, v) ⇒ Object



161
162
163
# File 'lib/redis_object/base.rb', line 161

def []=(k,v)
	set(k,v)
end

#_get(k) ⇒ Object



77
78
79
80
81
82
83
84
# File 'lib/redis_object/base.rb', line 77

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



103
104
105
106
107
108
109
110
# File 'lib/redis_object/base.rb', line 103

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

#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)
	cached_hash_values[k.to_s] ||= _get(k)
end

#get_reference(hkey) ⇒ Object



146
147
148
149
150
151
# File 'lib/redis_object/base.rb', line 146

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)


139
140
141
142
143
144
# File 'lib/redis_object/base.rb', line 139

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)


90
91
92
# File 'lib/redis_object/base.rb', line 90

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



94
95
96
97
98
99
100
101
# File 'lib/redis_object/base.rb', line 94

def mset(dat)
	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



117
118
119
120
121
122
123
124
# File 'lib/redis_object/base.rb', line 117

def set(k,v)
	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



126
127
128
129
130
131
132
133
# File 'lib/redis_object/base.rb', line 126

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



153
154
155
156
157
158
159
# File 'lib/redis_object/base.rb', line 153

def setnx(k,v)
	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



135
136
137
# File 'lib/redis_object/base.rb', line 135

def track_ref_key(k)
	store.sadd(ref_field_key, k.to_s)
end

#undefine_setter_getter(key) ⇒ Object



112
113
114
115
# File 'lib/redis_object/base.rb', line 112

def undefine_setter_getter(key)
	undefine_access(key)
	undefine_access("#{key.to_s}=")
end

#unset(*k) ⇒ Object



165
166
167
168
169
170
171
# File 'lib/redis_object/base.rb', line 165

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