Skip to content

Commit 029e8fc

Browse files
authored
Fix initialization crash when no DB connection (#177)
1 parent accdcc5 commit 029e8fc

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

lib/actual_db_schema/engine.rb

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,50 @@ class Engine < ::Rails::Engine
1515

1616
initializer "actual_db_schema.schema_dump_exclusions" do
1717
ActiveSupport.on_load(:active_record) do
18-
table_name = ActualDbSchema::Store::DbAdapter::TABLE_NAME
18+
apply_schema_dump_exclusions
19+
end
20+
end
21+
22+
def self.apply_schema_dump_exclusions
23+
table_name = ActualDbSchema::Store::DbAdapter::TABLE_NAME
24+
ignore_schema_dump_table(table_name)
25+
return unless schema_dump_flags_supported?
26+
return unless schema_dump_connection_available?
27+
28+
apply_structure_dump_flags(table_name)
29+
end
30+
31+
class << self
32+
private
33+
34+
def ignore_schema_dump_table(table_name)
35+
return unless defined?(ActiveRecord::SchemaDumper)
36+
return unless ActiveRecord::SchemaDumper.respond_to?(:ignore_tables)
37+
38+
ActiveRecord::SchemaDumper.ignore_tables |= [table_name]
39+
end
40+
41+
def schema_dump_flags_supported?
42+
defined?(ActiveRecord::Tasks::DatabaseTasks) &&
43+
ActiveRecord::Tasks::DatabaseTasks.respond_to?(:structure_dump_flags)
44+
end
1945

20-
if defined?(ActiveRecord::SchemaDumper) && ActiveRecord::SchemaDumper.respond_to?(:ignore_tables)
21-
ActiveRecord::SchemaDumper.ignore_tables |= [table_name]
46+
# Avoid touching db config unless we explicitly use DB storage
47+
# or a connection is already available.
48+
def schema_dump_connection_available?
49+
has_connection = begin
50+
ActiveRecord::Base.connection_pool.connected?
51+
rescue ActiveRecord::ConnectionNotDefined, ActiveRecord::ConnectionNotEstablished
52+
false
2253
end
2354

24-
next unless defined?(ActiveRecord::Tasks::DatabaseTasks)
25-
next unless ActiveRecord::Tasks::DatabaseTasks.respond_to?(:structure_dump_flags)
55+
ActualDbSchema.config[:migrations_storage] == :db || has_connection
56+
end
2657

58+
def apply_structure_dump_flags(table_name)
2759
flags = Array(ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags)
2860
adapter = ActualDbSchema.db_config[:adapter].to_s
29-
database = ActualDbSchema.db_config[:database]
30-
if database.nil? && ActiveRecord::Base.respond_to?(:connection_db_config)
31-
database = ActiveRecord::Base.connection_db_config&.database
32-
end
61+
database = database_name
3362

3463
if adapter.match?(/postgres/i)
3564
flag = "--exclude-table=#{table_name}*"
@@ -41,6 +70,14 @@ class Engine < ::Rails::Engine
4170

4271
ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = flags
4372
end
73+
74+
def database_name
75+
database = ActualDbSchema.db_config[:database]
76+
if database.nil? && ActiveRecord::Base.respond_to?(:connection_db_config)
77+
database = ActiveRecord::Base.connection_db_config&.database
78+
end
79+
database
80+
end
4481
end
4582
end
4683
end

test/rake_task_db_storage_full_test.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ def down
110110
TestingState.down << :ts360
111111
end
112112
end
113-
TS360 = Ts360 unless defined?(TS360)
114113
RUBY
115114
end
116115

@@ -175,7 +174,6 @@ def down
175174
after do
176175
utils.clear_db_storage_table
177176
ActualDbSchema.config[:migrations_storage] = :file
178-
utils.reset_acronyms
179177
end
180178

181179
describe "db:rollback_branches:manual" do

test/support/test_utils.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ def prepare_phantom_migrations(db_config = nil)
136136
end
137137

138138
def cleanup(db_config = nil)
139+
reset_acronyms
139140
if db_config
140141
db_config.each do |name, c|
141142
ActiveRecord::Base.establish_connection(**c)

0 commit comments

Comments
 (0)