diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index af1dd8b80b..6c174a4122 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Load database adapters on demand. Eliminates config.connection_adapters and RAILS_CONNECTION_ADAPTERS. Add your lib directory to the $LOAD_PATH and put your custom adapter in lib/active_record/connection_adapters/adaptername_adapter.rb. This way you can provide custom adapters as plugins or gems without modifying Rails. [Jeremy Kemper] + * Ensure that associations with :dependent => :delete_all respect :conditions option. Closes #8034 [danger, joshpeek, Rick] * belongs_to assignment creates a new proxy rather than modifying its target in-place. #8412 [mmangino@elevatedrails.com] diff --git a/activerecord/lib/active_record.rb b/activerecord/lib/active_record.rb index c4a228053b..7dd89d86d0 100755 --- a/activerecord/lib/active_record.rb +++ b/activerecord/lib/active_record.rb @@ -73,13 +73,7 @@ ActiveRecord::Base.class_eval do include ActiveRecord::AttributeMethods end -unless defined?(RAILS_CONNECTION_ADAPTERS) - RAILS_CONNECTION_ADAPTERS = %w( mysql postgresql sqlite firebird sqlserver db2 oracle sybase openbase frontbase ) -end - -RAILS_CONNECTION_ADAPTERS.each do |adapter| - require "active_record/connection_adapters/" + adapter + "_adapter" -end +require 'active_record/connection_adapters/abstract_adapter' require 'active_record/query_cache' require 'active_record/schema_dumper' diff --git a/activerecord/lib/active_record/connection_adapters/abstract/connection_specification.rb b/activerecord/lib/active_record/connection_adapters/abstract/connection_specification.rb index 1a76050872..918c29114c 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/connection_specification.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/connection_specification.rb @@ -207,7 +207,12 @@ module ActiveRecord spec = spec.symbolize_keys unless spec.key?(:adapter) then raise AdapterNotSpecified, "database configuration does not specify adapter" end adapter_method = "#{spec[:adapter]}_connection" - unless respond_to?(adapter_method) then raise AdapterNotFound, "database configuration specifies nonexistent #{spec[:adapter]} adapter" end + + require "active_record/connection_adapters/#{spec[:adapter]}_adapter" + unless respond_to?(adapter_method) + raise AdapterNotFound, "database configuration specifies nonexistent #{spec[:adapter]} adapter" + end + remove_connection establish_connection(ConnectionSpecification.new(spec, adapter_method)) end diff --git a/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb b/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb new file mode 100644 index 0000000000..0827f61db4 --- /dev/null +++ b/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb @@ -0,0 +1,34 @@ +require 'active_record/connection_adapters/sqlite_adapter' + +module ActiveRecord + class Base + # sqlite3 adapter reuses sqlite_connection. + def self.sqlite3_connection(config) # :nodoc: + parse_sqlite_config!(config) + + unless self.class.const_defined?(:SQLite3) + require_library_or_gem(config[:adapter]) + end + + db = SQLite3::Database.new( + config[:database], + :results_as_hash => true, + :type_translation => false + ) + + db.busy_timeout(config[:timeout]) unless config[:timeout].nil? + + ConnectionAdapters::SQLite3Adapter.new(db, logger) + end + end + + module ConnectionAdapters #:nodoc: + class SQLite3Adapter < SQLiteAdapter # :nodoc: + def table_structure(table_name) + returning structure = @connection.table_info(table_name) do + raise(ActiveRecord::StatementInvalid, "Could not find table '#{table_name}'") if structure.empty? + end + end + end + end +end diff --git a/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb b/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb index 6409fe292a..5da97ceff6 100644 --- a/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb @@ -1,33 +1,11 @@ -# Author: Luke Holden -# Updated for SQLite3: Jamis Buck - require 'active_record/connection_adapters/abstract_adapter' module ActiveRecord class Base class << self - # sqlite3 adapter reuses sqlite_connection. - def sqlite3_connection(config) # :nodoc: - parse_config!(config) - - unless self.class.const_defined?(:SQLite3) - require_library_or_gem(config[:adapter]) - end - - db = SQLite3::Database.new( - config[:database], - :results_as_hash => true, - :type_translation => false - ) - - db.busy_timeout(config[:timeout]) unless config[:timeout].nil? - - ConnectionAdapters::SQLite3Adapter.new(db, logger) - end - # Establishes a connection to the database that's used by all Active Record objects def sqlite_connection(config) # :nodoc: - parse_config!(config) + parse_sqlite_config!(config) unless self.class.const_defined?(:SQLite) require_library_or_gem(config[:adapter]) @@ -47,7 +25,7 @@ module ActiveRecord end private - def parse_config!(config) + def parse_sqlite_config!(config) config[:database] ||= config[:dbfile] # Require database. unless config[:database] @@ -381,14 +359,6 @@ module ActiveRecord end end - class SQLite3Adapter < SQLiteAdapter # :nodoc: - def table_structure(table_name) - returning structure = @connection.table_info(table_name) do - raise(ActiveRecord::StatementInvalid, "Could not find table '#{table_name}'") if structure.empty? - end - end - end - class SQLite2Adapter < SQLiteAdapter # :nodoc: def supports_count_distinct? #:nodoc: false