/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* * Copyright 2020-2021 Couchbase, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "core/error_context/query.hxx" #include "core/io/http_context.hxx" #include "core/io/http_message.hxx" #include "core/io/http_traits.hxx" #include "core/json_string.hxx" #include "core/platform/uuid.h" #include "core/timeout_defaults.hxx" #include "couchbase/query_profile.hxx" #include "couchbase/query_scan_consistency.hxx" #include namespace couchbase::core::operations { struct query_response { struct query_metrics { std::chrono::nanoseconds elapsed_time{}; std::chrono::nanoseconds execution_time{}; std::uint64_t result_count{}; std::uint64_t result_size{}; std::uint64_t sort_count{}; std::uint64_t mutation_count{}; std::uint64_t error_count{}; std::uint64_t warning_count{}; }; struct query_problem { std::uint64_t code{}; std::string message{}; std::optional reason{}; std::optional retry{}; }; struct query_meta_data { std::string request_id; std::string client_context_id; std::string status; std::optional metrics{}; std::optional signature{}; std::optional profile{}; std::optional> warnings{}; std::optional> errors{}; }; error_context::query ctx; query_meta_data meta{}; std::optional prepared{}; std::vector rows{}; std::string served_by_node{}; }; struct query_request { using response_type = query_response; using encoded_request_type = io::http_request; using encoded_response_type = io::http_response; using error_context_type = error_context::query; static const inline service_type type = service_type::query; std::string statement; bool adhoc{ true }; bool metrics{ false }; bool readonly{ false }; bool flex_index{ false }; bool preserve_expiry{ false }; std::optional max_parallelism{}; std::optional scan_cap{}; std::optional scan_wait{}; std::optional pipeline_batch{}; std::optional pipeline_cap{}; std::optional scan_consistency{}; std::vector mutation_state{}; std::optional query_context{}; std::optional client_context_id{}; std::optional timeout{}; query_profile profile{ query_profile::off }; std::map> raw{}; std::vector positional_parameters{}; std::map> named_parameters{}; std::optional> row_callback{}; std::optional send_to_node{}; [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context& context); [[nodiscard]] query_response make_response(error_context::query&& ctx, const encoded_response_type& encoded); std::optional ctx_{}; bool extract_encoded_plan_{ false }; std::string body_str{}; std::shared_ptr parent_span{ nullptr }; }; } // namespace couchbase::core::operations namespace couchbase::core::io::http_traits { template<> struct supports_sticky_node : public std::true_type { }; template<> struct supports_parent_span : public std::true_type { }; } // namespace couchbase::core::io::http_traits