Spec-Zone.ru › Phoenix

Ecto.Adapter поведение

Источник

Определяет минимальный API, необходимый адаптерам.

Краткое описание

Типы

adapter_meta()

Метаданные, возвращаемые обратным вызовом init/1 адаптера.

t()

Обратные вызовы

__before_compile__(env)

Обратный вызов, вызываемый, если адаптеру необходимо внедрить код.

checked_out?(adapter_meta)

Возвращает true, если соединение было получено из пула.

checkout(adapter_meta, config, function)

Получает соединение на время выполнения заданной функции.

dumpers(primitive_type, ecto_type)

Возвращает функции преобразования для заданного типа.

ensure_all_started(config, type)

Запускает все приложения, необходимые для работы адаптера.

init(config)

Инициализирует дерево супервизии адаптера, возвращая дочерние процессы и метаданные адаптера.

loaders(primitive_type, ecto_type)

Возвращает загрузчики для заданного типа.

Функции

lookup_meta(repo_name_or_pid)

Возвращает метаданные адаптера из его обратного вызова init/1.

Типы

adapter_meta()Источник

@type adapter_meta() :: %{
  optional(:stacktrace) => boolean(),
  optional(any()) => any()
}

Метаданные, возвращаемые обратным вызовом init/1 адаптера.

Это должна быть карта. Ecto всегда добавляет в метаданные два ключа:

  • ключ :cache, представляющий собой таблицу ETS, которую можно использовать в качестве кэша (если она доступна)
  • ключ :pid, содержащий PID, возвращённый спецификацией дочернего процесса из init/1

t()Источник

@type t() :: module()

Обратные вызовы

__before_compile__(env)Источник

@macrocallback __before_compile__(env :: Macro.Env.t()) :: Macro.t()

Обратный вызов, вызываемый, если адаптеру необходимо внедрить код.

checked_out?(adapter_meta)Источник

@callback checked_out?(adapter_meta()) :: boolean()

Возвращает true, если соединение было получено из пула.

checkout(adapter_meta, config, function)Источник

@callback checkout(adapter_meta(), config :: Keyword.t(), (-> result)) :: result
when result: var

Получает соединение на время выполнения заданной функции.

Если адаптер предоставляет пул, это гарантирует, что весь код внутри заданного fun будет выполняться с одним и тем же соединением. Это может повысить производительность, например, позволяя нескольким связанным обращениям к хранилищу данных совместно использовать информацию из кэша:

Repo.checkout(fn ->
  for _ <- 1..100 do
    Repo.insert!(%Post{})
  end
end)

Если адаптер не предоставляет пул, достаточно просто вызвать переданную функцию и вернуть её результат.

Если адаптер предоставляет пул, он должен «получить» одно из соединений пула на время вызова функции. Выбранное соединение не передаётся вызываемой функции, поэтому его следует определять с помощью метода, сохраняющего состояние, например, используя словарь текущего процесса, отслеживание процессов или какой-либо другой способ поиска. Убедитесь, что это сохранённое соединение затем используется при реализации других обратных вызовов, таких как Ecto.Adapter.Queryable и Ecto.Adapter.Schema.

dumpers(primitive_type, ecto_type)Источник

@callback dumpers(primitive_type :: Ecto.Type.primitive(), ecto_type :: Ecto.Type.t()) ::
  [
    (term() -> {:ok, term()} | :error) | Ecto.Type.t()
  ]

Возвращает функции преобразования для заданного типа.

Функция получает примитивный тип и тип Ecto (который также может быть примитивным). Она возвращает список функций преобразования, обычно помещая заданный тип в начало списка.

Это позволяет разработчикам корректно преобразовывать значения Ecto в значения адаптера. Например, если база данных не поддерживает логические значения, а вместо них возвращает 0 и 1, можно добавить:

def dumpers(:boolean, type), do: [type, &bool_encode/1]
def dumpers(_primitive, type), do: [type]

defp bool_encode(false), do: {:ok, 0}
defp bool_encode(true), do: {:ok, 1}

Все адаптеры должны реализовать условие для типов :binary_id, поскольку они зависят от адаптера. Если адаптер не поддерживает двоичные идентификаторы, можно просто использовать Ecto.UUID:

def dumpers(:binary_id, type), do: [type, Ecto.UUID]
def dumpers(_primitive, type), do: [type]

ensure_all_started(config, type)Источник

@callback ensure_all_started(
  config :: Keyword.t(),
  type :: :permanent | :transient | :temporary
) :: {:ok, [atom()]} | {:error, atom()}

Запускает все приложения, необходимые для работы адаптера.

init(config)Источник

@callback init(config :: Keyword.t()) :: {:ok, :supervisor.child_spec(), adapter_meta()}

Инициализирует дерево супервизии адаптера, возвращая дочерние процессы и метаданные адаптера.

loaders(primitive_type, ecto_type)Источник

@callback loaders(primitive_type :: Ecto.Type.primitive(), ecto_type :: Ecto.Type.t()) ::
  [
    (term() -> {:ok, term()} | :error) | Ecto.Type.t()
  ]

Возвращает загрузчики для заданного типа.

Функция получает примитивный тип и тип Ecto (который также может быть примитивным). Она возвращает список загрузчиков, обычно помещая заданный тип в конец списка.

Это позволяет разработчикам корректно преобразовывать значения адаптеров в значения Ecto. Например, если база данных не поддерживает логические значения, а вместо них возвращает 0 и 1, можно добавить:

def loaders(:boolean, type), do: [&bool_decode/1, type]
def loaders(_primitive, type), do: [type]

defp bool_decode(0), do: {:ok, false}
defp bool_decode(1), do: {:ok, true}

Все адаптеры должны реализовать условие для типов :binary_id, поскольку они зависят от адаптера. Если адаптер не поддерживает двоичные идентификаторы, можно просто использовать Ecto.UUID:

def loaders(:binary_id, type), do: [Ecto.UUID, type]
def loaders(_primitive, type), do: [type]

Функции

lookup_meta(repo_name_or_pid)Источник

Возвращает метаданные адаптера из его обратного вызова init/1.

Функция ожидает имя процесса репозитория. Имя может быть атомом или PID. Для заданного репозитория эту функцию часто вызывают, используя динамический репозиторий:

Ecto.Adapter.lookup_meta(repo.get_dynamic_repo())

Пакет Hex Предварительный просмотр Hex Просмотреть llms.txt Скачать версию ePub

Создано с помощью ExDoc (v0.40.2) для языка программирования Elixir

© 2014 Chris McCord
Licensed under the MIT License.
https://ecto.hexdocs.pm/Ecto.Adapter.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API