66 lines
1.7 KiB
Elixir
66 lines
1.7 KiB
Elixir
defmodule LoadRepos do
|
|
defp load_apps do
|
|
:code.get_path()
|
|
|> Enum.flat_map(fn app_dir ->
|
|
Path.join(app_dir, "*.app") |> Path.wildcard()
|
|
end)
|
|
|> Enum.map(fn app_file ->
|
|
app_file |> Path.basename() |> Path.rootname(".app") |> String.to_atom()
|
|
end)
|
|
|> Enum.map(&Application.load/1)
|
|
end
|
|
|
|
defp configs do
|
|
for {app, _, _} <- Application.loaded_applications(),
|
|
repos = Application.get_env(app, :ecto_repos),
|
|
is_list(repos) and repos != [],
|
|
repo <- repos,
|
|
do: {repo, Map.new(repo.config())}
|
|
end
|
|
|
|
defp config_to_url(_, %{url: url}), do: url
|
|
|
|
defp config_to_url(repo, config) do
|
|
host =
|
|
case Map.fetch(config, :socket_dir) do
|
|
:error -> Map.fetch!(config, :hostname)
|
|
{:ok, socket_dir} -> socket_dir
|
|
end
|
|
username = Map.get(config, :username)
|
|
password = Map.get(config, :password)
|
|
database = Map.get(config, :database)
|
|
parameters = Map.get(config, :parameters, [])
|
|
|
|
%URI{
|
|
scheme: adapter_to_string(repo.__adapter__),
|
|
host: "",
|
|
path: Path.join("/", database),
|
|
query: encode_options([host: host, user: username, password: password] ++ parameters)
|
|
}
|
|
|> URI.to_string()
|
|
end
|
|
|
|
defp adapter_to_string(Ecto.Adapters.Postgres), do: "postgres"
|
|
defp adapter_to_string(Ecto.Adapters.MySQL), do: "mysql"
|
|
defp adapter_to_string(mod), do: raise("Unknown adapter #{inspect(mod)}")
|
|
|
|
defp encode_options(opts) do
|
|
cleaned =
|
|
for {k, v} <- opts, not is_nil(v), do: {k, v}
|
|
|
|
URI.encode_query(cleaned)
|
|
end
|
|
|
|
def main do
|
|
load_apps()
|
|
|
|
configs()
|
|
|> Enum.map(fn {repo, config} ->
|
|
[inspect(repo), ?\s, config_to_url(repo, config)]
|
|
end)
|
|
|> Enum.intersperse(?\n)
|
|
|> IO.puts()
|
|
end
|
|
end
|
|
|
|
LoadRepos.main()
|