switchman 3.5.1 → 3.5.3
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6fdd3a18ba6864a5a47f6b151f397fb244ac7357c5474fe7195eba633a74a59
|
4
|
+
data.tar.gz: 93f9d372028f3807e5396a8d9a75e6f6b267f18d6aa8d46588e471609ce5ac9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05c39ae962b7585a60e1f896702fbdc0a600c183d4a2c31173d74d710b9616ecb7cedb2ad36b1b65c62a4ee7d6eb0438eb50d482d8fa05a8d6d06469bc9e0643
|
7
|
+
data.tar.gz: '020828a35e723d21186d51acdf60c507fb3a1622bc94a43c560cdbd3945a026d6510c395d5308afb42f2029e95972799b67891d11ed5e60ae88b790a84011b6c'
|
@@ -131,7 +131,12 @@ module Switchman
|
|
131
131
|
def grouped_calculation_options(operation, column_name, distinct)
|
132
132
|
opts = { operation: operation, column_name: column_name, distinct: distinct }
|
133
133
|
|
134
|
-
|
134
|
+
# Rails 7.0.5
|
135
|
+
if defined?(::ActiveRecord::Calculations::ColumnAliasTracker)
|
136
|
+
column_alias_tracker = ::ActiveRecord::Calculations::ColumnAliasTracker.new(connection)
|
137
|
+
end
|
138
|
+
|
139
|
+
opts[:aggregate_alias] = aggregate_alias_for(operation, column_name, column_alias_tracker)
|
135
140
|
group_attrs = group_values
|
136
141
|
if group_attrs.first.respond_to?(:to_sym)
|
137
142
|
association = klass.reflect_on_association(group_attrs.first.to_sym)
|
@@ -142,8 +147,14 @@ module Switchman
|
|
142
147
|
group_fields = group_attrs
|
143
148
|
end
|
144
149
|
|
145
|
-
|
146
|
-
|
150
|
+
group_aliases = group_fields.map do |field|
|
151
|
+
field = connection.visitor.compile(field) if ::Arel.arel_node?(field)
|
152
|
+
if column_alias_tracker
|
153
|
+
column_alias_tracker.alias_for(field.to_s.downcase)
|
154
|
+
else
|
155
|
+
column_alias_for(field.to_s.downcase)
|
156
|
+
end
|
157
|
+
end
|
147
158
|
group_columns = group_aliases.zip(group_fields).map do |aliaz, field|
|
148
159
|
[aliaz, type_for(field), column_name_for(field)]
|
149
160
|
end
|
@@ -156,11 +167,13 @@ module Switchman
|
|
156
167
|
opts
|
157
168
|
end
|
158
169
|
|
159
|
-
def aggregate_alias_for(operation, column_name)
|
170
|
+
def aggregate_alias_for(operation, column_name, column_alias_tracker)
|
160
171
|
if operation == "count" && column_name == :all
|
161
172
|
"count_all"
|
162
173
|
elsif operation == "average"
|
163
174
|
"average"
|
175
|
+
elsif column_alias_tracker
|
176
|
+
column_alias_tracker.alias_for("#{operation} #{column_name}")
|
164
177
|
else
|
165
178
|
column_alias_for("#{operation} #{column_name}")
|
166
179
|
end
|
@@ -27,12 +27,17 @@ module Switchman
|
|
27
27
|
return configs if configs.is_a?(Array)
|
28
28
|
|
29
29
|
db_configs = configs.flat_map do |env_name, config|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
if config.is_a?(Hash)
|
31
|
+
# It would be nice to do the auto-fallback that we want here, but we haven't
|
32
|
+
# actually done that for years (or maybe ever) and it will be a big lift to get working
|
33
|
+
roles = config.keys.select do |k|
|
34
|
+
config[k].is_a?(Hash) || (config[k].is_a?(Array) && config[k].all?(Hash))
|
35
|
+
end
|
36
|
+
base_config = config.except(*roles)
|
37
|
+
else
|
38
|
+
base_config = config
|
39
|
+
roles = []
|
34
40
|
end
|
35
|
-
base_config = config.except(*roles)
|
36
41
|
|
37
42
|
name = "#{env_name}/primary"
|
38
43
|
name = "primary" if env_name == default_env
|
@@ -81,6 +81,8 @@ module Switchman
|
|
81
81
|
# Do this after so that all database servers for all roles are established and we won't prematurely
|
82
82
|
# configure a connection for the wrong role
|
83
83
|
@all_roles = roles.uniq
|
84
|
+
return @database_servers if @database_servers.empty?
|
85
|
+
|
84
86
|
Shard.send(:configure_connects_to)
|
85
87
|
end
|
86
88
|
@database_servers
|
data/lib/switchman/shard.rb
CHANGED
@@ -168,7 +168,7 @@ module Switchman
|
|
168
168
|
# silly like dealloc'ing prepared statements)
|
169
169
|
::ActiveRecord::Base.clear_all_connections!
|
170
170
|
|
171
|
-
parent_process_name =
|
171
|
+
parent_process_name = sanitized_process_title
|
172
172
|
ret = ::Parallel.map(scopes, in_processes: (scopes.length > 1) ? parallel : 0) do |server, subscope|
|
173
173
|
name = server.id
|
174
174
|
last_description = name
|
@@ -444,6 +444,39 @@ module Switchman
|
|
444
444
|
shard = nil unless shard.database_server
|
445
445
|
shard
|
446
446
|
end
|
447
|
+
|
448
|
+
# Determines the name of the current process, including arguments, but stripping
|
449
|
+
# any shebang from the invoked script, and any additional path info from the
|
450
|
+
# executable.
|
451
|
+
#
|
452
|
+
# @return [String]
|
453
|
+
def sanitized_process_title
|
454
|
+
# get the effective process name from `ps`; this will include any changes
|
455
|
+
# from Process.setproctitle _or_ assigning to $0.
|
456
|
+
parent_process_name = `ps -ocommand= -p#{Process.pid}`.strip
|
457
|
+
# Effective process titles may be shorter than the actual
|
458
|
+
# command; truncate our ARGV[0] so that they are comparable
|
459
|
+
# for the next step
|
460
|
+
argv0 = if parent_process_name.length < Process.argv0.length
|
461
|
+
Process.argv0[0..parent_process_name.length]
|
462
|
+
else
|
463
|
+
Process.argv0
|
464
|
+
end
|
465
|
+
|
466
|
+
# when running via a shebang, the `ps` output will include the shebang
|
467
|
+
# (i.e. it will be "ruby bin/rails c"); attempt to strip it off.
|
468
|
+
# Note that argv0 in this case will _only_ be `bin/rails` (no shebang,
|
469
|
+
# no arguments). We want to preserve the arguments we got from `ps`
|
470
|
+
if (index = parent_process_name.index(argv0))
|
471
|
+
parent_process_name.slice!(0...index)
|
472
|
+
end
|
473
|
+
|
474
|
+
# remove directories from the main executable to make more room
|
475
|
+
# for additional info
|
476
|
+
argv = parent_process_name.shellsplit
|
477
|
+
argv[0] = File.basename(argv[0])
|
478
|
+
argv.shelljoin
|
479
|
+
end
|
447
480
|
end
|
448
481
|
|
449
482
|
def name
|
@@ -508,48 +541,39 @@ module Switchman
|
|
508
541
|
end
|
509
542
|
|
510
543
|
def drop_database
|
511
|
-
raise
|
544
|
+
raise "Cannot drop the database of the default shard" if default?
|
512
545
|
return unless read_attribute(:name)
|
513
546
|
|
514
547
|
begin
|
515
|
-
|
516
|
-
|
517
|
-
drop_statement = sharding_config[adapter]&.[](:drop_statement)
|
518
|
-
drop_statement ||= sharding_config[:drop_statement]
|
519
|
-
if drop_statement
|
520
|
-
drop_statement = Array(drop_statement).dup
|
521
|
-
.map { |statement| statement.gsub("%{name}", name) }
|
548
|
+
activate do
|
549
|
+
self.class.drop_database(name)
|
522
550
|
end
|
551
|
+
rescue ::ActiveRecord::StatementInvalid => e
|
552
|
+
logger.error "Drop failed: #{e}"
|
553
|
+
end
|
554
|
+
end
|
523
555
|
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
drop_statement ||= "DROP SCHEMA #{name} CASCADE"
|
542
|
-
Array(drop_statement).each do |stmt|
|
543
|
-
::ActiveRecord::Base.connection.execute(stmt)
|
544
|
-
end
|
545
|
-
ensure
|
546
|
-
conn.raw_connection.set_notice_processor(&old_proc) if old_proc
|
547
|
-
end
|
548
|
-
end
|
556
|
+
#
|
557
|
+
# Drops a specific database/schema from the currently active connection
|
558
|
+
#
|
559
|
+
def self.drop_database(name)
|
560
|
+
sharding_config = Switchman.config || {}
|
561
|
+
drop_statement = sharding_config["postgresql"]&.[](:drop_statement)
|
562
|
+
drop_statement ||= sharding_config[:drop_statement]
|
563
|
+
drop_statement = Array(drop_statement).map { |statement| statement.gsub("%{name}", name) } if drop_statement
|
564
|
+
|
565
|
+
::GuardRail.activate(:deploy) do
|
566
|
+
# Shut up, Postgres!
|
567
|
+
conn = ::ActiveRecord::Base.connection
|
568
|
+
old_proc = conn.raw_connection.set_notice_processor {}
|
569
|
+
begin
|
570
|
+
drop_statement ||= "DROP SCHEMA #{name} CASCADE"
|
571
|
+
Array(drop_statement).each do |stmt|
|
572
|
+
::ActiveRecord::Base.connection.execute(stmt)
|
549
573
|
end
|
574
|
+
ensure
|
575
|
+
conn.raw_connection.set_notice_processor(&old_proc) if old_proc
|
550
576
|
end
|
551
|
-
rescue
|
552
|
-
logger.info "Drop failed: #{$!}"
|
553
577
|
end
|
554
578
|
end
|
555
579
|
|
data/lib/switchman/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: switchman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.5.
|
4
|
+
version: 3.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Cutrer
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2023-
|
13
|
+
date: 2023-06-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|