ar-multidb 0.3 → 0.4.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 +5 -5
- data/.travis.yml +3 -5
- data/README.markdown +6 -1
- data/ar-multidb.gemspec +2 -2
- data/gemfiles/{activerecord40.gemfile → activerecord51.gemfile} +1 -1
- data/gemfiles/{activerecord42.gemfile → activerecord52.gemfile} +1 -1
- data/lib/multidb.rb +2 -0
- data/lib/multidb/balancer.rb +32 -55
- data/lib/multidb/candidate.rb +31 -0
- data/lib/multidb/configuration.rb +4 -4
- data/lib/multidb/log_subscriber.rb +21 -0
- data/lib/multidb/version.rb +1 -1
- data/spec/balancer_spec.rb +12 -0
- metadata +11 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e055c742a6029415524f28349e3241360013adc1184666609ed854273b0bd0af
|
4
|
+
data.tar.gz: dad603f9c611e867dfba0a83f2253cedbcfa5b20b75459d645105d9ed57c8faf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80653278f75c95b67e5813c0307b26ff63e5796dd9371228911200ed532711370d7e48e6ec7d841ca59ba820e14843d15a7603099d5f20a451d3f03e3a4c54a9
|
7
|
+
data.tar.gz: 11feb31f0e7aed8f9059a91a1da11393df366da7c7d3960a68704ae078dca92e520524a4f23eec7754210a09fac407bb5b449dca1b9dcf449d3b447590f6eb40
|
data/.travis.yml
CHANGED
@@ -4,9 +4,7 @@ language: ruby
|
|
4
4
|
matrix:
|
5
5
|
fast_finish: true
|
6
6
|
include:
|
7
|
-
- rvm: 2.2
|
8
|
-
gemfile: gemfiles/activerecord40.gemfile
|
9
|
-
- rvm: 2.4.3
|
10
|
-
gemfile: gemfiles/activerecord42.gemfile
|
11
7
|
- rvm: 2.5.0
|
12
|
-
gemfile:
|
8
|
+
gemfile: gemfiles/activerecord51.gemfile
|
9
|
+
- rvm: 2.5.0
|
10
|
+
gemfile: gemfiles/activerecord52.gemfile
|
data/README.markdown
CHANGED
@@ -15,7 +15,12 @@ Randomized balancing of multiple connections within a group is supported. In the
|
|
15
15
|
## Requirements
|
16
16
|
|
17
17
|
* Ruby 2.2 or later.
|
18
|
-
* ActiveRecord
|
18
|
+
* ActiveRecord 5.1 or later.
|
19
|
+
|
20
|
+
## Older releases
|
21
|
+
For ActiveRecord 4. through 5.0 use version 0.3
|
22
|
+
For ActiveRecord older than 4.0 use the gem version 0.1.13
|
23
|
+
For ActiveRecord older than 3.0 use 0.1.10
|
19
24
|
|
20
25
|
## Comparison to other ActiveRecord extensions
|
21
26
|
|
data/ar-multidb.gemspec
CHANGED
@@ -17,8 +17,8 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
|
20
|
-
s.add_runtime_dependency 'activesupport', '>=
|
21
|
-
s.add_runtime_dependency 'activerecord', '>=
|
20
|
+
s.add_runtime_dependency 'activesupport', '>= 5.1', '<= 6.0'
|
21
|
+
s.add_runtime_dependency 'activerecord', '>= 5.1', '<= 6.0'
|
22
22
|
|
23
23
|
s.add_development_dependency 'rspec'
|
24
24
|
s.add_development_dependency 'sqlite3'
|
data/lib/multidb.rb
CHANGED
@@ -6,5 +6,7 @@ require 'active_support/core_ext/module/aliasing'
|
|
6
6
|
|
7
7
|
require_relative 'multidb/configuration'
|
8
8
|
require_relative 'multidb/model_extensions'
|
9
|
+
require_relative 'multidb/log_subscriber'
|
10
|
+
require_relative 'multidb/candidate'
|
9
11
|
require_relative 'multidb/balancer'
|
10
12
|
require_relative 'multidb/version'
|
data/lib/multidb/balancer.rb
CHANGED
@@ -1,48 +1,6 @@
|
|
1
1
|
module Multidb
|
2
|
-
|
3
|
-
class Candidate
|
4
|
-
def initialize(name, target)
|
5
|
-
@name = name
|
6
|
-
|
7
|
-
if target.is_a?(Hash)
|
8
|
-
adapter = target[:adapter]
|
9
|
-
begin
|
10
|
-
require "active_record/connection_adapters/#{adapter}_adapter"
|
11
|
-
rescue LoadError
|
12
|
-
raise "Please install the #{adapter} adapter: `gem install activerecord-#{adapter}-adapter` (#{$!})"
|
13
|
-
end
|
14
|
-
if defined?(ActiveRecord::ConnectionAdapters::ConnectionSpecification)
|
15
|
-
spec_class = ActiveRecord::ConnectionAdapters::ConnectionSpecification
|
16
|
-
else
|
17
|
-
spec_class = ActiveRecord::Base::ConnectionSpecification
|
18
|
-
end
|
19
|
-
|
20
|
-
spec =
|
21
|
-
if ActiveRecord::VERSION::MAJOR >= 5
|
22
|
-
# ActiveRecord 5.0.1 introduced `name` to initialize
|
23
|
-
spec_class.new(name, target, "#{adapter}_connection")
|
24
|
-
else
|
25
|
-
spec_class.new(target, "#{adapter}_connection")
|
26
|
-
end
|
27
|
-
|
28
|
-
@connection_pool = ActiveRecord::ConnectionAdapters::ConnectionPool.new(spec)
|
29
|
-
else
|
30
|
-
@connection_pool = target
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def connection(&block)
|
35
|
-
if block_given?
|
36
|
-
@connection_pool.with_connection(&block)
|
37
|
-
else
|
38
|
-
@connection_pool.connection
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
attr_reader :connection_pool, :name
|
43
|
-
end
|
44
|
-
|
45
2
|
class Balancer
|
3
|
+
attr_accessor :fallback
|
46
4
|
|
47
5
|
def initialize(configuration)
|
48
6
|
@candidates = {}.with_indifferent_access
|
@@ -59,13 +17,13 @@ module Multidb
|
|
59
17
|
else
|
60
18
|
@fallback = false
|
61
19
|
end
|
62
|
-
@default_candidate = Candidate.new('default', @default_configuration.
|
20
|
+
@default_candidate = Candidate.new('default', @default_configuration.default_handler)
|
63
21
|
unless @candidates.include?(:default)
|
64
22
|
@candidates[:default] = [@default_candidate]
|
65
23
|
end
|
66
24
|
end
|
67
25
|
end
|
68
|
-
|
26
|
+
|
69
27
|
def append(databases)
|
70
28
|
databases.each_pair do |name, config|
|
71
29
|
configs = config.is_a?(Array) ? config : [config]
|
@@ -78,9 +36,7 @@ module Multidb
|
|
78
36
|
end
|
79
37
|
|
80
38
|
def disconnect!
|
81
|
-
@candidates.values.flatten.each
|
82
|
-
candidate.connection_pool.disconnect!
|
83
|
-
end
|
39
|
+
@candidates.values.flatten.each(&:disconnect!)
|
84
40
|
end
|
85
41
|
|
86
42
|
def get(name, &block)
|
@@ -97,30 +53,47 @@ module Multidb
|
|
97
53
|
get(name) do |candidate|
|
98
54
|
if block_given?
|
99
55
|
candidate.connection do |connection|
|
100
|
-
|
101
|
-
|
56
|
+
previous_configuration = Thread.current[:multidb]
|
57
|
+
Thread.current[:multidb] = {
|
58
|
+
connection: connection,
|
59
|
+
connection_name: name
|
60
|
+
}
|
102
61
|
begin
|
103
62
|
result = yield
|
104
63
|
result = result.to_a if result.is_a?(ActiveRecord::Relation)
|
105
64
|
ensure
|
106
|
-
Thread.current[:
|
65
|
+
Thread.current[:multidb] = previous_configuration
|
107
66
|
end
|
108
67
|
result
|
109
68
|
end
|
110
69
|
else
|
111
|
-
|
70
|
+
Thread.current[:multidb] = {
|
71
|
+
connection: candidate.connection,
|
72
|
+
connection_name: name
|
73
|
+
}
|
74
|
+
result = candidate.connection
|
112
75
|
end
|
113
76
|
end
|
114
77
|
result
|
115
78
|
end
|
116
79
|
|
117
80
|
def current_connection
|
118
|
-
Thread.current[:
|
81
|
+
if Thread.current[:multidb]
|
82
|
+
Thread.current[:multidb][:connection]
|
83
|
+
else
|
84
|
+
@default_candidate.connection
|
85
|
+
end
|
119
86
|
end
|
120
87
|
|
121
|
-
|
122
|
-
|
88
|
+
def current_connection_name
|
89
|
+
if Thread.current[:multidb]
|
90
|
+
Thread.current[:multidb][:connection_name]
|
91
|
+
else
|
92
|
+
:default
|
93
|
+
end
|
94
|
+
end
|
123
95
|
|
96
|
+
class << self
|
124
97
|
def use(name, &block)
|
125
98
|
Multidb.balancer.use(name, &block)
|
126
99
|
end
|
@@ -129,6 +102,10 @@ module Multidb
|
|
129
102
|
Multidb.balancer.current_connection
|
130
103
|
end
|
131
104
|
|
105
|
+
def current_connection_name
|
106
|
+
Multidb.balancer.current_connection_name
|
107
|
+
end
|
108
|
+
|
132
109
|
def disconnect!
|
133
110
|
Multidb.balancer.disconnect!
|
134
111
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Multidb
|
2
|
+
class Candidate
|
3
|
+
def initialize(name, target)
|
4
|
+
@name = name
|
5
|
+
|
6
|
+
if target.is_a?(Hash)
|
7
|
+
@connection_handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
|
8
|
+
@connection_handler.establish_connection(target.merge(name: 'primary'))
|
9
|
+
elsif target.is_a?(ActiveRecord::ConnectionAdapters::ConnectionHandler)
|
10
|
+
@connection_handler = target
|
11
|
+
else
|
12
|
+
raise ArgumentError, 'Connection handler not passed to target'
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
def connection(&block)
|
18
|
+
if block_given?
|
19
|
+
@connection_handler.retrieve_connection_pool('primary').with_connection(&block)
|
20
|
+
else
|
21
|
+
@connection_handler.retrieve_connection('primary')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def disconnect!
|
26
|
+
@connection_handler.clear_all_connections!
|
27
|
+
end
|
28
|
+
|
29
|
+
attr_reader :name
|
30
|
+
end
|
31
|
+
end
|
@@ -14,7 +14,7 @@ module Multidb
|
|
14
14
|
if @balancer
|
15
15
|
@balancer
|
16
16
|
else
|
17
|
-
raise NotInitializedError, "Balancer not initialized. You need to run Multidb.
|
17
|
+
raise NotInitializedError, "Balancer not initialized. You need to run Multidb.init first"
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -22,16 +22,16 @@ module Multidb
|
|
22
22
|
@balancer = nil
|
23
23
|
end
|
24
24
|
|
25
|
-
class NotInitializedError < StandardError; end
|
25
|
+
class NotInitializedError < StandardError; end
|
26
26
|
|
27
27
|
class Configuration
|
28
28
|
def initialize(default_adapter, configuration_hash)
|
29
|
-
@
|
29
|
+
@default_handler = ActiveRecord::Base.connection_handler
|
30
30
|
@default_adapter = default_adapter
|
31
31
|
@raw_configuration = configuration_hash
|
32
32
|
end
|
33
33
|
|
34
|
-
attr_reader :
|
34
|
+
attr_reader :default_handler
|
35
35
|
attr_reader :default_adapter
|
36
36
|
attr_reader :raw_configuration
|
37
37
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Multidb
|
2
|
+
module LogSubscriberExtension
|
3
|
+
def sql(event)
|
4
|
+
if name = Multidb.balancer.current_connection_name
|
5
|
+
event.payload[:db_name] = name
|
6
|
+
end
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
def debug(msg)
|
11
|
+
if name = Multidb.balancer.current_connection_name
|
12
|
+
db = color("[DB: #{name}]", ActiveSupport::LogSubscriber::GREEN, true)
|
13
|
+
super(db + msg)
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
ActiveRecord::LogSubscriber.prepend(Multidb::LogSubscriberExtension)
|
data/lib/multidb/version.rb
CHANGED
data/spec/balancer_spec.rb
CHANGED
@@ -26,6 +26,12 @@ describe 'Multidb.balancer' do
|
|
26
26
|
|
27
27
|
Multidb.balancer.current_connection.should eq conn
|
28
28
|
end
|
29
|
+
|
30
|
+
it 'returns default connection name for default connection' do
|
31
|
+
conn = ActiveRecord::Base.connection
|
32
|
+
|
33
|
+
Multidb.balancer.current_connection_name.should eq :default
|
34
|
+
end
|
29
35
|
|
30
36
|
context 'with additional configurations' do
|
31
37
|
before do
|
@@ -42,6 +48,12 @@ describe 'Multidb.balancer' do
|
|
42
48
|
File.basename(list[0]['file']).should eq 'test-slave4.sqlite'
|
43
49
|
end
|
44
50
|
end
|
51
|
+
|
52
|
+
it 'returns the connection name' do
|
53
|
+
Multidb.use(:slave4) do
|
54
|
+
Multidb.balancer.current_connection_name.should eq :slave4
|
55
|
+
end
|
56
|
+
end
|
45
57
|
end
|
46
58
|
end
|
47
59
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar-multidb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Staubo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,7 +16,7 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '5.1'
|
20
20
|
- - "<="
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '6.0'
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
29
|
+
version: '5.1'
|
30
30
|
- - "<="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '6.0'
|
@@ -36,7 +36,7 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: '
|
39
|
+
version: '5.1'
|
40
40
|
- - "<="
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: '6.0'
|
@@ -46,7 +46,7 @@ dependencies:
|
|
46
46
|
requirements:
|
47
47
|
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: '
|
49
|
+
version: '5.1'
|
50
50
|
- - "<="
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: '6.0'
|
@@ -107,12 +107,14 @@ files:
|
|
107
107
|
- README.markdown
|
108
108
|
- Rakefile
|
109
109
|
- ar-multidb.gemspec
|
110
|
-
- gemfiles/
|
111
|
-
- gemfiles/
|
110
|
+
- gemfiles/activerecord51.gemfile
|
111
|
+
- gemfiles/activerecord52.gemfile
|
112
112
|
- lib/ar-multidb.rb
|
113
113
|
- lib/multidb.rb
|
114
114
|
- lib/multidb/balancer.rb
|
115
|
+
- lib/multidb/candidate.rb
|
115
116
|
- lib/multidb/configuration.rb
|
117
|
+
- lib/multidb/log_subscriber.rb
|
116
118
|
- lib/multidb/model_extensions.rb
|
117
119
|
- lib/multidb/version.rb
|
118
120
|
- spec/balancer_spec.rb
|
@@ -137,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
137
139
|
version: '0'
|
138
140
|
requirements: []
|
139
141
|
rubyforge_project: ar-multidb
|
140
|
-
rubygems_version: 2.
|
142
|
+
rubygems_version: 2.7.8
|
141
143
|
signing_key:
|
142
144
|
specification_version: 4
|
143
145
|
summary: Multidb is an ActiveRecord extension for switching between multiple database
|