класс ActiveRecord::ConnectionAdapters::AbstractAdapter
Active Record поддерживает множество систем баз данных. AbstractAdapter и связанные классы образуют слой абстракции, что делает это возможным. AbstractAdapter представляет собой подключение к базе данных и предоставляет абстрактный интерфейс для баз данных, специфичных функций, таких как установление соединения, экранирование значений, построение правильных фрагментов SQL для :offset и :limit параметров и т. д.
Все конкретные адаптеры баз данных следуют интерфейсу, заданному в этом классе. ActiveRecord::Base.connection возвращает объект AbstractAdapter, который вы можете использовать.
Большинство методов в адаптере полезны при миграциях. В частности, методы экземпляра, предоставляемые SchemaStatements, очень полезны.
Константы
- ADAPTER_NAME
- COMMENT_REGEX
- SIMPLE_INT
- TYPE_MAP
Атрибуты
Публичные методы класса
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 297 def self.database_exists?(config) raise NotImplementedError end
Существует ли база данных для данного адаптера?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 57
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 47
def self.type_cast_config_to_integer(config)
if config.is_a?(Integer)
config
elsif SIMPLE_INT.match?(config)
config.to_i
else
config
end
end Публичные методы экземпляра
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 523 def active? end
Проверяет, активное ли соединение с базой данных. Включает проверку способности базы данных отвечать, то есть, не устарело ли соединение.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 292 def adapter_name self.class::ADAPTER_NAME end
Возвращает удобочитаемое имя адаптера. Используйте смешанный регистр — всегда можно использовать строчные буквы, если необходимо.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 514 def all_foreign_keys_valid? true end
Переопределите для проверки всех ограничений внешних ключей в базе данных.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 574
def clear_cache!
@lock.synchronize { @statements.clear } if @statements
end Очистить кэширование, которое может выполнять адаптер базы данных.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 625 def close pool.checkin self end
Возврат соединения в пул соединений.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 467 def disable_extension(name) end
Это должно быть реализовано адаптерами, поддерживающими расширения.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 509 def disable_referential_integrity yield end
Переопределите, чтобы отключить целостность ссылок при выполнении &block.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 547
def discard!
# This should be overridden by concrete adapters.
#
# Prevent @connection's finalizer from touching the socket, or
# otherwise communicating with its server, when it is collected.
if schema_cache.connection == self
schema_cache.connection = nil
end
end Немедленно забывает об этом соединении. В отличие от disconnect!, это не общается с сервером.
После вызова этого метода поведение всех других методов становится неопределенным. Это вызывается внутренне непосредственно перед тем, как виртуальный процесс избавляется от соединения, принадлежащего его родителю.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 536 def disconnect! clear_cache! reset_transaction end
Отсоединяется от базы данных, если уже подключен. В противном случае этот метод ничего не делает.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 471 def enable_extension(name) end
Это должно быть реализовано адаптерами, поддерживающими расширения.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 249
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
@idle_since = Process.clock_gettime(Process::CLOCK_MONOTONIC)
@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 497 def extensions [] end
Список расширений, подлежащий заполнению адаптерами, которые их поддерживают.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 502
def index_algorithms
{}
end Список алгоритмов индексов, подлежащий заполнению адаптерами, которые их поддерживают.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 208
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 324 def prefetch_primary_key?(table_name = nil) false end
Следует ли выбирать значения первичного ключа из соответствующей последовательности перед оператором вставки? Если true, next_sequence_value вызывается перед каждой вставкой, чтобы установить первичный ключ записи.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 175 def prepared_statements? @prepared_statements && !prepared_statements_disabled_cache.include?(object_id) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 141 def preventing_writes? return true if replica? return ActiveRecord::Base.connection_handler.prevent_writes if ActiveRecord.legacy_connection_handling return false if connection_class.nil? connection_class.current_preventing_writes end
Определяет, предотвращаются ли в данный момент записи.
Возвращает true, если соединение является репликацией.
Если приложение использует устаревленное обращение, возвращает true, если connection_handler.prevent_writes установлено.
Если приложение использует новое обращение к соединениям, вернёт true, в зависимости от current_preventing_writes.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 596 def raw_connection disable_lazy_transactions! @connection end
Предоставляет доступ к базовому драйверу базы данных для этого адаптера. Например, этот метод возвращает объект Mysql2::Client в случае Mysql2Adapter и объект PG::Connection в случае PostgreSQLAdapter.
Это полезно в тех случаях, когда вам нужно вызвать собственный метод, такой как методы lo_* PostgreSQL.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 529 def reconnect! clear_cache! reset_transaction end
Отсоединяется от базы данных, если уже подключен, и устанавливает новое соединение с базой данных. Реализаторы должны вызвать super, если они переопределяют стандартную реализацию.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 124 def replica? @config[:replica] || false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 579 def requires_reloading? false end
Возвращает true, если необходимо перезагрузить соединение между запросами для режима разработки.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 563 def reset! # this should be overridden by concrete adapters end
Сбросить состояние этого соединения, направив DBMS на очистку транзакций и других состояний соединения на стороне сервера. Обычно это операция, зависящая от базы данных.
Стандартная реализация ничего не делает; реализация должна быть переопределена конкретными адаптерами.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 229 def role @pool.role end
Роль (например :writing) для текущего подключения. В приложении без множественных ролей возвращается `:writing`.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 239 def schema_cache @pool.get_schema_cache(self) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 243 def schema_cache=(cache) cache.connection = self @pool.set_schema_cache(cache) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 660 def schema_version migration_context.current_version end
Возвращает идентификатор версии схемы, текущей в базе данных. Обычно равно номеру самой последней выполненной миграции, или 0, если нет информации о схеме/ база данных пуста.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 235 def shard @pool.shard end
Раздел (например :default) для текущего подключения. В нефрагментированном приложении возвращается `:default`.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 317 def supports_advisory_locks? false end
Поддерживает ли данный адаптер конфигурационные блокировки?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 307 def supports_bulk_alter? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 384 def supports_check_constraints? false end
Поддерживает ли этот адаптер создание ограничений проверки?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 409 def supports_comments? false end
Поддерживает ли этот адаптер метаданные-комментарии к объектам базы данных (таблицы, столбцы, индексы)?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 414 def supports_comments_in_create? false end
Можно ли задавать комментарии к таблицам, столбцам и индексам в операторах создания/изменения таблицы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 433 def supports_common_table_expressions? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 457 def supports_concurrent_connections? true end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 399 def supports_datetime_with_precision? false end
Поддерживает ли данный адаптер даты и время с точностью?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 303 def supports_ddl_transactions? false end
Поддерживает ли адаптер откат DDL-операций в рамках транзакции? То есть, будет ли CREATE TABLE или ALTER TABLE откатён транзакцией?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 379 def supports_deferrable_constraints? false end
Поддерживает ли этот адаптер создание откладываемых ограничений?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 348 def supports_explain? false end
Поддерживает ли этот адаптер explain?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 343 def supports_expression_index? false end
Поддерживает ли этот адаптер индексы с выражениями?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 358 def supports_extensions? false end
Поддерживает ли этот адаптер расширения базы данных?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 369 def supports_foreign_keys? false end
Поддерживает ли этот адаптер создание ограничений внешнего ключа?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 424 def supports_foreign_tables? false end
Поддерживает ли этот адаптер внешние таблицы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 333 def supports_index_sort_order? false end
Поддерживает ли этот адаптер порядок сортировки индексов?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 364 def supports_indexes_in_create? false end
Поддерживает ли этот адаптер создание индексов в одном операторе с созданием таблицы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 453 def supports_insert_conflict_target? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 445 def supports_insert_on_duplicate_skip? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 449 def supports_insert_on_duplicate_update? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 441 def supports_insert_returning? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 404 def supports_json? false end
Поддерживает ли этот адаптер тип данных json?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 437 def supports_lazy_transactions? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 394 def supports_materialized_views? false end
Поддерживает ли этот адаптер материализованные представления?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 429 def supports_optimizer_hints? false end
Поддерживает ли этот адаптер подсказки оптимизатора?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 338 def supports_partial_index? false end
Поддерживает ли этот адаптер частичные индексы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 328 def supports_partitioned_indexes? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 312 def supports_savepoints? false end
Поддерживает ли этот адаптер сохранения точек?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 353 def supports_transaction_isolation? false end
Поддерживает ли этот адаптер установку уровня изоляции для транзакции?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 374 def supports_validate_constraints? false end
Поддерживает ли этот адаптер создание недействительных ограничений?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 389 def supports_views? false end
Поддерживает ли этот адаптер представления?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 419 def supports_virtual_columns? false end
Поддерживает ли этот адаптер виртуальные столбцы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 568 def throw_away! pool.remove self disconnect! end
Удаляет подключение из пула и отключает его.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 283 def unprepared_statement cache = prepared_statements_disabled_cache.add?(object_id) if @prepared_statements yield ensure cache&.delete(object_id) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 128 def use_metadata_table? @config.fetch(:use_metadata_table, true) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 586 def verify! reconnect! unless active? end
Проверяет, активен ли (т.е. не устарел) подключение к базе данных. Это делается в скрытом режиме вызовом active?. Если подключение больше не активно, этот метод переподключится к базе данных.
Приватные методы экземпляра
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 755
def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil, async: false, &block) # :doc:
@instrumenter.instrument(
"sql.active_record",
sql: sql,
name: name,
binds: binds,
type_casted_binds: type_casted_binds,
statement_name: statement_name,
async: async,
connection: self) do
@lock.synchronize(&block)
rescue => e
raise translate_exception_class(e, sql, binds)
end
end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.