rails_failover 0.3.0 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 307117d6a7083a17a2bf2799737f6f9be3afa77a58bace4f867bedf38fa05a5c
4
- data.tar.gz: 9d9d54a7a46785f259ba3f19aad402534de7b5305bd57993cb9c92fd14efad3b
3
+ metadata.gz: 7fc58e5f3f5cbc45985b03f862b138aea0ef7723a2a8bba5625f4dea0efae6ee
4
+ data.tar.gz: c1703a05fd75b726bb3b30d06d87b038651e5a6a178a397eb6f6ced1c7b91e18
5
5
  SHA512:
6
- metadata.gz: 7c45a722a9d8bbe1d0ea1410630252c5485496a49b6affe5461615779102d25bfafbf0d990bce920d8e52f164ebe1b92e94a1ccd1787d526b98cba54fc039d45
7
- data.tar.gz: 3dcd9668ef0266b91c35cb3764533fab3624025a3d4dd6db86ce1adafb8168c9d72dde14bbd57fbcb73f7f0049941e6b077eaba519b70b3fa1b03eb92d730b64
6
+ metadata.gz: 9bf3eb493c5ae85af24d7ada304b70af918b4feb34b7b9ca6ee498559b228add84aa93bff0e56d4114c11459bf3ff0ca822c1528f06b94f24a105a1a29b3b8bd
7
+ data.tar.gz: 118761f0ae8c211e171c9bde1d2dbddb2967c5f5b7ed6da535e1ef318761f27701f64dac92579cad983b64307c4ad21e15bb1b600d07e45ae56963047252fe38
data/Gemfile CHANGED
@@ -16,4 +16,5 @@ group :development, :test do
16
16
  gem 'redis', '~> 4.1'
17
17
  gem 'pg', '~> 1.2'
18
18
  gem 'activerecord', '~> 6.0'
19
+ gem 'rack'
19
20
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rails_failover (0.3.0)
4
+ rails_failover (0.4.0)
5
5
  activerecord (~> 6.0)
6
6
  listen (~> 3.2)
7
7
  railties (~> 6.0)
@@ -119,6 +119,7 @@ DEPENDENCIES
119
119
  activerecord (~> 6.0)
120
120
  byebug
121
121
  pg (~> 1.2)
122
+ rack
122
123
  rails_failover!
123
124
  rake (~> 12.0)
124
125
  redis (~> 4.1)
@@ -1,7 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_record'
4
- require_relative 'active_record/railtie'
4
+
5
+ if defined?(::Rails)
6
+ require_relative 'active_record/railtie'
7
+ end
8
+
5
9
  require_relative 'active_record/middleware'
6
10
  require_relative 'active_record/handler'
7
11
 
@@ -37,5 +41,9 @@ module RailsFailover
37
41
  handler.establish_connection(replica_config)
38
42
  end
39
43
  end
44
+
45
+ def self.register_force_reading_role_callback(&block)
46
+ Middleware.force_reading_role_callback = block
47
+ end
40
48
  end
41
49
  end
@@ -3,6 +3,24 @@
3
3
  module RailsFailover
4
4
  module ActiveRecord
5
5
  class Middleware
6
+ class << self
7
+ attr_accessor :force_reading_role_callback
8
+
9
+ def adapter_error
10
+ @adapter_error ||= begin
11
+ if defined?(::PG)
12
+ ::PG::Error
13
+ elsif defined?(::SQLite3)
14
+ ::SQLite3::Exception
15
+ elsif defined?(::Mysql2)
16
+ ::Mysql2::Error
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ ROLE_HEADER = "rails_failover.role"
23
+
6
24
  def initialize(app)
7
25
  @app = app
8
26
  end
@@ -11,18 +29,18 @@ module RailsFailover
11
29
  writing_role = ::ActiveRecord::Base.writing_role
12
30
 
13
31
  role =
14
- if primary_down = Handler.instance.primary_down?(writing_role)
32
+ if primary_down = Handler.instance.primary_down?(writing_role) || self.class.force_reading_role_callback&.call(env)
15
33
  ::ActiveRecord::Base.reading_role
16
34
  else
17
35
  ::ActiveRecord::Base.writing_role
18
36
  end
19
37
 
20
38
  ::ActiveRecord::Base.connected_to(role: role) do
21
- env["rails_failover.role"] = role
39
+ env[ROLE_HEADER] = role
22
40
  @app.call(env)
23
41
  end
24
42
  rescue Exception => e
25
- if (resolve_cause(e).is_a?(::PG::Error))
43
+ if (resolve_cause(e).is_a?(self.class.adapter_error))
26
44
  Handler.instance.verify_primary(writing_role)
27
45
  raise
28
46
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsFailover
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_failover
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alan Tan