mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
b66b5378ba
Any connections that were checked out during initialization should be checked back in before the first request is processed, for two reasons: - Returning the connection to the pool allows it to be health checked before it's used again. If the connection dies before the first request arrives, the health check will replace it with a new one. - If the thread that initialized Rails is not the same thread that will be performing work, checking in the connection will allow it to be reused instead of being stuck to the initialization thread forever.
178 lines
6 KiB
Ruby
178 lines
6 KiB
Ruby
require "active_record"
|
|
require "rails"
|
|
require "active_model/railtie"
|
|
|
|
# For now, action_controller must always be present with
|
|
# Rails, so let's make sure that it gets required before
|
|
# here. This is needed for correctly setting up the middleware.
|
|
# In the future, this might become an optional require.
|
|
require "action_controller/railtie"
|
|
|
|
module ActiveRecord
|
|
# = Active Record Railtie
|
|
class Railtie < Rails::Railtie # :nodoc:
|
|
config.active_record = ActiveSupport::OrderedOptions.new
|
|
|
|
config.app_generators.orm :active_record, migration: true,
|
|
timestamps: true
|
|
|
|
config.action_dispatch.rescue_responses.merge!(
|
|
"ActiveRecord::RecordNotFound" => :not_found,
|
|
"ActiveRecord::StaleObjectError" => :conflict,
|
|
"ActiveRecord::RecordInvalid" => :unprocessable_entity,
|
|
"ActiveRecord::RecordNotSaved" => :unprocessable_entity
|
|
)
|
|
|
|
config.active_record.use_schema_cache_dump = true
|
|
config.active_record.maintain_test_schema = true
|
|
|
|
config.eager_load_namespaces << ActiveRecord
|
|
|
|
rake_tasks do
|
|
namespace :db do
|
|
task :load_config do
|
|
ActiveRecord::Tasks::DatabaseTasks.database_configuration = Rails.application.config.database_configuration
|
|
|
|
if defined?(ENGINE_ROOT) && engine = Rails::Engine.find(ENGINE_ROOT)
|
|
if engine.paths["db/migrate"].existent
|
|
ActiveRecord::Tasks::DatabaseTasks.migrations_paths += engine.paths["db/migrate"].to_a
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
load "active_record/railties/databases.rake"
|
|
end
|
|
|
|
# When loading console, force ActiveRecord::Base to be loaded
|
|
# to avoid cross references when loading a constant for the
|
|
# first time. Also, make it output to STDERR.
|
|
console do |app|
|
|
require "active_record/railties/console_sandbox" if app.sandbox?
|
|
require "active_record/base"
|
|
unless ActiveSupport::Logger.logger_outputs_to?(Rails.logger, STDERR, STDOUT)
|
|
console = ActiveSupport::Logger.new(STDERR)
|
|
Rails.logger.extend ActiveSupport::Logger.broadcast console
|
|
end
|
|
end
|
|
|
|
runner do
|
|
require "active_record/base"
|
|
end
|
|
|
|
initializer "active_record.initialize_timezone" do
|
|
ActiveSupport.on_load(:active_record) do
|
|
self.time_zone_aware_attributes = true
|
|
self.default_timezone = :utc
|
|
end
|
|
end
|
|
|
|
initializer "active_record.logger" do
|
|
ActiveSupport.on_load(:active_record) { self.logger ||= ::Rails.logger }
|
|
end
|
|
|
|
initializer "active_record.migration_error" do
|
|
if config.active_record.delete(:migration_error) == :page_load
|
|
config.app_middleware.insert_after ::ActionDispatch::Callbacks,
|
|
ActiveRecord::Migration::CheckPending
|
|
end
|
|
end
|
|
|
|
initializer "active_record.check_schema_cache_dump" do
|
|
if config.active_record.delete(:use_schema_cache_dump)
|
|
config.after_initialize do |app|
|
|
ActiveSupport.on_load(:active_record) do
|
|
filename = File.join(app.config.paths["db"].first, "schema_cache.yml")
|
|
|
|
if File.file?(filename)
|
|
cache = YAML.load(File.read(filename))
|
|
if cache.version == ActiveRecord::Migrator.current_version
|
|
connection.schema_cache = cache
|
|
connection_pool.schema_cache = cache.dup
|
|
else
|
|
warn "Ignoring db/schema_cache.yml because it has expired. The current schema version is #{ActiveRecord::Migrator.current_version}, but the one in the cache is #{cache.version}."
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
initializer "active_record.warn_on_records_fetched_greater_than" do
|
|
if config.active_record.warn_on_records_fetched_greater_than
|
|
ActiveSupport.on_load(:active_record) do
|
|
require "active_record/relation/record_fetch_warning"
|
|
end
|
|
end
|
|
end
|
|
|
|
initializer "active_record.set_configs" do |app|
|
|
ActiveSupport.on_load(:active_record) do
|
|
app.config.active_record.each do |k, v|
|
|
send "#{k}=", v
|
|
end
|
|
end
|
|
end
|
|
|
|
# This sets the database configuration from Configuration#database_configuration
|
|
# and then establishes the connection.
|
|
initializer "active_record.initialize_database" do
|
|
ActiveSupport.on_load(:active_record) do
|
|
self.configurations = Rails.application.config.database_configuration
|
|
|
|
begin
|
|
establish_connection
|
|
rescue ActiveRecord::NoDatabaseError
|
|
warn <<-end_warning
|
|
Oops - You have a database configured, but it doesn't exist yet!
|
|
|
|
Here's how to get started:
|
|
|
|
1. Configure your database in config/database.yml.
|
|
2. Run `bin/rails db:create` to create the database.
|
|
3. Run `bin/rails db:setup` to load your database schema.
|
|
end_warning
|
|
raise
|
|
end
|
|
end
|
|
end
|
|
|
|
# Expose database runtime to controller for logging.
|
|
initializer "active_record.log_runtime" do
|
|
require "active_record/railties/controller_runtime"
|
|
ActiveSupport.on_load(:action_controller) do
|
|
include ActiveRecord::Railties::ControllerRuntime
|
|
end
|
|
end
|
|
|
|
initializer "active_record.set_reloader_hooks" do
|
|
ActiveSupport.on_load(:active_record) do
|
|
ActiveSupport::Reloader.before_class_unload do
|
|
if ActiveRecord::Base.connected?
|
|
ActiveRecord::Base.clear_cache!
|
|
ActiveRecord::Base.clear_reloadable_connections!
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
initializer "active_record.set_executor_hooks" do
|
|
ActiveSupport.on_load(:active_record) do
|
|
ActiveRecord::QueryCache.install_executor_hooks
|
|
end
|
|
end
|
|
|
|
initializer "active_record.add_watchable_files" do |app|
|
|
path = app.paths["db"].first
|
|
config.watchable_files.concat ["#{path}/schema.rb", "#{path}/structure.sql"]
|
|
end
|
|
|
|
initializer "active_record.clear_active_connections" do
|
|
config.after_initialize do
|
|
ActiveSupport.on_load(:active_record) do
|
|
clear_active_connections!
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|