ar-multidb 0.1.13 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +12 -3
- data/Gemfile +4 -3
- data/README.markdown +2 -2
- data/ar-multidb.gemspec +3 -2
- data/gemfiles/activerecord40.gemfile +5 -0
- data/gemfiles/activerecord42.gemfile +5 -0
- data/lib/multidb/balancer.rb +36 -18
- data/lib/multidb/model_extensions.rb +14 -15
- data/lib/multidb/version.rb +2 -2
- data/spec/balancer_spec.rb +27 -0
- data/spec/spec_helper.rb +1 -0
- metadata +47 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea08a6b114f52250b4d917e901839dd063dab40b
|
4
|
+
data.tar.gz: 6cdde3b0f316fdbb1b68379944fb0eadb91afa25
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 547ad2beb0fd69f417e0670e404623a8d08a09e66e65bf954a34a34374e51c1db529420d35c686b8fd740afb0cdb2f10724a4538f5f3205b1c3b5af86418afdb
|
7
|
+
data.tar.gz: 4e1869077ee855daf7d1fdc95e374d0944e731ca962d97cc8a1546b771f2f20bd065b6b8bfb7904985b1a452fe5e8f94deb0079c4ad0e2b229a90a80fdd63a93
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -3,7 +3,8 @@ source "http://rubygems.org"
|
|
3
3
|
# Specify your gem's dependencies in ar-multidb.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
local_gemfile = "Gemfile.local"
|
7
|
+
|
8
|
+
if File.exist?(local_gemfile)
|
9
|
+
eval(File.read(local_gemfile)) # rubocop:disable Security/Eval
|
9
10
|
end
|
data/README.markdown
CHANGED
@@ -14,8 +14,8 @@ Randomized balancing of multiple connections within a group is supported. In the
|
|
14
14
|
|
15
15
|
## Requirements
|
16
16
|
|
17
|
-
* Ruby
|
18
|
-
* ActiveRecord
|
17
|
+
* Ruby 2.2 or later.
|
18
|
+
* ActiveRecord 4.0 or later. (Earlier versions can use the gem version 0.1.13 for Rails 3.2 and 0.1.10 for older version)
|
19
19
|
|
20
20
|
## Comparison to other ActiveRecord extensions
|
21
21
|
|
data/ar-multidb.gemspec
CHANGED
@@ -17,9 +17,10 @@ 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', '>= 4.0', '<= 6.0'
|
21
|
+
s.add_runtime_dependency 'activerecord', '>= 4.0', '<= 6.0'
|
22
22
|
|
23
23
|
s.add_development_dependency 'rspec'
|
24
24
|
s.add_development_dependency 'sqlite3'
|
25
|
+
s.add_development_dependency 'rake'
|
25
26
|
end
|
data/lib/multidb/balancer.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
module Multidb
|
2
2
|
|
3
3
|
class Candidate
|
4
|
-
def initialize(target)
|
4
|
+
def initialize(name, target)
|
5
|
+
@name = name
|
6
|
+
|
5
7
|
if target.is_a?(Hash)
|
6
8
|
adapter = target[:adapter]
|
7
9
|
begin
|
@@ -14,8 +16,16 @@ module Multidb
|
|
14
16
|
else
|
15
17
|
spec_class = ActiveRecord::Base::ConnectionSpecification
|
16
18
|
end
|
17
|
-
|
18
|
-
|
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)
|
19
29
|
else
|
20
30
|
@connection_pool = target
|
21
31
|
end
|
@@ -29,36 +39,43 @@ module Multidb
|
|
29
39
|
end
|
30
40
|
end
|
31
41
|
|
32
|
-
attr_reader :connection_pool
|
42
|
+
attr_reader :connection_pool, :name
|
33
43
|
end
|
34
44
|
|
35
45
|
class Balancer
|
36
46
|
|
37
47
|
def initialize(configuration)
|
38
48
|
@candidates = {}.with_indifferent_access
|
39
|
-
@
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
48
|
-
end
|
49
|
-
if @configuration.raw_configuration.include?(:fallback)
|
50
|
-
@fallback = @configuration.raw_configuration[:fallback]
|
49
|
+
@default_configuration = configuration
|
50
|
+
|
51
|
+
if @default_configuration
|
52
|
+
|
53
|
+
append(@default_configuration.raw_configuration[:databases] || {})
|
54
|
+
|
55
|
+
if @default_configuration.raw_configuration.include?(:fallback)
|
56
|
+
@fallback = @default_configuration.raw_configuration[:fallback]
|
51
57
|
elsif defined?(Rails)
|
52
58
|
@fallback = %w(development test).include?(Rails.env)
|
53
59
|
else
|
54
60
|
@fallback = false
|
55
61
|
end
|
56
|
-
@default_candidate = Candidate.new(@
|
62
|
+
@default_candidate = Candidate.new('default', @default_configuration.default_pool)
|
57
63
|
unless @candidates.include?(:default)
|
58
64
|
@candidates[:default] = [@default_candidate]
|
59
65
|
end
|
60
66
|
end
|
61
67
|
end
|
68
|
+
|
69
|
+
def append(databases)
|
70
|
+
databases.each_pair do |name, config|
|
71
|
+
configs = config.is_a?(Array) ? config : [config]
|
72
|
+
configs.each do |config|
|
73
|
+
candidate = Candidate.new(name, @default_configuration.default_adapter.merge(config))
|
74
|
+
@candidates[name] ||= []
|
75
|
+
@candidates[name].push(candidate)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
62
79
|
|
63
80
|
def disconnect!
|
64
81
|
@candidates.values.flatten.each do |candidate|
|
@@ -84,6 +101,7 @@ module Multidb
|
|
84
101
|
Thread.current[:multidb_connection], connection
|
85
102
|
begin
|
86
103
|
result = yield
|
104
|
+
result = result.to_a if result.is_a?(ActiveRecord::Relation)
|
87
105
|
ensure
|
88
106
|
Thread.current[:multidb_connection] = previous_connection
|
89
107
|
end
|
@@ -118,4 +136,4 @@ module Multidb
|
|
118
136
|
|
119
137
|
end
|
120
138
|
|
121
|
-
end
|
139
|
+
end
|
@@ -1,26 +1,25 @@
|
|
1
1
|
require 'active_record/base'
|
2
2
|
|
3
3
|
module Multidb
|
4
|
+
module Connection
|
5
|
+
def establish_connection(spec = nil)
|
6
|
+
super(spec)
|
7
|
+
Multidb.init(connection_pool.spec.config)
|
8
|
+
end
|
9
|
+
|
10
|
+
def connection
|
11
|
+
Multidb.balancer.current_connection
|
12
|
+
rescue Multidb::NotInitializedError
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
4
17
|
module ModelExtensions
|
5
18
|
extend ActiveSupport::Concern
|
6
19
|
|
7
20
|
included do
|
8
21
|
class << self
|
9
|
-
|
10
|
-
alias_method_chain :connection, :multidb
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
module ClassMethods
|
15
|
-
def establish_connection_with_multidb(spec = nil)
|
16
|
-
establish_connection_without_multidb(spec)
|
17
|
-
Multidb.init(connection_pool.spec.config)
|
18
|
-
end
|
19
|
-
|
20
|
-
def connection_with_multidb
|
21
|
-
Multidb.balancer.current_connection
|
22
|
-
rescue Multidb::NotInitializedError
|
23
|
-
connection_without_multidb
|
22
|
+
prepend Multidb::Connection
|
24
23
|
end
|
25
24
|
end
|
26
25
|
end
|
data/lib/multidb/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module Multidb
|
2
|
-
VERSION = '0.
|
3
|
-
end
|
2
|
+
VERSION = '0.3'
|
3
|
+
end
|
data/spec/balancer_spec.rb
CHANGED
@@ -26,6 +26,23 @@ describe 'Multidb.balancer' do
|
|
26
26
|
|
27
27
|
Multidb.balancer.current_connection.should eq conn
|
28
28
|
end
|
29
|
+
|
30
|
+
context 'with additional configurations' do
|
31
|
+
before do
|
32
|
+
additional_configuration = {slave4: { database: 'spec/test-slave4.sqlite' }}
|
33
|
+
Multidb.balancer.append(additional_configuration)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'makes the new database available' do
|
37
|
+
Multidb.use(:slave4) do
|
38
|
+
conn = ActiveRecord::Base.connection
|
39
|
+
conn.should eq Multidb.balancer.current_connection
|
40
|
+
list = conn.execute('pragma database_list')
|
41
|
+
list.length.should eq 1
|
42
|
+
File.basename(list[0]['file']).should eq 'test-slave4.sqlite'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
29
46
|
end
|
30
47
|
|
31
48
|
describe '#use' do
|
@@ -65,6 +82,16 @@ describe 'Multidb.balancer' do
|
|
65
82
|
end
|
66
83
|
end
|
67
84
|
|
85
|
+
it 'returns results instead of relation' do
|
86
|
+
class FooBar < ActiveRecord::Base; end
|
87
|
+
res = Multidb.use(:slave1) do
|
88
|
+
ActiveRecord::Migration.verbose = false
|
89
|
+
ActiveRecord::Schema.define(version: 1) { create_table :foo_bars }
|
90
|
+
FooBar.where(id: 42)
|
91
|
+
end
|
92
|
+
res.should eq []
|
93
|
+
end
|
94
|
+
|
68
95
|
it 'returns supports nested slave connection' do
|
69
96
|
Multidb.use(:slave1) do
|
70
97
|
Multidb.use(:slave2) do
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,69 +1,95 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar-multidb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.3'
|
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: 2018-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '4.0'
|
20
|
+
- - "<="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '6.0'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- -
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '4.0'
|
30
|
+
- - "<="
|
25
31
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
32
|
+
version: '6.0'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: activerecord
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
|
-
- -
|
37
|
+
- - ">="
|
32
38
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
39
|
+
version: '4.0'
|
40
|
+
- - "<="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '6.0'
|
34
43
|
type: :runtime
|
35
44
|
prerelease: false
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
37
46
|
requirements:
|
38
|
-
- -
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '4.0'
|
50
|
+
- - "<="
|
39
51
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
52
|
+
version: '6.0'
|
41
53
|
- !ruby/object:Gem::Dependency
|
42
54
|
name: rspec
|
43
55
|
requirement: !ruby/object:Gem::Requirement
|
44
56
|
requirements:
|
45
|
-
- -
|
57
|
+
- - ">="
|
46
58
|
- !ruby/object:Gem::Version
|
47
59
|
version: '0'
|
48
60
|
type: :development
|
49
61
|
prerelease: false
|
50
62
|
version_requirements: !ruby/object:Gem::Requirement
|
51
63
|
requirements:
|
52
|
-
- -
|
64
|
+
- - ">="
|
53
65
|
- !ruby/object:Gem::Version
|
54
66
|
version: '0'
|
55
67
|
- !ruby/object:Gem::Dependency
|
56
68
|
name: sqlite3
|
57
69
|
requirement: !ruby/object:Gem::Requirement
|
58
70
|
requirements:
|
59
|
-
- -
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
type: :development
|
75
|
+
prerelease: false
|
76
|
+
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: rake
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
60
86
|
- !ruby/object:Gem::Version
|
61
87
|
version: '0'
|
62
88
|
type: :development
|
63
89
|
prerelease: false
|
64
90
|
version_requirements: !ruby/object:Gem::Requirement
|
65
91
|
requirements:
|
66
|
-
- -
|
92
|
+
- - ">="
|
67
93
|
- !ruby/object:Gem::Version
|
68
94
|
version: '0'
|
69
95
|
description: Multidb is an ActiveRecord extension for switching between multiple database
|
@@ -74,13 +100,15 @@ executables: []
|
|
74
100
|
extensions: []
|
75
101
|
extra_rdoc_files: []
|
76
102
|
files:
|
77
|
-
- .gitignore
|
78
|
-
- .travis.yml
|
103
|
+
- ".gitignore"
|
104
|
+
- ".travis.yml"
|
79
105
|
- Gemfile
|
80
106
|
- LICENSE
|
81
107
|
- README.markdown
|
82
108
|
- Rakefile
|
83
109
|
- ar-multidb.gemspec
|
110
|
+
- gemfiles/activerecord40.gemfile
|
111
|
+
- gemfiles/activerecord42.gemfile
|
84
112
|
- lib/ar-multidb.rb
|
85
113
|
- lib/multidb.rb
|
86
114
|
- lib/multidb/balancer.rb
|
@@ -99,17 +127,17 @@ require_paths:
|
|
99
127
|
- lib
|
100
128
|
required_ruby_version: !ruby/object:Gem::Requirement
|
101
129
|
requirements:
|
102
|
-
- -
|
130
|
+
- - ">="
|
103
131
|
- !ruby/object:Gem::Version
|
104
132
|
version: '0'
|
105
133
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
134
|
requirements:
|
107
|
-
- -
|
135
|
+
- - ">="
|
108
136
|
- !ruby/object:Gem::Version
|
109
137
|
version: '0'
|
110
138
|
requirements: []
|
111
139
|
rubyforge_project: ar-multidb
|
112
|
-
rubygems_version: 2.
|
140
|
+
rubygems_version: 2.5.2
|
113
141
|
signing_key:
|
114
142
|
specification_version: 4
|
115
143
|
summary: Multidb is an ActiveRecord extension for switching between multiple database
|
@@ -118,4 +146,3 @@ test_files:
|
|
118
146
|
- spec/balancer_spec.rb
|
119
147
|
- spec/helpers.rb
|
120
148
|
- spec/spec_helper.rb
|
121
|
-
has_rdoc:
|