класс ActiveRecord::ConnectionAdapters::AbstractAdapter
Active Record поддерживает несколько систем баз данных. AbstractAdapter и связанные классы образуют уровень абстракции, что делает это возможным. AbstractAdapter представляет собой подключение к базе данных и предоставляет абстрактный интерфейс для функций, специфичных для базы данных, таких как установление подключения, экранирование значений, построение правильных фрагментов SQL для :offset и :limit опций и т. д.
Все конкретные адаптеры баз данных следуют интерфейсу, заданному в этом классе. ActiveRecord::Base.connection возвращает объект AbstractAdapter, который вы можете использовать.
Большинство методов адаптера полезны во время миграций. В частности, методы экземпляра, предоставляемые SchemaStatements, очень полезны.
Константы
- ADAPTER_NAME
- SIMPLE_INT
Атрибуты
Публичные методы класса
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 88
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 80
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 379 def active? end
Проверяет, активное ли соединение с базой данных. Это включает проверку, действительно ли база данных способна отвечать, то есть, не устарело ли соединение.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 222 def adapter_name self.class::ADAPTER_NAME end
Возвращает удобочитаемое имя адаптера. Используйте смешанный регистр - всегда можно использовать строчные буквы, если нужно.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 444
def case_insensitive_comparison(table, attribute, column, value)
if can_perform_case_insensitive_comparison_for?(column)
table[attribute].lower.eq(table.lower(Arel::Nodes::BindParam.new))
else
table[attribute].eq(Arel::Nodes::BindParam.new)
end
end # File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 436
def case_sensitive_comparison(table, attribute, column, value)
if value.nil?
table[attribute].eq(value)
else
table[attribute].eq(Arel::Nodes::BindParam.new)
end
end # File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 410 def clear_cache! # this should be overridden by concrete adapters end
Очистить кэширование, которое может выполнять адаптер базы данных, например, очистить кэш подготовленных операторов. Это зависит от базы данных.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 458 def close pool.checkin self end
Возвращает соединение в пул соединений.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 144
def collector
if prepared_statements
SQLString.new
else
BindCollector.new
end
end # File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 336 def disable_extension(name) end
Этот метод должен быть реализован адаптерами, поддерживающими расширения.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 370 def disable_referential_integrity yield end
Переопределите для отключения целостности ссылок при выполнении &block.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 392 def disconnect! clear_cache! reset_transaction end
Отключается от базы данных, если уже подключен. В противном случае этот метод ничего не делает.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 340 def enable_extension(name) end
Этот метод должен быть реализован адаптерами, поддерживающими расширения.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 186
def expire
if in_use?
if @owner != Thread.current
raise ActiveRecordError, "Cannot expire connection, " <<
"it is owned by a different thread: #{@owner}. " <<
"Current thread: #{Thread.current}."
end
@owner = nil
else
raise ActiveRecordError, 'Cannot expire connection, it is not currently leased.'
end
end Этот метод должен вызываться только при одновременном удержании мьютекса пула соединений.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 358 def extensions [] end
Список расширений, который должен быть заполнен адаптерами, их поддерживающими.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 363
def index_algorithms
{}
end Список алгоритмов индексов, который должен быть заполнен адаптерами, их поддерживающими.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 165
def lease
if in_use?
msg = 'Cannot lease connection, '
if @owner == Thread.current
msg << 'it is already leased by the current thread.'
else
msg << "it is already in use by a different thread: #{@owner}. " <<
"Current thread: #{Thread.current}."
end
raise ActiveRecordError, msg
end
@owner = Thread.current
end Этот метод должен вызываться только при одновременном удержании мьютекса пула соединений.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 260 def prefetch_primary_key?(table_name = nil) false end
Следует ли выбирать значения первичного ключа из соответствующей последовательности перед оператором вставки? Если true, то next_sequence_value вызывается перед каждой вставкой для задания первичного ключа записи.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 432 def raw_connection @connection end
Предоставляет доступ к базовому драйверу базы данных для этого адаптера. Например, этот метод возвращает объект Mysql2::Client в случае Mysql2Adapter и объект PG::Connection в случае PostgreSQLAdapter.
Это полезно, когда вам нужно вызвать проприетарный метод, такой как методы lo_* PostgreSQL.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 385 def reconnect! clear_cache! reset_transaction end
Отключается от базы данных, если уже подключен, и устанавливает новое соединение с базой данных. Реализаторы должны вызывать super, если они переопределяют стандартную реализацию.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 415 def requires_reloading? false end
Возвращает true, если требуется перезагрузка соединения между запросами для режима разработки.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 403 def reset! # this should be overridden by concrete adapters end
Сбросить состояние этого соединения, настроив СУБД на очистку транзакций и другого состояния на стороне сервера, связанного с подключением. Обычно это операция, зависящая от базы данных.
Стандартная реализация ничего не делает; реализация должна быть переопределена конкретными адаптерами.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 180 def schema_cache=(cache) cache.connection = self @schema_cache = cache end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 160 def schema_creation SchemaCreation.new self end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 253 def supports_advisory_locks? false end
Поддерживает ли этот адаптер консультационные блокировки?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 243 def supports_bulk_alter? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 321 def supports_comments? false end
Поддерживает ли этот адаптер метаданные комментарии к объектам базы данных (таблицы, столбцы, индексы)?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 326 def supports_comments_in_create? false end
Можно ли указать комментарии для таблиц, столбцов и индексов в операторах создания/изменения таблиц?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 311 def supports_datetime_with_precision? false end
Поддерживает ли этот адаптер datetime с точностью?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 239 def supports_ddl_transactions? false end
Поддерживает ли этот адаптер откат DDL-операций в транзакциях? То есть, будут ли CREATE TABLE или ALTER TABLE отменены транзакцией?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 280 def supports_explain? false end
Поддерживает ли этот адаптер explain?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 275 def supports_expression_index? false end
Поддерживает ли этот адаптер индексы выражений?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 290 def supports_extensions? false end
Поддерживает ли этот адаптер расширения базы данных?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 301 def supports_foreign_keys? false end
Поддерживает ли этот адаптер создание ограничений внешнего ключа?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 265 def supports_index_sort_order? false end
Поддерживает ли этот адаптер порядок сортировки индексов?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 296 def supports_indexes_in_create? false end
Поддерживает ли этот адаптер создание индексов в одном операторе с созданием таблицы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 316 def supports_json? false end
Поддерживает ли этот адаптер тип данных json?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 227 def supports_migrations? false end
Поддерживает ли этот адаптер миграции?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 331 def supports_multi_insert? true end
Поддерживает ли этот адаптер вставку нескольких значений?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 270 def supports_partial_index? false end
Поддерживает ли этот адаптер частичные индексы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 233 def supports_primary_key? false end
Может ли этот адаптер определить первичный ключ для таблиц, не привязанных к классу Active Record, например, для соединительных таблиц?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 248 def supports_savepoints? false end
Поддерживает ли этот адаптер сохранение точек?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 285 def supports_transaction_isolation? false end
Поддерживает ли этот адаптер установку уровня изоляции для транзакции?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 306 def supports_views? false end
Поддерживает ли этот адаптер представления?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 213 def unprepared_statement old_prepared_statements, @prepared_statements = @prepared_statements, false yield ensure @prepared_statements = old_prepared_statements end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 156 def valid_type?(type) false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 422 def verify!(*ignored) reconnect! unless active? end
Проверяет, активное ли соединение с базой данных (т.е. не устаревшее). Это выполняется под капотом вызовом active?. Если соединение больше не активно, этот метод переподключится к базе данных.
Защищенные методы экземпляра
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 582
def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil)
@instrumenter.instrument(
"sql.active_record",
sql: sql,
name: name,
binds: binds,
type_casted_binds: type_casted_binds,
statement_name: statement_name,
connection_id: object_id) { yield }
rescue => e
raise translate_exception_class(e, sql)
end # File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 595 def translate_exception(exception, message) # override in derived class ActiveRecord::StatementInvalid.new(message) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 570
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
exception = translate_exception(e, message)
exception.set_backtrace e.backtrace
exception
end # File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 600 def without_prepared_statement?(binds) !prepared_statements || binds.empty? end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.