ar-octopus 0.0.12 → 0.0.13
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.rb +1 -1
- data/lib/octopus/model.rb +6 -5
- data/lib/octopus/proxy.rb +2 -2
- data/lib/octopus/scope_proxy.rb +12 -0
- data/spec/config/shards.yml +1 -1
- data/spec/octopus/model_spec.rb +34 -0
- data/spec/octopus/octopus_spec.rb +6 -0
- data/spec/octopus_helper.rb +1 -1
- 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.13"
|
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.13"
|
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-
|
12
|
+
s.date = %q{2010-07-01}
|
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.rb
CHANGED
data/lib/octopus/model.rb
CHANGED
@@ -2,15 +2,16 @@ module Octopus::Model
|
|
2
2
|
def self.extended(base)
|
3
3
|
base.send(:include, InstanceMethods)
|
4
4
|
base.extend(ClassMethods)
|
5
|
-
base.hijack_connection()
|
5
|
+
base.hijack_connection() unless defined?(::Rails) && (Rails.env == 'test' || Rails.env == 'development')
|
6
6
|
end
|
7
7
|
|
8
8
|
module SharedMethods
|
9
9
|
def clean_table_name
|
10
10
|
self.reset_table_name() if self != ActiveRecord::Base && self.respond_to?(:reset_table_name)
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def using(shard, &block)
|
14
|
+
return if defined?(::Rails) && (Rails.env == 'test' || Rails.env == 'development')
|
14
15
|
hijack_connection()
|
15
16
|
clean_table_name()
|
16
17
|
|
@@ -23,7 +24,7 @@ module Octopus::Model
|
|
23
24
|
return Octopus::ScopeProxy.new(shard, self)
|
24
25
|
end
|
25
26
|
end
|
26
|
-
|
27
|
+
|
27
28
|
def hijack_initializer()
|
28
29
|
attr_accessor :current_shard
|
29
30
|
after_initialize :set_current_shard
|
@@ -54,7 +55,7 @@ module Octopus::Model
|
|
54
55
|
|
55
56
|
module InstanceMethods
|
56
57
|
include SharedMethods
|
57
|
-
|
58
|
+
|
58
59
|
def set_connection(*args)
|
59
60
|
if(args.size == 1)
|
60
61
|
arg = args.first
|
@@ -63,7 +64,7 @@ module Octopus::Model
|
|
63
64
|
|
64
65
|
self.connection.current_shard = self.current_shard if have_a_valid_shard?
|
65
66
|
end
|
66
|
-
|
67
|
+
|
67
68
|
def have_a_valid_shard?
|
68
69
|
self.respond_to?(:current_shard) && self.current_shard != nil
|
69
70
|
end
|
data/lib/octopus/proxy.rb
CHANGED
@@ -13,7 +13,7 @@ class Octopus::Proxy
|
|
13
13
|
@current_shard = :master
|
14
14
|
shards_config = config[Octopus.env()]["shards"] if have_a_valid_configuration?(config)
|
15
15
|
shards_config ||= []
|
16
|
-
|
16
|
+
|
17
17
|
shards_config.each do |key, value|
|
18
18
|
if value.has_key?("adapter")
|
19
19
|
initialize_adapter(value['adapter'])
|
@@ -69,7 +69,7 @@ class Octopus::Proxy
|
|
69
69
|
def shard_name
|
70
70
|
current_shard.is_a?(Array) ? current_shard.first : current_shard
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
def have_a_valid_configuration?(config)
|
74
74
|
!config[Octopus.env()].nil?
|
75
75
|
end
|
data/lib/octopus/scope_proxy.rb
CHANGED
@@ -15,6 +15,18 @@ class Octopus::ScopeProxy
|
|
15
15
|
return self
|
16
16
|
end
|
17
17
|
|
18
|
+
# Transaction Method send all queries to a specified shard.
|
19
|
+
def transaction(options = {}, &block)
|
20
|
+
@klass.connection().current_shard = @shard
|
21
|
+
@klass.connection().block = true
|
22
|
+
|
23
|
+
begin
|
24
|
+
@klass.connection().transaction(options, &block)
|
25
|
+
ensure
|
26
|
+
@klass.connection().block = false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
18
30
|
def connection
|
19
31
|
@klass.connection().current_shard = @shard
|
20
32
|
@klass.connection()
|
data/spec/config/shards.yml
CHANGED
data/spec/octopus/model_spec.rb
CHANGED
@@ -11,6 +11,25 @@ describe Octopus::Model do
|
|
11
11
|
User.using(:canada).count.should == 1
|
12
12
|
User.count.should == 0
|
13
13
|
end
|
14
|
+
|
15
|
+
it "should allow selecting the shard using #new" do
|
16
|
+
u = User.using(:canada).new
|
17
|
+
u.name = "Thiago"
|
18
|
+
u.save
|
19
|
+
|
20
|
+
User.using(:canada).count.should == 1
|
21
|
+
User.using(:brazil).count.should == 0
|
22
|
+
|
23
|
+
u1 = User.new
|
24
|
+
u1.name = "Joaquim"
|
25
|
+
u2 = User.using(:canada).new
|
26
|
+
u2.name = "Manuel"
|
27
|
+
u1.save()
|
28
|
+
u2.save()
|
29
|
+
|
30
|
+
User.using(:canada).all.should == [u, u2]
|
31
|
+
User.all.should == [u1]
|
32
|
+
end
|
14
33
|
|
15
34
|
it "should select the correct shard" do
|
16
35
|
#TODO - Investigate this - why we need to set to master!?
|
@@ -184,6 +203,21 @@ describe Octopus::Model do
|
|
184
203
|
@user2.update_attributes(:name => "Joaquim")
|
185
204
|
User.using(:brazil).where(:name => "Joaquim").first.should_not be_nil
|
186
205
|
end
|
206
|
+
|
207
|
+
it "transaction" do
|
208
|
+
u = User.create!(:name => "Thiago")
|
209
|
+
|
210
|
+
User.using(:brazil).count.should == 0
|
211
|
+
User.using(:master).count.should == 1
|
212
|
+
|
213
|
+
User.using(:brazil).transaction do
|
214
|
+
User.where(:name => "Thiago").first.should be_nil
|
215
|
+
User.create!(:name => "Brazil")
|
216
|
+
end
|
217
|
+
|
218
|
+
User.using(:brazil).count.should == 1
|
219
|
+
User.using(:master).count.should == 1
|
220
|
+
end
|
187
221
|
|
188
222
|
describe "deleting a record" do
|
189
223
|
before(:each) do
|
@@ -12,4 +12,10 @@ describe Octopus do
|
|
12
12
|
Octopus.directory().should == File.expand_path(File.dirname(__FILE__) + "/../")
|
13
13
|
end
|
14
14
|
end
|
15
|
+
|
16
|
+
describe "#env method" do
|
17
|
+
it "should return 'production' when is outside of a rails application" do
|
18
|
+
Octopus.env().should == 'octopus'
|
19
|
+
end
|
20
|
+
end
|
15
21
|
end
|
data/spec/octopus_helper.rb
CHANGED
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: 5
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 13
|
10
|
+
version: 0.0.13
|
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-
|
20
|
+
date: 2010-07-01 00:00:00 -03:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|