@@ -59,15 +59,22 @@ class Connection {
5959 template <class ItBegin , class ItEnd >
6060 Result<Nothing> insert (const dynamic::Insert &_insert_stmt, ItBegin _begin,
6161 ItEnd _end) noexcept {
62+ using namespace std ::ranges::views;
63+
6264 const auto sql = to_sql (_insert_stmt);
6365
66+ auto columns = internal::collect::vector (
67+ _insert_stmt.columns |
68+ transform ([](const auto &_str) { return _str.c_str (); }));
69+
6470 return get_duckdb_logical_types (_insert_stmt.table , _insert_stmt.columns )
65- .and_then ([&](const auto & _types) -> Result<Nothing> {
71+ .and_then ([&](auto _types) -> Result<Nothing> {
6672 duckdb_appender appender{};
6773 if (duckdb_appender_create_query (
6874 conn_->conn (), sql.c_str (),
6975 static_cast <idx_t >(_insert_stmt.columns .size ()),
70- _types.data (), nullptr , nullptr , &appender) == DuckDBError) {
76+ _types.data (), " sqlgen_appended_data" , columns.data (),
77+ &appender) == DuckDBError) {
7178 return error (" Could not create appender." );
7279 }
7380 const auto res = write_to_appender (_begin, _end, appender);
@@ -81,8 +88,12 @@ class Connection {
8188 using ValueType = transpilation::value_t <ContainerType>;
8289 auto res = Ref<duckdb_result>();
8390 duckdb_query (conn_->conn (), to_sql (_query).c_str (), res.get ());
84- return internal::to_container<ContainerType, Iterator<ValueType>>(
85- Iterator<ValueType>(res, conn_));
91+ const auto result =
92+ internal::to_container<ContainerType, Iterator<ValueType>>(
93+ Iterator<ValueType>(res, conn_));
94+ // TODO: Destroy result inside of iterator.
95+ duckdb_destroy_result (res.get ());
96+ return result;
8697 }
8798
8899 Result<Nothing> rollback () noexcept ;
@@ -96,16 +107,27 @@ class Connection {
96107 return error (
97108 " Write operation already in progress - you cannot start another." );
98109 }
99- appender_ = std::make_unique<duckdb_appender>();
100- if (duckdb_appender_create (
101- conn_->conn (),
102- _write_stmt.table .schema ? _write_stmt.table .schema ->c_str ()
103- : nullptr ,
104- _write_stmt.table .name .c_str (), appender_.get ()) == DuckDBError) {
105- appender_ = nullptr ;
106- return error (" Could not create appender." );
107- }
108- return Nothing{};
110+
111+ using namespace std ::ranges::views;
112+
113+ auto columns = internal::collect::vector (
114+ _write_stmt.columns |
115+ transform ([](const auto &_str) { return _str.c_str (); }));
116+
117+ const auto sql = to_sql (_write_stmt);
118+
119+ return get_duckdb_logical_types (_write_stmt.table , _write_stmt.columns )
120+ .and_then ([&](auto _types) -> Result<Nothing> {
121+ appender_ = std::make_unique<duckdb_appender>();
122+ if (duckdb_appender_create_query (
123+ conn_->conn (), sql.c_str (),
124+ static_cast <idx_t >(_write_stmt.columns .size ()), _types.data (),
125+ " sqlgen_appended_data" , columns.data (),
126+ appender_.get ()) == DuckDBError) {
127+ return error (" Could not create appender." );
128+ }
129+ return Nothing{};
130+ });
109131 }
110132
111133 Result<Nothing> end_write () {
@@ -141,13 +163,24 @@ class Connection {
141163 const auto select_from = dynamic::SelectFrom{
142164 .table_or_query = _table, .fields = fields, .limit = dynamic::Limit{0 }};
143165
144- auto res = Ref<duckdb_result>();
166+ duckdb_result res{};
167+
168+ const auto state =
169+ duckdb_query (conn_->conn (), to_sql (select_from).c_str (), &res);
170+
171+ if (state == DuckDBError) {
172+ const auto err = error (duckdb_result_error (&res));
173+ duckdb_destroy_result (&res);
174+ return err;
175+ }
176+
177+ const auto types = internal::collect::vector (
178+ iota (static_cast <idx_t >(0 ), static_cast <idx_t >(fields.size ())) |
179+ transform (std::bind_front (duckdb_column_logical_type, &res)));
145180
146- duckdb_query (conn_-> conn (), to_sql (select_from). c_str (), res. get () );
181+ duckdb_destroy_result (& res);
147182
148- return internal::collect::vector (
149- iota (static_cast <idx_t >(fields.size ())) |
150- transform (std::bind_front (duckdb_column_logical_type, res.get ())));
183+ return types;
151184 }
152185
153186 template <class ItBegin , class ItEnd >
0 commit comments