couchbase 3.4.2 → 3.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/ext/couchbase/CMakeLists.txt +71 -7
  4. data/ext/couchbase/cmake/Documentation.cmake +0 -1
  5. data/ext/couchbase/cmake/OpenSSL.cmake +98 -3
  6. data/ext/couchbase/cmake/Testing.cmake +12 -4
  7. data/ext/couchbase/cmake/build_config.hxx.in +3 -0
  8. data/ext/couchbase/core/bucket.cxx +183 -151
  9. data/ext/couchbase/core/bucket.hxx +23 -1
  10. data/ext/couchbase/core/cluster.hxx +51 -13
  11. data/ext/couchbase/core/cluster_options.cxx +2 -2
  12. data/ext/couchbase/core/cluster_options.hxx +7 -6
  13. data/ext/couchbase/core/cluster_options_fwd.hxx +26 -0
  14. data/ext/couchbase/core/config_profile.hxx +1 -54
  15. data/ext/couchbase/core/config_profiles.cxx +79 -0
  16. data/ext/couchbase/core/config_profiles.hxx +56 -0
  17. data/ext/couchbase/core/crud_component.cxx +51 -22
  18. data/ext/couchbase/core/error_context/key_value.cxx +2 -1
  19. data/ext/couchbase/core/error_context/key_value.hxx +10 -12
  20. data/ext/couchbase/core/error_context/search.hxx +1 -1
  21. data/ext/couchbase/core/impl/analytics.cxx +1 -0
  22. data/ext/couchbase/core/impl/boolean_field_query.cxx +40 -0
  23. data/ext/couchbase/core/impl/boolean_query.cxx +62 -0
  24. data/ext/couchbase/core/impl/build_deferred_query_indexes.cxx +115 -50
  25. data/ext/couchbase/core/impl/cluster.cxx +8 -0
  26. data/ext/couchbase/core/impl/conjunction_query.cxx +51 -0
  27. data/ext/couchbase/core/impl/create_bucket.cxx +155 -0
  28. data/ext/couchbase/core/impl/create_query_index.cxx +172 -59
  29. data/ext/couchbase/core/impl/date_range.cxx +89 -0
  30. data/ext/couchbase/core/impl/date_range_facet.cxx +54 -0
  31. data/ext/couchbase/core/impl/date_range_facet_result.cxx +64 -0
  32. data/ext/couchbase/core/impl/date_range_query.cxx +125 -0
  33. data/ext/couchbase/core/impl/disjunction_query.cxx +51 -0
  34. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +2 -1
  35. data/ext/couchbase/core/impl/drop_bucket.cxx +66 -0
  36. data/ext/couchbase/core/impl/drop_query_index.cxx +138 -59
  37. data/ext/couchbase/core/impl/encoded_search_facet.hxx +29 -0
  38. data/ext/couchbase/core/impl/encoded_search_query.hxx +29 -0
  39. data/ext/couchbase/core/impl/encoded_search_sort.hxx +29 -0
  40. data/ext/couchbase/core/impl/flush_bucket.cxx +66 -0
  41. data/ext/couchbase/core/impl/geo_bounding_box_query.cxx +46 -0
  42. data/ext/couchbase/core/impl/geo_distance_query.cxx +43 -0
  43. data/ext/couchbase/core/impl/geo_polygon_query.cxx +46 -0
  44. data/ext/couchbase/core/impl/get_all_buckets.cxx +163 -0
  45. data/ext/couchbase/core/impl/get_all_query_indexes.cxx +67 -37
  46. data/ext/couchbase/core/impl/get_bucket.cxx +153 -0
  47. data/ext/couchbase/core/impl/internal_date_range_facet_result.cxx +80 -0
  48. data/ext/couchbase/core/impl/internal_date_range_facet_result.hxx +48 -0
  49. data/ext/couchbase/core/impl/internal_manager_error_context.cxx +113 -0
  50. data/ext/couchbase/core/impl/internal_manager_error_context.hxx +60 -0
  51. data/ext/couchbase/core/impl/internal_numeric_range_facet_result.cxx +80 -0
  52. data/ext/couchbase/core/impl/internal_numeric_range_facet_result.hxx +48 -0
  53. data/ext/couchbase/core/impl/internal_search_error_context.cxx +141 -0
  54. data/ext/couchbase/core/impl/internal_search_error_context.hxx +61 -0
  55. data/ext/couchbase/core/impl/internal_search_meta_data.cxx +60 -0
  56. data/ext/couchbase/core/impl/internal_search_meta_data.hxx +41 -0
  57. data/ext/couchbase/core/impl/internal_search_result.cxx +84 -0
  58. data/ext/couchbase/core/impl/internal_search_result.hxx +43 -0
  59. data/ext/couchbase/core/impl/internal_search_row.cxx +82 -0
  60. data/ext/couchbase/core/impl/internal_search_row.hxx +56 -0
  61. data/ext/couchbase/core/impl/internal_search_row_location.hxx +32 -0
  62. data/ext/couchbase/core/impl/internal_search_row_locations.cxx +137 -0
  63. data/ext/couchbase/core/impl/internal_search_row_locations.hxx +45 -0
  64. data/ext/couchbase/core/impl/internal_term_facet_result.cxx +80 -0
  65. data/ext/couchbase/core/impl/internal_term_facet_result.hxx +48 -0
  66. data/ext/couchbase/core/impl/key_value_error_category.cxx +2 -4
  67. data/ext/couchbase/core/impl/key_value_error_context.cxx +98 -0
  68. data/ext/couchbase/core/impl/lookup_in.cxx +1 -0
  69. data/ext/couchbase/core/impl/lookup_in_all_replicas.cxx +176 -0
  70. data/ext/couchbase/core/impl/lookup_in_all_replicas.hxx +80 -0
  71. data/ext/couchbase/core/impl/lookup_in_any_replica.cxx +167 -0
  72. data/ext/couchbase/core/impl/lookup_in_any_replica.hxx +75 -0
  73. data/ext/couchbase/core/impl/lookup_in_replica.cxx +97 -0
  74. data/ext/couchbase/core/impl/lookup_in_replica.hxx +67 -0
  75. data/ext/couchbase/core/impl/manager_error_context.cxx +100 -0
  76. data/ext/couchbase/core/impl/match_all_query.cxx +35 -0
  77. data/ext/couchbase/core/impl/match_none_query.cxx +35 -0
  78. data/ext/couchbase/core/impl/match_phrase_query.cxx +43 -0
  79. data/ext/couchbase/core/impl/match_query.cxx +59 -0
  80. data/ext/couchbase/core/impl/numeric_range.cxx +49 -0
  81. data/ext/couchbase/core/impl/numeric_range_facet.cxx +54 -0
  82. data/ext/couchbase/core/impl/numeric_range_facet_result.cxx +64 -0
  83. data/ext/couchbase/core/impl/numeric_range_query.cxx +56 -0
  84. data/ext/couchbase/core/impl/phrase_query.cxx +42 -0
  85. data/ext/couchbase/core/impl/prefix_query.cxx +40 -0
  86. data/ext/couchbase/core/impl/query.cxx +1 -0
  87. data/ext/couchbase/core/impl/query_error_context.cxx +75 -0
  88. data/ext/couchbase/core/impl/query_string_query.cxx +37 -0
  89. data/ext/couchbase/core/impl/regexp_query.cxx +40 -0
  90. data/ext/couchbase/core/impl/search.cxx +191 -0
  91. data/ext/couchbase/core/impl/search_error_context.cxx +147 -0
  92. data/ext/couchbase/core/impl/search_meta_data.cxx +46 -0
  93. data/ext/couchbase/core/impl/search_result.cxx +66 -0
  94. data/ext/couchbase/core/impl/search_row.cxx +74 -0
  95. data/ext/couchbase/core/impl/search_row_location.cxx +64 -0
  96. data/ext/couchbase/core/impl/search_row_locations.cxx +66 -0
  97. data/ext/couchbase/core/impl/search_sort_field.cxx +104 -0
  98. data/ext/couchbase/core/impl/search_sort_id.cxx +43 -0
  99. data/ext/couchbase/core/impl/search_sort_score.cxx +43 -0
  100. data/ext/couchbase/core/impl/term_facet.cxx +36 -0
  101. data/ext/couchbase/core/impl/term_facet_result.cxx +64 -0
  102. data/ext/couchbase/core/impl/term_query.cxx +56 -0
  103. data/ext/couchbase/core/impl/term_range_query.cxx +57 -0
  104. data/ext/couchbase/core/impl/update_bucket.cxx +130 -0
  105. data/ext/couchbase/core/impl/watch_query_indexes.cxx +53 -29
  106. data/ext/couchbase/core/impl/wildcard_query.cxx +40 -0
  107. data/ext/couchbase/core/io/dns_client.cxx +111 -40
  108. data/ext/couchbase/core/io/dns_config.cxx +5 -4
  109. data/ext/couchbase/core/io/http_context.hxx +1 -1
  110. data/ext/couchbase/core/io/http_session.hxx +34 -1
  111. data/ext/couchbase/core/io/http_session_manager.hxx +5 -3
  112. data/ext/couchbase/core/io/mcbp_command.hxx +9 -2
  113. data/ext/couchbase/core/io/mcbp_session.cxx +106 -42
  114. data/ext/couchbase/core/io/mcbp_session.hxx +4 -3
  115. data/ext/couchbase/core/io/retry_orchestrator.hxx +3 -2
  116. data/ext/couchbase/core/json_string.hxx +5 -0
  117. data/ext/couchbase/core/logger/custom_rotating_file_sink.cxx +1 -1
  118. data/ext/couchbase/core/logger/logger.cxx +80 -20
  119. data/ext/couchbase/core/logger/logger.hxx +31 -0
  120. data/ext/couchbase/core/meta/features.hxx +25 -0
  121. data/ext/couchbase/core/meta/version.cxx +18 -4
  122. data/ext/couchbase/core/mozilla_ca_bundle.hxx +39 -0
  123. data/ext/couchbase/core/operations/document_analytics.cxx +1 -0
  124. data/ext/couchbase/core/operations/document_analytics.hxx +1 -0
  125. data/ext/couchbase/core/operations/document_append.hxx +1 -1
  126. data/ext/couchbase/core/operations/document_decrement.hxx +1 -1
  127. data/ext/couchbase/core/operations/document_exists.hxx +1 -1
  128. data/ext/couchbase/core/operations/document_get.hxx +1 -1
  129. data/ext/couchbase/core/operations/document_get_and_lock.hxx +1 -1
  130. data/ext/couchbase/core/operations/document_get_and_touch.hxx +1 -1
  131. data/ext/couchbase/core/operations/document_get_projected.hxx +1 -1
  132. data/ext/couchbase/core/operations/document_increment.hxx +1 -1
  133. data/ext/couchbase/core/operations/document_insert.hxx +1 -1
  134. data/ext/couchbase/core/operations/document_lookup_in.hxx +1 -1
  135. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +192 -0
  136. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +188 -0
  137. data/ext/couchbase/core/operations/document_mutate_in.hxx +1 -1
  138. data/ext/couchbase/core/operations/document_prepend.hxx +1 -1
  139. data/ext/couchbase/core/operations/document_query.cxx +13 -0
  140. data/ext/couchbase/core/operations/document_query.hxx +7 -0
  141. data/ext/couchbase/core/operations/document_remove.hxx +1 -1
  142. data/ext/couchbase/core/operations/document_replace.hxx +1 -1
  143. data/ext/couchbase/core/operations/document_search.cxx +4 -1
  144. data/ext/couchbase/core/operations/document_search.hxx +2 -1
  145. data/ext/couchbase/core/operations/document_touch.hxx +1 -1
  146. data/ext/couchbase/core/operations/document_unlock.hxx +1 -1
  147. data/ext/couchbase/core/operations/document_upsert.hxx +1 -1
  148. data/ext/couchbase/core/operations/document_view.hxx +1 -0
  149. data/ext/couchbase/core/operations.hxx +2 -0
  150. data/ext/couchbase/core/origin.cxx +270 -0
  151. data/ext/couchbase/core/origin.hxx +2 -0
  152. data/ext/couchbase/core/protocol/client_request.hxx +11 -2
  153. data/ext/couchbase/core/protocol/client_response.hxx +1 -0
  154. data/ext/couchbase/core/protocol/cmd_hello.hxx +1 -0
  155. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +107 -0
  156. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.hxx +137 -0
  157. data/ext/couchbase/core/protocol/hello_feature.hxx +6 -0
  158. data/ext/couchbase/core/protocol/hello_feature_fmt.hxx +3 -0
  159. data/ext/couchbase/core/protocol/status.cxx +2 -2
  160. data/ext/couchbase/core/public_fwd.hxx +21 -0
  161. data/ext/couchbase/core/range_scan_options.cxx +3 -27
  162. data/ext/couchbase/core/range_scan_options.hxx +13 -17
  163. data/ext/couchbase/core/range_scan_orchestrator.cxx +388 -170
  164. data/ext/couchbase/core/range_scan_orchestrator.hxx +13 -2
  165. data/ext/couchbase/core/range_scan_orchestrator_options.hxx +5 -3
  166. data/ext/couchbase/core/scan_options.hxx +0 -19
  167. data/ext/couchbase/core/scan_result.cxx +19 -5
  168. data/ext/couchbase/core/scan_result.hxx +5 -2
  169. data/ext/couchbase/core/timeout_defaults.hxx +2 -3
  170. data/ext/couchbase/core/tls_verify_mode.hxx +26 -0
  171. data/ext/couchbase/core/topology/capabilities.hxx +3 -0
  172. data/ext/couchbase/core/topology/capabilities_fmt.hxx +8 -0
  173. data/ext/couchbase/core/topology/collections_manifest_fmt.hxx +1 -1
  174. data/ext/couchbase/core/topology/configuration.cxx +15 -2
  175. data/ext/couchbase/core/topology/configuration.hxx +20 -1
  176. data/ext/couchbase/core/topology/configuration_json.hxx +6 -1
  177. data/ext/couchbase/core/transactions/attempt_context_testing_hooks.cxx +93 -0
  178. data/ext/couchbase/core/transactions/attempt_context_testing_hooks.hxx +48 -75
  179. data/ext/couchbase/core/transactions/cleanup_testing_hooks.cxx +52 -0
  180. data/ext/couchbase/core/transactions/cleanup_testing_hooks.hxx +17 -31
  181. data/ext/couchbase/core/transactions/exceptions.hxx +12 -9
  182. data/ext/couchbase/core/utils/connection_string.cxx +75 -43
  183. data/ext/couchbase/core/utils/connection_string.hxx +1 -0
  184. data/ext/couchbase/core/utils/json.cxx +4 -1
  185. data/ext/couchbase/couchbase/analytics_error_context.hxx +1 -1
  186. data/ext/couchbase/couchbase/behavior_options.hxx +27 -1
  187. data/ext/couchbase/couchbase/boolean_field_query.hxx +77 -0
  188. data/ext/couchbase/couchbase/boolean_query.hxx +223 -0
  189. data/ext/couchbase/couchbase/bucket_manager.hxx +135 -0
  190. data/ext/couchbase/couchbase/build_query_index_options.hxx +0 -30
  191. data/ext/couchbase/couchbase/cluster.hxx +56 -1
  192. data/ext/couchbase/couchbase/collection.hxx +111 -0
  193. data/ext/couchbase/couchbase/collection_query_index_manager.hxx +7 -48
  194. data/ext/couchbase/couchbase/conjunction_query.hxx +88 -0
  195. data/ext/couchbase/couchbase/create_bucket_options.hxx +41 -0
  196. data/ext/couchbase/couchbase/create_primary_query_index_options.hxx +0 -29
  197. data/ext/couchbase/couchbase/create_query_index_options.hxx +0 -33
  198. data/ext/couchbase/couchbase/date_range.hxx +69 -0
  199. data/ext/couchbase/couchbase/date_range_facet.hxx +56 -0
  200. data/ext/couchbase/couchbase/date_range_facet_result.hxx +55 -0
  201. data/ext/couchbase/couchbase/date_range_query.hxx +265 -0
  202. data/ext/couchbase/couchbase/disjunction_query.hxx +109 -0
  203. data/ext/couchbase/couchbase/doc_id_query.hxx +111 -0
  204. data/ext/couchbase/couchbase/drop_bucket_options.hxx +41 -0
  205. data/ext/couchbase/couchbase/drop_primary_query_index_options.hxx +0 -30
  206. data/ext/couchbase/couchbase/drop_query_index_options.hxx +0 -31
  207. data/ext/couchbase/couchbase/error_codes.hxx +1 -2
  208. data/ext/couchbase/couchbase/error_context.hxx +17 -8
  209. data/ext/couchbase/couchbase/flush_bucket_options.hxx +41 -0
  210. data/ext/couchbase/couchbase/fmt/analytics_scan_consistency.hxx +52 -0
  211. data/ext/couchbase/{core/topology/error_map_fmt.hxx → couchbase/fmt/key_value_error_map_attribute.hxx} +21 -21
  212. data/ext/couchbase/couchbase/fmt/search_scan_consistency.hxx +49 -0
  213. data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +107 -0
  214. data/ext/couchbase/couchbase/geo_distance_query.hxx +109 -0
  215. data/ext/couchbase/couchbase/geo_point.hxx +32 -0
  216. data/ext/couchbase/couchbase/geo_polygon_query.hxx +85 -0
  217. data/ext/couchbase/couchbase/get_all_buckets_options.hxx +44 -0
  218. data/ext/couchbase/couchbase/get_all_query_indexes_options.hxx +0 -30
  219. data/ext/couchbase/couchbase/get_and_lock_options.hxx +2 -2
  220. data/ext/couchbase/couchbase/get_and_touch_options.hxx +2 -2
  221. data/ext/couchbase/couchbase/get_bucket_options.hxx +43 -0
  222. data/ext/couchbase/couchbase/get_options.hxx +2 -2
  223. data/ext/couchbase/couchbase/highlight_style.hxx +45 -0
  224. data/ext/couchbase/couchbase/insert_options.hxx +3 -3
  225. data/ext/couchbase/couchbase/key_value_error_context.hxx +7 -2
  226. data/ext/couchbase/couchbase/lookup_in_all_replicas_options.hxx +109 -0
  227. data/ext/couchbase/couchbase/lookup_in_any_replica_options.hxx +101 -0
  228. data/ext/couchbase/couchbase/lookup_in_options.hxx +2 -2
  229. data/ext/couchbase/couchbase/lookup_in_replica_result.hxx +74 -0
  230. data/ext/couchbase/couchbase/lookup_in_result.hxx +26 -0
  231. data/ext/couchbase/couchbase/management/bucket_settings.hxx +116 -0
  232. data/ext/couchbase/couchbase/manager_error_context.hxx +29 -53
  233. data/ext/couchbase/couchbase/match_all_query.hxx +43 -0
  234. data/ext/couchbase/couchbase/match_none_query.hxx +43 -0
  235. data/ext/couchbase/couchbase/match_operator.hxx +45 -0
  236. data/ext/couchbase/couchbase/match_phrase_query.hxx +108 -0
  237. data/ext/couchbase/couchbase/match_query.hxx +163 -0
  238. data/ext/couchbase/couchbase/mutate_in_options.hxx +2 -2
  239. data/ext/couchbase/couchbase/numeric_range.hxx +58 -0
  240. data/ext/couchbase/couchbase/numeric_range_facet.hxx +56 -0
  241. data/ext/couchbase/couchbase/numeric_range_facet_result.hxx +55 -0
  242. data/ext/couchbase/couchbase/numeric_range_query.hxx +143 -0
  243. data/ext/couchbase/couchbase/phrase_query.hxx +93 -0
  244. data/ext/couchbase/couchbase/prefix_query.hxx +82 -0
  245. data/ext/couchbase/couchbase/query_error_context.hxx +3 -1
  246. data/ext/couchbase/couchbase/query_index_manager.hxx +16 -83
  247. data/ext/couchbase/couchbase/query_options.hxx +18 -0
  248. data/ext/couchbase/couchbase/query_string_query.hxx +72 -0
  249. data/ext/couchbase/couchbase/regexp_query.hxx +82 -0
  250. data/ext/couchbase/couchbase/remove_options.hxx +2 -2
  251. data/ext/couchbase/couchbase/replace_options.hxx +3 -3
  252. data/ext/couchbase/couchbase/scope.hxx +40 -0
  253. data/ext/couchbase/couchbase/search_date_range.hxx +68 -0
  254. data/ext/couchbase/couchbase/search_error_context.hxx +138 -0
  255. data/ext/couchbase/couchbase/search_facet.hxx +60 -0
  256. data/ext/couchbase/couchbase/search_facet_result.hxx +50 -0
  257. data/ext/couchbase/couchbase/search_meta_data.hxx +85 -0
  258. data/ext/couchbase/couchbase/search_metrics.hxx +127 -0
  259. data/ext/couchbase/couchbase/search_numeric_range.hxx +69 -0
  260. data/ext/couchbase/couchbase/search_options.hxx +509 -0
  261. data/ext/couchbase/couchbase/search_query.hxx +69 -0
  262. data/ext/couchbase/couchbase/search_result.hxx +77 -0
  263. data/ext/couchbase/couchbase/search_row.hxx +104 -0
  264. data/ext/couchbase/couchbase/search_row_location.hxx +55 -0
  265. data/ext/couchbase/couchbase/search_row_locations.hxx +86 -0
  266. data/ext/couchbase/couchbase/search_scan_consistency.hxx +34 -0
  267. data/ext/couchbase/couchbase/search_sort.hxx +58 -0
  268. data/ext/couchbase/couchbase/search_sort_field.hxx +117 -0
  269. data/ext/couchbase/couchbase/search_sort_field_missing.hxx +26 -0
  270. data/ext/couchbase/couchbase/search_sort_field_mode.hxx +27 -0
  271. data/ext/couchbase/couchbase/search_sort_field_type.hxx +28 -0
  272. data/ext/couchbase/couchbase/search_sort_id.hxx +60 -0
  273. data/ext/couchbase/couchbase/search_sort_score.hxx +60 -0
  274. data/ext/couchbase/couchbase/search_term_range.hxx +51 -0
  275. data/ext/couchbase/couchbase/security_options.hxx +18 -0
  276. data/ext/couchbase/couchbase/subdocument_error_context.hxx +4 -2
  277. data/ext/couchbase/couchbase/term_facet.hxx +48 -0
  278. data/ext/couchbase/couchbase/term_facet_result.hxx +55 -0
  279. data/ext/couchbase/couchbase/term_query.hxx +151 -0
  280. data/ext/couchbase/couchbase/term_range_query.hxx +142 -0
  281. data/ext/couchbase/couchbase/touch_options.hxx +2 -2
  282. data/ext/couchbase/couchbase/tracing/request_span.hxx +63 -0
  283. data/ext/couchbase/couchbase/tracing/request_tracer.hxx +2 -40
  284. data/ext/couchbase/couchbase/transactions/async_attempt_context.hxx +83 -4
  285. data/ext/couchbase/couchbase/transactions/attempt_context.hxx +67 -0
  286. data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +2 -0
  287. data/ext/couchbase/couchbase/transactions/transaction_keyspace.hxx +11 -1
  288. data/ext/couchbase/couchbase/transactions/transaction_options.hxx +79 -8
  289. data/ext/couchbase/couchbase/transactions/transaction_query_options.hxx +128 -15
  290. data/ext/couchbase/couchbase/transactions/transaction_query_result.hxx +4 -0
  291. data/ext/couchbase/couchbase/transactions/transaction_result.hxx +1 -1
  292. data/ext/couchbase/couchbase/transactions/transactions_cleanup_config.hxx +5 -3
  293. data/ext/couchbase/couchbase/transactions/transactions_config.hxx +9 -5
  294. data/ext/couchbase/couchbase/transactions/transactions_query_config.hxx +6 -3
  295. data/ext/couchbase/couchbase/transactions.hxx +34 -1
  296. data/ext/couchbase/couchbase/unlock_options.hxx +2 -2
  297. data/ext/couchbase/couchbase/update_bucket_options.hxx +41 -0
  298. data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
  299. data/ext/couchbase/couchbase/watch_query_indexes_options.hxx +0 -31
  300. data/ext/couchbase/couchbase/wildcard_query.hxx +83 -0
  301. data/ext/couchbase/test/CMakeLists.txt +8 -5
  302. data/ext/couchbase/test/benchmark_helper_integration.hxx +2 -2
  303. data/ext/couchbase/test/test_helper.hxx +5 -5
  304. data/ext/couchbase/test/test_integration_analytics.cxx +28 -6
  305. data/ext/couchbase/test/test_integration_collections.cxx +13 -3
  306. data/ext/couchbase/test/test_integration_connect.cxx +7 -3
  307. data/ext/couchbase/test/test_integration_crud.cxx +18 -3
  308. data/ext/couchbase/test/test_integration_diagnostics.cxx +11 -5
  309. data/ext/couchbase/test/test_integration_durability.cxx +12 -7
  310. data/ext/couchbase/test/test_integration_examples.cxx +419 -11
  311. data/ext/couchbase/test/test_integration_management.cxx +867 -368
  312. data/ext/couchbase/test/test_integration_query.cxx +87 -17
  313. data/ext/couchbase/test/test_integration_range_scan.cxx +363 -124
  314. data/ext/couchbase/test/test_integration_read_replica.cxx +48 -11
  315. data/ext/couchbase/test/test_integration_search.cxx +32 -3
  316. data/ext/couchbase/test/test_integration_subdoc.cxx +717 -11
  317. data/ext/couchbase/test/test_integration_tracer.cxx +5 -0
  318. data/ext/couchbase/test/test_integration_transcoders.cxx +13 -5
  319. data/ext/couchbase/test/{test_transaction_transaction_context.cxx → test_transaction_context.cxx} +1 -1
  320. data/ext/couchbase/test/test_transaction_examples.cxx +195 -0
  321. data/ext/couchbase/test/{test_transaction_transaction_public_async_api.cxx → test_transaction_public_async_api.cxx} +13 -12
  322. data/ext/couchbase/test/{test_transaction_transaction_public_blocking_api.cxx → test_transaction_public_blocking_api.cxx} +27 -21
  323. data/ext/couchbase/test/{test_transaction_transaction_simple.cxx → test_transaction_simple.cxx} +17 -5
  324. data/ext/couchbase/test/{test_transaction_transaction_simple_async.cxx → test_transaction_simple_async.cxx} +19 -21
  325. data/ext/couchbase/test/test_unit_config_profiles.cxx +1 -1
  326. data/ext/couchbase/test/test_unit_connection_string.cxx +29 -0
  327. data/ext/couchbase/test/test_unit_json_transcoder.cxx +4 -0
  328. data/ext/couchbase/test/test_unit_query.cxx +75 -0
  329. data/ext/couchbase/test/test_unit_search.cxx +427 -0
  330. data/ext/couchbase/test/test_unit_transaction_utils.cxx +10 -1
  331. data/ext/couchbase/test/test_unit_utils.cxx +8 -4
  332. data/ext/couchbase.cxx +641 -45
  333. data/ext/revisions.rb +3 -3
  334. data/lib/couchbase/authenticator.rb +0 -1
  335. data/lib/couchbase/cluster.rb +1 -5
  336. data/lib/couchbase/collection.rb +108 -0
  337. data/lib/couchbase/collection_options.rb +100 -0
  338. data/lib/couchbase/config_profiles.rb +1 -1
  339. data/lib/couchbase/errors.rb +5 -0
  340. data/lib/couchbase/json_transcoder.rb +12 -5
  341. data/lib/couchbase/key_value_scan.rb +125 -0
  342. data/lib/couchbase/management/collection_query_index_manager.rb +54 -15
  343. data/lib/couchbase/management/query_index_manager.rb +70 -5
  344. data/lib/couchbase/options.rb +151 -0
  345. data/lib/couchbase/raw_binary_transcoder.rb +37 -0
  346. data/lib/couchbase/raw_json_transcoder.rb +38 -0
  347. data/lib/couchbase/raw_string_transcoder.rb +40 -0
  348. data/lib/couchbase/scope.rb +1 -1
  349. data/lib/couchbase/search_options.rb +5 -0
  350. data/lib/couchbase/transcoder_flags.rb +62 -0
  351. data/lib/couchbase/utils/time.rb +14 -1
  352. data/lib/couchbase/version.rb +1 -1
  353. metadata +175 -13
  354. data/ext/couchbase/core/config_profile.cxx +0 -47
  355. data/ext/couchbase/core/impl/collection_query_index_manager.cxx +0 -93
@@ -18,6 +18,7 @@
18
18
  #include "range_scan_options.hxx"
19
19
  #include "range_scan_orchestrator_options.hxx"
20
20
  #include "scan_result.hxx"
21
+ #include "topology/configuration.hxx"
21
22
 
22
23
  #include <tl/expected.hpp>
23
24
 
@@ -34,15 +35,25 @@ namespace couchbase::core
34
35
  class agent;
35
36
  class range_scan_orchestrator_impl;
36
37
 
38
+ class scan_stream_manager
39
+ {
40
+ public:
41
+ virtual ~scan_stream_manager() = default;
42
+ virtual void stream_start_failed(std::int16_t node_id, bool fatal) = 0;
43
+ virtual void stream_start_failed_awaiting_retry(std::int16_t node_id, std::uint16_t vbucket_id) = 0;
44
+ virtual void stream_continue_failed(std::int16_t node_id, bool fatal) = 0;
45
+ virtual void stream_completed(std::int16_t node_id) = 0;
46
+ };
47
+
37
48
  class range_scan_orchestrator
38
49
  {
39
50
  public:
40
51
  range_scan_orchestrator(asio::io_context& io,
41
52
  agent kv_provider,
42
- std::size_t num_vbuckets,
53
+ topology::configuration::vbucket_map vbucket_map,
43
54
  std::string scope_name,
44
55
  std::string collection_name,
45
- std::variant<std::monostate, range_scan, sampling_scan> scan_type,
56
+ std::variant<std::monostate, range_scan, prefix_scan, sampling_scan> scan_type,
46
57
  range_scan_orchestrator_options options);
47
58
 
48
59
  auto scan() -> tl::expected<scan_result, std::error_code>;
@@ -16,6 +16,7 @@
16
16
  #pragma once
17
17
 
18
18
  #include "scan_options.hxx"
19
+ #include "timeout_defaults.hxx"
19
20
 
20
21
  #include <couchbase/mutation_token.hxx>
21
22
  #include <couchbase/retry_strategy.hxx>
@@ -40,15 +41,16 @@ namespace couchbase::core
40
41
  {
41
42
 
42
43
  struct range_scan_orchestrator_options {
44
+ static constexpr std::uint16_t default_concurrency{ 1 };
45
+
43
46
  bool ids_only{ false };
44
47
  std::optional<mutation_state> consistent_with{};
45
- scan_sort sort{ scan_sort::none };
46
48
  std::uint32_t batch_item_limit{ range_scan_continue_options::default_batch_item_limit };
47
49
  std::uint32_t batch_byte_limit{ range_scan_continue_options::default_batch_byte_limit };
48
- std::chrono::milliseconds batch_time_limit{ range_scan_continue_options::default_batch_time_limit };
50
+ std::uint16_t concurrency{ default_concurrency };
49
51
 
50
52
  std::shared_ptr<couchbase::retry_strategy> retry_strategy{ nullptr };
51
- std::chrono::milliseconds timeout{};
53
+ std::chrono::milliseconds timeout{ timeout_defaults::key_value_scan_timeout };
52
54
  std::shared_ptr<couchbase::tracing::request_span> parent_span{};
53
55
  };
54
56
  } // namespace couchbase::core
@@ -38,26 +38,7 @@ class request_span;
38
38
 
39
39
  namespace couchbase::core
40
40
  {
41
-
42
- enum class scan_sort {
43
- none,
44
- ascending,
45
- };
46
-
47
41
  struct mutation_state {
48
42
  std::vector<couchbase::mutation_token> tokens;
49
43
  };
50
-
51
- struct scan_options {
52
- bool ids_only{ false };
53
- std::optional<mutation_state> consistent_with{};
54
- scan_sort sort{ scan_sort::none };
55
- std::uint32_t batch_item_limit{ range_scan_continue_options::default_batch_item_limit };
56
- std::uint32_t batch_byte_limit{ range_scan_continue_options::default_batch_byte_limit };
57
- std::chrono::milliseconds batch_time_limit{ range_scan_continue_options::default_batch_time_limit };
58
-
59
- std::shared_ptr<couchbase::retry_strategy> retry_strategy{ nullptr };
60
- std::chrono::milliseconds timeout{};
61
- std::shared_ptr<couchbase::tracing::request_span> parent_span{};
62
- };
63
44
  } // namespace couchbase::core
@@ -32,10 +32,7 @@ class scan_result_impl
32
32
 
33
33
  [[nodiscard]] auto next() const -> tl::expected<range_scan_item, std::error_code>
34
34
  {
35
- if (auto item = iterator_->next().get(); item) {
36
- return item.value();
37
- }
38
- return tl::unexpected{ errc::key_value::range_scan_completed };
35
+ return iterator_->next().get();
39
36
  }
40
37
 
41
38
  void next(utils::movable_function<void(range_scan_item, std::error_code)> callback) const
@@ -43,6 +40,16 @@ class scan_result_impl
43
40
  return iterator_->next(std::move(callback));
44
41
  }
45
42
 
43
+ void cancel()
44
+ {
45
+ return iterator_->cancel();
46
+ }
47
+
48
+ [[nodiscard]] auto is_cancelled() -> bool
49
+ {
50
+ return iterator_->is_cancelled();
51
+ }
52
+
46
53
  private:
47
54
  std::shared_ptr<range_scan_item_iterator> iterator_;
48
55
  };
@@ -65,7 +72,14 @@ scan_result::next(utils::movable_function<void(range_scan_item, std::error_code)
65
72
  }
66
73
 
67
74
  void
68
- scan_result::cancel() const
75
+ scan_result::cancel()
76
+ {
77
+ return impl_->cancel();
78
+ }
79
+
80
+ auto
81
+ scan_result::is_cancelled() -> bool
69
82
  {
83
+ return impl_->is_cancelled();
70
84
  }
71
85
  } // namespace couchbase::core
@@ -41,8 +41,10 @@ class range_scan_item_iterator
41
41
  {
42
42
  public:
43
43
  virtual ~range_scan_item_iterator() = default;
44
- virtual auto next() -> std::future<std::optional<range_scan_item>> = 0;
44
+ virtual auto next() -> std::future<tl::expected<range_scan_item, std::error_code>> = 0;
45
45
  virtual void next(utils::movable_function<void(range_scan_item, std::error_code)> callback) = 0;
46
+ virtual void cancel() = 0;
47
+ virtual bool is_cancelled() = 0;
46
48
  };
47
49
 
48
50
  class scan_result
@@ -51,7 +53,8 @@ class scan_result
51
53
  explicit scan_result(std::shared_ptr<range_scan_item_iterator> iterator);
52
54
  [[nodiscard]] auto next() const -> tl::expected<range_scan_item, std::error_code>;
53
55
  void next(utils::movable_function<void(range_scan_item, std::error_code)> callback) const;
54
- void cancel() const;
56
+ void cancel();
57
+ [[nodiscard]] auto is_cancelled() -> bool;
55
58
 
56
59
  private:
57
60
  std::shared_ptr<scan_result_impl> impl_{};
@@ -1,6 +1,6 @@
1
1
  /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright 2020-2021 Couchbase, Inc.
3
+ * Copyright 2020-2023 Couchbase, Inc.
4
4
  *
5
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
6
  * you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@ constexpr std::chrono::milliseconds resolve_timeout{ 2'000 };
27
27
  constexpr std::chrono::milliseconds connect_timeout{ 2'000 };
28
28
  constexpr std::chrono::milliseconds key_value_timeout{ 2'500 };
29
29
  constexpr std::chrono::milliseconds key_value_durable_timeout{ 10'000 };
30
+ constexpr std::chrono::milliseconds key_value_scan_timeout{ 75'000 };
30
31
  constexpr std::chrono::milliseconds view_timeout{ 75'000 };
31
32
  constexpr std::chrono::milliseconds query_timeout{ 75'000 };
32
33
  constexpr std::chrono::milliseconds analytics_timeout{ 75'000 };
@@ -34,8 +35,6 @@ constexpr std::chrono::milliseconds search_timeout{ 75'000 };
34
35
  constexpr std::chrono::milliseconds management_timeout{ 75'000 };
35
36
  constexpr std::chrono::milliseconds eventing_timeout{ 75'000 };
36
37
 
37
- constexpr std::chrono::milliseconds range_scan_timeout{ 75'000 };
38
-
39
38
  constexpr std::chrono::milliseconds dns_srv_timeout{ 500 };
40
39
  constexpr std::chrono::milliseconds tcp_keep_alive_interval{ 60'000 };
41
40
  constexpr std::chrono::milliseconds config_poll_interval{ 2'500 };
@@ -0,0 +1,26 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020-2021 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ namespace couchbase::core
21
+ {
22
+ enum class tls_verify_mode {
23
+ none,
24
+ peer,
25
+ };
26
+ } // namespace couchbase::core
@@ -31,6 +31,8 @@ enum class bucket_capability {
31
31
  collections,
32
32
  durable_write,
33
33
  tombstoned_user_xattrs,
34
+ range_scan,
35
+ replica_read,
34
36
  };
35
37
 
36
38
  enum class cluster_capability {
@@ -39,5 +41,6 @@ enum class cluster_capability {
39
41
  n1ql_javascript_functions,
40
42
  n1ql_inline_functions,
41
43
  n1ql_enhanced_prepared_statements,
44
+ n1ql_read_from_replica,
42
45
  };
43
46
  } // namespace couchbase::core
@@ -67,6 +67,12 @@ struct fmt::formatter<couchbase::core::bucket_capability> {
67
67
  case couchbase::core::bucket_capability::tombstoned_user_xattrs:
68
68
  name = "tombstoned_user_xattrs";
69
69
  break;
70
+ case couchbase::core::bucket_capability::range_scan:
71
+ name = "range_scan";
72
+ break;
73
+ case couchbase::core::bucket_capability::replica_read:
74
+ name = "replica_read";
75
+ break;
70
76
  }
71
77
  return format_to(ctx.out(), "{}", name);
72
78
  }
@@ -100,6 +106,8 @@ struct fmt::formatter<couchbase::core::cluster_capability> {
100
106
  case couchbase::core::cluster_capability::n1ql_enhanced_prepared_statements:
101
107
  name = "n1ql_enhanced_prepared_statements";
102
108
  break;
109
+ case couchbase::core::cluster_capability::n1ql_read_from_replica:
110
+ name = "n1ql_read_from_replica";
103
111
  }
104
112
  return format_to(ctx.out(), "{}", name);
105
113
  }
@@ -47,6 +47,6 @@ struct fmt::formatter<couchbase::core::topology::collections_manifest> {
47
47
  couchbase::core::uuid::to_string(manifest.id),
48
48
  manifest.uid,
49
49
  collections.size(),
50
- utils::join_strings(collections, ", "));
50
+ couchbase::core::utils::join_strings(collections, ", "));
51
51
  }
52
52
  };
@@ -20,6 +20,8 @@
20
20
  #include "core/logger/logger.hxx"
21
21
  #include "core/service_type_fmt.hxx"
22
22
 
23
+ #include <gsl/narrow>
24
+
23
25
  #include <algorithm>
24
26
  #include <stdexcept>
25
27
 
@@ -162,9 +164,20 @@ configuration::node::endpoint(const std::string& network, service_type type, boo
162
164
  }
163
165
 
164
166
  bool
165
- configuration::has_node_with_hostname(const std::string& hostname) const
167
+ configuration::has_node(const std::string& network, service_type type, bool is_tls, const std::string& hostname, const std::string& port)
168
+ const
166
169
  {
167
- return std::any_of(nodes.begin(), nodes.end(), [&hostname](const auto& n) { return n.hostname == hostname; });
170
+ std::uint16_t port_number{ 0 };
171
+ try {
172
+ port_number = gsl::narrow_cast<std::uint16_t>(std::stoul(port, nullptr, 10));
173
+ } catch (const std::invalid_argument&) {
174
+ return false;
175
+ } catch (const std::out_of_range&) {
176
+ return false;
177
+ }
178
+ return std::any_of(nodes.begin(), nodes.end(), [&](const auto& n) {
179
+ return n.hostname_for(network) == hostname && n.port_or(network, type, is_tls, 0) == port_number;
180
+ });
168
181
  }
169
182
 
170
183
  std::string
@@ -112,6 +112,16 @@ struct configuration {
112
112
  return cluster_capabilities.find(cluster_capability::n1ql_enhanced_prepared_statements) != cluster_capabilities.end();
113
113
  }
114
114
 
115
+ [[nodiscard]] bool supports_read_from_replica() const
116
+ {
117
+ return cluster_capabilities.find(cluster_capability::n1ql_read_from_replica) != cluster_capabilities.end();
118
+ }
119
+
120
+ [[nodiscard]] bool supports_range_scan() const
121
+ {
122
+ return bucket_capabilities.find(bucket_capability::range_scan) != bucket_capabilities.end();
123
+ }
124
+
115
125
  [[nodiscard]] bool ephemeral() const
116
126
  {
117
127
  // Use bucket capabilities to identify if couchapi is missing (then its ephemeral). If its null then
@@ -119,8 +129,17 @@ struct configuration {
119
129
  return bucket_capabilities.count(couchbase::core::bucket_capability::couchapi) == 0;
120
130
  }
121
131
 
132
+ [[nodiscard]] bool supports_subdoc_read_replica() const
133
+ {
134
+ return bucket_capabilities.find(bucket_capability::replica_read) != bucket_capabilities.end();
135
+ }
136
+
122
137
  [[nodiscard]] std::size_t index_for_this_node() const;
123
- [[nodiscard]] bool has_node_with_hostname(const std::string& hostname) const;
138
+ [[nodiscard]] bool has_node(const std::string& network,
139
+ service_type type,
140
+ bool is_tls,
141
+ const std::string& hostname,
142
+ const std::string& port) const;
124
143
 
125
144
  template<typename Key>
126
145
  std::pair<std::uint16_t, std::optional<std::size_t>> map_key(const Key& key, std::size_t index)
@@ -52,7 +52,6 @@ struct traits<couchbase::core::topology::configuration> {
52
52
  }
53
53
  if (const auto& hostname = o.find("hostname"); hostname != o.end()) {
54
54
  n.hostname = hostname->second.get_string();
55
- n.hostname = n.hostname.substr(0, n.hostname.rfind(':'));
56
55
  }
57
56
  const auto& s = o.at("services");
58
57
  n.services_plain.key_value = s.template optional<std::uint16_t>("kv");
@@ -233,6 +232,10 @@ struct traits<couchbase::core::topology::configuration> {
233
232
  result.bucket_capabilities.insert(couchbase::core::bucket_capability::nodes_ext);
234
233
  } else if (name == "xattr") {
235
234
  result.bucket_capabilities.insert(couchbase::core::bucket_capability::xattr);
235
+ } else if (name == "rangeScan") {
236
+ result.bucket_capabilities.insert(couchbase::core::bucket_capability::range_scan);
237
+ } else if (name == "subdoc.ReplicaRead") {
238
+ result.bucket_capabilities.insert(couchbase::core::bucket_capability::replica_read);
236
239
  }
237
240
  }
238
241
  }
@@ -249,6 +252,8 @@ struct traits<couchbase::core::topology::configuration> {
249
252
  result.cluster_capabilities.insert(couchbase::core::cluster_capability::n1ql_inline_functions);
250
253
  } else if (name == "enhancedPreparedStatements") {
251
254
  result.cluster_capabilities.insert(couchbase::core::cluster_capability::n1ql_enhanced_prepared_statements);
255
+ } else if (name == "readFromReplica") {
256
+ result.cluster_capabilities.insert(couchbase::core::cluster_capability::n1ql_read_from_replica);
252
257
  }
253
258
  }
254
259
  }
@@ -0,0 +1,93 @@
1
+ /*
2
+ * Copyright 2021-Present Couchbase, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ #include "attempt_context_testing_hooks.hxx"
18
+
19
+ namespace couchbase::core::transactions
20
+ {
21
+ namespace
22
+ {
23
+ inline std::optional<error_class>
24
+ noop_1(attempt_context*)
25
+ {
26
+ return {};
27
+ }
28
+
29
+ inline std::optional<error_class>
30
+ noop_2(attempt_context*, const std::string&)
31
+ {
32
+ return {};
33
+ }
34
+
35
+ inline std::optional<const std::string>
36
+ noop_3(attempt_context*)
37
+ {
38
+ return {};
39
+ }
40
+
41
+ inline bool
42
+ noop_4(attempt_context*, const std::string&, std::optional<const std::string>)
43
+ {
44
+ return false;
45
+ }
46
+ } // namespace
47
+
48
+ attempt_context_testing_hooks::attempt_context_testing_hooks()
49
+ : before_atr_commit{ noop_1 }
50
+ , before_atr_commit_ambiguity_resolution{ noop_1 }
51
+ , after_atr_commit{ noop_1 }
52
+ , before_doc_committed{ noop_2 }
53
+ , before_removing_doc_during_staged_insert{ noop_2 }
54
+ , before_rollback_delete_inserted{ noop_2 }
55
+ , after_doc_committed_before_saving_cas{ noop_2 }
56
+ , after_doc_committed{ noop_2 }
57
+ , before_staged_insert{ noop_2 }
58
+ , before_staged_remove{ noop_2 }
59
+ , before_staged_replace{ noop_2 }
60
+ , before_doc_removed{ noop_2 }
61
+ , before_doc_rolled_back{ noop_2 }
62
+ , after_doc_removed_pre_retry{ noop_2 }
63
+ , after_doc_removed_post_retry{ noop_2 }
64
+ , after_get_complete{ noop_2 }
65
+ , after_staged_replace_complete_before_cas_saved{ noop_2 }
66
+ , after_staged_replace_complete{ noop_2 }
67
+ , after_staged_remove_complete{ noop_2 }
68
+ , after_staged_insert_complete{ noop_2 }
69
+ , after_rollback_replace_or_remove{ noop_2 }
70
+ , after_rollback_delete_inserted{ noop_2 }
71
+ , before_check_atr_entry_for_blocking_doc{ noop_2 }
72
+ , before_doc_get{ noop_2 }
73
+ , before_get_doc_in_exists_during_staged_insert{ noop_2 }
74
+ , before_query{ noop_2 }
75
+ , after_query{ noop_2 }
76
+ , before_remove_staged_insert{ noop_2 }
77
+ , after_remove_staged_insert{ noop_2 }
78
+ , after_docs_committed{ noop_1 }
79
+ , after_docs_removed{ noop_1 }
80
+ , after_atr_pending{ noop_1 }
81
+ , before_atr_pending{ noop_1 }
82
+ , before_atr_complete{ noop_1 }
83
+ , before_atr_rolled_back{ noop_1 }
84
+ , after_atr_complete{ noop_1 }
85
+ , before_get_atr_for_abort{ noop_1 }
86
+ , before_atr_aborted{ noop_1 }
87
+ , after_atr_aborted{ noop_1 }
88
+ , after_atr_rolled_back{ noop_1 }
89
+ , random_atr_id_for_vbucket{ noop_3 }
90
+ , has_expired_client_side{ noop_4 }
91
+ {
92
+ }
93
+ } // namespace couchbase::core::transactions
@@ -28,33 +28,6 @@ class attempt_context;
28
28
  using error_func1 = std::function<std::optional<error_class>(attempt_context*)>;
29
29
  using error_func2 = std::function<std::optional<error_class>(attempt_context*, const std::string&)>;
30
30
 
31
- namespace
32
- {
33
- std::optional<error_class>
34
- noop_1(attempt_context*)
35
- {
36
- return {};
37
- }
38
-
39
- std::optional<error_class>
40
- noop_2(attempt_context*, const std::string&)
41
- {
42
- return {};
43
- }
44
-
45
- std::optional<const std::string>
46
- noop_3(attempt_context*)
47
- {
48
- return {};
49
- }
50
-
51
- bool
52
- noop_4(attempt_context*, const std::string&, std::optional<const std::string>)
53
- {
54
- return false;
55
- }
56
- } // namespace
57
-
58
31
  static const std::string STAGE_ROLLBACK = "rollback";
59
32
  static const std::string STAGE_GET = "get";
60
33
  static const std::string STAGE_INSERT = "insert";
@@ -91,55 +64,55 @@ static const std::string STAGE_QUERY_KV_INSERT = "queryKvInsert";
91
64
  * about your use-case: we are always open to adding good ideas into the transactions library.
92
65
  */
93
66
  struct attempt_context_testing_hooks {
94
- error_func1 before_atr_commit = noop_1;
95
- error_func1 before_atr_commit_ambiguity_resolution = noop_1;
96
- error_func1 after_atr_commit = noop_1;
97
- error_func2 before_doc_committed = noop_2;
98
- error_func2 before_removing_doc_during_staged_insert = noop_2;
99
- error_func2 before_rollback_delete_inserted = noop_2;
100
- error_func2 after_doc_committed_before_saving_cas = noop_2;
101
- error_func2 after_doc_committed = noop_2;
102
- error_func2 before_staged_insert = noop_2;
103
- error_func2 before_staged_remove = noop_2;
104
- error_func2 before_staged_replace = noop_2;
105
- error_func2 before_doc_removed = noop_2;
106
- error_func2 before_doc_rolled_back = noop_2;
107
- error_func2 after_doc_removed_pre_retry = noop_2;
108
- error_func2 after_doc_removed_post_retry = noop_2;
109
- error_func2 after_get_complete = noop_2;
110
- error_func2 after_staged_replace_complete_before_cas_saved = noop_2;
111
- error_func2 after_staged_replace_complete = noop_2;
112
- error_func2 after_staged_remove_complete = noop_2;
113
- error_func2 after_staged_insert_complete = noop_2;
114
- error_func2 after_rollback_replace_or_remove = noop_2;
115
- error_func2 after_rollback_delete_inserted = noop_2;
116
- error_func2 before_check_atr_entry_for_blocking_doc = noop_2;
117
- error_func2 before_doc_get = noop_2;
118
- error_func2 before_get_doc_in_exists_during_staged_insert = noop_2;
119
- error_func2 before_query = noop_2;
120
- error_func2 after_query = noop_2;
121
- error_func2 before_remove_staged_insert = noop_2;
122
- error_func2 after_remove_staged_insert = noop_2;
123
-
124
- error_func1 after_docs_committed = noop_1;
125
- error_func1 after_docs_removed = noop_1;
126
- error_func1 after_atr_pending = noop_1;
127
- error_func1 before_atr_pending = noop_1;
128
- error_func1 before_atr_complete = noop_1;
129
- error_func1 before_atr_rolled_back = noop_1;
130
- error_func1 after_atr_complete = noop_1;
131
- error_func1 before_get_atr_for_abort = noop_1;
132
- error_func1 before_atr_aborted = noop_1;
133
- error_func1 after_atr_aborted = noop_1;
134
- error_func1 after_atr_rolled_back = noop_1;
135
-
136
- std::function<std::optional<const std::string>(attempt_context*)> random_atr_id_for_vbucket = noop_3;
137
-
138
- std::function<bool(attempt_context*, const std::string&, std::optional<const std::string>)> has_expired_client_side = noop_4;
67
+ error_func1 before_atr_commit;
68
+ error_func1 before_atr_commit_ambiguity_resolution;
69
+ error_func1 after_atr_commit;
70
+ error_func2 before_doc_committed;
71
+ error_func2 before_removing_doc_during_staged_insert;
72
+ error_func2 before_rollback_delete_inserted;
73
+ error_func2 after_doc_committed_before_saving_cas;
74
+ error_func2 after_doc_committed;
75
+ error_func2 before_staged_insert;
76
+ error_func2 before_staged_remove;
77
+ error_func2 before_staged_replace;
78
+ error_func2 before_doc_removed;
79
+ error_func2 before_doc_rolled_back;
80
+ error_func2 after_doc_removed_pre_retry;
81
+ error_func2 after_doc_removed_post_retry;
82
+ error_func2 after_get_complete;
83
+ error_func2 after_staged_replace_complete_before_cas_saved;
84
+ error_func2 after_staged_replace_complete;
85
+ error_func2 after_staged_remove_complete;
86
+ error_func2 after_staged_insert_complete;
87
+ error_func2 after_rollback_replace_or_remove;
88
+ error_func2 after_rollback_delete_inserted;
89
+ error_func2 before_check_atr_entry_for_blocking_doc;
90
+ error_func2 before_doc_get;
91
+ error_func2 before_get_doc_in_exists_during_staged_insert;
92
+ error_func2 before_query;
93
+ error_func2 after_query;
94
+ error_func2 before_remove_staged_insert;
95
+ error_func2 after_remove_staged_insert;
96
+
97
+ error_func1 after_docs_committed;
98
+ error_func1 after_docs_removed;
99
+ error_func1 after_atr_pending;
100
+ error_func1 before_atr_pending;
101
+ error_func1 before_atr_complete;
102
+ error_func1 before_atr_rolled_back;
103
+ error_func1 after_atr_complete;
104
+ error_func1 before_get_atr_for_abort;
105
+ error_func1 before_atr_aborted;
106
+ error_func1 after_atr_aborted;
107
+ error_func1 after_atr_rolled_back;
108
+
109
+ std::function<std::optional<const std::string>(attempt_context*)> random_atr_id_for_vbucket;
110
+
111
+ std::function<bool(attempt_context*, const std::string&, std::optional<const std::string>)> has_expired_client_side;
112
+
113
+ attempt_context_testing_hooks();
139
114
 
140
115
  // needed for unique_ptr<attempt_context_testing_hooks> in transaction_config, with a forward declaration.
141
- ~attempt_context_testing_hooks()
142
- {
143
- }
116
+ ~attempt_context_testing_hooks() = default;
144
117
  };
145
118
  } // namespace couchbase::core::transactions
@@ -0,0 +1,52 @@
1
+ /*
2
+ * Copyright 2021-Present Couchbase, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ #include "cleanup_testing_hooks.hxx"
18
+
19
+ namespace couchbase::core::transactions
20
+ {
21
+ namespace
22
+ {
23
+ inline std::optional<couchbase::core::transactions::error_class>
24
+ noop1(const std::string&)
25
+ {
26
+ return {};
27
+ }
28
+
29
+ inline std::optional<couchbase::core::transactions::error_class>
30
+ noop2()
31
+ {
32
+ return {};
33
+ }
34
+ } // namespace
35
+
36
+ cleanup_testing_hooks::cleanup_testing_hooks()
37
+ : before_commit_doc{ noop1 }
38
+ , before_doc_get{ noop1 }
39
+ , before_remove_doc_staged_for_removal{ noop1 }
40
+ , before_remove_doc{ noop1 }
41
+ , before_atr_get{ noop1 }
42
+ , before_remove_links{ noop1 }
43
+ , before_atr_remove{ noop2 }
44
+ , on_cleanup_docs_completed{ noop2 }
45
+ , on_cleanup_completed{ noop2 }
46
+ , client_record_before_create{ noop1 }
47
+ , client_record_before_get{ noop1 }
48
+ , client_record_before_update{ noop1 }
49
+ , client_record_before_remove_client{ noop1 }
50
+ {
51
+ }
52
+ } // namespace couchbase::core::transactions