Skip to content

Commit c160a6f

Browse files
authored
fix: use mutate repo for queries with locks (#234)
1 parent 691cba8 commit c160a6f

1 file changed

Lines changed: 20 additions & 10 deletions

File tree

lib/ash_sql.ex

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,32 @@
44

55
defmodule AshSql do
66
@moduledoc false
7-
def dynamic_repo(resource, sql_behaviour, %{
8-
__ash_bindings__: %{context: %{data_layer: %{repo: repo}}}
9-
}) do
10-
repo || sql_behaviour.repo(resource, :read)
7+
def dynamic_repo(
8+
resource,
9+
sql_behaviour,
10+
%{
11+
__ash_bindings__: %{context: %{data_layer: %{repo: repo}}}
12+
} = query
13+
) do
14+
repo || sql_behaviour.repo(resource, repo_type(query))
1115
end
1216

13-
def dynamic_repo(resource, sql_behaviour, %struct{context: %{data_layer: %{repo: repo}}}) do
14-
type = struct_to_repo_type(struct)
15-
16-
repo || sql_behaviour.repo(resource, type)
17+
def dynamic_repo(
18+
resource,
19+
sql_behaviour,
20+
%_{context: %{data_layer: %{repo: repo}}} = query
21+
) do
22+
repo || sql_behaviour.repo(resource, repo_type(query))
1723
end
1824

19-
def dynamic_repo(resource, sql_behaviour, %struct{}) do
20-
sql_behaviour.repo(resource, struct_to_repo_type(struct))
25+
def dynamic_repo(resource, sql_behaviour, query) do
26+
sql_behaviour.repo(resource, repo_type(query))
2127
end
2228

29+
defp repo_type(%{lock: lock}) when not is_nil(lock), do: :mutate
30+
defp repo_type(%struct{}), do: struct_to_repo_type(struct)
31+
defp repo_type(_), do: :read
32+
2333
def repo_opts(_repo, sql_behaviour, timeout, tenant, resource) do
2434
if Ash.Resource.Info.multitenancy_strategy(resource) == :context do
2535
[prefix: tenant]

0 commit comments

Comments
 (0)