mirror of
https://github.com/ash-project/ash_sqlite.git
synced 2024-09-19 12:52:50 +12:00
improvement: fix some error handling
This commit is contained in:
parent
ce26211e25
commit
0f854ebd10
2 changed files with 89 additions and 2 deletions
|
@ -702,6 +702,55 @@ defmodule AshSqlite.DataLayer do
|
|||
)
|
||||
end
|
||||
|
||||
defp handle_raised_error(
|
||||
%Exqlite.Error{
|
||||
message: "FOREIGN KEY constraint failed"
|
||||
},
|
||||
stacktrace,
|
||||
context,
|
||||
resource
|
||||
) do
|
||||
handle_raised_error(
|
||||
Ash.Error.Changes.InvalidChanges.exception(
|
||||
fields: Ash.Resource.Info.primary_key(resource),
|
||||
message: "referenced something that does not exist"
|
||||
),
|
||||
stacktrace,
|
||||
context,
|
||||
resource
|
||||
)
|
||||
end
|
||||
|
||||
defp handle_raised_error(
|
||||
%Exqlite.Error{
|
||||
message: "UNIQUE constraint failed: " <> fields
|
||||
},
|
||||
stacktrace,
|
||||
context,
|
||||
resource
|
||||
) do
|
||||
fields
|
||||
|> String.split(", ")
|
||||
|> Enum.map(fn field ->
|
||||
field |> String.split(".", trim: true) |> Enum.drop(1) |> Enum.at(0)
|
||||
end)
|
||||
|> Enum.map(fn field ->
|
||||
Ash.Resource.Info.attribute(resource, field)
|
||||
end)
|
||||
|> Enum.reject(&is_nil/1)
|
||||
|> Enum.map(fn %{name: name} ->
|
||||
Ash.Error.Changes.InvalidAttribute.exception(
|
||||
field: name,
|
||||
message: "has already been taken"
|
||||
)
|
||||
end)
|
||||
|> handle_raised_error(
|
||||
stacktrace,
|
||||
context,
|
||||
resource
|
||||
)
|
||||
end
|
||||
|
||||
defp handle_raised_error(error, stacktrace, _ecto_changeset, _resource) do
|
||||
{:error, Ash.Error.to_ash_error(error, stacktrace)}
|
||||
end
|
||||
|
|
42
lib/expr.ex
42
lib/expr.ex
|
@ -624,10 +624,48 @@ defmodule AshSqlite.Expr do
|
|||
)
|
||||
|
||||
:|| ->
|
||||
raise "|| operator not supported by AshSqlite"
|
||||
do_dynamic_expr(
|
||||
query,
|
||||
%Fragment{
|
||||
embedded?: pred_embedded?,
|
||||
arguments: [
|
||||
raw: "(CASE WHEN (",
|
||||
casted_expr: left_expr,
|
||||
raw: " == FALSE OR ",
|
||||
casted_expr: left_expr,
|
||||
raw: " IS NULL) THEN ",
|
||||
casted_expr: right_expr,
|
||||
raw: " ELSE ",
|
||||
casted_expr: left_expr,
|
||||
raw: "END)"
|
||||
]
|
||||
},
|
||||
bindings,
|
||||
embedded?,
|
||||
type
|
||||
)
|
||||
|
||||
:&& ->
|
||||
raise "&& operator not supported by AshSqlite"
|
||||
do_dynamic_expr(
|
||||
query,
|
||||
%Fragment{
|
||||
embedded?: pred_embedded?,
|
||||
arguments: [
|
||||
raw: "(CASE WHEN (",
|
||||
casted_expr: left_expr,
|
||||
raw: " == FALSE OR ",
|
||||
casted_expr: left_expr,
|
||||
raw: " IS NULL) THEN ",
|
||||
casted_expr: left_expr,
|
||||
raw: " ELSE ",
|
||||
casted_expr: right_expr,
|
||||
raw: "END)"
|
||||
]
|
||||
},
|
||||
bindings,
|
||||
embedded?,
|
||||
type
|
||||
)
|
||||
|
||||
other ->
|
||||
raise "Operator not implemented #{other}"
|
||||
|
|
Loading…
Reference in a new issue