couchbase 3.4.3 → 3.4.4

Sign up to get free protection for your applications and to get access to all the features.
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
+ }