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
|
@@ -0,0 +1,301 @@
|
|
|
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 core bucket management settings to and from couchbase.admin.bucket.v1 (unary admin
|
|
21
|
+
// RPCs). The proto enums have no `unknown` sentinel, so the core `unknown` values fall back to the
|
|
22
|
+
// server default on encode. memcached buckets have no couchbase2 representation;
|
|
23
|
+
// apply_create_only_settings() returns false for them so the component surfaces
|
|
24
|
+
// feature_not_available.
|
|
25
|
+
//
|
|
26
|
+
// Every field the encode side writes is read back by decode_bucket(), because get-modify-update is
|
|
27
|
+
// the ordinary way these settings are changed: a field that decodes to a default is sent back as a
|
|
28
|
+
// default on the next update and silently resets the bucket.
|
|
29
|
+
|
|
30
|
+
#include "core/management/bucket_settings.hxx"
|
|
31
|
+
#include "core/operations/management/bucket_get_all.hxx"
|
|
32
|
+
|
|
33
|
+
#include <couchbase/durability_level.hxx>
|
|
34
|
+
|
|
35
|
+
#include <couchbase/admin/bucket/v1/bucket.pb.h>
|
|
36
|
+
#include <couchbase/kv/v1/kv.pb.h>
|
|
37
|
+
|
|
38
|
+
#include <cstdint>
|
|
39
|
+
#include <limits>
|
|
40
|
+
#include <optional>
|
|
41
|
+
|
|
42
|
+
namespace couchbase::core::protostellar::bucket_admin
|
|
43
|
+
{
|
|
44
|
+
namespace v1 = ::couchbase::admin::bucket::v1;
|
|
45
|
+
namespace mgmt = ::couchbase::core::management::cluster;
|
|
46
|
+
|
|
47
|
+
[[nodiscard]] inline auto
|
|
48
|
+
to_proto_durability(couchbase::durability_level level)
|
|
49
|
+
-> std::optional<::couchbase::kv::v1::DurabilityLevel>
|
|
50
|
+
{
|
|
51
|
+
switch (level) {
|
|
52
|
+
case couchbase::durability_level::none:
|
|
53
|
+
return std::nullopt;
|
|
54
|
+
case couchbase::durability_level::majority:
|
|
55
|
+
return ::couchbase::kv::v1::DURABILITY_LEVEL_MAJORITY;
|
|
56
|
+
case couchbase::durability_level::majority_and_persist_to_active:
|
|
57
|
+
return ::couchbase::kv::v1::DURABILITY_LEVEL_MAJORITY_AND_PERSIST_TO_ACTIVE;
|
|
58
|
+
case couchbase::durability_level::persist_to_majority:
|
|
59
|
+
return ::couchbase::kv::v1::DURABILITY_LEVEL_PERSIST_TO_MAJORITY;
|
|
60
|
+
}
|
|
61
|
+
return std::nullopt;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Populate the bucket-settings fields that are mutable on both Create and Update requests.
|
|
65
|
+
template<typename Request>
|
|
66
|
+
void
|
|
67
|
+
apply_settings(const mgmt::bucket_settings& settings, Request& proto)
|
|
68
|
+
{
|
|
69
|
+
proto.set_bucket_name(settings.name);
|
|
70
|
+
// ram_quota_mb == 0 means "unset" in the core settings (create defaults it to 100, update omits
|
|
71
|
+
// it); only send an explicit value so an unset quota does not overwrite the server-side value.
|
|
72
|
+
if (settings.ram_quota_mb != 0) {
|
|
73
|
+
proto.set_ram_quota_mb(settings.ram_quota_mb);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Omitted when the caller expressed no opinion, so the server applies its own default. Sending an
|
|
77
|
+
// explicit zero instead would create a bucket with no replicas on their behalf.
|
|
78
|
+
if (settings.num_replicas.has_value()) {
|
|
79
|
+
proto.set_num_replicas(*settings.num_replicas);
|
|
80
|
+
}
|
|
81
|
+
if (settings.flush_enabled.has_value()) {
|
|
82
|
+
proto.set_flush_enabled(*settings.flush_enabled);
|
|
83
|
+
}
|
|
84
|
+
if (settings.max_expiry.has_value()) {
|
|
85
|
+
proto.set_max_expiry_secs(*settings.max_expiry);
|
|
86
|
+
}
|
|
87
|
+
if (settings.minimum_durability_level.has_value()) {
|
|
88
|
+
if (auto durability = to_proto_durability(*settings.minimum_durability_level);
|
|
89
|
+
durability.has_value()) {
|
|
90
|
+
proto.set_minimum_durability_level(*durability);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
switch (settings.eviction_policy) {
|
|
94
|
+
case mgmt::bucket_eviction_policy::full:
|
|
95
|
+
proto.set_eviction_mode(v1::EVICTION_MODE_FULL);
|
|
96
|
+
break;
|
|
97
|
+
case mgmt::bucket_eviction_policy::value_only:
|
|
98
|
+
proto.set_eviction_mode(v1::EVICTION_MODE_VALUE_ONLY);
|
|
99
|
+
break;
|
|
100
|
+
case mgmt::bucket_eviction_policy::no_eviction:
|
|
101
|
+
proto.set_eviction_mode(v1::EVICTION_MODE_NONE);
|
|
102
|
+
break;
|
|
103
|
+
case mgmt::bucket_eviction_policy::not_recently_used:
|
|
104
|
+
proto.set_eviction_mode(v1::EVICTION_MODE_NOT_RECENTLY_USED);
|
|
105
|
+
break;
|
|
106
|
+
case mgmt::bucket_eviction_policy::unknown:
|
|
107
|
+
break; // leave server default
|
|
108
|
+
}
|
|
109
|
+
switch (settings.compression_mode) {
|
|
110
|
+
case mgmt::bucket_compression::off:
|
|
111
|
+
proto.set_compression_mode(v1::COMPRESSION_MODE_OFF);
|
|
112
|
+
break;
|
|
113
|
+
case mgmt::bucket_compression::active:
|
|
114
|
+
proto.set_compression_mode(v1::COMPRESSION_MODE_ACTIVE);
|
|
115
|
+
break;
|
|
116
|
+
case mgmt::bucket_compression::passive:
|
|
117
|
+
proto.set_compression_mode(v1::COMPRESSION_MODE_PASSIVE);
|
|
118
|
+
break;
|
|
119
|
+
case mgmt::bucket_compression::unknown:
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
if (settings.history_retention_collection_default.has_value()) {
|
|
123
|
+
proto.set_history_retention_collection_default(*settings.history_retention_collection_default);
|
|
124
|
+
}
|
|
125
|
+
if (settings.history_retention_bytes.has_value()) {
|
|
126
|
+
proto.set_history_retention_bytes(*settings.history_retention_bytes);
|
|
127
|
+
}
|
|
128
|
+
if (settings.history_retention_duration.has_value()) {
|
|
129
|
+
proto.set_history_retention_duration_secs(*settings.history_retention_duration);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Bucket type, replica indexes, storage backend, and conflict resolution are immutable after
|
|
134
|
+
// creation, so they are only set on CreateBucketRequest. Returns false when the bucket type has no
|
|
135
|
+
// couchbase2 representation (memcached).
|
|
136
|
+
[[nodiscard]] inline auto
|
|
137
|
+
apply_create_only_settings(const mgmt::bucket_settings& settings, v1::CreateBucketRequest& proto)
|
|
138
|
+
-> bool
|
|
139
|
+
{
|
|
140
|
+
switch (settings.bucket_type) {
|
|
141
|
+
case mgmt::bucket_type::couchbase:
|
|
142
|
+
proto.set_bucket_type(v1::BUCKET_TYPE_COUCHBASE);
|
|
143
|
+
break;
|
|
144
|
+
case mgmt::bucket_type::unknown:
|
|
145
|
+
// Leave bucket_type unset so the gateway applies its server-side default rather than
|
|
146
|
+
// silently forcing a couchbase bucket.
|
|
147
|
+
break;
|
|
148
|
+
case mgmt::bucket_type::ephemeral:
|
|
149
|
+
proto.set_bucket_type(v1::BUCKET_TYPE_EPHEMERAL);
|
|
150
|
+
break;
|
|
151
|
+
case mgmt::bucket_type::memcached:
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
// A bucket must be created with a RAM quota. Core uses ram_quota_mb == 0 to mean "unset" (and
|
|
155
|
+
// apply_settings() omits it in that case), so mirror the classic create path and fall back to the
|
|
156
|
+
// historical 100 MiB default rather than sending a zero quota.
|
|
157
|
+
if (settings.ram_quota_mb == 0) {
|
|
158
|
+
proto.set_ram_quota_mb(100);
|
|
159
|
+
}
|
|
160
|
+
if (settings.replica_indexes.has_value()) {
|
|
161
|
+
proto.set_replica_indexes(*settings.replica_indexes);
|
|
162
|
+
}
|
|
163
|
+
switch (settings.storage_backend) {
|
|
164
|
+
case mgmt::bucket_storage_backend::couchstore:
|
|
165
|
+
proto.set_storage_backend(v1::STORAGE_BACKEND_COUCHSTORE);
|
|
166
|
+
break;
|
|
167
|
+
case mgmt::bucket_storage_backend::magma:
|
|
168
|
+
proto.set_storage_backend(v1::STORAGE_BACKEND_MAGMA);
|
|
169
|
+
break;
|
|
170
|
+
case mgmt::bucket_storage_backend::unknown:
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
switch (settings.conflict_resolution_type) {
|
|
174
|
+
case mgmt::bucket_conflict_resolution::timestamp:
|
|
175
|
+
proto.set_conflict_resolution_type(v1::CONFLICT_RESOLUTION_TYPE_TIMESTAMP);
|
|
176
|
+
break;
|
|
177
|
+
case mgmt::bucket_conflict_resolution::sequence_number:
|
|
178
|
+
proto.set_conflict_resolution_type(v1::CONFLICT_RESOLUTION_TYPE_SEQUENCE_NUMBER);
|
|
179
|
+
break;
|
|
180
|
+
case mgmt::bucket_conflict_resolution::custom:
|
|
181
|
+
proto.set_conflict_resolution_type(v1::CONFLICT_RESOLUTION_TYPE_CUSTOM);
|
|
182
|
+
break;
|
|
183
|
+
case mgmt::bucket_conflict_resolution::unknown:
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Decode one ListBucketsResponse bucket back into core settings.
|
|
190
|
+
[[nodiscard]] inline auto
|
|
191
|
+
decode_bucket(const v1::ListBucketsResponse_Bucket& proto) -> mgmt::bucket_settings
|
|
192
|
+
{
|
|
193
|
+
mgmt::bucket_settings settings;
|
|
194
|
+
settings.name = proto.bucket_name();
|
|
195
|
+
settings.ram_quota_mb = proto.ram_quota_mb();
|
|
196
|
+
switch (proto.bucket_type()) {
|
|
197
|
+
case v1::BUCKET_TYPE_EPHEMERAL:
|
|
198
|
+
settings.bucket_type = mgmt::bucket_type::ephemeral;
|
|
199
|
+
break;
|
|
200
|
+
default:
|
|
201
|
+
settings.bucket_type = mgmt::bucket_type::couchbase;
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
settings.num_replicas = proto.num_replicas();
|
|
205
|
+
settings.flush_enabled = proto.flush_enabled();
|
|
206
|
+
settings.replica_indexes = proto.replica_indexes();
|
|
207
|
+
settings.max_expiry = proto.max_expiry_secs();
|
|
208
|
+
switch (proto.eviction_mode()) {
|
|
209
|
+
case v1::EVICTION_MODE_FULL:
|
|
210
|
+
settings.eviction_policy = mgmt::bucket_eviction_policy::full;
|
|
211
|
+
break;
|
|
212
|
+
case v1::EVICTION_MODE_VALUE_ONLY:
|
|
213
|
+
settings.eviction_policy = mgmt::bucket_eviction_policy::value_only;
|
|
214
|
+
break;
|
|
215
|
+
case v1::EVICTION_MODE_NONE:
|
|
216
|
+
settings.eviction_policy = mgmt::bucket_eviction_policy::no_eviction;
|
|
217
|
+
break;
|
|
218
|
+
case v1::EVICTION_MODE_NOT_RECENTLY_USED:
|
|
219
|
+
settings.eviction_policy = mgmt::bucket_eviction_policy::not_recently_used;
|
|
220
|
+
break;
|
|
221
|
+
default:
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
switch (proto.compression_mode()) {
|
|
225
|
+
case v1::COMPRESSION_MODE_OFF:
|
|
226
|
+
settings.compression_mode = mgmt::bucket_compression::off;
|
|
227
|
+
break;
|
|
228
|
+
case v1::COMPRESSION_MODE_ACTIVE:
|
|
229
|
+
settings.compression_mode = mgmt::bucket_compression::active;
|
|
230
|
+
break;
|
|
231
|
+
case v1::COMPRESSION_MODE_PASSIVE:
|
|
232
|
+
settings.compression_mode = mgmt::bucket_compression::passive;
|
|
233
|
+
break;
|
|
234
|
+
default:
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
// storage_backend and minimum_durability_level are `optional` in the response, so the plain value
|
|
238
|
+
// getter cannot tell an explicit couchstore (enum 0) from a field the gateway did not send. Read
|
|
239
|
+
// through the presence bit: absent leaves the core `unknown` / empty optional, which is what the
|
|
240
|
+
// gateway means by omitting it.
|
|
241
|
+
if (proto.has_storage_backend()) {
|
|
242
|
+
switch (proto.storage_backend()) {
|
|
243
|
+
case v1::STORAGE_BACKEND_MAGMA:
|
|
244
|
+
settings.storage_backend = mgmt::bucket_storage_backend::magma;
|
|
245
|
+
break;
|
|
246
|
+
case v1::STORAGE_BACKEND_COUCHSTORE:
|
|
247
|
+
settings.storage_backend = mgmt::bucket_storage_backend::couchstore;
|
|
248
|
+
break;
|
|
249
|
+
default:
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (proto.has_minimum_durability_level()) {
|
|
254
|
+
switch (proto.minimum_durability_level()) {
|
|
255
|
+
case ::couchbase::kv::v1::DURABILITY_LEVEL_MAJORITY:
|
|
256
|
+
settings.minimum_durability_level = couchbase::durability_level::majority;
|
|
257
|
+
break;
|
|
258
|
+
case ::couchbase::kv::v1::DURABILITY_LEVEL_MAJORITY_AND_PERSIST_TO_ACTIVE:
|
|
259
|
+
settings.minimum_durability_level =
|
|
260
|
+
couchbase::durability_level::majority_and_persist_to_active;
|
|
261
|
+
break;
|
|
262
|
+
case ::couchbase::kv::v1::DURABILITY_LEVEL_PERSIST_TO_MAJORITY:
|
|
263
|
+
settings.minimum_durability_level = couchbase::durability_level::persist_to_majority;
|
|
264
|
+
break;
|
|
265
|
+
default:
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// conflict_resolution_type carries no presence bit on this message, unlike the two above, so an
|
|
270
|
+
// unset field is indistinguishable from an explicit timestamp (enum 0) and is read as one.
|
|
271
|
+
switch (proto.conflict_resolution_type()) {
|
|
272
|
+
case v1::CONFLICT_RESOLUTION_TYPE_TIMESTAMP:
|
|
273
|
+
settings.conflict_resolution_type = mgmt::bucket_conflict_resolution::timestamp;
|
|
274
|
+
break;
|
|
275
|
+
case v1::CONFLICT_RESOLUTION_TYPE_SEQUENCE_NUMBER:
|
|
276
|
+
settings.conflict_resolution_type = mgmt::bucket_conflict_resolution::sequence_number;
|
|
277
|
+
break;
|
|
278
|
+
case v1::CONFLICT_RESOLUTION_TYPE_CUSTOM:
|
|
279
|
+
settings.conflict_resolution_type = mgmt::bucket_conflict_resolution::custom;
|
|
280
|
+
break;
|
|
281
|
+
default:
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
if (proto.has_history_retention_collection_default()) {
|
|
285
|
+
settings.history_retention_collection_default = proto.history_retention_collection_default();
|
|
286
|
+
}
|
|
287
|
+
// The proto carries 64 bits and the core setting holds 32. Narrowing a larger value would report
|
|
288
|
+
// a retention size the bucket does not have, and the usual get-modify-update cycle would then
|
|
289
|
+
// send that smaller number back and shrink the setting. Leaving the optional empty is what the
|
|
290
|
+
// encode side omits, so the server keeps its own value.
|
|
291
|
+
if (proto.has_history_retention_bytes() &&
|
|
292
|
+
proto.history_retention_bytes() <= std::numeric_limits<std::uint32_t>::max()) {
|
|
293
|
+
settings.history_retention_bytes = static_cast<std::uint32_t>(proto.history_retention_bytes());
|
|
294
|
+
}
|
|
295
|
+
if (proto.has_history_retention_duration_secs()) {
|
|
296
|
+
settings.history_retention_duration = proto.history_retention_duration_secs();
|
|
297
|
+
}
|
|
298
|
+
return settings;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
} // namespace couchbase::core::protostellar::bucket_admin
|
|
@@ -0,0 +1,92 @@
|
|
|
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
|
+
// Decodes couchbase.admin.collection.v1 ListCollections into a core collections_manifest, and maps
|
|
21
|
+
// a collection's max_expiry onto the wire in the other direction. The rest of the scope/collection
|
|
22
|
+
// encodes are string setters and live inline in the component; max_expiry does not, because its
|
|
23
|
+
// two halves only agree if they are read together. Per-scope and per-collection uids are not
|
|
24
|
+
// carried by the proto, so only the top-level manifest uid is populated.
|
|
25
|
+
|
|
26
|
+
#include "core/topology/collections_manifest.hxx"
|
|
27
|
+
|
|
28
|
+
#include <couchbase/admin/collection/v1/collection.pb.h>
|
|
29
|
+
|
|
30
|
+
#include <cstdint>
|
|
31
|
+
#include <optional>
|
|
32
|
+
#include <utility>
|
|
33
|
+
|
|
34
|
+
namespace couchbase::core::protostellar::collection_admin
|
|
35
|
+
{
|
|
36
|
+
namespace v1 = ::couchbase::admin::collection::v1;
|
|
37
|
+
|
|
38
|
+
// Maps the core max_expiry sentinel onto max_expiry_secs. The proto field is unsigned, so the sign
|
|
39
|
+
// the core struct carries has to become the field's presence: a negative value ("no expiry") is an
|
|
40
|
+
// explicit 0, and 0 has no encoding at all -- nullopt here means leave the field unset. What an
|
|
41
|
+
// unset field then means belongs to the caller, and it differs between the two RPCs: on create it
|
|
42
|
+
// is "inherit the bucket default", which is what 0 asked for, and on update it is "leave the
|
|
43
|
+
// collection as it is", which is not.
|
|
44
|
+
//
|
|
45
|
+
// -1 is the only negative the core struct gives a meaning; the caller refuses anything below it
|
|
46
|
+
// with invalid_argument before reaching here, as the classic path does. Every negative maps to the
|
|
47
|
+
// same wire form, so an unvalidated -5 would silently become "no expiry".
|
|
48
|
+
[[nodiscard]] inline auto
|
|
49
|
+
encode_max_expiry(std::int32_t max_expiry) -> std::optional<std::uint32_t>
|
|
50
|
+
{
|
|
51
|
+
if (max_expiry < 0) {
|
|
52
|
+
return 0U;
|
|
53
|
+
}
|
|
54
|
+
if (max_expiry == 0) {
|
|
55
|
+
return {};
|
|
56
|
+
}
|
|
57
|
+
return static_cast<std::uint32_t>(max_expiry);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
[[nodiscard]] inline auto
|
|
61
|
+
decode_manifest(const v1::ListCollectionsResponse& proto) -> topology::collections_manifest
|
|
62
|
+
{
|
|
63
|
+
topology::collections_manifest manifest;
|
|
64
|
+
manifest.uid = proto.manifest_uid();
|
|
65
|
+
for (const auto& proto_scope : proto.scopes()) {
|
|
66
|
+
topology::collections_manifest::scope scope;
|
|
67
|
+
scope.name = proto_scope.name();
|
|
68
|
+
for (const auto& proto_collection : proto_scope.collections()) {
|
|
69
|
+
topology::collections_manifest::collection collection;
|
|
70
|
+
collection.name = proto_collection.name();
|
|
71
|
+
// max_expiry_secs is an unsigned optional, so the gateway spends the presence bit on the
|
|
72
|
+
// distinction the core struct makes with a sign: the field left unset is "inherit the bucket
|
|
73
|
+
// default" (0), an explicit 0 is "no expiry" (-1). The value getter alone collapses the two,
|
|
74
|
+
// because it returns 0 for an absent field as well.
|
|
75
|
+
if (!proto_collection.has_max_expiry_secs()) {
|
|
76
|
+
collection.max_expiry = 0;
|
|
77
|
+
} else if (proto_collection.max_expiry_secs() == 0) {
|
|
78
|
+
collection.max_expiry = -1;
|
|
79
|
+
} else {
|
|
80
|
+
collection.max_expiry = static_cast<std::int32_t>(proto_collection.max_expiry_secs());
|
|
81
|
+
}
|
|
82
|
+
if (proto_collection.has_history_retention_enabled()) {
|
|
83
|
+
collection.history = proto_collection.history_retention_enabled();
|
|
84
|
+
}
|
|
85
|
+
scope.collections.push_back(std::move(collection));
|
|
86
|
+
}
|
|
87
|
+
manifest.scopes.push_back(std::move(scope));
|
|
88
|
+
}
|
|
89
|
+
return manifest;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
} // namespace couchbase::core::protostellar::collection_admin
|