active_record_shards 3.16.0 → 3.17.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|