Decodes the row content into the requested document type using the given serializer.
#include <string>
struct product {
std::string id{};
std::string name{};
double price{};
};
template<>
struct tao::json::traits<product> {
template<template<typename...> class Traits>
static auto as(const tao::json::basic_value<Traits>& v) -> product
{
const auto& object = v.get_object();
return {
object.at("id").template as<std::string>(),
object.at("name").template as<std::string>(),
object.at("price").template as<double>(),
};
}
};
#include <spdlog/fmt/bundled/chrono.h>
#include <spdlog/fmt/bundled/format.h>
#include <tao/json.hpp>
#include <chrono>
#include <string>
int
main(int argc, const char* argv[])
{
if (argc != 5) {
fmt::print("USAGE: ./query_stream couchbase://127.0.0.1 Administrator password default\n");
return 1;
}
const std::string connection_string{ argv[1] };
const std::string username{ argv[2] };
const std::string password{ argv[3] };
const std::string bucket_name{ argv[4] };
auto [connect_err, cluster] =
.get();
if (connect_err) {
fmt::print("unable to connect to the cluster: {}\n", connect_err);
return 1;
}
const auto statement = fmt::format(R"(
SELECT META(d).id AS id, d.name AS name, d.price AS price
FROM `{}` AS d
WHERE d.type = $1
ORDER BY d.price DESC
)",
bucket_name);
const auto options = couchbase::query_options{}
.positional_parameters(std::string{ "streaming-example" })
.metrics(true);
auto [err, result] = cluster.
query_stream(statement, options).get();
if (err) {
fmt::print("unable to start the streaming query: {}\n", err);
return 1;
}
if (const auto signature = result.signature(); signature) {
fmt::println(
"signature: {}",
std::string{ reinterpret_cast<const char*>(signature->data()), signature->size() });
}
fmt::println("{:<24} {:<12} {:>8}", "ID", "NAME", "PRICE");
while (true) {
auto [row_err, row] = result.next().get();
if (row_err) {
fmt::print("streaming query failed mid-stream: {}\n", row_err);
return 1;
}
if (!row) {
break;
}
const auto p = row->content_as<couchbase::codec::tao_json_serializer, product>();
fmt::println("{:<24} {:<12} {:>8.2f}", p.id, p.name, p.price);
}
auto [meta_err, meta] = result.meta_data().get();
if (meta_err) {
fmt::print("unable to retrieve the query metadata: {}\n", meta_err);
return 1;
}
fmt::println("status={}, request_id={}", meta.status(), meta.request_id());
if (const auto& metrics = meta.metrics(); metrics) {
fmt::println("rows={}, elapsed={}",
metrics->result_count(),
std::chrono::duration_cast<std::chrono::milliseconds>(metrics->elapsed_time()));
}
return 0;
}