Ecto v3.0.0 Ecto.Adapter behaviour View Source
Specifies the minimal API required from adapters.
Link to this section Summary
Callbacks
The callback invoked in case the adapter needs to inject code
Checks out a connection for the duration of the given function
Returns the dumpers for a given type
Ensure all applications necessary to run the adapter are started
Initializes the adapter supervision tree by returning the children and adapter metadata
Returns the loaders for a given type
Link to this section Types
Link to this section Functions
Returns the adapter metadata from the init/1
callback.
It expects a name or a PID representing a repo.
Link to this section Callbacks
__before_compile__(term(), env :: Macro.Env.t()) :: Macro.t()
The callback invoked in case the adapter needs to inject code.
checkout(adapter_meta(), options :: Keyword.t(), (() -> result)) :: result when result: var
Checks out a connection for the duration of the given function.
In case the adapter provides a pool, this guarantees all of the code
inside the given fun
runs against the same connection.
dumpers(primitive_type :: Ecto.Type.primitive(), ecto_type :: Ecto.Type.t()) :: [(term() -> {:ok, term()} | :error) | Ecto.Type.t()]
Returns the dumpers for a given type.
It receives the primitive type and the Ecto type (which may be primitive as well). It returns a list of dumpers with the given type usually at the beginning.
This allows developers to properly translate values coming from the Ecto into adapter ones. For example, if the database does not support booleans but instead returns 0 and 1 for them, you could add:
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}
All adapters are required to implement a clause for :binary_id types,
since they are adapter specific. If your adapter does not provide
binary ids, you may simply use Ecto.UUID
:
def dumpers(:binary_id, type), do: [type, Ecto.UUID]
def dumpers(_primitive, type), do: [type]
ensure_all_started(config :: Keyword.t(), type :: :application.restart_type()) :: {:ok, [atom()]} | {:error, atom()}
Ensure all applications necessary to run the adapter are started.
init(config :: Keyword.t()) :: {:ok, :supervisor.child_spec(), adapter_meta()}
Initializes the adapter supervision tree by returning the children and adapter metadata.
loaders(primitive_type :: Ecto.Type.primitive(), ecto_type :: Ecto.Type.t()) :: [(term() -> {:ok, term()} | :error) | Ecto.Type.t()]
Returns the loaders for a given type.
It receives the primitive type and the Ecto type (which may be primitive as well). It returns a list of loaders with the given type usually at the end.
This allows developers to properly translate values coming from the adapters into Ecto ones. For example, if the database does not support booleans but instead returns 0 and 1 for them, you could add:
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}
All adapters are required to implement a clause for :binary_id
types,
since they are adapter specific. If your adapter does not provide binary
ids, you may simply use Ecto.UUID
:
def loaders(:binary_id, type), do: [Ecto.UUID, type]
def loaders(_primitive, type), do: [type]