Skip to content

Commit 09bcd7f

Browse files
authored
body recursive fetch_all without Enum.reverse (#205)
1 parent 72c1b4b commit 09bcd7f

File tree

1 file changed

+13
-21
lines changed

1 file changed

+13
-21
lines changed

lib/exqlite/sqlite3.ex

+13-21
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,18 @@ defmodule Exqlite.Sqlite3 do
118118

119119
@spec fetch_all(db(), statement(), integer()) :: {:ok, [row()]} | {:error, reason()}
120120
def fetch_all(conn, statement, chunk_size) do
121-
fetch_all(conn, statement, chunk_size, [])
121+
{:ok, try_fetch_all(conn, statement, chunk_size)}
122+
catch
123+
:throw, {:error, _reason} = error -> error
124+
end
125+
126+
defp try_fetch_all(conn, statement, chunk_size) do
127+
case multi_step(conn, statement, chunk_size) do
128+
{:done, rows} -> rows
129+
{:rows, rows} -> rows ++ try_fetch_all(conn, statement, chunk_size)
130+
{:error, _reason} = error -> throw(error)
131+
:busy -> throw({:error, "Database busy"})
132+
end
122133
end
123134

124135
@spec fetch_all(db(), statement()) :: {:ok, [row()]} | {:error, reason()}
@@ -129,26 +140,7 @@ defmodule Exqlite.Sqlite3 do
129140
#
130141
# For now this just works
131142
chunk_size = Application.get_env(:exqlite, :default_chunk_size, 50)
132-
fetch_all(conn, statement, chunk_size, [])
133-
end
134-
135-
defp fetch_all(conn, statement, chunk_size, accum) do
136-
case multi_step(conn, statement, chunk_size) do
137-
{:done, rows} ->
138-
case accum do
139-
[] -> {:ok, rows}
140-
accum -> {:ok, Enum.reverse(rows ++ accum)}
141-
end
142-
143-
{:rows, rows} ->
144-
fetch_all(conn, statement, chunk_size, Enum.reverse(rows) ++ accum)
145-
146-
{:error, reason} ->
147-
{:error, reason}
148-
149-
:busy ->
150-
{:error, "Database busy"}
151-
end
143+
fetch_all(conn, statement, chunk_size)
152144
end
153145

154146
@doc """

0 commit comments

Comments
 (0)