fresh_connection 0.2.6 → 0.3.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/Appraisals +4 -6
- data/README.md +4 -8
- data/fresh_connection.gemspec +5 -4
- data/gemfiles/rails3.gemfile +0 -2
- data/gemfiles/rails40.gemfile +0 -2
- data/gemfiles/rails41.gemfile +0 -2
- data/gemfiles/rails42.gemfile +7 -0
- data/lib/fresh_connection/abstract_connection_manager.rb +3 -5
- data/lib/fresh_connection/access_control.rb +15 -31
- data/lib/fresh_connection/connection_manager.rb +3 -10
- data/lib/fresh_connection/extend/ar_base.rb +6 -0
- data/lib/fresh_connection/extend/ar_relation.rb +22 -6
- data/lib/fresh_connection/extend/ar_statement_cache.rb +15 -0
- data/lib/fresh_connection/extend/mysql2_adapter.rb +4 -7
- data/lib/fresh_connection/extend.rb +28 -0
- data/lib/fresh_connection/railtie.rb +0 -5
- data/lib/fresh_connection/version.rb +1 -1
- data/lib/fresh_connection.rb +7 -24
- data/spec/db_schema.sql +5 -0
- data/spec/prepare.rb +0 -4
- data/spec/spec_helper.rb +0 -1
- data/spec/unit/fresh_connection_spec.rb +33 -9
- metadata +15 -14
- data/lib/fresh_connection/initializer.rb +0 -27
- data/lib/fresh_connection/slave_connection.rb +0 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3236c1e50671a5ba2387ef7d09abd2fe182f6018
|
4
|
+
data.tar.gz: 16e4b85ad933af49e471969d65547855b9b2a09c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ffc51c4d326026040e127db6e4c56d7f67ef40c58b5d4cc9f39b60dc9c60713cab0553b7671b9ccf35dc0c996984e1fadc81bca6c9b2a2e348829c29cc7235db
|
7
|
+
data.tar.gz: e12983fa297222b1aeb6ec63841820383c6d9f714e0f4b62135354a7b96298ffdea9feec6ca6f8ceb9df80b99edbc09c0314e5dce955668acb959673eb39a84d
|
data/.travis.yml
CHANGED
data/Appraisals
CHANGED
@@ -1,17 +1,15 @@
|
|
1
1
|
appraise "rails3" do
|
2
2
|
gem "activerecord", "~> 3.2.0"
|
3
|
-
gem "activesupport", "~> 3.2.0"
|
4
|
-
gem "mysql2", "~> 0.3"
|
5
3
|
end
|
6
4
|
|
7
5
|
appraise "rails40" do
|
8
6
|
gem "activerecord", "~> 4.0.0"
|
9
|
-
gem "activesupport", "~> 4.0.0"
|
10
|
-
gem "mysql2", "~> 0.3"
|
11
7
|
end
|
12
8
|
|
13
9
|
appraise "rails41" do
|
14
10
|
gem "activerecord", "~> 4.1.0"
|
15
|
-
|
16
|
-
|
11
|
+
end
|
12
|
+
|
13
|
+
appraise "rails42" do
|
14
|
+
gem "activerecord", "~> 4.2.0"
|
17
15
|
end
|
data/README.md
CHANGED
@@ -32,12 +32,14 @@ Read query goes to the slave server.
|
|
32
32
|
Article.where(:id => 1)
|
33
33
|
```
|
34
34
|
|
35
|
-
If you want to access to the master
|
35
|
+
If you want to access to the master server, use read_master.
|
36
36
|
|
37
37
|
```ruby
|
38
|
-
Article.where(:id => 1).
|
38
|
+
Article.where(:id => 1).read_master
|
39
39
|
```
|
40
40
|
|
41
|
+
It is possible to use readonly(false) instead of read_master, but it will be depricated at future version.
|
42
|
+
|
41
43
|
In transaction, All queries go to the master server.
|
42
44
|
|
43
45
|
```ruby
|
@@ -151,12 +153,6 @@ The model that master_db_only model's child is always access to master db.
|
|
151
153
|
Default slave connection manager is FreshConnection::ConnectionManager.
|
152
154
|
If you would like to change slave connection manager, assign yourself slave connection manager.
|
153
155
|
|
154
|
-
#### config/application.rb
|
155
|
-
|
156
|
-
config.fresh_connection.connection_manager = MySlaveConnection
|
157
|
-
|
158
|
-
or
|
159
|
-
|
160
156
|
#### config/initializers/fresh_connection.rb
|
161
157
|
|
162
158
|
FreshConnection.connection_manager = MySlaveConnection
|
data/fresh_connection.gemspec
CHANGED
@@ -17,13 +17,14 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
|
+
spec.required_ruby_version = '>= 2.0'
|
20
21
|
|
21
|
-
spec.add_dependency 'activerecord', '>= 3.2.0', '< 4.
|
22
|
-
spec.add_dependency 'activesupport', '>= 3.2.0', '< 4.
|
22
|
+
spec.add_dependency 'activerecord', '>= 3.2.0', '< 4.3'
|
23
|
+
spec.add_dependency 'activesupport', '>= 3.2.0', '< 4.3'
|
23
24
|
spec.add_dependency 'mysql2', '~> 0.3'
|
24
25
|
|
25
|
-
spec.add_development_dependency "bundler", "~> 1.
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
26
27
|
spec.add_development_dependency "rake", '~> 10.0'
|
27
|
-
spec.add_development_dependency "rspec", '~>
|
28
|
+
spec.add_development_dependency "rspec", '~> 3.0'
|
28
29
|
spec.add_development_dependency 'appraisal', '~> 1.0'
|
29
30
|
end
|
data/gemfiles/rails3.gemfile
CHANGED
data/gemfiles/rails40.gemfile
CHANGED
data/gemfiles/rails41.gemfile
CHANGED
@@ -15,17 +15,15 @@ module FreshConnection
|
|
15
15
|
|
16
16
|
def slave_connection
|
17
17
|
end
|
18
|
+
undef_method :slave_connection
|
18
19
|
|
19
20
|
def put_aside!
|
20
21
|
end
|
22
|
+
undef_method :put_aside!
|
21
23
|
|
22
24
|
def recovery(failure_connection, exception)
|
23
|
-
false
|
24
|
-
end
|
25
|
-
|
26
|
-
def recoverable?
|
27
|
-
false
|
28
25
|
end
|
26
|
+
undef_method :recovery
|
29
27
|
|
30
28
|
private
|
31
29
|
|
@@ -1,19 +1,17 @@
|
|
1
1
|
module FreshConnection
|
2
2
|
class AccessControl
|
3
3
|
class << self
|
4
|
-
def force_master_access
|
5
|
-
|
6
|
-
access_to(:master)
|
7
|
-
yield
|
8
|
-
ensure
|
9
|
-
access_to(db)
|
4
|
+
def force_master_access(&block)
|
5
|
+
switch_to(:master, &block)
|
10
6
|
end
|
11
7
|
|
12
|
-
def access(enable_slave_access)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
8
|
+
def access(enable_slave_access, &block)
|
9
|
+
if access_db
|
10
|
+
block.call
|
11
|
+
else
|
12
|
+
db = enable_slave_access ? :slave : :master
|
13
|
+
switch_to(db, &block)
|
14
|
+
end
|
17
15
|
end
|
18
16
|
|
19
17
|
def slave_access?
|
@@ -22,14 +20,12 @@ module FreshConnection
|
|
22
20
|
|
23
21
|
private
|
24
22
|
|
25
|
-
def
|
26
|
-
|
27
|
-
access_to(
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
decrement_access_count
|
32
|
-
access_to(nil) if access_count == 0
|
23
|
+
def switch_to(new_db)
|
24
|
+
old_db = access_db
|
25
|
+
access_to(new_db)
|
26
|
+
yield
|
27
|
+
ensure
|
28
|
+
access_to(old_db)
|
33
29
|
end
|
34
30
|
|
35
31
|
def access_db
|
@@ -39,18 +35,6 @@ module FreshConnection
|
|
39
35
|
def access_to(db)
|
40
36
|
Thread.current[:fresh_connection_access_target] = db
|
41
37
|
end
|
42
|
-
|
43
|
-
def access_count
|
44
|
-
Thread.current['fresh_connection_access_count'] || 0
|
45
|
-
end
|
46
|
-
|
47
|
-
def increment_access_count
|
48
|
-
Thread.current['fresh_connection_access_count'] = access_count + 1
|
49
|
-
end
|
50
|
-
|
51
|
-
def decrement_access_count
|
52
|
-
Thread.current['fresh_connection_access_count'] = access_count - 1
|
53
|
-
end
|
54
38
|
end
|
55
39
|
end
|
56
40
|
end
|
@@ -17,16 +17,9 @@ module FreshConnection
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def recovery(failure_connection, exception)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
else
|
24
|
-
false
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def recoverable?
|
29
|
-
true
|
20
|
+
do_recovery = slave_down_message?(exception.message)
|
21
|
+
put_aside! if do_recovery
|
22
|
+
do_recovery
|
30
23
|
end
|
31
24
|
|
32
25
|
private
|
@@ -6,6 +6,12 @@ module FreshConnection
|
|
6
6
|
base.slave_connection_handler = FreshConnection::SlaveConnectionHandler.new
|
7
7
|
end
|
8
8
|
|
9
|
+
if FreshConnection.rails_4?
|
10
|
+
delegate :read_master, to: :all
|
11
|
+
elsif FreshConnection.rails_3?
|
12
|
+
delegate :read_master, to: :scoped
|
13
|
+
end
|
14
|
+
|
9
15
|
def manage_access(slave_access, &block)
|
10
16
|
if master_db_only?
|
11
17
|
FreshConnection::AccessControl.force_master_access(&block)
|
@@ -11,11 +11,16 @@ module FreshConnection
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
|
14
15
|
def calculate(operation, column_name, options = {})
|
15
16
|
slave_access = enable_slave_access && options[:readonly] != false
|
16
17
|
@klass.manage_access(slave_access) { super }
|
17
18
|
end
|
18
19
|
|
20
|
+
def enable_slave_access
|
21
|
+
connection.open_transactions == 0 && @read_from_master.nil?
|
22
|
+
end
|
23
|
+
|
19
24
|
private
|
20
25
|
|
21
26
|
def exec_queries_with_fresh_connection
|
@@ -31,10 +36,17 @@ module FreshConnection
|
|
31
36
|
@klass.manage_access(enable_slave_access) { super }
|
32
37
|
end
|
33
38
|
|
34
|
-
|
39
|
+
def readonly(value = true)
|
40
|
+
value == false ? read_master : super
|
41
|
+
end
|
35
42
|
|
36
|
-
def
|
37
|
-
|
43
|
+
def read_master
|
44
|
+
spawn.read_master!
|
45
|
+
end
|
46
|
+
|
47
|
+
def read_master!
|
48
|
+
@read_from_master = true
|
49
|
+
self
|
38
50
|
end
|
39
51
|
end
|
40
52
|
|
@@ -57,10 +69,14 @@ module FreshConnection
|
|
57
69
|
end
|
58
70
|
end
|
59
71
|
|
60
|
-
|
72
|
+
def readonly(value = true)
|
73
|
+
value == false ? read_master : super
|
74
|
+
end
|
61
75
|
|
62
|
-
def
|
63
|
-
|
76
|
+
def read_master
|
77
|
+
relation = clone
|
78
|
+
relation.instance_variable_set("@read_from_master", true)
|
79
|
+
relation
|
64
80
|
end
|
65
81
|
end
|
66
82
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module FreshConnection
|
2
|
+
module Extend
|
3
|
+
module ArStatementCache
|
4
|
+
def self.included(base)
|
5
|
+
base.alias_method_chain :execute, :fresh_connection
|
6
|
+
end
|
7
|
+
|
8
|
+
def execute_with_fresh_connection(params, klass, connection)
|
9
|
+
klass.manage_access(klass.all.enable_slave_access) do
|
10
|
+
execute_without_fresh_connection(params, klass, connection)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
module FreshConnection
|
2
2
|
module Extend
|
3
3
|
module Mysql2Adapter
|
4
|
+
RETRY_LIMIT = 3
|
5
|
+
private_constant :RETRY_LIMIT
|
6
|
+
|
4
7
|
def self.included(base)
|
5
8
|
base.__send__(:attr_writer, :model_class)
|
6
|
-
base.alias_method_chain :configure_connection, :fresh_connection
|
7
9
|
end
|
8
10
|
|
9
11
|
def select_all(arel, name = nil, binds = [])
|
@@ -28,7 +30,7 @@ module FreshConnection
|
|
28
30
|
rescue ActiveRecord::StatementInvalid => exception
|
29
31
|
if @model_class.recovery(slave_connection, exception)
|
30
32
|
retry_count += 1
|
31
|
-
retry if retry_count <
|
33
|
+
retry if retry_count < RETRY_LIMIT
|
32
34
|
end
|
33
35
|
|
34
36
|
raise
|
@@ -36,11 +38,6 @@ module FreshConnection
|
|
36
38
|
ensure
|
37
39
|
@connection = master_connection
|
38
40
|
end
|
39
|
-
|
40
|
-
def configure_connection_with_fresh_connection
|
41
|
-
return if FreshConnection.ignore_configure_connection?
|
42
|
-
configure_connection_without_fresh_connection
|
43
|
-
end
|
44
41
|
end
|
45
42
|
end
|
46
43
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'active_support/lazy_load_hooks'
|
2
|
+
|
3
|
+
ActiveSupport.on_load(:active_record) do
|
4
|
+
require 'fresh_connection/extend/ar_base'
|
5
|
+
require 'fresh_connection/extend/ar_relation'
|
6
|
+
require 'fresh_connection/extend/connection_handler'
|
7
|
+
require 'fresh_connection/extend/mysql2_adapter'
|
8
|
+
require 'active_record/connection_adapters/mysql2_adapter'
|
9
|
+
|
10
|
+
ActiveRecord::Base.extend FreshConnection::Extend::ArBase
|
11
|
+
|
12
|
+
ActiveRecord::Relation.__send__(:include, FreshConnection::Extend::ArRelation)
|
13
|
+
|
14
|
+
ActiveRecord::ConnectionAdapters::ConnectionHandler.__send__(
|
15
|
+
:include, FreshConnection::Extend::ConnectionHandler
|
16
|
+
)
|
17
|
+
|
18
|
+
ActiveRecord::ConnectionAdapters::Mysql2Adapter.__send__(
|
19
|
+
:include, FreshConnection::Extend::Mysql2Adapter
|
20
|
+
)
|
21
|
+
|
22
|
+
if defined?(ActiveRecord::StatementCache)
|
23
|
+
require 'fresh_connection/extend/ar_statement_cache'
|
24
|
+
ActiveRecord::StatementCache.__send__(:include, FreshConnection::Extend::ArStatementCache)
|
25
|
+
end
|
26
|
+
|
27
|
+
ActiveRecord::Base.establish_fresh_connection
|
28
|
+
end
|
@@ -1,18 +1,13 @@
|
|
1
1
|
require 'fresh_connection/rack/connection_management'
|
2
|
-
require 'rails'
|
3
2
|
|
4
3
|
module FreshConnection
|
5
4
|
class Railtie < Rails::Railtie
|
6
|
-
config.fresh_connection = ActiveSupport::OrderedOptions.new
|
7
|
-
|
8
5
|
initializer "fresh_connection.configure_rails_initialization" do |app|
|
9
6
|
ActiveSupport.on_load(:active_record) do
|
10
7
|
app.config.app_middleware.swap(
|
11
8
|
ActiveRecord::ConnectionAdapters::ConnectionManagement,
|
12
9
|
FreshConnection::Rack::ConnectionManagement
|
13
10
|
)
|
14
|
-
|
15
|
-
Initializer.extend_active_record
|
16
11
|
end
|
17
12
|
end
|
18
13
|
end
|
data/lib/fresh_connection.rb
CHANGED
@@ -1,30 +1,19 @@
|
|
1
1
|
require 'active_record'
|
2
|
-
require '
|
3
|
-
require '
|
2
|
+
require 'fresh_connection/access_control'
|
3
|
+
require 'fresh_connection/connection_manager'
|
4
|
+
require 'fresh_connection/slave_connection_handler'
|
4
5
|
|
5
6
|
module FreshConnection
|
6
7
|
extend ActiveSupport::Autoload
|
7
8
|
|
8
|
-
autoload :AccessControl
|
9
9
|
autoload :ConnectionManager
|
10
10
|
autoload :SlaveConnectionHandler
|
11
|
-
autoload :Initializer
|
12
|
-
autoload :SlaveConnection
|
13
11
|
|
14
12
|
class << self
|
15
|
-
attr_writer :connection_manager, :
|
13
|
+
attr_writer :connection_manager, :env
|
16
14
|
|
17
15
|
def connection_manager
|
18
|
-
|
19
|
-
manager_klass.is_a?(String) ? manager_klass.constantize : manager_klass
|
20
|
-
end
|
21
|
-
|
22
|
-
def ignore_configure_connection?
|
23
|
-
!!(@ignore_configure_connection || rails_config(:ignore_configure_connection))
|
24
|
-
end
|
25
|
-
|
26
|
-
def retry_limit
|
27
|
-
@retry_limit || rails_config(:retry_limit) || 3
|
16
|
+
@connection_manager || ConnectionManager
|
28
17
|
end
|
29
18
|
|
30
19
|
def env
|
@@ -38,14 +27,8 @@ module FreshConnection
|
|
38
27
|
def rails_4?
|
39
28
|
ActiveRecord::VERSION::MAJOR == 4
|
40
29
|
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def rails_config(target)
|
45
|
-
return nil unless defined?(Rails)
|
46
|
-
Rails.application.config.fresh_connection[target]
|
47
|
-
end
|
48
30
|
end
|
49
31
|
end
|
50
32
|
|
51
|
-
require
|
33
|
+
require 'fresh_connection/extend'
|
34
|
+
require "fresh_connection/railtie" if defined?(Rails)
|
data/spec/db_schema.sql
CHANGED
@@ -100,6 +100,7 @@ CREATE TABLE `users` (
|
|
100
100
|
LOCK TABLES `users` WRITE;
|
101
101
|
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
|
102
102
|
INSERT INTO `users` VALUES (1,'Tsukasa (master)','2014-04-10 07:24:16','2014-04-10 07:24:16');
|
103
|
+
INSERT INTO `users` VALUES (2,'Other','2015-01-16 07:24:16','2014-04-10 07:24:16');
|
103
104
|
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
|
104
105
|
UNLOCK TABLES;
|
105
106
|
|
@@ -188,6 +189,8 @@ CREATE TABLE `users` (
|
|
188
189
|
LOCK TABLES `users` WRITE;
|
189
190
|
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
|
190
191
|
INSERT INTO `users` VALUES (1,'Tsukasa (slave1)','2014-04-10 07:24:16','2014-04-10 07:24:16');
|
192
|
+
INSERT INTO `users` VALUES (2,'Other','2015-01-16 07:24:16','2014-04-10 07:24:16');
|
193
|
+
INSERT INTO `users` VALUES (3,'Other','2015-01-16 07:24:16','2014-04-10 07:24:16');
|
191
194
|
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
|
192
195
|
UNLOCK TABLES;
|
193
196
|
|
@@ -276,6 +279,8 @@ CREATE TABLE `users` (
|
|
276
279
|
LOCK TABLES `users` WRITE;
|
277
280
|
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
|
278
281
|
INSERT INTO `users` VALUES (1,'Tsukasa (slave2)','2014-04-10 07:24:16','2014-04-10 07:24:16');
|
282
|
+
INSERT INTO `users` VALUES (2,'Other','2015-01-16 07:24:16','2014-04-10 07:24:16');
|
283
|
+
INSERT INTO `users` VALUES (3,'Other','2015-01-16 07:24:16','2014-04-10 07:24:16');
|
279
284
|
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
|
280
285
|
UNLOCK TABLES;
|
281
286
|
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
data/spec/prepare.rb
CHANGED
@@ -2,10 +2,6 @@ require 'yaml'
|
|
2
2
|
require 'active_record'
|
3
3
|
require 'fresh_connection'
|
4
4
|
|
5
|
-
unless ActiveRecord::Base.respond_to?('establish_fresh_connection')
|
6
|
-
FreshConnection::Initializer.extend_active_record
|
7
|
-
end
|
8
|
-
|
9
5
|
system("mysql -uroot < spec/db_schema.sql")
|
10
6
|
|
11
7
|
module ActiveRecord
|
data/spec/spec_helper.rb
CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe FreshConnection do
|
4
4
|
before(:each) do
|
5
|
-
@user = User.first
|
5
|
+
@user = User.where(id: 1).first
|
6
6
|
end
|
7
7
|
|
8
8
|
context "access to slave" do
|
@@ -35,17 +35,21 @@ describe FreshConnection do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
it "select with join is to access to slave1" do
|
38
|
-
name = User.joins(:address).where("addresses.user_id = 1").first.name
|
38
|
+
name = User.joins(:address).where("addresses.user_id = 1").where(id: 1).first.name
|
39
39
|
expect(name).to be_include("slave1")
|
40
40
|
end
|
41
41
|
|
42
42
|
it "pluck is access to slave1" do
|
43
|
-
expect(User.pluck(:name).first).to be_include("slave")
|
43
|
+
expect(User.where(id: 1).pluck(:name).first).to be_include("slave")
|
44
44
|
end
|
45
45
|
|
46
46
|
it "pluck returns empty array when result of condition is empty" do
|
47
47
|
expect(User.limit(0).pluck(:name)).to be_empty
|
48
48
|
end
|
49
|
+
|
50
|
+
it "count is access to slave" do
|
51
|
+
expect(User.where(name: "Other").count).to eq(2)
|
52
|
+
end
|
49
53
|
end
|
50
54
|
|
51
55
|
context "access to master" do
|
@@ -59,14 +63,32 @@ describe FreshConnection do
|
|
59
63
|
Tel.first.user.name,
|
60
64
|
@user.address.prefecture,
|
61
65
|
@user.tels.first.number,
|
62
|
-
User.joins(:address).where("addresses.user_id = 1").first.name,
|
63
|
-
User.pluck(:name).first
|
66
|
+
User.joins(:address).where(id: 1).where("addresses.user_id = 1").first.name,
|
67
|
+
User.where(id: 1).pluck(:name).first
|
64
68
|
]
|
65
69
|
expect(data).to be_all{|n| n.include?("master")}
|
66
70
|
|
71
|
+
expect(User.where(name: "Other").count).to eq(1)
|
67
72
|
end
|
68
73
|
end
|
69
74
|
|
75
|
+
it "specify read_master" do
|
76
|
+
data = [
|
77
|
+
Address.read_master.first.prefecture,
|
78
|
+
Address.includes(:user).read_master.first.user.name,
|
79
|
+
Tel.read_master.first.number,
|
80
|
+
Tel.includes(:user).read_master.first.user.name,
|
81
|
+
@user.tels.read_master.first.number,
|
82
|
+
User.where(id: 1).includes(:tels).read_master.first.tels.first.number,
|
83
|
+
User.where(id: 1).includes(:address).read_master.first.address.prefecture,
|
84
|
+
User.where(id: 1).joins(:address).where("addresses.user_id = 1").read_master.first.name,
|
85
|
+
User.where(id: 1).read_master.pluck(:name).first
|
86
|
+
]
|
87
|
+
|
88
|
+
expect(data).to be_all{|n| n.include?("master")}
|
89
|
+
expect(User.where(name: "Other").read_master.count).to eq(1)
|
90
|
+
end
|
91
|
+
|
70
92
|
it "specify readonly(false)" do
|
71
93
|
data = [
|
72
94
|
Address.readonly(false).first.prefecture,
|
@@ -74,13 +96,15 @@ describe FreshConnection do
|
|
74
96
|
Tel.readonly(false).first.number,
|
75
97
|
Tel.includes(:user).readonly(false).first.user.name,
|
76
98
|
@user.tels.readonly(false).first.number,
|
77
|
-
User.includes(:tels).readonly(false).first.tels.first.number,
|
78
|
-
User.includes(:address).readonly(false).first.address.prefecture,
|
79
|
-
User.joins(:address).where("addresses.user_id = 1").readonly(false).first.name,
|
80
|
-
User.readonly(false).pluck(:name).first
|
99
|
+
User.where(id: 1).includes(:tels).readonly(false).first.tels.first.number,
|
100
|
+
User.where(id: 1).includes(:address).readonly(false).first.address.prefecture,
|
101
|
+
User.where(id: 1).joins(:address).where("addresses.user_id = 1").readonly(false).first.name,
|
102
|
+
User.where(id: 1).readonly(false).pluck(:name).first
|
81
103
|
]
|
82
104
|
|
83
105
|
expect(data).to be_all{|n| n.include?("master")}
|
106
|
+
expect(User.where(name: "Other").readonly(false).count).to eq(1)
|
107
|
+
expect(User.where(name: "Other").count(:readonly => false)).to eq(1)
|
84
108
|
end
|
85
109
|
end
|
86
110
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fresh_connection
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tsukasa OISHI
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-03-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: 3.2.0
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '4.
|
22
|
+
version: '4.3'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: 3.2.0
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '4.
|
32
|
+
version: '4.3'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: activesupport
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
version: 3.2.0
|
40
40
|
- - "<"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '4.
|
42
|
+
version: '4.3'
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -49,7 +49,7 @@ dependencies:
|
|
49
49
|
version: 3.2.0
|
50
50
|
- - "<"
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version: '4.
|
52
|
+
version: '4.3'
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
54
|
name: mysql2
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,14 +70,14 @@ dependencies:
|
|
70
70
|
requirements:
|
71
71
|
- - "~>"
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
version: '1.
|
73
|
+
version: '1.7'
|
74
74
|
type: :development
|
75
75
|
prerelease: false
|
76
76
|
version_requirements: !ruby/object:Gem::Requirement
|
77
77
|
requirements:
|
78
78
|
- - "~>"
|
79
79
|
- !ruby/object:Gem::Version
|
80
|
-
version: '1.
|
80
|
+
version: '1.7'
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: rake
|
83
83
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,14 +98,14 @@ dependencies:
|
|
98
98
|
requirements:
|
99
99
|
- - "~>"
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version: '
|
101
|
+
version: '3.0'
|
102
102
|
type: :development
|
103
103
|
prerelease: false
|
104
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
105
|
requirements:
|
106
106
|
- - "~>"
|
107
107
|
- !ruby/object:Gem::Version
|
108
|
-
version: '
|
108
|
+
version: '3.0'
|
109
109
|
- !ruby/object:Gem::Dependency
|
110
110
|
name: appraisal
|
111
111
|
requirement: !ruby/object:Gem::Requirement
|
@@ -138,18 +138,19 @@ files:
|
|
138
138
|
- gemfiles/rails3.gemfile
|
139
139
|
- gemfiles/rails40.gemfile
|
140
140
|
- gemfiles/rails41.gemfile
|
141
|
+
- gemfiles/rails42.gemfile
|
141
142
|
- lib/fresh_connection.rb
|
142
143
|
- lib/fresh_connection/abstract_connection_manager.rb
|
143
144
|
- lib/fresh_connection/access_control.rb
|
144
145
|
- lib/fresh_connection/connection_manager.rb
|
146
|
+
- lib/fresh_connection/extend.rb
|
145
147
|
- lib/fresh_connection/extend/ar_base.rb
|
146
148
|
- lib/fresh_connection/extend/ar_relation.rb
|
149
|
+
- lib/fresh_connection/extend/ar_statement_cache.rb
|
147
150
|
- lib/fresh_connection/extend/connection_handler.rb
|
148
151
|
- lib/fresh_connection/extend/mysql2_adapter.rb
|
149
|
-
- lib/fresh_connection/initializer.rb
|
150
152
|
- lib/fresh_connection/rack/connection_management.rb
|
151
153
|
- lib/fresh_connection/railtie.rb
|
152
|
-
- lib/fresh_connection/slave_connection.rb
|
153
154
|
- lib/fresh_connection/slave_connection_handler.rb
|
154
155
|
- lib/fresh_connection/version.rb
|
155
156
|
- log/.gitkeep
|
@@ -174,7 +175,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
174
175
|
requirements:
|
175
176
|
- - ">="
|
176
177
|
- !ruby/object:Gem::Version
|
177
|
-
version: '0'
|
178
|
+
version: '2.0'
|
178
179
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
180
|
requirements:
|
180
181
|
- - ">="
|
@@ -182,7 +183,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
182
183
|
version: '0'
|
183
184
|
requirements: []
|
184
185
|
rubyforge_project:
|
185
|
-
rubygems_version: 2.4.
|
186
|
+
rubygems_version: 2.4.5
|
186
187
|
signing_key:
|
187
188
|
specification_version: 4
|
188
189
|
summary: FreshConnection supports to connect with Mysql slave servers via Load Balancers.
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'fresh_connection/extend/ar_base'
|
2
|
-
require 'fresh_connection/extend/ar_relation'
|
3
|
-
require 'fresh_connection/extend/connection_handler'
|
4
|
-
require 'fresh_connection/extend/mysql2_adapter'
|
5
|
-
|
6
|
-
module FreshConnection
|
7
|
-
class Initializer
|
8
|
-
class << self
|
9
|
-
def extend_active_record
|
10
|
-
ActiveRecord::Base.extend FreshConnection::Extend::ArBase
|
11
|
-
|
12
|
-
ActiveRecord::Relation.__send__(:include, FreshConnection::Extend::ArRelation)
|
13
|
-
|
14
|
-
ActiveRecord::ConnectionAdapters::ConnectionHandler.__send__(
|
15
|
-
:include, FreshConnection::Extend::ConnectionHandler
|
16
|
-
)
|
17
|
-
|
18
|
-
require 'active_record/connection_adapters/mysql2_adapter'
|
19
|
-
ActiveRecord::ConnectionAdapters::Mysql2Adapter.__send__(
|
20
|
-
:include, FreshConnection::Extend::Mysql2Adapter
|
21
|
-
)
|
22
|
-
|
23
|
-
ActiveRecord::Base.establish_fresh_connection
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'active_support/deprecation'
|
2
|
-
|
3
|
-
module FreshConnection
|
4
|
-
#
|
5
|
-
# This class has been deprecated.
|
6
|
-
# It will delete at next version.
|
7
|
-
#
|
8
|
-
class SlaveConnection
|
9
|
-
class << self
|
10
|
-
def ignore_models=(models)
|
11
|
-
deprecation("ignore_models=", "ActiveRecord::Base.master_db_only!")
|
12
|
-
models.each do |model|
|
13
|
-
if model.is_a?(String)
|
14
|
-
model.constantize.master_db_only!
|
15
|
-
elsif model.ancestors.include?(ActiveRecord::Base)
|
16
|
-
model.master_db_only!
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def ignore_configure_connection=(flag)
|
22
|
-
deprecation("ignore_configure_connection=", "FreshConnection.ignore_configure_connection=")
|
23
|
-
FreshConnection.ignore_configure_connection = flag
|
24
|
-
end
|
25
|
-
|
26
|
-
def connection_manager=(manager)
|
27
|
-
deprecation("connection_manager=", "FreshConnection.connection_manager=")
|
28
|
-
FreshConnection.connection_manager = manager
|
29
|
-
end
|
30
|
-
|
31
|
-
def slave_connection
|
32
|
-
raise_deprecation_exception("slave_connection", "ArtiveRecord::Base.slave_connection")
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def deprecation(method_name, instead_method)
|
38
|
-
ActiveSupport::Deprecation.warn(deprecation_message(method_name, instead_method))
|
39
|
-
end
|
40
|
-
|
41
|
-
def raise_deprecation_exception(method_name, instead_method)
|
42
|
-
if defined?(ActiveSupport::DeprecationException)
|
43
|
-
raise ActiveSupport::DeprecationException, deprecation_message(method_name, instead_method)
|
44
|
-
else
|
45
|
-
raise "ActiveSupport::DeprecationException: #{deprecation_message(method_name, instead_method)}"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def deprecation_message(method_name, instead_method)
|
50
|
-
"FreshConnection::SlaveConnection.#{method_name} has been deprecated. Use #{instead_method} instead"
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|