couchbase 3.4.2 → 3.4.4

Sign up to get free protection for your applications and to get access to all the features.
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
data/ext/revisions.rb CHANGED
@@ -1,3 +1,3 @@
1
- cmake_flags << "-DEXT_GIT_REVISION=527358f7c022f5fa6c93cb4d0f95118db597cc08"
2
- cmake_flags << "-DCOUCHBASE_CXX_CLIENT_GIT_REVISION=98af5a9a2169c9bba284d3cb1e839b6f5e54c3b8"
3
- cmake_flags << "-DCOUCHBASE_CXX_CLIENT_GIT_DESCRIBE=1.0.0-dp.4-22-g98af5a9"
1
+ cmake_flags << "-DEXT_GIT_REVISION=167d2e58559c91239675f1e7f7ffa2f6176f0512"
2
+ cmake_flags << "-DCOUCHBASE_CXX_CLIENT_GIT_REVISION=43cf66a592d1f8112141a73e5a563d7187ee0ee6"
3
+ cmake_flags << "-DCOUCHBASE_CXX_CLIENT_GIT_DESCRIBE=1.0.0-dp.8-0-g43cf66a"
@@ -28,7 +28,6 @@ module Couchbase
28
28
  def initialize(username, password)
29
29
  @username = username
30
30
  @password = password
31
- @allowed_sasl_mechanisms = DEFAULT_SASL_MECHANISMS
32
31
  end
33
32
 
34
33
  # Creates a LDAP compatible password authenticator which is INSECURE if not used with TLS.
@@ -124,7 +124,7 @@ module Couchbase
124
124
  metrics.warning_count = resp[:meta][:metrics][:warning_count]
125
125
  end
126
126
  end
127
- res[:warnings] = resp[:warnings].map { |warn| QueryWarning.new(warn[:code], warn[:message]) } if resp[:warnings]
127
+ meta.warnings = resp[:warnings].map { |warn| QueryWarning.new(warn[:code], warn[:message]) } if resp[:warnings]
128
128
  end
129
129
  res.instance_variable_set(:@rows, resp[:rows])
130
130
  end
@@ -386,8 +386,6 @@ module Couchbase
386
386
  raise ArgumentError, "missing connection_string" unless connection_string
387
387
  raise ArgumentError, "missing username" unless credentials[:username]
388
388
  raise ArgumentError, "missing password" unless credentials[:password]
389
-
390
- open_options[:allowed_sasl_mechanisms] = PasswordAuthenticator::DEFAULT_SASL_MECHANISMS
391
389
  else
392
390
  options = args.shift
393
391
  case options
@@ -396,8 +394,6 @@ module Couchbase
396
394
  credentials[:password] = args.shift
397
395
  raise ArgumentError, "missing username" unless credentials[:username]
398
396
  raise ArgumentError, "missing password" unless credentials[:password]
399
-
400
- open_options[:allowed_sasl_mechanisms] = PasswordAuthenticator::DEFAULT_SASL_MECHANISMS
401
397
  when Options::Cluster
402
398
  open_options = options&.to_backend || {}
403
399
  authenticator = options&.authenticator
@@ -15,6 +15,7 @@
15
15
  require "couchbase/errors"
16
16
  require "couchbase/collection_options"
17
17
  require "couchbase/binary_collection"
18
+ require "couchbase/key_value_scan"
18
19
 
19
20
  module Couchbase
20
21
  # Provides access to all collection APIs
@@ -481,11 +482,68 @@ module Couchbase
481
482
  f.index = field[:index]
482
483
  f.path = field[:path]
483
484
  f.value = field[:value]
485
+ f.error = field[:error]
484
486
  end
485
487
  end
486
488
  end
487
489
  end
488
490
 
491
+ # Performs lookups to document fragments. Reads from the active node and all available replicas and returns the
492
+ # first result found
493
+ #
494
+ # @param [String] id the document id which is used to uniquely identify it.
495
+ # @param [Array<LookupInSpec>] specs the list of specifications which describe the types of the lookups to perform
496
+ # @param [Options::LookupInAnyReplica] options request customization
497
+ #
498
+ # @return [LookupInReplicaResult]
499
+ #
500
+ # @raise [Error::DocumentIrretrievable]
501
+ # @raise [Error::Timeout]
502
+ # @raise [Error::CouchbaseError]
503
+ # @raise [Error::FeatureNotAvailable]
504
+ def lookup_in_any_replica(id, specs, options = Options::LookupInAnyReplica::DEFAULT)
505
+ resp = @backend.document_lookup_in_any_replica(
506
+ bucket_name, @scope_name, @name, id,
507
+ specs.map do |s|
508
+ {
509
+ opcode: s.type,
510
+ xattr: s.xattr?,
511
+ path: s.path,
512
+ }
513
+ end, options.to_backend
514
+ )
515
+ extract_lookup_in_replica_result(resp, options)
516
+ end
517
+
518
+ # Performs lookups to document fragments. Reads from the active node and all available replicas and returns all of
519
+ # the results
520
+ #
521
+ # @param [String] id the document id which is used to uniquely identify it.
522
+ # @param [Array<LookupInSpec>] specs the list of specifications which describe the types of the lookups to perform
523
+ # @param [Options::LookupInAllReplicas] options request customization
524
+ #
525
+ # @return [Array<LookupInReplicaResult>]
526
+ #
527
+ # @raise [Error::DocumentNotFound]
528
+ # @raise [Error::Timeout]
529
+ # @raise [Error::CouchbaseError]
530
+ # @raise [Error::FeatureNotAvailable]
531
+ def lookup_in_all_replicas(id, specs, options = Options::LookupInAllReplicas::DEFAULT)
532
+ resp = @backend.document_lookup_in_all_replicas(
533
+ bucket_name, @scope_name, @name, id,
534
+ specs.map do |s|
535
+ {
536
+ opcode: s.type,
537
+ xattr: s.xattr?,
538
+ path: s.path,
539
+ }
540
+ end, options.to_backend
541
+ )
542
+ resp.map do |entry|
543
+ extract_lookup_in_replica_result(entry, options)
544
+ end
545
+ end
546
+
489
547
  # Performs mutations to document fragments
490
548
  #
491
549
  # @param [String] id the document id which is used to uniquely identify it.
@@ -535,6 +593,38 @@ module Couchbase
535
593
  end
536
594
  end
537
595
 
596
+ # Performs a key-value scan operation on the collection
597
+ #
598
+ # @api uncommitted
599
+ #
600
+ # @param [RangeScan, PrefixScan, SamplingScan] scan_type the type of the scan
601
+ # @param [Options::Scan] options request customization
602
+ #
603
+ # @example Get a sample of up to 5 documents from the collection and store their IDs in an array
604
+ # result = collection.scan(SamplingScan.new(5), Options::Scan.new(ids_only: true))
605
+ # ids = result.map { |item| item.id }
606
+ #
607
+ # @example Get all documents whose ID starts with 'customer_1' and output their content
608
+ # result = collection.scan(PrefixScan.new("customer_1"))
609
+ # result.each { |item| puts item.content }
610
+ #
611
+ # @example Get all documents with ID between 'customer_1' and 'customer_2', excluding 'customer_2' and output their content
612
+ # result = collection.scan(RangeScan.new(
613
+ # from: ScanTerm.new("customer_1"),
614
+ # to: ScanTerm.new("customer_2", exclusive: true)
615
+ # ))
616
+ # result.each { |item| puts item.content }
617
+ #
618
+ # @return [ScanResults]
619
+ def scan(scan_type, options = Options::Scan::DEFAULT)
620
+ ScanResults.new(
621
+ core_scan_result: @backend.document_scan_create(
622
+ @bucket_name, @scope_name, @name, scan_type.to_backend, options.to_backend
623
+ ),
624
+ transcoder: options.transcoder
625
+ )
626
+ end
627
+
538
628
  private
539
629
 
540
630
  def extract_mutation_token(resp)
@@ -548,6 +638,24 @@ module Couchbase
548
638
  end
549
639
  end
550
640
 
641
+ def extract_lookup_in_replica_result(resp, options)
642
+ LookupInReplicaResult.new do |res|
643
+ res.transcoder = options.transcoder
644
+ res.cas = resp[:cas]
645
+ res.deleted = resp[:deleted]
646
+ res.is_replica = resp[:is_replica]
647
+ res.encoded = resp[:fields].map do |field|
648
+ SubDocumentField.new do |f|
649
+ f.exists = field[:exists]
650
+ f.index = field[:index]
651
+ f.path = field[:path]
652
+ f.value = field[:value]
653
+ f.error = field[:error]
654
+ end
655
+ end
656
+ end
657
+ end
658
+
551
659
  # @api private
552
660
  # TODO: deprecate in 3.1
553
661
  GetOptions = ::Couchbase::Options::Get
@@ -15,6 +15,9 @@
15
15
  require "rubygems/deprecate"
16
16
 
17
17
  require "couchbase/json_transcoder"
18
+ require "couchbase/raw_string_transcoder"
19
+ require "couchbase/raw_json_transcoder"
20
+ require "couchbase/raw_binary_transcoder"
18
21
  require "couchbase/subdoc"
19
22
  require "couchbase/mutation_state"
20
23
 
@@ -164,6 +167,8 @@ module Couchbase
164
167
  # @return [Object] the decoded
165
168
  def content(path_or_index, transcoder = self.transcoder)
166
169
  field = get_field_at_index(path_or_index)
170
+
171
+ raise field.error unless field.error.nil?
167
172
  raise Error::PathNotFound, "Path is not found: #{path_or_index}" unless field.exists
168
173
 
169
174
  transcoder.decode(field.value, :json)
@@ -186,6 +191,8 @@ module Couchbase
186
191
  end
187
192
  return false unless field
188
193
 
194
+ raise field.error unless field.error.nil?
195
+
189
196
  field.exists
190
197
  end
191
198
 
@@ -227,6 +234,18 @@ module Couchbase
227
234
  end
228
235
  end
229
236
 
237
+ class LookupInReplicaResult < LookupInResult
238
+ # @return [Boolean] true if the document was read from a replica node
239
+ attr_accessor :is_replica
240
+ alias replica? is_replica
241
+
242
+ # @yieldparam [LookupInReplicaResult] self
243
+ def initialize
244
+ super
245
+ yield self if block_given?
246
+ end
247
+ end
248
+
230
249
  class MutateInResult < MutationResult
231
250
  # Decodes the content at the given index
232
251
  #
@@ -291,10 +310,91 @@ module Couchbase
291
310
  # @return [String] path
292
311
  attr_accessor :path
293
312
 
313
+ # @return [CouchbaseError] error
314
+ attr_accessor :error
315
+
294
316
  # @yieldparam [SubDocumentField] self
295
317
  def initialize
296
318
  yield self if block_given?
297
319
  end
298
320
  end
321
+
322
+ class ScanResult
323
+ # @return [String] identifier of the document
324
+ attr_accessor :id
325
+
326
+ # @return [Boolean] whether only ids are returned from this scan
327
+ attr_accessor :id_only
328
+
329
+ # @return [Integer, nil] holds the CAS value of the fetched document
330
+ attr_accessor :cas
331
+
332
+ # @return [Integer, nil] the expiration if fetched and present
333
+ attr_accessor :expiry
334
+
335
+ # @return [JsonTranscoder, RawBinaryTranscoder, RawJsonTranscoder, RawStringTranscoder, #decode] The default
336
+ # transcoder which should be used
337
+ attr_accessor :transcoder
338
+
339
+ def initialize(id:, id_only:, cas: nil, expiry: nil, encoded: nil, flags: nil, transcoder: JsonTranscoder.new)
340
+ @id = id
341
+ @id_only = id_only
342
+ @cas = cas
343
+ @expiry = expiry
344
+ @encoded = encoded
345
+ @flags = flags
346
+ @transcoder = transcoder
347
+
348
+ yield self if block_given?
349
+ end
350
+
351
+ # Decodes the content of the document using given (or default transcoder)
352
+ #
353
+ # @param [JsonTranscoder, RawJsonTranscoder, RawBinaryTranscoder, RawStringTranscoder] transcoder custom transcoder
354
+ #
355
+ # @return [Object, nil]
356
+ def content(transcoder = self.transcoder)
357
+ return nil if @encoded.nil?
358
+
359
+ transcoder ? transcoder.decode(@encoded, @flags) : @encoded
360
+ end
361
+ end
362
+
363
+ class ScanResults
364
+ include Enumerable
365
+
366
+ def initialize(core_scan_result:, transcoder:)
367
+ @core_scan_result = core_scan_result
368
+ @transcoder = transcoder
369
+ end
370
+
371
+ def each
372
+ return enum_for(:each) unless block_given?
373
+
374
+ loop do
375
+ resp = @core_scan_result.next_item
376
+
377
+ break if resp.nil?
378
+
379
+ if resp[:id_only]
380
+ yield ScanResult.new(
381
+ id: resp[:id],
382
+ id_only: resp[:id_only],
383
+ transcoder: @transcoder
384
+ )
385
+ else
386
+ yield ScanResult.new(
387
+ id: resp[:id],
388
+ id_only: resp[:id_only],
389
+ cas: resp[:cas],
390
+ expiry: resp[:expiry],
391
+ encoded: resp[:encoded],
392
+ flags: resp[:flags],
393
+ transcoder: @transcoder
394
+ )
395
+ end
396
+ end
397
+ end
398
+ end
299
399
  end
300
400
  end
@@ -15,7 +15,7 @@
15
15
  module Couchbase
16
16
  module ConfigProfiles
17
17
  class Profiles
18
- attr :profiles
18
+ attr_reader :profiles
19
19
 
20
20
  def initialize
21
21
  @profiles = {}
@@ -183,6 +183,11 @@ module Couchbase
183
183
  class DurableWriteReCommitInProgress < CouchbaseError
184
184
  end
185
185
 
186
+ # Happens when consistency requirements are specified but the partition uuid of the requirements do not align
187
+ # with the server
188
+ class MutationTokenOutdated < CouchbaseError
189
+ end
190
+
186
191
  # Subdocument exception thrown when a path does not exist in the document. The exact meaning of path existence
187
192
  # depends on the operation and inputs.
188
193
  class PathNotFound < CouchbaseError
@@ -14,18 +14,25 @@
14
14
 
15
15
  require "json"
16
16
 
17
+ require "couchbase/transcoder_flags"
18
+
17
19
  module Couchbase
18
20
  class JsonTranscoder
19
21
  # @param [Object] document
20
22
  # @return [Array<String, Integer>] pair of encoded document and flags
21
23
  def encode(document)
22
- [JSON.generate(document), (0x02 << 24) | 0x06]
24
+ raise Error::EncodingFailure, "The JsonTranscoder does not support binary data" if document.is_a?(String) && !document.valid_encoding?
25
+
26
+ [JSON.generate(document), TranscoderFlags.new(format: :json, lower_bits: 6).encode]
23
27
  end
24
28
 
25
- # @param [String, nil] blob string of bytes, containing encoded representation of the document
26
- # @param [Integer, :json] _flags bit field, describing how the data encoded
27
- # @return Object decoded document
28
- def decode(blob, _flags)
29
+ # @param [String] blob string of bytes, containing encoded representation of the document
30
+ # @param [Integer, :json] flags bit field, describing how the data encoded
31
+ # @return [Object] decoded document
32
+ def decode(blob, flags)
33
+ format = TranscoderFlags.decode(flags).format
34
+ raise Error::DecodingFailure, "Unable to decode #{format} with the JsonTranscoder" unless format == :json || format.nil?
35
+
29
36
  JSON.parse(blob) unless blob&.empty?
30
37
  end
31
38
  end
@@ -0,0 +1,125 @@
1
+ # Copyright 2023. Couchbase, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Couchbase
16
+ # A scan term used to specify the bounds of a range scan
17
+ class ScanTerm
18
+ attr_accessor :term # @return [ScanTerm]
19
+ attr_accessor :exclusive # @return [Boolean]
20
+
21
+ # Creates an instance of a ScanTerm
22
+ #
23
+ # @api uncommitted
24
+ #
25
+ # @param [String] term the key pattern of this term
26
+ # @param [Boolean] exclusive specifies if this term is excluded while scanning, the bounds are included by default
27
+ def initialize(term, exclusive: false)
28
+ @term = term
29
+ @exclusive = exclusive
30
+ end
31
+
32
+ # @api private
33
+ def to_backend
34
+ {
35
+ term: @term,
36
+ exclusive: @exclusive,
37
+ }
38
+ end
39
+ end
40
+
41
+ # A range scan performs a scan on a range of keys
42
+ class RangeScan
43
+ attr_accessor :from # @return [ScanTerm, nil]
44
+ attr_accessor :to # @return [ScanTerm, nil]
45
+
46
+ # Creates an instance of a RangeScan scan type
47
+ #
48
+ # @api uncommitted
49
+ #
50
+ # @param [ScanTerm, String, nil] from the lower bound of the range, if set
51
+ # @param [ScanTerm, String, nil] to the upper bound of the range, if set
52
+ def initialize(from: nil, to: nil)
53
+ @from =
54
+ if from.nil? || from.instance_of?(ScanTerm)
55
+ from
56
+ else
57
+ ScanTerm(from)
58
+ end
59
+ @to =
60
+ if to.nil? || to.instance_of?(ScanTerm)
61
+ to
62
+ else
63
+ ScanTerm(to)
64
+ end
65
+ end
66
+
67
+ # @api private
68
+ def to_backend
69
+ {
70
+ scan_type: :range,
71
+ from: @from&.to_backend,
72
+ to: @to&.to_backend,
73
+ }
74
+ end
75
+ end
76
+
77
+ # A prefix scan performs a scan that includes all documents whose keys start with the given prefix
78
+ class PrefixScan
79
+ attr_accessor :prefix # @return [String]
80
+
81
+ # Creates an instance of a PrefixScan scan type
82
+ #
83
+ # @api uncommitted
84
+ #
85
+ # @param [String, nil] prefix the prefix all document keys should start with
86
+ def initialize(prefix)
87
+ @prefix = prefix
88
+ end
89
+
90
+ # @api private
91
+ def to_backend
92
+ {
93
+ scan_type: :prefix,
94
+ prefix: @prefix,
95
+ }
96
+ end
97
+ end
98
+
99
+ # A sampling scan performs a scan that randomly selects documents up to a configured limit
100
+ class SamplingScan
101
+ attr_accessor :limit # @return [Integer]
102
+ attr_accessor :seed # @return [Integer, nil]
103
+
104
+ # Creates an instance of a SamplingScan scan type
105
+ #
106
+ # @api uncommitted
107
+ #
108
+ # @param [Integer] limit the maximum number of documents the sampling scan can return
109
+ # @param [Integer, nil] seed the seed used for the random number generator that selects the documents. If not set,
110
+ # a seed is generated at random
111
+ def initialize(limit, seed = nil)
112
+ @limit = limit
113
+ @seed = seed
114
+ end
115
+
116
+ # @api private
117
+ def to_backend
118
+ {
119
+ scan_type: :sampling,
120
+ limit: @limit,
121
+ seed: @seed,
122
+ }
123
+ end
124
+ end
125
+ end
@@ -14,6 +14,7 @@
14
14
 
15
15
  require "couchbase/management/query_index_manager"
16
16
  require "couchbase/utils/time"
17
+ require "couchbase/errors"
17
18
 
18
19
  module Couchbase
19
20
  module Management
@@ -37,8 +38,18 @@ module Couchbase
37
38
  #
38
39
  # @return [Array<QueryIndex>]
39
40
  #
40
- # @raise [ArgumentError]
41
+ # @raise [Error::InvalidArgument]
41
42
  def get_all_indexes(options = Options::Query::GetAllIndexes.new)
43
+ unless options.scope_name.nil?
44
+ raise Error::InvalidArgument,
45
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
46
+ end
47
+
48
+ unless options.collection_name.nil?
49
+ raise Error::InvalidArgument,
50
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
51
+ end
52
+
42
53
  res = @backend.collection_query_index_get_all(@bucket_name, @scope_name, @collection_name, options.to_backend)
43
54
  res[:indexes].map do |idx|
44
55
  QueryIndex.new do |index|
@@ -64,15 +75,17 @@ module Couchbase
64
75
  #
65
76
  # @return void
66
77
  #
67
- # @raise [ArgumentError]
78
+ # @raise [Error::InvalidArgument]
68
79
  # @raise [Error::IndexExists]
69
80
  def create_index(index_name, fields, options = Options::Query::CreateIndex.new)
70
81
  unless options.scope_name.nil?
71
- raise ArgumentError, "Scope name cannot be set in the options when using the Query Index manager at the collection level"
82
+ raise Error::InvalidArgument,
83
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
72
84
  end
73
85
 
74
86
  unless options.collection_name.nil?
75
- raise ArgumentError, "Collection name cannot be set in the options when using the Query Index manager at the collection level"
87
+ raise Error::InvalidArgument,
88
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
76
89
  end
77
90
 
78
91
  @backend.collection_query_index_create(@bucket_name, @scope_name, @collection_name, index_name, fields, options.to_backend)
@@ -84,15 +97,17 @@ module Couchbase
84
97
  #
85
98
  # @return void
86
99
  #
87
- # @raise [ArgumentError]
100
+ # @raise [Error::InvalidArgument]
88
101
  # @raise [Error::IndexExists]
89
102
  def create_primary_index(options = Options::Query::CreatePrimaryIndex.new)
90
103
  unless options.scope_name.nil?
91
- raise ArgumentError, "Scope name cannot be set in the options when using the Query Index manager at the collection level"
104
+ raise Error::InvalidArgument,
105
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
92
106
  end
93
107
 
94
108
  unless options.collection_name.nil?
95
- raise ArgumentError, "Collection name cannot be set in the options when using the Query Index manager at the collection level"
109
+ raise Error::InvalidArgument,
110
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
96
111
  end
97
112
 
98
113
  @backend.collection_query_index_create_primary(@bucket_name, @scope_name, @collection_name, options.to_backend)
@@ -105,15 +120,17 @@ module Couchbase
105
120
  #
106
121
  # @return void
107
122
  #
108
- # @raise [ArgumentError]
123
+ # @raise [Error::InvalidArgument]
109
124
  # @raise [Error::IndexNotFound]
110
125
  def drop_index(index_name, options = Options::Query::DropIndex.new)
111
126
  unless options.scope_name.nil?
112
- raise ArgumentError, "Scope name cannot be set in the options when using the Query Index manager at the collection level"
127
+ raise Error::InvalidArgument,
128
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
113
129
  end
114
130
 
115
131
  unless options.collection_name.nil?
116
- raise ArgumentError, "Collection name cannot be set in the options when using the Query Index manager at the collection level"
132
+ raise Error::InvalidArgument,
133
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
117
134
  end
118
135
 
119
136
  @backend.collection_query_index_drop(@bucket_name, @scope_name, @collection_name, index_name, options.to_backend)
@@ -125,15 +142,17 @@ module Couchbase
125
142
  #
126
143
  # @return void
127
144
  #
128
- # @raise [ArgumentError]
145
+ # @raise [Error::InvalidArgument]
129
146
  # @raise [Error::IndexNotFound]
130
147
  def drop_primary_index(options = Options::Query::DropPrimaryIndex.new)
131
148
  unless options.scope_name.nil?
132
- raise ArgumentError, "Scope name cannot be set in the options when using the Query Index manager at the collection level"
149
+ raise Error::InvalidArgument,
150
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
133
151
  end
134
152
 
135
153
  unless options.collection_name.nil?
136
- raise ArgumentError, "Collection name cannot be set in the options when using the Query Index manager at the collection level"
154
+ raise Error::InvalidArgument,
155
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
137
156
  end
138
157
 
139
158
  @backend.collection_query_index_drop_primary(@bucket_name, @scope_name, @collection_name, options.to_backend)
@@ -145,8 +164,18 @@ module Couchbase
145
164
  #
146
165
  # @return void
147
166
  #
148
- # @raise [ArgumentError]
167
+ # @raise [Error::InvalidArgument]
149
168
  def build_deferred_indexes(options = Options::Query::BuildDeferredIndexes.new)
169
+ unless options.scope_name.nil?
170
+ raise Error::InvalidArgument,
171
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
172
+ end
173
+
174
+ unless options.collection_name.nil?
175
+ raise Error::InvalidArgument,
176
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
177
+ end
178
+
150
179
  @backend.collection_query_index_build_deferred(@bucket_name, @scope_name, @collection_name, options.to_backend)
151
180
  end
152
181
 
@@ -156,9 +185,19 @@ module Couchbase
156
185
  # @param [Integer, #in_milliseconds] timeout the time in milliseconds allowed for the operation to complete
157
186
  # @param [Options::Query::WatchIndexes] options
158
187
  #
159
- # @raise [ArgumentError]
188
+ # @raise [Error::InvalidArgument]
160
189
  # @raise [Error::IndexNotFound]
161
190
  def watch_indexes(index_names, timeout, options = Options::Query::WatchIndexes.new)
191
+ unless options.scope_name.nil?
192
+ raise Error::InvalidArgument,
193
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
194
+ end
195
+
196
+ unless options.collection_name.nil?
197
+ raise Error::InvalidArgument,
198
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
199
+ end
200
+
162
201
  index_names.append("#primary") if options.watch_primary
163
202
 
164
203
  interval_millis = 50