Skip to content

Commit 4324c9b

Browse files
committed
Implement new checked_out? callback
1 parent 905fa85 commit 4324c9b

File tree

4 files changed

+37
-7
lines changed

4 files changed

+37
-7
lines changed

integration_test/sql/sandbox.exs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,26 +241,42 @@ defmodule Ecto.Integration.SandboxTest do
241241
describe "checkouts" do
242242
test "with transaction inside checkout" do
243243
Sandbox.checkout(TestRepo)
244+
refute TestRepo.checked_out?()
245+
refute TestRepo.in_transaction?()
244246

245247
TestRepo.checkout(fn ->
248+
assert TestRepo.checked_out?()
246249
refute TestRepo.in_transaction?()
247250
TestRepo.transaction(fn ->
251+
assert TestRepo.checked_out?()
248252
assert TestRepo.in_transaction?()
249253
end)
254+
assert TestRepo.checked_out?()
250255
refute TestRepo.in_transaction?()
251256
end)
257+
258+
refute TestRepo.checked_out?()
259+
refute TestRepo.in_transaction?()
252260
end
253261

254262
test "with checkout inside transaction" do
255263
Sandbox.checkout(TestRepo)
264+
refute TestRepo.checked_out?()
265+
refute TestRepo.in_transaction?()
256266

257267
TestRepo.transaction(fn ->
268+
assert TestRepo.checked_out?()
258269
assert TestRepo.in_transaction?()
259270
TestRepo.checkout(fn ->
271+
assert TestRepo.checked_out?()
260272
assert TestRepo.in_transaction?()
261273
end)
274+
assert TestRepo.checked_out?()
262275
assert TestRepo.in_transaction?()
263276
end)
277+
278+
refute TestRepo.checked_out?()
279+
refute TestRepo.in_transaction?()
264280
end
265281
end
266282

lib/ecto/adapters/sql.ex

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ defmodule Ecto.Adapters.SQL do
9797
Ecto.Adapters.SQL.checkout(meta, opts, fun)
9898
end
9999

100+
@impl true
101+
def checked_out?(meta) do
102+
Ecto.Adapters.SQL.checked_out?(meta)
103+
end
104+
100105
@impl true
101106
def loaders({:map, _}, type), do: [&Ecto.Type.embedded_load(type, &1, :json)]
102107
def loaders(:binary_id, type), do: [Ecto.UUID, type]
@@ -636,6 +641,12 @@ defmodule Ecto.Adapters.SQL do
636641
checkout_or_transaction(:run, adapter_meta, opts, callback)
637642
end
638643

644+
@doc false
645+
def checked_out?(adapter_meta) do
646+
%{pid: pool} = adapter_meta
647+
get_conn(pool) != nil
648+
end
649+
639650
## Query
640651

641652
@doc false
@@ -754,13 +765,13 @@ defmodule Ecto.Adapters.SQL do
754765
opts = with_log(telemetry, params, opts ++ default_opts)
755766

756767
case get_conn(pool) do
757-
nil ->
758-
raise "cannot reduce stream outside of transaction"
759-
760-
conn ->
768+
%DBConnection{conn_mode: :transaction} = conn ->
761769
sql
762770
|> apply(:stream, [conn, statement, params, opts])
763771
|> Enumerable.reduce(acc, fun)
772+
773+
_ ->
774+
raise "cannot reduce stream outside of transaction"
764775
end
765776
end
766777

@@ -770,12 +781,13 @@ defmodule Ecto.Adapters.SQL do
770781
opts = with_log(telemetry, params, opts ++ default_opts)
771782

772783
case get_conn(pool) do
773-
nil ->
774-
raise "cannot collect into stream outside of transaction"
775-
conn ->
784+
%DBConnection{conn_mode: :transaction} = conn ->
776785
sql
777786
|> apply(:stream, [conn, statement, params, opts])
778787
|> Collectable.into()
788+
789+
_ ->
790+
raise "cannot collect into stream outside of transaction"
779791
end
780792
end
781793

test/mix/tasks/ecto.dump_load_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ defmodule Mix.Tasks.Ecto.DumpLoadTest do
1313
def dumpers(_, _), do: raise "not implemented"
1414
def loaders(_, _), do: raise "not implemented"
1515
def checkout(_, _, _), do: raise "not implemented"
16+
def checked_out?(_), do: raise "not implemented"
1617
def ensure_all_started(_, _), do: {:ok, []}
1718

1819
def init(_opts) do

test/test_repo.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ defmodule EctoSQL.TestAdapter do
3434
end
3535

3636
def checkout(_, _, _), do: raise "not implemented"
37+
def checked_out?(_), do: raise "not implemented"
3738
def delete(_, _, _, _), do: raise "not implemented"
3839
def insert_all(_, _, _, _, _, _, _, _), do: raise "not implemented"
3940
def rollback(_, _), do: raise "not implemented"

0 commit comments

Comments
 (0)