Packages
ecto
1.0.2
3.14.1
3.14.0
3.13.6
3.13.5
3.13.4
3.13.3
3.13.2
3.13.1
3.13.0
3.12.6
3.12.5
3.12.4
3.12.3
3.12.2
3.12.1
3.12.0
3.11.2
3.11.1
3.11.0
3.10.3
3.10.2
3.10.1
3.10.0
3.9.6
3.9.5
3.9.4
3.9.3
3.9.2
3.9.1
3.9.0
3.8.4
3.8.3
3.8.2
3.8.1
3.8.0
3.7.2
3.7.1
3.7.0
3.6.2
3.6.1
3.6.0
3.5.8
3.5.7
3.5.6
3.5.5
3.5.4
3.5.3
3.5.2
3.5.1
3.5.0
3.5.0-rc.1
3.5.0-rc.0
3.4.6
3.4.5
3.4.4
3.4.3
3.4.2
3.4.1
3.4.0
3.3.4
3.3.3
3.3.2
3.3.1
3.3.0
3.2.5
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
3.1.7
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.9
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-rc.1
3.0.0-rc.0
2.2.12
2.2.11
2.2.10
2.2.9
2.2.8
2.2.7
2.2.6
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.2.0-rc.1
2.2.0-rc.0
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.1.0-rc.5
2.1.0-rc.4
2.1.0-rc.3
2.1.0-rc.2
2.1.0-rc.1
2.1.0-rc.0
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-rc.6
2.0.0-rc.5
2.0.0-rc.4
2.0.0-rc.3
2.0.0-rc.2
2.0.0-rc.1
2.0.0-rc.0
2.0.0-beta.2
2.0.0-beta.1
2.0.0-beta.0
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.16.0
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
0.13.0
0.12.1
0.12.0
0.12.0-rc
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.0
0.3.0
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
A toolkit for data mapping and language integrated query for Elixir
Current section
Files
Jump to
Current section
Files
lib/ecto/repo/supervisor.ex
defmodule Ecto.Repo.Supervisor do
@moduledoc false
use Supervisor
@doc """
Starts the repo supervisor.
"""
def start_link(repo, otp_app, adapter, opts) do
name = opts[:name] || Application.get_env(otp_app, repo)[:name] || repo
Supervisor.start_link(__MODULE__, {name, repo, otp_app, adapter, opts}, [name: name])
end
@doc """
Retrieves and normalizes the configuration for `repo` in `otp_app`.
"""
def config(repo, otp_app, custom) do
if config = Application.get_env(otp_app, repo) do
config = Keyword.merge(config, custom)
{url, config} = Keyword.pop(config, :url)
[otp_app: otp_app, repo: repo] ++ Keyword.merge(config, parse_url(url || ""))
else
raise ArgumentError,
"configuration for #{inspect repo} not specified in #{inspect otp_app} environment"
end
end
@doc """
Parses the OTP configuration for compile time.
"""
def parse_config(repo, opts) do
otp_app = Keyword.fetch!(opts, :otp_app)
config = Application.get_env(otp_app, repo, [])
adapter = opts[:adapter] || config[:adapter]
unless adapter do
raise ArgumentError, "missing :adapter configuration in " <>
"config #{inspect otp_app}, #{inspect repo}"
end
unless Code.ensure_loaded?(adapter) do
raise ArgumentError, "adapter #{inspect adapter} was not compiled, " <>
"ensure it is correct and it is included as a project dependency"
end
{otp_app, adapter, pool(repo, config), config}
end
defp pool(repo, config) do
pool = Keyword.get(config, :pool, Ecto.Pools.Poolboy)
name = Keyword.get(config, :pool_name, default_pool_name(repo, config))
timeout = Keyword.get(config, :timeout, 5000)
{pool, name, timeout}
end
defp default_pool_name(repo, config) do
Module.concat(Keyword.get(config, :name, repo), Pool)
end
@doc """
Parses an Ecto URL allowed in configuration.
The format must be:
"ecto://username:password@hostname:port/database"
or
{:system, "DATABASE_URL"}
"""
def parse_url(""), do: []
def parse_url({:system, env}) when is_binary(env) do
parse_url(System.get_env(env) || "")
end
def parse_url(url) when is_binary(url) do
info = url |> URI.decode() |> URI.parse()
unless info.host do
raise Ecto.InvalidURLError, url: url, message: "host is not present"
end
unless String.match? info.path, ~r"^/([^/])+$" do
raise Ecto.InvalidURLError, url: url, message: "path should be a database name"
end
if info.userinfo do
destructure [username, password], String.split(info.userinfo, ":")
end
database = String.slice(info.path, 1, String.length(info.path))
opts = [username: username,
password: password,
database: database,
hostname: info.host,
port: info.port]
Enum.reject(opts, fn {_k, v} -> is_nil(v) end)
end
## Callbacks
def init({name, repo, otp_app, adapter, opts}) do
opts = config(repo, otp_app, opts)
{default_pool, _, _} = repo.__pool__
opts =
opts
|> Keyword.delete(:name)
|> Keyword.put_new(:pool, default_pool)
|> Keyword.put_new(:pool_name, Module.concat(name, Pool))
children = [
supervisor(adapter, [repo, opts])
]
if Keyword.get(opts, :query_cache_owner, repo == repo.__query_cache__) do
:ets.new(repo.__query_cache__, [:set, :public, :named_table, read_concurrency: true])
end
supervise(children, strategy: :one_for_one)
end
end