ar-octopus 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NDBkZGI5ZDAzMjU4MzkxZjVlYWZjMGI5ODQ0NDhiYjI1NTM5NjNkOQ==
5
+ data.tar.gz: !binary |-
6
+ MGE2MWM1YWZiNDQzNGQ3ZDE2ZTU4ZDljMzA1Nzk5N2Q2YzNjZTBlMA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MDM1OTdhNGQwYjZkMjhiMTVmMDRmZmM2NmMyNzAwN2E3NTNhN2ZmM2ZmODZh
10
+ OGQ3ODUyZjU3ZTNjNzM0NDYzYmNiMjBjOGMxNmI4OTdkYTZjYTZhYzE1Mzgz
11
+ MmY5NTA1NGFmMTljNmIwNGUxNGY3NTU2ZWEzZTkyZmViNTBiYWY=
12
+ data.tar.gz: !binary |-
13
+ YWRmMDc0MjU5YzY1Y2MxNWJiZjRhMzhiMDk3MzAyMzc0NjhmZDk2NTUyNDli
14
+ MmQxODE2ZmNhM2EwYWQyZWNlZTYwOWYwOWRlMTlkMjlhYzQ5YzBmOWVmNjI1
15
+ OGM5YzBjOTMwODg0YjEyYzY3YWU1NDY4OWRhOGIwYTY3MjhmYWY=
@@ -0,0 +1 @@
1
+ 1.9.3
@@ -4,11 +4,9 @@ env:
4
4
  before_script:
5
5
  - "bundle exec rake db:prepare"
6
6
  rvm:
7
- - 1.8.7
8
7
  - 1.9.3
9
8
 
10
9
  gemfile:
11
- - gemfiles/rails30.gemfile
12
10
  - gemfiles/rails31.gemfile
13
11
  - gemfiles/rails32.gemfile
14
12
 
data/Appraisals CHANGED
@@ -1,8 +1,3 @@
1
- appraise "rails30" do
2
- gem "activerecord", "~> 3.0.11"
3
- gem 'mysql2', '< 0.3'
4
- end
5
-
6
1
  appraise "rails31" do
7
2
  gem "activerecord", "~> 3.1.3"
8
3
  end
@@ -21,8 +21,8 @@ Gem::Specification.new do |s|
21
21
  "Octopus now stores schema version information in each shard and migrations will not " \
22
22
  "work properly unless this task is invoked."
23
23
 
24
- s.add_dependency 'activerecord', '>= 3.0.0', '< 4.0'
25
- s.add_dependency 'activesupport', '>= 3.0.0', '< 4.0'
24
+ s.add_dependency 'activerecord', '>= 3.1.0', '< 4.0'
25
+ s.add_dependency 'activesupport', '>= 3.1.0', '< 4.0'
26
26
  s.add_development_dependency 'rake', '>= 0.8.7'
27
27
  s.add_development_dependency 'rspec', '>= 2.0.0'
28
28
  s.add_development_dependency 'mysql2', '> 0.3'
@@ -30,4 +30,6 @@ Gem::Specification.new do |s|
30
30
  s.add_development_dependency 'sqlite3', '>= 1.3.4'
31
31
  s.add_development_dependency 'pry'
32
32
  s.add_development_dependency 'appraisal', '>= 0.3.8'
33
+
34
+ s.license = 'MIT'
33
35
  end
@@ -64,10 +64,6 @@ module Octopus
64
64
  @environments ||= config['environments'] || ['production']
65
65
  end
66
66
 
67
- def self.rails30?
68
- ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 0
69
- end
70
-
71
67
  def self.rails31?
72
68
  ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 1
73
69
  end
@@ -105,20 +101,12 @@ require "octopus/association"
105
101
  require "octopus/rails3/persistence"
106
102
  require "octopus/rails3/log_subscriber"
107
103
  require "octopus/rails3/abstract_adapter"
104
+ require "octopus/rails3/singular_association"
108
105
 
109
106
  if defined?(::Rails)
110
107
  require "octopus/railtie"
111
108
  end
112
109
 
113
- if Octopus.rails30?
114
- require "octopus/rails3.0/arel"
115
- require "octopus/rails3.0/association"
116
- end
117
-
118
- if Octopus.rails31? || Octopus.rails32?
119
- require "octopus/rails3.1/singular_association"
120
- end
121
-
122
110
  if Octopus.rails32?
123
111
  require "octopus/rails3.2/persistence"
124
112
  end
@@ -86,9 +86,7 @@ module Octopus::Model
86
86
  base.send(:alias_method, :equality_without_octopus, :==)
87
87
  base.send(:alias_method, :==, :equality_with_octopus)
88
88
  base.send(:alias_method, :eql?, :==)
89
- if !Octopus.rails30? and !Octopus.rails31?
90
- base.send(:alias_method_chain, :perform_validations, :octopus)
91
- end
89
+ base.send(:alias_method_chain, :perform_validations, :octopus)
92
90
  end
93
91
 
94
92
  def should_set_current_shard?
@@ -113,15 +111,13 @@ module Octopus::Model
113
111
  equality_without_octopus(comparison_object) && comparison_object.current_shard == current_shard
114
112
  end
115
113
 
116
- if !Octopus.rails30? and !Octopus.rails31?
117
- def perform_validations_with_octopus(*args)
118
- if Octopus.enabled? and should_set_current_shard?
119
- Octopus.using(self.current_shard) do
120
- perform_validations_without_octopus(*args)
121
- end
122
- else
114
+ def perform_validations_with_octopus(*args)
115
+ if Octopus.enabled? and should_set_current_shard?
116
+ Octopus.using(self.current_shard) do
123
117
  perform_validations_without_octopus(*args)
124
118
  end
119
+ else
120
+ perform_validations_without_octopus(*args)
125
121
  end
126
122
  end
127
123
  end
@@ -60,6 +60,7 @@ class Octopus::Proxy
60
60
  else
61
61
  @fully_replicated = true
62
62
  end
63
+
63
64
  @slaves_list = @shards.keys.map {|sym| sym.to_s}.sort
64
65
  @slaves_list.delete('master')
65
66
  @slave_index = 0
@@ -139,18 +140,20 @@ class Octopus::Proxy
139
140
  @groups.fetch(group.to_s, nil)
140
141
  end
141
142
 
142
- def select_connection
143
- @shards[shard_name].verify_active_connections! if @verify_connection
144
- # Rails 3.1 sets automatic_reconnect to false when it removes
145
- # connection pool. Octopus can potentially retain a reference to a closed
146
- # connection pool. Previously, that would work since the pool would just
147
- # reconnect, but in Rails 3.1 the flag prevents this.
143
+ # Rails 3.1 sets automatic_reconnect to false when it removes
144
+ # connection pool. Octopus can potentially retain a reference to a closed
145
+ # connection pool. Previously, that would work since the pool would just
146
+ # reconnect, but in Rails 3.1 the flag prevents this.
147
+ def safe_connection(connection_pool)
148
148
  if Octopus.rails31? || Octopus.rails32?
149
- if !@shards[shard_name].automatic_reconnect
150
- @shards[shard_name].automatic_reconnect = true
151
- end
149
+ connection_pool.automatic_reconnect ||= true
152
150
  end
153
- @shards[shard_name].connection()
151
+ connection_pool.connection()
152
+ end
153
+
154
+ def select_connection
155
+ @shards[shard_name].verify_active_connections! if @verify_connection
156
+ safe_connection(@shards[shard_name])
154
157
  end
155
158
 
156
159
  def shard_name
@@ -224,6 +227,22 @@ class Octopus::Proxy
224
227
  return @shards[current_shard]
225
228
  end
226
229
 
230
+ def enable_query_cache!
231
+ @shards.each do |k, v|
232
+ c = safe_connection(v)
233
+ c.clear_query_cache_without_octopus
234
+ c.enable_query_cache!
235
+ end
236
+ end
237
+
238
+ def disable_query_cache!
239
+ @shards.each { |k, v| safe_connection(v).disable_query_cache! }
240
+ end
241
+
242
+ def clear_all_query_caches!
243
+ @shards.each { |k, v| safe_connection(v).clear_query_cache_without_octopus }
244
+ end
245
+
227
246
  protected
228
247
  def connection_pool_for(adapter, config)
229
248
  ActiveRecord::ConnectionAdapters::ConnectionPool.new(ActiveRecord::Base::ConnectionSpecification.new(adapter.dup, config))
@@ -21,6 +21,7 @@ module Octopus
21
21
 
22
22
  def self.included(base)
23
23
  base.alias_method_chain :initialize, :octopus_shard
24
+ base.alias_method_chain :clear_query_cache, :octopus
24
25
  end
25
26
 
26
27
  def octopus_shard
@@ -32,6 +33,16 @@ module Octopus
32
33
  @instrumenter = InstrumenterDecorator.new(self, @instrumenter)
33
34
  end
34
35
 
36
+ # Intercept calls to clear_query_cache and make sure that all
37
+ # query caches on all shards are invalidated, just to be safe.
38
+ def clear_query_cache_with_octopus
39
+ if Octopus.enabled?
40
+ ActiveRecord::Base.connection_proxy.clear_all_query_caches!
41
+ else
42
+ clear_query_cache_without_octopus
43
+ end
44
+ end
45
+
35
46
  end
36
47
  end
37
48
  end
@@ -1,3 +1,3 @@
1
1
  module Octopus
2
- VERSION = '0.6.1'
2
+ VERSION = '0.7.0'
3
3
  end
@@ -76,6 +76,14 @@ production_replicated:
76
76
  <<: *mysql
77
77
 
78
78
 
79
+ replicated_with_one_slave:
80
+ replicated: true
81
+ shards:
82
+ slave1:
83
+ database: octopus_shard_2
84
+ <<: *mysql
85
+
86
+
79
87
  production_fully_replicated:
80
88
  replicated: true
81
89
  shards:
@@ -239,7 +239,7 @@ describe Octopus::Proxy do
239
239
  end
240
240
  end
241
241
 
242
- if !Octopus.rails30? and !Octopus.rails31?
242
+ if !Octopus.rails31?
243
243
  describe "saving multiple sharded objects at once" do
244
244
  before :each do
245
245
  @p = MmorpgPlayer.using(:alone_shard).create!(:player_name => 'Thiago')
@@ -26,6 +26,28 @@ describe "when the database is replicated" do
26
26
  end
27
27
  end
28
28
 
29
+ describe "When enabling the query cache" do
30
+ include_context "with query cache enabled"
31
+
32
+ it "should do the queries with cache" do
33
+ OctopusHelper.using_environment :replicated_with_one_slave do
34
+ cat1 = Cat.using(:master).create!(:name => "Master Cat 1")
35
+ cat2 = Cat.using(:master).create!(:name => "Master Cat 2")
36
+ Cat.using(:master).find(cat1.id).should eq(cat1)
37
+ Cat.using(:master).find(cat1.id).should eq(cat1)
38
+ Cat.using(:master).find(cat1.id).should eq(cat1)
39
+
40
+ cat3 = Cat.using(:slave1).create!(:name => "Slave Cat 3")
41
+ cat4 = Cat.using(:slave1).create!(:name => "Slave Cat 4")
42
+ Cat.find(cat3.id).id.should eq(cat3.id)
43
+ Cat.find(cat3.id).id.should eq(cat3.id)
44
+ Cat.find(cat3.id).id.should eq(cat3.id)
45
+
46
+ counter.query_count.should eq(16)
47
+ end
48
+ end
49
+ end
50
+
29
51
  it "should allow #using syntax to send queries to master" do
30
52
  Cat.create!(:name => "Master Cat")
31
53
 
@@ -40,6 +62,13 @@ describe "when the database is replicated" do
40
62
  Cat.count.should == 0
41
63
  end
42
64
  end
65
+
66
+ def active_support_subscribed(callback, *args, &block)
67
+ subscriber = ActiveSupport::Notifications.subscribe(*args, &callback)
68
+ yield
69
+ ensure
70
+ ActiveSupport::Notifications.unsubscribe(subscriber)
71
+ end
43
72
  end
44
73
 
45
74
 
@@ -0,0 +1,19 @@
1
+ module ActiveRecord
2
+ class QueryCounter
3
+
4
+ attr_accessor :query_count
5
+
6
+ def initialize
7
+ @query_count = 0
8
+ end
9
+
10
+ def to_proc
11
+ lambda(&method(:callback))
12
+ end
13
+
14
+ def callback(name, start, finish, message_id, values)
15
+ @query_count += 1 unless %w(CACHE SCHEMA).include?(values[:name])
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ shared_context "with query cache enabled" do
2
+ let!(:counter) { ActiveRecord::QueryCounter.new }
3
+
4
+ before(:each) do
5
+ ActiveRecord::Base.connection.enable_query_cache!
6
+ counter.query_count = 0
7
+ end
8
+
9
+ after(:each) do
10
+ ActiveRecord::Base.connection.disable_query_cache!
11
+ end
12
+
13
+ around(:each) do |example|
14
+ # TODO - Support Rails 3.0
15
+ if Octopus.rails31? || Octopus.rails32?
16
+ active_support_subscribed(counter.to_proc, 'sql.active_record') do
17
+ example.run
18
+ end
19
+ end
20
+ end
21
+ end
metadata CHANGED
@@ -1,193 +1,169 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ar-octopus
3
- version: !ruby/object:Gem::Version
4
- hash: 5
5
- prerelease:
6
- segments:
7
- - 0
8
- - 6
9
- - 1
10
- version: 0.6.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Thiago Pradi
14
8
  - Mike Perham
15
9
  - Gabriel Sobrinho
16
10
  autorequire:
17
11
  bindir: bin
18
12
  cert_chain: []
19
-
20
- date: 2013-09-30 00:00:00 Z
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
13
+ date: 2013-10-06 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
23
16
  name: activerecord
24
- version_requirements: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 7
30
- segments:
31
- - 3
32
- - 0
33
- - 0
34
- version: 3.0.0
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 3.1.0
35
22
  - - <
36
- - !ruby/object:Gem::Version
37
- hash: 27
38
- segments:
39
- - 4
40
- - 0
41
- version: "4.0"
42
- prerelease: false
23
+ - !ruby/object:Gem::Version
24
+ version: '4.0'
43
25
  type: :runtime
44
- requirement: *id001
45
- - !ruby/object:Gem::Dependency
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ! '>='
30
+ - !ruby/object:Gem::Version
31
+ version: 3.1.0
32
+ - - <
33
+ - !ruby/object:Gem::Version
34
+ version: '4.0'
35
+ - !ruby/object:Gem::Dependency
46
36
  name: activesupport
47
- version_requirements: &id002 !ruby/object:Gem::Requirement
48
- none: false
49
- requirements:
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- hash: 7
53
- segments:
54
- - 3
55
- - 0
56
- - 0
57
- version: 3.0.0
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: 3.1.0
58
42
  - - <
59
- - !ruby/object:Gem::Version
60
- hash: 27
61
- segments:
62
- - 4
63
- - 0
64
- version: "4.0"
65
- prerelease: false
43
+ - !ruby/object:Gem::Version
44
+ version: '4.0'
66
45
  type: :runtime
67
- requirement: *id002
68
- - !ruby/object:Gem::Dependency
46
+ prerelease: false
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ! '>='
50
+ - !ruby/object:Gem::Version
51
+ version: 3.1.0
52
+ - - <
53
+ - !ruby/object:Gem::Version
54
+ version: '4.0'
55
+ - !ruby/object:Gem::Dependency
69
56
  name: rake
70
- version_requirements: &id003 !ruby/object:Gem::Requirement
71
- none: false
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- hash: 49
76
- segments:
77
- - 0
78
- - 8
79
- - 7
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
80
61
  version: 0.8.7
81
- prerelease: false
82
62
  type: :development
83
- requirement: *id003
84
- - !ruby/object:Gem::Dependency
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.8.7
69
+ - !ruby/object:Gem::Dependency
85
70
  name: rspec
86
- version_requirements: &id004 !ruby/object:Gem::Requirement
87
- none: false
88
- requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- hash: 15
92
- segments:
93
- - 2
94
- - 0
95
- - 0
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
96
75
  version: 2.0.0
97
- prerelease: false
98
76
  type: :development
99
- requirement: *id004
100
- - !ruby/object:Gem::Dependency
101
- name: mysql2
102
- version_requirements: &id005 !ruby/object:Gem::Requirement
103
- none: false
104
- requirements:
105
- - - ">"
106
- - !ruby/object:Gem::Version
107
- hash: 13
108
- segments:
109
- - 0
110
- - 3
111
- version: "0.3"
112
77
  prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: 2.0.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: mysql2
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>'
88
+ - !ruby/object:Gem::Version
89
+ version: '0.3'
113
90
  type: :development
114
- requirement: *id005
115
- - !ruby/object:Gem::Dependency
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>'
95
+ - !ruby/object:Gem::Version
96
+ version: '0.3'
97
+ - !ruby/object:Gem::Dependency
116
98
  name: pg
117
- version_requirements: &id006 !ruby/object:Gem::Requirement
118
- none: false
119
- requirements:
120
- - - ">="
121
- - !ruby/object:Gem::Version
122
- hash: 51
123
- segments:
124
- - 0
125
- - 11
126
- - 0
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
127
103
  version: 0.11.0
128
- prerelease: false
129
104
  type: :development
130
- requirement: *id006
131
- - !ruby/object:Gem::Dependency
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.11.0
111
+ - !ruby/object:Gem::Dependency
132
112
  name: sqlite3
133
- version_requirements: &id007 !ruby/object:Gem::Requirement
134
- none: false
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- hash: 19
139
- segments:
140
- - 1
141
- - 3
142
- - 4
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
143
117
  version: 1.3.4
144
- prerelease: false
145
118
  type: :development
146
- requirement: *id007
147
- - !ruby/object:Gem::Dependency
148
- name: pry
149
- version_requirements: &id008 !ruby/object:Gem::Requirement
150
- none: false
151
- requirements:
152
- - - ">="
153
- - !ruby/object:Gem::Version
154
- hash: 3
155
- segments:
156
- - 0
157
- version: "0"
158
119
  prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: 1.3.4
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
159
132
  type: :development
160
- requirement: *id008
161
- - !ruby/object:Gem::Dependency
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
162
140
  name: appraisal
163
- version_requirements: &id009 !ruby/object:Gem::Requirement
164
- none: false
165
- requirements:
166
- - - ">="
167
- - !ruby/object:Gem::Version
168
- hash: 3
169
- segments:
170
- - 0
171
- - 3
172
- - 8
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
173
145
  version: 0.3.8
174
- prerelease: false
175
146
  type: :development
176
- requirement: *id009
177
- description: This gem allows you to use sharded databases with ActiveRecord. This also provides a interface for replication and for running migrations with multiples shards.
178
- email:
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ! '>='
151
+ - !ruby/object:Gem::Version
152
+ version: 0.3.8
153
+ description: This gem allows you to use sharded databases with ActiveRecord. This
154
+ also provides a interface for replication and for running migrations with multiples
155
+ shards.
156
+ email:
179
157
  - tchandy@gmail.com
180
158
  - mperham@gmail.com
181
159
  - gabriel.sobrinho@gmail.com
182
160
  executables: []
183
-
184
161
  extensions: []
185
-
186
162
  extra_rdoc_files: []
187
-
188
- files:
163
+ files:
189
164
  - .gitignore
190
165
  - .rspec
166
+ - .ruby-version
191
167
  - .travis.yml
192
168
  - Appraisals
193
169
  - Gemfile
@@ -195,7 +171,6 @@ files:
195
171
  - Rakefile
196
172
  - TODO.txt
197
173
  - ar-octopus.gemspec
198
- - gemfiles/rails30.gemfile
199
174
  - gemfiles/rails31.gemfile
200
175
  - gemfiles/rails32.gemfile
201
176
  - init.rb
@@ -207,13 +182,11 @@ files:
207
182
  - lib/octopus/migration.rb
208
183
  - lib/octopus/model.rb
209
184
  - lib/octopus/proxy.rb
210
- - lib/octopus/rails3.0/arel.rb
211
- - lib/octopus/rails3.0/association.rb
212
- - lib/octopus/rails3.1/singular_association.rb
213
185
  - lib/octopus/rails3.2/persistence.rb
214
186
  - lib/octopus/rails3/abstract_adapter.rb
215
187
  - lib/octopus/rails3/log_subscriber.rb
216
188
  - lib/octopus/rails3/persistence.rb
189
+ - lib/octopus/rails3/singular_association.rb
217
190
  - lib/octopus/railtie.rb
218
191
  - lib/octopus/scope_proxy.rb
219
192
  - lib/octopus/version.rb
@@ -323,45 +296,41 @@ files:
323
296
  - spec/support/database_connection.rb
324
297
  - spec/support/database_models.rb
325
298
  - spec/support/octopus_helper.rb
299
+ - spec/support/query_count.rb
300
+ - spec/support/shared_contexts.rb
326
301
  - spec/tasks/octopus.rake_spec.rb
327
302
  homepage: https://github.com/tchandy/octopus
328
- licenses: []
303
+ licenses:
304
+ - MIT
305
+ metadata: {}
306
+ post_install_message: ! 'Important: If you are upgrading from < Octopus 0.5.0 you
307
+ need to run:
329
308
 
330
- post_install_message: |-
331
- Important: If you are upgrading from < Octopus 0.5.0 you need to run:
332
309
  $ rake octopus:copy_schema_versions
333
-
334
- Octopus now stores schema version information in each shard and migrations will not work properly unless this task is invoked.
335
- rdoc_options: []
336
310
 
337
- require_paths:
311
+
312
+ Octopus now stores schema version information in each shard and migrations will
313
+ not work properly unless this task is invoked.'
314
+ rdoc_options: []
315
+ require_paths:
338
316
  - lib
339
- required_ruby_version: !ruby/object:Gem::Requirement
340
- none: false
341
- requirements:
342
- - - ">="
343
- - !ruby/object:Gem::Version
344
- hash: 3
345
- segments:
346
- - 0
347
- version: "0"
348
- required_rubygems_version: !ruby/object:Gem::Requirement
349
- none: false
350
- requirements:
351
- - - ">="
352
- - !ruby/object:Gem::Version
353
- hash: 3
354
- segments:
355
- - 0
356
- version: "0"
317
+ required_ruby_version: !ruby/object:Gem::Requirement
318
+ requirements:
319
+ - - ! '>='
320
+ - !ruby/object:Gem::Version
321
+ version: '0'
322
+ required_rubygems_version: !ruby/object:Gem::Requirement
323
+ requirements:
324
+ - - ! '>='
325
+ - !ruby/object:Gem::Version
326
+ version: '0'
357
327
  requirements: []
358
-
359
328
  rubyforge_project:
360
- rubygems_version: 1.8.25
329
+ rubygems_version: 2.0.10
361
330
  signing_key:
362
- specification_version: 3
331
+ specification_version: 4
363
332
  summary: Easy Database Sharding for ActiveRecord
364
- test_files:
333
+ test_files:
365
334
  - spec/config/shards.yml
366
335
  - spec/migrations/10_create_users_using_replication.rb
367
336
  - spec/migrations/11_add_field_in_all_slaves.rb
@@ -391,4 +360,6 @@ test_files:
391
360
  - spec/support/database_connection.rb
392
361
  - spec/support/database_models.rb
393
362
  - spec/support/octopus_helper.rb
363
+ - spec/support/query_count.rb
364
+ - spec/support/shared_contexts.rb
394
365
  - spec/tasks/octopus.rake_spec.rb
@@ -1,8 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activerecord", "~> 3.0.11"
6
- gem "mysql2", "< 0.3"
7
-
8
- gemspec :path=>"../"
@@ -1,13 +0,0 @@
1
- class Arel::Visitors::ToSql
2
- def quote value, column = nil
3
- @connection.quote value, column
4
- end
5
-
6
- def quote_table_name name
7
- @connection.quote_table_name(name)
8
- end
9
-
10
- def quote_column_name name
11
- Arel::Nodes::SqlLiteral === name ? name : @connection.quote_column_name(name)
12
- end
13
- end
@@ -1,86 +0,0 @@
1
- module Octopus
2
- module Rails3
3
- module Association
4
- def association_accessor_methods(reflection, association_proxy_class)
5
- super
6
-
7
- define_method("#{reflection.name}_with_octopus") do |*params|
8
- reload_connection
9
- send("#{reflection.name}_without_octopus", *params)
10
- end
11
-
12
- define_method("loaded_#{reflection.name}_with_octopus?") do
13
- reload_connection
14
- send("loaded_#{reflection.name}_without_octopus?")
15
- end
16
-
17
- define_method("#{reflection.name}_with_octopus=") do |new_value|
18
- reload_connection
19
- send("#{reflection.name}_without_octopus=", new_value)
20
- end
21
-
22
- define_method("set_#{reflection.name}_target_with_octopus") do |target|
23
- reload_connection
24
- send("set_#{reflection.name}_target_without_octopus", target)
25
- end
26
-
27
- alias_method_chain reflection.name, "octopus"
28
- alias_method_chain "loaded_#{reflection.name}?", "octopus"
29
- alias_method_chain "#{reflection.name}=", "octopus"
30
- alias_method_chain "set_#{reflection.name}_target", "octopus"
31
- end
32
-
33
- def collection_reader_method(reflection, association_proxy_class)
34
- super
35
-
36
- define_method("#{reflection.name}_with_octopus") do |*params|
37
- reload_connection
38
- send("#{reflection.name}_without_octopus", *params)
39
- end
40
-
41
- define_method("#{reflection.name.to_s.singularize}_ids_with_octopus") do
42
- reload_connection
43
- send("#{reflection.name.to_s.singularize}_ids_without_octopus")
44
- end
45
-
46
- alias_method_chain reflection.name, "octopus"
47
- alias_method_chain "#{reflection.name.to_s.singularize}_ids", "octopus"
48
- end
49
-
50
- def collection_accessor_methods(reflection, association_proxy_class, writer = true)
51
- super
52
-
53
- if writer
54
- define_method("#{reflection.name}_with_octopus=") do |new_value|
55
- reload_connection
56
- send("#{reflection.name}_without_octopus=", new_value)
57
- end
58
-
59
- define_method("#{reflection.name.to_s.singularize}_ids_with_octopus=") do |new_value|
60
- reload_connection
61
- send("#{reflection.name.to_s.singularize}_ids_without_octopus=", new_value)
62
- end
63
-
64
- alias_method_chain "#{reflection.name}=", "octopus"
65
- alias_method_chain "#{reflection.name.to_s.singularize}_ids=", "octopus"
66
- end
67
- end
68
-
69
- def association_constructor_method(constructor, reflection, association_proxy_class)
70
- super
71
-
72
- define_method("#{constructor}_#{reflection.name}_with_octopus") do |*params|
73
- reload_connection
74
- result = send("#{constructor}_#{reflection.name}_without_octopus", *params)
75
-
76
- result.current_shard = current_shard if should_set_current_shard?
77
- result
78
- end
79
-
80
- alias_method_chain "#{constructor}_#{reflection.name}", "octopus"
81
- end
82
- end
83
- end
84
- end
85
-
86
- ActiveRecord::Base.extend(Octopus::Rails3::Association)