12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
# File 'lib/active_record_views/database_tasks.rb', line 12
def dump_schema(db_config, format = ActiveRecord.respond_to?(:schema_format) ? ActiveRecord.schema_format : ActiveRecord::Base.schema_format, *args)
super
return unless format == :sql
connection = if respond_to?(:migration_connection)
migration_connection
else
ActiveRecord::Base.connection
end
return unless connection.data_source_exists?('active_record_views')
filename = case
when respond_to?(:schema_dump_path)
schema_dump_path(db_config, format)
when respond_to?(:dump_filename)
spec_name = args.first
dump_filename(spec_name || db_config.name, format)
else
raise 'unsupported ActiveRecord version'
end
adapter = case
when respond_to?(:database_adapter_for)
database_adapter_for(db_config)
when respond_to?(:class_for_adapter, true)
adapter_name = if db_config.respond_to?(:adapter)
db_config.adapter
else
db_config.fetch('adapter')
end
class_for_adapter(adapter_name).new(db_config)
else
raise 'unsupported ActiveRecord version'
end
database_name = if db_config.respond_to?(:database)
db_config.database
else
db_config.fetch('database')
end
active_record_views_dump = Tempfile.open(['active_record_views_dump', '.sql'])
adapter.send(:run_cmd, 'pg_dump', %W[--data-only --no-owner --table=active_record_views #{database_name} -f #{active_record_views_dump.path}], 'dumping')
adapter.send(:remove_sql_header_comments, active_record_views_dump.path)
active_record_views_dump_content = active_record_views_dump.read
if active_record_views_dump_content !~ /^COPY public.active_record_views \(.+, refreshed_at\) FROM stdin;$/
raise 'refreshed_at is not final column'
end
active_record_views_dump_content.gsub!(/\t\d\d\d\d-\d\d-\d\d.*$/, "\t\\N")
active_record_views_dump_content = active_record_views_dump_content
.lines
.chunk { |line| line.include?("\t") }
.flat_map { |is_data, lines| is_data ? lines.sort : lines }
.join
File.open filename, 'a' do |io|
io.puts active_record_views_dump_content
end
ensure
active_record_views_dump&.close
active_record_views_dump&.unlink
end
|