класс ActiveRecord::ConnectionAdapters::AbstractAdapter
Active Record поддерживает множество систем баз данных. AbstractAdapter и связанные классы образуют уровень абстракции, который делает это возможным. AbstractAdapter представляет собой соединение с базой данных и предоставляет абстрактный интерфейс для функций, специфичных для базы данных, таких как установление соединения, экранирование значений, построение правильных SQL фрагментов для опций ':offset' и ':limit' и т. д.
Все конкретные адаптеры баз данных следуют интерфейсу, определённому в этом классе. ActiveRecord::Base.connection возвращает объект AbstractAdapter, который вы можете использовать.
Большинство методов адаптера полезны во время миграций. Особенно полезны методы экземпляра, предоставляемые SchemaStatement.
Константы
- SIMPLE_INT
Атрибуты
Публичные методы класса
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 85
def self.type_cast_config_to_boolean(config)
if config == "false"
false
else
config
end
end # File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 77
def self.type_cast_config_to_integer(config)
if config =~ SIMPLE_INT
config.to_i
else
config
end
end Публичные методы экземпляра
Проверяет, активно ли соединение с базой данных. Это включает проверку того, способна ли база данных фактически отвечать, то есть не устарело ли соединение.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 262 def active? end
Адаптер должен переопределить это, если ему нужен потокобезопасный способ приблизительной оценки активности соединения
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 267 def active_threadsafe? active? end
Возвращает читаемое имя адаптера. Используйте смешанный регистр — при необходимости всегда можно использовать нижний регистр.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 147 def adapter_name 'Abstract' end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 343 def case_insensitive_comparison(table, attribute, column, value) table[attribute].lower.eq(table.lower(value)) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 339 def case_sensitive_modifier(node) node end
Очищает любое кэширование, которое может выполнять адаптер базы данных, например, очищает кэш подготовленных запросов. Это зависит от базы данных.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 299 def clear_cache! # this should be overridden by concrete adapters end
Возвращает соединение в пул соединений
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 352 def close pool.checkin self end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 330 def create_savepoint(name = nil) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 347
def current_savepoint_name
"active_record_#{open_transactions}"
end Предназначено для реализации адаптерами, которые поддерживают расширения
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 223 def disable_extension(name) end
Переопределите, чтобы отключить целостность ссылок при выполнении &block.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 253 def disable_referential_integrity yield end
Отключается от базы данных, если уже подключено. В противном случае этот метод ничего не делает.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 281 def disconnect! clear_cache! reset_transaction end
Предназначено для реализации адаптерами, которые поддерживают расширения
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 227 def enable_extension(name) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 129 def expire @in_use = false end
Список расширений, который должен заполняться адаптерами, которые их поддерживают. На данный момент только postgresql.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 232 def extensions [] end
Список алгоритмов индексирования, который должен заполняться адаптерами, которые их поддерживают. Сейчас поддержку имеют MySQL и PostgreSQL.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 238
def index_algorithms
{}
end # File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 115
def lease
synchronize do
unless in_use
@in_use = true
@last_use = Time.now
end
end
end # File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 326 def open_transactions @transaction.number end
Следует ли выбирать значения первичных ключей из соответствующих последовательностей перед оператором вставки? Если true, то next_sequence_value вызывается перед каждой вставкой для установки первичного ключа записи. Это false для всех адаптеров, кроме Firebird.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 191 def prefetch_primary_key?(table_name = nil) false end
Обеспечивает доступ к базовому драйверу базы данных для этого адаптера. Например, этот метод возвращает объект Mysql в случае MysqlAdapter и объект PGconn в случае PostgreSQLAdapter.
Это полезно, когда вам нужно вызвать собственный метод, например, методы lo_* в PostgreSQL.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 322 def raw_connection @connection end
Отключается от базы данных, если уже подключено, и устанавливает новое соединение с базой данных. Реализаторы должны вызвать super, если они переопределяют реализацию по умолчанию.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 274 def reconnect! clear_cache! reset_transaction end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 336 def release_savepoint(name = nil) end
Возвращает true, если требуется перезагрузить соединение между запросами для режима разработки. Это не так для Ruby/MySQL, и это не нужно для каких-либо адаптеров, кроме SQLite.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 305 def requires_reloading? false end
Сбросить состояние этого соединения, направив СУБД на очистку транзакций и другого состояния серверной стороны, связанного с соединением. Обычно это операция, зависящая от базы данных.
Реализация по умолчанию ничего не делает; реализация должна быть переопределена конкретными адаптерами.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 292 def reset! # this should be overridden by concrete adapters end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 333 def rollback_to_savepoint(name = nil) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 124 def schema_cache=(cache) cache.connection = self @schema_cache = cache end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 111 def schema_creation SchemaCreation.new self end
Возвращает значение подстановки связывания, учитывая параметр связывания index и column. ПРИМЕЧАНИЕ: Параметр column в настоящее время используется адаптером sqlserver.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 246 def substitute_at(column, index) Arel::Nodes::BindParam.new '?' end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 177 def supports_bulk_alter? false end
Поддерживает ли этот адаптер использование DISTINCT в COUNT? Это true для всех адаптеров, кроме sqlite.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 166 def supports_count_distinct? true end
Поддерживает ли этот адаптер откат DDL в транзакциях? То есть, CREATE TABLE или ALTER TABLE будут отменены транзакцией? PostgreSQL, SQL Server и другие поддерживают это. MySQL и другие — нет.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 173 def supports_ddl_transactions? false end
Поддерживает ли этот адаптер explain? На данный момент sqlite3, mysql2 и postgresql — единственные, кто это делают.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 207 def supports_explain? false end
Поддерживает ли этот адаптер расширения базы данных? На данный момент только postgresql.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 218 def supports_extensions? false end
Поддерживает ли этот адаптер порядок сортировки индекса?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 196 def supports_index_sort_order? false end
Поддерживает ли этот адаптер миграции? Зависит от бэкенда, так как абстрактный адаптер всегда возвращает false.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 153 def supports_migrations? false end
Поддерживает ли этот адаптер частичные индексы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 201 def supports_partial_index? false end
Может ли этот адаптер определить первичный ключ для таблиц, не присоединённых к классу Active Record, например, для таблиц объединения? Зависит от бэкенда, так как абстрактный адаптер всегда возвращает false.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 160 def supports_primary_key? false end
Поддерживает ли этот адаптер savepoints? PostgreSQL и MySQL поддерживают, SQLite < 3.6.8 — нет.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 183 def supports_savepoints? false end
Поддерживает ли этот адаптер установку уровня изоляции для транзакции?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 212 def supports_transaction_isolation? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 137 def unprepared_statement old_prepared_statements, @prepared_statements = @prepared_statements, false old_visitor, @visitor = @visitor, unprepared_visitor yield ensure @visitor, @prepared_statements = old_visitor, old_prepared_statements end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 133 def unprepared_visitor self.class::BindSubstitution.new self end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 107 def valid_type?(type) true end
Проверяет, активен ли (т.е. не устарел) соединение с базой данных. Это выполняется внутри, вызывая active?. Если соединение больше не активно, то этот метод переподключиться к базе данных.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 312 def verify!(*ignored) reconnect! unless active? end
Защищенные методы экземпляра
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 371
def log(sql, name = "SQL", binds = [], statement_name = nil)
@instrumenter.instrument(
"sql.active_record",
:sql => sql,
:name => name,
:connection_id => object_id,
:statement_name => statement_name,
:binds => binds) { yield }
rescue => e
raise translate_exception_class(e, sql)
end # File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 383 def translate_exception(exception, message) # override in derived class ActiveRecord::StatementInvalid.new(message, exception) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 358
def translate_exception_class(e, sql)
begin
message = "#{e.class.name}: #{e.message}: #{sql}"
rescue Encoding::CompatibilityError
message = "#{e.class.name}: #{e.message.force_encoding sql.encoding}: #{sql}"
end
@logger.error message if @logger
exception = translate_exception(e, message)
exception.set_backtrace e.backtrace
exception
end # File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 388 def without_prepared_statement?(binds) !@prepared_statements || binds.empty? end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.