mirror of
1
0
Fork 0
ultimate-vim/sources_non_forked/vim-elixir/autoload/db/adapter/get_repos.exs

67 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()