ar-octopus 0.0.20 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +1 -1
- data/ar-octopus.gemspec +2 -2
- data/lib/octopus/migration.rb +22 -29
- data/lib/octopus/proxy.rb +29 -81
- metadata +4 -4
data/Rakefile
CHANGED
|
@@ -29,7 +29,7 @@ begin
|
|
|
29
29
|
gem.authors = ["Thiago Pradi", "Mike Perham", "Amit Agarwal"]
|
|
30
30
|
gem.add_development_dependency "rspec", ">= 1.2.9"
|
|
31
31
|
gem.add_dependency('activerecord', '>= 3.0.0beta')
|
|
32
|
-
gem.version = "0.0.
|
|
32
|
+
gem.version = "0.0.21"
|
|
33
33
|
end
|
|
34
34
|
Jeweler::GemcutterTasks.new
|
|
35
35
|
rescue LoadError
|
data/ar-octopus.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = %q{ar-octopus}
|
|
8
|
-
s.version = "0.0.
|
|
8
|
+
s.version = "0.0.21"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Thiago Pradi", "Mike Perham", "Amit Agarwal"]
|
|
12
|
-
s.date = %q{2010-07-
|
|
12
|
+
s.date = %q{2010-07-08}
|
|
13
13
|
s.description = %q{This gem allows you to use sharded databases with ActiveRecord. this also provides a interface for replication and for running migrations with multiples shards.}
|
|
14
14
|
s.email = %q{tchandy@gmail.com}
|
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/octopus/migration.rb
CHANGED
|
@@ -4,23 +4,16 @@ module Octopus::Migration
|
|
|
4
4
|
alias_method_chain :migrate, :octopus
|
|
5
5
|
end
|
|
6
6
|
end
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
def using(*args, &block)
|
|
9
9
|
Octopus.config()
|
|
10
10
|
|
|
11
11
|
args.each do |shard|
|
|
12
|
-
|
|
13
|
-
ActiveRecord::Base.using(shard).connection.initialize_schema_migrations_table
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
if args.size == 1
|
|
18
|
-
self.connection().block = true
|
|
19
|
-
self.connection().current_shard = args.first
|
|
20
|
-
else
|
|
21
|
-
self.connection().current_shard = args
|
|
12
|
+
self.connection().check_schema_migrations(shard)
|
|
22
13
|
end
|
|
23
14
|
|
|
15
|
+
self.connection().block = true
|
|
16
|
+
self.connection().current_shard = args
|
|
24
17
|
|
|
25
18
|
yield if block_given?
|
|
26
19
|
|
|
@@ -29,36 +22,36 @@ module Octopus::Migration
|
|
|
29
22
|
|
|
30
23
|
def using_group(*args)
|
|
31
24
|
Octopus.config()
|
|
32
|
-
|
|
25
|
+
|
|
33
26
|
args.each do |group_shard|
|
|
34
27
|
shards = self.connection().instance_variable_get(:@groups)[group_shard] || []
|
|
35
28
|
|
|
36
29
|
shards.each do |shard|
|
|
37
|
-
|
|
38
|
-
ActiveRecord::Base.using(shard).connection.initialize_schema_migrations_table
|
|
39
|
-
end
|
|
30
|
+
self.connection().check_schema_migrations(shard)
|
|
40
31
|
end
|
|
41
32
|
end
|
|
42
33
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
self.connection().current_group = args.first
|
|
46
|
-
else
|
|
47
|
-
self.connection().current_group = args
|
|
48
|
-
end
|
|
34
|
+
self.connection().block = true
|
|
35
|
+
self.connection().current_group = args
|
|
49
36
|
|
|
50
37
|
return self
|
|
51
38
|
end
|
|
52
|
-
|
|
39
|
+
|
|
53
40
|
def migrate_with_octopus(direction)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
41
|
+
conn = ActiveRecord::Base.connection
|
|
42
|
+
groups = conn.instance_variable_get(:@groups)
|
|
43
|
+
|
|
44
|
+
if conn.current_group.is_a?(Array)
|
|
45
|
+
conn.current_group.each { |group| conn.send_queries_to_multiple_shards(groups[group]) { migrate_without_octopus(direction) } }
|
|
46
|
+
elsif conn.current_group.is_a?(Symbol)
|
|
47
|
+
conn.send_queries_to_multiple_shards(groups[conn.current_group]) { migrate_without_octopus(direction) }
|
|
48
|
+
elsif conn.current_shard.is_a?(Array)
|
|
49
|
+
conn.send_queries_to_multiple_shards(conn.current_shard) { migrate_without_octopus(direction) }
|
|
50
|
+
else
|
|
51
|
+
migrate_without_octopus(direction)
|
|
52
|
+
end
|
|
60
53
|
|
|
61
|
-
|
|
54
|
+
conn.clean_proxy()
|
|
62
55
|
end
|
|
63
56
|
end
|
|
64
57
|
|
data/lib/octopus/proxy.rb
CHANGED
|
@@ -70,24 +70,36 @@ class Octopus::Proxy
|
|
|
70
70
|
def shard_name
|
|
71
71
|
current_shard.is_a?(Array) ? current_shard.first : current_shard
|
|
72
72
|
end
|
|
73
|
+
|
|
74
|
+
def run_queries_on_shard(shard, &block)
|
|
75
|
+
older_shard = self.current_shard
|
|
76
|
+
self.block = true
|
|
77
|
+
self.current_shard = shard
|
|
73
78
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
79
|
+
begin
|
|
80
|
+
yield
|
|
81
|
+
ensure
|
|
82
|
+
self.block = false
|
|
83
|
+
self.current_shard = older_shard
|
|
77
84
|
end
|
|
78
85
|
end
|
|
79
|
-
|
|
80
|
-
def
|
|
81
|
-
|
|
82
|
-
self.
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
|
|
87
|
+
def send_queries_to_multiple_shards(shards, &block)
|
|
88
|
+
shards.each do |shard|
|
|
89
|
+
self.run_queries_on_shard(shard, &block)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def clean_proxy()
|
|
94
|
+
@using_enabled = nil
|
|
95
|
+
@current_shard = :master
|
|
96
|
+
@current_group = nil
|
|
97
|
+
@block = false
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def check_schema_migrations(shard)
|
|
101
|
+
if !ActiveRecord::Base.using(shard).connection.table_exists?(ActiveRecord::Migrator.schema_migrations_table_name())
|
|
102
|
+
ActiveRecord::Base.using(shard).connection.initialize_schema_migrations_table
|
|
91
103
|
end
|
|
92
104
|
end
|
|
93
105
|
|
|
@@ -95,35 +107,15 @@ class Octopus::Proxy
|
|
|
95
107
|
if should_clean_connection?(method)
|
|
96
108
|
conn = select_connection()
|
|
97
109
|
self.last_current_shard = self.current_shard
|
|
98
|
-
|
|
99
|
-
@using_enabled = nil
|
|
110
|
+
clean_proxy()
|
|
100
111
|
conn.send(method, *args, &block)
|
|
101
112
|
elsif should_send_queries_to_replicated_databases?(method)
|
|
102
113
|
send_queries_to_selected_slave(method, *args, &block)
|
|
103
|
-
elsif should_send_queries_to_multiple_groups?
|
|
104
|
-
send_queries_to_multiple_groups(method, *args, &block)
|
|
105
|
-
elsif should_send_queries_to_multiple_shards?
|
|
106
|
-
send_queries_to_shards(current_shard, method, *args, &block)
|
|
107
|
-
elsif should_send_queries_to_a_group_of_shards?
|
|
108
|
-
send_queries_to_shards(@groups[current_group], method, *args, &block)
|
|
109
114
|
else
|
|
110
115
|
select_connection().send(method, *args, &block)
|
|
111
116
|
end
|
|
112
117
|
end
|
|
113
118
|
|
|
114
|
-
def run_queries_on_shard(shard, &block)
|
|
115
|
-
older_shard = self.current_shard
|
|
116
|
-
self.block = true
|
|
117
|
-
self.current_shard = shard
|
|
118
|
-
|
|
119
|
-
begin
|
|
120
|
-
yield
|
|
121
|
-
ensure
|
|
122
|
-
self.block = false
|
|
123
|
-
self.current_shard = older_shard
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
|
|
127
119
|
protected
|
|
128
120
|
def connection_pool_for(adapter, config)
|
|
129
121
|
ActiveRecord::ConnectionAdapters::ConnectionPool.new(ActiveRecord::Base::ConnectionSpecification.new(adapter, config))
|
|
@@ -143,19 +135,7 @@ class Octopus::Proxy
|
|
|
143
135
|
end
|
|
144
136
|
|
|
145
137
|
def should_clean_connection?(method)
|
|
146
|
-
method.to_s =~ /insert|select|execute/ && !
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
def should_send_queries_to_multiple_shards?
|
|
150
|
-
current_shard.is_a?(Array)
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
def should_send_queries_to_multiple_groups?
|
|
154
|
-
current_group.is_a?(Array)
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
def should_send_queries_to_a_group_of_shards?
|
|
158
|
-
!current_group.nil?
|
|
138
|
+
method.to_s =~ /insert|select|execute/ && !self.current_group && !@replicated && !self.block
|
|
159
139
|
end
|
|
160
140
|
|
|
161
141
|
def should_send_queries_to_replicated_databases?(method)
|
|
@@ -166,26 +146,6 @@ class Octopus::Proxy
|
|
|
166
146
|
!config[Octopus.env()].nil?
|
|
167
147
|
end
|
|
168
148
|
|
|
169
|
-
def send_queries_to_multiple_groups(method, *args, &block)
|
|
170
|
-
method_return = nil
|
|
171
|
-
|
|
172
|
-
current_group.each do |group_symbol|
|
|
173
|
-
method_return = self.send_queries_to_shards(@groups[group_symbol], method, *args, &block)
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
return method_return
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
def send_queries_to_shards(shard_array, method, *args, &block)
|
|
180
|
-
method_return = nil
|
|
181
|
-
|
|
182
|
-
shard_array.each do |shard_symbol|
|
|
183
|
-
method_return = @shards[shard_symbol].connection().send(method, *args, &block)
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
return method_return
|
|
187
|
-
end
|
|
188
|
-
|
|
189
149
|
def send_queries_to_selected_slave(method, *args, &block)
|
|
190
150
|
old_shard = self.current_shard
|
|
191
151
|
|
|
@@ -203,16 +163,4 @@ class Octopus::Proxy
|
|
|
203
163
|
@using_enabled = nil
|
|
204
164
|
return sql
|
|
205
165
|
end
|
|
206
|
-
|
|
207
|
-
def send_transaction_to_multiple_shards(shard_array, options, &block)
|
|
208
|
-
shard_array.each do |shard_symbol|
|
|
209
|
-
@shards[shard_symbol].connection().transaction(options, &block)
|
|
210
|
-
end
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
def send_transaction_to_multiple_groups(options, &block)
|
|
214
|
-
current_group.each do |group_symbol|
|
|
215
|
-
self.send_transaction_to_multiple_shards(@groups[group_symbol], options, &block)
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
166
|
end
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ar-octopus
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 53
|
|
5
5
|
prerelease: false
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
8
|
- 0
|
|
9
|
-
-
|
|
10
|
-
version: 0.0.
|
|
9
|
+
- 21
|
|
10
|
+
version: 0.0.21
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Thiago Pradi
|
|
@@ -17,7 +17,7 @@ autorequire:
|
|
|
17
17
|
bindir: bin
|
|
18
18
|
cert_chain: []
|
|
19
19
|
|
|
20
|
-
date: 2010-07-
|
|
20
|
+
date: 2010-07-08 00:00:00 -03:00
|
|
21
21
|
default_executable:
|
|
22
22
|
dependencies:
|
|
23
23
|
- !ruby/object:Gem::Dependency
|