@@ -118,7 +118,18 @@ defmodule Exqlite.Sqlite3 do
118
118
119
119
@ spec fetch_all ( db ( ) , statement ( ) , integer ( ) ) :: { :ok , [ row ( ) ] } | { :error , reason ( ) }
120
120
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
122
133
end
123
134
124
135
@ spec fetch_all ( db ( ) , statement ( ) ) :: { :ok , [ row ( ) ] } | { :error , reason ( ) }
@@ -129,26 +140,7 @@ defmodule Exqlite.Sqlite3 do
129
140
#
130
141
# For now this just works
131
142
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 )
152
144
end
153
145
154
146
@ doc """
0 commit comments