module Sinatra::ActiveRecordExtension
def self.registered(app)
def self.registered(app) if ENV['DATABASE_URL'] && File.exist?("#{Dir.pwd}/config/database.yml") path = "#{Dir.pwd}/config/database.yml" url = ENV['DATABASE_URL'] source = ERB.new(File.read(path)).result file_spec = YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(source) : YAML.load(source) file_spec ||= {} # ActiveRecord 6.1+ has moved the connection url resolver to another module if Gem.loaded_specs["activerecord"].version >= Gem::Version.create('6.1') url_spec = ActiveRecord::DatabaseConfigurations::ConnectionUrlResolver.new(url).to_hash else url_spec = ActiveRecord::ConnectionAdapters::ConnectionSpecification::ConnectionUrlResolver.new(url).to_hash end # if the configuration concerns only one database, and url_spec exist, url_spec will override the same key # if the configuration has multiple databases (Rails 6.0+ feature), url_spec is discarded # Following Active Record config convention # https://github.com/rails/rails/blob/main/activerecord/lib/active_record/database_configurations.rb#L169 final_spec = file_spec.keys.map do |env| config = file_spec[env] if config.is_a?(Hash) && config.all? { |_k, v| v.is_a?(Hash) } [env, config] else [env, config.merge(url_spec)] end end.to_h app.set :database, final_spec elsif ENV['DATABASE_URL'] app.set :database, ENV['DATABASE_URL'] elsif File.exist?("#{Dir.pwd}/config/database.yml") app.set :database_file, "#{Dir.pwd}/config/database.yml" end unless defined?(Rake) || [:test, :production].include?(app.settings.environment) ActiveRecord::Base.logger = Logger.new(STDOUT) end app.helpers ActiveRecordHelper # re-connect if database connection dropped (Rails 3 only) app.before do if ActiveRecord::VERSION::MAJOR == 3 ActiveRecord::Base.verify_active_connections! if ActiveRecord::Base.respond_to?(:verify_active_connections!) end end app.after do if ActiveRecord::VERSION::MAJOR < 7 ActiveRecord::Base.clear_active_connections! else ActiveRecord::Base.connection_handler.clear_active_connections! end end end
def database
def database ActiveRecord::Base end
def database=(spec)
def database=(spec) if spec.is_a?(Hash) and spec.symbolize_keys[environment.to_sym] ActiveRecord::Base.configurations = spec.stringify_keys ActiveRecord::Base.establish_connection(environment.to_sym) elsif spec.is_a?(Hash) ActiveRecord::Base.configurations = { environment.to_s => spec.stringify_keys } ActiveRecord::Base.establish_connection(spec.stringify_keys) else if Gem.loaded_specs["activerecord"].version >= Gem::Version.create('6.0') ActiveRecord::Base.configurations ||= ActiveRecord::DatabaseConfigurations.new({}).resolve(spec) else ActiveRecord::Base.configurations ||= {} ActiveRecord::Base.configurations[environment.to_s] = ActiveRecord::ConnectionAdapters::ConnectionSpecification::ConnectionUrlResolver.new(spec).to_hash end ActiveRecord::Base.establish_connection(spec) end end
def database_file=(path)
def database_file=(path) path = File.join(root, path) if Pathname(path).relative? and root source = ERB.new(File.read(path)).result spec = YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(source) : YAML.load(source) spec ||= {} set :database, spec end