Ecto.Adapter поведение
ИсточникОпределяет минимальный API, необходимый адаптерам.
Краткое описание
- adapter_meta()
Метаданные, возвращаемые обратным вызовом
init/1адаптера.
Типы
- __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())
© 2014 Chris McCord
Licensed under the MIT License.
https://ecto.hexdocs.pm/Ecto.Adapter.html