active_record_shards 3.16.0 → 3.17.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/lib/active_record_shards.rb +1 -0
- data/lib/active_record_shards/association_collection_connection_selection.rb +2 -1
- data/lib/active_record_shards/configuration_parser.rb +1 -0
- data/lib/active_record_shards/connection_handler.rb +1 -0
- data/lib/active_record_shards/connection_pool.rb +1 -0
- data/lib/active_record_shards/connection_specification.rb +1 -0
- data/lib/active_record_shards/connection_switcher.rb +9 -2
- data/lib/active_record_shards/default_slave_patches.rb +2 -0
- data/lib/active_record_shards/migration.rb +1 -0
- data/lib/active_record_shards/model.rb +1 -0
- data/lib/active_record_shards/patches-4-2.rb +1 -0
- data/lib/active_record_shards/schema_dumper_extension.rb +6 -5
- data/lib/active_record_shards/shard_selection.rb +2 -1
- data/lib/active_record_shards/shard_support.rb +1 -0
- data/lib/active_record_shards/tasks.rb +11 -8
- metadata +61 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb66e1dcadbbd2c1c6f619cb1504ad0b55cfba8c4e36c76015d74781f7e29b5b
|
4
|
+
data.tar.gz: 0f63d2ffbdae6ded142d886af712a10c6b2f0fc59cdc8ab6de9c59d078663d7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8cc61cd8b0c9b18a41c3b7ab1cd21d16a32d03b51e372855792bec89fe40bd45a4900b2ccfb9fdbafcdc841a98301e9ced9c91d1ba44100d12660723ee655682
|
7
|
+
data.tar.gz: 48e7fdb5d1501834e9008efd22ec617af5a429aab37bece0f435547f49b5bec539950bbf08c5412b336a201f4d756c62f45be580d063b250ce8e10ee89aaf423
|
data/lib/active_record_shards.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module ActiveRecordShards
|
3
4
|
module AssociationCollectionConnectionSelection
|
4
5
|
def on_slave_if(condition)
|
@@ -31,7 +32,7 @@ module ActiveRecordShards
|
|
31
32
|
@which = which
|
32
33
|
end
|
33
34
|
|
34
|
-
def method_missing(method, *args, &block) # rubocop:disable Style/
|
35
|
+
def method_missing(method, *args, &block) # rubocop:disable Style/MethodMissingSuper, Style/MissingRespondToMissing
|
35
36
|
reflection = @association_collection.proxy_association.reflection
|
36
37
|
reflection.klass.on_cx_switch_block(@which) { @association_collection.send(method, *args, &block) }
|
37
38
|
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'active_record_shards/shard_support'
|
3
4
|
|
4
5
|
module ActiveRecordShards
|
5
6
|
module ConnectionSwitcher
|
6
|
-
SHARD_NAMES_CONFIG_KEY = 'shard_names'
|
7
|
+
SHARD_NAMES_CONFIG_KEY = 'shard_names'
|
7
8
|
|
8
9
|
def self.extended(base)
|
9
10
|
if ActiveRecord::VERSION::MAJOR >= 5
|
@@ -23,6 +24,10 @@ module ActiveRecordShards
|
|
23
24
|
switch_connection(shard: new_default_shard)
|
24
25
|
end
|
25
26
|
|
27
|
+
def on_primary_db(&block)
|
28
|
+
on_shard(nil, &block)
|
29
|
+
end
|
30
|
+
|
26
31
|
def on_shard(shard)
|
27
32
|
old_options = current_shard_selection.options
|
28
33
|
switch_connection(shard: shard) if supports_sharding?
|
@@ -144,6 +149,7 @@ module ActiveRecordShards
|
|
144
149
|
unless config.fetch(SHARD_NAMES_CONFIG_KEY, []).all? { |shard_name| shard_name.is_a?(Integer) }
|
145
150
|
raise "All shard names must be integers: #{config[SHARD_NAMES_CONFIG_KEY].inspect}."
|
146
151
|
end
|
152
|
+
|
147
153
|
config[SHARD_NAMES_CONFIG_KEY] || []
|
148
154
|
end
|
149
155
|
|
@@ -159,6 +165,7 @@ module ActiveRecordShards
|
|
159
165
|
unless configurations[shard_env]
|
160
166
|
raise "Did not find #{shard_env} in configurations, did you forget to add it to your database config? (configurations: #{configurations.keys.inspect})"
|
161
167
|
end
|
168
|
+
|
162
169
|
current_shard_selection.shard = options[:shard]
|
163
170
|
end
|
164
171
|
|
@@ -198,7 +205,7 @@ module ActiveRecordShards
|
|
198
205
|
@which = which
|
199
206
|
end
|
200
207
|
|
201
|
-
def method_missing(method, *args, &block) # rubocop:disable Style/
|
208
|
+
def method_missing(method, *args, &block) # rubocop:disable Style/MethodMissingSuper, Style/MissingRespondToMissing
|
202
209
|
@target.on_master_or_slave(@which) { @target.send(method, *args, &block) }
|
203
210
|
end
|
204
211
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module ActiveRecordShards
|
3
4
|
module DefaultSlavePatches
|
4
5
|
def self.wrap_method_in_on_slave(class_method, base, method, force_on_slave: false)
|
@@ -10,6 +11,7 @@ module ActiveRecordShards
|
|
10
11
|
end
|
11
12
|
|
12
13
|
return unless base_methods.include?(method)
|
14
|
+
|
13
15
|
_, method, punctuation = method.to_s.match(/^(.*?)([\?\!]?)$/).to_a
|
14
16
|
# _ALWAYS_ on slave, or only for on `on_slave_by_default = true` models?
|
15
17
|
wrapper = force_on_slave ? 'force_on_slave' : 'on_slave_unless_tx'
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module ActiveRecordShards
|
3
4
|
module SchemaDumperExtension
|
4
5
|
def dump(stream)
|
@@ -23,15 +24,15 @@ module ActiveRecordShards
|
|
23
24
|
def shard_header(stream)
|
24
25
|
define_params = @version ? "version: #{@version}" : ""
|
25
26
|
|
26
|
-
stream.puts
|
27
|
+
stream.puts <<~HEADER
|
27
28
|
|
28
29
|
|
29
|
-
# This section generated by active_record_shards
|
30
|
+
# This section generated by active_record_shards
|
30
31
|
|
31
|
-
ActiveRecord::Base.on_all_shards do
|
32
|
-
ActiveRecord::Schema.define(#{define_params}) do
|
32
|
+
ActiveRecord::Base.on_all_shards do
|
33
|
+
ActiveRecord::Schema.define(#{define_params}) do
|
33
34
|
|
34
|
-
HEADER
|
35
|
+
HEADER
|
35
36
|
end
|
36
37
|
|
37
38
|
def shard_trailer(stream)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module ActiveRecordShards
|
3
4
|
class ShardSelection
|
4
5
|
NO_SHARD = :_no_shard
|
@@ -46,7 +47,7 @@ module ActiveRecordShards
|
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
49
|
-
PRIMARY = "primary"
|
50
|
+
PRIMARY = "primary"
|
50
51
|
def resolve_connection_name(sharded:, configurations:)
|
51
52
|
resolved_shard = sharded ? shard : nil
|
52
53
|
env = ActiveRecordShards.rails_env
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'active_record_shards'
|
3
4
|
|
4
5
|
%w[db:drop db:create db:abort_if_pending_migrations db:reset db:test:purge].each do |name|
|
@@ -10,13 +11,14 @@ namespace :db do
|
|
10
11
|
task drop: :load_config do
|
11
12
|
ActiveRecord::Base.configurations.to_h.each do |key, conf|
|
12
13
|
next if !key.starts_with?(ActiveRecordShards.rails_env) || key.ends_with?("_slave")
|
14
|
+
|
13
15
|
begin
|
14
16
|
ActiveRecordShards::Tasks.root_connection(conf).drop_database(conf['database'])
|
15
17
|
# rescue ActiveRecord::NoDatabaseError # TODO: exists in AR but never is raised here ...
|
16
18
|
# $stderr.puts "Database '#{conf['database']}' does not exist"
|
17
|
-
rescue StandardError =>
|
18
|
-
|
19
|
-
|
19
|
+
rescue StandardError => e
|
20
|
+
warn e, *e.backtrace
|
21
|
+
warn "Couldn't drop #{conf['database']}"
|
20
22
|
end
|
21
23
|
end
|
22
24
|
end
|
@@ -30,6 +32,7 @@ namespace :db do
|
|
30
32
|
task create: :load_config do
|
31
33
|
ActiveRecord::Base.configurations.to_h.each do |key, conf|
|
32
34
|
next if !key.starts_with?(ActiveRecordShards.rails_env) || key.ends_with?("_slave")
|
35
|
+
|
33
36
|
begin
|
34
37
|
# MysqlAdapter takes charset instead of encoding in Rails 4.2 or greater
|
35
38
|
# https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/tasks/mysql_database_tasks.rb#L85-L96
|
@@ -37,11 +40,11 @@ namespace :db do
|
|
37
40
|
symbolized_configuration[:charset] = symbolized_configuration[:encoding]
|
38
41
|
|
39
42
|
ActiveRecordShards::Tasks.root_connection(conf).create_database(conf['database'], symbolized_configuration)
|
40
|
-
rescue ActiveRecord::StatementInvalid =>
|
41
|
-
if
|
43
|
+
rescue ActiveRecord::StatementInvalid => e
|
44
|
+
if e.message.include?('database exists')
|
42
45
|
puts "#{conf['database']} already exists"
|
43
46
|
else
|
44
|
-
raise
|
47
|
+
raise e
|
45
48
|
end
|
46
49
|
end
|
47
50
|
end
|
@@ -63,9 +66,9 @@ namespace :db do
|
|
63
66
|
end
|
64
67
|
|
65
68
|
if pending_migrations.any?
|
66
|
-
|
69
|
+
warn "You have #{pending_migrations.size} pending migrations:"
|
67
70
|
pending_migrations.each do |pending_migration|
|
68
|
-
|
71
|
+
warn ' %4d %s' % [pending_migration.version, pending_migration.name]
|
69
72
|
end
|
70
73
|
abort %(Run "rake db:migrate" to update your database then try again.)
|
71
74
|
end
|
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: 3.
|
4
|
+
version: 3.17.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:
|
16
|
+
date: 2020-04-02 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: activerecord
|
@@ -56,35 +56,35 @@ dependencies:
|
|
56
56
|
- !ruby/object:Gem::Version
|
57
57
|
version: '6.1'
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
|
-
name:
|
59
|
+
name: bump
|
60
60
|
requirement: !ruby/object:Gem::Requirement
|
61
61
|
requirements:
|
62
|
-
- - "
|
62
|
+
- - ">="
|
63
63
|
- !ruby/object:Gem::Version
|
64
|
-
version: '
|
64
|
+
version: '0'
|
65
65
|
type: :development
|
66
66
|
prerelease: false
|
67
67
|
version_requirements: !ruby/object:Gem::Requirement
|
68
68
|
requirements:
|
69
|
-
- - "
|
69
|
+
- - ">="
|
70
70
|
- !ruby/object:Gem::Version
|
71
|
-
version: '
|
71
|
+
version: '0'
|
72
72
|
- !ruby/object:Gem::Dependency
|
73
|
-
name:
|
73
|
+
name: minitest
|
74
74
|
requirement: !ruby/object:Gem::Requirement
|
75
75
|
requirements:
|
76
76
|
- - ">="
|
77
77
|
- !ruby/object:Gem::Version
|
78
|
-
version:
|
78
|
+
version: 5.10.0
|
79
79
|
type: :development
|
80
80
|
prerelease: false
|
81
81
|
version_requirements: !ruby/object:Gem::Requirement
|
82
82
|
requirements:
|
83
83
|
- - ">="
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version:
|
85
|
+
version: 5.10.0
|
86
86
|
- !ruby/object:Gem::Dependency
|
87
|
-
name:
|
87
|
+
name: minitest-rg
|
88
88
|
requirement: !ruby/object:Gem::Requirement
|
89
89
|
requirements:
|
90
90
|
- - ">="
|
@@ -98,75 +98,103 @@ dependencies:
|
|
98
98
|
- !ruby/object:Gem::Version
|
99
99
|
version: '0'
|
100
100
|
- !ruby/object:Gem::Dependency
|
101
|
-
name:
|
101
|
+
name: mocha
|
102
102
|
requirement: !ruby/object:Gem::Requirement
|
103
103
|
requirements:
|
104
|
-
- -
|
104
|
+
- - ">="
|
105
105
|
- !ruby/object:Gem::Version
|
106
|
-
version:
|
106
|
+
version: 1.4.0
|
107
107
|
type: :development
|
108
108
|
prerelease: false
|
109
109
|
version_requirements: !ruby/object:Gem::Requirement
|
110
110
|
requirements:
|
111
|
-
- -
|
111
|
+
- - ">="
|
112
112
|
- !ruby/object:Gem::Version
|
113
|
-
version:
|
113
|
+
version: 1.4.0
|
114
114
|
- !ruby/object:Gem::Dependency
|
115
|
-
name:
|
115
|
+
name: mysql2
|
116
116
|
requirement: !ruby/object:Gem::Requirement
|
117
117
|
requirements:
|
118
118
|
- - ">="
|
119
119
|
- !ruby/object:Gem::Version
|
120
|
-
version:
|
120
|
+
version: '0'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
123
|
version_requirements: !ruby/object:Gem::Requirement
|
124
124
|
requirements:
|
125
125
|
- - ">="
|
126
126
|
- !ruby/object:Gem::Version
|
127
|
-
version:
|
127
|
+
version: '0'
|
128
128
|
- !ruby/object:Gem::Dependency
|
129
|
-
name:
|
129
|
+
name: phenix
|
130
130
|
requirement: !ruby/object:Gem::Requirement
|
131
131
|
requirements:
|
132
132
|
- - ">="
|
133
133
|
- !ruby/object:Gem::Version
|
134
|
-
version:
|
134
|
+
version: 0.6.0
|
135
135
|
type: :development
|
136
136
|
prerelease: false
|
137
137
|
version_requirements: !ruby/object:Gem::Requirement
|
138
138
|
requirements:
|
139
139
|
- - ">="
|
140
140
|
- !ruby/object:Gem::Version
|
141
|
-
version:
|
141
|
+
version: 0.6.0
|
142
142
|
- !ruby/object:Gem::Dependency
|
143
|
-
name:
|
143
|
+
name: rake
|
144
144
|
requirement: !ruby/object:Gem::Requirement
|
145
145
|
requirements:
|
146
|
-
- - "
|
146
|
+
- - "~>"
|
147
147
|
- !ruby/object:Gem::Version
|
148
|
-
version:
|
148
|
+
version: '12.0'
|
149
149
|
type: :development
|
150
150
|
prerelease: false
|
151
151
|
version_requirements: !ruby/object:Gem::Requirement
|
152
152
|
requirements:
|
153
|
-
- - "
|
153
|
+
- - "~>"
|
154
154
|
- !ruby/object:Gem::Version
|
155
|
-
version:
|
155
|
+
version: '12.0'
|
156
156
|
- !ruby/object:Gem::Dependency
|
157
|
-
name:
|
157
|
+
name: rubocop
|
158
158
|
requirement: !ruby/object:Gem::Requirement
|
159
159
|
requirements:
|
160
|
-
- - "
|
160
|
+
- - "~>"
|
161
161
|
- !ruby/object:Gem::Version
|
162
|
-
version: 0.
|
162
|
+
version: 0.77.0
|
163
163
|
type: :development
|
164
164
|
prerelease: false
|
165
165
|
version_requirements: !ruby/object:Gem::Requirement
|
166
166
|
requirements:
|
167
|
-
- - "
|
167
|
+
- - "~>"
|
168
168
|
- !ruby/object:Gem::Version
|
169
|
-
version: 0.
|
169
|
+
version: 0.77.0
|
170
|
+
- !ruby/object:Gem::Dependency
|
171
|
+
name: rubocop-minitest
|
172
|
+
requirement: !ruby/object:Gem::Requirement
|
173
|
+
requirements:
|
174
|
+
- - "~>"
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: 0.5.0
|
177
|
+
type: :development
|
178
|
+
prerelease: false
|
179
|
+
version_requirements: !ruby/object:Gem::Requirement
|
180
|
+
requirements:
|
181
|
+
- - "~>"
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: 0.5.0
|
184
|
+
- !ruby/object:Gem::Dependency
|
185
|
+
name: rubocop-performance
|
186
|
+
requirement: !ruby/object:Gem::Requirement
|
187
|
+
requirements:
|
188
|
+
- - "~>"
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: 1.5.1
|
191
|
+
type: :development
|
192
|
+
prerelease: false
|
193
|
+
version_requirements: !ruby/object:Gem::Requirement
|
194
|
+
requirements:
|
195
|
+
- - "~>"
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: 1.5.1
|
170
198
|
description: Easily run queries on shard and slave databases.
|
171
199
|
email:
|
172
200
|
- bquorning@zendesk.com
|
@@ -216,7 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
216
244
|
- !ruby/object:Gem::Version
|
217
245
|
version: '0'
|
218
246
|
requirements: []
|
219
|
-
rubygems_version: 3.
|
247
|
+
rubygems_version: 3.1.1
|
220
248
|
signing_key:
|
221
249
|
specification_version: 4
|
222
250
|
summary: Simple database switching for ActiveRecord.
|