couchbase 3.4.3 → 3.4.5

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.
Files changed (179) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/ext/couchbase/CMakeLists.txt +22 -1
  4. data/ext/couchbase/core/bucket.cxx +183 -152
  5. data/ext/couchbase/core/bucket.hxx +17 -4
  6. data/ext/couchbase/core/cluster.hxx +41 -13
  7. data/ext/couchbase/core/cluster_options.hxx +3 -0
  8. data/ext/couchbase/core/crud_component.cxx +51 -22
  9. data/ext/couchbase/core/error_context/key_value.cxx +2 -1
  10. data/ext/couchbase/core/error_context/key_value.hxx +10 -12
  11. data/ext/couchbase/core/impl/build_deferred_query_indexes.cxx +115 -50
  12. data/ext/couchbase/core/impl/cluster.cxx +6 -0
  13. data/ext/couchbase/core/impl/create_bucket.cxx +158 -0
  14. data/ext/couchbase/core/impl/create_collection.cxx +83 -0
  15. data/ext/couchbase/core/impl/create_query_index.cxx +172 -59
  16. data/ext/couchbase/core/impl/create_scope.cxx +69 -0
  17. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +2 -1
  18. data/ext/couchbase/core/impl/drop_bucket.cxx +66 -0
  19. data/ext/couchbase/core/impl/drop_collection.cxx +76 -0
  20. data/ext/couchbase/core/impl/drop_query_index.cxx +138 -59
  21. data/ext/couchbase/core/impl/drop_scope.cxx +68 -0
  22. data/ext/couchbase/core/impl/flush_bucket.cxx +66 -0
  23. data/ext/couchbase/core/impl/get_all_buckets.cxx +178 -0
  24. data/ext/couchbase/core/impl/get_all_query_indexes.cxx +67 -37
  25. data/ext/couchbase/core/impl/get_all_scopes.cxx +94 -0
  26. data/ext/couchbase/core/impl/get_bucket.cxx +168 -0
  27. data/ext/couchbase/core/impl/internal_manager_error_context.cxx +113 -0
  28. data/ext/couchbase/core/impl/internal_manager_error_context.hxx +60 -0
  29. data/ext/couchbase/core/impl/key_value_error_category.cxx +2 -4
  30. data/ext/couchbase/core/impl/key_value_error_context.cxx +98 -0
  31. data/ext/couchbase/core/impl/lookup_in.cxx +1 -0
  32. data/ext/couchbase/core/impl/lookup_in_all_replicas.cxx +178 -0
  33. data/ext/couchbase/core/impl/lookup_in_all_replicas.hxx +80 -0
  34. data/ext/couchbase/core/impl/lookup_in_any_replica.cxx +169 -0
  35. data/ext/couchbase/core/impl/lookup_in_any_replica.hxx +75 -0
  36. data/ext/couchbase/core/impl/lookup_in_replica.cxx +104 -0
  37. data/ext/couchbase/core/impl/lookup_in_replica.hxx +67 -0
  38. data/ext/couchbase/core/impl/manager_error_context.cxx +100 -0
  39. data/ext/couchbase/core/impl/query.cxx +1 -0
  40. data/ext/couchbase/core/impl/query_error_context.cxx +75 -0
  41. data/ext/couchbase/core/impl/update_bucket.cxx +133 -0
  42. data/ext/couchbase/core/impl/update_collection.cxx +83 -0
  43. data/ext/couchbase/core/impl/watch_query_indexes.cxx +53 -29
  44. data/ext/couchbase/core/io/dns_client.cxx +111 -40
  45. data/ext/couchbase/core/io/dns_config.cxx +5 -4
  46. data/ext/couchbase/core/io/http_session.hxx +24 -1
  47. data/ext/couchbase/core/io/mcbp_command.hxx +9 -2
  48. data/ext/couchbase/core/io/mcbp_session.cxx +80 -43
  49. data/ext/couchbase/core/io/mcbp_session.hxx +4 -3
  50. data/ext/couchbase/core/logger/custom_rotating_file_sink.cxx +1 -1
  51. data/ext/couchbase/core/logger/logger.cxx +80 -20
  52. data/ext/couchbase/core/logger/logger.hxx +31 -0
  53. data/ext/couchbase/core/management/bucket_settings.hxx +8 -5
  54. data/ext/couchbase/core/management/bucket_settings_json.hxx +12 -2
  55. data/ext/couchbase/core/meta/features.hxx +42 -0
  56. data/ext/couchbase/core/operations/document_lookup_in.cxx +8 -1
  57. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +192 -0
  58. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +188 -0
  59. data/ext/couchbase/core/operations/document_query.cxx +11 -0
  60. data/ext/couchbase/core/operations/document_query.hxx +1 -0
  61. data/ext/couchbase/core/operations/management/CMakeLists.txt +1 -0
  62. data/ext/couchbase/core/operations/management/bucket_create.cxx +30 -9
  63. data/ext/couchbase/core/operations/management/bucket_update.cxx +27 -6
  64. data/ext/couchbase/core/operations/management/collection_create.cxx +5 -1
  65. data/ext/couchbase/core/operations/management/collection_create.hxx +1 -0
  66. data/ext/couchbase/core/operations/management/collection_update.cxx +87 -0
  67. data/ext/couchbase/core/operations/management/collection_update.hxx +54 -0
  68. data/ext/couchbase/core/operations/management/collections.hxx +1 -0
  69. data/ext/couchbase/core/operations.hxx +2 -0
  70. data/ext/couchbase/core/origin.cxx +270 -0
  71. data/ext/couchbase/core/origin.hxx +2 -0
  72. data/ext/couchbase/core/protocol/client_response.hxx +1 -0
  73. data/ext/couchbase/core/protocol/cmd_hello.hxx +1 -0
  74. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +107 -0
  75. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.hxx +137 -0
  76. data/ext/couchbase/core/protocol/hello_feature.hxx +6 -0
  77. data/ext/couchbase/core/protocol/hello_feature_fmt.hxx +3 -0
  78. data/ext/couchbase/core/protocol/status.cxx +2 -2
  79. data/ext/couchbase/core/range_scan_options.cxx +3 -27
  80. data/ext/couchbase/core/range_scan_options.hxx +13 -17
  81. data/ext/couchbase/core/range_scan_orchestrator.cxx +388 -170
  82. data/ext/couchbase/core/range_scan_orchestrator.hxx +13 -2
  83. data/ext/couchbase/core/range_scan_orchestrator_options.hxx +5 -3
  84. data/ext/couchbase/core/scan_options.hxx +0 -19
  85. data/ext/couchbase/core/scan_result.cxx +19 -5
  86. data/ext/couchbase/core/scan_result.hxx +5 -2
  87. data/ext/couchbase/core/timeout_defaults.hxx +3 -4
  88. data/ext/couchbase/core/topology/capabilities.hxx +4 -0
  89. data/ext/couchbase/core/topology/capabilities_fmt.hxx +11 -0
  90. data/ext/couchbase/core/topology/collections_manifest.hxx +2 -0
  91. data/ext/couchbase/core/topology/collections_manifest_fmt.hxx +1 -1
  92. data/ext/couchbase/core/topology/collections_manifest_json.hxx +3 -0
  93. data/ext/couchbase/core/topology/configuration.hxx +20 -0
  94. data/ext/couchbase/core/topology/configuration_json.hxx +8 -1
  95. data/ext/couchbase/core/utils/connection_string.cxx +62 -47
  96. data/ext/couchbase/core/utils/connection_string.hxx +1 -0
  97. data/ext/couchbase/couchbase/analytics_error_context.hxx +1 -1
  98. data/ext/couchbase/couchbase/behavior_options.hxx +19 -2
  99. data/ext/couchbase/couchbase/bucket.hxx +14 -0
  100. data/ext/couchbase/couchbase/bucket_manager.hxx +135 -0
  101. data/ext/couchbase/couchbase/build_query_index_options.hxx +0 -30
  102. data/ext/couchbase/couchbase/cluster.hxx +14 -0
  103. data/ext/couchbase/couchbase/collection.hxx +111 -0
  104. data/ext/couchbase/couchbase/collection_manager.hxx +160 -0
  105. data/ext/couchbase/couchbase/collection_query_index_manager.hxx +7 -48
  106. data/ext/couchbase/couchbase/create_bucket_options.hxx +41 -0
  107. data/ext/couchbase/couchbase/create_collection_options.hxx +44 -0
  108. data/ext/couchbase/couchbase/create_primary_query_index_options.hxx +0 -29
  109. data/ext/couchbase/couchbase/create_query_index_options.hxx +0 -33
  110. data/ext/couchbase/couchbase/create_scope_options.hxx +41 -0
  111. data/ext/couchbase/couchbase/drop_bucket_options.hxx +41 -0
  112. data/ext/couchbase/couchbase/drop_collection_options.hxx +41 -0
  113. data/ext/couchbase/couchbase/drop_primary_query_index_options.hxx +0 -30
  114. data/ext/couchbase/couchbase/drop_query_index_options.hxx +0 -31
  115. data/ext/couchbase/couchbase/drop_scope_options.hxx +41 -0
  116. data/ext/couchbase/couchbase/error_codes.hxx +1 -2
  117. data/ext/couchbase/couchbase/error_context.hxx +10 -2
  118. data/ext/couchbase/couchbase/flush_bucket_options.hxx +41 -0
  119. data/ext/couchbase/{core/topology/error_map_fmt.hxx → couchbase/fmt/key_value_error_map_attribute.hxx} +21 -21
  120. data/ext/couchbase/couchbase/get_all_buckets_options.hxx +44 -0
  121. data/ext/couchbase/couchbase/get_all_query_indexes_options.hxx +0 -30
  122. data/ext/couchbase/couchbase/get_all_scopes_options.hxx +44 -0
  123. data/ext/couchbase/couchbase/get_and_lock_options.hxx +2 -2
  124. data/ext/couchbase/couchbase/get_and_touch_options.hxx +2 -2
  125. data/ext/couchbase/couchbase/get_bucket_options.hxx +43 -0
  126. data/ext/couchbase/couchbase/get_options.hxx +2 -2
  127. data/ext/couchbase/couchbase/insert_options.hxx +3 -3
  128. data/ext/couchbase/couchbase/key_value_error_context.hxx +7 -2
  129. data/ext/couchbase/couchbase/lookup_in_all_replicas_options.hxx +109 -0
  130. data/ext/couchbase/couchbase/lookup_in_any_replica_options.hxx +101 -0
  131. data/ext/couchbase/couchbase/lookup_in_options.hxx +2 -2
  132. data/ext/couchbase/couchbase/lookup_in_replica_result.hxx +74 -0
  133. data/ext/couchbase/couchbase/lookup_in_result.hxx +26 -0
  134. data/ext/couchbase/couchbase/management/bucket_settings.hxx +119 -0
  135. data/ext/couchbase/couchbase/management/collection_spec.hxx +29 -0
  136. data/ext/couchbase/couchbase/management/scope_spec.hxx +29 -0
  137. data/ext/couchbase/couchbase/manager_error_context.hxx +29 -53
  138. data/ext/couchbase/couchbase/mutate_in_options.hxx +2 -2
  139. data/ext/couchbase/couchbase/query_error_context.hxx +3 -1
  140. data/ext/couchbase/couchbase/query_index_manager.hxx +16 -83
  141. data/ext/couchbase/couchbase/query_options.hxx +18 -0
  142. data/ext/couchbase/couchbase/remove_options.hxx +2 -2
  143. data/ext/couchbase/couchbase/replace_options.hxx +3 -3
  144. data/ext/couchbase/couchbase/security_options.hxx +15 -0
  145. data/ext/couchbase/couchbase/subdocument_error_context.hxx +4 -2
  146. data/ext/couchbase/couchbase/touch_options.hxx +2 -2
  147. data/ext/couchbase/couchbase/unlock_options.hxx +2 -2
  148. data/ext/couchbase/couchbase/update_bucket_options.hxx +41 -0
  149. data/ext/couchbase/couchbase/update_collection_options.hxx +44 -0
  150. data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
  151. data/ext/couchbase/couchbase/watch_query_indexes_options.hxx +0 -31
  152. data/ext/couchbase/test/CMakeLists.txt +1 -0
  153. data/ext/couchbase/test/test_integration_collections.cxx +6 -0
  154. data/ext/couchbase/test/test_integration_crud.cxx +5 -0
  155. data/ext/couchbase/test/test_integration_examples.cxx +137 -1
  156. data/ext/couchbase/test/test_integration_management.cxx +1009 -309
  157. data/ext/couchbase/test/test_integration_query.cxx +19 -7
  158. data/ext/couchbase/test/test_integration_range_scan.cxx +351 -112
  159. data/ext/couchbase/test/test_integration_search.cxx +10 -1
  160. data/ext/couchbase/test/test_integration_subdoc.cxx +721 -7
  161. data/ext/couchbase/test/test_transaction_public_async_api.cxx +13 -12
  162. data/ext/couchbase/test/test_transaction_public_blocking_api.cxx +27 -21
  163. data/ext/couchbase/test/test_unit_connection_string.cxx +29 -0
  164. data/ext/couchbase/test/test_unit_query.cxx +75 -0
  165. data/ext/couchbase.cxx +735 -60
  166. data/ext/revisions.rb +3 -3
  167. data/lib/couchbase/cluster.rb +1 -1
  168. data/lib/couchbase/collection.rb +108 -0
  169. data/lib/couchbase/collection_options.rb +100 -1
  170. data/lib/couchbase/errors.rb +5 -0
  171. data/lib/couchbase/key_value_scan.rb +125 -0
  172. data/lib/couchbase/management/bucket_manager.rb +22 -15
  173. data/lib/couchbase/management/collection_manager.rb +158 -9
  174. data/lib/couchbase/options.rb +151 -0
  175. data/lib/couchbase/scope.rb +1 -1
  176. data/lib/couchbase/utils/time.rb +14 -1
  177. data/lib/couchbase/version.rb +1 -1
  178. metadata +59 -8
  179. data/ext/couchbase/core/impl/collection_query_index_manager.cxx +0 -93
@@ -81,35 +81,4 @@ class watch_query_indexes_options : public common_options<watch_query_indexes_op
81
81
  */
82
82
 
83
83
  using watch_query_indexes_handler = std::function<void(couchbase::manager_error_context)>;
84
-
85
- #ifndef COUCHBASE_CXX_CLIENT_DOXYGEN
86
- namespace core
87
- {
88
- class cluster;
89
- class query_context;
90
- namespace impl
91
- {
92
-
93
- /**
94
- * @since 1.0.0
95
- * @internal
96
- */
97
- void
98
- initiate_watch_query_indexes(std::shared_ptr<couchbase::core::cluster> core,
99
- std::string bucket_name,
100
- std::vector<std::string> index_names,
101
- couchbase::watch_query_indexes_options::built options,
102
- query_context query_ctx,
103
- std::string collection_name,
104
- watch_query_indexes_handler&& handler);
105
- void
106
- initiate_watch_query_indexes(std::shared_ptr<couchbase::core::cluster> core,
107
- std::string bucket_name,
108
- std::vector<std::string> index_names,
109
- couchbase::watch_query_indexes_options::built options,
110
- watch_query_indexes_handler&& handler);
111
-
112
- #endif
113
- } // namespace impl
114
- } // namespace core
115
84
  } // namespace couchbase
@@ -26,6 +26,7 @@ unit_test(jsonsl)
26
26
  unit_test(config_profiles)
27
27
  unit_test(options)
28
28
  unit_test(search)
29
+ unit_test(query)
29
30
  target_link_libraries(test_unit_jsonsl jsonsl)
30
31
 
31
32
  integration_benchmark(get)
@@ -113,6 +113,12 @@ TEST_CASE("integration: get and insert non default scope and collection", "[inte
113
113
  REQUIRE_SUCCESS(resp.ctx.ec());
114
114
  REQUIRE(resp.value == couchbase::core::utils::to_binary(key));
115
115
  }
116
+
117
+ {
118
+ couchbase::core::operations::management::scope_drop_request req{ integration.ctx.bucket, scope_name };
119
+ auto resp = test::utils::execute(integration.cluster, req);
120
+ REQUIRE_SUCCESS(resp.ctx.ec);
121
+ }
116
122
  }
117
123
 
118
124
  TEST_CASE("integration: insert into dropped scope", "[integration]")
@@ -315,6 +315,11 @@ TEST_CASE("integration: lock/unlock without lock time", "[integration]")
315
315
  TEST_CASE("integration: touch with zero expiry resets expiry", "[integration]")
316
316
  {
317
317
  test::utils::integration_test_guard integration;
318
+
319
+ if (integration.ctx.deployment == test::utils::deployment_type::elixir) {
320
+ SKIP("Timeout is too strict for sanity test env");
321
+ }
322
+
318
323
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
319
324
 
320
325
  couchbase::core::document_id id{ integration.ctx.bucket, "_default", "_default", test::utils::uniq_id("get_reset_expiry_key") };
@@ -132,6 +132,9 @@ row: {"airline":{"callsign":"MILE-AIR","country":"United States","iata":"Q5","ic
132
132
  TEST_CASE("example: start using", "[integration]")
133
133
  {
134
134
  test::utils::integration_test_guard integration;
135
+ if (integration.cluster_version().is_capella()) {
136
+ SKIP("Capella does not allow to use REST API to load sample buckets");
137
+ }
135
138
  if (!integration.cluster_version().supports_collections()) {
136
139
  SKIP("cluster does not support collections");
137
140
  }
@@ -438,8 +441,12 @@ row: {"airline":{"callsign":"MILE-AIR","country":"United States","iata":"Q5","ic
438
441
  TEST_CASE("example: search", "[integration]")
439
442
  {
440
443
  test::utils::integration_test_guard integration;
444
+
445
+ if (integration.cluster_version().is_capella()) {
446
+ SKIP("Capella does not allow to use REST API to load sample buckets");
447
+ }
441
448
  if (!integration.cluster_version().supports_collections()) {
442
- return;
449
+ SKIP("cluster does not support collections");
443
450
  }
444
451
 
445
452
  const auto env = test::utils::test_context::load_from_environment();
@@ -452,3 +459,132 @@ TEST_CASE("example: search", "[integration]")
452
459
 
453
460
  REQUIRE(example_search::main(4, argv) == 0);
454
461
  }
462
+
463
+ namespace example_buckets
464
+ {
465
+ //! [example-buckets]
466
+ #include <couchbase/cluster.hxx>
467
+
468
+ int
469
+ main(int argc, const char* argv[])
470
+ {
471
+ if (argc != 4) {
472
+ fmt::print("USAGE: ./example_buckets couchbase://127.0.0.1 Administrator password\n");
473
+ return 1;
474
+ }
475
+
476
+ std::string connection_string{ argv[1] }; // "couchbase://127.0.0.1"
477
+ std::string username{ argv[2] }; // "Administrator"
478
+ std::string password{ argv[3] }; // "password"
479
+ std::string bucket_name{ "travel-sample" };
480
+
481
+ // run IO context on separate thread
482
+ asio::io_context io;
483
+ auto guard = asio::make_work_guard(io);
484
+ std::thread io_thread([&io]() { io.run(); });
485
+
486
+ auto options = couchbase::cluster_options(username, password);
487
+ // customize through the 'options'.
488
+ // For example, optimize timeouts for WAN
489
+ options.apply_profile("wan_development");
490
+
491
+ auto [cluster, ec] = couchbase::cluster::connect(io, connection_string, options).get();
492
+ if (ec) {
493
+ fmt::print("unable to connect to the cluster: {}\n", ec.message());
494
+ return 1;
495
+ }
496
+ auto manager = cluster.buckets();
497
+
498
+ couchbase::management::cluster::bucket_settings bucket_settings{};
499
+ std::string test_bucket_name = "cxx_test_integration_examples_bucket";
500
+ bucket_settings.name = test_bucket_name;
501
+ bucket_settings.ram_quota_mb = 150;
502
+ bucket_settings.bucket_type = couchbase::management::cluster::bucket_type::couchbase;
503
+ bucket_settings.eviction_policy = couchbase::management::cluster::bucket_eviction_policy::value_only;
504
+ bucket_settings.flush_enabled = true;
505
+ bucket_settings.replica_indexes = true;
506
+ bucket_settings.conflict_resolution_type = couchbase::management::cluster::bucket_conflict_resolution::sequence_number;
507
+ {
508
+ fmt::print("--- create bucket\n");
509
+ auto ctx = manager.create_bucket(bucket_settings).get();
510
+ if (ctx.ec()) {
511
+ if (ctx.ec() == couchbase::errc::common::invalid_argument) {
512
+ fmt::print("bucket already exists\n");
513
+ } else {
514
+ fmt::print("unable to create the bucket: {}\n", ctx.ec().message());
515
+ return 1;
516
+ }
517
+ } else {
518
+ fmt::print("--- bucket has been successfully created\n");
519
+ }
520
+ }
521
+ {
522
+ fmt::print("--- get bucket\n");
523
+ auto [ctx, bucket] = manager.get_bucket(bucket_name).get();
524
+ if (ctx.ec()) {
525
+ fmt::print("unable to get the bucket: {}\n", ctx.ec().message());
526
+ return 1;
527
+ }
528
+ fmt::print("name of fetched bucket: {}\n", bucket.name);
529
+ }
530
+ {
531
+ fmt::print("--- get all buckets\n");
532
+ auto [ctx, buckets] = manager.get_all_buckets().get();
533
+ if (ctx.ec()) {
534
+ fmt::print("unable to get all buckets: {}\n", ctx.ec().message());
535
+ return 1;
536
+ }
537
+ for (const auto& fetched_bucket : buckets) {
538
+ fmt::print("Bucket name: {}\n", fetched_bucket.name);
539
+ }
540
+ }
541
+ {
542
+ fmt::print("--- update bucket\n");
543
+ bucket_settings.ram_quota_mb = 150;
544
+ auto ctx = manager.update_bucket(bucket_settings).get();
545
+ if (ctx.ec()) {
546
+ fmt::print("unable to update the bucket: {}\n", ctx.ec().message());
547
+ return 1;
548
+ }
549
+ fmt::print("bucket has been updated\n");
550
+ }
551
+ {
552
+ fmt::print("--- drop bucket\n");
553
+ auto ctx = manager.drop_bucket(test_bucket_name).get();
554
+ if (ctx.ec()) {
555
+ fmt::print("unable to drop the bucket: {}\n", ctx.ec().message());
556
+ return 1;
557
+ }
558
+ fmt::print("bucket has been dropped\n");
559
+ }
560
+
561
+ // close cluster connection
562
+ cluster.close();
563
+ guard.reset();
564
+
565
+ io_thread.join();
566
+ return 0;
567
+ }
568
+
569
+ //! [example-buckets]
570
+ } // namespace example_buckets
571
+
572
+ TEST_CASE("example: bucket management", "[integration]")
573
+ {
574
+ test::utils::integration_test_guard integration;
575
+
576
+ if (integration.cluster_version().is_capella()) {
577
+ SKIP("Capella does not allow to use REST API to load sample buckets");
578
+ }
579
+
580
+ const auto env = test::utils::test_context::load_from_environment();
581
+
582
+ const char* argv[] = {
583
+ "example_buckets", // name of the "executable"
584
+ env.connection_string.c_str(),
585
+ env.username.c_str(),
586
+ env.password.c_str(),
587
+ };
588
+
589
+ REQUIRE(example_buckets::main(4, argv) == 0);
590
+ }