@@ -64,8 +64,9 @@ class Connection {
6464 .and_then ([&](const auto &_types) {
6565 return DuckDBAppender::make (sql, conn_, columns, _types);
6666 })
67- .and_then ([&](const auto &_appender) {
68- return write_to_appender (_begin, _end, _appender->appender ());
67+ .and_then ([&](auto _appender) {
68+ return write_to_appender (_begin, _end, _appender->appender ())
69+ .and_then ([&](const auto &) { return _appender->close (); });
6970 });
7071 }
7172
@@ -155,7 +156,10 @@ class Connection {
155156 if (!res) {
156157 return res;
157158 }
158- duckdb_appender_end_row (_appender);
159+ const auto state = duckdb_appender_end_row (_appender);
160+ if (state == DuckDBError) {
161+ return error (duckdb_appender_error (_appender));
162+ }
159163 }
160164 return Nothing{};
161165 }
@@ -165,16 +169,17 @@ class Connection {
165169 duckdb_appender _appender) noexcept {
166170 using ViewType =
167171 internal::remove_auto_incr_primary_t <rfl::view_t <const StructT>>;
168- Result<Nothing> res = Nothing{};
169- ViewType (rfl::to_view (_struct)).apply ([&](const auto &_field) {
170- using ValueType = std::remove_cvref_t <std::remove_pointer_t <
171- typename std::remove_cvref_t <decltype (_field)>::Type>>;
172- if (res) {
173- res = duckdb::parsing::Parser<ValueType>::write (*_field.value (),
174- _appender);
175- }
176- });
177- return res;
172+ try {
173+ ViewType (rfl::to_view (_struct)).apply ([&](const auto &_field) {
174+ using ValueType = std::remove_cvref_t <std::remove_pointer_t <
175+ typename std::remove_cvref_t <decltype (_field)>::Type>>;
176+ duckdb::parsing::Parser<ValueType>::write (*_field.value (), _appender)
177+ .value ();
178+ });
179+ } catch (const std::exception &e) {
180+ return error (e.what ());
181+ }
182+ return Nothing{};
178183 }
179184
180185 private:
0 commit comments