Current section
Files
Jump to
Current section
Files
lib/mssqlex/error.ex
defmodule Mssqlex.Error do
@moduledoc """
Defines an error returned from the ODBC adapter.
* `message` is the full message returned by ODBC
* `odbc_code` is an atom representing the returned
[SQLSTATE](https://docs.microsoft.com/en-us/sql/odbc/reference/appendixes/appendix-a-odbc-error-codes)
or the string representation of the code if it cannot be translated.
"""
defexception [:message, :odbc_code]
@type t :: %__MODULE__{
message: binary(),
odbc_code: atom() | binary()
}
@not_allowed_in_transaction_messages [226, 574]
@spec exception(binary()) :: t()
def exception({_, _, reason} = message) do
%__MODULE__{
message: to_string(reason),
odbc_code: get_code(message)
}
end
def exception(message) do
%__MODULE__{
message: to_string(message)
}
end
defp get_code({odbc_code, native_code, _reason}) do
cond do
native_code in @not_allowed_in_transaction_messages ->
:not_allowed_in_transaction
odbc_code !== nil ->
translate(to_string odbc_code)
true -> :unknown
end
end
defp get_code(_), do: :unknown
defp translate("42S01"), do: :base_table_or_view_already_exists
defp translate("42S02"), do: :base_table_or_view_not_found
defp translate("28000"), do: :invalid_authorization
defp translate("42000"), do: :syntax_error_or_access_violation
defp translate(code), do: code
end