couchbase 4.2.8-dev.1 → 4.2.9

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 (317) hide show
  1. package/CMakeLists.txt +1 -1
  2. package/deps/couchbase-cxx-cache/mozilla-ca-bundle.crt +139 -56
  3. package/deps/couchbase-cxx-cache/mozilla-ca-bundle.sha256 +1 -1
  4. package/deps/couchbase-cxx-client/CMakeLists.txt +397 -424
  5. package/deps/couchbase-cxx-client/core/agent_config.hxx +1 -1
  6. package/deps/couchbase-cxx-client/core/agent_group.cxx +0 -1
  7. package/deps/couchbase-cxx-client/core/agent_group.hxx +9 -0
  8. package/deps/couchbase-cxx-client/core/agent_group_config.hxx +1 -1
  9. package/deps/couchbase-cxx-client/core/bucket.cxx +22 -8
  10. package/deps/couchbase-cxx-client/core/bucket.hxx +3 -1
  11. package/deps/couchbase-cxx-client/core/cluster.cxx +1453 -108
  12. package/deps/couchbase-cxx-client/core/cluster.hxx +183 -473
  13. package/deps/couchbase-cxx-client/core/cluster_agent_config.hxx +1 -1
  14. package/deps/couchbase-cxx-client/core/cluster_options.cxx +12 -2
  15. package/deps/couchbase-cxx-client/core/cluster_options.hxx +9 -8
  16. package/deps/couchbase-cxx-client/core/config_profiles.cxx +2 -2
  17. package/deps/couchbase-cxx-client/core/config_profiles.hxx +1 -1
  18. package/deps/couchbase-cxx-client/core/core_sdk_shim.cxx +1 -2
  19. package/deps/couchbase-cxx-client/core/core_sdk_shim.hxx +3 -2
  20. package/deps/couchbase-cxx-client/core/diagnostics.hxx +0 -1
  21. package/deps/couchbase-cxx-client/core/dispatcher.cxx +2 -2
  22. package/deps/couchbase-cxx-client/core/impl/analytics.cxx +38 -76
  23. package/deps/couchbase-cxx-client/core/impl/analytics.hxx +40 -0
  24. package/deps/couchbase-cxx-client/core/impl/analytics_index_manager.cxx +820 -0
  25. package/deps/couchbase-cxx-client/core/impl/binary_collection.cxx +403 -0
  26. package/deps/couchbase-cxx-client/core/impl/bucket.cxx +78 -0
  27. package/deps/couchbase-cxx-client/core/impl/bucket_manager.cxx +433 -0
  28. package/deps/couchbase-cxx-client/core/impl/cluster.cxx +226 -44
  29. package/deps/couchbase-cxx-client/core/impl/collection.cxx +1384 -0
  30. package/deps/couchbase-cxx-client/core/impl/collection_manager.cxx +306 -0
  31. package/deps/couchbase-cxx-client/core/impl/configuration_profiles_registry.cxx +3 -1
  32. package/deps/couchbase-cxx-client/core/impl/dns_srv_tracker.cxx +2 -0
  33. package/deps/couchbase-cxx-client/core/{operations/mcbp_noop.cxx → impl/doc_id_query.cxx} +19 -15
  34. package/deps/couchbase-cxx-client/core/impl/key_value_error_category.cxx +4 -2
  35. package/deps/couchbase-cxx-client/core/impl/lookup_in_all_replicas.hxx +0 -10
  36. package/deps/couchbase-cxx-client/core/impl/lookup_in_any_replica.hxx +0 -10
  37. package/deps/couchbase-cxx-client/core/impl/observe_poll.cxx +24 -17
  38. package/deps/couchbase-cxx-client/core/impl/observe_poll.hxx +1 -1
  39. package/deps/couchbase-cxx-client/core/impl/query.cxx +45 -68
  40. package/deps/couchbase-cxx-client/core/impl/query.hxx +34 -0
  41. package/deps/couchbase-cxx-client/core/impl/query_index_manager.cxx +628 -0
  42. package/deps/couchbase-cxx-client/core/impl/scope.cxx +172 -0
  43. package/deps/couchbase-cxx-client/core/impl/search.cxx +12 -61
  44. package/deps/couchbase-cxx-client/core/impl/search.hxx +37 -0
  45. package/deps/couchbase-cxx-client/core/impl/search_index_manager.cxx +469 -0
  46. package/deps/couchbase-cxx-client/core/impl/search_row_location.cxx +12 -0
  47. package/deps/couchbase-cxx-client/core/impl/search_sort_geo_distance.cxx +87 -0
  48. package/deps/couchbase-cxx-client/core/impl/with_legacy_durability.hxx +23 -25
  49. package/deps/couchbase-cxx-client/core/io/dns_config.cxx +28 -0
  50. package/deps/couchbase-cxx-client/core/io/dns_config.hxx +6 -25
  51. package/deps/couchbase-cxx-client/core/io/http_session_manager.hxx +9 -1
  52. package/deps/couchbase-cxx-client/core/io/mcbp_command.hxx +1 -1
  53. package/deps/couchbase-cxx-client/core/io/mcbp_message.hxx +3 -2
  54. package/deps/couchbase-cxx-client/core/io/mcbp_session.cxx +51 -21
  55. package/deps/couchbase-cxx-client/core/io/mcbp_session.hxx +2 -1
  56. package/deps/couchbase-cxx-client/core/logger/logger.hxx +4 -4
  57. package/deps/couchbase-cxx-client/core/management/bucket_settings.hxx +1 -1
  58. package/deps/couchbase-cxx-client/core/mcbp/packet.cxx +1 -1
  59. package/deps/couchbase-cxx-client/core/mcbp/queue_callback.hxx +1 -1
  60. package/deps/couchbase-cxx-client/core/meta/features.hxx +28 -0
  61. package/deps/couchbase-cxx-client/core/operations/document_query.cxx +17 -1
  62. package/deps/couchbase-cxx-client/core/operations/document_query.hxx +1 -1
  63. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataset_create.cxx +2 -0
  64. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataset_drop.cxx +2 -0
  65. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataverse_create.cxx +2 -0
  66. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataverse_drop.cxx +2 -0
  67. package/deps/couchbase-cxx-client/core/operations/management/analytics_get_pending_mutations.cxx +2 -0
  68. package/deps/couchbase-cxx-client/core/operations/management/analytics_index_drop.cxx +2 -0
  69. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_connect.cxx +2 -0
  70. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_disconnect.cxx +2 -0
  71. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_drop.cxx +2 -0
  72. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_get_all.cxx +2 -0
  73. package/deps/couchbase-cxx-client/core/operations/management/bucket_create.cxx +1 -1
  74. package/deps/couchbase-cxx-client/core/operations/management/bucket_describe.cxx +2 -0
  75. package/deps/couchbase-cxx-client/core/operations/management/bucket_drop.cxx +2 -0
  76. package/deps/couchbase-cxx-client/core/operations/management/bucket_flush.cxx +2 -0
  77. package/deps/couchbase-cxx-client/core/operations/management/bucket_get.cxx +2 -0
  78. package/deps/couchbase-cxx-client/core/operations/management/change_password.cxx +3 -1
  79. package/deps/couchbase-cxx-client/core/operations/management/collection_create.cxx +2 -0
  80. package/deps/couchbase-cxx-client/core/operations/management/collection_drop.cxx +2 -0
  81. package/deps/couchbase-cxx-client/core/operations/management/collection_update.cxx +2 -0
  82. package/deps/couchbase-cxx-client/core/operations/management/error_utils.cxx +6 -5
  83. package/deps/couchbase-cxx-client/core/operations/management/eventing_deploy_function.cxx +2 -0
  84. package/deps/couchbase-cxx-client/core/operations/management/eventing_drop_function.cxx +2 -0
  85. package/deps/couchbase-cxx-client/core/operations/management/eventing_get_function.cxx +2 -0
  86. package/deps/couchbase-cxx-client/core/operations/management/eventing_pause_function.cxx +2 -0
  87. package/deps/couchbase-cxx-client/core/operations/management/eventing_resume_function.cxx +2 -0
  88. package/deps/couchbase-cxx-client/core/operations/management/eventing_undeploy_function.cxx +2 -0
  89. package/deps/couchbase-cxx-client/core/operations/management/eventing_upsert_function.cxx +2 -0
  90. package/deps/couchbase-cxx-client/core/operations/management/group_drop.cxx +2 -0
  91. package/deps/couchbase-cxx-client/core/operations/management/group_get.cxx +2 -0
  92. package/deps/couchbase-cxx-client/core/operations/management/group_get_all.cxx +1 -1
  93. package/deps/couchbase-cxx-client/core/operations/management/query_index_build_deferred.hxx +2 -2
  94. package/deps/couchbase-cxx-client/core/operations/management/query_index_create.cxx +4 -1
  95. package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.cxx +4 -1
  96. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.cxx +1 -1
  97. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.hxx +1 -1
  98. package/deps/couchbase-cxx-client/core/operations/management/scope_create.cxx +2 -0
  99. package/deps/couchbase-cxx-client/core/operations/management/scope_drop.cxx +2 -0
  100. package/deps/couchbase-cxx-client/core/operations/management/scope_get_all.cxx +2 -0
  101. package/deps/couchbase-cxx-client/core/operations/management/search_get_stats.cxx +4 -4
  102. package/deps/couchbase-cxx-client/core/operations/management/search_get_stats.hxx +4 -4
  103. package/deps/couchbase-cxx-client/core/operations/management/search_index_analyze_document.cxx +2 -0
  104. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_ingest.cxx +2 -0
  105. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_plan_freeze.cxx +2 -0
  106. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_query.cxx +2 -0
  107. package/deps/couchbase-cxx-client/core/operations/management/search_index_drop.cxx +2 -0
  108. package/deps/couchbase-cxx-client/core/operations/management/search_index_get.cxx +2 -0
  109. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_all.cxx +1 -1
  110. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_documents_count.cxx +2 -0
  111. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_stats.cxx +2 -0
  112. package/deps/couchbase-cxx-client/core/operations/management/search_index_upsert.cxx +2 -0
  113. package/deps/couchbase-cxx-client/core/operations/management/view_index_drop.cxx +2 -0
  114. package/deps/couchbase-cxx-client/core/operations/management/view_index_get.cxx +2 -0
  115. package/deps/couchbase-cxx-client/core/operations/management/view_index_get_all.cxx +2 -0
  116. package/deps/couchbase-cxx-client/core/operations/management/view_index_upsert.cxx +2 -0
  117. package/deps/couchbase-cxx-client/core/operations.hxx +0 -1
  118. package/deps/couchbase-cxx-client/core/operations_fwd.hxx +260 -0
  119. package/deps/couchbase-cxx-client/core/origin.cxx +146 -5
  120. package/deps/couchbase-cxx-client/core/origin.hxx +30 -140
  121. package/deps/couchbase-cxx-client/core/protocol/cmd_cluster_map_change_notification.hxx +3 -3
  122. package/deps/couchbase-cxx-client/core/protocol/cmd_hello.hxx +5 -0
  123. package/deps/couchbase-cxx-client/core/protocol/cmd_observe_seqno.hxx +4 -4
  124. package/deps/couchbase-cxx-client/core/protocol/hello_feature.hxx +6 -0
  125. package/deps/couchbase-cxx-client/core/protocol/hello_feature_fmt.hxx +3 -0
  126. package/deps/couchbase-cxx-client/core/protocol/status.cxx +6 -0
  127. package/deps/couchbase-cxx-client/core/protocol/status.hxx +1 -0
  128. package/deps/couchbase-cxx-client/core/query_context.hxx +11 -7
  129. package/deps/couchbase-cxx-client/core/range_scan_orchestrator.cxx +1 -1
  130. package/deps/couchbase-cxx-client/core/topology/configuration.cxx +23 -0
  131. package/deps/couchbase-cxx-client/core/topology/configuration.hxx +8 -12
  132. package/deps/couchbase-cxx-client/core/topology/configuration_fmt.hxx +3 -3
  133. package/deps/couchbase-cxx-client/core/topology/configuration_json.hxx +2 -0
  134. package/deps/couchbase-cxx-client/core/topology/error_map.hxx +2 -2
  135. package/deps/couchbase-cxx-client/core/topology/error_map_json.hxx +4 -0
  136. package/deps/couchbase-cxx-client/core/transactions/active_transaction_record.cxx +58 -0
  137. package/deps/couchbase-cxx-client/core/transactions/active_transaction_record.hxx +5 -40
  138. package/deps/couchbase-cxx-client/core/transactions/async_attempt_context.cxx +30 -0
  139. package/deps/couchbase-cxx-client/core/transactions/atr_cleanup_entry.cxx +18 -18
  140. package/deps/couchbase-cxx-client/core/transactions/attempt_context.cxx +36 -0
  141. package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.cxx +39 -41
  142. package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.hxx +2 -2
  143. package/deps/couchbase-cxx-client/core/transactions/internal/atr_cleanup_entry.hxx +3 -1
  144. package/deps/couchbase-cxx-client/core/transactions/internal/atr_entry.hxx +2 -0
  145. package/deps/couchbase-cxx-client/core/transactions/internal/doc_record.cxx +32 -0
  146. package/deps/couchbase-cxx-client/core/transactions/internal/doc_record.hxx +4 -30
  147. package/deps/couchbase-cxx-client/core/transactions/internal/doc_record_fmt.hxx +41 -0
  148. package/deps/couchbase-cxx-client/core/transactions/internal/logging.hxx +17 -15
  149. package/deps/couchbase-cxx-client/core/transactions/internal/transaction_context.hxx +1 -1
  150. package/deps/couchbase-cxx-client/core/transactions/internal/transactions_cleanup.hxx +4 -4
  151. package/deps/couchbase-cxx-client/core/transactions/internal/utils.hxx +1 -13
  152. package/deps/couchbase-cxx-client/core/transactions/result.hxx +0 -26
  153. package/deps/couchbase-cxx-client/core/transactions/result_fmt.hxx +46 -0
  154. package/deps/couchbase-cxx-client/core/transactions/staged_mutation.cxx +16 -14
  155. package/deps/couchbase-cxx-client/core/transactions/transaction_context.cxx +6 -6
  156. package/deps/couchbase-cxx-client/core/transactions/transaction_keyspace.cxx +48 -0
  157. package/deps/couchbase-cxx-client/core/transactions/transaction_links.hxx +1 -0
  158. package/deps/couchbase-cxx-client/core/transactions/transaction_options.cxx +61 -4
  159. package/deps/couchbase-cxx-client/core/transactions/transactions.cxx +9 -8
  160. package/deps/couchbase-cxx-client/core/transactions/transactions_cleanup.cxx +9 -16
  161. package/deps/couchbase-cxx-client/core/transactions/transactions_config.cxx +7 -6
  162. package/deps/couchbase-cxx-client/core/transactions.hxx +6 -5
  163. package/deps/couchbase-cxx-client/core/utils/join_strings.hxx +4 -3
  164. package/deps/couchbase-cxx-client/core/utils/keyspace.hxx +4 -4
  165. package/deps/couchbase-cxx-client/couchbase/allow_querying_search_index_options.hxx +44 -0
  166. package/deps/couchbase-cxx-client/couchbase/analytics_index_manager.hxx +463 -0
  167. package/deps/couchbase-cxx-client/couchbase/analyze_document_options.hxx +44 -0
  168. package/deps/couchbase-cxx-client/couchbase/append_options.hxx +0 -24
  169. package/deps/couchbase-cxx-client/couchbase/behavior_options.hxx +1 -1
  170. package/deps/couchbase-cxx-client/couchbase/binary_collection.hxx +19 -115
  171. package/deps/couchbase-cxx-client/couchbase/bucket.hxx +13 -30
  172. package/deps/couchbase-cxx-client/couchbase/bucket_manager.hxx +8 -7
  173. package/deps/couchbase-cxx-client/couchbase/build_query_index_options.hxx +0 -1
  174. package/deps/couchbase-cxx-client/couchbase/cluster.hxx +41 -73
  175. package/deps/couchbase-cxx-client/couchbase/cluster_options.hxx +1 -27
  176. package/deps/couchbase-cxx-client/couchbase/collection.hxx +176 -386
  177. package/deps/couchbase-cxx-client/couchbase/collection_manager.hxx +8 -9
  178. package/deps/couchbase-cxx-client/couchbase/collection_query_index_manager.hxx +21 -24
  179. package/deps/couchbase-cxx-client/couchbase/connect_link_analytics_options.hxx +116 -0
  180. package/deps/couchbase-cxx-client/couchbase/create_bucket_options.hxx +3 -3
  181. package/deps/couchbase-cxx-client/couchbase/create_collection_options.hxx +3 -2
  182. package/deps/couchbase-cxx-client/couchbase/create_dataset_analytics_options.hxx +120 -0
  183. package/deps/couchbase-cxx-client/couchbase/create_dataverse_analytics_options.hxx +85 -0
  184. package/deps/couchbase-cxx-client/couchbase/create_index_analytics_options.hxx +103 -0
  185. package/deps/couchbase-cxx-client/couchbase/create_link_analytics_options.hxx +63 -0
  186. package/deps/couchbase-cxx-client/couchbase/decrement_options.hxx +0 -23
  187. package/deps/couchbase-cxx-client/couchbase/disallow_querying_search_index_options.hxx +43 -0
  188. package/deps/couchbase-cxx-client/couchbase/disconnect_link_analytics_options.hxx +105 -0
  189. package/deps/couchbase-cxx-client/couchbase/drop_dataset_analytics_options.hxx +103 -0
  190. package/deps/couchbase-cxx-client/couchbase/drop_dataverse_analytics_options.hxx +84 -0
  191. package/deps/couchbase-cxx-client/couchbase/drop_index_analytics_options.hxx +103 -0
  192. package/deps/couchbase-cxx-client/couchbase/drop_link_analytics_options.hxx +63 -0
  193. package/deps/couchbase-cxx-client/couchbase/drop_search_index_options.hxx +43 -0
  194. package/deps/couchbase-cxx-client/couchbase/error_codes.hxx +22 -1
  195. package/deps/couchbase-cxx-client/couchbase/exists_options.hxx +0 -23
  196. package/deps/couchbase-cxx-client/couchbase/fmt/key_value_error_map_attribute.hxx +6 -0
  197. package/deps/couchbase-cxx-client/couchbase/fmt/key_value_status_code.hxx +3 -0
  198. package/deps/couchbase-cxx-client/couchbase/fmt/transaction_keyspace.hxx +37 -0
  199. package/deps/couchbase-cxx-client/couchbase/freeze_plan_search_index_options.hxx +43 -0
  200. package/deps/couchbase-cxx-client/couchbase/get_all_datasets_analytics_options.hxx +66 -0
  201. package/deps/couchbase-cxx-client/couchbase/get_all_indexes_analytics_options.hxx +65 -0
  202. package/deps/couchbase-cxx-client/couchbase/get_all_query_indexes_options.hxx +1 -4
  203. package/deps/couchbase-cxx-client/couchbase/get_all_replicas_options.hxx +0 -23
  204. package/deps/couchbase-cxx-client/couchbase/get_all_search_indexes_options.hxx +45 -0
  205. package/deps/couchbase-cxx-client/couchbase/get_and_lock_options.hxx +0 -24
  206. package/deps/couchbase-cxx-client/couchbase/get_and_touch_options.hxx +0 -24
  207. package/deps/couchbase-cxx-client/couchbase/get_any_replica_options.hxx +0 -23
  208. package/deps/couchbase-cxx-client/couchbase/get_indexed_search_index_options.hxx +43 -0
  209. package/deps/couchbase-cxx-client/couchbase/get_links_analytics_options.hxx +121 -0
  210. package/deps/couchbase-cxx-client/couchbase/get_options.hxx +0 -23
  211. package/deps/couchbase-cxx-client/couchbase/get_pending_mutations_analytics_options.hxx +67 -0
  212. package/deps/couchbase-cxx-client/couchbase/get_search_index_options.hxx +44 -0
  213. package/deps/couchbase-cxx-client/couchbase/increment_options.hxx +0 -23
  214. package/deps/couchbase-cxx-client/couchbase/insert_options.hxx +0 -24
  215. package/deps/couchbase-cxx-client/couchbase/key_value_error_map_attribute.hxx +12 -0
  216. package/deps/couchbase-cxx-client/couchbase/key_value_status_code.hxx +1 -0
  217. package/deps/couchbase-cxx-client/couchbase/lookup_in_options.hxx +0 -24
  218. package/deps/couchbase-cxx-client/couchbase/management/analytics_dataset.hxx +48 -0
  219. package/deps/couchbase-cxx-client/couchbase/management/analytics_index.hxx +48 -0
  220. package/deps/couchbase-cxx-client/couchbase/management/analytics_link.hxx +239 -0
  221. package/deps/couchbase-cxx-client/couchbase/management/query_index.hxx +3 -3
  222. package/deps/couchbase-cxx-client/couchbase/management/search_index.hxx +40 -0
  223. package/deps/couchbase-cxx-client/couchbase/manager_error_context.hxx +0 -1
  224. package/deps/couchbase-cxx-client/couchbase/mutate_in_options.hxx +0 -24
  225. package/deps/couchbase-cxx-client/couchbase/network_options.hxx +1 -1
  226. package/deps/couchbase-cxx-client/couchbase/pause_ingest_search_index_options.hxx +43 -0
  227. package/deps/couchbase-cxx-client/couchbase/phrase_query.hxx +19 -0
  228. package/deps/couchbase-cxx-client/couchbase/prepend_options.hxx +0 -24
  229. package/deps/couchbase-cxx-client/couchbase/query_index_manager.hxx +99 -20
  230. package/deps/couchbase-cxx-client/couchbase/query_options.hxx +0 -21
  231. package/deps/couchbase-cxx-client/couchbase/remove_options.hxx +0 -23
  232. package/deps/couchbase-cxx-client/couchbase/replace_link_analytics_options.hxx +63 -0
  233. package/deps/couchbase-cxx-client/couchbase/replace_options.hxx +0 -24
  234. package/deps/couchbase-cxx-client/couchbase/resume_ingest_search_index_options.hxx +43 -0
  235. package/deps/couchbase-cxx-client/couchbase/scope.hxx +13 -45
  236. package/deps/couchbase-cxx-client/couchbase/search_facet_result.hxx +1 -7
  237. package/deps/couchbase-cxx-client/couchbase/search_geo_distance_units.hxx +26 -0
  238. package/deps/couchbase-cxx-client/couchbase/search_index_manager.hxx +292 -0
  239. package/deps/couchbase-cxx-client/couchbase/search_row_location.hxx +10 -0
  240. package/deps/couchbase-cxx-client/couchbase/search_sort_geo_distance.hxx +84 -0
  241. package/deps/couchbase-cxx-client/couchbase/security_options.hxx +1 -1
  242. package/deps/couchbase-cxx-client/couchbase/touch_options.hxx +0 -24
  243. package/deps/couchbase-cxx-client/couchbase/tracing/request_tracer.hxx +1 -1
  244. package/deps/couchbase-cxx-client/couchbase/transactions/async_attempt_context.hxx +10 -7
  245. package/deps/couchbase-cxx-client/couchbase/transactions/attempt_context.hxx +10 -10
  246. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_keyspace.hxx +8 -58
  247. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_options.hxx +28 -70
  248. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_query_options.hxx +7 -2
  249. package/deps/couchbase-cxx-client/couchbase/transactions/transactions_cleanup_config.hxx +2 -1
  250. package/deps/couchbase-cxx-client/couchbase/transactions/transactions_config.hxx +11 -38
  251. package/deps/couchbase-cxx-client/couchbase/unfreeze_plan_search_index_options.hxx +43 -0
  252. package/deps/couchbase-cxx-client/couchbase/unlock_options.hxx +0 -24
  253. package/deps/couchbase-cxx-client/couchbase/upsert_options.hxx +0 -24
  254. package/deps/couchbase-cxx-client/couchbase/upsert_search_index_options.hxx +41 -0
  255. package/dist/binding.d.ts +7 -9
  256. package/dist/bindingutilities.js +2 -0
  257. package/dist/collection.js +3 -3
  258. package/dist/errors.d.ts +9 -0
  259. package/dist/errors.js +14 -2
  260. package/dist/transactions.d.ts +2 -0
  261. package/dist/transactions.js +2 -3
  262. package/dist/usermanager.js +1 -1
  263. package/package.json +7 -7
  264. package/src/binding.cpp +1 -0
  265. package/src/connection.cpp +12 -9
  266. package/src/connection.hpp +3 -3
  267. package/src/connection_autogen.cpp +7 -5
  268. package/src/constants.cpp +3 -0
  269. package/src/instance.cpp +2 -2
  270. package/src/instance.hpp +1 -1
  271. package/src/jstocbpp_autogen.hpp +21 -38
  272. package/src/jstocbpp_basic.hpp +2 -0
  273. package/src/jstocbpp_errors.hpp +1 -0
  274. package/src/jstocbpp_transactions.hpp +6 -22
  275. package/src/mutationtoken.hpp +1 -0
  276. package/tools/gen-bindings-json.py +39 -16
  277. package/deps/couchbase-cxx-cache/spdlog/66ab2619a0014319471759c03e2de1af6bda14de/spdlog/example/CMakeLists.txt +0 -23
  278. package/deps/couchbase-cxx-cache/spdlog/66ab2619a0014319471759c03e2de1af6bda14de/spdlog/example/example.cpp +0 -398
  279. package/deps/couchbase-cxx-client/core/impl/append.cxx +0 -87
  280. package/deps/couchbase-cxx-client/core/impl/build_deferred_query_indexes.cxx +0 -157
  281. package/deps/couchbase-cxx-client/core/impl/create_bucket.cxx +0 -158
  282. package/deps/couchbase-cxx-client/core/impl/create_collection.cxx +0 -83
  283. package/deps/couchbase-cxx-client/core/impl/create_query_index.cxx +0 -232
  284. package/deps/couchbase-cxx-client/core/impl/create_scope.cxx +0 -69
  285. package/deps/couchbase-cxx-client/core/impl/decrement.cxx +0 -96
  286. package/deps/couchbase-cxx-client/core/impl/drop_bucket.cxx +0 -66
  287. package/deps/couchbase-cxx-client/core/impl/drop_collection.cxx +0 -76
  288. package/deps/couchbase-cxx-client/core/impl/drop_query_index.cxx +0 -187
  289. package/deps/couchbase-cxx-client/core/impl/drop_scope.cxx +0 -68
  290. package/deps/couchbase-cxx-client/core/impl/exists.cxx +0 -47
  291. package/deps/couchbase-cxx-client/core/impl/flush_bucket.cxx +0 -66
  292. package/deps/couchbase-cxx-client/core/impl/get.cxx +0 -68
  293. package/deps/couchbase-cxx-client/core/impl/get_all_buckets.cxx +0 -178
  294. package/deps/couchbase-cxx-client/core/impl/get_all_query_indexes.cxx +0 -106
  295. package/deps/couchbase-cxx-client/core/impl/get_all_replicas.cxx +0 -145
  296. package/deps/couchbase-cxx-client/core/impl/get_all_scopes.cxx +0 -94
  297. package/deps/couchbase-cxx-client/core/impl/get_and_lock.cxx +0 -49
  298. package/deps/couchbase-cxx-client/core/impl/get_and_touch.cxx +0 -49
  299. package/deps/couchbase-cxx-client/core/impl/get_any_replica.cxx +0 -134
  300. package/deps/couchbase-cxx-client/core/impl/get_bucket.cxx +0 -168
  301. package/deps/couchbase-cxx-client/core/impl/increment.cxx +0 -96
  302. package/deps/couchbase-cxx-client/core/impl/insert.cxx +0 -90
  303. package/deps/couchbase-cxx-client/core/impl/lookup_in.cxx +0 -69
  304. package/deps/couchbase-cxx-client/core/impl/lookup_in_all_replicas.cxx +0 -178
  305. package/deps/couchbase-cxx-client/core/impl/lookup_in_any_replica.cxx +0 -169
  306. package/deps/couchbase-cxx-client/core/impl/mutate_in.cxx +0 -125
  307. package/deps/couchbase-cxx-client/core/impl/prepend.cxx +0 -87
  308. package/deps/couchbase-cxx-client/core/impl/remove.cxx +0 -86
  309. package/deps/couchbase-cxx-client/core/impl/replace.cxx +0 -102
  310. package/deps/couchbase-cxx-client/core/impl/touch.cxx +0 -49
  311. package/deps/couchbase-cxx-client/core/impl/unlock.cxx +0 -47
  312. package/deps/couchbase-cxx-client/core/impl/update_bucket.cxx +0 -133
  313. package/deps/couchbase-cxx-client/core/impl/update_collection.cxx +0 -83
  314. package/deps/couchbase-cxx-client/core/impl/upsert.cxx +0 -100
  315. package/deps/couchbase-cxx-client/core/impl/watch_query_indexes.cxx +0 -196
  316. package/deps/couchbase-cxx-client/core/operations/mcbp_noop.hxx +0 -49
  317. /package/deps/couchbase-cxx-client/core/impl/{streaming_json_lexter_error_category.cxx → streaming_json_lexer_error_category.cxx} +0 -0
@@ -0,0 +1,1384 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2023-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "core/cluster.hxx"
19
+ #include "core/operations/document_append.hxx"
20
+ #include "core/operations/document_decrement.hxx"
21
+ #include "core/operations/document_exists.hxx"
22
+ #include "core/operations/document_get.hxx"
23
+ #include "core/operations/document_get_and_lock.hxx"
24
+ #include "core/operations/document_get_and_touch.hxx"
25
+ #include "core/operations/document_get_projected.hxx"
26
+ #include "core/operations/document_increment.hxx"
27
+ #include "core/operations/document_insert.hxx"
28
+ #include "core/operations/document_lookup_in.hxx"
29
+ #include "core/operations/document_mutate_in.hxx"
30
+ #include "core/operations/document_prepend.hxx"
31
+ #include "core/operations/document_remove.hxx"
32
+ #include "core/operations/document_replace.hxx"
33
+ #include "core/operations/document_touch.hxx"
34
+ #include "core/operations/document_unlock.hxx"
35
+ #include "core/operations/document_upsert.hxx"
36
+ #include "get_all_replicas.hxx"
37
+ #include "get_any_replica.hxx"
38
+ #include "get_replica.hxx"
39
+ #include "lookup_in_all_replicas.hxx"
40
+ #include "lookup_in_any_replica.hxx"
41
+ #include "lookup_in_replica.hxx"
42
+ #include "observe_poll.hxx"
43
+
44
+ #include <couchbase/collection.hxx>
45
+
46
+ #include <memory>
47
+
48
+ namespace couchbase
49
+ {
50
+ class collection_impl : public std::enable_shared_from_this<collection_impl>
51
+ {
52
+ public:
53
+ collection_impl(core::cluster core, std::string_view bucket_name, std::string_view scope_name, std::string_view name)
54
+ : core_{ std::move(core) }
55
+ , bucket_name_{ bucket_name }
56
+ , scope_name_{ scope_name }
57
+ , name_{ name }
58
+ {
59
+ }
60
+
61
+ [[nodiscard]] auto bucket_name() const -> const std::string&
62
+ {
63
+ return bucket_name_;
64
+ }
65
+
66
+ [[nodiscard]] auto scope_name() const -> const std::string&
67
+ {
68
+ return scope_name_;
69
+ }
70
+
71
+ [[nodiscard]] auto name() const -> const std::string&
72
+ {
73
+ return name_;
74
+ }
75
+
76
+ [[nodiscard]] auto core() const -> const core::cluster&
77
+ {
78
+ return core_;
79
+ }
80
+
81
+ void get(std::string document_key, get_options::built options, get_handler&& handler) const
82
+ {
83
+ if (!options.with_expiry && options.projections.empty()) {
84
+ return core_.execute(
85
+ core::operations::get_request{
86
+ core::document_id{ bucket_name_, scope_name_, name_, std::move(document_key) },
87
+ {},
88
+ {},
89
+ options.timeout,
90
+ { options.retry_strategy },
91
+ },
92
+ [handler = std::move(handler)](auto resp) mutable {
93
+ return handler(std::move(resp.ctx), get_result{ resp.cas, { std::move(resp.value), resp.flags }, {} });
94
+ });
95
+ }
96
+ return core_.execute(
97
+ core::operations::get_projected_request{
98
+ core::document_id{ bucket_name_, scope_name_, name_, std::move(document_key) },
99
+ {},
100
+ {},
101
+ options.projections,
102
+ options.with_expiry,
103
+ {},
104
+ false,
105
+ options.timeout,
106
+ { options.retry_strategy },
107
+ },
108
+ [handler = std::move(handler)](auto resp) mutable {
109
+ std::optional<std::chrono::system_clock::time_point> expiry_time{};
110
+ if (resp.expiry && resp.expiry.value() > 0) {
111
+ expiry_time.emplace(std::chrono::seconds{ resp.expiry.value() });
112
+ }
113
+ return handler(std::move(resp.ctx), get_result{ resp.cas, { std::move(resp.value), resp.flags }, expiry_time });
114
+ });
115
+ }
116
+
117
+ void get_and_touch(std::string document_key,
118
+ std::uint32_t expiry,
119
+ get_and_touch_options::built options,
120
+ get_and_touch_handler&& handler) const
121
+ {
122
+ return core_.execute(
123
+ core::operations::get_and_touch_request{
124
+ core::document_id{ bucket_name_, scope_name_, name_, std::move(document_key) },
125
+ {},
126
+ {},
127
+ expiry,
128
+ options.timeout,
129
+ { options.retry_strategy },
130
+ },
131
+ [handler = std::move(handler)](auto resp) mutable {
132
+ return handler(std::move(resp.ctx), get_result{ resp.cas, { std::move(resp.value), resp.flags }, {} });
133
+ });
134
+ }
135
+
136
+ void touch(std::string document_key, std::uint32_t expiry, touch_options::built options, touch_handler&& handler) const
137
+ {
138
+ return core_.execute(
139
+ core::operations::touch_request{
140
+ core::document_id{ bucket_name_, scope_name_, name_, std::move(document_key) },
141
+ {},
142
+ {},
143
+ expiry,
144
+ options.timeout,
145
+ { options.retry_strategy },
146
+ },
147
+ [handler = std::move(handler)](auto resp) mutable { return handler(std::move(resp.ctx), result{ resp.cas }); });
148
+ }
149
+
150
+ void get_any_replica(std::string document_key,
151
+ const get_any_replica_options::built& options,
152
+ core::impl::movable_get_any_replica_handler&& handler) const
153
+ {
154
+ auto request =
155
+ std::make_shared<core::impl::get_any_replica_request>(bucket_name_, scope_name_, name_, std::move(document_key), options.timeout);
156
+ core_.with_bucket_configuration(
157
+ bucket_name_,
158
+ [core = core_, r = std::move(request), h = std::move(handler)](std::error_code ec,
159
+ const core::topology::configuration& config) mutable {
160
+ if (ec) {
161
+ return h(make_key_value_error_context(ec, r->id()), get_replica_result{});
162
+ }
163
+ struct replica_context {
164
+ replica_context(core::impl::movable_get_any_replica_handler&& handler, std::uint32_t expected_responses)
165
+ : handler_(std::move(handler))
166
+ , expected_responses_(expected_responses)
167
+ {
168
+ }
169
+
170
+ core::impl::movable_get_any_replica_handler handler_;
171
+ std::uint32_t expected_responses_;
172
+ bool done_{ false };
173
+ std::mutex mutex_{};
174
+ };
175
+ auto ctx = std::make_shared<replica_context>(std::move(h), config.num_replicas.value_or(0U) + 1U);
176
+
177
+ for (std::size_t idx = 1U; idx <= config.num_replicas.value_or(0U); ++idx) {
178
+ core::document_id replica_id{ r->id() };
179
+ replica_id.node_index(idx);
180
+ core.execute(core::impl::get_replica_request{ std::move(replica_id), r->timeout() }, [ctx](auto&& resp) {
181
+ core::impl::movable_get_any_replica_handler local_handler;
182
+ {
183
+ const std::scoped_lock lock(ctx->mutex_);
184
+ if (ctx->done_) {
185
+ return;
186
+ }
187
+ --ctx->expected_responses_;
188
+ if (resp.ctx.ec()) {
189
+ if (ctx->expected_responses_ > 0) {
190
+ // just ignore the response
191
+ return;
192
+ }
193
+ // consider document irretrievable and give up
194
+ resp.ctx.override_ec(errc::key_value::document_irretrievable);
195
+ }
196
+ ctx->done_ = true;
197
+ std::swap(local_handler, ctx->handler_);
198
+ }
199
+ if (local_handler) {
200
+ return local_handler(std::move(resp.ctx),
201
+ get_replica_result{ resp.cas, true /* replica */, { std::move(resp.value), resp.flags } });
202
+ }
203
+ });
204
+ }
205
+
206
+ core::operations::get_request active{ core::document_id{ r->id() } };
207
+ active.timeout = r->timeout();
208
+ core.execute(active, [ctx](auto resp) {
209
+ core::impl::movable_get_any_replica_handler local_handler{};
210
+ {
211
+ const std::scoped_lock lock(ctx->mutex_);
212
+ if (ctx->done_) {
213
+ return;
214
+ }
215
+ --ctx->expected_responses_;
216
+ if (resp.ctx.ec()) {
217
+ if (ctx->expected_responses_ > 0) {
218
+ // just ignore the response
219
+ return;
220
+ }
221
+ // consider document irretrievable and give up
222
+ resp.ctx.override_ec(errc::key_value::document_irretrievable);
223
+ }
224
+ ctx->done_ = true;
225
+ std::swap(local_handler, ctx->handler_);
226
+ }
227
+ if (local_handler) {
228
+ return local_handler(std::move(resp.ctx),
229
+ get_replica_result{ resp.cas, false /* active */, { std::move(resp.value), resp.flags } });
230
+ }
231
+ });
232
+ });
233
+ }
234
+
235
+ void get_all_replicas(std::string document_key,
236
+ const get_all_replicas_options::built& options,
237
+ core::impl::movable_get_all_replicas_handler&& handler) const
238
+ {
239
+ auto request = std::make_shared<core::impl::get_all_replicas_request>(
240
+ bucket_name_, scope_name_, name_, std::move(document_key), options.timeout);
241
+ core_.with_bucket_configuration(
242
+ bucket_name_,
243
+ [core = core_, r = std::move(request), h = std::move(handler)](std::error_code ec,
244
+ const core::topology::configuration& config) mutable {
245
+ if (ec) {
246
+ return h(make_key_value_error_context(ec, r->id()), get_all_replicas_result{});
247
+ }
248
+ struct replica_context {
249
+ replica_context(core::impl::movable_get_all_replicas_handler handler, std::uint32_t expected_responses)
250
+ : handler_(std::move(handler))
251
+ , expected_responses_(expected_responses)
252
+ {
253
+ }
254
+
255
+ core::impl::movable_get_all_replicas_handler handler_;
256
+ std::uint32_t expected_responses_;
257
+ bool done_{ false };
258
+ std::mutex mutex_{};
259
+ get_all_replicas_result result_{};
260
+ };
261
+ auto ctx = std::make_shared<replica_context>(std::move(h), config.num_replicas.value_or(0U) + 1U);
262
+
263
+ for (std::size_t idx = 1U; idx <= config.num_replicas.value_or(0U); ++idx) {
264
+ core::document_id replica_id{ r->id() };
265
+ replica_id.node_index(idx);
266
+ core.execute(core::impl::get_replica_request{ std::move(replica_id), r->timeout() }, [ctx](auto resp) {
267
+ core::impl::movable_get_all_replicas_handler local_handler{};
268
+ {
269
+ const std::scoped_lock lock(ctx->mutex_);
270
+ if (ctx->done_) {
271
+ return;
272
+ }
273
+ --ctx->expected_responses_;
274
+ if (resp.ctx.ec()) {
275
+ if (ctx->expected_responses_ > 0) {
276
+ // just ignore the response
277
+ return;
278
+ }
279
+ } else {
280
+ ctx->result_.emplace_back(
281
+ get_replica_result{ resp.cas, true /* replica */, { std::move(resp.value), resp.flags } });
282
+ }
283
+ if (ctx->expected_responses_ == 0) {
284
+ ctx->done_ = true;
285
+ std::swap(local_handler, ctx->handler_);
286
+ }
287
+ }
288
+ if (local_handler) {
289
+ if (!ctx->result_.empty()) {
290
+ resp.ctx.override_ec({});
291
+ }
292
+ return local_handler(std::move(resp.ctx), std::move(ctx->result_));
293
+ }
294
+ });
295
+ }
296
+
297
+ core::operations::get_request active{ core::document_id{ r->id() } };
298
+ active.timeout = r->timeout();
299
+ core.execute(active, [ctx](auto resp) {
300
+ core::impl::movable_get_all_replicas_handler local_handler{};
301
+ {
302
+ const std::scoped_lock lock(ctx->mutex_);
303
+ if (ctx->done_) {
304
+ return;
305
+ }
306
+ --ctx->expected_responses_;
307
+ if (resp.ctx.ec()) {
308
+ if (ctx->expected_responses_ > 0) {
309
+ // just ignore the response
310
+ return;
311
+ }
312
+ } else {
313
+ ctx->result_.emplace_back(
314
+ get_replica_result{ resp.cas, false /* active */, { std::move(resp.value), resp.flags } });
315
+ }
316
+ if (ctx->expected_responses_ == 0) {
317
+ ctx->done_ = true;
318
+ std::swap(local_handler, ctx->handler_);
319
+ }
320
+ }
321
+ if (local_handler) {
322
+ if (!ctx->result_.empty()) {
323
+ resp.ctx.override_ec({});
324
+ }
325
+ return local_handler(std::move(resp.ctx), std::move(ctx->result_));
326
+ }
327
+ });
328
+ });
329
+ }
330
+
331
+ void remove(std::string document_key, remove_options::built options, remove_handler&& handler) const
332
+ {
333
+ auto id = core::document_id{
334
+ bucket_name_,
335
+ scope_name_,
336
+ name_,
337
+ std::move(document_key),
338
+ };
339
+ if (options.persist_to == persist_to::none && options.replicate_to == replicate_to::none) {
340
+ return core_.execute(
341
+ core::operations::remove_request{
342
+ std::move(id),
343
+ {},
344
+ {},
345
+ options.cas,
346
+ options.durability_level,
347
+ options.timeout,
348
+ { options.retry_strategy },
349
+ },
350
+ [handler = std::move(handler)](auto resp) mutable {
351
+ if (resp.ctx.ec()) {
352
+ return handler(std::move(resp.ctx), mutation_result{});
353
+ }
354
+ return handler(std::move(resp.ctx), mutation_result{ resp.cas, std::move(resp.token) });
355
+ });
356
+ }
357
+
358
+ core::operations::remove_request request{
359
+ id, {}, {}, options.cas, durability_level::none, options.timeout, { options.retry_strategy },
360
+ };
361
+ return core_.execute(
362
+ std::move(request), [core = core_, id = std::move(id), options, handler = std::move(handler)](auto&& resp) mutable {
363
+ if (resp.ctx.ec()) {
364
+ return handler(std::move(resp.ctx), mutation_result{ resp.cas, std::move(resp.token) });
365
+ }
366
+ auto token = resp.token;
367
+ core::impl::initiate_observe_poll(core,
368
+ std::move(id),
369
+ token,
370
+ options.timeout,
371
+ options.persist_to,
372
+ options.replicate_to,
373
+ [resp, handler = std::move(handler)](std::error_code ec) mutable {
374
+ if (ec) {
375
+ resp.ctx.override_ec(ec);
376
+ return handler(std::move(resp.ctx), mutation_result{});
377
+ }
378
+ return handler(std::move(resp.ctx), mutation_result{ resp.cas, std::move(resp.token) });
379
+ });
380
+ });
381
+ }
382
+
383
+ void get_and_lock(std::string document_key,
384
+ std::chrono::seconds lock_duration,
385
+ get_and_lock_options::built options,
386
+ get_and_lock_handler&& handler) const
387
+ {
388
+ core_.execute(
389
+ core::operations::get_and_lock_request{
390
+ core::document_id{ bucket_name_, scope_name_, name_, std::move(document_key) },
391
+ {},
392
+ {},
393
+ static_cast<uint32_t>(lock_duration.count()),
394
+ options.timeout,
395
+ { options.retry_strategy },
396
+ },
397
+ [handler = std::move(handler)](auto&& resp) mutable {
398
+ return handler(std::move(resp.ctx), get_result{ resp.cas, { std::move(resp.value), resp.flags }, {} });
399
+ });
400
+ }
401
+
402
+ void unlock(std::string document_key, couchbase::cas cas, unlock_options::built options, unlock_handler&& handler) const
403
+ {
404
+ core_.execute(
405
+ core::operations::unlock_request{
406
+ core::document_id{ bucket_name_, scope_name_, name_, std::move(document_key) },
407
+ {},
408
+ {},
409
+ cas,
410
+ options.timeout,
411
+ { options.retry_strategy },
412
+ },
413
+ [handler = std::move(handler)](auto&& resp) mutable { return handler(std::move(resp.ctx)); });
414
+ }
415
+
416
+ void exists(std::string document_key, exists_options::built options, exists_handler&& handler) const
417
+ {
418
+ core_.execute(
419
+ core::operations::exists_request{
420
+ core::document_id{ bucket_name_, scope_name_, name_, std::move(document_key) },
421
+ {},
422
+ {},
423
+ options.timeout,
424
+ { options.retry_strategy },
425
+ },
426
+ [handler = std::move(handler)](auto&& resp) mutable {
427
+ return handler(std::move(resp.ctx), exists_result{ resp.cas, resp.exists() });
428
+ });
429
+ }
430
+
431
+ void lookup_in(std::string document_key,
432
+ const std::vector<core::impl::subdoc::command>& specs,
433
+ lookup_in_options::built options,
434
+ lookup_in_handler&& handler) const
435
+ {
436
+ return core_.execute(
437
+ core::operations::lookup_in_request{
438
+ core::document_id{
439
+ bucket_name_,
440
+ scope_name_,
441
+ name_,
442
+ std::move(document_key),
443
+ },
444
+ {},
445
+ {},
446
+ options.access_deleted,
447
+ specs,
448
+ options.timeout,
449
+ { options.retry_strategy },
450
+ },
451
+ [handler = std::move(handler)](auto resp) mutable {
452
+ if (resp.ctx.ec()) {
453
+ return handler(std::move(resp.ctx), lookup_in_result{});
454
+ }
455
+
456
+ std::vector<lookup_in_result::entry> entries{};
457
+ entries.reserve(resp.fields.size());
458
+ for (auto& entry : resp.fields) {
459
+ entries.emplace_back(lookup_in_result::entry{
460
+ std::move(entry.path),
461
+ std::move(entry.value),
462
+ entry.original_index,
463
+ entry.exists,
464
+ entry.ec,
465
+ });
466
+ }
467
+ return handler(std::move(resp.ctx), lookup_in_result{ resp.cas, std::move(entries), resp.deleted });
468
+ });
469
+ }
470
+
471
+ void lookup_in_all_replicas(std::string document_key,
472
+ const std::vector<core::impl::subdoc::command>& specs,
473
+ const lookup_in_all_replicas_options::built& options,
474
+ lookup_in_all_replicas_handler&& handler) const
475
+ {
476
+ auto request = std::make_shared<couchbase::core::impl::lookup_in_all_replicas_request>(
477
+ bucket_name_, scope_name_, name_, std::move(document_key), specs, options.timeout);
478
+ core_.with_bucket_configuration(
479
+ bucket_name_,
480
+ [core = core_, r = std::move(request), h = std::move(handler)](std::error_code ec,
481
+ const core::topology::configuration& config) mutable {
482
+ if (!config.supports_subdoc_read_replica()) {
483
+ ec = errc::common::feature_not_available;
484
+ }
485
+
486
+ if (ec) {
487
+ return h(core::make_subdocument_error_context(make_key_value_error_context(ec, r->id()), ec, {}, {}, false),
488
+ lookup_in_all_replicas_result{});
489
+ }
490
+ struct replica_context {
491
+ replica_context(core::impl::movable_lookup_in_all_replicas_handler handler, std::uint32_t expected_responses)
492
+ : handler_(std::move(handler))
493
+ , expected_responses_(expected_responses)
494
+ {
495
+ }
496
+
497
+ core::impl::movable_lookup_in_all_replicas_handler handler_;
498
+ std::uint32_t expected_responses_;
499
+ bool done_{ false };
500
+ std::mutex mutex_{};
501
+ lookup_in_all_replicas_result result_{};
502
+ };
503
+ auto ctx = std::make_shared<replica_context>(std::move(h), config.num_replicas.value_or(0U) + 1U);
504
+
505
+ for (std::size_t idx = 1U; idx <= config.num_replicas.value_or(0U); ++idx) {
506
+ core::document_id replica_id{ r->id() };
507
+ replica_id.node_index(idx);
508
+ core.execute(core::impl::lookup_in_replica_request{ std::move(replica_id), r->specs(), r->timeout() },
509
+ [ctx](core::impl::lookup_in_replica_response&& resp) {
510
+ core::impl::movable_lookup_in_all_replicas_handler local_handler{};
511
+ {
512
+ const std::scoped_lock lock(ctx->mutex_);
513
+ if (ctx->done_) {
514
+ return;
515
+ }
516
+ --ctx->expected_responses_;
517
+ if (resp.ctx.ec()) {
518
+ if (ctx->expected_responses_ > 0) {
519
+ // just ignore the response
520
+ return;
521
+ }
522
+ } else {
523
+ std::vector<lookup_in_replica_result::entry> entries{};
524
+ for (const auto& field : resp.fields) {
525
+ lookup_in_replica_result::entry lookup_in_entry{};
526
+ lookup_in_entry.path = field.path;
527
+ lookup_in_entry.value = field.value;
528
+ lookup_in_entry.exists = field.exists;
529
+ lookup_in_entry.original_index = field.original_index;
530
+ lookup_in_entry.ec = field.ec;
531
+ entries.emplace_back(lookup_in_entry);
532
+ }
533
+ ctx->result_.emplace_back(resp.cas, entries, resp.deleted, true /* replica */);
534
+ }
535
+ if (ctx->expected_responses_ == 0) {
536
+ ctx->done_ = true;
537
+ std::swap(local_handler, ctx->handler_);
538
+ }
539
+ }
540
+ if (local_handler) {
541
+ if (!ctx->result_.empty()) {
542
+ resp.ctx.override_ec({});
543
+ }
544
+ return local_handler(std::move(resp.ctx), std::move(ctx->result_));
545
+ }
546
+ });
547
+ }
548
+
549
+ core::operations::lookup_in_request active{ core::document_id{ r->id() } };
550
+ active.specs = r->specs();
551
+ active.timeout = r->timeout();
552
+ core.execute(active, [ctx](core::operations::lookup_in_response&& resp) {
553
+ core::impl::movable_lookup_in_all_replicas_handler local_handler{};
554
+ {
555
+ const std::scoped_lock lock(ctx->mutex_);
556
+ if (ctx->done_) {
557
+ return;
558
+ }
559
+ --ctx->expected_responses_;
560
+ if (resp.ctx.ec()) {
561
+ if (ctx->expected_responses_ > 0) {
562
+ // just ignore the response
563
+ return;
564
+ }
565
+ } else {
566
+ std::vector<lookup_in_replica_result::entry> entries{};
567
+ for (const auto& field : resp.fields) {
568
+ lookup_in_replica_result::entry lookup_in_entry{};
569
+ lookup_in_entry.path = field.path;
570
+ lookup_in_entry.value = field.value;
571
+ lookup_in_entry.exists = field.exists;
572
+ lookup_in_entry.original_index = field.original_index;
573
+ lookup_in_entry.ec = field.ec;
574
+ entries.emplace_back(lookup_in_entry);
575
+ }
576
+ ctx->result_.emplace_back(resp.cas, entries, resp.deleted, false /* active */);
577
+ }
578
+ if (ctx->expected_responses_ == 0) {
579
+ ctx->done_ = true;
580
+ std::swap(local_handler, ctx->handler_);
581
+ }
582
+ }
583
+ if (local_handler) {
584
+ if (!ctx->result_.empty()) {
585
+ resp.ctx.override_ec({});
586
+ }
587
+ return local_handler(std::move(resp.ctx), std::move(ctx->result_));
588
+ }
589
+ });
590
+ });
591
+ }
592
+
593
+ void lookup_in_any_replica(std::string document_key,
594
+ const std::vector<core::impl::subdoc::command>& specs,
595
+ const lookup_in_any_replica_options::built& options,
596
+ lookup_in_any_replica_handler&& handler) const
597
+ {
598
+ auto request = std::make_shared<couchbase::core::impl::lookup_in_any_replica_request>(
599
+ bucket_name_, scope_name_, name_, std::move(document_key), specs, options.timeout);
600
+ core_.with_bucket_configuration(
601
+ bucket_name_,
602
+ [core = core_, r = std::move(request), h = std::move(handler)](std::error_code ec,
603
+ const core::topology::configuration& config) mutable {
604
+ if (!config.supports_subdoc_read_replica()) {
605
+ ec = errc::common::feature_not_available;
606
+ }
607
+ if (r->specs().size() > 16) {
608
+ ec = errc::common::invalid_argument;
609
+ }
610
+ if (ec) {
611
+ return h(core::make_subdocument_error_context(make_key_value_error_context(ec, r->id()), ec, {}, {}, false),
612
+ lookup_in_replica_result{});
613
+ }
614
+ struct replica_context {
615
+ replica_context(core::impl::movable_lookup_in_any_replica_handler handler, std::uint32_t expected_responses)
616
+ : handler_(std::move(handler))
617
+ , expected_responses_(expected_responses)
618
+ {
619
+ }
620
+
621
+ core::impl::movable_lookup_in_any_replica_handler handler_;
622
+ std::uint32_t expected_responses_;
623
+ bool done_{ false };
624
+ std::mutex mutex_{};
625
+ };
626
+ auto ctx = std::make_shared<replica_context>(std::move(h), config.num_replicas.value_or(0U) + 1U);
627
+
628
+ for (std::size_t idx = 1U; idx <= config.num_replicas.value_or(0U); ++idx) {
629
+ core::document_id replica_id{ r->id() };
630
+ replica_id.node_index(idx);
631
+ core.execute(core::impl::lookup_in_replica_request{ std::move(replica_id), r->specs(), r->timeout() },
632
+ [ctx](core::impl::lookup_in_replica_response&& resp) {
633
+ core::impl::movable_lookup_in_any_replica_handler local_handler;
634
+ {
635
+ const std::scoped_lock lock(ctx->mutex_);
636
+ if (ctx->done_) {
637
+ return;
638
+ }
639
+ --ctx->expected_responses_;
640
+ if (resp.ctx.ec()) {
641
+ if (ctx->expected_responses_ > 0) {
642
+ // just ignore the response
643
+ return;
644
+ }
645
+ // consider document irretrievable and give up
646
+ resp.ctx.override_ec(errc::key_value::document_irretrievable);
647
+ }
648
+ ctx->done_ = true;
649
+ std::swap(local_handler, ctx->handler_);
650
+ }
651
+ if (local_handler) {
652
+ std::vector<lookup_in_replica_result::entry> entries;
653
+ for (const auto& field : resp.fields) {
654
+ lookup_in_replica_result::entry entry{};
655
+ entry.path = field.path;
656
+ entry.original_index = field.original_index;
657
+ entry.exists = field.exists;
658
+ entry.value = field.value;
659
+ entry.ec = field.ec;
660
+ entries.emplace_back(entry);
661
+ }
662
+ return local_handler(
663
+ std::move(resp.ctx),
664
+ lookup_in_replica_result{ resp.cas, entries, resp.deleted, true /* replica */ });
665
+ }
666
+ });
667
+ }
668
+
669
+ core::operations::lookup_in_request active{ core::document_id{ r->id() } };
670
+ active.specs = r->specs();
671
+ active.timeout = r->timeout();
672
+ core.execute(active, [ctx](core::operations::lookup_in_response&& resp) {
673
+ core::impl::movable_lookup_in_any_replica_handler local_handler{};
674
+ {
675
+ const std::scoped_lock lock(ctx->mutex_);
676
+ if (ctx->done_) {
677
+ return;
678
+ }
679
+ --ctx->expected_responses_;
680
+ if (resp.ctx.ec()) {
681
+ if (ctx->expected_responses_ > 0) {
682
+ // just ignore the response
683
+ return;
684
+ }
685
+ // consider document irretrievable and give up
686
+ resp.ctx.override_ec(errc::key_value::document_irretrievable);
687
+ }
688
+ ctx->done_ = true;
689
+ std::swap(local_handler, ctx->handler_);
690
+ }
691
+ if (local_handler) {
692
+ std::vector<lookup_in_replica_result::entry> entries;
693
+ for (const auto& field : resp.fields) {
694
+ lookup_in_replica_result::entry entry{};
695
+ entry.path = field.path;
696
+ entry.original_index = field.original_index;
697
+ entry.exists = field.exists;
698
+ entry.value = field.value;
699
+ entry.ec = field.ec;
700
+ entries.emplace_back(entry);
701
+ }
702
+ return local_handler(std::move(resp.ctx),
703
+ lookup_in_replica_result{ resp.cas, entries, resp.deleted, false /* active */ });
704
+ }
705
+ });
706
+ });
707
+ }
708
+
709
+ void mutate_in(std::string document_key,
710
+ const std::vector<core::impl::subdoc::command>& specs,
711
+ mutate_in_options::built options,
712
+ mutate_in_handler&& handler) const
713
+ {
714
+ auto id = core::document_id{
715
+ bucket_name_,
716
+ scope_name_,
717
+ name_,
718
+ std::move(document_key),
719
+ };
720
+ if (options.persist_to == persist_to::none && options.replicate_to == replicate_to::none) {
721
+ return core_.execute(
722
+ core::operations::mutate_in_request{
723
+ std::move(id),
724
+ {},
725
+ {},
726
+ options.cas,
727
+ options.access_deleted,
728
+ options.create_as_deleted,
729
+ options.expiry,
730
+ options.store_semantics,
731
+ specs,
732
+ options.durability_level,
733
+ options.timeout,
734
+ { options.retry_strategy },
735
+ options.preserve_expiry,
736
+ },
737
+ [handler = std::move(handler)](auto resp) mutable {
738
+ if (resp.ctx.ec()) {
739
+ return handler(std::move(resp.ctx), mutate_in_result{});
740
+ }
741
+ std::vector<mutate_in_result::entry> entries{};
742
+ entries.reserve(resp.fields.size());
743
+ for (auto& entry : resp.fields) {
744
+ entries.emplace_back(mutate_in_result::entry{
745
+ std::move(entry.path),
746
+ std::move(entry.value),
747
+ entry.original_index,
748
+ });
749
+ }
750
+ return handler(std::move(resp.ctx),
751
+ mutate_in_result{ resp.cas, std::move(resp.token), std::move(entries), resp.deleted });
752
+ });
753
+ }
754
+
755
+ core::operations::mutate_in_request request{
756
+ id,
757
+ {},
758
+ {},
759
+ options.cas,
760
+ options.access_deleted,
761
+ options.create_as_deleted,
762
+ options.expiry,
763
+ options.store_semantics,
764
+ specs,
765
+ durability_level::none,
766
+ options.timeout,
767
+ { options.retry_strategy },
768
+ options.preserve_expiry,
769
+ };
770
+ return core_.execute(
771
+ std::move(request), [core = core_, id = std::move(id), options, handler = std::move(handler)](auto&& resp) mutable {
772
+ if (resp.ctx.ec()) {
773
+ return handler(std::move(resp.ctx), mutate_in_result{});
774
+ }
775
+
776
+ auto token = resp.token;
777
+ core::impl::initiate_observe_poll(
778
+ core,
779
+ std::move(id),
780
+ token,
781
+ options.timeout,
782
+ options.persist_to,
783
+ options.replicate_to,
784
+ [resp, handler = std::move(handler)](std::error_code ec) mutable {
785
+ if (ec) {
786
+ resp.ctx.override_ec(ec);
787
+ return handler(std::move(resp.ctx), mutate_in_result{});
788
+ }
789
+ std::vector<mutate_in_result::entry> entries{};
790
+ entries.reserve(resp.fields.size());
791
+ for (auto& entry : resp.fields) {
792
+ entries.emplace_back(mutate_in_result::entry{
793
+ std::move(entry.path),
794
+ std::move(entry.value),
795
+ entry.original_index,
796
+ });
797
+ }
798
+ return handler(std::move(resp.ctx),
799
+ mutate_in_result{ resp.cas, std::move(resp.token), std::move(entries), resp.deleted });
800
+ });
801
+ });
802
+ }
803
+
804
+ void upsert(std::string document_key, codec::encoded_value encoded, upsert_options::built options, upsert_handler&& handler) const
805
+ {
806
+ auto value = std::move(encoded);
807
+ auto id = core::document_id{
808
+ bucket_name_,
809
+ scope_name_,
810
+ name_,
811
+ std::move(document_key),
812
+ };
813
+ if (options.persist_to == persist_to::none && options.replicate_to == replicate_to::none) {
814
+ return core_.execute(
815
+ core::operations::upsert_request{
816
+ std::move(id),
817
+ std::move(value.data),
818
+ {},
819
+ {},
820
+ value.flags,
821
+ options.expiry,
822
+ options.durability_level,
823
+ options.timeout,
824
+ { options.retry_strategy },
825
+ options.preserve_expiry,
826
+ },
827
+ [handler = std::move(handler)](auto resp) mutable {
828
+ return handler(std::move(resp.ctx), mutation_result{ resp.cas, std::move(resp.token) });
829
+ });
830
+ }
831
+
832
+ core::operations::upsert_request request{
833
+ id,
834
+ std::move(value.data),
835
+ {},
836
+ {},
837
+ value.flags,
838
+ options.expiry,
839
+ durability_level::none,
840
+ options.timeout,
841
+ { options.retry_strategy },
842
+ options.preserve_expiry,
843
+ };
844
+ return core_.execute(
845
+ std::move(request), [core = core_, id = std::move(id), options, handler = std::move(handler)](auto resp) mutable {
846
+ if (resp.ctx.ec()) {
847
+ return handler(std::move(resp.ctx), mutation_result{ resp.cas, std::move(resp.token) });
848
+ }
849
+
850
+ auto token = resp.token;
851
+ core::impl::initiate_observe_poll(core,
852
+ std::move(id),
853
+ token,
854
+ options.timeout,
855
+ options.persist_to,
856
+ options.replicate_to,
857
+ [resp, handler = std::move(handler)](std::error_code ec) mutable {
858
+ if (ec) {
859
+ resp.ctx.override_ec(ec);
860
+ return handler(std::move(resp.ctx), mutation_result{});
861
+ }
862
+ return handler(std::move(resp.ctx), mutation_result{ resp.cas, std::move(resp.token) });
863
+ });
864
+ });
865
+ }
866
+
867
+ void insert(std::string document_key, codec::encoded_value encoded, insert_options::built options, insert_handler&& handler) const
868
+ {
869
+ auto value = std::move(encoded);
870
+ auto id = core::document_id{
871
+ bucket_name_,
872
+ scope_name_,
873
+ name_,
874
+ std::move(document_key),
875
+ };
876
+ if (options.persist_to == persist_to::none && options.replicate_to == replicate_to::none) {
877
+ return core_.execute(
878
+ core::operations::insert_request{
879
+ std::move(id),
880
+ std::move(value.data),
881
+ {},
882
+ {},
883
+ value.flags,
884
+ options.expiry,
885
+ options.durability_level,
886
+ options.timeout,
887
+ { options.retry_strategy },
888
+ },
889
+ [handler = std::move(handler)](auto&& resp) mutable {
890
+ if (resp.ctx.ec()) {
891
+ return handler(std::move(resp.ctx), mutation_result{});
892
+ }
893
+ return handler(std::move(resp.ctx), mutation_result{ resp.cas, std::move(resp.token) });
894
+ });
895
+ }
896
+
897
+ core::operations::insert_request request{
898
+ id,
899
+ std::move(value.data),
900
+ {},
901
+ {},
902
+ value.flags,
903
+ options.expiry,
904
+ durability_level::none,
905
+ options.timeout,
906
+ { options.retry_strategy },
907
+ };
908
+ return core_.execute(
909
+ std::move(request), [core = core_, id = std::move(id), options, handler = std::move(handler)](auto resp) mutable {
910
+ if (resp.ctx.ec()) {
911
+ return handler(std::move(resp.ctx), mutation_result{ resp.cas, std::move(resp.token) });
912
+ }
913
+
914
+ auto token = resp.token;
915
+ core::impl::initiate_observe_poll(core,
916
+ std::move(id),
917
+ token,
918
+ options.timeout,
919
+ options.persist_to,
920
+ options.replicate_to,
921
+ [resp, handler = std::move(handler)](std::error_code ec) mutable {
922
+ if (ec) {
923
+ resp.ctx.override_ec(ec);
924
+ return handler(std::move(resp.ctx), mutation_result{});
925
+ }
926
+ return handler(std::move(resp.ctx), mutation_result{ resp.cas, std::move(resp.token) });
927
+ });
928
+ });
929
+ }
930
+ void replace(std::string document_key, codec::encoded_value encoded, replace_options::built options, replace_handler&& handler) const
931
+ {
932
+ auto value = std::move(encoded);
933
+ auto id = core::document_id{
934
+ bucket_name_,
935
+ scope_name_,
936
+ name_,
937
+ std::move(document_key),
938
+ };
939
+ if (options.persist_to == persist_to::none && options.replicate_to == replicate_to::none) {
940
+ return core_.execute(
941
+ core::operations::replace_request{
942
+ std::move(id),
943
+ std::move(value.data),
944
+ {},
945
+ {},
946
+ value.flags,
947
+ options.expiry,
948
+ options.cas,
949
+ options.durability_level,
950
+ options.timeout,
951
+ { options.retry_strategy },
952
+ options.preserve_expiry,
953
+ },
954
+ [handler = std::move(handler)](auto resp) mutable {
955
+ if (resp.ctx.ec()) {
956
+ return handler(std::move(resp.ctx), mutation_result{});
957
+ }
958
+ return handler(std::move(resp.ctx), mutation_result{ resp.cas, std::move(resp.token) });
959
+ });
960
+ }
961
+
962
+ core::operations::replace_request request{
963
+ id,
964
+ std::move(value.data),
965
+ {},
966
+ {},
967
+ value.flags,
968
+ options.expiry,
969
+ options.cas,
970
+ durability_level::none,
971
+ options.timeout,
972
+ { options.retry_strategy },
973
+ options.preserve_expiry,
974
+ };
975
+ return core_.execute(
976
+ std::move(request), [core = core_, id = std::move(id), options, handler = std::move(handler)](auto&& resp) mutable {
977
+ if (resp.ctx.ec()) {
978
+ return handler(std::move(resp.ctx), mutation_result{ resp.cas, std::move(resp.token) });
979
+ }
980
+
981
+ auto token = resp.token;
982
+ core::impl::initiate_observe_poll(core,
983
+ std::move(id),
984
+ token,
985
+ options.timeout,
986
+ options.persist_to,
987
+ options.replicate_to,
988
+ [resp, handler = std::move(handler)](std::error_code ec) mutable {
989
+ if (ec) {
990
+ resp.ctx.override_ec(ec);
991
+ return handler(std::move(resp.ctx), mutation_result{});
992
+ }
993
+ return handler(std::move(resp.ctx), mutation_result{ resp.cas, std::move(resp.token) });
994
+ });
995
+ });
996
+ }
997
+
998
+ private:
999
+ core::cluster core_;
1000
+ std::string bucket_name_;
1001
+ std::string scope_name_;
1002
+ std::string name_;
1003
+ };
1004
+
1005
+ collection::collection(core::cluster core, std::string_view bucket_name, std::string_view scope_name, std::string_view name)
1006
+ : impl_(std::make_shared<collection_impl>(std::move(core), bucket_name, scope_name, name))
1007
+ {
1008
+ }
1009
+
1010
+ auto
1011
+ collection::bucket_name() const -> const std::string&
1012
+ {
1013
+ return impl_->bucket_name();
1014
+ }
1015
+
1016
+ auto
1017
+ collection::scope_name() const -> const std::string&
1018
+ {
1019
+ return impl_->scope_name();
1020
+ }
1021
+
1022
+ auto
1023
+ collection::name() const -> const std::string&
1024
+ {
1025
+ return impl_->name();
1026
+ }
1027
+
1028
+ auto
1029
+ collection::query_indexes() const -> collection_query_index_manager
1030
+ {
1031
+ return { impl_->core(), impl_->bucket_name(), impl_->scope_name(), impl_->name() };
1032
+ }
1033
+
1034
+ auto
1035
+ collection::binary() const -> binary_collection
1036
+ {
1037
+ return { impl_->core(), impl_->bucket_name(), impl_->scope_name(), impl_->name() };
1038
+ }
1039
+
1040
+ void
1041
+ collection::get(std::string document_id, const get_options& options, get_handler&& handler) const
1042
+ {
1043
+ return impl_->get(std::move(document_id), options.build(), std::move(handler));
1044
+ }
1045
+
1046
+ auto
1047
+ collection::get(std::string document_id, const get_options& options) const -> std::future<std::pair<key_value_error_context, get_result>>
1048
+ {
1049
+ auto barrier = std::make_shared<std::promise<std::pair<key_value_error_context, get_result>>>();
1050
+ auto future = barrier->get_future();
1051
+ get(std::move(document_id), options, [barrier](auto ctx, auto result) { barrier->set_value({ std::move(ctx), std::move(result) }); });
1052
+ return future;
1053
+ }
1054
+
1055
+ void
1056
+ collection::get_and_touch(std::string document_id,
1057
+ std::chrono::seconds duration,
1058
+ const get_and_touch_options& options,
1059
+ get_and_touch_handler&& handler) const
1060
+ {
1061
+ return impl_->get_and_touch(std::move(document_id), core::impl::expiry_relative(duration), options.build(), std::move(handler));
1062
+ }
1063
+
1064
+ auto
1065
+ collection::get_and_touch(std::string document_id, std::chrono::seconds duration, const get_and_touch_options& options) const
1066
+ -> std::future<std::pair<key_value_error_context, get_result>>
1067
+ {
1068
+ auto barrier = std::make_shared<std::promise<std::pair<key_value_error_context, get_result>>>();
1069
+ auto future = barrier->get_future();
1070
+ get_and_touch(std::move(document_id), duration, options, [barrier](auto ctx, auto result) {
1071
+ barrier->set_value({ std::move(ctx), std::move(result) });
1072
+ });
1073
+ return future;
1074
+ }
1075
+
1076
+ void
1077
+ collection::get_and_touch(std::string document_id,
1078
+ std::chrono::system_clock::time_point time_point,
1079
+ const get_and_touch_options& options,
1080
+ get_and_touch_handler&& handler) const
1081
+ {
1082
+ return impl_->get_and_touch(std::move(document_id), core::impl::expiry_absolute(time_point), options.build(), std::move(handler));
1083
+ }
1084
+
1085
+ auto
1086
+ collection::get_and_touch(std::string document_id,
1087
+ std::chrono::system_clock::time_point time_point,
1088
+ const get_and_touch_options& options) const -> std::future<std::pair<key_value_error_context, get_result>>
1089
+ {
1090
+ auto barrier = std::make_shared<std::promise<std::pair<key_value_error_context, get_result>>>();
1091
+ auto future = barrier->get_future();
1092
+ get_and_touch(std::move(document_id), time_point, options, [barrier](auto ctx, auto result) {
1093
+ barrier->set_value({ std::move(ctx), std::move(result) });
1094
+ });
1095
+ return future;
1096
+ }
1097
+
1098
+ void
1099
+ collection::touch(std::string document_id, std::chrono::seconds duration, const touch_options& options, touch_handler&& handler) const
1100
+ {
1101
+ return impl_->touch(std::move(document_id), core::impl::expiry_relative(duration), options.build(), std::move(handler));
1102
+ }
1103
+
1104
+ auto
1105
+ collection::touch(std::string document_id, std::chrono::seconds duration, const touch_options& options) const
1106
+ -> std::future<std::pair<key_value_error_context, result>>
1107
+ {
1108
+ auto barrier = std::make_shared<std::promise<std::pair<key_value_error_context, result>>>();
1109
+ auto future = barrier->get_future();
1110
+ touch(std::move(document_id), duration, options, [barrier](auto ctx, auto result) {
1111
+ barrier->set_value({ std::move(ctx), std::move(result) });
1112
+ });
1113
+ return future;
1114
+ }
1115
+
1116
+ void
1117
+ collection::touch(std::string document_id,
1118
+ std::chrono::system_clock::time_point time_point,
1119
+ const touch_options& options,
1120
+ touch_handler&& handler) const
1121
+ {
1122
+ return impl_->touch(std::move(document_id), core::impl::expiry_absolute(time_point), options.build(), std::move(handler));
1123
+ }
1124
+
1125
+ auto
1126
+ collection::touch(std::string document_id, std::chrono::system_clock::time_point time_point, const touch_options& options) const
1127
+ -> std::future<std::pair<key_value_error_context, result>>
1128
+ {
1129
+ auto barrier = std::make_shared<std::promise<std::pair<key_value_error_context, result>>>();
1130
+ auto future = barrier->get_future();
1131
+ touch(std::move(document_id), time_point, options, [barrier](auto ctx, auto result) {
1132
+ barrier->set_value({ std::move(ctx), std::move(result) });
1133
+ });
1134
+ return future;
1135
+ }
1136
+
1137
+ void
1138
+ collection::get_any_replica(std::string document_id, const get_any_replica_options& options, get_any_replica_handler&& handler) const
1139
+ {
1140
+ return impl_->get_any_replica(std::move(document_id), options.build(), std::move(handler));
1141
+ }
1142
+
1143
+ auto
1144
+ collection::get_any_replica(std::string document_id, const get_any_replica_options& options) const
1145
+ -> std::future<std::pair<key_value_error_context, get_replica_result>>
1146
+ {
1147
+ auto barrier = std::make_shared<std::promise<std::pair<key_value_error_context, get_replica_result>>>();
1148
+ auto future = barrier->get_future();
1149
+ get_any_replica(std::move(document_id), options, [barrier](auto ctx, auto result) {
1150
+ barrier->set_value({ std::move(ctx), std::move(result) });
1151
+ });
1152
+ return future;
1153
+ }
1154
+
1155
+ void
1156
+ collection::get_all_replicas(std::string document_id, const get_all_replicas_options& options, get_all_replicas_handler&& handler) const
1157
+ {
1158
+ return impl_->get_all_replicas(std::move(document_id), options.build(), std::move(handler));
1159
+ }
1160
+
1161
+ auto
1162
+ collection::get_all_replicas(std::string document_id, const get_all_replicas_options& options) const
1163
+ -> std::future<std::pair<key_value_error_context, get_all_replicas_result>>
1164
+ {
1165
+ auto barrier = std::make_shared<std::promise<std::pair<key_value_error_context, get_all_replicas_result>>>();
1166
+ auto future = barrier->get_future();
1167
+ get_all_replicas(std::move(document_id), options, [barrier](auto ctx, auto result) {
1168
+ barrier->set_value({ std::move(ctx), std::move(result) });
1169
+ });
1170
+ return future;
1171
+ }
1172
+
1173
+ void
1174
+ collection::remove(std::string document_id, const remove_options& options, remove_handler&& handler) const
1175
+ {
1176
+ return impl_->remove(std::move(document_id), options.build(), std::move(handler));
1177
+ }
1178
+
1179
+ auto
1180
+ collection::remove(std::string document_id, const remove_options& options) const
1181
+ -> std::future<std::pair<key_value_error_context, mutation_result>>
1182
+ {
1183
+ auto barrier = std::make_shared<std::promise<std::pair<key_value_error_context, mutation_result>>>();
1184
+ auto future = barrier->get_future();
1185
+ remove(std::move(document_id), options, [barrier](auto ctx, auto result) {
1186
+ barrier->set_value({ std::move(ctx), std::move(result) });
1187
+ });
1188
+ return future;
1189
+ }
1190
+
1191
+ void
1192
+ collection::mutate_in(std::string document_id,
1193
+ const mutate_in_specs& specs,
1194
+ const mutate_in_options& options,
1195
+ mutate_in_handler&& handler) const
1196
+ {
1197
+ return impl_->mutate_in(std::move(document_id), specs.specs(), options.build(), std::move(handler));
1198
+ }
1199
+
1200
+ auto
1201
+ collection::mutate_in(std::string document_id, const mutate_in_specs& specs, const mutate_in_options& options) const
1202
+ -> std::future<std::pair<subdocument_error_context, mutate_in_result>>
1203
+ {
1204
+ auto barrier = std::make_shared<std::promise<std::pair<subdocument_error_context, mutate_in_result>>>();
1205
+ auto future = barrier->get_future();
1206
+ mutate_in(std::move(document_id), specs, options, [barrier](auto ctx, auto result) {
1207
+ barrier->set_value({ std::move(ctx), std::move(result) });
1208
+ });
1209
+ return future;
1210
+ }
1211
+
1212
+ void
1213
+ collection::lookup_in(std::string document_id,
1214
+ const lookup_in_specs& specs,
1215
+ const lookup_in_options& options,
1216
+ lookup_in_handler&& handler) const
1217
+ {
1218
+ return impl_->lookup_in(std::move(document_id), specs.specs(), options.build(), std::move(handler));
1219
+ }
1220
+
1221
+ auto
1222
+ collection::lookup_in(std::string document_id, const lookup_in_specs& specs, const lookup_in_options& options) const
1223
+ -> std::future<std::pair<subdocument_error_context, lookup_in_result>>
1224
+ {
1225
+ auto barrier = std::make_shared<std::promise<std::pair<subdocument_error_context, lookup_in_result>>>();
1226
+ auto future = barrier->get_future();
1227
+ lookup_in(std::move(document_id), specs, options, [barrier](auto ctx, auto result) {
1228
+ barrier->set_value({ std::move(ctx), std::move(result) });
1229
+ });
1230
+ return future;
1231
+ }
1232
+
1233
+ void
1234
+ collection::lookup_in_all_replicas(std::string document_id,
1235
+ const lookup_in_specs& specs,
1236
+ const lookup_in_all_replicas_options& options,
1237
+ lookup_in_all_replicas_handler&& handler) const
1238
+ {
1239
+ return impl_->lookup_in_all_replicas(std::move(document_id), specs.specs(), options.build(), std::move(handler));
1240
+ }
1241
+
1242
+ auto
1243
+ collection::lookup_in_all_replicas(std::string document_id,
1244
+ const lookup_in_specs& specs,
1245
+ const lookup_in_all_replicas_options& options) const
1246
+ -> std::future<std::pair<subdocument_error_context, lookup_in_all_replicas_result>>
1247
+ {
1248
+ auto barrier = std::make_shared<std::promise<std::pair<subdocument_error_context, lookup_in_all_replicas_result>>>();
1249
+ auto future = barrier->get_future();
1250
+ lookup_in_all_replicas(std::move(document_id), specs, options, [barrier](auto ctx, auto result) {
1251
+ barrier->set_value({ std::move(ctx), std::move(result) });
1252
+ });
1253
+ return future;
1254
+ }
1255
+
1256
+ void
1257
+ collection::lookup_in_any_replica(std::string document_id,
1258
+ const lookup_in_specs& specs,
1259
+ const lookup_in_any_replica_options& options,
1260
+ lookup_in_any_replica_handler&& handler) const
1261
+ {
1262
+ return impl_->lookup_in_any_replica(std::move(document_id), specs.specs(), options.build(), std::move(handler));
1263
+ }
1264
+
1265
+ auto
1266
+ collection::lookup_in_any_replica(std::string document_id, const lookup_in_specs& specs, const lookup_in_any_replica_options& options) const
1267
+ -> std::future<std::pair<subdocument_error_context, lookup_in_replica_result>>
1268
+ {
1269
+ auto barrier = std::make_shared<std::promise<std::pair<subdocument_error_context, lookup_in_replica_result>>>();
1270
+ auto future = barrier->get_future();
1271
+ lookup_in_any_replica(std::move(document_id), specs, options, [barrier](auto ctx, auto result) {
1272
+ barrier->set_value({ std::move(ctx), std::move(result) });
1273
+ });
1274
+ return future;
1275
+ }
1276
+
1277
+ void
1278
+ collection::get_and_lock(std::string document_id,
1279
+ std::chrono::seconds lock_duration,
1280
+ const get_and_lock_options& options,
1281
+ get_and_lock_handler&& handler) const
1282
+ {
1283
+ return impl_->get_and_lock(std::move(document_id), lock_duration, options.build(), std::move(handler));
1284
+ }
1285
+
1286
+ auto
1287
+ collection::get_and_lock(std::string document_id, std::chrono::seconds lock_duration, const get_and_lock_options& options) const
1288
+ -> std::future<std::pair<key_value_error_context, get_result>>
1289
+ {
1290
+ auto barrier = std::make_shared<std::promise<std::pair<key_value_error_context, get_result>>>();
1291
+ auto future = barrier->get_future();
1292
+ get_and_lock(std::move(document_id), lock_duration, options, [barrier](auto ctx, auto result) {
1293
+ barrier->set_value({ std::move(ctx), std::move(result) });
1294
+ });
1295
+ return future;
1296
+ }
1297
+
1298
+ void
1299
+ collection::unlock(std::string document_id, couchbase::cas cas, const unlock_options& options, unlock_handler&& handler) const
1300
+ {
1301
+ return impl_->unlock(std::move(document_id), cas, options.build(), std::move(handler));
1302
+ }
1303
+
1304
+ auto
1305
+ collection::unlock(std::string document_id, couchbase::cas cas, const unlock_options& options) const -> std::future<key_value_error_context>
1306
+ {
1307
+ auto barrier = std::make_shared<std::promise<key_value_error_context>>();
1308
+ auto future = barrier->get_future();
1309
+ unlock(std::move(document_id), cas, options, [barrier](auto ctx) { barrier->set_value({ std::move(ctx) }); });
1310
+ return future;
1311
+ }
1312
+
1313
+ void
1314
+ collection::exists(std::string document_id, const exists_options& options, exists_handler&& handler) const
1315
+ {
1316
+ return impl_->exists(std::move(document_id), options.build(), std::move(handler));
1317
+ }
1318
+
1319
+ auto
1320
+ collection::exists(std::string document_id, const exists_options& options) const
1321
+ -> std::future<std::pair<key_value_error_context, exists_result>>
1322
+ {
1323
+ auto barrier = std::make_shared<std::promise<std::pair<key_value_error_context, exists_result>>>();
1324
+ auto future = barrier->get_future();
1325
+ exists(std::move(document_id), options, [barrier](auto ctx, auto result) {
1326
+ barrier->set_value({ std::move(ctx), std::move(result) });
1327
+ });
1328
+ return future;
1329
+ }
1330
+
1331
+ void
1332
+ collection::upsert(std::string document_id, codec::encoded_value document, const upsert_options& options, upsert_handler&& handler) const
1333
+ {
1334
+ return impl_->upsert(std::move(document_id), std::move(document), options.build(), std::move(handler));
1335
+ }
1336
+
1337
+ auto
1338
+ collection::upsert(std::string document_id, codec::encoded_value document, const upsert_options& options) const
1339
+ -> std::future<std::pair<key_value_error_context, mutation_result>>
1340
+ {
1341
+ auto barrier = std::make_shared<std::promise<std::pair<key_value_error_context, mutation_result>>>();
1342
+ auto future = barrier->get_future();
1343
+ upsert(std::move(document_id), std::move(document), options, [barrier](auto ctx, auto result) {
1344
+ barrier->set_value({ std::move(ctx), std::move(result) });
1345
+ });
1346
+ return future;
1347
+ }
1348
+
1349
+ void
1350
+ collection::insert(std::string document_id, codec::encoded_value document, const insert_options& options, insert_handler&& handler) const
1351
+ {
1352
+ return impl_->insert(std::move(document_id), std::move(document), options.build(), std::move(handler));
1353
+ }
1354
+
1355
+ auto
1356
+ collection::insert(std::string document_id, codec::encoded_value document, const insert_options& options) const
1357
+ -> std::future<std::pair<key_value_error_context, mutation_result>>
1358
+ {
1359
+ auto barrier = std::make_shared<std::promise<std::pair<key_value_error_context, mutation_result>>>();
1360
+ auto future = barrier->get_future();
1361
+ insert(std::move(document_id), std::move(document), options, [barrier](auto ctx, auto result) {
1362
+ barrier->set_value({ std::move(ctx), std::move(result) });
1363
+ });
1364
+ return future;
1365
+ }
1366
+
1367
+ void
1368
+ collection::replace(std::string document_id, codec::encoded_value document, const replace_options& options, replace_handler&& handler) const
1369
+ {
1370
+ return impl_->replace(std::move(document_id), std::move(document), options.build(), std::move(handler));
1371
+ }
1372
+
1373
+ auto
1374
+ collection::replace(std::string document_id, codec::encoded_value document, const replace_options& options) const
1375
+ -> std::future<std::pair<key_value_error_context, mutation_result>>
1376
+ {
1377
+ auto barrier = std::make_shared<std::promise<std::pair<key_value_error_context, mutation_result>>>();
1378
+ auto future = barrier->get_future();
1379
+ replace(std::move(document_id), std::move(document), options, [barrier](auto ctx, auto result) {
1380
+ barrier->set_value({ std::move(ctx), std::move(result) });
1381
+ });
1382
+ return future;
1383
+ }
1384
+ } // namespace couchbase