active_record_host_pool 1.2.5 → 2.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cef6cffe1f0c00bea6d588f48093d20abb29f87e9cdab6d84eba31f9b918a44e
4
- data.tar.gz: 9e443c3874c4b24b2955245dfa12183521386696937bc27d21ce9037b9e90ee5
3
+ metadata.gz: d6c85e552706dd86fe493aadff36c1c3cc6d9115ab9ee7bbfd627b3d684a02bd
4
+ data.tar.gz: 7effa38f67de9456d748027f27544bbc4f07afacba671c505dd8d23645648572
5
5
  SHA512:
6
- metadata.gz: 2cadfa3a2d2c582a71a3538692edd4fbde67e2266f98d6fdcc1133d40bd0db33969eca2ef1a0ef8ccb22b20a01fb263d76a7cfa88a877b3ac46b7d19d1852346
7
- data.tar.gz: 1ddd95edd00b9bd496cb861db3ecbc7be607c0174ca59e68ca4eebf2546137dff24881d4a6d3d4cc940fabcc1d5a1c9e7477df14c744f9e00814d7bcf5b5d29a
6
+ metadata.gz: 8119ce55b8f44d7e29f195228c7055c1fe3c771916fc3ff31cc51e2db3ed7064c14db2424b6fdebf0a0a086e894cfb33faa97d87f1a16d272bff54957d3e20b0
7
+ data.tar.gz: 885cb1e3676d698f93394eb8686af27d5b2d2f2d194f3e533a3a20f3272678a08caf92d6819d08002c989f637430f8eb4d9fddd66d5bbbdccafbbd006da44c57
data/Changelog.md ADDED
@@ -0,0 +1,115 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and as of v1.0.0 this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [2.0.0]
10
+
11
+ ### Added
12
+ - Add support for Rails 7.1.
13
+ - `Trilogy` is now a supported MySQL database adapter. ActiveRecordHostPool no longer requires `mysql2`, nor does it explicitly require `activerecord-trilogy-adapter`. Applications using ARHP will now need to explicitly require one of these adapters in its gemfile. When using `activerecord-trilogy-adapter` also ensure that the `trilogy` gem is locked to `v2.5.0+`.
14
+
15
+ ### Removed
16
+ - Remove `mysql2` as a direct dependency, test Rails 7.0 with `mysql2` and `activerecord-trilogy-adapter`.
17
+ - Remove support for Rails 5.1, 5.2, and 6.0.
18
+
19
+ ### Fixed
20
+ - Implement equality for connection proxies to consider database; allows fixture loading for different databases
21
+
22
+ ## [1.2.5] - 2023-07-14
23
+ ### Added
24
+ - Start testing with Ruby 3.2.
25
+
26
+ ### Removed
27
+ - Drop Ruby 2.6.
28
+
29
+ ### Fixed
30
+ - Use a mutex inside `PoolProxy#disconnect!`. This might fix some `ActiveRecord::ConnectionNotEstablished` issues when a multi-threaded application is under heavy load. (Only applies when using Rails 6.1 or newer).
31
+
32
+ ## [1.2.4] - 2023-03-20
33
+ ### Fixed
34
+ - Fixed the warning when using `ruby2_keywords` on `execute_with_switching`.
35
+ - Simplified the `clear_query_caches_for_current_thread` patch.
36
+
37
+ ## [1.2.3] - 2023-01-19
38
+ ### Fixed
39
+ - Fix the patch for `ActiveRecord::Base.clear_query_caches_for_current_thread` to work correctly right after the creation of a new connection pool. (https://github.com/zendesk/active_record_host_pool/pull/105)
40
+
41
+ ## [1.2.2] - 2023-01-18
42
+ ### Added
43
+ - Add a new `ActiveRecordHostPool::PoolProxy#_unproxied_connection` method which gives access to the underlying, "real", shared connection without going through the connection proxy, which would call `#_host_pool_current_database=` on the underlying connection. (https://github.com/zendesk/active_record_host_pool/pull/104)
44
+
45
+ ### Fixed
46
+ - Fix the patch for `ActiveRecord::Base.clear_on_handler` to work correctly right after the creation of a new connection pool. (https://github.com/zendesk/active_record_host_pool/pull/104)
47
+
48
+ ## [1.2.1] - 2022-12-23
49
+ ### Fixed
50
+ - Fix forwarding of kwargs when calling `#execute` in Rails 7. (https://github.com/zendesk/active_record_host_pool/pull/101)
51
+
52
+ ## [1.2.0] - 2022-10-13
53
+ ### Added
54
+ - Support for Rails 7.0 with [legacy_connection_handling=false and legacy_connection_handling=true](https://github.com/zendesk/active_record_host_pool/pull/95)
55
+ - Start testing with Ruby 3.0 & 3.1
56
+
57
+ ## [1.1.1] - 2022-08-26
58
+ ### Fixed
59
+ - Ensure that recently added files "lib/active_record_host_pool/pool_proxy_6_1.rb" and "lib/active_record_host_pool/pool_proxy_legacy.rb" are built into the shipped gem. (https://github.com/zendesk/active_record_host_pool/pull/92)
60
+
61
+ ## [1.1.0] - 2022-08-26
62
+ ### Added
63
+ - Support for Rails 6.1 with [legacy_connection_handling=false](https://github.com/zendesk/active_record_host_pool/pull/90) and [legacy_connection_handling=true](https://github.com/zendesk/active_record_host_pool/pull/88)
64
+
65
+ ### Removed
66
+ - Removed compatibility with Rails 4.2. (https://github.com/zendesk/active_record_host_pool/pull/71)
67
+ - Removed compatibility with Ruby 2.5 and lower. (https://github.com/zendesk/active_record_host_pool/pull/80)
68
+
69
+ ## [1.0.3] - 2021-02-09
70
+ ### Fixed
71
+ - Add missing file to the released gem. (https://github.com/zendesk/active_record_host_pool/pull/68)
72
+
73
+ ## [1.0.2] - 2021-02-09
74
+ ### Fixed
75
+ - Fix unintended connection switching while clearing query cache in Rails 6.0. (https://github.com/zendesk/active_record_host_pool/pull/61)
76
+
77
+ ## [1.0.1] - 2020-03-30
78
+ ### Fixed
79
+ - Fix connection leakage when calling `release_connection` on pre-Rails 5 applications. (https://github.com/zendesk/active_record_host_pool/pull/58)
80
+
81
+ ## [1.0.0] - 2020-02-25
82
+ ### Added
83
+ - Support for Rails 6.0.x. (https://github.com/zendesk/active_record_host_pool/pull/53)
84
+
85
+ ### Changed
86
+ - This gem now adheres to semantic versioning.
87
+
88
+ ## [0.13.0] - 2019-08-26
89
+ ### Added
90
+ - Support for Rails 5.2.3. (https://github.com/zendesk/active_record_host_pool/pull/48)
91
+
92
+ ### Removed
93
+ - Removed testing with EOL Ruby 2.3 (https://github.com/zendesk/active_record_host_pool/pull/49)
94
+
95
+ ## [0.12.0] - 2019-08-21
96
+ ### Added
97
+ - Start testing with Ruby 2.5
98
+ - Update Gem ownership (https://github.com/zendesk/active_record_host_pool/pull/38)
99
+
100
+ ### Removed
101
+ - Removed compatibility with Rails 3.2 and lower.
102
+ - Removed compatibility with Rails 5.0.
103
+ - Stop testing with Ruby 2.2.
104
+
105
+ ## [0.11.0] - 2018-04-24
106
+ ### Added
107
+ - Compatibility with Rails 5.1 (https://github.com/zendesk/active_record_host_pool/pull/31)
108
+ - Compatibility with Rails 5.2 (https://github.com/zendesk/active_record_host_pool/pull/32), (https://github.com/zendesk/active_record_host_pool/pull/34)
109
+
110
+ ### Removed
111
+ - Removed support for the mysql gem, and only support mysql2 (https://github.com/zendesk/active_record_host_pool/pull/35)
112
+
113
+ ## <= [0.10.1]
114
+
115
+ Unwritten
data/Readme.md CHANGED
@@ -43,7 +43,7 @@ test_pool_2 => 127.0.0.1/3306//root/false
43
43
 
44
44
  ## Support
45
45
 
46
- For now, the only backend known to work is MySQL, with the mysql2 gem.
46
+ For now, the only backend known to work is MySQL, with the mysql2 or activerecord-trilogy-adapter gem. When using the activerecord-trilogy-adapter ensure that the transitive dependency Trilogy is v2.5.0+.
47
47
  Postgres, from an informal reading of the docs, will never support the concept of one server connection sharing multiple dbs.
48
48
 
49
49
  ## Installation
@@ -62,11 +62,11 @@ You need a local user called 'john-doe'.
62
62
 
63
63
  With mysql running locally, run
64
64
 
65
- BUNDLE_GEMFILE=gemfiles/rails5.2.gemfile bundle exec rake test
65
+ BUNDLE_GEMFILE=gemfiles/rails6.1.gemfile bundle exec rake test
66
66
 
67
67
  Or
68
68
 
69
- BUNDLE_GEMFILE=gemfiles/rails5.2.gemfile ruby test/test_arhp.rb --seed 19911 --verbose
69
+ BUNDLE_GEMFILE=gemfiles/rails6.1.gemfile ruby test/test_arhp.rb --seed 19911 --verbose
70
70
 
71
71
  ## Copyright
72
72
 
@@ -17,30 +17,29 @@
17
17
  # This is a private Rails API and may change in future releases as they're
18
18
  # actively working on sharding in Rails 6 and above.
19
19
  module ActiveRecordHostPool
20
- # For Rails 6.1 & 7.0.
21
- module ClearOnHandlerPatch
22
- def clear_on_handler(handler)
23
- handler.all_connection_pools.each do |pool|
20
+ # For Rails 7.1.
21
+ module ClearQueryCachePatch
22
+ def clear_query_caches_for_current_thread
23
+ connection_handler.each_connection_pool do |pool|
24
24
  pool._unproxied_connection.clear_query_cache if pool.active_connection?
25
25
  end
26
26
  end
27
27
  end
28
28
 
29
- # For Rails 6.0.
30
- module ClearQueryCachePatch
31
- def clear_query_caches_for_current_thread
32
- ActiveRecord::Base.connection_handlers.each_value do |handler|
33
- handler.connection_pool_list.each do |pool|
34
- pool._unproxied_connection.clear_query_cache if pool.active_connection?
35
- end
29
+ # For Rails 6.1 & 7.0.
30
+ module ClearOnHandlerPatch
31
+ def clear_on_handler(handler)
32
+ handler.all_connection_pools.each do |pool|
33
+ pool._unproxied_connection.clear_query_cache if pool.active_connection?
36
34
  end
37
35
  end
38
36
  end
39
37
  end
40
38
 
41
39
  case "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"
42
- when '6.1', '7.0'
43
- ActiveRecord::Base.singleton_class.prepend(ActiveRecordHostPool::ClearOnHandlerPatch)
44
- when '6.0'
40
+ when "7.1"
41
+ # Fix https://github.com/rails/rails/commit/401e2f24161ed6047ae33c322aaf6584b7728ab9
45
42
  ActiveRecord::Base.singleton_class.prepend(ActiveRecordHostPool::ClearQueryCachePatch)
43
+ when "6.1", "7.0"
44
+ ActiveRecord::Base.singleton_class.prepend(ActiveRecordHostPool::ClearOnHandlerPatch)
46
45
  end
@@ -1,6 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_record/connection_adapters/mysql2_adapter"
3
+ case ActiveRecordHostPool.loaded_db_adapter
4
+ when :mysql2
5
+ require "active_record/connection_adapters/mysql2_adapter"
6
+ when :trilogy
7
+ case "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"
8
+ when "6.1", "7.0"
9
+ require "trilogy_adapter/connection"
10
+ require "trilogy_adapter/errors"
11
+ ActiveRecord::Base.extend(TrilogyAdapter::Connection)
12
+ when "7.1"
13
+ require "active_record/connection_adapters/trilogy_adapter"
14
+ else
15
+ raise "Unsupported version of Rails (v#{ActiveRecord::VERSION::STRING})"
16
+ end
17
+ end
4
18
 
5
19
  module ActiveRecordHostPool
6
20
  module DatabaseSwitch
@@ -8,8 +22,16 @@ module ActiveRecordHostPool
8
22
  base.class_eval do
9
23
  attr_reader(:_host_pool_current_database)
10
24
 
11
- alias_method :execute_without_switching, :execute
12
- alias_method :execute, :execute_with_switching
25
+ # Patch `raw_execute` instead of `execute` since this commit:
26
+ # https://github.com/rails/rails/commit/f69bbcbc0752ca5d5af327d55922614a26f5c7e9
27
+ case "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"
28
+ when "7.1"
29
+ alias_method :raw_execute_without_switching, :raw_execute
30
+ alias_method :raw_execute, :raw_execute_with_switching
31
+ else
32
+ alias_method :execute_without_switching, :execute
33
+ alias_method :execute, :execute_with_switching
34
+ end
13
35
 
14
36
  alias_method :drop_database_without_no_switching, :drop_database
15
37
  alias_method :drop_database, :drop_database_with_no_switching
@@ -34,13 +56,22 @@ module ActiveRecordHostPool
34
56
 
35
57
  def self.ruby2_keywords(*); end unless respond_to?(:ruby2_keywords, true)
36
58
  # This one really does need ruby2_keywords; in Rails 6.0 the method does not take
37
- # any keyword arguments, but in Rails 7.0 it does. So, we don't know whether or not
59
+ # any keyword arguments, but in Rails 7.0+ it does. So, we don't know whether or not
38
60
  # what we're delegating to takes kwargs, so ruby2_keywords is needed.
39
- ruby2_keywords def execute_with_switching(*args)
40
- if _host_pool_current_database && !_no_switch
41
- _switch_connection
61
+ if ActiveRecord.version >= Gem::Version.new("7.1")
62
+ ruby2_keywords def raw_execute_with_switching(*args)
63
+ if _host_pool_current_database && !_no_switch
64
+ _switch_connection
65
+ end
66
+ raw_execute_without_switching(*args)
67
+ end
68
+ else
69
+ ruby2_keywords def execute_with_switching(*args)
70
+ if _host_pool_current_database && !_no_switch
71
+ _switch_connection
72
+ end
73
+ execute_without_switching(*args)
42
74
  end
43
- execute_without_switching(*args)
44
75
  end
45
76
 
46
77
  def drop_database_with_no_switching(*args)
@@ -69,10 +100,10 @@ module ActiveRecordHostPool
69
100
 
70
101
  def _switch_connection
71
102
  if _host_pool_current_database &&
72
- (
73
- (_host_pool_current_database != @_cached_current_database) ||
74
- @connection.object_id != @_cached_connection_object_id
75
- )
103
+ (
104
+ (_host_pool_current_database != @_cached_current_database) ||
105
+ @connection.object_id != @_cached_connection_object_id
106
+ )
76
107
  log("select_db #{_host_pool_current_database}", "SQL") do
77
108
  clear_cache!
78
109
  raw_connection.select_db(_host_pool_current_database)
@@ -97,36 +128,11 @@ module ActiveRecordHostPool
97
128
  end
98
129
  end
99
130
 
100
- module ActiveRecord
101
- module ConnectionAdapters
102
- class ConnectionHandler
103
- case "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"
104
- when '6.1', '7.0'
105
-
106
- :noop
107
-
108
- when '5.1', '5.2', '6.0'
109
-
110
- def establish_connection(spec)
111
- resolver = ConnectionAdapters::ConnectionSpecification::Resolver.new(Base.configurations)
112
- spec = resolver.spec(spec)
113
-
114
- owner_to_pool[spec.name] = ActiveRecordHostPool::PoolProxy.new(spec)
115
- end
116
-
117
- else
118
-
119
- raise "Unsupported version of Rails (v#{ActiveRecord::VERSION::STRING})"
120
- end
121
- end
122
- end
131
+ case ActiveRecordHostPool.loaded_db_adapter
132
+ when :mysql2
133
+ ActiveRecord::ConnectionAdapters::Mysql2Adapter.include(ActiveRecordHostPool::DatabaseSwitch)
134
+ when :trilogy
135
+ ActiveRecord::ConnectionAdapters::TrilogyAdapter.include(ActiveRecordHostPool::DatabaseSwitch)
123
136
  end
124
137
 
125
- ActiveRecord::ConnectionAdapters::Mysql2Adapter.include(ActiveRecordHostPool::DatabaseSwitch)
126
-
127
- # In Rails 6.1 Connection Pools are no longer instantiated in #establish_connection but in a
128
- # new pool method.
129
- case "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"
130
- when '6.1', '7.0'
131
- ActiveRecord::ConnectionAdapters::PoolConfig.prepend(ActiveRecordHostPool::PoolConfigPatch)
132
- end
138
+ ActiveRecord::ConnectionAdapters::PoolConfig.prepend(ActiveRecordHostPool::PoolConfigPatch)
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'delegate'
3
+ require "delegate"
4
4
 
5
5
  # the ConnectionProxy sits between user-code and a real connection and says "I expect to be on this database"
6
6
  # for each call to the connection. upon executing a statement, the connection will switch to that database.
7
7
  module ActiveRecordHostPool
8
8
  class ConnectionProxy < Delegator
9
+ attr_reader :database
9
10
  def initialize(cx, database)
10
11
  super(cx)
11
12
  @cx = cx
@@ -52,6 +53,18 @@ module ActiveRecordHostPool
52
53
  end
53
54
  ruby2_keywords :send if respond_to?(:ruby2_keywords, true)
54
55
 
56
+ def ==(other)
57
+ self.class == other.class &&
58
+ other.respond_to?(:unproxied) && @cx == other.unproxied &&
59
+ other.respond_to?(:database) && @database == other.database
60
+ end
61
+
62
+ alias_method :eql?, :==
63
+
64
+ def hash
65
+ [self.class, @cx, @database].hash
66
+ end
67
+
55
68
  private
56
69
 
57
70
  def select(*args)
@@ -1,8 +1,185 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- case "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"
4
- when '6.1', '7.0'
5
- require 'active_record_host_pool/pool_proxy_6_1'
6
- else
7
- require 'active_record_host_pool/pool_proxy_legacy'
3
+ require "delegate"
4
+ require "active_record"
5
+ require "active_record_host_pool/connection_adapter_mixin"
6
+ require "mutex_m"
7
+
8
+ # this module sits in between ConnectionHandler and a bunch of different ConnectionPools (one per host).
9
+ # when a connection is requested, it goes like:
10
+ # ActiveRecordClass -> ConnectionHandler#connection
11
+ # ConnectionHandler#connection -> (find or create PoolProxy)
12
+ # PoolProxy -> shared list of Pools
13
+ # Pool actually gives back a connection, then PoolProxy turns this
14
+ # into a ConnectionProxy that can inform (on execute) which db we should be on.
15
+
16
+ module ActiveRecordHostPool
17
+ # Sits between ConnectionHandler and a bunch of different ConnectionPools (one per host).
18
+ class PoolProxy < Delegator
19
+ include Mutex_m
20
+
21
+ case ActiveRecordHostPool.loaded_db_adapter
22
+ when :mysql2
23
+ RESCUABLE_DB_ERROR = Mysql2::Error
24
+ when :trilogy
25
+ RESCUABLE_DB_ERROR = Trilogy::ProtocolError
26
+ end
27
+
28
+ def initialize(pool_config)
29
+ super(pool_config)
30
+ @pool_config = pool_config
31
+ @config = pool_config.db_config.configuration_hash
32
+ end
33
+
34
+ def __getobj__
35
+ _connection_pool
36
+ end
37
+
38
+ def __setobj__(pool_config)
39
+ @pool_config = pool_config
40
+ @config = pool_config.db_config.configuration_hash
41
+ @_pool_key = nil
42
+ end
43
+
44
+ attr_reader :pool_config
45
+
46
+ def connection(*args)
47
+ real_connection = _unproxied_connection(*args)
48
+ _connection_proxy_for(real_connection, @config[:database])
49
+ rescue RESCUABLE_DB_ERROR, ActiveRecord::NoDatabaseError, ActiveRecord::StatementInvalid
50
+ _connection_pools.delete(_pool_key)
51
+ Kernel.raise
52
+ end
53
+
54
+ def _unproxied_connection(*args)
55
+ _connection_pool.connection(*args)
56
+ end
57
+
58
+ # by the time we are patched into ActiveRecord, the current thread has already established
59
+ # a connection. thus we need to patch both connection and checkout/checkin
60
+ def checkout(*args, &block)
61
+ cx = _connection_pool.checkout(*args, &block)
62
+ _connection_proxy_for(cx, @config[:database])
63
+ end
64
+
65
+ def checkin(cx)
66
+ cx = cx.unproxied
67
+ _connection_pool.checkin(cx)
68
+ end
69
+
70
+ def with_connection
71
+ cx = checkout
72
+ yield cx
73
+ ensure
74
+ checkin cx
75
+ end
76
+
77
+ def disconnect!
78
+ p = _connection_pool(false)
79
+ return unless p
80
+
81
+ synchronize do
82
+ p.disconnect!
83
+ p.automatic_reconnect = true
84
+ _clear_connection_proxy_cache
85
+ end
86
+ end
87
+
88
+ def automatic_reconnect=(value)
89
+ p = _connection_pool(false)
90
+ return unless p
91
+
92
+ p.automatic_reconnect = value
93
+ end
94
+
95
+ def clear_reloadable_connections!
96
+ _connection_pool.clear_reloadable_connections!
97
+ _clear_connection_proxy_cache
98
+ end
99
+
100
+ def release_connection(*args)
101
+ p = _connection_pool(false)
102
+ return unless p
103
+
104
+ p.release_connection(*args)
105
+ end
106
+
107
+ def flush!
108
+ p = _connection_pool(false)
109
+ return unless p
110
+
111
+ p.flush!
112
+ end
113
+
114
+ def discard!
115
+ p = _connection_pool(false)
116
+ return unless p
117
+
118
+ p.discard!
119
+
120
+ # All connections in the pool (even if they're currently
121
+ # leased!) have just been discarded, along with the pool itself.
122
+ # Any further interaction with the pool (except #pool_config and #schema_cache)
123
+ # is undefined.
124
+ # Remove the connection for the given key so a new one can be created in its place
125
+ _connection_pools.delete(_pool_key)
126
+ end
127
+
128
+ private
129
+
130
+ def _connection_pools
131
+ @@_connection_pools ||= {}
132
+ end
133
+
134
+ def _pool_key
135
+ @_pool_key ||= "#{@config[:host]}/#{@config[:port]}/#{@config[:socket]}/" \
136
+ "#{@config[:username]}/#{replica_configuration? && "replica"}"
137
+ end
138
+
139
+ def _connection_pool(auto_create = true)
140
+ pool = _connection_pools[_pool_key]
141
+ if pool.nil? && auto_create
142
+ pool = _connection_pools[_pool_key] = ActiveRecord::ConnectionAdapters::ConnectionPool.new(@pool_config)
143
+ end
144
+ pool
145
+ end
146
+
147
+ # Work around https://github.com/rails/rails/pull/48061/commits/63c0d6b31bcd0fc33745ec6fd278b2d1aab9be54
148
+ # standard:disable Lint/DuplicateMethods
149
+ case "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"
150
+ when "6.1", "7.0"
151
+ def _connection_proxy_for(connection, database)
152
+ @connection_proxy_cache ||= {}
153
+ key = [connection, database]
154
+
155
+ @connection_proxy_cache[key] ||= begin
156
+ cx = ActiveRecordHostPool::ConnectionProxy.new(connection, database)
157
+ cx.execute("SELECT 1")
158
+
159
+ cx
160
+ end
161
+ end
162
+ else
163
+ def _connection_proxy_for(connection, database)
164
+ @connection_proxy_cache ||= {}
165
+ key = [connection, database]
166
+
167
+ @connection_proxy_cache[key] ||= begin
168
+ cx = ActiveRecordHostPool::ConnectionProxy.new(connection, database)
169
+ cx.raw_execute("SELECT 1", "ARHP SWITCH DB")
170
+
171
+ cx
172
+ end
173
+ end
174
+ end
175
+ # standard:enable Lint/DuplicateMethods
176
+
177
+ def _clear_connection_proxy_cache
178
+ @connection_proxy_cache = {}
179
+ end
180
+
181
+ def replica_configuration?
182
+ @config[:replica] || @config[:slave]
183
+ end
184
+ end
8
185
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecordHostPool
4
- VERSION = "1.2.5"
4
+ VERSION = "2.0.0"
5
5
  end
@@ -1,14 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_record'
4
- require 'active_record/base'
5
- require 'active_record/connection_adapters/abstract_adapter'
6
-
7
- require 'active_record_host_pool/clear_query_cache_patch'
8
- require 'active_record_host_pool/connection_proxy'
9
- require 'active_record_host_pool/pool_proxy'
10
- require 'active_record_host_pool/connection_adapter_mixin'
11
- require 'active_record_host_pool/version'
3
+ require "active_record"
4
+ require "active_record/base"
5
+ require "active_record/connection_adapters/abstract_adapter"
12
6
 
13
7
  module ActiveRecordHostPool
8
+ class << self
9
+ attr_accessor :loaded_db_adapter
10
+ end
11
+ end
12
+
13
+ if Gem.loaded_specs.include?("mysql2")
14
+ require "mysql2"
15
+ ActiveRecordHostPool.loaded_db_adapter = :mysql2
16
+ elsif Gem.loaded_specs.include?("trilogy")
17
+ require "trilogy"
18
+ require "activerecord-trilogy-adapter" if ActiveRecord.version < Gem::Version.new("7.1")
19
+ ActiveRecordHostPool.loaded_db_adapter = :trilogy
14
20
  end
21
+
22
+ require "active_record_host_pool/clear_query_cache_patch"
23
+ require "active_record_host_pool/connection_proxy"
24
+ require "active_record_host_pool/pool_proxy"
25
+ require "active_record_host_pool/connection_adapter_mixin"
26
+ require "active_record_host_pool/version"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_host_pool
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.5
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Quorning
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2023-07-14 00:00:00.000000000 Z
14
+ date: 2024-01-08 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activerecord
@@ -19,34 +19,20 @@ dependencies:
19
19
  requirements:
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 5.1.0
22
+ version: 6.1.0
23
23
  - - "<"
24
24
  - !ruby/object:Gem::Version
25
- version: '7.1'
25
+ version: '7.2'
26
26
  type: :runtime
27
27
  prerelease: false
28
28
  version_requirements: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 5.1.0
32
+ version: 6.1.0
33
33
  - - "<"
34
34
  - !ruby/object:Gem::Version
35
- version: '7.1'
36
- - !ruby/object:Gem::Dependency
37
- name: mysql2
38
- requirement: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: '0'
43
- type: :runtime
44
- prerelease: false
45
- version_requirements: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: '0'
35
+ version: '7.2'
50
36
  description: ''
51
37
  email:
52
38
  - bquorning@zendesk.com
@@ -58,6 +44,7 @@ extra_rdoc_files:
58
44
  - MIT-LICENSE
59
45
  - Readme.md
60
46
  files:
47
+ - Changelog.md
61
48
  - MIT-LICENSE
62
49
  - Readme.md
63
50
  - lib/active_record_host_pool.rb
@@ -65,13 +52,7 @@ files:
65
52
  - lib/active_record_host_pool/connection_adapter_mixin.rb
66
53
  - lib/active_record_host_pool/connection_proxy.rb
67
54
  - lib/active_record_host_pool/pool_proxy.rb
68
- - lib/active_record_host_pool/pool_proxy_6_1.rb
69
- - lib/active_record_host_pool/pool_proxy_legacy.rb
70
55
  - lib/active_record_host_pool/version.rb
71
- - test/database.yml
72
- - test/helper.rb
73
- - test/schema.rb
74
- - test/test_arhp.rb
75
56
  homepage: https://github.com/zendesk/active_record_host_pool
76
57
  licenses:
77
58
  - MIT
@@ -96,8 +77,4 @@ signing_key:
96
77
  specification_version: 4
97
78
  summary: Allow ActiveRecord to share a connection to multiple databases on the same
98
79
  host
99
- test_files:
100
- - test/database.yml
101
- - test/helper.rb
102
- - test/schema.rb
103
- - test/test_arhp.rb
80
+ test_files: []