module ActiveRecordViews::DatabaseTasks

Public Instance Methods

dump_schema(db_config, format = ActiveRecord.respond_to?(:schema_format) ? ActiveRecord.schema_format : ActiveRecord::Base.schema_format, *args) click to toggle source
Calls superclass method
# 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

  # Substitute out any timestamps that were dumped from the active_record_views table
  #
  # Before:
  #
  #     COPY public.active_record_views (name, class_name, checksum, options, refreshed_at) FROM stdin;
  #     test_view       TestView        42364a017b73ef516a0eca9827e6fa00623257ee        {"dependencies":[]}     2021-10-26 02:49:12.247494
  #     \.
  #
  # After:
  #
  #     COPY public.active_record_views (name, class_name, checksum, options, refreshed_at) FROM stdin;
  #     test_view       TestView        42364a017b73ef516a0eca9827e6fa00623257ee        {"dependencies":[]}     \N
  #     \.
  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
migrate(*) click to toggle source
Calls superclass method
# File lib/active_record_views/database_tasks.rb, line 2
def migrate(*)
  super

  unless ActiveRecordViews::Extension.create_enabled
    Rails.application.eager_load!
    ActiveRecordViews::Extension.process_create_queue!
    ActiveRecordViews.drop_unregistered_views!
  end
end