lib/surgex/repo_helpers/repo_helpers.ex
defmodule Surgex.RepoHelpers do
@moduledoc """
Tools for dynamic setup of Ecto repo opts.
**NOTE: Deprecated in favor of Elixir 1.9 runtime configuration.**
"""
@doc """
Sets repo options from env vars starting with specified prefix.
## Examples
iex> System.put_env("DATABASE_URL", "postgres://localhost")
iex> System.put_env("DATABASE_SERVER_POOL_SIZE", "30")
iex> System.put_env("DATABASE_SSL", "true")
iex> Application.put_env(:phoenix, :serve_endpoints, true)
iex>
iex> final_opts = Surgex.RepoHelpers.set_opts([])
iex>
iex> Keyword.get(final_opts, :url)
"postgres://localhost"
iex> Keyword.get(final_opts, :pool_size)
30
iex> Keyword.get(final_opts, :ssl)
true
"""
def set_opts(opts, env_prefix \\ :database) do
upcase_env_prefix =
env_prefix
|> to_string()
|> String.upcase()
opts
|> set_url("#{upcase_env_prefix}_URL")
|> set_pool_size("#{upcase_env_prefix}_POOL_SIZE")
|> set_server_pool_size("#{upcase_env_prefix}_SERVER_POOL_SIZE")
|> set_ssl("#{upcase_env_prefix}_SSL")
|> set_application_name()
end
@doc """
Sets repo database URL from specified env var.
"""
def set_url(opts, env) do
Keyword.put(opts, :url, System.get_env(env))
end
@doc """
Sets repo database pool size from specified env var.
"""
def set_pool_size(opts, env) do
with env_value when is_binary(env_value) <- System.get_env(env),
{server_pool_size, ""} <- Integer.parse(env_value) do
Keyword.put(opts, :pool_size, server_pool_size)
else
_ -> opts
end
end
@doc """
Sets repo database pool size from specified env var only if Phoenix server is configured to run.
"""
def set_server_pool_size(opts, env) do
if Application.get_env(:phoenix, :serve_endpoints) do
set_pool_size(opts, env)
else
opts
end
end
@doc """
Sets repo database ssl enable from specified env var.
"""
def set_ssl(opts, env) do
with env_value when is_binary(env_value) <- System.get_env(env),
ssl_value <- String.downcase(env_value) do
case ssl_value do
"true" -> Keyword.put(opts, :ssl, true)
"false" -> Keyword.put(opts, :ssl, false)
_ -> opts
end
else
_ -> opts
end
end
@doc """
Sets application_name to the value of APP_NAME env var.
"""
def set_application_name(opts) do
with env_value when is_binary(env_value) <- System.get_env("APP_NAME"),
application_name <- String.slice(env_value, 0, 63),
parameters <- Keyword.get(opts, :parameters, []) do
updated_parameters = Keyword.put(parameters, :application_name, application_name)
Keyword.put(opts, :parameters, updated_parameters)
else
_ -> opts
end
end
end