module TestProf::BeforeAll::Adapters::ActiveRecord

def all_connections

def all_connections
  @all_connections ||= if ::ActiveRecord::Base.respond_to? :connects_to
    ::ActiveRecord::Base.connection_handler.connection_pool_list(*POOL_ARGS).filter_map { |pool|
      begin
        pool.connection
      rescue *pool_connection_errors => error
        log_pool_connection_error(pool, error)
        nil
      end
    }
  else
    Array.wrap(::ActiveRecord::Base.connection)
  end
end

def begin_transaction

def begin_transaction
  ::ActiveRecord::Base.connection_handler.connection_pool_list(:writing).each do |pool|
    pool.pin_connection!(true)
  end
end

def begin_transaction

def begin_transaction
  @all_connections = nil
  all_connections.each do |connection|
    connection.begin_transaction(joinable: false)
  end
end

def log_pool_connection_error(pool, error)

def log_pool_connection_error(pool, error)
  warn "Could not connect to pool #{pool.connection_class.name}. #{error.class}: #{error.message}"
end

def pool_connection_errors

def pool_connection_errors
  @pool_connection_errors ||= []
end

def rollback_transaction

def rollback_transaction
  ::ActiveRecord::Base.connection_handler.connection_pool_list(:writing).each do |pool|
    pool.unpin_connection!
  end
end

def rollback_transaction

def rollback_transaction
  all_connections.each do |connection|
    if connection.open_transactions.zero?
      warn "!!! before_all transaction has been already rollbacked and " \
            "could work incorrectly"
      next
    end
    connection.rollback_transaction
  end
end

def setup_fixtures(test_object)

def setup_fixtures(test_object)
  test_object.instance_eval do
    @@already_loaded_fixtures ||= {}
    @fixture_cache ||= {}
    config = ::ActiveRecord::Base
    if @@already_loaded_fixtures[self.class]
      @loaded_fixtures = @@already_loaded_fixtures[self.class]
    else
      @loaded_fixtures = load_fixtures(config)
      @@already_loaded_fixtures[self.class] = @loaded_fixtures
    end
  end
end