@@ -154,37 +154,9 @@ namespace sqlite {
154154 used (true );
155155 }
156156
157- void _extract (std::function<void (void )> call_back) {
158- int hresult;
159- _start_execute ();
160-
161- while ((hresult = sqlite3_step (_stmt.get ())) == SQLITE_ROW) {
162- call_back ();
163- }
157+ void _extract (std::function<void (void )> call_back);
164158
165- if (hresult != SQLITE_DONE) {
166- errors::throw_sqlite_error (hresult, sql ());
167- }
168- }
169-
170- void _extract_single_value (std::function<void (void )> call_back) {
171- int hresult;
172- _start_execute ();
173-
174- if ((hresult = sqlite3_step (_stmt.get ())) == SQLITE_ROW) {
175- call_back ();
176- } else if (hresult == SQLITE_DONE) {
177- throw errors::no_rows (" no rows to extract: exactly 1 row expected" , sql (), SQLITE_DONE);
178- }
179-
180- if ((hresult = sqlite3_step (_stmt.get ())) == SQLITE_ROW) {
181- throw errors::more_rows (" not all rows extracted" , sql (), SQLITE_ROW);
182- }
183-
184- if (hresult != SQLITE_DONE) {
185- errors::throw_sqlite_error (hresult, sql ());
186- }
187- }
159+ void _extract_single_value (std::function<void (void )> call_back);
188160
189161#ifdef _MSC_VER
190162 sqlite3_stmt* _prepare (const std::u16string& sql) {
@@ -397,6 +369,21 @@ namespace sqlite {
397369 inline row_iterator database_binder::end () {
398370 return row_iterator ();
399371 }
372+ void database_binder::_extract (std::function<void (void )> call_back) {
373+ for (auto &&row[[maybe_unused]] : *this )
374+ call_back ();
375+ }
376+
377+ void database_binder::_extract_single_value (std::function<void (void )> call_back) {
378+ auto iter = begin ();
379+ if (iter == end ())
380+ throw errors::no_rows (" no rows to extract: exactly 1 row expected" , sql (), SQLITE_DONE);
381+
382+ call_back ();
383+
384+ if (++iter != end ())
385+ throw errors::more_rows (" not all rows extracted" , sql (), SQLITE_ROW);
386+ }
400387
401388 namespace sql_function_binder {
402389 template <
0 commit comments