genghis 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +3 -8
- data/lib/genghis.rb +15 -45
- metadata +3 -3
data/README.rdoc
CHANGED
@@ -32,22 +32,17 @@ If you are using replica pairs, the configuration varies somewhat.
|
|
32
32
|
|
33
33
|
development:
|
34
34
|
servers:
|
35
|
-
|
36
|
-
|
35
|
+
-_host:27017
|
36
|
+
- right_host:27017
|
37
37
|
databases:
|
38
38
|
paperclip : 'paperclip_files'
|
39
39
|
...
|
40
|
-
authorization:
|
41
|
-
paperclip:
|
42
|
-
username: pc
|
43
|
-
password: secretpassword
|
44
|
-
...
|
45
40
|
connection_options:
|
46
41
|
max_retries: 7
|
47
42
|
pool_size: 5
|
48
43
|
...
|
49
44
|
|
50
|
-
The
|
45
|
+
The servers are specified in an array, and most importantly for resilience the max_retries
|
51
46
|
entry is specified in connection options. This specifies how many times Genghis will try to establish
|
52
47
|
a connection to one of the servers if it detects a connection error.
|
53
48
|
|
data/lib/genghis.rb
CHANGED
@@ -10,12 +10,9 @@ class Genghis
|
|
10
10
|
|
11
11
|
def self.environment=(environment = :development)
|
12
12
|
yaml = YAML.load_file(config_file)
|
13
|
-
puts "YAML: #{yaml.inspect}"
|
14
13
|
@@config = yaml[environment.to_s]
|
15
14
|
@@config.each do |k, v|
|
16
|
-
|
17
15
|
self.class.instance_eval do
|
18
|
-
v = HashWithConsistentAccess.new(v) if v.is_a?(::Hash)
|
19
16
|
define_method(k.to_sym){v}
|
20
17
|
end
|
21
18
|
end
|
@@ -26,7 +23,7 @@ class Genghis
|
|
26
23
|
end
|
27
24
|
|
28
25
|
def self.database(db_alias)
|
29
|
-
connection.db(self.databases[db_alias])
|
26
|
+
connection.db(self.databases[db_alias.to_s])
|
30
27
|
end
|
31
28
|
|
32
29
|
def self.reconnect
|
@@ -65,9 +62,10 @@ class Genghis
|
|
65
62
|
|
66
63
|
def self.safe_create_connection
|
67
64
|
opts = connection_options
|
68
|
-
if self.servers.is_a?
|
69
|
-
servers = self.servers
|
70
|
-
|
65
|
+
if self.servers.is_a? Array
|
66
|
+
servers = self.servers.collect{|x| parse_host(x)}
|
67
|
+
puts "Multi called with #{servers.inspect} #{opts.inspect}"
|
68
|
+
|
71
69
|
connection = Connection.multi(servers, opts)
|
72
70
|
else
|
73
71
|
host, port = parse_host(self.servers)
|
@@ -79,11 +77,11 @@ class Genghis
|
|
79
77
|
def self.parse_host(host)
|
80
78
|
a = host.split(':')
|
81
79
|
a << 27017 if a.size == 1
|
82
|
-
a
|
80
|
+
[a.first, a.last.to_i]
|
83
81
|
end
|
84
82
|
|
85
83
|
def self.symbolize_keys(hash)
|
86
|
-
hash.inject({})
|
84
|
+
hash.inject({}){|memo, (k, v)| memo[k.to_sym] = v; memo}
|
87
85
|
end
|
88
86
|
|
89
87
|
|
@@ -107,9 +105,9 @@ class Genghis
|
|
107
105
|
@@protected_classes.include? clazz
|
108
106
|
end
|
109
107
|
|
110
|
-
def method_missing(method, *
|
108
|
+
def method_missing(method, *args, &block)
|
111
109
|
protect_from_exception do
|
112
|
-
Guardian.make_safe(@protected_class.__send__(method, *
|
110
|
+
Guardian.make_safe(@protected_class.__send__(method, *args, &block))
|
113
111
|
end
|
114
112
|
end
|
115
113
|
|
@@ -121,7 +119,7 @@ class Genghis
|
|
121
119
|
true
|
122
120
|
end
|
123
121
|
|
124
|
-
def protect_from_exception(&
|
122
|
+
def protect_from_exception(&block)
|
125
123
|
success = false
|
126
124
|
max_retries = Genghis.max_retries
|
127
125
|
retries = 0
|
@@ -150,41 +148,14 @@ class Genghis
|
|
150
148
|
end
|
151
149
|
end
|
152
150
|
|
153
|
-
class HashWithConsistentAccess
|
154
|
-
|
155
|
-
def initialize(proxied={})
|
156
|
-
@proxied = proxied.inject({}) do |memo, (k, v)|
|
157
|
-
memo[k.to_s] = v
|
158
|
-
memo
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
|
163
|
-
def []=(key, value)
|
164
|
-
@proxied[key.to_s] = value
|
165
|
-
end
|
166
|
-
|
167
|
-
def [](key)
|
168
|
-
@proxied[key.to_s]
|
169
|
-
end
|
170
|
-
|
171
|
-
def key?(key)
|
172
|
-
@proxied.key?(key.to_s)
|
173
|
-
end
|
174
|
-
|
175
|
-
def inspect
|
176
|
-
@proxied.inspect
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
151
|
|
181
152
|
class Guardian
|
182
153
|
alias_method :old_class, :class
|
183
|
-
instance_methods.each { |m| undef_method m unless m =~ /^__|^old/
|
154
|
+
instance_methods.each { |m| undef_method m unless m =~ /^__|^old/}
|
184
155
|
|
185
156
|
include ProxyMethods
|
186
157
|
|
187
|
-
def initialize(*
|
158
|
+
def initialize(*args)
|
188
159
|
|
189
160
|
opts = args.extract_options!
|
190
161
|
if opts.empty?
|
@@ -225,10 +196,10 @@ class Genghis
|
|
225
196
|
end
|
226
197
|
|
227
198
|
|
228
|
-
def method_missing(method, *
|
199
|
+
def method_missing(method, *args, &block)
|
229
200
|
return true if method == :safe?
|
230
201
|
self.old_class.protect_from_exception do
|
231
|
-
Guardian.make_safe(@protected.__send__(method, *
|
202
|
+
Guardian.make_safe(@protected.__send__(method, *args, &block))
|
232
203
|
end
|
233
204
|
end
|
234
205
|
|
@@ -242,5 +213,4 @@ class Genghis
|
|
242
213
|
end
|
243
214
|
end
|
244
215
|
|
245
|
-
|
246
|
-
end
|
216
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: genghis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 4
|
10
|
+
version: 1.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Steve Cohen
|