класс 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 89
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 81
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 397 def active? end
Проверяет, активное ли соединение с базой данных. Включает проверку возможности базы данных отвечать, то есть, не устарело ли соединение.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 230 def adapter_name self.class::ADAPTER_NAME end
Возвращает удобочитаемое имя адаптера. Используйте смешанный регистр — всегда можно использовать строчные буквы, если нужно.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 428 def clear_cache! # this should be overridden by concrete adapters end
Очищает кеширование, которое может выполнять адаптер базы данных, например, очищает кеш подготовленных запросов. Это специфично для базы данных.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 475 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 354 def disable_extension(name) end
Это должно быть реализовано адаптерами, поддерживающими расширения
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 388 def disable_referential_integrity yield end
Переопределить для отключения целостности ссылок во время выполнения &block.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 410 def disconnect! clear_cache! reset_transaction end
Отключается от базы данных, если уже подключено. В противном случае, этот метод ничего не делает.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 358 def enable_extension(name) end
Это должно быть реализовано адаптерами, поддерживающими расширения
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 194
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 376 def extensions [] end
Список расширений, который должен быть заполнен адаптерами, поддерживающими их.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 381
def index_algorithms
{}
end Список алгоритмов индексирования, который должен быть заполнен адаптерами, поддерживающими их.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 173
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 267 def prefetch_primary_key?(table_name = nil) false end
Должны ли значения первичных ключей выбираться из соответствующей последовательности перед оператором вставки? Если true, next_sequence_value вызывается перед каждой вставкой, чтобы установить первичный ключ записи.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 453 def raw_connection @connection end
Предоставляет доступ к базовому драйверу базы данных для этого адаптера. Например, этот метод возвращает объект Mysql2::Client в случае Mysql2Adapter и объект PG::Connection в случае PostgreSQLAdapter.
Это полезно, когда вам нужно вызвать проприетарный метод, такой как методы lo_* PostgreSQL.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 403 def reconnect! clear_cache! reset_transaction end
Отключается от базы данных, если уже подключен, и устанавливает новое подключение к базе данных. Реализаторы должны вызвать super, если они переопределяют реализацию по умолчанию.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 433 def requires_reloading? false end
Возвращает true, если требуется перезагрузка соединения между запросами для режима разработки.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 421 def reset! # this should be overridden by concrete adapters end
Сбросьте состояние этого соединения, указав СУБД очистить транзакции и другие состояния, связанные с соединением, на стороне сервера. Обычно это операция, зависящая от базы данных.
Реализация по умолчанию ничего не делает; реализация должна быть переопределена конкретными адаптерами.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 188 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 260 def supports_advisory_locks? false end
Поддерживает ли этот адаптер консультационные блокировки, принудительно накладываемые приложением?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 250 def supports_bulk_alter? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 334 def supports_comments? false end
Поддерживает ли этот адаптер метаданные комментарии к объектам базы данных (таблицы, столбцы, индексы)?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 339 def supports_comments_in_create? false end
Можно ли указать комментарии к таблицам, столбцам и индексам в операторах создания/изменения таблиц?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 324 def supports_datetime_with_precision? false end
Поддерживает ли этот адаптер тип datetime с точностью?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 246 def supports_ddl_transactions? false end
Поддерживает ли этот адаптер откат DDL-операций в транзакциях? То есть, будут ли CREATE TABLE или ALTER TABLE отменены транзакцией?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 287 def supports_explain? false end
Поддерживает ли этот адаптер explain?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 282 def supports_expression_index? false end
Поддерживает ли этот адаптер индексы по выражениям?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 297 def supports_extensions? false end
Поддерживает ли этот адаптер расширения базы данных?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 308 def supports_foreign_keys? false end
Поддерживает ли этот адаптер создание ограничений внешних ключей?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 314 def supports_foreign_keys_in_create? supports_foreign_keys? end
Поддерживает ли этот адаптер создание ограничений внешних ключей в том же операторе, что и создание таблицы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 272 def supports_index_sort_order? false end
Поддерживает ли этот адаптер порядок сортировки в индексах?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 303 def supports_indexes_in_create? false end
Поддерживает ли этот адаптер создание индексов в том же операторе, что и создание таблицы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 329 def supports_json? false end
Поддерживает ли этот адаптер тип данных json?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 344 def supports_multi_insert? true end
Поддерживает ли этот адаптер множественный ввод?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 277 def supports_partial_index? false end
Поддерживает ли этот адаптер частичные индексы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 255 def supports_savepoints? false end
Поддерживает ли этот адаптер сохраняемые точки?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 292 def supports_transaction_isolation? false end
Поддерживает ли этот адаптер установку уровня изоляции для транзакции?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 319 def supports_views? false end
Поддерживает ли этот адаптер представления?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 349 def supports_virtual_columns? false end
Поддерживает ли этот адаптер виртуальные столбцы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 221 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 440
def verify!(*ignored)
if ignored.size > 0
ActiveSupport::Deprecation.warn("Passing arguments to #verify method of the connection has no effect and has been deprecated. Please remove all arguments from the #verify method call.")
end
reconnect! unless active?
end Проверяет, активен ли сейчас соединение с базой данных (то есть, не устарело ли оно). Это делается "под капотом" вызовом active?. Если соединение больше не активно, то этот метод переподключится к базе данных.
Методы частного экземпляра
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 603
def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil) # :doc:
@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) do
@lock.synchronize do
yield
end
end
rescue => e
raise translate_exception_class(e, sql)
end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.