activerecord_autoreplica 1.1.0 → 1.2.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 +17 -0
- data/.yardopts +1 -0
- data/Gemfile +2 -0
- data/README.md +6 -2
- data/Rakefile +1 -1
- data/activerecord_autoreplica.gemspec +13 -5
- data/gemfiles/Gemfile.rails-3.2.x +1 -0
- data/gemfiles/Gemfile.rails-4.1.x +1 -0
- data/gemfiles/Gemfile.rails-5.0.x +13 -0
- data/lib/activerecord_autoreplica.rb +33 -4
- metadata +34 -4
- data/.gitlab-ci.yml +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ed3fdce7e191b78e8bc24c13cc926cb9b625052
|
4
|
+
data.tar.gz: 02bdd2ae70931f1a7376a9264bf6a5ac6442275e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa680e51be925cbe09927aa323e44be88fd26cf82b799474761bbae59a135a2123e1f459e9e350f9949eb58462338e7dc433558aaa9156463d8881fe141f82cf
|
7
|
+
data.tar.gz: 7db0c18d68ed48fdbf428d56bff0f49a1ec5137ef8f5c10e695eef9d41ec3e860a52ffff11256eb2525f98c7b004ecf1b4e465d8fa711e1d1dde932252250f5f
|
data/.travis.yml
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
gemfile:
|
2
|
+
- gemfiles/Gemfile.rails-3.2.x
|
3
|
+
- gemfiles/Gemfile.rails-4.1.x
|
4
|
+
- gemfiles/Gemfile.rails-5.0.x
|
5
|
+
rvm:
|
6
|
+
- 2.0.0
|
7
|
+
- 2.1.1
|
8
|
+
- 2.2.5
|
9
|
+
- 2.3.0
|
10
|
+
matrix:
|
11
|
+
exclude:
|
12
|
+
- rvm: 2.0.0
|
13
|
+
gemfile: gemfiles/Gemfile.rails-5.0.x
|
14
|
+
- rvm: 2.1.1
|
15
|
+
gemfile: gemfiles/Gemfile.rails-5.0.x
|
16
|
+
cache: bundler
|
17
|
+
sudo: false
|
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--markup markdown
|
data/Gemfile
CHANGED
@@ -11,6 +11,8 @@ gem 'activerecord', "> 3.0"
|
|
11
11
|
# Add dependencies to develop your gem here.
|
12
12
|
# Include everything needed to run rake, tests, features, etc.
|
13
13
|
group :development do
|
14
|
+
gem 'rake', '~> 10.0'
|
15
|
+
gem 'yard'
|
14
16
|
gem 'sqlite3'
|
15
17
|
gem "rspec", "~> 2.4"
|
16
18
|
gem "rdoc", "~> 3.12"
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# activerecord_autoreplica
|
2
2
|
|
3
|
+
[](https://travis-ci.org/WeTransfer/activerecord_autoreplica)
|
4
|
+
|
3
5
|
An automatic ActiveRecord connection multiplexer, and is a reimplementation of / greatly inspired by
|
4
6
|
the [makara gem](https://github.com/taskrabbit/makara)
|
5
7
|
|
@@ -64,10 +66,12 @@ files are going to be erased on test completion.
|
|
64
66
|
|
65
67
|
There are Gemfiles for testing against various versions of ActiveRecord. To run those, use:
|
66
68
|
|
69
|
+
$ BUNDLE_GEMFILE=gemfiles/Gemfile.rails-5.0.x bundle exec rake
|
67
70
|
$ BUNDLE_GEMFILE=gemfiles/Gemfile.rails-4.1.x bundle exec rake
|
68
71
|
$ BUNDLE_GEMFILE=gemfiles/Gemfile.rails-3.2.x bundle exec rake
|
69
72
|
|
70
|
-
The library contains a couple of switches that allow it to function in
|
73
|
+
The library contains a couple of switches that allow it to function in all these Rails versions.
|
74
|
+
Rails 3.x support is likely to be dropped in the next major version.
|
71
75
|
|
72
76
|
### Versioning
|
73
77
|
|
@@ -85,6 +89,6 @@ The gem version is specified in the Rakefile.
|
|
85
89
|
|
86
90
|
### Copyright
|
87
91
|
|
88
|
-
Copyright (c) 2014
|
92
|
+
Copyright (c) 2014 WeTransfer. See LICENSE.txt for
|
89
93
|
further details.
|
90
94
|
|
data/Rakefile
CHANGED
@@ -13,7 +13,7 @@ require 'rake'
|
|
13
13
|
|
14
14
|
require 'jeweler'
|
15
15
|
Jeweler::Tasks.new do |gem|
|
16
|
-
gem.version = '1.
|
16
|
+
gem.version = '1.2.0'
|
17
17
|
# gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
|
18
18
|
gem.name = "activerecord_autoreplica"
|
19
19
|
gem.homepage = "http://github.com/WeTransfer/activerecord_autoreplica"
|
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: activerecord_autoreplica 1.
|
5
|
+
# stub: activerecord_autoreplica 1.2.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "activerecord_autoreplica"
|
9
|
-
s.version = "1.
|
9
|
+
s.version = "1.2.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Julik Tarkhanov"]
|
14
|
-
s.date = "
|
14
|
+
s.date = "2016-10-23"
|
15
15
|
s.description = " Redirect all SELECT queries to a separate connection within a block "
|
16
16
|
s.email = "me@julik.nl"
|
17
17
|
s.extra_rdoc_files = [
|
@@ -20,7 +20,8 @@ Gem::Specification.new do |s|
|
|
20
20
|
]
|
21
21
|
s.files = [
|
22
22
|
".document",
|
23
|
-
".
|
23
|
+
".travis.yml",
|
24
|
+
".yardopts",
|
24
25
|
"Gemfile",
|
25
26
|
"LICENSE.txt",
|
26
27
|
"README.md",
|
@@ -28,13 +29,14 @@ Gem::Specification.new do |s|
|
|
28
29
|
"activerecord_autoreplica.gemspec",
|
29
30
|
"gemfiles/Gemfile.rails-3.2.x",
|
30
31
|
"gemfiles/Gemfile.rails-4.1.x",
|
32
|
+
"gemfiles/Gemfile.rails-5.0.x",
|
31
33
|
"lib/activerecord_autoreplica.rb",
|
32
34
|
"spec/activerecord_autoreplica_spec.rb",
|
33
35
|
"spec/helper.rb"
|
34
36
|
]
|
35
37
|
s.homepage = "http://github.com/WeTransfer/activerecord_autoreplica"
|
36
38
|
s.licenses = ["MIT"]
|
37
|
-
s.rubygems_version = "2.
|
39
|
+
s.rubygems_version = "2.4.5.1"
|
38
40
|
s.summary = "Palatable-size read replica adapter for ActiveRecord"
|
39
41
|
|
40
42
|
if s.respond_to? :specification_version then
|
@@ -42,6 +44,8 @@ Gem::Specification.new do |s|
|
|
42
44
|
|
43
45
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
46
|
s.add_runtime_dependency(%q<activerecord>, ["> 3.0"])
|
47
|
+
s.add_development_dependency(%q<rake>, ["~> 10.0"])
|
48
|
+
s.add_development_dependency(%q<yard>, [">= 0"])
|
45
49
|
s.add_development_dependency(%q<sqlite3>, [">= 0"])
|
46
50
|
s.add_development_dependency(%q<rspec>, ["~> 2.4"])
|
47
51
|
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
@@ -49,6 +53,8 @@ Gem::Specification.new do |s|
|
|
49
53
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
50
54
|
else
|
51
55
|
s.add_dependency(%q<activerecord>, ["> 3.0"])
|
56
|
+
s.add_dependency(%q<rake>, ["~> 10.0"])
|
57
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
52
58
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
53
59
|
s.add_dependency(%q<rspec>, ["~> 2.4"])
|
54
60
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
@@ -57,6 +63,8 @@ Gem::Specification.new do |s|
|
|
57
63
|
end
|
58
64
|
else
|
59
65
|
s.add_dependency(%q<activerecord>, ["> 3.0"])
|
66
|
+
s.add_dependency(%q<rake>, ["~> 10.0"])
|
67
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
60
68
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
61
69
|
s.add_dependency(%q<rspec>, ["~> 2.4"])
|
62
70
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
@@ -0,0 +1,13 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
gem 'activerecord', "~> 5"
|
3
|
+
|
4
|
+
# Add dependencies to develop your gem here.
|
5
|
+
# Include everything needed to run rake, tests, features, etc.
|
6
|
+
group :development do
|
7
|
+
gem 'rake', '~> 10.0'
|
8
|
+
gem 'sqlite3'
|
9
|
+
gem "rspec", "~> 2.4"
|
10
|
+
gem "rdoc", "~> 3.12"
|
11
|
+
gem "bundler", "~> 1.0"
|
12
|
+
gem "jeweler", "1.8.4" # The last without Nokogiri
|
13
|
+
end
|
@@ -32,8 +32,22 @@
|
|
32
32
|
# Once the block exits, the original connection handler is reassigned to the AR connection_pool.
|
33
33
|
module AutoReplica
|
34
34
|
# The first one is used in ActiveRecord 3+, the second one in 4+
|
35
|
-
ConnectionSpecification =
|
36
|
-
|
35
|
+
ConnectionSpecification = begin
|
36
|
+
ActiveRecord::Base::ConnectionSpecification
|
37
|
+
rescue
|
38
|
+
ActiveRecord::ConnectionAdapters::ConnectionSpecification
|
39
|
+
end
|
40
|
+
|
41
|
+
# Runs a given block with all SELECT statements being executed against the read slave
|
42
|
+
# database.
|
43
|
+
#
|
44
|
+
# AutoReplica.using_read_replica_at(:adapter => 'mysql2', :datbase => 'read_replica', ...) do
|
45
|
+
# customer = Customer.find(3) # Will SELECT from the replica database at the connection spec passed to the block
|
46
|
+
# customer.register_complaint! # Will UPDATE to the master database connection
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
# @param replica_connection_spec_hash_or_url[String, Hash] an ActiveRecord connection specification or a DSN URL
|
50
|
+
# @return [void]
|
37
51
|
def self.using_read_replica_at(replica_connection_spec_hash_or_url)
|
38
52
|
return yield if @in_replica_context # This method should not be reentrant
|
39
53
|
|
@@ -60,8 +74,12 @@ module AutoReplica
|
|
60
74
|
end
|
61
75
|
end
|
62
76
|
|
63
|
-
# Resolve an ActiveRecord connection URL
|
77
|
+
# Resolve an ActiveRecord connection URL, from a string to a Hash.
|
78
|
+
#
|
79
|
+
# @param url_string[String] the connection URL (like `sqlite3://...`)
|
80
|
+
# @return [Hash] a symbol-keyed ActiveRecord connection specification
|
64
81
|
def self.resolve_connection_url(url_string)
|
82
|
+
# TODO: privatize this method.
|
65
83
|
if defined?(ActiveRecord::Base::ConnectionSpecification::Resolver) # AR3
|
66
84
|
resolver = ActiveRecord::Base::ConnectionSpecification::Resolver.new(url_string, {})
|
67
85
|
resolver.send(:connection_url_to_hash, url_string) # Because making this public was so hard
|
@@ -80,7 +98,11 @@ module AutoReplica
|
|
80
98
|
# We need to maintain our own pool for read replica connections,
|
81
99
|
# aside from the one managed by Rails proper.
|
82
100
|
adapter_method = "%s_connection" % connection_specification_hash[:adapter]
|
83
|
-
connection_specification =
|
101
|
+
connection_specification = begin
|
102
|
+
ConnectionSpecification.new('autoreplica', connection_specification_hash, adapter_method)
|
103
|
+
rescue ArgumentError # AR 4 and lower wants 2 arguments
|
104
|
+
ConnectionSpecification.new(connection_specification_hash, adapter_method)
|
105
|
+
end
|
84
106
|
@read_pool = ActiveRecord::ConnectionAdapters::ConnectionPool.new(connection_specification)
|
85
107
|
end
|
86
108
|
|
@@ -147,4 +169,11 @@ module AutoReplica
|
|
147
169
|
@master_connection.public_send(method_name, *args, &blk)
|
148
170
|
end
|
149
171
|
end
|
172
|
+
|
173
|
+
# if respond_to?(:private_constant)
|
174
|
+
# private_constant :ConnectionSpecification
|
175
|
+
# private_constant :ConnectionHandler
|
176
|
+
# private_constant :Adapter
|
177
|
+
# end
|
178
|
+
|
150
179
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord_autoreplica
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julik Tarkhanov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - ">"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: yard
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: sqlite3
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -103,7 +131,8 @@ extra_rdoc_files:
|
|
103
131
|
- README.md
|
104
132
|
files:
|
105
133
|
- ".document"
|
106
|
-
- ".
|
134
|
+
- ".travis.yml"
|
135
|
+
- ".yardopts"
|
107
136
|
- Gemfile
|
108
137
|
- LICENSE.txt
|
109
138
|
- README.md
|
@@ -111,6 +140,7 @@ files:
|
|
111
140
|
- activerecord_autoreplica.gemspec
|
112
141
|
- gemfiles/Gemfile.rails-3.2.x
|
113
142
|
- gemfiles/Gemfile.rails-4.1.x
|
143
|
+
- gemfiles/Gemfile.rails-5.0.x
|
114
144
|
- lib/activerecord_autoreplica.rb
|
115
145
|
- spec/activerecord_autoreplica_spec.rb
|
116
146
|
- spec/helper.rb
|
@@ -134,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
134
164
|
version: '0'
|
135
165
|
requirements: []
|
136
166
|
rubyforge_project:
|
137
|
-
rubygems_version: 2.
|
167
|
+
rubygems_version: 2.4.5.1
|
138
168
|
signing_key:
|
139
169
|
specification_version: 4
|
140
170
|
summary: Palatable-size read replica adapter for ActiveRecord
|
data/.gitlab-ci.yml
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
# This file is generated by GitLab CI
|
2
|
-
rake-ar4:
|
3
|
-
script:
|
4
|
-
- "apt-get update && apt-get install -y libsqlite3-dev"
|
5
|
-
- git submodule update --init
|
6
|
-
- ls -la
|
7
|
-
- gem install bundler
|
8
|
-
- apt-get install libsqlite3-dev -y
|
9
|
-
- bundle config --global jobs 4
|
10
|
-
- bundle config --global path /cache/gems
|
11
|
-
- bundle config build.nokogiri "--use-system-libraries --with-xml2-include=/usr/include/libxml2"
|
12
|
-
- BUNDLE_GEMFILE=gemfiles/Gemfile.rails-4.1.x bundle install
|
13
|
-
- BUNDLE_GEMFILE=gemfiles/Gemfile.rails-4.1.x bundle exec rake
|
14
|
-
tags:
|
15
|
-
- ruby
|
16
|
-
rake-ar3:
|
17
|
-
script:
|
18
|
-
- "apt-get update && apt-get install -y libsqlite3-dev"
|
19
|
-
- git submodule update --init
|
20
|
-
- ls -la
|
21
|
-
- gem install bundler
|
22
|
-
- bundle config --global jobs 4
|
23
|
-
- bundle config --global path /cache/gems
|
24
|
-
- bundle config build.nokogiri "--use-system-libraries --with-xml2-include=/usr/include/libxml2"
|
25
|
-
- BUNDLE_GEMFILE=gemfiles/Gemfile.rails-3.2.x bundle install
|
26
|
-
- BUNDLE_GEMFILE=gemfiles/Gemfile.rails-3.2.x bundle exec rake
|
27
|
-
tags:
|
28
|
-
- ruby
|