Skip to content

Commit f291067

Browse files
Make sure we properly handle contraint errors
1 parent 82d0c5f commit f291067

2 files changed

Lines changed: 26 additions & 13 deletions

File tree

include/sqlgen/duckdb/Connection.hpp

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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:

include/sqlgen/duckdb/DuckDBAppender.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ class DuckDBAppender {
6464

6565
duckdb_appender& appender() { return appender_; }
6666

67+
Result<Nothing> close() {
68+
const auto state = duckdb_appender_close(appender_);
69+
if (state == DuckDBError) {
70+
return error(duckdb_appender_error(appender_));
71+
}
72+
return Nothing{};
73+
}
74+
6775
private:
6876
bool destroy_;
6977

0 commit comments

Comments
 (0)