couchbase 3.4.3 → 3.4.4

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 (148) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/ext/couchbase/CMakeLists.txt +15 -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 +34 -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 +155 -0
  14. data/ext/couchbase/core/impl/create_query_index.cxx +172 -59
  15. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +2 -1
  16. data/ext/couchbase/core/impl/drop_bucket.cxx +66 -0
  17. data/ext/couchbase/core/impl/drop_query_index.cxx +138 -59
  18. data/ext/couchbase/core/impl/flush_bucket.cxx +66 -0
  19. data/ext/couchbase/core/impl/get_all_buckets.cxx +163 -0
  20. data/ext/couchbase/core/impl/get_all_query_indexes.cxx +67 -37
  21. data/ext/couchbase/core/impl/get_bucket.cxx +153 -0
  22. data/ext/couchbase/core/impl/internal_manager_error_context.cxx +113 -0
  23. data/ext/couchbase/core/impl/internal_manager_error_context.hxx +60 -0
  24. data/ext/couchbase/core/impl/key_value_error_category.cxx +2 -4
  25. data/ext/couchbase/core/impl/key_value_error_context.cxx +98 -0
  26. data/ext/couchbase/core/impl/lookup_in.cxx +1 -0
  27. data/ext/couchbase/core/impl/lookup_in_all_replicas.cxx +176 -0
  28. data/ext/couchbase/core/impl/lookup_in_all_replicas.hxx +80 -0
  29. data/ext/couchbase/core/impl/lookup_in_any_replica.cxx +167 -0
  30. data/ext/couchbase/core/impl/lookup_in_any_replica.hxx +75 -0
  31. data/ext/couchbase/core/impl/lookup_in_replica.cxx +97 -0
  32. data/ext/couchbase/core/impl/lookup_in_replica.hxx +67 -0
  33. data/ext/couchbase/core/impl/manager_error_context.cxx +100 -0
  34. data/ext/couchbase/core/impl/query.cxx +1 -0
  35. data/ext/couchbase/core/impl/query_error_context.cxx +75 -0
  36. data/ext/couchbase/core/impl/update_bucket.cxx +130 -0
  37. data/ext/couchbase/core/impl/watch_query_indexes.cxx +53 -29
  38. data/ext/couchbase/core/io/dns_client.cxx +111 -40
  39. data/ext/couchbase/core/io/dns_config.cxx +5 -4
  40. data/ext/couchbase/core/io/http_session.hxx +24 -1
  41. data/ext/couchbase/core/io/mcbp_command.hxx +9 -2
  42. data/ext/couchbase/core/io/mcbp_session.cxx +80 -43
  43. data/ext/couchbase/core/io/mcbp_session.hxx +4 -3
  44. data/ext/couchbase/core/logger/custom_rotating_file_sink.cxx +1 -1
  45. data/ext/couchbase/core/logger/logger.cxx +80 -20
  46. data/ext/couchbase/core/logger/logger.hxx +31 -0
  47. data/ext/couchbase/core/meta/features.hxx +25 -0
  48. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +192 -0
  49. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +188 -0
  50. data/ext/couchbase/core/operations/document_query.cxx +11 -0
  51. data/ext/couchbase/core/operations/document_query.hxx +1 -0
  52. data/ext/couchbase/core/operations.hxx +2 -0
  53. data/ext/couchbase/core/origin.cxx +270 -0
  54. data/ext/couchbase/core/origin.hxx +2 -0
  55. data/ext/couchbase/core/protocol/client_response.hxx +1 -0
  56. data/ext/couchbase/core/protocol/cmd_hello.hxx +1 -0
  57. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +107 -0
  58. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.hxx +137 -0
  59. data/ext/couchbase/core/protocol/hello_feature.hxx +6 -0
  60. data/ext/couchbase/core/protocol/hello_feature_fmt.hxx +3 -0
  61. data/ext/couchbase/core/protocol/status.cxx +2 -2
  62. data/ext/couchbase/core/range_scan_options.cxx +3 -27
  63. data/ext/couchbase/core/range_scan_options.hxx +13 -17
  64. data/ext/couchbase/core/range_scan_orchestrator.cxx +388 -170
  65. data/ext/couchbase/core/range_scan_orchestrator.hxx +13 -2
  66. data/ext/couchbase/core/range_scan_orchestrator_options.hxx +5 -3
  67. data/ext/couchbase/core/scan_options.hxx +0 -19
  68. data/ext/couchbase/core/scan_result.cxx +19 -5
  69. data/ext/couchbase/core/scan_result.hxx +5 -2
  70. data/ext/couchbase/core/timeout_defaults.hxx +2 -3
  71. data/ext/couchbase/core/topology/capabilities.hxx +3 -0
  72. data/ext/couchbase/core/topology/capabilities_fmt.hxx +8 -0
  73. data/ext/couchbase/core/topology/collections_manifest_fmt.hxx +1 -1
  74. data/ext/couchbase/core/topology/configuration.hxx +15 -0
  75. data/ext/couchbase/core/topology/configuration_json.hxx +6 -1
  76. data/ext/couchbase/core/utils/connection_string.cxx +62 -47
  77. data/ext/couchbase/core/utils/connection_string.hxx +1 -0
  78. data/ext/couchbase/couchbase/analytics_error_context.hxx +1 -1
  79. data/ext/couchbase/couchbase/behavior_options.hxx +19 -2
  80. data/ext/couchbase/couchbase/bucket_manager.hxx +135 -0
  81. data/ext/couchbase/couchbase/build_query_index_options.hxx +0 -30
  82. data/ext/couchbase/couchbase/cluster.hxx +14 -0
  83. data/ext/couchbase/couchbase/collection.hxx +111 -0
  84. data/ext/couchbase/couchbase/collection_query_index_manager.hxx +7 -48
  85. data/ext/couchbase/couchbase/create_bucket_options.hxx +41 -0
  86. data/ext/couchbase/couchbase/create_primary_query_index_options.hxx +0 -29
  87. data/ext/couchbase/couchbase/create_query_index_options.hxx +0 -33
  88. data/ext/couchbase/couchbase/drop_bucket_options.hxx +41 -0
  89. data/ext/couchbase/couchbase/drop_primary_query_index_options.hxx +0 -30
  90. data/ext/couchbase/couchbase/drop_query_index_options.hxx +0 -31
  91. data/ext/couchbase/couchbase/error_codes.hxx +1 -2
  92. data/ext/couchbase/couchbase/error_context.hxx +10 -2
  93. data/ext/couchbase/couchbase/flush_bucket_options.hxx +41 -0
  94. data/ext/couchbase/{core/topology/error_map_fmt.hxx → couchbase/fmt/key_value_error_map_attribute.hxx} +21 -21
  95. data/ext/couchbase/couchbase/get_all_buckets_options.hxx +44 -0
  96. data/ext/couchbase/couchbase/get_all_query_indexes_options.hxx +0 -30
  97. data/ext/couchbase/couchbase/get_and_lock_options.hxx +2 -2
  98. data/ext/couchbase/couchbase/get_and_touch_options.hxx +2 -2
  99. data/ext/couchbase/couchbase/get_bucket_options.hxx +43 -0
  100. data/ext/couchbase/couchbase/get_options.hxx +2 -2
  101. data/ext/couchbase/couchbase/insert_options.hxx +3 -3
  102. data/ext/couchbase/couchbase/key_value_error_context.hxx +7 -2
  103. data/ext/couchbase/couchbase/lookup_in_all_replicas_options.hxx +109 -0
  104. data/ext/couchbase/couchbase/lookup_in_any_replica_options.hxx +101 -0
  105. data/ext/couchbase/couchbase/lookup_in_options.hxx +2 -2
  106. data/ext/couchbase/couchbase/lookup_in_replica_result.hxx +74 -0
  107. data/ext/couchbase/couchbase/lookup_in_result.hxx +26 -0
  108. data/ext/couchbase/couchbase/management/bucket_settings.hxx +116 -0
  109. data/ext/couchbase/couchbase/manager_error_context.hxx +29 -53
  110. data/ext/couchbase/couchbase/mutate_in_options.hxx +2 -2
  111. data/ext/couchbase/couchbase/query_error_context.hxx +3 -1
  112. data/ext/couchbase/couchbase/query_index_manager.hxx +16 -83
  113. data/ext/couchbase/couchbase/query_options.hxx +18 -0
  114. data/ext/couchbase/couchbase/remove_options.hxx +2 -2
  115. data/ext/couchbase/couchbase/replace_options.hxx +3 -3
  116. data/ext/couchbase/couchbase/security_options.hxx +15 -0
  117. data/ext/couchbase/couchbase/subdocument_error_context.hxx +4 -2
  118. data/ext/couchbase/couchbase/touch_options.hxx +2 -2
  119. data/ext/couchbase/couchbase/unlock_options.hxx +2 -2
  120. data/ext/couchbase/couchbase/update_bucket_options.hxx +41 -0
  121. data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
  122. data/ext/couchbase/couchbase/watch_query_indexes_options.hxx +0 -31
  123. data/ext/couchbase/test/CMakeLists.txt +1 -0
  124. data/ext/couchbase/test/test_integration_collections.cxx +6 -0
  125. data/ext/couchbase/test/test_integration_crud.cxx +5 -0
  126. data/ext/couchbase/test/test_integration_examples.cxx +137 -1
  127. data/ext/couchbase/test/test_integration_management.cxx +709 -266
  128. data/ext/couchbase/test/test_integration_query.cxx +19 -7
  129. data/ext/couchbase/test/test_integration_range_scan.cxx +351 -112
  130. data/ext/couchbase/test/test_integration_search.cxx +10 -1
  131. data/ext/couchbase/test/test_integration_subdoc.cxx +655 -0
  132. data/ext/couchbase/test/test_transaction_public_async_api.cxx +13 -12
  133. data/ext/couchbase/test/test_transaction_public_blocking_api.cxx +27 -21
  134. data/ext/couchbase/test/test_unit_connection_string.cxx +29 -0
  135. data/ext/couchbase/test/test_unit_query.cxx +75 -0
  136. data/ext/couchbase.cxx +583 -29
  137. data/ext/revisions.rb +3 -3
  138. data/lib/couchbase/cluster.rb +1 -1
  139. data/lib/couchbase/collection.rb +108 -0
  140. data/lib/couchbase/collection_options.rb +100 -0
  141. data/lib/couchbase/errors.rb +5 -0
  142. data/lib/couchbase/key_value_scan.rb +125 -0
  143. data/lib/couchbase/options.rb +151 -0
  144. data/lib/couchbase/scope.rb +1 -1
  145. data/lib/couchbase/utils/time.rb +14 -1
  146. data/lib/couchbase/version.rb +1 -1
  147. metadata +41 -7
  148. data/ext/couchbase/core/impl/collection_query_index_manager.cxx +0 -93
@@ -32,7 +32,7 @@ async_options()
32
32
  return cfg;
33
33
  }
34
34
 
35
- TEST_CASE("can async get", "[transactions]")
35
+ TEST_CASE("transactions public async API: can async get", "[transactions]")
36
36
  {
37
37
  test::utils::integration_test_guard integration;
38
38
 
@@ -62,7 +62,7 @@ TEST_CASE("can async get", "[transactions]")
62
62
  f.get();
63
63
  }
64
64
 
65
- TEST_CASE("can get fail as expected", "[transactions]")
65
+ TEST_CASE("transactions public async API: can get fail as expected", "[transactions]")
66
66
  {
67
67
  test::utils::integration_test_guard integration;
68
68
 
@@ -85,7 +85,7 @@ TEST_CASE("can get fail as expected", "[transactions]")
85
85
  async_options());
86
86
  f.get();
87
87
  }
88
- TEST_CASE("can async remove", "[transactions]")
88
+ TEST_CASE("transactions public async API: can async remove", "[transactions]")
89
89
  {
90
90
  test::utils::integration_test_guard integration;
91
91
 
@@ -114,7 +114,7 @@ TEST_CASE("can async remove", "[transactions]")
114
114
  f.get();
115
115
  }
116
116
 
117
- TEST_CASE("async remove with bad cas fails as expected", "[transactions]")
117
+ TEST_CASE("transactions public async API: async remove with bad cas fails as expected", "[transactions]")
118
118
  {
119
119
  test::utils::integration_test_guard integration;
120
120
 
@@ -144,7 +144,8 @@ TEST_CASE("async remove with bad cas fails as expected", "[transactions]")
144
144
  async_options());
145
145
  f.get();
146
146
  }
147
- TEST_CASE("can async insert", "[transactions]")
147
+
148
+ TEST_CASE("transactions public async API: can async insert", "[transactions]")
148
149
  {
149
150
  test::utils::integration_test_guard integration;
150
151
 
@@ -168,7 +169,7 @@ TEST_CASE("can async insert", "[transactions]")
168
169
  f.get();
169
170
  }
170
171
 
171
- TEST_CASE("async insert fails when doc already exists, but doesn't rollback", "[transactions]")
172
+ TEST_CASE("transactions public async API: async insert fails when doc already exists, but doesn't rollback", "[transactions]")
172
173
  {
173
174
  test::utils::integration_test_guard integration;
174
175
 
@@ -196,7 +197,7 @@ TEST_CASE("async insert fails when doc already exists, but doesn't rollback", "[
196
197
  f.get();
197
198
  }
198
199
 
199
- TEST_CASE("can async replace", "[transactions]")
200
+ TEST_CASE("transactions public async API: can async replace", "[transactions]")
200
201
  {
201
202
  test::utils::integration_test_guard integration;
202
203
 
@@ -227,7 +228,7 @@ TEST_CASE("can async replace", "[transactions]")
227
228
  async_options());
228
229
  f.get();
229
230
  }
230
- TEST_CASE("async replace fails as expected with bad cas", "[transactions]")
231
+ TEST_CASE("transactions public async API: async replace fails as expected with bad cas", "[transactions]")
231
232
  {
232
233
  test::utils::integration_test_guard integration;
233
234
 
@@ -259,7 +260,7 @@ TEST_CASE("async replace fails as expected with bad cas", "[transactions]")
259
260
  f.get();
260
261
  }
261
262
 
262
- TEST_CASE("uncaught exception will rollback", "[transactions]")
263
+ TEST_CASE("transactions public async API: uncaught exception will rollback", "[transactions]")
263
264
  {
264
265
  test::utils::integration_test_guard integration;
265
266
 
@@ -293,7 +294,7 @@ TEST_CASE("uncaught exception will rollback", "[transactions]")
293
294
  f.get();
294
295
  }
295
296
 
296
- TEST_CASE("can set transaction options", "[transactions]")
297
+ TEST_CASE("transactions public async API: can set transaction options", "[transactions]")
297
298
  {
298
299
  test::utils::integration_test_guard integration;
299
300
 
@@ -334,7 +335,7 @@ TEST_CASE("can set transaction options", "[transactions]")
334
335
  f.get();
335
336
  }
336
337
 
337
- TEST_CASE("can do mutating query", "[transactions]")
338
+ TEST_CASE("transactions public async API: can do mutating query", "[transactions]")
338
339
  {
339
340
 
340
341
  test::utils::integration_test_guard integration;
@@ -360,7 +361,7 @@ TEST_CASE("can do mutating query", "[transactions]")
360
361
  f.get();
361
362
  }
362
363
 
363
- TEST_CASE("some query errors rollback", "[transactions]")
364
+ TEST_CASE("transactions public async API: some query errors rollback", "[transactions]")
364
365
  {
365
366
  test::utils::integration_test_guard integration;
366
367
 
@@ -94,7 +94,7 @@ upsert_scope_and_collection(std::shared_ptr<couchbase::core::cluster> cluster,
94
94
  }
95
95
  }
96
96
 
97
- TEST_CASE("can get", "[transactions]")
97
+ TEST_CASE("transactions public blocking API: can get", "[transactions]")
98
98
  {
99
99
  test::utils::integration_test_guard integration;
100
100
 
@@ -118,7 +118,7 @@ TEST_CASE("can get", "[transactions]")
118
118
  CHECK_FALSE(tx_err.ec());
119
119
  }
120
120
 
121
- TEST_CASE("get returns error if doc doesn't exist", "[transactions]")
121
+ TEST_CASE("transactions public blocking API: get returns error if doc doesn't exist", "[transactions]")
122
122
  {
123
123
  test::utils::integration_test_guard integration;
124
124
 
@@ -137,7 +137,7 @@ TEST_CASE("get returns error if doc doesn't exist", "[transactions]")
137
137
  CHECK_FALSE(tx_err.ec());
138
138
  }
139
139
 
140
- TEST_CASE("can insert", "[transactions]")
140
+ TEST_CASE("transactions public blocking API: can insert", "[transactions]")
141
141
  {
142
142
  test::utils::integration_test_guard integration;
143
143
 
@@ -165,7 +165,7 @@ TEST_CASE("can insert", "[transactions]")
165
165
  REQUIRE(final_doc.content_as<tao::json::value>() == content);
166
166
  }
167
167
 
168
- TEST_CASE("insert has error as expected when doc already exists", "[transactions]")
168
+ TEST_CASE("transactions public blocking API: insert has error as expected when doc already exists", "[transactions]")
169
169
  {
170
170
 
171
171
  test::utils::integration_test_guard integration;
@@ -193,7 +193,7 @@ TEST_CASE("insert has error as expected when doc already exists", "[transactions
193
193
  REQUIRE(final_doc.content_as<tao::json::value>() == content);
194
194
  }
195
195
 
196
- TEST_CASE("can replace", "[transactions]")
196
+ TEST_CASE("transactions public blocking API: can replace", "[transactions]")
197
197
  {
198
198
  test::utils::integration_test_guard integration;
199
199
 
@@ -225,7 +225,7 @@ TEST_CASE("can replace", "[transactions]")
225
225
  couchbase::core::utils::json::generate_binary(new_content));
226
226
  }
227
227
 
228
- TEST_CASE("replace fails as expected with bad cas", "[transactions]")
228
+ TEST_CASE("transactions public blocking API: replace fails as expected with bad cas", "[transactions]")
229
229
  {
230
230
 
231
231
  test::utils::integration_test_guard integration;
@@ -255,7 +255,7 @@ TEST_CASE("replace fails as expected with bad cas", "[transactions]")
255
255
  REQUIRE(final_doc.content_as<tao::json::value>() == content);
256
256
  }
257
257
 
258
- TEST_CASE("can remove", "[transactions]")
258
+ TEST_CASE("transactions public blocking API: can remove", "[transactions]")
259
259
  {
260
260
  test::utils::integration_test_guard integration;
261
261
 
@@ -280,7 +280,7 @@ TEST_CASE("can remove", "[transactions]")
280
280
  REQUIRE(final_err.ec() == couchbase::errc::key_value::document_not_found);
281
281
  }
282
282
 
283
- TEST_CASE("remove fails as expected with bad cas", "[transactions]")
283
+ TEST_CASE("transactions public blocking API: remove fails as expected with bad cas", "[transactions]")
284
284
  {
285
285
 
286
286
  test::utils::integration_test_guard integration;
@@ -307,7 +307,7 @@ TEST_CASE("remove fails as expected with bad cas", "[transactions]")
307
307
  CHECK(tx_err.ec());
308
308
  }
309
309
 
310
- TEST_CASE("remove fails as expected with missing doc", "[transactions]")
310
+ TEST_CASE("transactions public blocking API: remove fails as expected with missing doc", "[transactions]")
311
311
  {
312
312
  test::utils::integration_test_guard integration;
313
313
 
@@ -331,7 +331,7 @@ TEST_CASE("remove fails as expected with missing doc", "[transactions]")
331
331
  CHECK(tx_err.cause() == couchbase::errc::transaction_op::unknown);
332
332
  }
333
333
 
334
- TEST_CASE("uncaught exception in lambda will rollback without retry", "[transactions]")
334
+ TEST_CASE("transactions public blocking API: uncaught exception in lambda will rollback without retry", "[transactions]")
335
335
  {
336
336
  test::utils::integration_test_guard integration;
337
337
 
@@ -352,7 +352,7 @@ TEST_CASE("uncaught exception in lambda will rollback without retry", "[transact
352
352
  CHECK(tx_err.cause() == couchbase::errc::transaction_op::unknown);
353
353
  }
354
354
 
355
- TEST_CASE("can pass per-transaction configs", "[transactions]")
355
+ TEST_CASE("transactions public blocking API: can pass per-transaction configs", "[transactions]")
356
356
  {
357
357
  test::utils::integration_test_guard integration;
358
358
 
@@ -386,7 +386,7 @@ TEST_CASE("can pass per-transaction configs", "[transactions]")
386
386
  CHECK(tx_err.ec());
387
387
  }
388
388
 
389
- TEST_CASE("can do simple query", "[transactions]")
389
+ TEST_CASE("transactions public blocking API: can do simple query", "[transactions]")
390
390
  {
391
391
  test::utils::integration_test_guard integration;
392
392
 
@@ -407,7 +407,7 @@ TEST_CASE("can do simple query", "[transactions]")
407
407
  CHECK_FALSE(result.transaction_id.empty());
408
408
  }
409
409
 
410
- TEST_CASE("can do simple mutating query", "[transactions]")
410
+ TEST_CASE("transactions public blocking API: can do simple mutating query", "[transactions]")
411
411
  {
412
412
  test::utils::integration_test_guard integration;
413
413
 
@@ -430,7 +430,7 @@ TEST_CASE("can do simple mutating query", "[transactions]")
430
430
  CHECK(final_doc.content_as<tao::json::value>().at("some_number") == 10);
431
431
  }
432
432
 
433
- TEST_CASE("some query errors don't force rollback", "[transactions]")
433
+ TEST_CASE("transactions public blocking API: some query errors don't force rollback", "[transactions]")
434
434
  {
435
435
  test::utils::integration_test_guard integration;
436
436
 
@@ -455,7 +455,7 @@ TEST_CASE("some query errors don't force rollback", "[transactions]")
455
455
  CHECK(final_doc.content_as<tao::json::value>() == content);
456
456
  }
457
457
 
458
- TEST_CASE("some query errors do rollback", "[transactions]")
458
+ TEST_CASE("transactions public blocking API: some query errors do rollback", "[transactions]")
459
459
  {
460
460
  test::utils::integration_test_guard integration;
461
461
 
@@ -484,7 +484,7 @@ TEST_CASE("some query errors do rollback", "[transactions]")
484
484
  CHECK(doc2.cas().empty());
485
485
  }
486
486
 
487
- TEST_CASE("some query errors are seen immediately", "[transactions]")
487
+ TEST_CASE("transactions public blocking API: some query errors are seen immediately", "[transactions]")
488
488
  {
489
489
  test::utils::integration_test_guard integration;
490
490
 
@@ -503,7 +503,7 @@ TEST_CASE("some query errors are seen immediately", "[transactions]")
503
503
  CHECK(result.unstaging_complete);
504
504
  }
505
505
 
506
- TEST_CASE("can query from a scope", "[transactions]")
506
+ TEST_CASE("transactions public blocking API: can query from a scope", "[transactions]")
507
507
  {
508
508
  const std::string new_scope_name("newscope");
509
509
  const std::string new_coll_name("newcoll");
@@ -529,9 +529,15 @@ TEST_CASE("can query from a scope", "[transactions]")
529
529
  txn_opts());
530
530
  CHECK_FALSE(tx_err.ec());
531
531
  CHECK_FALSE(result.transaction_id.empty());
532
+
533
+ {
534
+ couchbase::core::operations::management::scope_drop_request req{ integration.ctx.bucket, new_scope_name };
535
+ auto resp = test::utils::execute(integration.cluster, req);
536
+ REQUIRE_SUCCESS(resp.ctx.ec);
537
+ }
532
538
  }
533
539
 
534
- TEST_CASE("can get doc from bucket not yet opened", "[transactions]")
540
+ TEST_CASE("transactions public blocking API: can get doc from bucket not yet opened", "[transactions]")
535
541
  {
536
542
 
537
543
  auto id = test::utils::uniq_id("txn");
@@ -559,7 +565,7 @@ TEST_CASE("can get doc from bucket not yet opened", "[transactions]")
559
565
  });
560
566
  }
561
567
 
562
- TEST_CASE("can insert doc into bucket not yet opened", "[transactions]")
568
+ TEST_CASE("transactions public blocking API: can insert doc into bucket not yet opened", "[transactions]")
563
569
  {
564
570
  test::utils::integration_test_guard integration;
565
571
 
@@ -585,7 +591,7 @@ TEST_CASE("can insert doc into bucket not yet opened", "[transactions]")
585
591
  });
586
592
  }
587
593
 
588
- TEST_CASE("can replace doc in bucket not yet opened", "[transactions]")
594
+ TEST_CASE("transactions public blocking API: can replace doc in bucket not yet opened", "[transactions]")
589
595
  {
590
596
 
591
597
  auto id = test::utils::uniq_id("txn");
@@ -620,7 +626,7 @@ TEST_CASE("can replace doc in bucket not yet opened", "[transactions]")
620
626
  });
621
627
  }
622
628
 
623
- TEST_CASE("can remove doc in bucket not yet opened", "[transactions]")
629
+ TEST_CASE("transactions public blocking API: can remove doc in bucket not yet opened", "[transactions]")
624
630
  {
625
631
 
626
632
  auto id = test::utils::uniq_id("txn");
@@ -416,4 +416,33 @@ TEST_CASE("unit: connection string", "[unit]")
416
416
  CHECK(couchbase::core::utils::parse_connection_string("couchbase://2001:db8:85a3:8d3:1319:8a2e:370:7348").error.value() ==
417
417
  R"(failed to parse connection string (column: 18, trailer: "db8:85a3:8d3:1319:8a2e:370:7348"))");
418
418
  }
419
+
420
+ SECTION("parsing warnings")
421
+ {
422
+ auto spec = couchbase::core::utils::parse_connection_string("couchbase://127.0.0.1?kv_timeout=42&foo=bar");
423
+ CHECK(spec.warnings == std::vector<std::string>{
424
+ R"(unknown parameter "foo" in connection string (value "bar"))",
425
+ });
426
+
427
+ spec = couchbase::core::utils::parse_connection_string("couchbase://127.0.0.1?enable_dns_srv=maybe&ip_protocol=yes");
428
+ CHECK(spec.warnings ==
429
+ std::vector<std::string>{
430
+ R"(unable to parse "enable_dns_srv" parameter in connection string (value "maybe" cannot be interpreted as a boolean))",
431
+ R"(unable to parse "ip_protocol" parameter in connection string (value "yes" is not a valid IP protocol preference))",
432
+ });
433
+
434
+ spec = couchbase::core::utils::parse_connection_string("couchbase://localhost:8091=http;127.0.0.1=mcd/default?enable_dns_srv=true");
435
+ CHECK(
436
+ spec.warnings ==
437
+ std::vector<std::string>{
438
+ R"(parameter "enable_dns_srv" requires single entry in bootstrap nodes list of the connection string, ignoring (value "true"))",
439
+ });
440
+
441
+ spec = couchbase::core::utils::parse_connection_string(
442
+ "couchbase://localhost?query_timeout=10000&kv_timeout=true&management_timeout=11000");
443
+ std::string warning_prefix = R"(unable to parse "kv_timeout" parameter in connection string (value "true" is not a number))";
444
+ CHECK(spec.warnings.at(0).substr(0, warning_prefix.size()) == warning_prefix);
445
+ CHECK(spec.options.query_timeout == std::chrono::milliseconds(10000));
446
+ CHECK(spec.options.management_timeout == std::chrono::milliseconds(11000));
447
+ }
419
448
  }
@@ -0,0 +1,75 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2023 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
+ #include "test_helper_integration.hxx"
19
+
20
+ #include "utils/move_only_context.hxx"
21
+
22
+ #include "core/operations/document_query.hxx"
23
+
24
+ couchbase::core::http_context
25
+ make_http_context(couchbase::core::topology::configuration& config)
26
+ {
27
+ static couchbase::core::query_cache query_cache{};
28
+ static couchbase::core::cluster_options cluster_options{};
29
+ std::string hostname{};
30
+ std::uint16_t port{};
31
+ couchbase::core::http_context ctx{ config, cluster_options, query_cache, hostname, port };
32
+ return ctx;
33
+ }
34
+
35
+ TEST_CASE("unit: query with read from replica", "[unit]")
36
+ {
37
+ couchbase::core::topology::configuration config{};
38
+ config.cluster_capabilities.insert(couchbase::core::cluster_capability::n1ql_read_from_replica);
39
+ auto ctx = make_http_context(config);
40
+
41
+ SECTION("use_replica true")
42
+ {
43
+ couchbase::core::io::http_request http_req;
44
+ couchbase::core::operations::query_request req{};
45
+ req.use_replica = true;
46
+ auto ec = req.encode_to(http_req, ctx);
47
+ REQUIRE_SUCCESS(ec);
48
+ auto body = couchbase::core::utils::json::parse(http_req.body);
49
+ REQUIRE(body.is_object());
50
+ REQUIRE(body.get_object().at("use_replica").get_string() == "on");
51
+ }
52
+
53
+ SECTION("use_replica false")
54
+ {
55
+ couchbase::core::io::http_request http_req;
56
+ couchbase::core::operations::query_request req{};
57
+ req.use_replica = false;
58
+ auto ec = req.encode_to(http_req, ctx);
59
+ REQUIRE_SUCCESS(ec);
60
+ auto body = couchbase::core::utils::json::parse(http_req.body);
61
+ REQUIRE(body.is_object());
62
+ REQUIRE(body.get_object().at("use_replica").get_string() == "off");
63
+ }
64
+
65
+ SECTION("use_replica not set")
66
+ {
67
+ couchbase::core::io::http_request http_req;
68
+ couchbase::core::operations::query_request req{};
69
+ auto ec = req.encode_to(http_req, ctx);
70
+ REQUIRE_SUCCESS(ec);
71
+ auto body = couchbase::core::utils::json::parse(http_req.body);
72
+ REQUIRE(body.is_object());
73
+ REQUIRE_FALSE(body.get_object().count("use_replica"));
74
+ }
75
+ }