couchbase 3.8.2 → 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 +1 -1
- 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 +121 -55
- 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 +229 -42
- 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 +1 -2
- 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 +309 -301
- 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 +151 -21
- data/ext/couchbase/core/io/streams.hxx +48 -1
- 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/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 +108 -63
- data/ext/couchbase/core/transactions/attempt_context_impl.hxx +19 -2
- 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 +165 -72
- 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 +2 -2
- 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 +183 -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 +17 -0
- 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 +174 -42
- 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 +91 -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
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2020-Present 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
|
+
#include <couchbase/codec/encoded_value.hxx>
|
|
21
|
+
#include <couchbase/codec/serializer_traits.hxx>
|
|
22
|
+
#include <utility>
|
|
23
|
+
|
|
24
|
+
namespace couchbase
|
|
25
|
+
{
|
|
26
|
+
|
|
27
|
+
namespace codec
|
|
28
|
+
{
|
|
29
|
+
class tao_json_serializer;
|
|
30
|
+
} // namespace codec
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Represents a single row of a streaming query result.
|
|
34
|
+
*
|
|
35
|
+
* The raw JSON bytes can be decoded via @ref content_as().
|
|
36
|
+
*
|
|
37
|
+
* @since 1.4.0
|
|
38
|
+
* @volatile
|
|
39
|
+
*/
|
|
40
|
+
class query_row
|
|
41
|
+
{
|
|
42
|
+
public:
|
|
43
|
+
/**
|
|
44
|
+
* @since 1.4.0
|
|
45
|
+
* @volatile
|
|
46
|
+
*/
|
|
47
|
+
query_row() = default;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Constructs a row from raw JSON bytes.
|
|
51
|
+
*
|
|
52
|
+
* @param content raw JSON bytes for this row
|
|
53
|
+
*
|
|
54
|
+
* @since 1.4.0
|
|
55
|
+
* @volatile
|
|
56
|
+
*/
|
|
57
|
+
explicit query_row(codec::binary content)
|
|
58
|
+
: content_{ std::move(content) }
|
|
59
|
+
{
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Decodes the row content into the requested document type using the given serializer.
|
|
64
|
+
*
|
|
65
|
+
* Only call this on a row obtained from a successful @ref query_stream_result#next() (falsy
|
|
66
|
+
* error, engaged optional). The end-of-stream and error sentinels carry an empty @ref query_row,
|
|
67
|
+
* and decoding empty/malformed content throws the serializer's parse exception — gate on the
|
|
68
|
+
* three-state next() contract (check the error, then the optional) before decoding.
|
|
69
|
+
*
|
|
70
|
+
* Any type with a serializer-compatible specialization works as the document type:
|
|
71
|
+
*
|
|
72
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx streaming-product
|
|
73
|
+
*
|
|
74
|
+
* Usage:
|
|
75
|
+
*
|
|
76
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream
|
|
77
|
+
*
|
|
78
|
+
* @tparam Serializer the serializer to use (defaults to @ref codec::tao_json_serializer)
|
|
79
|
+
* @tparam Document the document type to decode into (defaults to the serializer's document_type)
|
|
80
|
+
* @return the decoded document
|
|
81
|
+
* @throws the serializer's deserialization exception if the content is empty or not valid JSON
|
|
82
|
+
*
|
|
83
|
+
* @since 1.4.0
|
|
84
|
+
* @volatile
|
|
85
|
+
*/
|
|
86
|
+
template<typename Serializer = codec::tao_json_serializer,
|
|
87
|
+
typename Document = typename Serializer::document_type,
|
|
88
|
+
std::enable_if_t<codec::is_serializer_v<Serializer>, bool> = true>
|
|
89
|
+
[[nodiscard]] auto content_as() const -> Document
|
|
90
|
+
{
|
|
91
|
+
return Serializer::template deserialize<Document>(content_);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Returns the raw binary content of this row.
|
|
96
|
+
*
|
|
97
|
+
* @return raw JSON bytes
|
|
98
|
+
*
|
|
99
|
+
* @since 1.4.0
|
|
100
|
+
* @volatile
|
|
101
|
+
*/
|
|
102
|
+
[[nodiscard]] auto content_as_binary() const -> const codec::binary&
|
|
103
|
+
{
|
|
104
|
+
return content_;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private:
|
|
108
|
+
codec::binary content_{};
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
} // namespace couchbase
|
|
@@ -0,0 +1,302 @@
|
|
|
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
|
+
#include <couchbase/codec/encoded_value.hxx>
|
|
21
|
+
#include <couchbase/error.hxx>
|
|
22
|
+
#include <couchbase/query_meta_data.hxx>
|
|
23
|
+
#include <couchbase/query_row.hxx>
|
|
24
|
+
|
|
25
|
+
#include <functional>
|
|
26
|
+
#include <future>
|
|
27
|
+
#include <memory>
|
|
28
|
+
#include <optional>
|
|
29
|
+
#include <utility>
|
|
30
|
+
|
|
31
|
+
namespace couchbase
|
|
32
|
+
{
|
|
33
|
+
#ifndef COUCHBASE_CXX_CLIENT_DOXYGEN
|
|
34
|
+
class internal_query_stream_result;
|
|
35
|
+
#endif
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The signature for the handler of the @ref query_stream_result#next() operation.
|
|
39
|
+
*
|
|
40
|
+
* @since 1.4.0
|
|
41
|
+
* @volatile
|
|
42
|
+
*/
|
|
43
|
+
using query_row_handler = std::function<void(error, std::optional<query_row>)>;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* A streaming result handle for N1QL queries.
|
|
47
|
+
*
|
|
48
|
+
* Rows are fetched one at a time via @ref next(). The stream must be fully drained
|
|
49
|
+
* (or @ref cancel() called) before @ref meta_data() resolves. Only a single @ref next()
|
|
50
|
+
* call may be outstanding at a time.
|
|
51
|
+
*
|
|
52
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream
|
|
53
|
+
*
|
|
54
|
+
* @note The future-returning overloads (`next()`, `meta_data()`) and the eager @ref iterator
|
|
55
|
+
* block the calling thread until the result is ready. They must not be called from within an SDK
|
|
56
|
+
* completion handler (i.e. the library's I/O thread) — doing so blocks that thread against itself
|
|
57
|
+
* and the stream can never advance. From a completion handler, use the callback @ref next()
|
|
58
|
+
* overload instead.
|
|
59
|
+
*
|
|
60
|
+
* @note Copies of a result handle share one underlying stream: they alias the same rows, the same
|
|
61
|
+
* single-outstanding-next() budget, and the same @ref cancel(). Copying does not fork the stream;
|
|
62
|
+
* a @ref next() on any copy consumes the next row for all of them. Use a single handle per stream.
|
|
63
|
+
*
|
|
64
|
+
* @since 1.4.0
|
|
65
|
+
* @volatile
|
|
66
|
+
*/
|
|
67
|
+
class query_stream_result
|
|
68
|
+
{
|
|
69
|
+
public:
|
|
70
|
+
/**
|
|
71
|
+
* Constructs an empty (no-op) result handle.
|
|
72
|
+
*
|
|
73
|
+
* @since 1.4.0
|
|
74
|
+
* @internal
|
|
75
|
+
*/
|
|
76
|
+
query_stream_result() = default;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Constructs a query stream result from an internal result.
|
|
80
|
+
*
|
|
81
|
+
* @param internal the internal result handle
|
|
82
|
+
*
|
|
83
|
+
* @since 1.4.0
|
|
84
|
+
* @internal
|
|
85
|
+
*/
|
|
86
|
+
explicit query_stream_result(std::shared_ptr<internal_query_stream_result> internal);
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Fetches the next row asynchronously, invoking the handler when ready.
|
|
90
|
+
*
|
|
91
|
+
* The handler receives ({}, row) for a real row, ({}, {}) at clean end-of-stream,
|
|
92
|
+
* or (error, {}) if the stream ended with an error.
|
|
93
|
+
*
|
|
94
|
+
* Only one outstanding call is allowed at a time.
|
|
95
|
+
*
|
|
96
|
+
* This is the overload to use from a completion handler: issuing the following pull from inside
|
|
97
|
+
* the handler drains the stream without ever blocking a thread.
|
|
98
|
+
*
|
|
99
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-async
|
|
100
|
+
*
|
|
101
|
+
* @param handler callable that implements @ref query_row_handler
|
|
102
|
+
*
|
|
103
|
+
* @since 1.4.0
|
|
104
|
+
* @volatile
|
|
105
|
+
*/
|
|
106
|
+
void next(query_row_handler&& handler) const;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Fetches the next row, returning a future.
|
|
110
|
+
*
|
|
111
|
+
* Only one outstanding call is allowed at a time.
|
|
112
|
+
*
|
|
113
|
+
* A failure reaches the caller through one of two channels — the error returned by the
|
|
114
|
+
* originating @ref cluster#query_stream() (the request never started) or the stream's terminal
|
|
115
|
+
* delivered here. Which one fires is not fixed, so both have to be handled. Once a terminal has
|
|
116
|
+
* been reached it is re-delivered on every further call rather than blocking on a drained stream:
|
|
117
|
+
*
|
|
118
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-errors
|
|
119
|
+
*
|
|
120
|
+
* @return future object that carries the result of the operation
|
|
121
|
+
*
|
|
122
|
+
* @since 1.4.0
|
|
123
|
+
* @volatile
|
|
124
|
+
*/
|
|
125
|
+
[[nodiscard]] auto next() const -> std::future<std::pair<error, std::optional<query_row>>>;
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Returns the query signature captured from the response metadata, if present.
|
|
129
|
+
*
|
|
130
|
+
* The signature is part of the response preamble, so — unlike @ref meta_data() — it is available
|
|
131
|
+
* as soon as the stream has started, without draining it first:
|
|
132
|
+
*
|
|
133
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream
|
|
134
|
+
*
|
|
135
|
+
* @return optional binary JSON signature
|
|
136
|
+
*
|
|
137
|
+
* @since 1.4.0
|
|
138
|
+
* @volatile
|
|
139
|
+
*/
|
|
140
|
+
[[nodiscard]] auto signature() const -> std::optional<codec::binary>;
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Returns the query metadata.
|
|
144
|
+
*
|
|
145
|
+
* The returned future resolves only after the stream has been fully drained
|
|
146
|
+
* (all rows consumed or the stream cancelled). May be called more than once;
|
|
147
|
+
* each call returns its own future and all of them resolve together once the
|
|
148
|
+
* metadata becomes available.
|
|
149
|
+
*
|
|
150
|
+
* If the stream ended with an error, or was torn down by @ref cancel() before reaching a natural
|
|
151
|
+
* terminal, the returned future resolves with that error instead of waiting for a trailer that
|
|
152
|
+
* will never arrive:
|
|
153
|
+
*
|
|
154
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-errors
|
|
155
|
+
*
|
|
156
|
+
* @return future carrying (error, query_meta_data)
|
|
157
|
+
*
|
|
158
|
+
* @since 1.4.0
|
|
159
|
+
* @volatile
|
|
160
|
+
*/
|
|
161
|
+
[[nodiscard]] auto meta_data() const -> std::future<std::pair<error, query_meta_data>>;
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Cancels the stream and closes the underlying HTTP connection.
|
|
165
|
+
*
|
|
166
|
+
* Simply dropping the last handle before the stream is fully drained also tears the stream down,
|
|
167
|
+
* but if a pull is in flight the underlying connection is not released until that pull settles
|
|
168
|
+
* (up to the inter-read idle timeout). Call cancel() explicitly for prompt, deterministic
|
|
169
|
+
* teardown of the connection and its timers.
|
|
170
|
+
*
|
|
171
|
+
* Part [2] of the example below consumes only a prefix of a large result and then cancels. The
|
|
172
|
+
* rows that were never pulled are never transferred, so the cost of a prefix read is proportional
|
|
173
|
+
* to the prefix rather than to the full result:
|
|
174
|
+
*
|
|
175
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-iterator
|
|
176
|
+
*
|
|
177
|
+
* After cancel(), @ref next() reports @ref errc::common::request_canceled — a terminal that has
|
|
178
|
+
* to be told apart from a genuine failure. Rows consumed before the cancel remain valid:
|
|
179
|
+
*
|
|
180
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-errors
|
|
181
|
+
*
|
|
182
|
+
* @since 1.4.0
|
|
183
|
+
* @volatile
|
|
184
|
+
*/
|
|
185
|
+
void cancel() const;
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Sentinel returned by @ref end(). An @ref iterator compares equal to it once the stream has been
|
|
189
|
+
* fully drained (after any terminal error element). Using a distinct end type means iterators are
|
|
190
|
+
* only ever compared against the end sentinel, never against one another.
|
|
191
|
+
*
|
|
192
|
+
* @since 1.4.0
|
|
193
|
+
* @volatile
|
|
194
|
+
*/
|
|
195
|
+
struct end_sentinel {
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* A single-pass input iterator that synchronously fetches rows one at a time.
|
|
200
|
+
*
|
|
201
|
+
* Dereferencing yields `std::pair<error, query_row>`: for a data row the error is falsy; if the
|
|
202
|
+
* stream ends with an error, the iterator visits exactly one final element whose error is truthy
|
|
203
|
+
* (and whose row is empty) before comparing equal to @ref end(). A clean end-of-stream yields no
|
|
204
|
+
* such element. This guarantees a `for (auto [err, row] : result)` loop can observe a terminal
|
|
205
|
+
* error rather than silently stopping.
|
|
206
|
+
*
|
|
207
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-iterator
|
|
208
|
+
*
|
|
209
|
+
* Part [2] of the error-handling example shows the terminal element being observed rather than
|
|
210
|
+
* silently truncating the result:
|
|
211
|
+
*
|
|
212
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-errors
|
|
213
|
+
*
|
|
214
|
+
* This is a minimal single-pass iterator intended for range-based for and manual
|
|
215
|
+
* `while (it != result.end())` loops. It compares only against @ref end() (never against another
|
|
216
|
+
* iterator), and provides neither `operator->` nor post-increment, so it is deliberately not a
|
|
217
|
+
* `LegacyInputIterator` and does not work with `<algorithm>` or `std::distance`. @ref begin()
|
|
218
|
+
* must be called once.
|
|
219
|
+
*
|
|
220
|
+
* @since 1.4.0
|
|
221
|
+
* @volatile
|
|
222
|
+
*/
|
|
223
|
+
class iterator
|
|
224
|
+
{
|
|
225
|
+
public:
|
|
226
|
+
auto operator*() const -> std::pair<error, query_row>;
|
|
227
|
+
auto operator++() -> iterator&;
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Constructs an iterator over an internal result; prefer @ref begin().
|
|
231
|
+
*
|
|
232
|
+
* @since 1.4.0
|
|
233
|
+
* @internal
|
|
234
|
+
*/
|
|
235
|
+
explicit iterator(std::shared_ptr<internal_query_stream_result> internal);
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Compares an iterator against the end sentinel. Provided in both argument orders (and as
|
|
239
|
+
* both @c == and @c !=) so the range-for idiom, `while (it != result.end())` loops, and wrapper
|
|
240
|
+
* code all work regardless of which operand is written first. Iterators are intentionally never
|
|
241
|
+
* comparable to one another: a single-pass stream has one position, so iterator-to-iterator
|
|
242
|
+
* equality would be meaningless — the type only ever compares against @ref end().
|
|
243
|
+
*/
|
|
244
|
+
friend auto operator==(const iterator& it, end_sentinel /* end */) -> bool
|
|
245
|
+
{
|
|
246
|
+
return it.terminal_;
|
|
247
|
+
}
|
|
248
|
+
friend auto operator==(end_sentinel end, const iterator& it) -> bool
|
|
249
|
+
{
|
|
250
|
+
return it == end;
|
|
251
|
+
}
|
|
252
|
+
friend auto operator!=(const iterator& it, end_sentinel end) -> bool
|
|
253
|
+
{
|
|
254
|
+
return !(it == end);
|
|
255
|
+
}
|
|
256
|
+
friend auto operator!=(end_sentinel end, const iterator& it) -> bool
|
|
257
|
+
{
|
|
258
|
+
return !(it == end);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Intentionally no std::iterator_traits typedefs (notably no iterator_category). This is a
|
|
262
|
+
// deliberately minimal single-pass iterator for range-based for and `while (it !=
|
|
263
|
+
// result.end())` loops only (see the class doc); it omits post-increment and operator->.
|
|
264
|
+
// Declaring an input_iterator_tag while omitting those would falsely advertise
|
|
265
|
+
// LegacyInputIterator / std::input_iterator conformance and could break generic code that
|
|
266
|
+
// trusts iterator_traits. Range-based for needs none of these typedefs.
|
|
267
|
+
|
|
268
|
+
private:
|
|
269
|
+
void fetch_item();
|
|
270
|
+
|
|
271
|
+
std::shared_ptr<internal_query_stream_result> internal_{};
|
|
272
|
+
std::pair<error, query_row> item_{};
|
|
273
|
+
bool terminal_{ false };
|
|
274
|
+
// Set when fetch_item() lands on a terminal error: the error element is delivered once (the
|
|
275
|
+
// iterator is not yet equal to end()), and the next increment advances to true end.
|
|
276
|
+
bool error_pending_{ false };
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Returns an iterator to the beginning.
|
|
281
|
+
*
|
|
282
|
+
* @return iterator to the first row
|
|
283
|
+
*
|
|
284
|
+
* @since 1.4.0
|
|
285
|
+
* @volatile
|
|
286
|
+
*/
|
|
287
|
+
[[nodiscard]] auto begin() const -> iterator;
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Returns the end sentinel.
|
|
291
|
+
*
|
|
292
|
+
* @return sentinel that an @ref iterator compares equal to once the stream is drained
|
|
293
|
+
*
|
|
294
|
+
* @since 1.4.0
|
|
295
|
+
* @volatile
|
|
296
|
+
*/
|
|
297
|
+
[[nodiscard]] auto end() const -> end_sentinel;
|
|
298
|
+
|
|
299
|
+
private:
|
|
300
|
+
std::shared_ptr<internal_query_stream_result> internal_{};
|
|
301
|
+
};
|
|
302
|
+
} // namespace couchbase
|
|
@@ -31,15 +31,15 @@ namespace couchbase
|
|
|
31
31
|
* parameter with the number to boost the search. For example perform
|
|
32
32
|
* @ref match_query for pool in both the name and description fields, but documents having the term
|
|
33
33
|
* in the name field score higher.
|
|
34
|
-
* @snippet{trimleft}
|
|
34
|
+
* @snippet{trimleft} unit/management/search.cxx search-query-string-boosting
|
|
35
35
|
*
|
|
36
36
|
* 2. You can perform date or numeric range searches by using the `>`, `>=`, `<`, and `<=`
|
|
37
37
|
* operators, followed by a date value in quotes. For example, perform a @ref date_range_query on
|
|
38
38
|
* the created field for values after September 21, 2016.
|
|
39
|
-
* @snippet{trimleft}
|
|
39
|
+
* @snippet{trimleft} unit/management/search.cxx search-query-string-date-range
|
|
40
40
|
* Or, perform a @ref numeric_range_query on the `reviews.ratings.Cleanliness` field, for values
|
|
41
41
|
* greater than 4.
|
|
42
|
-
* @snippet{trimleft}
|
|
42
|
+
* @snippet{trimleft} unit/management/search.cxx search-query-string-numeric-range
|
|
43
43
|
*
|
|
44
44
|
* @see https://docs.couchbase.com/server/current/fts/fts-query-string-syntax.html definition of
|
|
45
45
|
* query syntax
|
|
@@ -28,7 +28,7 @@ namespace couchbase
|
|
|
28
28
|
* Finds documents containing terms that match the specified regular expression.
|
|
29
29
|
*
|
|
30
30
|
* Match documents where field `reviews.content` contains words starting with `"inter"`:
|
|
31
|
-
* @snippet{trimleft}
|
|
31
|
+
* @snippet{trimleft} unit/management/search.cxx search-regexp
|
|
32
32
|
*
|
|
33
33
|
* @see https://docs.couchbase.com/server/current/fts/fts-supported-queries-regexp.html server
|
|
34
34
|
* documentation
|
|
@@ -73,8 +73,8 @@ struct replace_options : public common_durability_options<replace_options> {
|
|
|
73
73
|
*
|
|
74
74
|
* If true, and the document exists, its expiry will not be modified. Otherwise the document's
|
|
75
75
|
* expiry is determined by
|
|
76
|
-
* {@link #expiry(std::chrono::seconds)} or {@link
|
|
77
|
-
*
|
|
76
|
+
* {@link #expiry expiry(std::chrono::seconds)} or {@link #expiry
|
|
77
|
+
* expiry(std::chrono::system_clock::time_point)}.
|
|
78
78
|
*
|
|
79
79
|
* Requires Couchbase Server 7.0 or later.
|
|
80
80
|
*
|
|
@@ -94,7 +94,7 @@ struct replace_options : public common_durability_options<replace_options> {
|
|
|
94
94
|
* Sets the expiry for the document. By default the document will never expire.
|
|
95
95
|
*
|
|
96
96
|
* The duration must be less than 50 years. For expiry further in the future, use
|
|
97
|
-
* {@link #expiry(std::chrono::system_clock::time_point)}.
|
|
97
|
+
* {@link #expiry expiry(std::chrono::system_clock::time_point)}.
|
|
98
98
|
*
|
|
99
99
|
* @param duration the duration after which the document will expire (zero duration means never
|
|
100
100
|
* expire).
|
|
@@ -56,7 +56,7 @@ public:
|
|
|
56
56
|
* @param node_id identity of the node that served the request
|
|
57
57
|
*
|
|
58
58
|
* @since 1.3.2
|
|
59
|
-
* @
|
|
59
|
+
* @internal
|
|
60
60
|
*/
|
|
61
61
|
result(couchbase::cas cas, couchbase::node_id node_id)
|
|
62
62
|
: cas_(cas)
|
|
@@ -65,7 +65,7 @@ public:
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
|
-
* @return
|
|
68
|
+
* @return CAS value associated with the operation result.
|
|
69
69
|
*
|
|
70
70
|
* @since 1.0.0
|
|
71
71
|
* @committed
|
|
@@ -92,10 +92,21 @@ public:
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
/**
|
|
95
|
+
* Implementation-only setter used by @c core::impl::invoke_with_node_id to
|
|
96
|
+
* propagate the node identity from a KV error context onto the result.
|
|
97
|
+
*
|
|
98
|
+
* Despite living in the public header (it is needed to set the field on
|
|
99
|
+
* the public-facing result-derived types from a template instantiation in
|
|
100
|
+
* the impl layer), this is **not** part of the user-facing API. The name
|
|
101
|
+
* is deliberately noisy — @c @internal alone is documentation-only and
|
|
102
|
+
* does not stop a user discovering @c result.node_id(...) via
|
|
103
|
+
* autocomplete; @c set_node_id_internal is harder to mistake for a
|
|
104
|
+
* documented mutator.
|
|
105
|
+
*
|
|
95
106
|
* @since 1.3.2
|
|
96
107
|
* @internal
|
|
97
108
|
*/
|
|
98
|
-
void
|
|
109
|
+
void set_node_id_internal(couchbase::node_id id)
|
|
99
110
|
{
|
|
100
111
|
node_id_ = std::move(id);
|
|
101
112
|
}
|
|
@@ -62,6 +62,7 @@ public:
|
|
|
62
62
|
* @param cas
|
|
63
63
|
* @param value raw document contents along with flags describing its structure
|
|
64
64
|
* @param expiry_time optional point in time when the document will expire
|
|
65
|
+
* @param crypto_manager manager handed to the transcoder to decrypt encrypted fields
|
|
65
66
|
*
|
|
66
67
|
* @since 1.0.0
|
|
67
68
|
* @internal
|
|
@@ -113,6 +113,52 @@ public:
|
|
|
113
113
|
[[nodiscard]] auto query(std::string statement, const query_options& options = {}) const
|
|
114
114
|
-> std::future<std::pair<error, query_result>>;
|
|
115
115
|
|
|
116
|
+
/**
|
|
117
|
+
* Performs a streaming query against the query (N1QL) services.
|
|
118
|
+
*
|
|
119
|
+
* The handler resolves as soon as the response preamble has been parsed; rows are then pulled
|
|
120
|
+
* lazily from the @ref query_stream_result, so the full result is never buffered in memory.
|
|
121
|
+
*
|
|
122
|
+
* @note Prepared statements (@ref query_options#adhoc set to false) are not streamed: such a
|
|
123
|
+
* request falls back to the buffered @ref query() path and its rows are replayed through the
|
|
124
|
+
* returned handle.
|
|
125
|
+
*
|
|
126
|
+
* The handler runs on the library's I/O thread, so the stream must be drained with the callback
|
|
127
|
+
* @ref query_stream_result#next() overload rather than the blocking ones. The example is written
|
|
128
|
+
* against @ref cluster#query_stream(), but the scope-level overload behaves identically:
|
|
129
|
+
*
|
|
130
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-async
|
|
131
|
+
*
|
|
132
|
+
* @param statement the N1QL query statement.
|
|
133
|
+
* @param options options to customize the query request.
|
|
134
|
+
* @param handler the handler that implements @ref query_stream_handler
|
|
135
|
+
*
|
|
136
|
+
* @since 1.4.0
|
|
137
|
+
* @volatile
|
|
138
|
+
*/
|
|
139
|
+
void query_stream(std::string statement,
|
|
140
|
+
const query_options& options,
|
|
141
|
+
query_stream_handler&& handler) const;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Performs a streaming query against the query (N1QL) services.
|
|
145
|
+
*
|
|
146
|
+
* Unqualified keyspaces in the statement resolve against this scope, so it names the collection
|
|
147
|
+
* rather than the bucket. The result can be consumed with a range-based for loop, and abandoned
|
|
148
|
+
* early without transferring the rows that were never read:
|
|
149
|
+
*
|
|
150
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-iterator
|
|
151
|
+
*
|
|
152
|
+
* @param statement the N1QL query statement.
|
|
153
|
+
* @param options options to customize the query request.
|
|
154
|
+
* @return future object that carries the streaming result handle
|
|
155
|
+
*
|
|
156
|
+
* @since 1.4.0
|
|
157
|
+
* @volatile
|
|
158
|
+
*/
|
|
159
|
+
[[nodiscard]] auto query_stream(std::string statement, const query_options& options = {}) const
|
|
160
|
+
-> std::future<std::pair<error, query_stream_result>>;
|
|
161
|
+
|
|
116
162
|
/**
|
|
117
163
|
* Performs a request against the full text search services.
|
|
118
164
|
*
|
|
@@ -190,8 +236,45 @@ public:
|
|
|
190
236
|
* @since 1.0.0
|
|
191
237
|
* @committed
|
|
192
238
|
*/
|
|
193
|
-
[[nodiscard]] auto analytics_query(std::string statement,
|
|
194
|
-
|
|
239
|
+
[[nodiscard]] auto analytics_query(std::string statement,
|
|
240
|
+
const analytics_options& options = {}) const
|
|
241
|
+
-> std::future<std::pair<error, analytics_result>>;
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Performs a streaming query against the analytics services.
|
|
245
|
+
*
|
|
246
|
+
* The handler resolves as soon as the response preamble has been parsed; rows are then pulled
|
|
247
|
+
* lazily from the @ref analytics_stream_result, so the full result is never buffered in memory.
|
|
248
|
+
*
|
|
249
|
+
* @param statement the analytics query statement.
|
|
250
|
+
* @param options options to customize the query request.
|
|
251
|
+
* @param handler the handler that implements @ref analytics_stream_handler
|
|
252
|
+
*
|
|
253
|
+
* @since 1.4.0
|
|
254
|
+
* @volatile
|
|
255
|
+
*/
|
|
256
|
+
void analytics_query_stream(std::string statement,
|
|
257
|
+
const analytics_options& options,
|
|
258
|
+
analytics_stream_handler&& handler) const;
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Performs a streaming query against the analytics services.
|
|
262
|
+
*
|
|
263
|
+
* The example is written against @ref cluster#analytics_query_stream(), but the scope-level
|
|
264
|
+
* overload behaves identically apart from resolving the statement against this scope:
|
|
265
|
+
*
|
|
266
|
+
* @snippet{trimleft} test_integration_examples_streaming.cxx example-analytics-stream
|
|
267
|
+
*
|
|
268
|
+
* @param statement the analytics query statement.
|
|
269
|
+
* @param options options to customize the query request.
|
|
270
|
+
* @return future object that carries the streaming result handle
|
|
271
|
+
*
|
|
272
|
+
* @since 1.4.0
|
|
273
|
+
* @volatile
|
|
274
|
+
*/
|
|
275
|
+
[[nodiscard]] auto analytics_query_stream(std::string statement,
|
|
276
|
+
const analytics_options& options = {}) const
|
|
277
|
+
-> std::future<std::pair<error, analytics_stream_result>>;
|
|
195
278
|
|
|
196
279
|
/**
|
|
197
280
|
* Provides access to search index management services at the scope level
|