Skip to content

Instantly share code, notes, and snippets.

@dgrr
Created September 26, 2022 14:13
Show Gist options
  • Save dgrr/fb6aa8534def1a35d8dfc4c1af11ceba to your computer and use it in GitHub Desktop.
Save dgrr/fb6aa8534def1a35d8dfc4c1af11ceba to your computer and use it in GitHub Desktop.
#include <iostream>
#include <pqxx/pqxx>
#include <string>
#include <string>
template<size_t I, class It, class T, class Tuple>
std::enable_if_t<(I == std::tuple_size<Tuple>::value - 1)> assign(It it, It end, T& v, Tuple& tp)
{
if (it == end)
return;
v = it->template as<T>();
}
template<size_t I, class It, class T, class Tuple>
std::enable_if_t<(I < std::tuple_size<Tuple>::value - 1)> assign(It it, It end, T& v, Tuple& tp)
{
if (it == end)
return;
v = it->template as<T>();
assign<I+1>(++it, end, std::get<I+1>(tp), tp);
}
template<class Query, class... Types>
void exec(std::string conn_str, Query query, std::vector<std::tuple<Types...>>& vs)
{
pqxx::connection C(conn_str);
pqxx::nontransaction N(C);
auto r = N.exec(query);
vs.resize(r.size());
for (const auto& row : r)
{
auto& tp = vs[row.rownumber()];
assign<0>(row.begin(), row.end(), std::get<0>(tp), tp);
}
}
template<class Query, class... Types>
void exec(std::string conn_str, Query query, std::tuple<Types...>& tp)
{
pqxx::connection C(conn_str);
pqxx::nontransaction N(C);
auto r = N.exec(query);
for (const auto& row : r)
{
assign<0>(row.begin(), row.end(), std::get<0>(tp), tp);
}
}
template<class Query, class T>
void exec(std::string conn_str, Query query, T& v)
{
pqxx::connection C(conn_str);
pqxx::nontransaction N(C);
auto r = N.exec(query);
for (const auto& row : r)
{
if (row.size() > 0)
{
v = row[0].template as<T>();
break;
}
}
C.disconnect();
}
int main()
{
const char *conn_str = "host=localhost port=8812 user=admin password=quest dbname=qdb";
std::vector<std::tuple<std::string, int, double>> vs;
exec(conn_str, "SELECT DISTINCT coin, trades FROM market", vs);
for (auto& v : vs)
std::cout << std::get<0>(v) << " | " << std::get<1>(v) << std::endl;
int x;
exec(conn_str, "SELECT count() from market", x);
std::cout << "count() = " << x << std::endl;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment