error.ex (1420B)
1 defmodule Postgrex.Error do 2 defexception [:message, :postgres, :connection_id, :query] 3 4 @type t :: %Postgrex.Error{} 5 6 @metadata [:table, :column, :constraint, :hint] 7 8 def exception(opts) do 9 postgres = 10 if fields = Keyword.get(opts, :postgres) do 11 code = fields.code 12 13 fields 14 |> Map.put(:pg_code, code) 15 |> Map.put(:code, Postgrex.ErrorCode.code_to_name(code)) 16 end 17 18 message = Keyword.get(opts, :message) 19 connection_id = Keyword.get(opts, :connection_id) 20 %Postgrex.Error{postgres: postgres, message: message, connection_id: connection_id} 21 end 22 23 def message(e) do 24 if map = e.postgres do 25 IO.iodata_to_binary([ 26 map.severity, 27 ?\s, 28 map.pg_code, 29 ?\s, 30 [?(, Atom.to_string(map.code), ?)], 31 ?\s, 32 map.message, 33 build_query(e.query), 34 build_metadata(map), 35 build_detail(map) 36 ]) 37 else 38 e.message 39 end 40 end 41 42 defp build_query(nil), do: [] 43 defp build_query(query), do: ["\n\n query: ", query] 44 45 defp build_metadata(map) do 46 metadata = for k <- @metadata, v = map[k], do: "\n #{k}: #{v}" 47 48 case metadata do 49 [] -> [] 50 _ -> ["\n" | metadata] 51 end 52 end 53 54 defp build_detail(%{detail: detail}) when is_binary(detail), do: ["\n\n" | detail] 55 defp build_detail(_), do: [] 56 end 57 58 defmodule Postgrex.QueryError do 59 defexception [:message] 60 end