couchbase 3.8.1 → 3.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/ext/CMakeLists.txt +16 -1
- data/ext/cache/cpm/{CPM_0.42.0.cmake → CPM_0.43.1.cmake} +18 -2
- data/ext/cache/extconf_include.rb +6 -6
- data/ext/cache/mozilla-ca-bundle.crt +214 -155
- data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
- data/ext/couchbase/CMakeLists.txt +130 -21
- data/ext/couchbase/cmake/APKBUILD.in +25 -4
- data/ext/couchbase/cmake/Bundler.cmake +143 -34
- data/ext/couchbase/cmake/CPM.cmake +126 -12
- data/ext/couchbase/cmake/Cache.cmake +7 -1
- data/ext/couchbase/cmake/CompilerOptions.cmake +1 -1
- data/ext/couchbase/cmake/CompilerWarnings.cmake +17 -6
- data/ext/couchbase/cmake/GrpcProtobuf.cmake +481 -0
- data/ext/couchbase/cmake/OpenSSL.cmake +10 -3
- data/ext/couchbase/cmake/Packaging.cmake +519 -65
- data/ext/couchbase/cmake/Protostellar.cmake +250 -0
- data/ext/couchbase/cmake/Sanitizers.cmake +61 -50
- data/ext/couchbase/cmake/StaticAnalyzers.cmake +16 -5
- data/ext/couchbase/cmake/TestFramework.cmake +283 -0
- data/ext/couchbase/cmake/TestFrameworkAddTests.cmake +51 -0
- data/ext/couchbase/cmake/Testing.cmake +27 -9
- data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +141 -8
- data/ext/couchbase/cmake/VersionInfo.cmake +50 -0
- data/ext/couchbase/cmake/build_config.hxx.in +2 -1
- data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +101 -23
- data/ext/couchbase/cmake/couchbase_cxx_client_static-config.cmake.in +7 -0
- data/ext/couchbase/cmake/couchbase_cxx_client_static.pc.in +2 -0
- data/ext/couchbase/cmake/gRPC_Generate.cmake +58 -0
- data/ext/couchbase/cmake/protobuf_Generate.cmake +69 -0
- data/ext/couchbase/cmake/require-git-checkout.cmake +25 -0
- data/ext/couchbase/cmake/tarball_glob.txt +49 -0
- data/ext/couchbase/core/agent_group.cxx +0 -8
- data/ext/couchbase/core/agent_group.hxx +0 -4
- data/ext/couchbase/core/analytics_stream.cxx +314 -0
- data/ext/couchbase/core/analytics_stream.hxx +129 -0
- data/ext/couchbase/core/analytics_stream_component.cxx +245 -0
- data/ext/couchbase/core/analytics_stream_component.hxx +67 -0
- data/ext/couchbase/core/app_telemetry_meter.cxx +25 -3
- data/ext/couchbase/core/app_telemetry_meter.hxx +77 -0
- data/ext/couchbase/core/app_telemetry_reporter.cxx +7 -6
- data/ext/couchbase/core/bucket.cxx +381 -87
- data/ext/couchbase/core/bucket.hxx +105 -25
- data/ext/couchbase/core/bucket_unit_test_api.hxx +57 -0
- data/ext/couchbase/core/capella.hxx +91 -0
- data/ext/couchbase/core/cluster.cxx +1554 -398
- data/ext/couchbase/core/cluster.hxx +39 -8
- data/ext/couchbase/core/cluster_agent.cxx +0 -8
- data/ext/couchbase/core/cluster_agent.hxx +0 -4
- data/ext/couchbase/core/cluster_options.hxx +26 -3
- data/ext/couchbase/core/collections_component.cxx +39 -15
- data/ext/couchbase/core/config_profiles.cxx +1 -1
- data/ext/couchbase/core/crud_component.cxx +2 -2
- data/ext/couchbase/core/crud_options.hxx +34 -0
- data/ext/couchbase/core/crypto/cbcrypto.cc +18 -13
- data/ext/couchbase/core/document_id_redaction.hxx +81 -0
- data/ext/couchbase/core/error_context/base_error_context.hxx +7 -6
- data/ext/couchbase/core/error_context/key_value.cxx +25 -2
- data/ext/couchbase/core/error_context/key_value.hxx +60 -33
- data/ext/couchbase/core/error_context/key_value_error_context.hxx +16 -15
- data/ext/couchbase/core/error_context/search.hxx +5 -0
- data/ext/couchbase/core/error_context/search_json.hxx +3 -0
- data/ext/couchbase/core/error_context/subdocument_error_context.hxx +19 -18
- data/ext/couchbase/core/error_context/view.hxx +5 -0
- data/ext/couchbase/core/free_form_http_request.cxx +237 -4
- data/ext/couchbase/core/free_form_http_request.hxx +41 -8
- data/ext/couchbase/core/http_component.cxx +300 -284
- data/ext/couchbase/core/http_component.hxx +0 -4
- data/ext/couchbase/core/impl/analytics.cxx +38 -5
- data/ext/couchbase/core/impl/analytics.hxx +34 -0
- data/ext/couchbase/core/impl/bootstrap_error.hxx +0 -3
- data/ext/couchbase/core/impl/collection.cxx +215 -202
- data/ext/couchbase/core/impl/collection_manager.cxx +1 -1
- data/ext/couchbase/core/impl/dns_srv_tracker.cxx +45 -18
- data/ext/couchbase/core/impl/error.cxx +22 -2
- data/ext/couchbase/core/impl/internal_analytics_stream_result.hxx +111 -0
- data/ext/couchbase/core/impl/internal_query_stream_result.hxx +110 -0
- data/ext/couchbase/core/impl/invoke_with_node_id.hxx +15 -7
- data/ext/couchbase/core/impl/key_value_error_category.cxx +6 -0
- data/ext/couchbase/core/impl/lookup_in_replica.cxx +10 -10
- data/ext/couchbase/core/impl/lookup_in_replica.hxx +4 -4
- data/ext/couchbase/core/impl/node_id.cxx +49 -13
- data/ext/couchbase/core/impl/observability_recorder.cxx +12 -2
- data/ext/couchbase/core/impl/observe_poll.cxx +63 -23
- data/ext/couchbase/core/impl/public_analytics_stream_result.cxx +372 -0
- data/ext/couchbase/core/impl/public_bucket.cxx +48 -2
- data/ext/couchbase/core/impl/public_cluster.cxx +325 -25
- data/ext/couchbase/core/impl/public_query_stream_result.cxx +380 -0
- data/ext/couchbase/core/impl/public_transaction_get_multi_replicas_from_preferred_server_group_result.cxx +42 -0
- data/ext/couchbase/core/impl/public_transaction_get_multi_result.cxx +42 -0
- data/ext/couchbase/core/impl/query.cxx +76 -7
- data/ext/couchbase/core/impl/query.hxx +36 -0
- data/ext/couchbase/core/impl/query_index_manager.cxx +54 -1
- data/ext/couchbase/core/impl/replica_utils.cxx +101 -0
- data/ext/couchbase/core/impl/replica_utils.hxx +64 -0
- data/ext/couchbase/core/impl/resolve_node_id.hxx +125 -0
- data/ext/couchbase/core/impl/scope.cxx +70 -0
- data/ext/couchbase/core/impl/search.cxx +31 -1
- data/ext/couchbase/core/impl/transactions.cxx +130 -0
- data/ext/couchbase/core/impl/wait_until_ready.cxx +439 -0
- data/ext/couchbase/core/impl/wait_until_ready.hxx +110 -0
- data/ext/couchbase/core/impl/with_bucket_config_or_timeout.hxx +180 -0
- data/ext/couchbase/core/impl/with_cancellation.hxx +11 -3
- data/ext/couchbase/core/io/configuration_belongs_to_session.hxx +66 -0
- data/ext/couchbase/core/io/dns_client.cxx +122 -45
- data/ext/couchbase/core/io/dns_codec.hxx +21 -21
- data/ext/couchbase/core/io/dns_config.cxx +21 -6
- data/ext/couchbase/core/io/http_command.hxx +149 -121
- data/ext/couchbase/core/io/http_error.hxx +107 -0
- data/ext/couchbase/core/io/http_parser.cxx +4 -0
- data/ext/couchbase/core/io/http_session.cxx +606 -154
- data/ext/couchbase/core/io/http_session.hxx +147 -30
- data/ext/couchbase/core/io/http_session_manager.hxx +329 -382
- data/ext/couchbase/core/io/http_streaming_parser.cxx +4 -0
- data/ext/couchbase/core/io/http_streaming_response.cxx +328 -43
- data/ext/couchbase/core/io/http_streaming_response.hxx +37 -3
- data/ext/couchbase/core/io/mcbp_buffer_pool.hxx +122 -0
- data/ext/couchbase/core/io/mcbp_command.hxx +150 -51
- data/ext/couchbase/core/io/mcbp_command_id.hxx +45 -0
- data/ext/couchbase/core/io/mcbp_message.cxx +9 -1
- data/ext/couchbase/core/io/mcbp_message.hxx +19 -0
- data/ext/couchbase/core/io/mcbp_output_queue.hxx +150 -0
- data/ext/couchbase/core/io/mcbp_parser.cxx +24 -7
- data/ext/couchbase/core/io/mcbp_session.cxx +316 -317
- data/ext/couchbase/core/io/mcbp_session.hxx +27 -18
- data/ext/couchbase/core/io/opaque_ring_table.hxx +145 -0
- data/ext/couchbase/core/io/retry_orchestrator.hxx +6 -5
- data/ext/couchbase/core/io/stream_deadline.hxx +50 -0
- data/ext/couchbase/core/io/streams.cxx +275 -14
- data/ext/couchbase/core/io/streams.hxx +53 -0
- data/ext/couchbase/core/logger/logger.cxx +36 -0
- data/ext/couchbase/core/logger/logger.hxx +46 -6
- data/ext/couchbase/core/logger/redaction.hxx +503 -0
- data/ext/couchbase/core/management/eventing_status.hxx +10 -0
- data/ext/couchbase/core/management/eventing_status_json.hxx +4 -0
- data/ext/couchbase/core/mcbp/big_endian.cxx +1 -1
- data/ext/couchbase/core/mcbp/codec.cxx +27 -18
- data/ext/couchbase/core/mcbp/operation_queue.cxx +2 -2
- data/ext/couchbase/core/mcbp/packet.hxx +2 -2
- data/ext/couchbase/core/mcbp/queue_request.cxx +23 -6
- data/ext/couchbase/core/mcbp/queue_request.hxx +21 -0
- data/ext/couchbase/core/meta/features.hxx +13 -0
- data/ext/couchbase/core/meta/version.cxx +6 -3
- data/ext/couchbase/core/metrics/logging_meter.cxx +5 -10
- data/ext/couchbase/core/metrics/meter_wrapper.cxx +63 -33
- data/ext/couchbase/core/metrics/meter_wrapper.hxx +55 -3
- data/ext/couchbase/core/operations/analytics_response_parsing.cxx +177 -0
- data/ext/couchbase/core/operations/analytics_response_parsing.hxx +55 -0
- data/ext/couchbase/core/operations/document_analytics.cxx +48 -130
- data/ext/couchbase/core/operations/document_analytics.hxx +14 -2
- data/ext/couchbase/core/operations/document_get_all_replicas.hxx +15 -7
- data/ext/couchbase/core/operations/document_get_any_replica.hxx +19 -8
- data/ext/couchbase/core/operations/document_get_projected.cxx +1 -1
- data/ext/couchbase/core/{impl/get_replica.cxx → operations/document_get_replica.cxx} +21 -3
- data/ext/couchbase/core/{impl/get_replica.hxx → operations/document_get_replica.hxx} +31 -4
- data/ext/couchbase/core/operations/document_lookup_in.cxx +10 -10
- data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +228 -198
- data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +215 -217
- data/ext/couchbase/core/operations/document_query.cxx +108 -221
- data/ext/couchbase/core/operations/document_query.hxx +18 -4
- data/ext/couchbase/core/operations/document_search.cxx +52 -8
- data/ext/couchbase/core/operations/document_search.hxx +3 -0
- data/ext/couchbase/core/operations/document_view.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_dataset_create.cxx +15 -8
- data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +4 -0
- data/ext/couchbase/core/operations/management/analytics_dataset_drop.cxx +11 -6
- data/ext/couchbase/core/operations/management/analytics_dataset_get_all.cxx +3 -2
- data/ext/couchbase/core/operations/management/analytics_dataverse_create.cxx +10 -5
- data/ext/couchbase/core/operations/management/analytics_dataverse_drop.cxx +10 -5
- data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.cxx +2 -1
- data/ext/couchbase/core/operations/management/analytics_index_create.cxx +33 -8
- data/ext/couchbase/core/operations/management/analytics_index_drop.cxx +12 -7
- data/ext/couchbase/core/operations/management/analytics_index_get_all.cxx +3 -2
- data/ext/couchbase/core/operations/management/analytics_link_connect.cxx +11 -6
- data/ext/couchbase/core/operations/management/analytics_link_create.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_link_disconnect.cxx +10 -4
- data/ext/couchbase/core/operations/management/analytics_link_drop.cxx +6 -4
- data/ext/couchbase/core/operations/management/analytics_link_get_all.cxx +4 -3
- data/ext/couchbase/core/operations/management/analytics_link_replace.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_link_utils.hxx +1 -1
- data/ext/couchbase/core/operations/management/bucket_create.cxx +37 -38
- data/ext/couchbase/core/operations/management/bucket_update.cxx +26 -28
- data/ext/couchbase/core/operations/management/change_password.cxx +2 -0
- data/ext/couchbase/core/operations/management/collection_drop.cxx +5 -1
- data/ext/couchbase/core/operations/management/error_utils.cxx +59 -5
- data/ext/couchbase/core/operations/management/error_utils.hxx +29 -1
- data/ext/couchbase/core/operations/management/eventing_deploy_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_drop_function.cxx +8 -3
- data/ext/couchbase/core/operations/management/eventing_get_all_functions.cxx +4 -2
- data/ext/couchbase/core/operations/management/eventing_get_function.cxx +5 -3
- data/ext/couchbase/core/operations/management/eventing_get_status.cxx +4 -2
- data/ext/couchbase/core/operations/management/eventing_pause_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_resume_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_undeploy_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_upsert_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/group_drop.cxx +3 -1
- data/ext/couchbase/core/operations/management/group_get.cxx +3 -1
- data/ext/couchbase/core/operations/management/group_upsert.cxx +11 -8
- data/ext/couchbase/core/operations/management/query_index_build.cxx +5 -2
- data/ext/couchbase/core/operations/management/query_index_create.cxx +9 -3
- data/ext/couchbase/core/operations/management/query_index_drop.cxx +11 -4
- data/ext/couchbase/core/operations/management/query_index_get_all.cxx +1 -1
- data/ext/couchbase/core/operations/management/query_index_get_all_deferred.cxx +1 -1
- data/ext/couchbase/core/operations/management/scope_drop.cxx +5 -1
- data/ext/couchbase/core/operations/management/scope_get_all.cxx +6 -1
- data/ext/couchbase/core/operations/management/search_get_stats.cxx +10 -0
- data/ext/couchbase/core/operations/management/search_index_analyze_document.cxx +3 -2
- data/ext/couchbase/core/operations/management/search_index_control_ingest.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_control_query.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_drop.cxx +2 -2
- data/ext/couchbase/core/operations/management/search_index_get.cxx +2 -2
- data/ext/couchbase/core/operations/management/search_index_get_documents_count.cxx +3 -2
- data/ext/couchbase/core/operations/management/search_index_get_stats.cxx +3 -1
- data/ext/couchbase/core/operations/management/search_index_upsert.cxx +2 -2
- data/ext/couchbase/core/operations/management/user_drop.cxx +3 -1
- data/ext/couchbase/core/operations/management/user_get.cxx +3 -1
- data/ext/couchbase/core/operations/management/user_upsert.cxx +12 -9
- data/ext/couchbase/core/operations/management/view_index_drop.cxx +1 -1
- data/ext/couchbase/core/operations/management/view_index_get.cxx +1 -1
- data/ext/couchbase/core/operations/management/view_index_upsert.cxx +1 -1
- data/ext/couchbase/core/operations/operation_traits.hxx +18 -0
- data/ext/couchbase/core/operations/query_response_parsing.cxx +211 -0
- data/ext/couchbase/core/operations/query_response_parsing.hxx +60 -0
- data/ext/couchbase/core/operations_fwd.hxx +3 -3
- data/ext/couchbase/core/origin.cxx +54 -26
- data/ext/couchbase/core/origin.hxx +12 -0
- data/ext/couchbase/core/orphan_reporter.cxx +2 -1
- data/ext/couchbase/core/platform/random.cc +7 -7
- data/ext/couchbase/core/protocol/client_request.cxx +2 -2
- data/ext/couchbase/core/protocol/client_request.hxx +38 -21
- data/ext/couchbase/core/protocol/client_response.cxx +11 -3
- data/ext/couchbase/core/protocol/client_response.hxx +27 -6
- data/ext/couchbase/core/protocol/cmd_append.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_cluster_map_change_notification.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_decrement.cxx +6 -6
- data/ext/couchbase/core/protocol/cmd_get.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_get_and_lock.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_and_touch.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_cluster_config.cxx +6 -4
- data/ext/couchbase/core/protocol/cmd_get_collection_id.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_error_map.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_get_meta.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_get_replica.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_hello.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_increment.cxx +6 -6
- data/ext/couchbase/core/protocol/cmd_insert.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_lookup_in.cxx +4 -3
- data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +4 -3
- data/ext/couchbase/core/protocol/cmd_mutate_in.cxx +10 -9
- data/ext/couchbase/core/protocol/cmd_mutate_in.hxx +10 -10
- data/ext/couchbase/core/protocol/cmd_observe_seqno.cxx +7 -7
- data/ext/couchbase/core/protocol/cmd_prepend.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_remove.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_replace.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_touch.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_upsert.cxx +4 -4
- data/ext/couchbase/core/protocol/datatype.hxx +118 -1
- data/ext/couchbase/core/protocol/frame_info_utils.cxx +1 -1
- data/ext/couchbase/core/protocol/magic.hxx +4 -0
- data/ext/couchbase/core/protocol/magic_fmt.hxx +3 -0
- data/ext/couchbase/core/protocol/server_request.hxx +3 -1
- data/ext/couchbase/core/protocol/status.cxx +1 -1
- data/ext/couchbase/core/protostellar/analytics_converter.hxx +171 -0
- data/ext/couchbase/core/protostellar/bucket_admin_converter.hxx +301 -0
- data/ext/couchbase/core/protostellar/collection_admin_converter.hxx +92 -0
- data/ext/couchbase/core/protostellar/component.cxx +2445 -0
- data/ext/couchbase/core/protostellar/component.hxx +391 -0
- data/ext/couchbase/core/{columnar/bootstrap_notification_subscriber.hxx → protostellar/compression_settings.hxx} +11 -10
- data/ext/couchbase/core/protostellar/credentials.cxx +233 -0
- data/ext/couchbase/core/protostellar/credentials.hxx +88 -0
- data/ext/couchbase/core/protostellar/dispatcher.cxx +57 -0
- data/ext/couchbase/core/protostellar/dispatcher.hxx +482 -0
- data/ext/couchbase/core/protostellar/error_utils.cxx +293 -0
- data/ext/couchbase/core/protostellar/error_utils.hxx +97 -0
- data/ext/couchbase/core/protostellar/json_payload.hxx +49 -0
- data/ext/couchbase/core/protostellar/kv_converter.cxx +70 -0
- data/ext/couchbase/core/protostellar/kv_converter.hxx +600 -0
- data/ext/couchbase/core/protostellar/query_converter.hxx +265 -0
- data/ext/couchbase/core/protostellar/query_index_admin_converter.hxx +291 -0
- data/ext/couchbase/core/protostellar/query_proto.hxx +73 -0
- data/ext/couchbase/core/protostellar/search_converter.hxx +244 -0
- data/ext/couchbase/core/protostellar/search_index_admin_converter.hxx +156 -0
- data/ext/couchbase/core/protostellar/view_converter.hxx +158 -0
- data/ext/couchbase/core/query_stream.cxx +447 -0
- data/ext/couchbase/core/query_stream.hxx +141 -0
- data/ext/couchbase/core/query_stream_component.cxx +243 -0
- data/ext/couchbase/core/query_stream_component.hxx +68 -0
- data/ext/couchbase/core/range_scan_load_balancer.cxx +15 -8
- data/ext/couchbase/core/range_scan_orchestrator.cxx +15 -3
- data/ext/couchbase/core/response_handler.hxx +41 -4
- data/ext/couchbase/core/row_streamer.cxx +332 -46
- data/ext/couchbase/core/row_streamer.hxx +31 -1
- data/ext/couchbase/core/row_streamer_options.hxx +55 -0
- data/ext/couchbase/core/sasl/client.h +3 -0
- data/ext/couchbase/core/search_scoring.hxx +66 -0
- data/ext/couchbase/core/stream_error_details.hxx +69 -0
- data/ext/couchbase/core/timeout_defaults.hxx +0 -1
- data/ext/couchbase/core/topology/capabilities.hxx +6 -0
- data/ext/couchbase/core/topology/capabilities_fmt.hxx +3 -0
- data/ext/couchbase/core/topology/configuration.cxx +21 -6
- data/ext/couchbase/core/topology/configuration.hxx +29 -8
- data/ext/couchbase/core/topology/configuration_json.hxx +3 -0
- data/ext/couchbase/core/topology/error_map_json.hxx +3 -1
- data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +70 -4
- data/ext/couchbase/core/tracing/threshold_logging_tracer.hxx +10 -0
- data/ext/couchbase/core/transactions/active_transaction_record.cxx +0 -34
- data/ext/couchbase/core/transactions/attempt_context_impl.cxx +362 -241
- data/ext/couchbase/core/transactions/attempt_context_impl.hxx +24 -3
- data/ext/couchbase/core/transactions/error_list.hxx +2 -2
- data/ext/couchbase/core/transactions/get_multi_fetch.hxx +160 -0
- data/ext/couchbase/core/transactions/get_multi_orchestrator.cxx +326 -125
- data/ext/couchbase/core/transactions/get_multi_transaction_id.hxx +62 -0
- data/ext/couchbase/core/transactions/internal/atr_entry.hxx +22 -2
- data/ext/couchbase/core/transactions/internal/transaction_context.hxx +2 -2
- data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +23 -1
- data/ext/couchbase/core/transactions/internal/utils.hxx +50 -14
- data/ext/couchbase/core/transactions/staged_mutation.cxx +23 -18
- data/ext/couchbase/core/transactions/staged_mutation.hxx +15 -4
- data/ext/couchbase/core/transactions/transaction_context.cxx +55 -40
- data/ext/couchbase/core/transactions/transaction_get_result.hxx +16 -0
- data/ext/couchbase/core/transactions/transactions.cxx +3 -55
- data/ext/couchbase/core/transactions/transactions_cleanup.cxx +194 -66
- data/ext/couchbase/core/transactions/transactions_config.cxx +0 -11
- data/ext/couchbase/core/transactions/utils.cxx +10 -0
- data/ext/couchbase/core/transactions/waitable_op_list.hxx +15 -4
- data/ext/couchbase/core/transactions.hxx +9 -9
- data/ext/couchbase/core/utils/byteswap.hxx +166 -9
- data/ext/couchbase/core/utils/connection_string.cxx +50 -85
- data/ext/couchbase/core/utils/connection_string.hxx +15 -0
- data/ext/couchbase/core/{columnar/backoff_calculator.hxx → utils/deadline.hxx} +13 -13
- data/ext/couchbase/core/utils/duration_parser.cxx +1 -1
- data/ext/couchbase/core/utils/json_streaming_lexer.cxx +48 -5
- data/ext/couchbase/core/utils/json_streaming_lexer.hxx +4 -1
- data/ext/couchbase/core/utils/movable_function.hxx +301 -52
- data/ext/couchbase/core/utils/name_codec.hxx +154 -11
- data/ext/couchbase/core/{columnar/retry_info.hxx → utils/process_id.hxx} +18 -13
- data/ext/couchbase/core/utils/url_codec.cxx +12 -51
- data/ext/couchbase/core/websocket_codec.cxx +3 -29
- data/ext/couchbase/couchbase/analytics_options.hxx +21 -10
- data/ext/couchbase/couchbase/analytics_row.hxx +105 -0
- data/ext/couchbase/couchbase/analytics_stream_result.hxx +266 -0
- data/ext/couchbase/couchbase/boolean_query.hxx +3 -3
- data/ext/couchbase/couchbase/bucket.hxx +57 -0
- data/ext/couchbase/couchbase/cluster.hxx +216 -5
- data/ext/couchbase/{core/columnar/security_options.hxx → couchbase/cluster_state.hxx} +18 -14
- data/ext/couchbase/couchbase/codec/lenient_json_transcoder.hxx +69 -0
- data/ext/couchbase/couchbase/collection.hxx +234 -14
- data/ext/couchbase/couchbase/common_durability_options.hxx +18 -3
- data/ext/couchbase/couchbase/conjunction_query.hxx +1 -1
- data/ext/couchbase/couchbase/create_dataset_analytics_options.hxx +6 -1
- data/ext/couchbase/couchbase/date_range_query.hxx +2 -2
- data/ext/couchbase/couchbase/decrement_options.hxx +1 -1
- data/ext/couchbase/couchbase/disjunction_query.hxx +1 -1
- data/ext/couchbase/couchbase/error.hxx +32 -0
- data/ext/couchbase/couchbase/error_codes.hxx +32 -0
- data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +1 -1
- data/ext/couchbase/couchbase/geo_distance_query.hxx +1 -1
- data/ext/couchbase/couchbase/geo_polygon_query.hxx +1 -1
- data/ext/couchbase/couchbase/get_replica_options.hxx +68 -0
- data/ext/couchbase/couchbase/get_replica_result.hxx +5 -3
- data/ext/couchbase/couchbase/get_replica_strategy.hxx +161 -0
- data/ext/couchbase/couchbase/get_result.hxx +1 -0
- data/ext/couchbase/couchbase/increment_options.hxx +1 -1
- data/ext/couchbase/couchbase/insert_options.hxx +1 -1
- data/ext/couchbase/couchbase/match_phrase_query.hxx +1 -1
- data/ext/couchbase/couchbase/match_query.hxx +1 -1
- data/ext/couchbase/couchbase/mutate_in_options.hxx +3 -3
- data/ext/couchbase/couchbase/network_options.hxx +1 -1
- data/ext/couchbase/couchbase/node_id.hxx +42 -14
- data/ext/couchbase/couchbase/node_id_for_options.hxx +7 -1
- data/ext/couchbase/couchbase/node_ids_options.hxx +8 -2
- data/ext/couchbase/couchbase/numeric_range_query.hxx +1 -1
- data/ext/couchbase/couchbase/phrase_query.hxx +1 -1
- data/ext/couchbase/couchbase/prefix_query.hxx +1 -1
- data/ext/couchbase/couchbase/query_options.hxx +23 -12
- data/ext/couchbase/couchbase/query_row.hxx +111 -0
- data/ext/couchbase/couchbase/query_stream_result.hxx +302 -0
- data/ext/couchbase/couchbase/query_string_query.hxx +3 -3
- data/ext/couchbase/couchbase/regexp_query.hxx +1 -1
- data/ext/couchbase/couchbase/replace_options.hxx +3 -3
- data/ext/couchbase/couchbase/result.hxx +14 -3
- data/ext/couchbase/couchbase/scan_result_item.hxx +1 -0
- data/ext/couchbase/couchbase/scope.hxx +85 -2
- data/ext/couchbase/couchbase/search_options.hxx +58 -8
- data/ext/couchbase/couchbase/search_scoring.hxx +94 -0
- data/ext/couchbase/couchbase/search_scoring_none.hxx +51 -0
- data/ext/couchbase/couchbase/search_scoring_reciprocal_rank_fusion.hxx +88 -0
- data/ext/couchbase/couchbase/search_scoring_relative_score_fusion.hxx +70 -0
- data/ext/couchbase/couchbase/term_range_query.hxx +1 -1
- data/ext/couchbase/couchbase/tracing/request_span.hxx +46 -0
- data/ext/couchbase/couchbase/transactions/transaction_get_multi_replicas_from_preferred_server_group_result.hxx +23 -21
- data/ext/couchbase/couchbase/transactions/transaction_get_multi_result.hxx +24 -19
- data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +17 -3
- data/ext/couchbase/couchbase/transactions/transactions_config.hxx +4 -2
- data/ext/couchbase/couchbase/transactions.hxx +27 -18
- data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
- data/ext/couchbase/couchbase/vector_query.hxx +1 -1
- data/ext/couchbase/couchbase/wait_until_ready_options.hxx +111 -0
- data/ext/couchbase/couchbase/wildcard_query.hxx +1 -1
- data/ext/extconf.rb +15 -10
- data/ext/rcb_analytics.cxx +82 -102
- data/ext/rcb_backend.cxx +42 -36
- data/ext/rcb_backend.hxx +2 -0
- data/ext/rcb_buckets.cxx +47 -59
- data/ext/rcb_collections.cxx +42 -52
- data/ext/rcb_crud.cxx +345 -224
- data/ext/rcb_diagnostics.cxx +117 -27
- data/ext/rcb_exceptions.cxx +152 -99
- data/ext/rcb_exceptions.hxx +25 -0
- data/ext/rcb_extras.cxx +18 -19
- data/ext/rcb_hdr_histogram.cxx +19 -4
- data/ext/rcb_logger.cxx +202 -27
- data/ext/rcb_logger.hxx +12 -0
- data/ext/rcb_multi.cxx +40 -40
- data/ext/rcb_observability.cxx +7 -5
- data/ext/rcb_query.cxx +99 -142
- data/ext/rcb_range_scan.cxx +41 -35
- data/ext/rcb_search.cxx +98 -99
- data/ext/rcb_users.cxx +36 -56
- data/ext/rcb_utils.cxx +100 -37
- data/ext/rcb_utils.hxx +287 -33
- data/ext/rcb_version.cxx +1 -1
- data/ext/rcb_views.cxx +55 -51
- data/lib/active_support/cache/couchbase_store.rb +77 -12
- data/lib/couchbase/bucket.rb +20 -0
- data/lib/couchbase/cluster.rb +33 -14
- data/lib/couchbase/collection.rb +36 -1
- data/lib/couchbase/errors.rb +18 -0
- data/lib/couchbase/fork_hooks.rb +16 -7
- data/lib/couchbase/get_replica_strategy.rb +89 -0
- data/lib/couchbase/logger.rb +1 -1
- data/lib/couchbase/management/analytics_index_manager.rb +15 -15
- data/lib/couchbase/management/bucket_manager.rb +6 -6
- data/lib/couchbase/management/collection_manager.rb +6 -6
- data/lib/couchbase/management/query_index_manager.rb +7 -7
- data/lib/couchbase/management/search_index_manager.rb +13 -13
- data/lib/couchbase/management/user_manager.rb +10 -10
- data/lib/couchbase/management/view_index_manager.rb +5 -5
- data/lib/couchbase/options.rb +181 -44
- data/lib/couchbase/protostellar/bucket.rb +4 -0
- data/lib/couchbase/protostellar/cluster.rb +4 -0
- data/lib/couchbase/protostellar/collection.rb +4 -0
- data/lib/couchbase/protostellar/error_handling.rb +2 -1
- data/lib/couchbase/protostellar/request.rb +1 -0
- data/lib/couchbase/protostellar/request_generator/kv.rb +16 -2
- data/lib/couchbase/protostellar/request_generator/search.rb +17 -1
- data/lib/couchbase/protostellar/retry/orchestrator.rb +3 -2
- data/lib/couchbase/protostellar/retry/strategies/fail_fast.rb +33 -0
- data/lib/couchbase/protostellar/retry/strategies.rb +1 -0
- data/lib/couchbase/search_options.rb +95 -6
- data/lib/couchbase/version.rb +1 -1
- metadata +92 -33
- data/ext/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +0 -40
- data/ext/couchbase/core/columnar/agent.hxx +0 -71
- data/ext/couchbase/core/columnar/agent_config.hxx +0 -59
- data/ext/couchbase/core/columnar/background_bootstrap_listener.hxx +0 -42
- data/ext/couchbase/core/columnar/backoff_calculator.cxx +0 -62
- data/ext/couchbase/core/columnar/columnar_agent.cxx +0 -147
- data/ext/couchbase/core/columnar/columnar_agent_config.cxx +0 -48
- data/ext/couchbase/core/columnar/columnar_error.cxx +0 -51
- data/ext/couchbase/core/columnar/database_management_options.hxx +0 -56
- data/ext/couchbase/core/columnar/error.hxx +0 -51
- data/ext/couchbase/core/columnar/error_codes.cxx +0 -107
- data/ext/couchbase/core/columnar/error_codes.hxx +0 -75
- data/ext/couchbase/core/columnar/management_component.cxx +0 -300
- data/ext/couchbase/core/columnar/management_component.hxx +0 -56
- data/ext/couchbase/core/columnar/query_component.cxx +0 -523
- data/ext/couchbase/core/columnar/query_component.hxx +0 -57
- data/ext/couchbase/core/columnar/query_options.hxx +0 -59
- data/ext/couchbase/core/columnar/query_result.cxx +0 -130
- data/ext/couchbase/core/columnar/query_result.hxx +0 -78
- data/ext/couchbase/core/io/config_tracker.cxx +0 -687
- data/ext/couchbase/core/io/config_tracker.hxx +0 -123
|
@@ -44,12 +44,12 @@ mutate_in_response_body::parse(key_value_status_code status,
|
|
|
44
44
|
if (extras_size == 16) {
|
|
45
45
|
std::uint64_t partition_uuid{};
|
|
46
46
|
memcpy(&partition_uuid, body.data() + offset, sizeof(partition_uuid));
|
|
47
|
-
partition_uuid = utils::
|
|
47
|
+
partition_uuid = utils::network_to_host(partition_uuid);
|
|
48
48
|
offset += 8;
|
|
49
49
|
|
|
50
50
|
std::uint64_t sequence_number{};
|
|
51
51
|
memcpy(&sequence_number, body.data() + offset, sizeof(sequence_number));
|
|
52
|
-
sequence_number = utils::
|
|
52
|
+
sequence_number = utils::network_to_host(sequence_number);
|
|
53
53
|
|
|
54
54
|
token_ = couchbase::utils::build_mutation_token(partition_uuid, sequence_number);
|
|
55
55
|
offset += 8;
|
|
@@ -66,7 +66,7 @@ mutate_in_response_body::parse(key_value_status_code status,
|
|
|
66
66
|
|
|
67
67
|
std::uint16_t entry_status = 0;
|
|
68
68
|
memcpy(&entry_status, body.data() + offset, sizeof(entry_status));
|
|
69
|
-
entry_status = utils::
|
|
69
|
+
entry_status = utils::network_to_host(entry_status);
|
|
70
70
|
Expects(is_valid_status(entry_status));
|
|
71
71
|
field.status = static_cast<key_value_status_code>(entry_status);
|
|
72
72
|
offset += static_cast<offset_type>(sizeof(entry_status));
|
|
@@ -74,7 +74,7 @@ mutate_in_response_body::parse(key_value_status_code status,
|
|
|
74
74
|
if (field.status == key_value_status_code::success) {
|
|
75
75
|
std::uint32_t entry_size = 0;
|
|
76
76
|
memcpy(&entry_size, body.data() + offset, sizeof(entry_size));
|
|
77
|
-
entry_size = utils::
|
|
77
|
+
entry_size = utils::network_to_host(entry_size);
|
|
78
78
|
Expects(entry_size < 20 * 1024 * 1024);
|
|
79
79
|
offset += static_cast<offset_type>(sizeof(entry_size));
|
|
80
80
|
|
|
@@ -117,16 +117,16 @@ mutate_in_request_body::fill_extras()
|
|
|
117
117
|
{
|
|
118
118
|
if (expiry_ != 0 || user_flags_) {
|
|
119
119
|
extras_.resize(sizeof(expiry_));
|
|
120
|
-
std::uint32_t field = utils::
|
|
120
|
+
std::uint32_t field = utils::host_to_network(expiry_);
|
|
121
121
|
memcpy(extras_.data(), &field, sizeof(field));
|
|
122
122
|
}
|
|
123
123
|
if (user_flags_) {
|
|
124
124
|
const std::size_t offset = extras_.size();
|
|
125
125
|
extras_.resize(offset + sizeof(std::uint32_t));
|
|
126
|
-
std::uint32_t field = utils::
|
|
126
|
+
std::uint32_t field = utils::host_to_network(user_flags_.value());
|
|
127
127
|
memcpy(extras_.data() + offset, &field, sizeof(field));
|
|
128
128
|
}
|
|
129
|
-
if (flags_ != std::
|
|
129
|
+
if (flags_ != std::uint8_t{ 0U }) {
|
|
130
130
|
const std::size_t offset = extras_.size();
|
|
131
131
|
extras_.resize(offset + sizeof(flags_));
|
|
132
132
|
extras_[offset] = std::byte{ flags_ };
|
|
@@ -150,12 +150,13 @@ mutate_in_request_body::fill_value()
|
|
|
150
150
|
value_[offset] = spec.flags_;
|
|
151
151
|
++offset;
|
|
152
152
|
|
|
153
|
-
std::uint16_t path_size =
|
|
153
|
+
std::uint16_t path_size =
|
|
154
|
+
utils::host_to_network(gsl::narrow_cast<std::uint16_t>(spec.path_.size()));
|
|
154
155
|
std::memcpy(value_.data() + offset, &path_size, sizeof(path_size));
|
|
155
156
|
offset += sizeof(path_size);
|
|
156
157
|
|
|
157
158
|
std::uint32_t param_size =
|
|
158
|
-
utils::
|
|
159
|
+
utils::host_to_network(gsl::narrow_cast<std::uint32_t>(spec.value_.size()));
|
|
159
160
|
std::memcpy(value_.data() + offset, ¶m_size, sizeof(param_size));
|
|
160
161
|
offset += sizeof(param_size);
|
|
161
162
|
|
|
@@ -81,33 +81,33 @@ public:
|
|
|
81
81
|
* `path_flag_create_parents`. and `upsert` mutation semantics. Not valid with
|
|
82
82
|
* `insert`.
|
|
83
83
|
*/
|
|
84
|
-
static constexpr std::
|
|
84
|
+
static constexpr std::uint8_t doc_flag_mkdoc{ 0b0000'0001U };
|
|
85
85
|
|
|
86
86
|
/**
|
|
87
87
|
* Add the document only if it does not exist. Implies
|
|
88
88
|
* `path_flag_create_parents`. Not valid with `doc_flag_mkdoc`.
|
|
89
89
|
*/
|
|
90
|
-
static constexpr std::
|
|
90
|
+
static constexpr std::uint8_t doc_flag_add{ 0b0000'0010U };
|
|
91
91
|
|
|
92
92
|
/**
|
|
93
93
|
* Allow access to XATTRs for deleted documents (instead of returning
|
|
94
94
|
* KEY_ENOENT).
|
|
95
95
|
*/
|
|
96
|
-
static constexpr std::
|
|
96
|
+
static constexpr std::uint8_t doc_flag_access_deleted{ 0b0000'0100U };
|
|
97
97
|
|
|
98
98
|
/**
|
|
99
99
|
* Used with `doc_flag_mkdoc` / `doc_flag_add`; if the document does not exist
|
|
100
100
|
* then create it in the "Deleted" state, instead of the normal "Alive" state.
|
|
101
101
|
* Not valid unless `doc_flag_mkdoc` or `doc_flag_add` specified.
|
|
102
102
|
*/
|
|
103
|
-
static constexpr std::
|
|
103
|
+
static constexpr std::uint8_t doc_flag_create_as_deleted{ 0b0000'1000U };
|
|
104
104
|
|
|
105
105
|
/**
|
|
106
106
|
* If the document exists and isn't deleted the operation will fail with .
|
|
107
107
|
* If the input document _is_ deleted the result of the operation will store
|
|
108
108
|
* the document as a "live" document instead of a deleted document.
|
|
109
109
|
*/
|
|
110
|
-
static constexpr std::
|
|
110
|
+
static constexpr std::uint8_t doc_flag_revive_document{ 0b0001'0000U };
|
|
111
111
|
|
|
112
112
|
private:
|
|
113
113
|
std::vector<std::byte> key_;
|
|
@@ -116,7 +116,7 @@ private:
|
|
|
116
116
|
|
|
117
117
|
std::optional<std::uint32_t> user_flags_{};
|
|
118
118
|
std::uint32_t expiry_{ 0 };
|
|
119
|
-
std::
|
|
119
|
+
std::uint8_t flags_{ 0 };
|
|
120
120
|
std::vector<couchbase::core::impl::subdoc::command> specs_;
|
|
121
121
|
std::vector<std::byte> framing_extras_{};
|
|
122
122
|
|
|
@@ -138,7 +138,7 @@ public:
|
|
|
138
138
|
if (value) {
|
|
139
139
|
flags_ |= doc_flag_access_deleted;
|
|
140
140
|
} else {
|
|
141
|
-
flags_ &= ~doc_flag_access_deleted;
|
|
141
|
+
flags_ &= static_cast<std::uint8_t>(~doc_flag_access_deleted);
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
144
|
|
|
@@ -147,7 +147,7 @@ public:
|
|
|
147
147
|
if (value) {
|
|
148
148
|
flags_ |= doc_flag_create_as_deleted;
|
|
149
149
|
} else {
|
|
150
|
-
flags_ &= ~doc_flag_create_as_deleted;
|
|
150
|
+
flags_ &= static_cast<std::uint8_t>(~doc_flag_create_as_deleted);
|
|
151
151
|
}
|
|
152
152
|
}
|
|
153
153
|
|
|
@@ -156,13 +156,13 @@ public:
|
|
|
156
156
|
if (value) {
|
|
157
157
|
flags_ |= doc_flag_revive_document;
|
|
158
158
|
} else {
|
|
159
|
-
flags_ &= ~doc_flag_revive_document;
|
|
159
|
+
flags_ &= static_cast<std::uint8_t>(~doc_flag_revive_document);
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
162
|
|
|
163
163
|
void store_semantics(couchbase::store_semantics semantics)
|
|
164
164
|
{
|
|
165
|
-
flags_ &= std::
|
|
165
|
+
flags_ &= static_cast<std::uint8_t>(0b1111'1100U); /* reset first two bits */
|
|
166
166
|
switch (semantics) {
|
|
167
167
|
case couchbase::store_semantics::replace:
|
|
168
168
|
/* leave bits as zeros */
|
|
@@ -45,32 +45,32 @@ observe_seqno_response_body::parse(key_value_status_code status,
|
|
|
45
45
|
++offset;
|
|
46
46
|
|
|
47
47
|
memcpy(&partition_id_, body.data() + offset, sizeof(partition_id_));
|
|
48
|
-
partition_id_ = utils::
|
|
48
|
+
partition_id_ = utils::network_to_host(partition_id_);
|
|
49
49
|
offset += static_cast<offset_type>(sizeof(partition_id_));
|
|
50
50
|
|
|
51
51
|
memcpy(&partition_uuid_, body.data() + offset, sizeof(partition_uuid_));
|
|
52
|
-
partition_uuid_ = utils::
|
|
52
|
+
partition_uuid_ = utils::network_to_host(partition_uuid_);
|
|
53
53
|
offset += static_cast<offset_type>(sizeof(partition_uuid_));
|
|
54
54
|
|
|
55
55
|
memcpy(&last_persisted_sequence_number_,
|
|
56
56
|
body.data() + offset,
|
|
57
57
|
sizeof(last_persisted_sequence_number_));
|
|
58
|
-
last_persisted_sequence_number_ = utils::
|
|
58
|
+
last_persisted_sequence_number_ = utils::network_to_host(last_persisted_sequence_number_);
|
|
59
59
|
offset += static_cast<offset_type>(sizeof(last_persisted_sequence_number_));
|
|
60
60
|
|
|
61
61
|
memcpy(¤t_sequence_number_, body.data() + offset, sizeof(current_sequence_number_));
|
|
62
|
-
current_sequence_number_ = utils::
|
|
62
|
+
current_sequence_number_ = utils::network_to_host(current_sequence_number_);
|
|
63
63
|
offset += static_cast<offset_type>(sizeof(current_sequence_number_));
|
|
64
64
|
|
|
65
65
|
if (failover) {
|
|
66
66
|
std::uint64_t field{};
|
|
67
67
|
|
|
68
68
|
memcpy(&field, body.data() + offset, sizeof(field));
|
|
69
|
-
old_partition_uuid_.emplace(utils::
|
|
69
|
+
old_partition_uuid_.emplace(utils::network_to_host(field));
|
|
70
70
|
offset += static_cast<offset_type>(sizeof(field));
|
|
71
71
|
|
|
72
72
|
memcpy(&field, body.data() + offset, sizeof(field));
|
|
73
|
-
last_received_sequence_number_.emplace(utils::
|
|
73
|
+
last_received_sequence_number_.emplace(utils::network_to_host(field));
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
return false;
|
|
@@ -89,7 +89,7 @@ observe_seqno_request_body::fill_body()
|
|
|
89
89
|
|
|
90
90
|
value_.resize(sizeof(std::uint64_t));
|
|
91
91
|
|
|
92
|
-
std::uint64_t field = utils::
|
|
92
|
+
std::uint64_t field = utils::host_to_network(partition_uuid_);
|
|
93
93
|
memcpy(value_.data() + offset, &field, sizeof(field));
|
|
94
94
|
}
|
|
95
95
|
} // namespace couchbase::core::protocol
|
|
@@ -41,12 +41,12 @@ prepend_response_body::parse(key_value_status_code status,
|
|
|
41
41
|
if (extras_size == 16) {
|
|
42
42
|
std::uint64_t partition_uuid{};
|
|
43
43
|
memcpy(&partition_uuid, body.data() + offset, sizeof(partition_uuid));
|
|
44
|
-
partition_uuid = utils::
|
|
44
|
+
partition_uuid = utils::network_to_host(partition_uuid);
|
|
45
45
|
offset += 8;
|
|
46
46
|
|
|
47
47
|
std::uint64_t sequence_number{};
|
|
48
48
|
memcpy(&sequence_number, body.data() + offset, sizeof(sequence_number));
|
|
49
|
-
sequence_number = utils::
|
|
49
|
+
sequence_number = utils::network_to_host(sequence_number);
|
|
50
50
|
|
|
51
51
|
token_ = couchbase::utils::build_mutation_token(partition_uuid, sequence_number);
|
|
52
52
|
return true;
|
|
@@ -42,12 +42,12 @@ remove_response_body::parse(key_value_status_code status,
|
|
|
42
42
|
if (extras_size == 16) {
|
|
43
43
|
std::uint64_t partition_uuid{};
|
|
44
44
|
memcpy(&partition_uuid, body.data() + offset, sizeof(partition_uuid));
|
|
45
|
-
partition_uuid = utils::
|
|
45
|
+
partition_uuid = utils::network_to_host(partition_uuid);
|
|
46
46
|
offset += 8;
|
|
47
47
|
|
|
48
48
|
std::uint64_t sequence_number{};
|
|
49
49
|
memcpy(&sequence_number, body.data() + offset, sizeof(sequence_number));
|
|
50
|
-
sequence_number = utils::
|
|
50
|
+
sequence_number = utils::network_to_host(sequence_number);
|
|
51
51
|
|
|
52
52
|
token_ = couchbase::utils::build_mutation_token(partition_uuid, sequence_number);
|
|
53
53
|
return true;
|
|
@@ -42,12 +42,12 @@ replace_response_body::parse(key_value_status_code status,
|
|
|
42
42
|
if (extras_size == 16) {
|
|
43
43
|
std::uint64_t partition_uuid{};
|
|
44
44
|
memcpy(&partition_uuid, body.data() + offset, sizeof(partition_uuid));
|
|
45
|
-
partition_uuid = utils::
|
|
45
|
+
partition_uuid = utils::network_to_host(partition_uuid);
|
|
46
46
|
offset += 8;
|
|
47
47
|
|
|
48
48
|
std::uint64_t sequence_number{};
|
|
49
49
|
memcpy(&sequence_number, body.data() + offset, sizeof(sequence_number));
|
|
50
|
-
sequence_number = utils::
|
|
50
|
+
sequence_number = utils::network_to_host(sequence_number);
|
|
51
51
|
|
|
52
52
|
token_ = couchbase::utils::build_mutation_token(partition_uuid, sequence_number);
|
|
53
53
|
return true;
|
|
@@ -83,10 +83,10 @@ replace_request_body::fill_extras()
|
|
|
83
83
|
{
|
|
84
84
|
extras_.resize(sizeof(flags_) + sizeof(expiry_));
|
|
85
85
|
|
|
86
|
-
std::uint32_t field = utils::
|
|
86
|
+
std::uint32_t field = utils::host_to_network(flags_);
|
|
87
87
|
memcpy(extras_.data(), &field, sizeof(field));
|
|
88
88
|
|
|
89
|
-
field = utils::
|
|
89
|
+
field = utils::host_to_network(expiry_);
|
|
90
90
|
memcpy(extras_.data() + sizeof(flags_), &field, sizeof(field));
|
|
91
91
|
}
|
|
92
92
|
} // namespace couchbase::core::protocol
|
|
@@ -47,7 +47,7 @@ void
|
|
|
47
47
|
touch_request_body::expiry(std::uint32_t seconds)
|
|
48
48
|
{
|
|
49
49
|
extras_.resize(sizeof(seconds));
|
|
50
|
-
seconds = utils::
|
|
50
|
+
seconds = utils::host_to_network(seconds);
|
|
51
51
|
memcpy(extras_.data(), &seconds, sizeof(seconds));
|
|
52
52
|
}
|
|
53
53
|
} // namespace couchbase::core::protocol
|
|
@@ -43,12 +43,12 @@ upsert_response_body::parse(key_value_status_code status,
|
|
|
43
43
|
if (extras_size == 16) {
|
|
44
44
|
std::uint64_t partition_uuid{};
|
|
45
45
|
memcpy(&partition_uuid, body.data() + offset, sizeof(partition_uuid));
|
|
46
|
-
partition_uuid = utils::
|
|
46
|
+
partition_uuid = utils::network_to_host(partition_uuid);
|
|
47
47
|
offset += 8;
|
|
48
48
|
|
|
49
49
|
std::uint64_t sequence_number{};
|
|
50
50
|
memcpy(&sequence_number, body.data() + offset, sizeof(sequence_number));
|
|
51
|
-
sequence_number = utils::
|
|
51
|
+
sequence_number = utils::network_to_host(sequence_number);
|
|
52
52
|
|
|
53
53
|
token_ = couchbase::utils::build_mutation_token(partition_uuid, sequence_number);
|
|
54
54
|
return true;
|
|
@@ -83,10 +83,10 @@ upsert_request_body::fill_extras()
|
|
|
83
83
|
{
|
|
84
84
|
extras_.resize(sizeof(flags_) + sizeof(expiry_));
|
|
85
85
|
|
|
86
|
-
std::uint32_t field = utils::
|
|
86
|
+
std::uint32_t field = utils::host_to_network(flags_);
|
|
87
87
|
memcpy(extras_.data(), &field, sizeof(field));
|
|
88
88
|
|
|
89
|
-
field = utils::
|
|
89
|
+
field = utils::host_to_network(expiry_);
|
|
90
90
|
memcpy(extras_.data() + sizeof(flags_), &field, sizeof(field));
|
|
91
91
|
}
|
|
92
92
|
} // namespace couchbase::core::protocol
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
#pragma once
|
|
19
19
|
|
|
20
|
+
#include <cstddef>
|
|
20
21
|
#include <cstdint>
|
|
21
22
|
|
|
22
23
|
namespace couchbase::core::protocol
|
|
@@ -28,6 +29,122 @@ enum class datatype : std::uint8_t {
|
|
|
28
29
|
xattr = 0x04,
|
|
29
30
|
};
|
|
30
31
|
|
|
32
|
+
/*
|
|
33
|
+
* Free-standing bitwise operators for the datatype flag set.
|
|
34
|
+
*
|
|
35
|
+
* Combining two datatypes stays inside the enum domain and yields a datatype.
|
|
36
|
+
* Combining a datatype with a raw protocol byte yields std::byte (in either
|
|
37
|
+
* operand order), because the result may carry bits outside the named values
|
|
38
|
+
* and therefore should not pretend to be a well-formed datatype.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
constexpr auto
|
|
42
|
+
operator|(datatype lhs, datatype rhs) noexcept -> datatype
|
|
43
|
+
{
|
|
44
|
+
return static_cast<datatype>(static_cast<std::uint8_t>(lhs) | static_cast<std::uint8_t>(rhs));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
constexpr auto
|
|
48
|
+
operator&(datatype lhs, datatype rhs) noexcept -> datatype
|
|
49
|
+
{
|
|
50
|
+
return static_cast<datatype>(static_cast<std::uint8_t>(lhs) & static_cast<std::uint8_t>(rhs));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
constexpr auto
|
|
54
|
+
operator^(datatype lhs, datatype rhs) noexcept -> datatype
|
|
55
|
+
{
|
|
56
|
+
return static_cast<datatype>(static_cast<std::uint8_t>(lhs) ^ static_cast<std::uint8_t>(rhs));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
constexpr auto
|
|
60
|
+
operator|(datatype lhs, std::byte rhs) noexcept -> std::byte
|
|
61
|
+
{
|
|
62
|
+
return static_cast<std::byte>(lhs) | rhs;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
constexpr auto
|
|
66
|
+
operator|(std::byte lhs, datatype rhs) noexcept -> std::byte
|
|
67
|
+
{
|
|
68
|
+
return lhs | static_cast<std::byte>(rhs);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
constexpr auto
|
|
72
|
+
operator&(datatype lhs, std::byte rhs) noexcept -> std::byte
|
|
73
|
+
{
|
|
74
|
+
return static_cast<std::byte>(lhs) & rhs;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
constexpr auto
|
|
78
|
+
operator&(std::byte lhs, datatype rhs) noexcept -> std::byte
|
|
79
|
+
{
|
|
80
|
+
return lhs & static_cast<std::byte>(rhs);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
constexpr auto
|
|
84
|
+
operator^(datatype lhs, std::byte rhs) noexcept -> std::byte
|
|
85
|
+
{
|
|
86
|
+
return static_cast<std::byte>(lhs) ^ rhs;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
constexpr auto
|
|
90
|
+
operator^(std::byte lhs, datatype rhs) noexcept -> std::byte
|
|
91
|
+
{
|
|
92
|
+
return lhs ^ static_cast<std::byte>(rhs);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/*
|
|
96
|
+
* Type-safe flag presence test. Returns true when every bit of flag is set in
|
|
97
|
+
* value; using the composite flag itself as the right-hand side keeps the check
|
|
98
|
+
* correct even when flag carries more than one bit.
|
|
99
|
+
*/
|
|
100
|
+
|
|
101
|
+
constexpr auto
|
|
102
|
+
has_flag(datatype value, datatype flag) noexcept -> bool
|
|
103
|
+
{
|
|
104
|
+
const auto masked = value & flag;
|
|
105
|
+
return masked == flag;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
constexpr auto
|
|
109
|
+
has_flag(std::byte value, datatype flag) noexcept -> bool
|
|
110
|
+
{
|
|
111
|
+
const auto masked = value & flag;
|
|
112
|
+
return masked == static_cast<std::byte>(flag);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/*
|
|
116
|
+
* In-place mutators that set or clear flag bits. The flag is always a named
|
|
117
|
+
* datatype, while the value being modified may live in the typed enum domain or
|
|
118
|
+
* as a raw protocol byte.
|
|
119
|
+
*/
|
|
120
|
+
|
|
121
|
+
constexpr void
|
|
122
|
+
set_flag(datatype& value, datatype flag) noexcept
|
|
123
|
+
{
|
|
124
|
+
value = value | flag;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
constexpr void
|
|
128
|
+
set_flag(std::byte& value, datatype flag) noexcept
|
|
129
|
+
{
|
|
130
|
+
value = value | flag;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
constexpr void
|
|
134
|
+
clear_flag(datatype& value, datatype flag) noexcept
|
|
135
|
+
{
|
|
136
|
+
// Complement the flag in the integer domain: the bitwise negation of a single
|
|
137
|
+
// flag is not itself a valid datatype, so it must never be cast back to the enum.
|
|
138
|
+
value =
|
|
139
|
+
static_cast<datatype>(static_cast<std::uint8_t>(value) & ~static_cast<std::uint8_t>(flag));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
constexpr void
|
|
143
|
+
clear_flag(std::byte& value, datatype flag) noexcept
|
|
144
|
+
{
|
|
145
|
+
value &= ~static_cast<std::byte>(flag);
|
|
146
|
+
}
|
|
147
|
+
|
|
31
148
|
constexpr auto
|
|
32
149
|
is_valid_datatype(std::uint8_t code) -> bool
|
|
33
150
|
{
|
|
@@ -44,6 +161,6 @@ is_valid_datatype(std::uint8_t code) -> bool
|
|
|
44
161
|
constexpr auto
|
|
45
162
|
has_json_datatype(std::uint8_t code) -> bool
|
|
46
163
|
{
|
|
47
|
-
return (
|
|
164
|
+
return has_flag(static_cast<std::byte>(code), datatype::json);
|
|
48
165
|
}
|
|
49
166
|
} // namespace couchbase::core::protocol
|
|
@@ -39,7 +39,7 @@ add_durability_frame_info(std::vector<std::byte>& framing_extras,
|
|
|
39
39
|
framing_extras.resize(extras_old_size + 1 + static_cast<std::size_t>(frame_size));
|
|
40
40
|
framing_extras[extras_old_size + 0] = (frame_id << 4U) | frame_size;
|
|
41
41
|
framing_extras[extras_old_size + 1] = static_cast<std::byte>(level);
|
|
42
|
-
std::uint16_t val = utils::
|
|
42
|
+
std::uint16_t val = utils::host_to_network(*timeout);
|
|
43
43
|
memcpy(framing_extras.data() + extras_old_size + 2, &val, sizeof(val));
|
|
44
44
|
} else {
|
|
45
45
|
const std::byte frame_size{ 1 /* 1 for level */ };
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
namespace couchbase::core::protocol
|
|
23
23
|
{
|
|
24
24
|
enum class magic : std::uint8_t {
|
|
25
|
+
/// Sentinel value for default-constructed/invalid packets (not a real wire value)
|
|
26
|
+
invalid = 0x00,
|
|
25
27
|
/// Request packet from client to server
|
|
26
28
|
client_request = 0x80,
|
|
27
29
|
/// The alternative request packet containing frame extras
|
|
@@ -47,6 +49,8 @@ is_valid_magic(std::uint8_t code) -> bool
|
|
|
47
49
|
case magic::server_request:
|
|
48
50
|
case magic::server_response:
|
|
49
51
|
return true;
|
|
52
|
+
case magic::invalid:
|
|
53
|
+
break;
|
|
50
54
|
}
|
|
51
55
|
return false;
|
|
52
56
|
}
|
|
@@ -52,6 +52,9 @@ struct fmt::formatter<couchbase::core::protocol::magic> {
|
|
|
52
52
|
case couchbase::core::protocol::magic::server_response:
|
|
53
53
|
name = "server_response (0x83)";
|
|
54
54
|
break;
|
|
55
|
+
case couchbase::core::protocol::magic::invalid:
|
|
56
|
+
name = "invalid (0x00)";
|
|
57
|
+
break;
|
|
55
58
|
}
|
|
56
59
|
return format_to(ctx.out(), "{}", name);
|
|
57
60
|
}
|
|
@@ -104,12 +104,14 @@ public:
|
|
|
104
104
|
|
|
105
105
|
std::uint32_t field = 0;
|
|
106
106
|
memcpy(&field, header_.data() + 8, sizeof(field));
|
|
107
|
-
body_size_ = utils::
|
|
107
|
+
body_size_ = utils::network_to_host(field);
|
|
108
108
|
data_.resize(body_size_);
|
|
109
109
|
|
|
110
110
|
memcpy(&opaque_, header_.data() + 12, sizeof(opaque_));
|
|
111
|
+
opaque_ = utils::network_to_host(opaque_);
|
|
111
112
|
|
|
112
113
|
memcpy(&cas_, header_.data() + 16, sizeof(cas_));
|
|
114
|
+
cas_ = utils::network_to_host(cas_);
|
|
113
115
|
}
|
|
114
116
|
|
|
115
117
|
void parse_body()
|
|
@@ -65,6 +65,7 @@ map_status_code(protocol::client_opcode opcode, std::uint16_t status) -> std::er
|
|
|
65
65
|
case key_value_status_code::invalid:
|
|
66
66
|
case key_value_status_code::xattr_invalid:
|
|
67
67
|
case key_value_status_code::subdoc_invalid_combo:
|
|
68
|
+
case key_value_status_code::subdoc_invalid_xattr_order:
|
|
68
69
|
case key_value_status_code::subdoc_deleted_document_cannot_have_value:
|
|
69
70
|
return errc::common::invalid_argument;
|
|
70
71
|
|
|
@@ -181,7 +182,6 @@ map_status_code(protocol::client_opcode opcode, std::uint16_t status) -> std::er
|
|
|
181
182
|
case key_value_status_code::scope_size_limit_exceeded:
|
|
182
183
|
return errc::common::quota_limited;
|
|
183
184
|
|
|
184
|
-
case key_value_status_code::subdoc_invalid_xattr_order:
|
|
185
185
|
case key_value_status_code::not_my_vbucket:
|
|
186
186
|
case key_value_status_code::auth_continue:
|
|
187
187
|
case key_value_status_code::range_error:
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2026. Couchbase, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#pragma once
|
|
19
|
+
|
|
20
|
+
// Translates the core analytics request/response to and from the couchbase.analytics.v1 protobuf
|
|
21
|
+
// messages, mirroring query_converter. Rows arrive across streamed AnalyticsQueryResponse messages
|
|
22
|
+
// and are buffered into analytics_response::rows when no callback is provided, or delivered
|
|
23
|
+
// incrementally to row_callback when present; the terminal message carries the metadata.
|
|
24
|
+
//
|
|
25
|
+
// Features with no couchbase2 equivalent are reported by can_encode() so the component can surface
|
|
26
|
+
// feature_not_available rather than silently dropping them: the `raw` passthrough map and scoped
|
|
27
|
+
// analytics.
|
|
28
|
+
//
|
|
29
|
+
// Scoped analytics is refused because the schema cannot express it, not merely because it is
|
|
30
|
+
// unimplemented. AnalyticsQueryRequest at the pinned protostellar revision retired the field the
|
|
31
|
+
// older schema used for this: field 8 is `reserved // bucket_name`, and field 9 was renamed from
|
|
32
|
+
// `scope_name` to `analytics_scope_name` -- one analytics-scope identifier rather than the
|
|
33
|
+
// bucket/scope pair the core request carries in bucket_name/scope_name/scope_qualifier. Collapsing
|
|
34
|
+
// a two-part qualification into that single name would be a guess about which the gateway means, so
|
|
35
|
+
// the request is refused instead. (Vendored copies in couchbase-jvm-clients and
|
|
36
|
+
// couchbase-net-client still carry the older bucket_name=8/scope_name=9 shape, so a mapping cribbed
|
|
37
|
+
// from them would target a schema this client does not speak.)
|
|
38
|
+
|
|
39
|
+
#include "core/operations/document_analytics.hxx"
|
|
40
|
+
#include "core/protostellar/json_payload.hxx"
|
|
41
|
+
|
|
42
|
+
#include <couchbase/analytics_scan_consistency.hxx>
|
|
43
|
+
|
|
44
|
+
#include <couchbase/analytics/v1/analytics.pb.h>
|
|
45
|
+
|
|
46
|
+
#include <chrono>
|
|
47
|
+
#include <cstddef>
|
|
48
|
+
#include <string>
|
|
49
|
+
#include <utility>
|
|
50
|
+
#include <vector>
|
|
51
|
+
|
|
52
|
+
namespace couchbase::core::protostellar::analytics
|
|
53
|
+
{
|
|
54
|
+
namespace v1 = ::couchbase::analytics::v1;
|
|
55
|
+
|
|
56
|
+
[[nodiscard]] inline auto
|
|
57
|
+
can_encode(const operations::analytics_request& request) -> bool
|
|
58
|
+
{
|
|
59
|
+
return request.raw.empty() && !request.bucket_name.has_value() &&
|
|
60
|
+
!request.scope_name.has_value() && !request.scope_qualifier.has_value();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
inline auto
|
|
64
|
+
encode(const operations::analytics_request& request) -> v1::AnalyticsQueryRequest
|
|
65
|
+
{
|
|
66
|
+
v1::AnalyticsQueryRequest proto;
|
|
67
|
+
proto.set_statement(request.statement);
|
|
68
|
+
proto.set_read_only(request.readonly);
|
|
69
|
+
proto.set_priority(request.priority);
|
|
70
|
+
if (request.client_context_id.has_value()) {
|
|
71
|
+
proto.set_client_context_id(*request.client_context_id);
|
|
72
|
+
}
|
|
73
|
+
if (request.scan_consistency.has_value()) {
|
|
74
|
+
switch (*request.scan_consistency) {
|
|
75
|
+
case analytics_scan_consistency::not_bounded:
|
|
76
|
+
proto.set_scan_consistency(
|
|
77
|
+
v1::AnalyticsQueryRequest_ScanConsistency_SCAN_CONSISTENCY_NOT_BOUNDED);
|
|
78
|
+
break;
|
|
79
|
+
case analytics_scan_consistency::request_plus:
|
|
80
|
+
proto.set_scan_consistency(
|
|
81
|
+
v1::AnalyticsQueryRequest_ScanConsistency_SCAN_CONSISTENCY_REQUEST_PLUS);
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
for (const auto& parameter : request.positional_parameters) {
|
|
86
|
+
proto.add_positional_parameters(json_payload(parameter));
|
|
87
|
+
}
|
|
88
|
+
for (const auto& [name, value] : request.named_parameters) {
|
|
89
|
+
(*proto.mutable_named_parameters())[name] = json_payload(value);
|
|
90
|
+
}
|
|
91
|
+
return proto;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
[[nodiscard]] inline auto
|
|
95
|
+
to_nanoseconds(const google::protobuf::Duration& duration) -> std::chrono::nanoseconds
|
|
96
|
+
{
|
|
97
|
+
return std::chrono::seconds{ duration.seconds() } + std::chrono::nanoseconds{ duration.nanos() };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// The gateway reports status as a lowercase string; map it onto the core enum.
|
|
101
|
+
[[nodiscard]] inline auto
|
|
102
|
+
status_from_string(const std::string& status) -> operations::analytics_response::analytics_status
|
|
103
|
+
{
|
|
104
|
+
using s = operations::analytics_response::analytics_status;
|
|
105
|
+
if (status == "running") {
|
|
106
|
+
return s::running;
|
|
107
|
+
}
|
|
108
|
+
if (status == "success") {
|
|
109
|
+
return s::success;
|
|
110
|
+
}
|
|
111
|
+
if (status == "errors") {
|
|
112
|
+
return s::errors;
|
|
113
|
+
}
|
|
114
|
+
if (status == "completed") {
|
|
115
|
+
return s::completed;
|
|
116
|
+
}
|
|
117
|
+
if (status == "stopped") {
|
|
118
|
+
return s::stopped;
|
|
119
|
+
}
|
|
120
|
+
if (status == "timeout" || status == "timedout") {
|
|
121
|
+
return s::timedout;
|
|
122
|
+
}
|
|
123
|
+
if (status == "closed") {
|
|
124
|
+
return s::closed;
|
|
125
|
+
}
|
|
126
|
+
if (status == "fatal") {
|
|
127
|
+
return s::fatal;
|
|
128
|
+
}
|
|
129
|
+
if (status == "aborted") {
|
|
130
|
+
return s::aborted;
|
|
131
|
+
}
|
|
132
|
+
return s::unknown;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
inline void
|
|
136
|
+
decode_meta_data(const v1::AnalyticsQueryResponse_MetaData& proto,
|
|
137
|
+
operations::analytics_response::analytics_meta_data& meta)
|
|
138
|
+
{
|
|
139
|
+
meta.request_id = proto.request_id();
|
|
140
|
+
meta.client_context_id = proto.client_context_id();
|
|
141
|
+
meta.status = status_from_string(proto.status());
|
|
142
|
+
if (!proto.signature().empty()) {
|
|
143
|
+
meta.signature = proto.signature();
|
|
144
|
+
}
|
|
145
|
+
if (proto.has_metrics()) {
|
|
146
|
+
const auto& m = proto.metrics();
|
|
147
|
+
meta.metrics.elapsed_time = to_nanoseconds(m.elapsed_time());
|
|
148
|
+
meta.metrics.execution_time = to_nanoseconds(m.execution_time());
|
|
149
|
+
meta.metrics.result_count = m.result_count();
|
|
150
|
+
meta.metrics.result_size = m.result_size();
|
|
151
|
+
meta.metrics.error_count = m.error_count();
|
|
152
|
+
meta.metrics.processed_objects = m.processed_objects();
|
|
153
|
+
meta.metrics.warning_count = m.warning_count();
|
|
154
|
+
}
|
|
155
|
+
// Replaced rather than appended, matching query_converter: decode_meta_data runs once per
|
|
156
|
+
// MetaData message, and appending would accumulate duplicates without bound if a gateway ever
|
|
157
|
+
// sent more than one.
|
|
158
|
+
if (proto.warnings_size() > 0) {
|
|
159
|
+
std::vector<operations::analytics_response::analytics_problem> warnings;
|
|
160
|
+
warnings.reserve(static_cast<std::size_t>(proto.warnings_size()));
|
|
161
|
+
for (const auto& w : proto.warnings()) {
|
|
162
|
+
operations::analytics_response::analytics_problem problem;
|
|
163
|
+
problem.code = w.code();
|
|
164
|
+
problem.message = w.message();
|
|
165
|
+
warnings.push_back(std::move(problem));
|
|
166
|
+
}
|
|
167
|
+
meta.warnings = std::move(warnings);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
} // namespace couchbase::core::protostellar::analytics
|