active_record_shards 5.3.3 → 5.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e71e05125d6c15ad696e8243cb09234c09d29e1c381b47adeee2a81b0b79e188
4
- data.tar.gz: f06e143aabfc0e14d3058e03acc367e54d0219bcbf9355df57ee33e174393dbf
3
+ metadata.gz: fbcc8e394ddfa2267939c38fe1612c0c410f549ca6d45fc52469ccd564771fcd
4
+ data.tar.gz: 2e87a9063cfe63fe47d58d5bf8e7b84dc88755cb39f81b88db3954a8c5a65868
5
5
  SHA512:
6
- metadata.gz: 60629cde5e087c941d9ce3d753a57c5d73f37cbd78d9e7b0f6f1d921834c25267371a0b2e957a92112eac3f295a837a2a41681cda63dc3a6bfd981811dfbcd91
7
- data.tar.gz: 2c4e012130eead2088089cefb2204508141b3bd5056f733ccd26029fa053ae78b10b077750b64f5b364731b752842210086e368f813b3b1b333e9cdf2fecefb9
6
+ metadata.gz: 5eec3bce25a92f77f583a258efd2f054efce9f58b4e49c72be84e3cf352da02d7a8ab984ba349014dbe0f28b45cf347d2935512e97c88c349a9507b6338ce9f1
7
+ data.tar.gz: 4d9778bd1883639073fe77cf36a5de42de5d14ac1acd45303e80f4c37998a3c5ec00445578df9367a298c8d2c07111b2dd41e7cd6545b4e3f05f3b95d1eb2386
@@ -5,6 +5,7 @@ require 'active_record_shards/shard_support'
5
5
  module ActiveRecordShards
6
6
  module ConnectionSwitcher
7
7
  class LegacyConnectionHandlingError < StandardError; end
8
+ class IsolationLevelError < StandardError; end
8
9
 
9
10
  case "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"
10
11
  when '6.1', '7.0'
@@ -134,7 +135,8 @@ module ActiveRecordShards
134
135
  end
135
136
 
136
137
  def current_shard_selection
137
- Thread.current[:shard_selection] ||= ShardSelection.new
138
+ cs = Thread.current.thread_variable_get(:shard_selection) || ShardSelection.new
139
+ Thread.current.thread_variable_set(:shard_selection, cs)
138
140
  end
139
141
 
140
142
  def current_shard_id
@@ -177,6 +179,7 @@ module ActiveRecordShards
177
179
 
178
180
  def switch_connection(options)
179
181
  ensure_legacy_connection_handling if ActiveRecord.version >= Gem::Version.new('6.1')
182
+ ensure_thread_isolation_level if ActiveRecord.version >= Gem::Version.new('7.0')
180
183
 
181
184
  if options.any?
182
185
  if options.key?(:replica)
@@ -199,6 +202,12 @@ module ActiveRecordShards
199
202
  end
200
203
  end
201
204
 
205
+ def ensure_thread_isolation_level
206
+ unless ActiveSupport::IsolatedExecutionState.isolation_level == :thread
207
+ raise IsolationLevelError, "ActiveRecordShards is _only_ compatible when ActiveSupport::IsolatedExecutionState's isolation_level is set to :thread"
208
+ end
209
+ end
210
+
202
211
  def legacy_connection_handling_owner
203
212
  @legacy_connection_handling_owner ||=
204
213
  case "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"
@@ -29,21 +29,6 @@ module ActiveRecordShards
29
29
  RUBY
30
30
  end
31
31
 
32
- def transaction_with_replica_off(*args, &block)
33
- if on_replica_by_default?
34
- begin
35
- old_val = Thread.current[:_active_record_shards_in_tx]
36
- Thread.current[:_active_record_shards_in_tx] = true
37
- transaction_without_replica_off(*args, &block)
38
- ensure
39
- Thread.current[:_active_record_shards_in_tx] = old_val
40
- end
41
- else
42
- transaction_without_replica_off(*args, &block)
43
- end
44
- end
45
- ruby2_keywords(:transaction_with_replica_off) if respond_to?(:ruby2_keywords, true)
46
-
47
32
  module InstanceMethods
48
33
  def on_replica_unless_tx
49
34
  self.class.on_replica_unless_tx { yield }
@@ -80,17 +65,12 @@ module ActiveRecordShards
80
65
 
81
66
  base.class_eval do
82
67
  include InstanceMethods
83
-
84
- class << self
85
- alias_method :transaction_without_replica_off, :transaction
86
- alias_method :transaction, :transaction_with_replica_off
87
- end
88
68
  end
89
69
  end
90
70
 
91
71
  def on_replica_unless_tx(&block)
92
72
  return yield if Thread.current[:_active_record_shards_in_migration]
93
- return yield if Thread.current[:_active_record_shards_in_tx]
73
+ return yield if _in_transaction?
94
74
 
95
75
  if on_replica_by_default?
96
76
  on_replica(&block)
@@ -99,6 +79,10 @@ module ActiveRecordShards
99
79
  end
100
80
  end
101
81
 
82
+ def _in_transaction?
83
+ connected? && connection.transaction_open?
84
+ end
85
+
102
86
  def force_on_replica(&block)
103
87
  return yield if Thread.current[:_active_record_shards_in_migration]
104
88
 
@@ -122,7 +106,7 @@ module ActiveRecordShards
122
106
  module Rails52RelationPatches
123
107
  def connection
124
108
  return super if Thread.current[:_active_record_shards_in_migration]
125
- return super if Thread.current[:_active_record_shards_in_tx]
109
+ return super if _in_transaction?
126
110
 
127
111
  if @klass.on_replica_by_default?
128
112
  @klass.on_replica.connection
@@ -214,7 +198,7 @@ module ActiveRecordShards
214
198
  module TypeCasterConnectionConnectionPatch
215
199
  def connection
216
200
  return super if Thread.current[:_active_record_shards_in_migration]
217
- return super if Thread.current[:_active_record_shards_in_tx]
201
+ return super if ActiveRecord::Base._in_transaction?
218
202
 
219
203
  if @klass.on_replica_by_default?
220
204
  @klass.on_replica.connection
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_shards
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.3.3
4
+ version: 5.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Quorning
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2023-04-28 00:00:00.000000000 Z
16
+ date: 2023-08-03 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: activerecord
@@ -83,20 +83,6 @@ dependencies:
83
83
  - - ">="
84
84
  - !ruby/object:Gem::Version
85
85
  version: 5.10.0
86
- - !ruby/object:Gem::Dependency
87
- name: minitest-rg
88
- requirement: !ruby/object:Gem::Requirement
89
- requirements:
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- version: '0'
93
- type: :development
94
- prerelease: false
95
- version_requirements: !ruby/object:Gem::Requirement
96
- requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- version: '0'
100
86
  - !ruby/object:Gem::Dependency
101
87
  name: mysql2
102
88
  requirement: !ruby/object:Gem::Requirement