24 auto cxl = unique_ptr<PGcancel, PQfreeCancel>{PQgetCancel(dbc_.get())};
25 check(!!cxl, dbc_.get());
27 auto stop = std::stop_callback{
28 tok, [&] { PQcancel(cxl.get(), err,
sizeof(err)); }};
30 auto ps = qry.
params() | std::views::transform(params::make) |
31 std::ranges::to<std::vector>();
34 unique_ptr<PGresult, PQclear>{PQexec(dbc_.get(), txt.data())};
35 return fetch(res.get());
37 if (prepared_ != txt) {
38 auto types = std::vector<Oid>(ps.size());
39 for (
size_t i{}; i < ps.size(); ++i)
40 types[i] = params::type(ps[i]);
41 auto res = unique_ptr<PGresult, PQclear>{PQprepare(
45 static_cast<int>(types.size()),
47 auto ec = PQresultStatus(res.get());
48 check(ec == PGRES_COMMAND_OK || ec == PGRES_TUPLES_OK, dbc_.get());
51 auto values = std::vector<char const*>(ps.size());
52 auto lengths = std::vector<int>(ps.size());
53 auto formats = std::vector<int>(ps.size());
54 for (
size_t i{}; i < ps.size(); ++i) {
56 values[i] = params::value(p);
57 lengths[i] = params::length(p);
58 formats[i] = params::format(p);
60 auto res = unique_ptr<PGresult, PQclear>{PQexecPrepared(
68 return fetch(res.get());