Module: Seabright::ObjectBase

Included in:
RedisObject
Defined in:
lib/redis_object/base.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(sym, *args, &block) ⇒ Object (private)



174
175
176
177
178
179
180
181
182
183
# File 'lib/redis_object/base.rb', line 174

def method_missing(sym, *args, &block)
	super if sym == :class
	if sym.to_s =~ SetPattern
		return super if args.size > 1
		set(sym.to_s.gsub(SetPattern,'').to_sym,*args)
	else
		return super if !args.empty?
		get(sym)
	end
end

Class Method Details

.included(base) ⇒ Object



433
434
435
# File 'lib/redis_object/base.rb', line 433

def self.included(base)
	base.extend(ClassMethods)
end

Instance Method Details

#[](k) ⇒ Object



84
85
86
# File 'lib/redis_object/base.rb', line 84

def [](k)
	get(k)
end

#[]=(k, v) ⇒ Object



158
159
160
# File 'lib/redis_object/base.rb', line 158

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

#define_setter_getter(key) ⇒ Object



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

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_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
76
77
78
79
80
81
82
# File 'lib/redis_object/base.rb', line 73

def get(k)
	cached_hash_values[k.to_s] ||= Proc.new {|key|
		if is_ref_key?(k) && (v = get_reference(store.hget(hkey, key.to_s)))
			define_setter_getter(key)
		elsif v = store.hget(hkey, key.to_s)
			define_setter_getter(key)
		end
		v
	}.call(k)
end

#get_reference(hkey) ⇒ Object



143
144
145
146
147
148
# File 'lib/redis_object/base.rb', line 143

def get_reference(hkey)
	if o = RedisObject.find_by_key(hkey)
		return o
	end
	nil
end

#id ⇒ Object



32
33
34
# File 'lib/redis_object/base.rb', line 32

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)))# && ident.gsub!(/.*:/,'') && ident.length > 0
		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)


136
137
138
139
140
141
# File 'lib/redis_object/base.rb', line 136

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)


88
89
90
# File 'lib/redis_object/base.rb', line 88

def is_set?(k)
	store.hexists(hkey, k.to_s)
end

#load(o_id) ⇒ Object



36
37
38
39
# File 'lib/redis_object/base.rb', line 36

def load(o_id)
	@id = o_id
	true
end

#mset(dat) ⇒ Object



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

def mset(dat)
	store.hmset(hkey, *(dat.inject([]){|acc,(k,v)| acc + [k,v] }))
	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,id.gsub(/.*:/,''))
	set(:key, key)
	store.sadd(self.class.plname, key)
	store.del(reserve_key)
end

#set(k, v) ⇒ Object



115
116
117
118
119
120
121
# File 'lib/redis_object/base.rb', line 115

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



123
124
125
126
127
128
129
130
# File 'lib/redis_object/base.rb', line 123

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



150
151
152
153
154
155
156
# File 'lib/redis_object/base.rb', line 150

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

#to_json ⇒ Object



28
29
30
# File 'lib/redis_object/base.rb', line 28

def to_json
	Yajl::Encoder.encode(actual)
end

#track_ref_key(k) ⇒ Object



132
133
134
# File 'lib/redis_object/base.rb', line 132

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

#undefine_setter_getter(key) ⇒ Object



110
111
112
113
# File 'lib/redis_object/base.rb', line 110

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

#unset(*k) ⇒ Object



162
163
164
165
166
167
168
# File 'lib/redis_object/base.rb', line 162

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