ar-octopus 0.0.25 → 0.0.26
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/README.mkdn +19 -1
- data/Rakefile +2 -3
- data/ar-octopus.gemspec +2 -3
- data/lib/octopus.rb +5 -1
- data/lib/octopus/association.rb +4 -0
- data/lib/octopus/association_collection.rb +1 -1
- data/lib/octopus/has_and_belongs_to_many_association.rb +1 -1
- data/lib/octopus/migration.rb +2 -6
- data/lib/octopus/model.rb +5 -10
- data/lib/octopus/rails2/persistence.rb +3 -9
- data/lib/octopus/scope_proxy.rb +1 -6
- data/spec/database_models.rb +1 -1
- data/spec/migrations/12_create_users_using_block.rb +4 -4
- data/spec/migrations/13_create_users_using_block_and_using.rb +1 -1
- data/spec/octopus/association_spec.rb +6 -0
- data/spec/octopus/controller_spec.rb +2 -7
- data/spec/octopus/model_spec.rb +3 -3
- metadata +4 -5
- data/lib/octopus/controller.rb +0 -7
data/README.mkdn
CHANGED
@@ -47,7 +47,7 @@ Octopus adds a method to each AR Class and object. the using method is used to s
|
|
47
47
|
|
48
48
|
Octopus also supports queries inside block. When you pass a block to the using method, all queries inside the block will be sent to the specified shard.
|
49
49
|
<pre>
|
50
|
-
|
50
|
+
Octopus.using(:slave_two) do
|
51
51
|
User.create(:name => "Mike")
|
52
52
|
end
|
53
53
|
</pre>
|
@@ -67,6 +67,8 @@ end
|
|
67
67
|
@user.save()
|
68
68
|
</pre>
|
69
69
|
|
70
|
+
### Migrations
|
71
|
+
|
70
72
|
In migrations, you also have access to the using method. The syntax is basically the same. This migration will run in brazil and canada shards.
|
71
73
|
<pre>
|
72
74
|
class CreateUsersOnBothShards < ActiveRecord::Migration
|
@@ -96,6 +98,22 @@ end
|
|
96
98
|
end
|
97
99
|
</pre>
|
98
100
|
|
101
|
+
|
102
|
+
### Rails Controllers
|
103
|
+
|
104
|
+
If you want to send a specified action, or all actions from a controller, to a specific shard, use this syntax:
|
105
|
+
<pre>
|
106
|
+
class ApplicationController < ActionController::Base
|
107
|
+
around_filter :select_shard
|
108
|
+
|
109
|
+
def select_shard
|
110
|
+
Octopus.using(:brazil) do
|
111
|
+
yield
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
</pre>
|
116
|
+
|
99
117
|
To see the complete list of features and syntax, please check out our <a href="http://wiki.github.com/tchandy/octopus/"> Wiki</a>
|
100
118
|
Wanna see sample rails applications using octopus features? please check it out: <a href="http://github.com/tchandy/octopus_sharding_example">Sharding Example</a> and <a href="http://github.com/tchandy/octopus_replication_example">Replication Example</a>
|
101
119
|
|
data/Rakefile
CHANGED
@@ -2,8 +2,7 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
|
2
2
|
require 'rubygems'
|
3
3
|
require 'rake'
|
4
4
|
require "yaml"
|
5
|
-
|
6
|
-
require 'active_support/json'
|
5
|
+
|
7
6
|
begin
|
8
7
|
require 'metric_fu'
|
9
8
|
MetricFu::Configuration.run do |config|
|
@@ -32,7 +31,7 @@ begin
|
|
32
31
|
gem.add_development_dependency "pg", ">= 0.9.0"
|
33
32
|
gem.add_development_dependency "sqlite3-ruby", ">= 1.3.1"
|
34
33
|
gem.add_dependency('activerecord', '>= 3.0.0beta')
|
35
|
-
gem.version = "0.0.
|
34
|
+
gem.version = "0.0.26"
|
36
35
|
end
|
37
36
|
Jeweler::GemcutterTasks.new
|
38
37
|
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.26"
|
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"]
|
12
|
-
s.date = %q{2010-07-
|
12
|
+
s.date = %q{2010-07-19}
|
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 = [
|
@@ -29,7 +29,6 @@ Gem::Specification.new do |s|
|
|
29
29
|
"lib/octopus.rb",
|
30
30
|
"lib/octopus/association.rb",
|
31
31
|
"lib/octopus/association_collection.rb",
|
32
|
-
"lib/octopus/controller.rb",
|
33
32
|
"lib/octopus/has_and_belongs_to_many_association.rb",
|
34
33
|
"lib/octopus/migration.rb",
|
35
34
|
"lib/octopus/model.rb",
|
data/lib/octopus.rb
CHANGED
@@ -47,6 +47,11 @@ module Octopus
|
|
47
47
|
def self.rails?
|
48
48
|
defined?(Rails)
|
49
49
|
end
|
50
|
+
|
51
|
+
def self.using(shard, &block)
|
52
|
+
ActiveRecord::Base.hijack_initializer()
|
53
|
+
ActiveRecord::Base.connection.run_queries_on_shard(shard, &block)
|
54
|
+
end
|
50
55
|
end
|
51
56
|
|
52
57
|
|
@@ -66,5 +71,4 @@ end
|
|
66
71
|
|
67
72
|
require "octopus/proxy"
|
68
73
|
require "octopus/scope_proxy"
|
69
|
-
require "octopus/controller"
|
70
74
|
|
data/lib/octopus/association.rb
CHANGED
@@ -5,6 +5,10 @@ module Octopus::Association
|
|
5
5
|
|
6
6
|
module InstanceMethods
|
7
7
|
def set_connection_on_association(record)
|
8
|
+
if !record.current_shard.nil? && !self.current_shard.nil? && record.current_shard != self.current_shard
|
9
|
+
raise "Association Error: Records are from different shards"
|
10
|
+
end
|
11
|
+
|
8
12
|
record.current_shard = self.connection.current_shard = self.current_shard if should_set_current_shard?
|
9
13
|
end
|
10
14
|
end
|
@@ -11,7 +11,7 @@ module Octopus::HasAndBelongsToManyAssociation
|
|
11
11
|
|
12
12
|
def insert_record_with_octopus(record, force = true, validate = true)
|
13
13
|
if should_wrap_the_connection?
|
14
|
-
|
14
|
+
Octopus.using(@owner.current_shard) { insert_record_without_octopus(record, force, validate) }
|
15
15
|
else
|
16
16
|
insert_record_without_octopus(record, force, validate)
|
17
17
|
end
|
data/lib/octopus/migration.rb
CHANGED
@@ -11,8 +11,8 @@ module Octopus::Migration
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
def using(*args
|
15
|
-
if self.connection().is_a?(Octopus::Proxy)
|
14
|
+
def using(*args)
|
15
|
+
if self.connection().is_a?(Octopus::Proxy)
|
16
16
|
args.each do |shard|
|
17
17
|
self.connection().check_schema_migrations(shard)
|
18
18
|
end
|
@@ -21,10 +21,6 @@ module Octopus::Migration
|
|
21
21
|
self.current_shard = args
|
22
22
|
self.connection().current_shard = args
|
23
23
|
end
|
24
|
-
|
25
|
-
if block_given?
|
26
|
-
self.connection.run_queries_on_shard(args, &block)
|
27
|
-
end
|
28
24
|
|
29
25
|
return self
|
30
26
|
end
|
data/lib/octopus/model.rb
CHANGED
@@ -14,20 +14,15 @@ module Octopus::Model
|
|
14
14
|
self.reset_table_name() if self != ActiveRecord::Base && self.respond_to?(:reset_table_name)
|
15
15
|
end
|
16
16
|
|
17
|
-
def using(shard
|
17
|
+
def using(shard)
|
18
18
|
return self if defined?(::Rails) && !Octopus.enviroments.include?(Rails.env.to_s)
|
19
19
|
|
20
|
-
hijack_connection()
|
21
20
|
clean_table_name()
|
21
|
+
hijack_initializer()
|
22
|
+
|
23
|
+
self.connection.using_enabled = true
|
22
24
|
|
23
|
-
|
24
|
-
self.connection.run_queries_on_shard(shard, &block)
|
25
|
-
else
|
26
|
-
hijack_initializer()
|
27
|
-
self.connection.using_enabled = true
|
28
|
-
|
29
|
-
return Octopus::ScopeProxy.new(shard, self)
|
30
|
-
end
|
25
|
+
return Octopus::ScopeProxy.new(shard, self)
|
31
26
|
end
|
32
27
|
|
33
28
|
def hijack_initializer()
|
@@ -11,9 +11,7 @@ module Octopus
|
|
11
11
|
|
12
12
|
def delete_with_octopus()
|
13
13
|
if should_set_current_shard?
|
14
|
-
|
15
|
-
delete_without_octopus()
|
16
|
-
end
|
14
|
+
Octopus.using(self.current_shard) { delete_without_octopus() }
|
17
15
|
else
|
18
16
|
delete_without_octopus()
|
19
17
|
end
|
@@ -21,9 +19,7 @@ module Octopus
|
|
21
19
|
|
22
20
|
def destroy_with_octopus()
|
23
21
|
if should_set_current_shard?
|
24
|
-
|
25
|
-
destroy_without_octopus()
|
26
|
-
end
|
22
|
+
Octopus.using(self.current_shard) { destroy_without_octopus() }
|
27
23
|
else
|
28
24
|
destroy_without_octopus()
|
29
25
|
end
|
@@ -31,9 +27,7 @@ module Octopus
|
|
31
27
|
|
32
28
|
def reload_with_octopus(options = nil)
|
33
29
|
if should_set_current_shard?
|
34
|
-
|
35
|
-
reload_without_octopus(options)
|
36
|
-
end
|
30
|
+
Octopus.using(self.current_shard) { reload_without_octopus(options) }
|
37
31
|
else
|
38
32
|
reload_without_octopus(options)
|
39
33
|
end
|
data/lib/octopus/scope_proxy.rb
CHANGED
data/spec/database_models.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
class CreateUsersUsingBlock < ActiveRecord::Migration
|
2
2
|
def self.up
|
3
|
-
using(:brazil) do
|
3
|
+
Octopus.using(:brazil) do
|
4
4
|
User.create!(:name => "UsingBlock1")
|
5
5
|
User.create!(:name => "UsingBlock2")
|
6
6
|
end
|
7
7
|
|
8
|
-
using(:canada) do
|
8
|
+
Octopus.using(:canada) do
|
9
9
|
User.create!(:name => "UsingCanada")
|
10
10
|
User.create!(:name => "UsingCanada2")
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.down
|
15
|
-
using(:brazil) do
|
15
|
+
Octopus.using(:brazil) do
|
16
16
|
User.delete_all()
|
17
17
|
end
|
18
18
|
|
19
|
-
using(:canada) do
|
19
|
+
Octopus.using(:canada) do
|
20
20
|
User.delete_all()
|
21
21
|
end
|
22
22
|
end
|
@@ -377,6 +377,12 @@ describe Octopus::Association do
|
|
377
377
|
it "should finds the client that the item belongs" do
|
378
378
|
@item_brazil.client.should == @brazil_client
|
379
379
|
end
|
380
|
+
|
381
|
+
it "should raise error if you try to add a record from a different shard" do
|
382
|
+
lambda do
|
383
|
+
@brazil_client.items << Item.using(:canada).create!(:name => "New User")
|
384
|
+
end.should raise_error("Association Error: Records are from different shards")
|
385
|
+
end
|
380
386
|
|
381
387
|
it "should update the attribute for the item" do
|
382
388
|
new_brazil_client = Client.using(:brazil).create!(:name => "new Client")
|
@@ -1,11 +1,6 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
|
-
describe
|
4
|
-
it "should have the using method to select the shard" do
|
5
|
-
a = ActionController::Base.new
|
6
|
-
a.respond_to?(:using).should be_true
|
7
|
-
end
|
8
|
-
|
3
|
+
describe "Rails Controllers" do
|
9
4
|
it "should use #using method to in all requests" do
|
10
5
|
class UsersControllers < ActionController::Base
|
11
6
|
around_filter :select_shard
|
@@ -15,7 +10,7 @@ describe Octopus::Controller do
|
|
15
10
|
end
|
16
11
|
|
17
12
|
def select_shard
|
18
|
-
using(:brazil) do
|
13
|
+
Octopus.using(:brazil) do
|
19
14
|
yield
|
20
15
|
end
|
21
16
|
end
|
data/spec/octopus/model_spec.rb
CHANGED
@@ -56,7 +56,7 @@ describe Octopus::Model do
|
|
56
56
|
it "should allow find inside blocks" do
|
57
57
|
@user = User.using(:brazil).create!(:name => "Thiago")
|
58
58
|
|
59
|
-
|
59
|
+
Octopus.using(:brazil) do
|
60
60
|
User.first.should == @user
|
61
61
|
end
|
62
62
|
|
@@ -112,7 +112,7 @@ describe Octopus::Model do
|
|
112
112
|
|
113
113
|
describe "passing a block" do
|
114
114
|
it "should allow queries be executed inside the block, ponting to a specific shard" do
|
115
|
-
|
115
|
+
Octopus.using(:canada) do
|
116
116
|
User.create(:name => "oi")
|
117
117
|
end
|
118
118
|
|
@@ -197,7 +197,7 @@ describe Octopus::Model do
|
|
197
197
|
end
|
198
198
|
|
199
199
|
it "using update_attributes inside a block" do
|
200
|
-
|
200
|
+
Octopus.using(:brazil) do
|
201
201
|
@user = User.create!(:name => "User1")
|
202
202
|
@user2 = User.find(@user.id)
|
203
203
|
@user2.update_attributes(:name => "Joaquim")
|
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: 43
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 26
|
10
|
+
version: 0.0.26
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Thiago Pradi
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-07-
|
19
|
+
date: 2010-07-19 00:00:00 -03:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -121,7 +121,6 @@ files:
|
|
121
121
|
- lib/octopus.rb
|
122
122
|
- lib/octopus/association.rb
|
123
123
|
- lib/octopus/association_collection.rb
|
124
|
-
- lib/octopus/controller.rb
|
125
124
|
- lib/octopus/has_and_belongs_to_many_association.rb
|
126
125
|
- lib/octopus/migration.rb
|
127
126
|
- lib/octopus/model.rb
|