defmodule HAHandler.PGSQL.Watcher do use GenServer require Logger def start_link(opts) do GenServer.start_link(__MODULE__, opts, name: __MODULE__) end @impl true def init(opts) do # Starts a Postgrex child but does not means the connection was # successful. # TODO: set dbconnections backoff and connect hooks # See https://github.com/elixir-ecto/db_connection/blob/master/lib/db_connection.ex#L343 {:ok, pid} = Postgrex.start_link(opts) state = %{ backend: pid, hostname: Keyword.get(opts, :hostname) } {:ok, state} end @impl true def handle_call(:status, _from, %{backend: backend, hostname: hostname} = state) do result = case Postgrex.query(backend, "SELECT version();", []) do {:ok, %Postgrex.Result{rows: [[raw_version_string]]}} -> version = case Regex.run(~r/^PostgreSQL (\d+\.\d+)/, raw_version_string) do [_, version_number] -> version_number _ -> "unknown" end %{hostname: hostname, version: version, status: "up"} {:error, %DBConnection.ConnectionError{message: _msg, reason: err}} -> %{hostname: hostname, version: "unknown", status: err} _ -> %{hostname: hostname, version: "unknown", status: "Unhandled error"} end {:reply, result, state} end end