@@ -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