couchbase 1.3.13 → 3.0.0.alpha.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2158) hide show
  1. checksums.yaml +5 -13
  2. data/.github/workflows/tests-6.0.3.yml +49 -0
  3. data/.github/workflows/tests-dev-preview.yml +52 -0
  4. data/.github/workflows/tests.yml +47 -0
  5. data/.gitignore +17 -12
  6. data/.gitmodules +21 -0
  7. data/.idea/.gitignore +5 -0
  8. data/.idea/dictionaries/gem_terms.xml +18 -0
  9. data/.idea/inspectionProfiles/Project_Default.xml +8 -0
  10. data/.idea/vcs.xml +13 -0
  11. data/.yardopts +1 -5
  12. data/Gemfile +22 -2
  13. data/LICENSE.txt +202 -0
  14. data/README.md +60 -0
  15. data/Rakefile +46 -15
  16. data/bin/console +21 -0
  17. data/bin/init-cluster +70 -0
  18. data/bin/setup +24 -0
  19. data/couchbase.gemspec +38 -41
  20. data/examples/crud.rb +20 -0
  21. data/examples/managing_buckets.rb +47 -0
  22. data/examples/managing_collections.rb +58 -0
  23. data/examples/managing_query_indexes.rb +63 -0
  24. data/examples/managing_search_indexes.rb +62 -0
  25. data/examples/query.rb +18 -0
  26. data/examples/query_with_consistency.rb +76 -0
  27. data/examples/search.rb +187 -0
  28. data/examples/subdocument.rb +51 -0
  29. data/ext/.clang-format +15 -0
  30. data/ext/.clang-tidy +21 -0
  31. data/ext/.cmake-format.yaml +8 -0
  32. data/ext/.gitignore +2 -0
  33. data/ext/.idea/.name +1 -0
  34. data/ext/.idea/dictionaries/couchbase_terms.xml +14 -0
  35. data/ext/.idea/ext.iml +2 -0
  36. data/ext/.idea/misc.xml +4 -0
  37. data/ext/.idea/modules.xml +8 -0
  38. data/ext/.idea/vcs.xml +12 -0
  39. data/ext/CMakeLists.txt +163 -0
  40. data/ext/LICENSE.txt +202 -0
  41. data/ext/build_version.hxx.in +26 -0
  42. data/ext/couchbase/bucket.hxx +96 -0
  43. data/ext/couchbase/cbcrypto/cbcrypto.cc +888 -0
  44. data/ext/couchbase/cbcrypto/cbcrypto.h +89 -0
  45. data/ext/couchbase/cbsasl/client.cc +48 -0
  46. data/ext/couchbase/cbsasl/client.h +127 -0
  47. data/ext/couchbase/cbsasl/context.cc +33 -0
  48. data/ext/couchbase/cbsasl/context.h +52 -0
  49. data/ext/couchbase/cbsasl/error.h +72 -0
  50. data/ext/couchbase/cbsasl/mechanism.cc +48 -0
  51. data/ext/couchbase/cbsasl/mechanism.h +55 -0
  52. data/ext/couchbase/cbsasl/plain/plain.cc +36 -0
  53. data/ext/couchbase/cbsasl/plain/plain.h +53 -0
  54. data/ext/couchbase/cbsasl/scram-sha/scram-sha.cc +390 -0
  55. data/ext/couchbase/cbsasl/scram-sha/scram-sha.h +185 -0
  56. data/ext/couchbase/cbsasl/scram-sha/stringutils.cc +81 -0
  57. data/ext/couchbase/cbsasl/scram-sha/stringutils.h +48 -0
  58. data/ext/couchbase/cluster.hxx +175 -0
  59. data/ext/couchbase/collections_manifest.hxx +88 -0
  60. data/ext/couchbase/configuration.hxx +256 -0
  61. data/ext/couchbase/configuration_monitor.hxx +93 -0
  62. data/ext/couchbase/couchbase.cxx +3970 -0
  63. data/ext/couchbase/document_id.hxx +38 -0
  64. data/ext/couchbase/error_map.hxx +61 -0
  65. data/ext/couchbase/errors.hxx +691 -0
  66. data/ext/couchbase/io/http_message.hxx +38 -0
  67. data/ext/couchbase/io/http_parser.hxx +174 -0
  68. data/ext/couchbase/io/http_session.hxx +304 -0
  69. data/ext/couchbase/io/mcbp_message.hxx +41 -0
  70. data/ext/couchbase/io/mcbp_parser.hxx +101 -0
  71. data/ext/couchbase/io/mcbp_session.hxx +888 -0
  72. data/ext/couchbase/io/session_manager.hxx +127 -0
  73. data/ext/couchbase/mutation_token.hxx +38 -0
  74. data/ext/couchbase/operations.hxx +72 -0
  75. data/ext/couchbase/operations/bucket_create.hxx +139 -0
  76. data/ext/couchbase/operations/bucket_drop.hxx +66 -0
  77. data/ext/couchbase/operations/bucket_flush.hxx +66 -0
  78. data/ext/couchbase/operations/bucket_get.hxx +70 -0
  79. data/ext/couchbase/operations/bucket_get_all.hxx +63 -0
  80. data/ext/couchbase/operations/bucket_settings.hxx +111 -0
  81. data/ext/couchbase/operations/bucket_update.hxx +116 -0
  82. data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +61 -0
  83. data/ext/couchbase/operations/collection_create.hxx +91 -0
  84. data/ext/couchbase/operations/collection_drop.hxx +83 -0
  85. data/ext/couchbase/operations/command.hxx +152 -0
  86. data/ext/couchbase/operations/document_decrement.hxx +81 -0
  87. data/ext/couchbase/operations/document_exists.hxx +81 -0
  88. data/ext/couchbase/operations/document_get.hxx +63 -0
  89. data/ext/couchbase/operations/document_get_and_lock.hxx +65 -0
  90. data/ext/couchbase/operations/document_get_and_touch.hxx +65 -0
  91. data/ext/couchbase/operations/document_get_projected.hxx +243 -0
  92. data/ext/couchbase/operations/document_increment.hxx +83 -0
  93. data/ext/couchbase/operations/document_insert.hxx +75 -0
  94. data/ext/couchbase/operations/document_lookup_in.hxx +86 -0
  95. data/ext/couchbase/operations/document_mutate_in.hxx +97 -0
  96. data/ext/couchbase/operations/document_query.hxx +336 -0
  97. data/ext/couchbase/operations/document_remove.hxx +68 -0
  98. data/ext/couchbase/operations/document_replace.hxx +77 -0
  99. data/ext/couchbase/operations/document_search.hxx +337 -0
  100. data/ext/couchbase/operations/document_touch.hxx +61 -0
  101. data/ext/couchbase/operations/document_unlock.hxx +61 -0
  102. data/ext/couchbase/operations/document_upsert.hxx +75 -0
  103. data/ext/couchbase/operations/query_index_build_deferred.hxx +86 -0
  104. data/ext/couchbase/operations/query_index_create.hxx +135 -0
  105. data/ext/couchbase/operations/query_index_drop.hxx +109 -0
  106. data/ext/couchbase/operations/query_index_get_all.hxx +107 -0
  107. data/ext/couchbase/operations/scope_create.hxx +82 -0
  108. data/ext/couchbase/operations/scope_drop.hxx +80 -0
  109. data/ext/couchbase/operations/scope_get_all.hxx +74 -0
  110. data/ext/couchbase/operations/search_index.hxx +62 -0
  111. data/ext/couchbase/operations/search_index_analyze_document.hxx +92 -0
  112. data/ext/couchbase/operations/search_index_control_ingest.hxx +78 -0
  113. data/ext/couchbase/operations/search_index_control_plan_freeze.hxx +80 -0
  114. data/ext/couchbase/operations/search_index_control_query.hxx +80 -0
  115. data/ext/couchbase/operations/search_index_drop.hxx +77 -0
  116. data/ext/couchbase/operations/search_index_get.hxx +80 -0
  117. data/ext/couchbase/operations/search_index_get_all.hxx +82 -0
  118. data/ext/couchbase/operations/search_index_get_documents_count.hxx +81 -0
  119. data/ext/couchbase/operations/search_index_upsert.hxx +106 -0
  120. data/ext/couchbase/platform/base64.cc +234 -0
  121. data/ext/couchbase/platform/base64.h +47 -0
  122. data/ext/couchbase/platform/random.cc +119 -0
  123. data/ext/couchbase/platform/random.h +39 -0
  124. data/ext/couchbase/platform/string_hex.cc +99 -0
  125. data/ext/couchbase/platform/string_hex.h +50 -0
  126. data/ext/couchbase/platform/uuid.cc +96 -0
  127. data/ext/couchbase/platform/uuid.h +56 -0
  128. data/ext/couchbase/protocol/client_opcode.hxx +260 -0
  129. data/ext/couchbase/protocol/client_request.hxx +160 -0
  130. data/ext/couchbase/protocol/client_response.hxx +218 -0
  131. data/ext/couchbase/protocol/cmd_cluster_map_change_notification.hxx +81 -0
  132. data/ext/couchbase/protocol/cmd_decrement.hxx +187 -0
  133. data/ext/couchbase/protocol/cmd_exists.hxx +171 -0
  134. data/ext/couchbase/protocol/cmd_get.hxx +122 -0
  135. data/ext/couchbase/protocol/cmd_get_and_lock.hxx +142 -0
  136. data/ext/couchbase/protocol/cmd_get_and_touch.hxx +142 -0
  137. data/ext/couchbase/protocol/cmd_get_cluster_config.hxx +124 -0
  138. data/ext/couchbase/protocol/cmd_get_collection_id.hxx +117 -0
  139. data/ext/couchbase/protocol/cmd_get_collections_manifest.hxx +99 -0
  140. data/ext/couchbase/protocol/cmd_get_error_map.hxx +126 -0
  141. data/ext/couchbase/protocol/cmd_hello.hxx +146 -0
  142. data/ext/couchbase/protocol/cmd_increment.hxx +187 -0
  143. data/ext/couchbase/protocol/cmd_info.hxx +36 -0
  144. data/ext/couchbase/protocol/cmd_insert.hxx +172 -0
  145. data/ext/couchbase/protocol/cmd_lookup_in.hxx +218 -0
  146. data/ext/couchbase/protocol/cmd_mutate_in.hxx +317 -0
  147. data/ext/couchbase/protocol/cmd_remove.hxx +134 -0
  148. data/ext/couchbase/protocol/cmd_replace.hxx +172 -0
  149. data/ext/couchbase/protocol/cmd_sasl_auth.hxx +106 -0
  150. data/ext/couchbase/protocol/cmd_sasl_list_mechs.hxx +100 -0
  151. data/ext/couchbase/protocol/cmd_sasl_step.hxx +104 -0
  152. data/ext/couchbase/protocol/cmd_select_bucket.hxx +85 -0
  153. data/ext/couchbase/protocol/cmd_touch.hxx +102 -0
  154. data/ext/couchbase/protocol/cmd_unlock.hxx +95 -0
  155. data/ext/couchbase/protocol/cmd_upsert.hxx +172 -0
  156. data/ext/couchbase/protocol/datatype.hxx +48 -0
  157. data/ext/couchbase/protocol/durability_level.hxx +67 -0
  158. data/ext/couchbase/protocol/frame_info_id.hxx +187 -0
  159. data/ext/couchbase/protocol/hello_feature.hxx +255 -0
  160. data/ext/couchbase/protocol/magic.hxx +83 -0
  161. data/ext/couchbase/protocol/server_opcode.hxx +57 -0
  162. data/ext/couchbase/protocol/server_request.hxx +122 -0
  163. data/ext/couchbase/protocol/status.hxx +333 -0
  164. data/ext/couchbase/protocol/unsigned_leb128.h +195 -0
  165. data/ext/couchbase/service_type.hxx +23 -0
  166. data/ext/couchbase/timeout_defaults.hxx +32 -0
  167. data/ext/couchbase/utils/byteswap.hxx +33 -0
  168. data/ext/couchbase/utils/crc32.hxx +48 -0
  169. data/ext/couchbase/utils/url_codec.hxx +225 -0
  170. data/ext/couchbase/version.hxx +24 -0
  171. data/ext/extconf.rb +47 -0
  172. data/ext/test/main.cxx +67 -0
  173. data/ext/third_party/asio/.appveyor.yml +107 -0
  174. data/ext/third_party/asio/.cirrus.yml +16 -0
  175. data/ext/third_party/asio/.gitignore +3 -0
  176. data/ext/third_party/asio/.travis.yml +323 -0
  177. data/ext/third_party/asio/asio/.gitignore +23 -0
  178. data/ext/third_party/asio/asio/COPYING +4 -0
  179. data/ext/third_party/asio/asio/INSTALL +5 -0
  180. data/ext/third_party/asio/asio/LICENSE_1_0.txt +23 -0
  181. data/ext/third_party/asio/asio/Makefile.am +19 -0
  182. data/ext/third_party/asio/asio/README +4 -0
  183. data/ext/third_party/asio/asio/asio.manifest +4865 -0
  184. data/ext/third_party/asio/asio/autogen.sh +55 -0
  185. data/ext/third_party/asio/asio/boost_asio.manifest +5193 -0
  186. data/ext/third_party/asio/asio/boostify.pl +603 -0
  187. data/ext/third_party/asio/asio/configure.ac +182 -0
  188. data/ext/third_party/asio/asio/include/.gitignore +2 -0
  189. data/ext/third_party/asio/asio/include/Makefile.am +484 -0
  190. data/ext/third_party/asio/asio/include/asio.hpp +147 -0
  191. data/ext/third_party/asio/asio/include/asio/associated_allocator.hpp +131 -0
  192. data/ext/third_party/asio/asio/include/asio/associated_executor.hpp +149 -0
  193. data/ext/third_party/asio/asio/include/asio/async_result.hpp +589 -0
  194. data/ext/third_party/asio/asio/include/asio/awaitable.hpp +123 -0
  195. data/ext/third_party/asio/asio/include/asio/basic_datagram_socket.hpp +1210 -0
  196. data/ext/third_party/asio/asio/include/asio/basic_deadline_timer.hpp +693 -0
  197. data/ext/third_party/asio/asio/include/asio/basic_io_object.hpp +290 -0
  198. data/ext/third_party/asio/asio/include/asio/basic_raw_socket.hpp +1202 -0
  199. data/ext/third_party/asio/asio/include/asio/basic_seq_packet_socket.hpp +756 -0
  200. data/ext/third_party/asio/asio/include/asio/basic_serial_port.hpp +907 -0
  201. data/ext/third_party/asio/asio/include/asio/basic_signal_set.hpp +568 -0
  202. data/ext/third_party/asio/asio/include/asio/basic_socket.hpp +1894 -0
  203. data/ext/third_party/asio/asio/include/asio/basic_socket_acceptor.hpp +2495 -0
  204. data/ext/third_party/asio/asio/include/asio/basic_socket_iostream.hpp +407 -0
  205. data/ext/third_party/asio/asio/include/asio/basic_socket_streambuf.hpp +687 -0
  206. data/ext/third_party/asio/asio/include/asio/basic_stream_socket.hpp +1049 -0
  207. data/ext/third_party/asio/asio/include/asio/basic_streambuf.hpp +452 -0
  208. data/ext/third_party/asio/asio/include/asio/basic_streambuf_fwd.hpp +36 -0
  209. data/ext/third_party/asio/asio/include/asio/basic_waitable_timer.hpp +763 -0
  210. data/ext/third_party/asio/asio/include/asio/bind_executor.hpp +580 -0
  211. data/ext/third_party/asio/asio/include/asio/buffer.hpp +2494 -0
  212. data/ext/third_party/asio/asio/include/asio/buffered_read_stream.hpp +253 -0
  213. data/ext/third_party/asio/asio/include/asio/buffered_read_stream_fwd.hpp +25 -0
  214. data/ext/third_party/asio/asio/include/asio/buffered_stream.hpp +279 -0
  215. data/ext/third_party/asio/asio/include/asio/buffered_stream_fwd.hpp +25 -0
  216. data/ext/third_party/asio/asio/include/asio/buffered_write_stream.hpp +245 -0
  217. data/ext/third_party/asio/asio/include/asio/buffered_write_stream_fwd.hpp +25 -0
  218. data/ext/third_party/asio/asio/include/asio/buffers_iterator.hpp +521 -0
  219. data/ext/third_party/asio/asio/include/asio/co_spawn.hpp +100 -0
  220. data/ext/third_party/asio/asio/include/asio/completion_condition.hpp +218 -0
  221. data/ext/third_party/asio/asio/include/asio/compose.hpp +136 -0
  222. data/ext/third_party/asio/asio/include/asio/connect.hpp +1076 -0
  223. data/ext/third_party/asio/asio/include/asio/coroutine.hpp +328 -0
  224. data/ext/third_party/asio/asio/include/asio/deadline_timer.hpp +38 -0
  225. data/ext/third_party/asio/asio/include/asio/defer.hpp +127 -0
  226. data/ext/third_party/asio/asio/include/asio/detached.hpp +62 -0
  227. data/ext/third_party/asio/asio/include/asio/detail/array.hpp +38 -0
  228. data/ext/third_party/asio/asio/include/asio/detail/array_fwd.hpp +34 -0
  229. data/ext/third_party/asio/asio/include/asio/detail/assert.hpp +32 -0
  230. data/ext/third_party/asio/asio/include/asio/detail/atomic_count.hpp +45 -0
  231. data/ext/third_party/asio/asio/include/asio/detail/base_from_completion_cond.hpp +69 -0
  232. data/ext/third_party/asio/asio/include/asio/detail/bind_handler.hpp +816 -0
  233. data/ext/third_party/asio/asio/include/asio/detail/buffer_resize_guard.hpp +66 -0
  234. data/ext/third_party/asio/asio/include/asio/detail/buffer_sequence_adapter.hpp +544 -0
  235. data/ext/third_party/asio/asio/include/asio/detail/buffered_stream_storage.hpp +126 -0
  236. data/ext/third_party/asio/asio/include/asio/detail/call_stack.hpp +125 -0
  237. data/ext/third_party/asio/asio/include/asio/detail/chrono.hpp +66 -0
  238. data/ext/third_party/asio/asio/include/asio/detail/chrono_time_traits.hpp +190 -0
  239. data/ext/third_party/asio/asio/include/asio/detail/completion_handler.hpp +83 -0
  240. data/ext/third_party/asio/asio/include/asio/detail/concurrency_hint.hpp +94 -0
  241. data/ext/third_party/asio/asio/include/asio/detail/conditionally_enabled_event.hpp +112 -0
  242. data/ext/third_party/asio/asio/include/asio/detail/conditionally_enabled_mutex.hpp +149 -0
  243. data/ext/third_party/asio/asio/include/asio/detail/config.hpp +1499 -0
  244. data/ext/third_party/asio/asio/include/asio/detail/consuming_buffers.hpp +414 -0
  245. data/ext/third_party/asio/asio/include/asio/detail/cstddef.hpp +31 -0
  246. data/ext/third_party/asio/asio/include/asio/detail/cstdint.hpp +60 -0
  247. data/ext/third_party/asio/asio/include/asio/detail/date_time_fwd.hpp +34 -0
  248. data/ext/third_party/asio/asio/include/asio/detail/deadline_timer_service.hpp +280 -0
  249. data/ext/third_party/asio/asio/include/asio/detail/dependent_type.hpp +36 -0
  250. data/ext/third_party/asio/asio/include/asio/detail/descriptor_ops.hpp +121 -0
  251. data/ext/third_party/asio/asio/include/asio/detail/descriptor_read_op.hpp +130 -0
  252. data/ext/third_party/asio/asio/include/asio/detail/descriptor_write_op.hpp +130 -0
  253. data/ext/third_party/asio/asio/include/asio/detail/dev_poll_reactor.hpp +218 -0
  254. data/ext/third_party/asio/asio/include/asio/detail/epoll_reactor.hpp +266 -0
  255. data/ext/third_party/asio/asio/include/asio/detail/event.hpp +48 -0
  256. data/ext/third_party/asio/asio/include/asio/detail/eventfd_select_interrupter.hpp +83 -0
  257. data/ext/third_party/asio/asio/include/asio/detail/executor_function.hpp +104 -0
  258. data/ext/third_party/asio/asio/include/asio/detail/executor_op.hpp +84 -0
  259. data/ext/third_party/asio/asio/include/asio/detail/fd_set_adapter.hpp +39 -0
  260. data/ext/third_party/asio/asio/include/asio/detail/fenced_block.hpp +80 -0
  261. data/ext/third_party/asio/asio/include/asio/detail/functional.hpp +38 -0
  262. data/ext/third_party/asio/asio/include/asio/detail/future.hpp +33 -0
  263. data/ext/third_party/asio/asio/include/asio/detail/gcc_arm_fenced_block.hpp +91 -0
  264. data/ext/third_party/asio/asio/include/asio/detail/gcc_hppa_fenced_block.hpp +68 -0
  265. data/ext/third_party/asio/asio/include/asio/detail/gcc_sync_fenced_block.hpp +65 -0
  266. data/ext/third_party/asio/asio/include/asio/detail/gcc_x86_fenced_block.hpp +99 -0
  267. data/ext/third_party/asio/asio/include/asio/detail/global.hpp +52 -0
  268. data/ext/third_party/asio/asio/include/asio/detail/handler_alloc_helpers.hpp +242 -0
  269. data/ext/third_party/asio/asio/include/asio/detail/handler_cont_helpers.hpp +45 -0
  270. data/ext/third_party/asio/asio/include/asio/detail/handler_invoke_helpers.hpp +57 -0
  271. data/ext/third_party/asio/asio/include/asio/detail/handler_tracking.hpp +238 -0
  272. data/ext/third_party/asio/asio/include/asio/detail/handler_type_requirements.hpp +556 -0
  273. data/ext/third_party/asio/asio/include/asio/detail/handler_work.hpp +113 -0
  274. data/ext/third_party/asio/asio/include/asio/detail/hash_map.hpp +331 -0
  275. data/ext/third_party/asio/asio/include/asio/detail/impl/buffer_sequence_adapter.ipp +118 -0
  276. data/ext/third_party/asio/asio/include/asio/detail/impl/descriptor_ops.ipp +474 -0
  277. data/ext/third_party/asio/asio/include/asio/detail/impl/dev_poll_reactor.hpp +91 -0
  278. data/ext/third_party/asio/asio/include/asio/detail/impl/dev_poll_reactor.ipp +446 -0
  279. data/ext/third_party/asio/asio/include/asio/detail/impl/epoll_reactor.hpp +89 -0
  280. data/ext/third_party/asio/asio/include/asio/detail/impl/epoll_reactor.ipp +787 -0
  281. data/ext/third_party/asio/asio/include/asio/detail/impl/eventfd_select_interrupter.ipp +169 -0
  282. data/ext/third_party/asio/asio/include/asio/detail/impl/handler_tracking.ipp +358 -0
  283. data/ext/third_party/asio/asio/include/asio/detail/impl/kqueue_reactor.hpp +93 -0
  284. data/ext/third_party/asio/asio/include/asio/detail/impl/kqueue_reactor.ipp +570 -0
  285. data/ext/third_party/asio/asio/include/asio/detail/impl/null_event.ipp +74 -0
  286. data/ext/third_party/asio/asio/include/asio/detail/impl/pipe_select_interrupter.ipp +129 -0
  287. data/ext/third_party/asio/asio/include/asio/detail/impl/posix_event.ipp +59 -0
  288. data/ext/third_party/asio/asio/include/asio/detail/impl/posix_mutex.ipp +46 -0
  289. data/ext/third_party/asio/asio/include/asio/detail/impl/posix_thread.ipp +84 -0
  290. data/ext/third_party/asio/asio/include/asio/detail/impl/posix_tss_ptr.ipp +46 -0
  291. data/ext/third_party/asio/asio/include/asio/detail/impl/reactive_descriptor_service.ipp +223 -0
  292. data/ext/third_party/asio/asio/include/asio/detail/impl/reactive_serial_port_service.ipp +152 -0
  293. data/ext/third_party/asio/asio/include/asio/detail/impl/reactive_socket_service_base.ipp +300 -0
  294. data/ext/third_party/asio/asio/include/asio/detail/impl/resolver_service_base.ipp +158 -0
  295. data/ext/third_party/asio/asio/include/asio/detail/impl/scheduler.ipp +617 -0
  296. data/ext/third_party/asio/asio/include/asio/detail/impl/select_reactor.hpp +100 -0
  297. data/ext/third_party/asio/asio/include/asio/detail/impl/select_reactor.ipp +338 -0
  298. data/ext/third_party/asio/asio/include/asio/detail/impl/service_registry.hpp +94 -0
  299. data/ext/third_party/asio/asio/include/asio/detail/impl/service_registry.ipp +197 -0
  300. data/ext/third_party/asio/asio/include/asio/detail/impl/signal_set_service.ipp +667 -0
  301. data/ext/third_party/asio/asio/include/asio/detail/impl/socket_ops.ipp +3575 -0
  302. data/ext/third_party/asio/asio/include/asio/detail/impl/socket_select_interrupter.ipp +185 -0
  303. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_executor_service.hpp +179 -0
  304. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_executor_service.ipp +134 -0
  305. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_service.hpp +118 -0
  306. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_service.ipp +177 -0
  307. data/ext/third_party/asio/asio/include/asio/detail/impl/throw_error.ipp +60 -0
  308. data/ext/third_party/asio/asio/include/asio/detail/impl/timer_queue_ptime.ipp +91 -0
  309. data/ext/third_party/asio/asio/include/asio/detail/impl/timer_queue_set.ipp +101 -0
  310. data/ext/third_party/asio/asio/include/asio/detail/impl/win_event.ipp +76 -0
  311. data/ext/third_party/asio/asio/include/asio/detail/impl/win_iocp_handle_service.ipp +525 -0
  312. data/ext/third_party/asio/asio/include/asio/detail/impl/win_iocp_io_context.hpp +103 -0
  313. data/ext/third_party/asio/asio/include/asio/detail/impl/win_iocp_io_context.ipp +594 -0
  314. data/ext/third_party/asio/asio/include/asio/detail/impl/win_iocp_serial_port_service.ipp +192 -0
  315. data/ext/third_party/asio/asio/include/asio/detail/impl/win_iocp_socket_service_base.ipp +801 -0
  316. data/ext/third_party/asio/asio/include/asio/detail/impl/win_mutex.ipp +84 -0
  317. data/ext/third_party/asio/asio/include/asio/detail/impl/win_object_handle_service.ipp +448 -0
  318. data/ext/third_party/asio/asio/include/asio/detail/impl/win_static_mutex.ipp +136 -0
  319. data/ext/third_party/asio/asio/include/asio/detail/impl/win_thread.ipp +150 -0
  320. data/ext/third_party/asio/asio/include/asio/detail/impl/win_tss_ptr.ipp +57 -0
  321. data/ext/third_party/asio/asio/include/asio/detail/impl/winrt_ssocket_service_base.ipp +626 -0
  322. data/ext/third_party/asio/asio/include/asio/detail/impl/winrt_timer_scheduler.hpp +92 -0
  323. data/ext/third_party/asio/asio/include/asio/detail/impl/winrt_timer_scheduler.ipp +121 -0
  324. data/ext/third_party/asio/asio/include/asio/detail/impl/winsock_init.ipp +82 -0
  325. data/ext/third_party/asio/asio/include/asio/detail/io_control.hpp +84 -0
  326. data/ext/third_party/asio/asio/include/asio/detail/io_object_executor.hpp +167 -0
  327. data/ext/third_party/asio/asio/include/asio/detail/io_object_impl.hpp +193 -0
  328. data/ext/third_party/asio/asio/include/asio/detail/is_buffer_sequence.hpp +312 -0
  329. data/ext/third_party/asio/asio/include/asio/detail/is_executor.hpp +126 -0
  330. data/ext/third_party/asio/asio/include/asio/detail/keyword_tss_ptr.hpp +70 -0
  331. data/ext/third_party/asio/asio/include/asio/detail/kqueue_reactor.hpp +242 -0
  332. data/ext/third_party/asio/asio/include/asio/detail/limits.hpp +26 -0
  333. data/ext/third_party/asio/asio/include/asio/detail/local_free_on_block_exit.hpp +59 -0
  334. data/ext/third_party/asio/asio/include/asio/detail/macos_fenced_block.hpp +62 -0
  335. data/ext/third_party/asio/asio/include/asio/detail/memory.hpp +70 -0
  336. data/ext/third_party/asio/asio/include/asio/detail/mutex.hpp +48 -0
  337. data/ext/third_party/asio/asio/include/asio/detail/non_const_lvalue.hpp +54 -0
  338. data/ext/third_party/asio/asio/include/asio/detail/noncopyable.hpp +43 -0
  339. data/ext/third_party/asio/asio/include/asio/detail/null_event.hpp +100 -0
  340. data/ext/third_party/asio/asio/include/asio/detail/null_fenced_block.hpp +47 -0
  341. data/ext/third_party/asio/asio/include/asio/detail/null_global.hpp +59 -0
  342. data/ext/third_party/asio/asio/include/asio/detail/null_mutex.hpp +64 -0
  343. data/ext/third_party/asio/asio/include/asio/detail/null_reactor.hpp +68 -0
  344. data/ext/third_party/asio/asio/include/asio/detail/null_signal_blocker.hpp +69 -0
  345. data/ext/third_party/asio/asio/include/asio/detail/null_socket_service.hpp +519 -0
  346. data/ext/third_party/asio/asio/include/asio/detail/null_static_mutex.hpp +60 -0
  347. data/ext/third_party/asio/asio/include/asio/detail/null_thread.hpp +67 -0
  348. data/ext/third_party/asio/asio/include/asio/detail/null_tss_ptr.hpp +68 -0
  349. data/ext/third_party/asio/asio/include/asio/detail/object_pool.hpp +171 -0
  350. data/ext/third_party/asio/asio/include/asio/detail/old_win_sdk_compat.hpp +214 -0
  351. data/ext/third_party/asio/asio/include/asio/detail/op_queue.hpp +162 -0
  352. data/ext/third_party/asio/asio/include/asio/detail/operation.hpp +38 -0
  353. data/ext/third_party/asio/asio/include/asio/detail/pipe_select_interrupter.hpp +89 -0
  354. data/ext/third_party/asio/asio/include/asio/detail/pop_options.hpp +141 -0
  355. data/ext/third_party/asio/asio/include/asio/detail/posix_event.hpp +162 -0
  356. data/ext/third_party/asio/asio/include/asio/detail/posix_fd_set_adapter.hpp +118 -0
  357. data/ext/third_party/asio/asio/include/asio/detail/posix_global.hpp +80 -0
  358. data/ext/third_party/asio/asio/include/asio/detail/posix_mutex.hpp +76 -0
  359. data/ext/third_party/asio/asio/include/asio/detail/posix_signal_blocker.hpp +85 -0
  360. data/ext/third_party/asio/asio/include/asio/detail/posix_static_mutex.hpp +64 -0
  361. data/ext/third_party/asio/asio/include/asio/detail/posix_thread.hpp +109 -0
  362. data/ext/third_party/asio/asio/include/asio/detail/posix_tss_ptr.hpp +79 -0
  363. data/ext/third_party/asio/asio/include/asio/detail/push_options.hpp +185 -0
  364. data/ext/third_party/asio/asio/include/asio/detail/reactive_descriptor_service.hpp +391 -0
  365. data/ext/third_party/asio/asio/include/asio/detail/reactive_null_buffers_op.hpp +92 -0
  366. data/ext/third_party/asio/asio/include/asio/detail/reactive_serial_port_service.hpp +238 -0
  367. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_accept_op.hpp +230 -0
  368. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_connect_op.hpp +116 -0
  369. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_recv_op.hpp +137 -0
  370. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_recvfrom_op.hpp +142 -0
  371. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_recvmsg_op.hpp +135 -0
  372. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_send_op.hpp +136 -0
  373. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_sendto_op.hpp +134 -0
  374. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_service.hpp +505 -0
  375. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_service_base.hpp +518 -0
  376. data/ext/third_party/asio/asio/include/asio/detail/reactive_wait_op.hpp +92 -0
  377. data/ext/third_party/asio/asio/include/asio/detail/reactor.hpp +32 -0
  378. data/ext/third_party/asio/asio/include/asio/detail/reactor_fwd.hpp +40 -0
  379. data/ext/third_party/asio/asio/include/asio/detail/reactor_op.hpp +65 -0
  380. data/ext/third_party/asio/asio/include/asio/detail/reactor_op_queue.hpp +168 -0
  381. data/ext/third_party/asio/asio/include/asio/detail/recycling_allocator.hpp +106 -0
  382. data/ext/third_party/asio/asio/include/asio/detail/regex_fwd.hpp +35 -0
  383. data/ext/third_party/asio/asio/include/asio/detail/resolve_endpoint_op.hpp +138 -0
  384. data/ext/third_party/asio/asio/include/asio/detail/resolve_op.hpp +45 -0
  385. data/ext/third_party/asio/asio/include/asio/detail/resolve_query_op.hpp +148 -0
  386. data/ext/third_party/asio/asio/include/asio/detail/resolver_service.hpp +145 -0
  387. data/ext/third_party/asio/asio/include/asio/detail/resolver_service_base.hpp +143 -0
  388. data/ext/third_party/asio/asio/include/asio/detail/scheduler.hpp +224 -0
  389. data/ext/third_party/asio/asio/include/asio/detail/scheduler_operation.hpp +78 -0
  390. data/ext/third_party/asio/asio/include/asio/detail/scheduler_thread_info.hpp +40 -0
  391. data/ext/third_party/asio/asio/include/asio/detail/scoped_lock.hpp +101 -0
  392. data/ext/third_party/asio/asio/include/asio/detail/scoped_ptr.hpp +87 -0
  393. data/ext/third_party/asio/asio/include/asio/detail/select_interrupter.hpp +46 -0
  394. data/ext/third_party/asio/asio/include/asio/detail/select_reactor.hpp +238 -0
  395. data/ext/third_party/asio/asio/include/asio/detail/service_registry.hpp +164 -0
  396. data/ext/third_party/asio/asio/include/asio/detail/signal_blocker.hpp +44 -0
  397. data/ext/third_party/asio/asio/include/asio/detail/signal_handler.hpp +88 -0
  398. data/ext/third_party/asio/asio/include/asio/detail/signal_init.hpp +47 -0
  399. data/ext/third_party/asio/asio/include/asio/detail/signal_op.hpp +49 -0
  400. data/ext/third_party/asio/asio/include/asio/detail/signal_set_service.hpp +229 -0
  401. data/ext/third_party/asio/asio/include/asio/detail/socket_holder.hpp +98 -0
  402. data/ext/third_party/asio/asio/include/asio/detail/socket_ops.hpp +337 -0
  403. data/ext/third_party/asio/asio/include/asio/detail/socket_option.hpp +316 -0
  404. data/ext/third_party/asio/asio/include/asio/detail/socket_select_interrupter.hpp +91 -0
  405. data/ext/third_party/asio/asio/include/asio/detail/socket_types.hpp +416 -0
  406. data/ext/third_party/asio/asio/include/asio/detail/solaris_fenced_block.hpp +62 -0
  407. data/ext/third_party/asio/asio/include/asio/detail/static_mutex.hpp +52 -0
  408. data/ext/third_party/asio/asio/include/asio/detail/std_event.hpp +176 -0
  409. data/ext/third_party/asio/asio/include/asio/detail/std_fenced_block.hpp +62 -0
  410. data/ext/third_party/asio/asio/include/asio/detail/std_global.hpp +70 -0
  411. data/ext/third_party/asio/asio/include/asio/detail/std_mutex.hpp +73 -0
  412. data/ext/third_party/asio/asio/include/asio/detail/std_static_mutex.hpp +81 -0
  413. data/ext/third_party/asio/asio/include/asio/detail/std_thread.hpp +71 -0
  414. data/ext/third_party/asio/asio/include/asio/detail/strand_executor_service.hpp +142 -0
  415. data/ext/third_party/asio/asio/include/asio/detail/strand_service.hpp +142 -0
  416. data/ext/third_party/asio/asio/include/asio/detail/string_view.hpp +47 -0
  417. data/ext/third_party/asio/asio/include/asio/detail/thread.hpp +60 -0
  418. data/ext/third_party/asio/asio/include/asio/detail/thread_context.hpp +42 -0
  419. data/ext/third_party/asio/asio/include/asio/detail/thread_group.hpp +95 -0
  420. data/ext/third_party/asio/asio/include/asio/detail/thread_info_base.hpp +125 -0
  421. data/ext/third_party/asio/asio/include/asio/detail/throw_error.hpp +53 -0
  422. data/ext/third_party/asio/asio/include/asio/detail/throw_exception.hpp +51 -0
  423. data/ext/third_party/asio/asio/include/asio/detail/timer_queue.hpp +360 -0
  424. data/ext/third_party/asio/asio/include/asio/detail/timer_queue_base.hpp +68 -0
  425. data/ext/third_party/asio/asio/include/asio/detail/timer_queue_ptime.hpp +99 -0
  426. data/ext/third_party/asio/asio/include/asio/detail/timer_queue_set.hpp +66 -0
  427. data/ext/third_party/asio/asio/include/asio/detail/timer_scheduler.hpp +35 -0
  428. data/ext/third_party/asio/asio/include/asio/detail/timer_scheduler_fwd.hpp +40 -0
  429. data/ext/third_party/asio/asio/include/asio/detail/tss_ptr.hpp +69 -0
  430. data/ext/third_party/asio/asio/include/asio/detail/type_traits.hpp +89 -0
  431. data/ext/third_party/asio/asio/include/asio/detail/variadic_templates.hpp +151 -0
  432. data/ext/third_party/asio/asio/include/asio/detail/wait_handler.hpp +87 -0
  433. data/ext/third_party/asio/asio/include/asio/detail/wait_op.hpp +45 -0
  434. data/ext/third_party/asio/asio/include/asio/detail/win_event.hpp +151 -0
  435. data/ext/third_party/asio/asio/include/asio/detail/win_fd_set_adapter.hpp +149 -0
  436. data/ext/third_party/asio/asio/include/asio/detail/win_fenced_block.hpp +90 -0
  437. data/ext/third_party/asio/asio/include/asio/detail/win_global.hpp +71 -0
  438. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_handle_read_op.hpp +113 -0
  439. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_handle_service.hpp +335 -0
  440. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_handle_write_op.hpp +106 -0
  441. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_io_context.hpp +338 -0
  442. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_null_buffers_op.hpp +123 -0
  443. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_operation.hpp +96 -0
  444. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_overlapped_op.hpp +92 -0
  445. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp +159 -0
  446. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_serial_port_service.hpp +232 -0
  447. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_accept_op.hpp +308 -0
  448. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_connect_op.hpp +130 -0
  449. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_recv_op.hpp +120 -0
  450. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_recvfrom_op.hpp +129 -0
  451. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_recvmsg_op.hpp +121 -0
  452. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_send_op.hpp +114 -0
  453. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_service.hpp +581 -0
  454. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_service_base.hpp +600 -0
  455. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_thread_info.hpp +34 -0
  456. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_wait_op.hpp +123 -0
  457. data/ext/third_party/asio/asio/include/asio/detail/win_mutex.hpp +78 -0
  458. data/ext/third_party/asio/asio/include/asio/detail/win_object_handle_service.hpp +195 -0
  459. data/ext/third_party/asio/asio/include/asio/detail/win_static_mutex.hpp +74 -0
  460. data/ext/third_party/asio/asio/include/asio/detail/win_thread.hpp +147 -0
  461. data/ext/third_party/asio/asio/include/asio/detail/win_tss_ptr.hpp +79 -0
  462. data/ext/third_party/asio/asio/include/asio/detail/winapp_thread.hpp +124 -0
  463. data/ext/third_party/asio/asio/include/asio/detail/wince_thread.hpp +124 -0
  464. data/ext/third_party/asio/asio/include/asio/detail/winrt_async_manager.hpp +305 -0
  465. data/ext/third_party/asio/asio/include/asio/detail/winrt_async_op.hpp +65 -0
  466. data/ext/third_party/asio/asio/include/asio/detail/winrt_resolve_op.hpp +121 -0
  467. data/ext/third_party/asio/asio/include/asio/detail/winrt_resolver_service.hpp +212 -0
  468. data/ext/third_party/asio/asio/include/asio/detail/winrt_socket_connect_op.hpp +94 -0
  469. data/ext/third_party/asio/asio/include/asio/detail/winrt_socket_recv_op.hpp +115 -0
  470. data/ext/third_party/asio/asio/include/asio/detail/winrt_socket_send_op.hpp +106 -0
  471. data/ext/third_party/asio/asio/include/asio/detail/winrt_ssocket_service.hpp +250 -0
  472. data/ext/third_party/asio/asio/include/asio/detail/winrt_ssocket_service_base.hpp +362 -0
  473. data/ext/third_party/asio/asio/include/asio/detail/winrt_timer_scheduler.hpp +147 -0
  474. data/ext/third_party/asio/asio/include/asio/detail/winrt_utils.hpp +106 -0
  475. data/ext/third_party/asio/asio/include/asio/detail/winsock_init.hpp +128 -0
  476. data/ext/third_party/asio/asio/include/asio/detail/work_dispatcher.hpp +73 -0
  477. data/ext/third_party/asio/asio/include/asio/detail/wrapped_handler.hpp +291 -0
  478. data/ext/third_party/asio/asio/include/asio/dispatch.hpp +118 -0
  479. data/ext/third_party/asio/asio/include/asio/error.hpp +356 -0
  480. data/ext/third_party/asio/asio/include/asio/error_code.hpp +202 -0
  481. data/ext/third_party/asio/asio/include/asio/execution_context.hpp +412 -0
  482. data/ext/third_party/asio/asio/include/asio/executor.hpp +341 -0
  483. data/ext/third_party/asio/asio/include/asio/executor_work_guard.hpp +170 -0
  484. data/ext/third_party/asio/asio/include/asio/generic/basic_endpoint.hpp +193 -0
  485. data/ext/third_party/asio/asio/include/asio/generic/datagram_protocol.hpp +123 -0
  486. data/ext/third_party/asio/asio/include/asio/generic/detail/endpoint.hpp +133 -0
  487. data/ext/third_party/asio/asio/include/asio/generic/detail/impl/endpoint.ipp +110 -0
  488. data/ext/third_party/asio/asio/include/asio/generic/raw_protocol.hpp +121 -0
  489. data/ext/third_party/asio/asio/include/asio/generic/seq_packet_protocol.hpp +122 -0
  490. data/ext/third_party/asio/asio/include/asio/generic/stream_protocol.hpp +127 -0
  491. data/ext/third_party/asio/asio/include/asio/handler_alloc_hook.hpp +81 -0
  492. data/ext/third_party/asio/asio/include/asio/handler_continuation_hook.hpp +54 -0
  493. data/ext/third_party/asio/asio/include/asio/handler_invoke_hook.hpp +85 -0
  494. data/ext/third_party/asio/asio/include/asio/high_resolution_timer.hpp +44 -0
  495. data/ext/third_party/asio/asio/include/asio/impl/awaitable.hpp +422 -0
  496. data/ext/third_party/asio/asio/include/asio/impl/buffered_read_stream.hpp +491 -0
  497. data/ext/third_party/asio/asio/include/asio/impl/buffered_write_stream.hpp +471 -0
  498. data/ext/third_party/asio/asio/include/asio/impl/co_spawn.hpp +160 -0
  499. data/ext/third_party/asio/asio/include/asio/impl/compose.hpp +533 -0
  500. data/ext/third_party/asio/asio/include/asio/impl/connect.hpp +872 -0
  501. data/ext/third_party/asio/asio/include/asio/impl/defer.hpp +113 -0
  502. data/ext/third_party/asio/asio/include/asio/impl/detached.hpp +130 -0
  503. data/ext/third_party/asio/asio/include/asio/impl/dispatch.hpp +113 -0
  504. data/ext/third_party/asio/asio/include/asio/impl/error.ipp +128 -0
  505. data/ext/third_party/asio/asio/include/asio/impl/error_code.ipp +206 -0
  506. data/ext/third_party/asio/asio/include/asio/impl/execution_context.hpp +109 -0
  507. data/ext/third_party/asio/asio/include/asio/impl/execution_context.ipp +82 -0
  508. data/ext/third_party/asio/asio/include/asio/impl/executor.hpp +387 -0
  509. data/ext/third_party/asio/asio/include/asio/impl/executor.ipp +38 -0
  510. data/ext/third_party/asio/asio/include/asio/impl/handler_alloc_hook.ipp +52 -0
  511. data/ext/third_party/asio/asio/include/asio/impl/io_context.hpp +353 -0
  512. data/ext/third_party/asio/asio/include/asio/impl/io_context.ipp +175 -0
  513. data/ext/third_party/asio/asio/include/asio/impl/post.hpp +113 -0
  514. data/ext/third_party/asio/asio/include/asio/impl/read.hpp +1135 -0
  515. data/ext/third_party/asio/asio/include/asio/impl/read_at.hpp +699 -0
  516. data/ext/third_party/asio/asio/include/asio/impl/read_until.hpp +3150 -0
  517. data/ext/third_party/asio/asio/include/asio/impl/redirect_error.hpp +372 -0
  518. data/ext/third_party/asio/asio/include/asio/impl/serial_port_base.hpp +59 -0
  519. data/ext/third_party/asio/asio/include/asio/impl/serial_port_base.ipp +554 -0
  520. data/ext/third_party/asio/asio/include/asio/impl/spawn.hpp +490 -0
  521. data/ext/third_party/asio/asio/include/asio/impl/src.cpp +25 -0
  522. data/ext/third_party/asio/asio/include/asio/impl/src.hpp +82 -0
  523. data/ext/third_party/asio/asio/include/asio/impl/system_context.hpp +34 -0
  524. data/ext/third_party/asio/asio/include/asio/impl/system_context.ipp +80 -0
  525. data/ext/third_party/asio/asio/include/asio/impl/system_executor.hpp +85 -0
  526. data/ext/third_party/asio/asio/include/asio/impl/thread_pool.hpp +127 -0
  527. data/ext/third_party/asio/asio/include/asio/impl/thread_pool.ipp +87 -0
  528. data/ext/third_party/asio/asio/include/asio/impl/use_awaitable.hpp +276 -0
  529. data/ext/third_party/asio/asio/include/asio/impl/use_future.hpp +887 -0
  530. data/ext/third_party/asio/asio/include/asio/impl/write.hpp +1043 -0
  531. data/ext/third_party/asio/asio/include/asio/impl/write_at.hpp +624 -0
  532. data/ext/third_party/asio/asio/include/asio/io_context.hpp +872 -0
  533. data/ext/third_party/asio/asio/include/asio/io_context_strand.hpp +374 -0
  534. data/ext/third_party/asio/asio/include/asio/io_service.hpp +33 -0
  535. data/ext/third_party/asio/asio/include/asio/io_service_strand.hpp +20 -0
  536. data/ext/third_party/asio/asio/include/asio/ip/address.hpp +268 -0
  537. data/ext/third_party/asio/asio/include/asio/ip/address_v4.hpp +335 -0
  538. data/ext/third_party/asio/asio/include/asio/ip/address_v4_iterator.hpp +162 -0
  539. data/ext/third_party/asio/asio/include/asio/ip/address_v4_range.hpp +134 -0
  540. data/ext/third_party/asio/asio/include/asio/ip/address_v6.hpp +341 -0
  541. data/ext/third_party/asio/asio/include/asio/ip/address_v6_iterator.hpp +183 -0
  542. data/ext/third_party/asio/asio/include/asio/ip/address_v6_range.hpp +129 -0
  543. data/ext/third_party/asio/asio/include/asio/ip/bad_address_cast.hpp +53 -0
  544. data/ext/third_party/asio/asio/include/asio/ip/basic_endpoint.hpp +264 -0
  545. data/ext/third_party/asio/asio/include/asio/ip/basic_resolver.hpp +1030 -0
  546. data/ext/third_party/asio/asio/include/asio/ip/basic_resolver_entry.hpp +113 -0
  547. data/ext/third_party/asio/asio/include/asio/ip/basic_resolver_iterator.hpp +192 -0
  548. data/ext/third_party/asio/asio/include/asio/ip/basic_resolver_query.hpp +244 -0
  549. data/ext/third_party/asio/asio/include/asio/ip/basic_resolver_results.hpp +311 -0
  550. data/ext/third_party/asio/asio/include/asio/ip/detail/endpoint.hpp +141 -0
  551. data/ext/third_party/asio/asio/include/asio/ip/detail/impl/endpoint.ipp +199 -0
  552. data/ext/third_party/asio/asio/include/asio/ip/detail/socket_option.hpp +566 -0
  553. data/ext/third_party/asio/asio/include/asio/ip/host_name.hpp +42 -0
  554. data/ext/third_party/asio/asio/include/asio/ip/icmp.hpp +115 -0
  555. data/ext/third_party/asio/asio/include/asio/ip/impl/address.hpp +67 -0
  556. data/ext/third_party/asio/asio/include/asio/ip/impl/address.ipp +239 -0
  557. data/ext/third_party/asio/asio/include/asio/ip/impl/address_v4.hpp +67 -0
  558. data/ext/third_party/asio/asio/include/asio/ip/impl/address_v4.ipp +210 -0
  559. data/ext/third_party/asio/asio/include/asio/ip/impl/address_v6.hpp +67 -0
  560. data/ext/third_party/asio/asio/include/asio/ip/impl/address_v6.ipp +350 -0
  561. data/ext/third_party/asio/asio/include/asio/ip/impl/basic_endpoint.hpp +43 -0
  562. data/ext/third_party/asio/asio/include/asio/ip/impl/host_name.ipp +54 -0
  563. data/ext/third_party/asio/asio/include/asio/ip/impl/network_v4.hpp +54 -0
  564. data/ext/third_party/asio/asio/include/asio/ip/impl/network_v4.ipp +216 -0
  565. data/ext/third_party/asio/asio/include/asio/ip/impl/network_v6.hpp +53 -0
  566. data/ext/third_party/asio/asio/include/asio/ip/impl/network_v6.ipp +185 -0
  567. data/ext/third_party/asio/asio/include/asio/ip/multicast.hpp +191 -0
  568. data/ext/third_party/asio/asio/include/asio/ip/network_v4.hpp +261 -0
  569. data/ext/third_party/asio/asio/include/asio/ip/network_v6.hpp +235 -0
  570. data/ext/third_party/asio/asio/include/asio/ip/resolver_base.hpp +129 -0
  571. data/ext/third_party/asio/asio/include/asio/ip/resolver_query_base.hpp +43 -0
  572. data/ext/third_party/asio/asio/include/asio/ip/tcp.hpp +155 -0
  573. data/ext/third_party/asio/asio/include/asio/ip/udp.hpp +111 -0
  574. data/ext/third_party/asio/asio/include/asio/ip/unicast.hpp +70 -0
  575. data/ext/third_party/asio/asio/include/asio/ip/v6_only.hpp +69 -0
  576. data/ext/third_party/asio/asio/include/asio/is_executor.hpp +46 -0
  577. data/ext/third_party/asio/asio/include/asio/is_read_buffered.hpp +59 -0
  578. data/ext/third_party/asio/asio/include/asio/is_write_buffered.hpp +59 -0
  579. data/ext/third_party/asio/asio/include/asio/local/basic_endpoint.hpp +247 -0
  580. data/ext/third_party/asio/asio/include/asio/local/connect_pair.hpp +101 -0
  581. data/ext/third_party/asio/asio/include/asio/local/datagram_protocol.hpp +80 -0
  582. data/ext/third_party/asio/asio/include/asio/local/detail/endpoint.hpp +139 -0
  583. data/ext/third_party/asio/asio/include/asio/local/detail/impl/endpoint.ipp +136 -0
  584. data/ext/third_party/asio/asio/include/asio/local/stream_protocol.hpp +90 -0
  585. data/ext/third_party/asio/asio/include/asio/packaged_task.hpp +126 -0
  586. data/ext/third_party/asio/asio/include/asio/placeholders.hpp +151 -0
  587. data/ext/third_party/asio/asio/include/asio/posix/basic_descriptor.hpp +697 -0
  588. data/ext/third_party/asio/asio/include/asio/posix/basic_stream_descriptor.hpp +470 -0
  589. data/ext/third_party/asio/asio/include/asio/posix/descriptor.hpp +37 -0
  590. data/ext/third_party/asio/asio/include/asio/posix/descriptor_base.hpp +90 -0
  591. data/ext/third_party/asio/asio/include/asio/posix/stream_descriptor.hpp +37 -0
  592. data/ext/third_party/asio/asio/include/asio/post.hpp +123 -0
  593. data/ext/third_party/asio/asio/include/asio/read.hpp +1288 -0
  594. data/ext/third_party/asio/asio/include/asio/read_at.hpp +694 -0
  595. data/ext/third_party/asio/asio/include/asio/read_until.hpp +2863 -0
  596. data/ext/third_party/asio/asio/include/asio/redirect_error.hpp +66 -0
  597. data/ext/third_party/asio/asio/include/asio/serial_port.hpp +36 -0
  598. data/ext/third_party/asio/asio/include/asio/serial_port_base.hpp +167 -0
  599. data/ext/third_party/asio/asio/include/asio/signal_set.hpp +28 -0
  600. data/ext/third_party/asio/asio/include/asio/socket_base.hpp +559 -0
  601. data/ext/third_party/asio/asio/include/asio/spawn.hpp +336 -0
  602. data/ext/third_party/asio/asio/include/asio/ssl.hpp +28 -0
  603. data/ext/third_party/asio/asio/include/asio/ssl/context.hpp +761 -0
  604. data/ext/third_party/asio/asio/include/asio/ssl/context_base.hpp +209 -0
  605. data/ext/third_party/asio/asio/include/asio/ssl/detail/buffered_handshake_op.hpp +114 -0
  606. data/ext/third_party/asio/asio/include/asio/ssl/detail/engine.hpp +160 -0
  607. data/ext/third_party/asio/asio/include/asio/ssl/detail/handshake_op.hpp +62 -0
  608. data/ext/third_party/asio/asio/include/asio/ssl/detail/impl/engine.ipp +336 -0
  609. data/ext/third_party/asio/asio/include/asio/ssl/detail/impl/openssl_init.ipp +165 -0
  610. data/ext/third_party/asio/asio/include/asio/ssl/detail/io.hpp +381 -0
  611. data/ext/third_party/asio/asio/include/asio/ssl/detail/openssl_init.hpp +101 -0
  612. data/ext/third_party/asio/asio/include/asio/ssl/detail/openssl_types.hpp +34 -0
  613. data/ext/third_party/asio/asio/include/asio/ssl/detail/password_callback.hpp +66 -0
  614. data/ext/third_party/asio/asio/include/asio/ssl/detail/read_op.hpp +67 -0
  615. data/ext/third_party/asio/asio/include/asio/ssl/detail/shutdown_op.hpp +64 -0
  616. data/ext/third_party/asio/asio/include/asio/ssl/detail/stream_core.hpp +135 -0
  617. data/ext/third_party/asio/asio/include/asio/ssl/detail/verify_callback.hpp +62 -0
  618. data/ext/third_party/asio/asio/include/asio/ssl/detail/write_op.hpp +67 -0
  619. data/ext/third_party/asio/asio/include/asio/ssl/error.hpp +125 -0
  620. data/ext/third_party/asio/asio/include/asio/ssl/host_name_verification.hpp +90 -0
  621. data/ext/third_party/asio/asio/include/asio/ssl/impl/context.hpp +67 -0
  622. data/ext/third_party/asio/asio/include/asio/ssl/impl/context.ipp +1238 -0
  623. data/ext/third_party/asio/asio/include/asio/ssl/impl/error.ipp +102 -0
  624. data/ext/third_party/asio/asio/include/asio/ssl/impl/host_name_verification.ipp +73 -0
  625. data/ext/third_party/asio/asio/include/asio/ssl/impl/rfc2818_verification.ipp +164 -0
  626. data/ext/third_party/asio/asio/include/asio/ssl/impl/src.hpp +29 -0
  627. data/ext/third_party/asio/asio/include/asio/ssl/rfc2818_verification.hpp +98 -0
  628. data/ext/third_party/asio/asio/include/asio/ssl/stream.hpp +885 -0
  629. data/ext/third_party/asio/asio/include/asio/ssl/stream_base.hpp +52 -0
  630. data/ext/third_party/asio/asio/include/asio/ssl/verify_context.hpp +67 -0
  631. data/ext/third_party/asio/asio/include/asio/ssl/verify_mode.hpp +63 -0
  632. data/ext/third_party/asio/asio/include/asio/steady_timer.hpp +42 -0
  633. data/ext/third_party/asio/asio/include/asio/strand.hpp +314 -0
  634. data/ext/third_party/asio/asio/include/asio/streambuf.hpp +33 -0
  635. data/ext/third_party/asio/asio/include/asio/system_context.hpp +81 -0
  636. data/ext/third_party/asio/asio/include/asio/system_error.hpp +131 -0
  637. data/ext/third_party/asio/asio/include/asio/system_executor.hpp +129 -0
  638. data/ext/third_party/asio/asio/include/asio/system_timer.hpp +42 -0
  639. data/ext/third_party/asio/asio/include/asio/this_coro.hpp +45 -0
  640. data/ext/third_party/asio/asio/include/asio/thread.hpp +92 -0
  641. data/ext/third_party/asio/asio/include/asio/thread_pool.hpp +235 -0
  642. data/ext/third_party/asio/asio/include/asio/time_traits.hpp +86 -0
  643. data/ext/third_party/asio/asio/include/asio/ts/buffer.hpp +24 -0
  644. data/ext/third_party/asio/asio/include/asio/ts/executor.hpp +34 -0
  645. data/ext/third_party/asio/asio/include/asio/ts/internet.hpp +40 -0
  646. data/ext/third_party/asio/asio/include/asio/ts/io_context.hpp +20 -0
  647. data/ext/third_party/asio/asio/include/asio/ts/net.hpp +26 -0
  648. data/ext/third_party/asio/asio/include/asio/ts/netfwd.hpp +203 -0
  649. data/ext/third_party/asio/asio/include/asio/ts/socket.hpp +27 -0
  650. data/ext/third_party/asio/asio/include/asio/ts/timer.hpp +26 -0
  651. data/ext/third_party/asio/asio/include/asio/unyield.hpp +21 -0
  652. data/ext/third_party/asio/asio/include/asio/use_awaitable.hpp +110 -0
  653. data/ext/third_party/asio/asio/include/asio/use_future.hpp +160 -0
  654. data/ext/third_party/asio/asio/include/asio/uses_executor.hpp +71 -0
  655. data/ext/third_party/asio/asio/include/asio/version.hpp +23 -0
  656. data/ext/third_party/asio/asio/include/asio/wait_traits.hpp +56 -0
  657. data/ext/third_party/asio/asio/include/asio/windows/basic_object_handle.hpp +435 -0
  658. data/ext/third_party/asio/asio/include/asio/windows/basic_overlapped_handle.hpp +361 -0
  659. data/ext/third_party/asio/asio/include/asio/windows/basic_random_access_handle.hpp +490 -0
  660. data/ext/third_party/asio/asio/include/asio/windows/basic_stream_handle.hpp +474 -0
  661. data/ext/third_party/asio/asio/include/asio/windows/object_handle.hpp +38 -0
  662. data/ext/third_party/asio/asio/include/asio/windows/overlapped_handle.hpp +39 -0
  663. data/ext/third_party/asio/asio/include/asio/windows/overlapped_ptr.hpp +143 -0
  664. data/ext/third_party/asio/asio/include/asio/windows/random_access_handle.hpp +37 -0
  665. data/ext/third_party/asio/asio/include/asio/windows/stream_handle.hpp +37 -0
  666. data/ext/third_party/asio/asio/include/asio/write.hpp +1246 -0
  667. data/ext/third_party/asio/asio/include/asio/write_at.hpp +702 -0
  668. data/ext/third_party/asio/asio/include/asio/yield.hpp +23 -0
  669. data/ext/third_party/asio/asio/release.pl +440 -0
  670. data/ext/third_party/asio/asio/src/.gitignore +11 -0
  671. data/ext/third_party/asio/asio/src/Makefile.am +23 -0
  672. data/ext/third_party/asio/asio/src/Makefile.mgw +204 -0
  673. data/ext/third_party/asio/asio/src/Makefile.msc +497 -0
  674. data/ext/third_party/asio/asio/src/asio.cpp +11 -0
  675. data/ext/third_party/asio/asio/src/asio_ssl.cpp +11 -0
  676. data/ext/third_party/asio/asio/src/doc/.gitignore +5 -0
  677. data/ext/third_party/asio/asio/src/doc/Jamfile.v2 +62 -0
  678. data/ext/third_party/asio/asio/src/doc/asio.png +0 -0
  679. data/ext/third_party/asio/asio/src/doc/asio.qbk +127 -0
  680. data/ext/third_party/asio/asio/src/doc/asioref.sty +90 -0
  681. data/ext/third_party/asio/asio/src/doc/asioref.xsl +94 -0
  682. data/ext/third_party/asio/asio/src/doc/boost_bind_dox.txt +5 -0
  683. data/ext/third_party/asio/asio/src/doc/doxy2qbk.pl +22 -0
  684. data/ext/third_party/asio/asio/src/doc/examples.qbk +564 -0
  685. data/ext/third_party/asio/asio/src/doc/history.qbk +1794 -0
  686. data/ext/third_party/asio/asio/src/doc/index.xml +13 -0
  687. data/ext/third_party/asio/asio/src/doc/makepdf.pl +26 -0
  688. data/ext/third_party/asio/asio/src/doc/net_ts.qbk +479 -0
  689. data/ext/third_party/asio/asio/src/doc/noncopyable_dox.txt +3 -0
  690. data/ext/third_party/asio/asio/src/doc/overview.qbk +103 -0
  691. data/ext/third_party/asio/asio/src/doc/overview/allocation.qbk +89 -0
  692. data/ext/third_party/asio/asio/src/doc/overview/async.qbk +185 -0
  693. data/ext/third_party/asio/asio/src/doc/overview/async_op1.dot +78 -0
  694. data/ext/third_party/asio/asio/src/doc/overview/async_op1.png +0 -0
  695. data/ext/third_party/asio/asio/src/doc/overview/async_op2.dot +78 -0
  696. data/ext/third_party/asio/asio/src/doc/overview/async_op2.png +0 -0
  697. data/ext/third_party/asio/asio/src/doc/overview/basics.qbk +106 -0
  698. data/ext/third_party/asio/asio/src/doc/overview/bsd_sockets.qbk +270 -0
  699. data/ext/third_party/asio/asio/src/doc/overview/buffers.qbk +163 -0
  700. data/ext/third_party/asio/asio/src/doc/overview/concurrency_hint.qbk +88 -0
  701. data/ext/third_party/asio/asio/src/doc/overview/coroutine.qbk +51 -0
  702. data/ext/third_party/asio/asio/src/doc/overview/coroutines_ts.qbk +97 -0
  703. data/ext/third_party/asio/asio/src/doc/overview/cpp2011.qbk +271 -0
  704. data/ext/third_party/asio/asio/src/doc/overview/handler_tracking.qbk +220 -0
  705. data/ext/third_party/asio/asio/src/doc/overview/implementation.qbk +305 -0
  706. data/ext/third_party/asio/asio/src/doc/overview/iostreams.qbk +72 -0
  707. data/ext/third_party/asio/asio/src/doc/overview/line_based.qbk +118 -0
  708. data/ext/third_party/asio/asio/src/doc/overview/other_protocols.qbk +94 -0
  709. data/ext/third_party/asio/asio/src/doc/overview/posix.qbk +152 -0
  710. data/ext/third_party/asio/asio/src/doc/overview/proactor.dot +100 -0
  711. data/ext/third_party/asio/asio/src/doc/overview/proactor.png +0 -0
  712. data/ext/third_party/asio/asio/src/doc/overview/protocols.qbk +149 -0
  713. data/ext/third_party/asio/asio/src/doc/overview/rationale.qbk +54 -0
  714. data/ext/third_party/asio/asio/src/doc/overview/reactor.qbk +44 -0
  715. data/ext/third_party/asio/asio/src/doc/overview/serial_ports.qbk +45 -0
  716. data/ext/third_party/asio/asio/src/doc/overview/signals.qbk +44 -0
  717. data/ext/third_party/asio/asio/src/doc/overview/spawn.qbk +102 -0
  718. data/ext/third_party/asio/asio/src/doc/overview/ssl.qbk +124 -0
  719. data/ext/third_party/asio/asio/src/doc/overview/strands.qbk +114 -0
  720. data/ext/third_party/asio/asio/src/doc/overview/streams.qbk +62 -0
  721. data/ext/third_party/asio/asio/src/doc/overview/sync_op.dot +67 -0
  722. data/ext/third_party/asio/asio/src/doc/overview/sync_op.png +0 -0
  723. data/ext/third_party/asio/asio/src/doc/overview/threads.qbk +67 -0
  724. data/ext/third_party/asio/asio/src/doc/overview/timers.qbk +52 -0
  725. data/ext/third_party/asio/asio/src/doc/overview/windows.qbk +126 -0
  726. data/ext/third_party/asio/asio/src/doc/project-root.jam +1 -0
  727. data/ext/third_party/asio/asio/src/doc/quickref.xml +561 -0
  728. data/ext/third_party/asio/asio/src/doc/reference.dox +264 -0
  729. data/ext/third_party/asio/asio/src/doc/reference.qbk +125973 -0
  730. data/ext/third_party/asio/asio/src/doc/reference.xsl +1831 -0
  731. data/ext/third_party/asio/asio/src/doc/release_checklist.htm +68 -0
  732. data/ext/third_party/asio/asio/src/doc/requirements/AcceptHandler.qbk +72 -0
  733. data/ext/third_party/asio/asio/src/doc/requirements/AcceptableProtocol.qbk +25 -0
  734. data/ext/third_party/asio/asio/src/doc/requirements/AsyncRandomAccessReadDevice.qbk +56 -0
  735. data/ext/third_party/asio/asio/src/doc/requirements/AsyncRandomAccessWriteDevice.qbk +57 -0
  736. data/ext/third_party/asio/asio/src/doc/requirements/AsyncReadStream.qbk +50 -0
  737. data/ext/third_party/asio/asio/src/doc/requirements/AsyncWriteStream.qbk +48 -0
  738. data/ext/third_party/asio/asio/src/doc/requirements/BufferedHandshakeHandler.qbk +55 -0
  739. data/ext/third_party/asio/asio/src/doc/requirements/CompletionCondition.qbk +42 -0
  740. data/ext/third_party/asio/asio/src/doc/requirements/CompletionHandler.qbk +63 -0
  741. data/ext/third_party/asio/asio/src/doc/requirements/ConnectCondition.qbk +34 -0
  742. data/ext/third_party/asio/asio/src/doc/requirements/ConnectHandler.qbk +72 -0
  743. data/ext/third_party/asio/asio/src/doc/requirements/ConstBufferSequence.qbk +53 -0
  744. data/ext/third_party/asio/asio/src/doc/requirements/DynamicBuffer.qbk +16 -0
  745. data/ext/third_party/asio/asio/src/doc/requirements/DynamicBuffer_v1.qbk +93 -0
  746. data/ext/third_party/asio/asio/src/doc/requirements/DynamicBuffer_v2.qbk +94 -0
  747. data/ext/third_party/asio/asio/src/doc/requirements/Endpoint.qbk +97 -0
  748. data/ext/third_party/asio/asio/src/doc/requirements/EndpointSequence.qbk +30 -0
  749. data/ext/third_party/asio/asio/src/doc/requirements/ExecutionContext.qbk +36 -0
  750. data/ext/third_party/asio/asio/src/doc/requirements/Executor.qbk +141 -0
  751. data/ext/third_party/asio/asio/src/doc/requirements/GettableSerialPortOption.qbk +33 -0
  752. data/ext/third_party/asio/asio/src/doc/requirements/GettableSocketOption.qbk +67 -0
  753. data/ext/third_party/asio/asio/src/doc/requirements/Handler.qbk +64 -0
  754. data/ext/third_party/asio/asio/src/doc/requirements/HandshakeHandler.qbk +72 -0
  755. data/ext/third_party/asio/asio/src/doc/requirements/InternetProtocol.qbk +47 -0
  756. data/ext/third_party/asio/asio/src/doc/requirements/IoControlCommand.qbk +34 -0
  757. data/ext/third_party/asio/asio/src/doc/requirements/IoObjectService.qbk +62 -0
  758. data/ext/third_party/asio/asio/src/doc/requirements/IteratorConnectHandler.qbk +81 -0
  759. data/ext/third_party/asio/asio/src/doc/requirements/LegacyCompletionHandler.qbk +65 -0
  760. data/ext/third_party/asio/asio/src/doc/requirements/MoveAcceptHandler.qbk +61 -0
  761. data/ext/third_party/asio/asio/src/doc/requirements/MutableBufferSequence.qbk +54 -0
  762. data/ext/third_party/asio/asio/src/doc/requirements/ProtoAllocator.qbk +19 -0
  763. data/ext/third_party/asio/asio/src/doc/requirements/Protocol.qbk +56 -0
  764. data/ext/third_party/asio/asio/src/doc/requirements/RangeConnectHandler.qbk +82 -0
  765. data/ext/third_party/asio/asio/src/doc/requirements/ReadHandler.qbk +79 -0
  766. data/ext/third_party/asio/asio/src/doc/requirements/ResolveHandler.qbk +82 -0
  767. data/ext/third_party/asio/asio/src/doc/requirements/Service.qbk +40 -0
  768. data/ext/third_party/asio/asio/src/doc/requirements/SettableSerialPortOption.qbk +33 -0
  769. data/ext/third_party/asio/asio/src/doc/requirements/SettableSocketOption.qbk +54 -0
  770. data/ext/third_party/asio/asio/src/doc/requirements/ShutdownHandler.qbk +72 -0
  771. data/ext/third_party/asio/asio/src/doc/requirements/SignalHandler.qbk +79 -0
  772. data/ext/third_party/asio/asio/src/doc/requirements/SyncRandomAccessReadDevice.qbk +49 -0
  773. data/ext/third_party/asio/asio/src/doc/requirements/SyncRandomAccessWriteDevice.qbk +49 -0
  774. data/ext/third_party/asio/asio/src/doc/requirements/SyncReadStream.qbk +41 -0
  775. data/ext/third_party/asio/asio/src/doc/requirements/SyncWriteStream.qbk +39 -0
  776. data/ext/third_party/asio/asio/src/doc/requirements/TimeTraits.qbk +72 -0
  777. data/ext/third_party/asio/asio/src/doc/requirements/WaitHandler.qbk +72 -0
  778. data/ext/third_party/asio/asio/src/doc/requirements/WaitTraits.qbk +52 -0
  779. data/ext/third_party/asio/asio/src/doc/requirements/WriteHandler.qbk +79 -0
  780. data/ext/third_party/asio/asio/src/doc/requirements/asynchronous_operations.qbk +300 -0
  781. data/ext/third_party/asio/asio/src/doc/requirements/asynchronous_socket_operations.qbk +39 -0
  782. data/ext/third_party/asio/asio/src/doc/requirements/read_write_operations.qbk +34 -0
  783. data/ext/third_party/asio/asio/src/doc/requirements/synchronous_socket_operations.qbk +37 -0
  784. data/ext/third_party/asio/asio/src/doc/std_exception_dox.txt +7 -0
  785. data/ext/third_party/asio/asio/src/doc/tutorial.dox +226 -0
  786. data/ext/third_party/asio/asio/src/doc/tutorial.qbk +2387 -0
  787. data/ext/third_party/asio/asio/src/doc/tutorial.xsl +437 -0
  788. data/ext/third_party/asio/asio/src/doc/using.qbk +309 -0
  789. data/ext/third_party/asio/asio/src/examples/cpp03/Makefile.am +251 -0
  790. data/ext/third_party/asio/asio/src/examples/cpp03/allocation/.gitignore +10 -0
  791. data/ext/third_party/asio/asio/src/examples/cpp03/allocation/server.cpp +285 -0
  792. data/ext/third_party/asio/asio/src/examples/cpp03/buffers/.gitignore +10 -0
  793. data/ext/third_party/asio/asio/src/examples/cpp03/buffers/reference_counted.cpp +131 -0
  794. data/ext/third_party/asio/asio/src/examples/cpp03/chat/.gitignore +11 -0
  795. data/ext/third_party/asio/asio/src/examples/cpp03/chat/chat_client.cpp +177 -0
  796. data/ext/third_party/asio/asio/src/examples/cpp03/chat/chat_message.hpp +93 -0
  797. data/ext/third_party/asio/asio/src/examples/cpp03/chat/chat_server.cpp +249 -0
  798. data/ext/third_party/asio/asio/src/examples/cpp03/chat/posix_chat_client.cpp +204 -0
  799. data/ext/third_party/asio/asio/src/examples/cpp03/echo/.gitignore +11 -0
  800. data/ext/third_party/asio/asio/src/examples/cpp03/echo/async_tcp_echo_server.cpp +137 -0
  801. data/ext/third_party/asio/asio/src/examples/cpp03/echo/async_udp_echo_server.cpp +92 -0
  802. data/ext/third_party/asio/asio/src/examples/cpp03/echo/blocking_tcp_echo_client.cpp +59 -0
  803. data/ext/third_party/asio/asio/src/examples/cpp03/echo/blocking_tcp_echo_server.cpp +79 -0
  804. data/ext/third_party/asio/asio/src/examples/cpp03/echo/blocking_udp_echo_client.cpp +59 -0
  805. data/ext/third_party/asio/asio/src/examples/cpp03/echo/blocking_udp_echo_server.cpp +53 -0
  806. data/ext/third_party/asio/asio/src/examples/cpp03/fork/.gitignore +11 -0
  807. data/ext/third_party/asio/asio/src/examples/cpp03/fork/daemon.cpp +190 -0
  808. data/ext/third_party/asio/asio/src/examples/cpp03/fork/process_per_connection.cpp +161 -0
  809. data/ext/third_party/asio/asio/src/examples/cpp03/http/client/.gitignore +10 -0
  810. data/ext/third_party/asio/asio/src/examples/cpp03/http/client/async_client.cpp +204 -0
  811. data/ext/third_party/asio/asio/src/examples/cpp03/http/client/sync_client.cpp +106 -0
  812. data/ext/third_party/asio/asio/src/examples/cpp03/http/doc_root/data_1K.html +28 -0
  813. data/ext/third_party/asio/asio/src/examples/cpp03/http/doc_root/data_2K.html +49 -0
  814. data/ext/third_party/asio/asio/src/examples/cpp03/http/doc_root/data_4K.html +91 -0
  815. data/ext/third_party/asio/asio/src/examples/cpp03/http/doc_root/data_8K.html +175 -0
  816. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/.gitignore +11 -0
  817. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/connection.cpp +99 -0
  818. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/connection.hpp +83 -0
  819. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/connection_manager.cpp +38 -0
  820. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/connection_manager.hpp +44 -0
  821. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/header.hpp +28 -0
  822. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/main.cpp +44 -0
  823. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/mime_types.cpp +46 -0
  824. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/mime_types.hpp +27 -0
  825. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/reply.cpp +256 -0
  826. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/reply.hpp +64 -0
  827. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request.hpp +34 -0
  828. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request_handler.cpp +122 -0
  829. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request_handler.hpp +46 -0
  830. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request_parser.cpp +315 -0
  831. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request_parser.hpp +95 -0
  832. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/server.cpp +94 -0
  833. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/server.hpp +69 -0
  834. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/.gitignore +11 -0
  835. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/connection.cpp +93 -0
  836. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/connection.hpp +75 -0
  837. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/header.hpp +28 -0
  838. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/io_context_pool.cpp +69 -0
  839. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/io_context_pool.hpp +58 -0
  840. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/main.cpp +46 -0
  841. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/mime_types.cpp +46 -0
  842. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/mime_types.hpp +27 -0
  843. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/reply.cpp +256 -0
  844. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/reply.hpp +64 -0
  845. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request.hpp +34 -0
  846. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request_handler.cpp +122 -0
  847. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request_handler.hpp +46 -0
  848. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request_parser.cpp +315 -0
  849. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request_parser.hpp +95 -0
  850. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/server.cpp +77 -0
  851. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/server.hpp +68 -0
  852. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/.gitignore +11 -0
  853. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/connection.cpp +94 -0
  854. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/connection.hpp +78 -0
  855. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/header.hpp +28 -0
  856. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/main.cpp +46 -0
  857. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/mime_types.cpp +46 -0
  858. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/mime_types.hpp +27 -0
  859. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/reply.cpp +256 -0
  860. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/reply.hpp +64 -0
  861. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request.hpp +34 -0
  862. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request_handler.cpp +122 -0
  863. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request_handler.hpp +46 -0
  864. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request_parser.cpp +315 -0
  865. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request_parser.hpp +95 -0
  866. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/server.cpp +89 -0
  867. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/server.hpp +70 -0
  868. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/.gitignore +11 -0
  869. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/file_handler.cpp +122 -0
  870. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/file_handler.hpp +44 -0
  871. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/header.hpp +28 -0
  872. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/main.cpp +58 -0
  873. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/mime_types.cpp +46 -0
  874. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/mime_types.hpp +27 -0
  875. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/reply.cpp +256 -0
  876. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/reply.hpp +64 -0
  877. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/request.hpp +46 -0
  878. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/request_parser.cpp +226 -0
  879. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/request_parser.hpp +78 -0
  880. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/server.cpp +122 -0
  881. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/server.hpp +73 -0
  882. data/ext/third_party/asio/asio/src/examples/cpp03/icmp/.gitignore +10 -0
  883. data/ext/third_party/asio/asio/src/examples/cpp03/icmp/icmp_header.hpp +94 -0
  884. data/ext/third_party/asio/asio/src/examples/cpp03/icmp/ipv4_header.hpp +102 -0
  885. data/ext/third_party/asio/asio/src/examples/cpp03/icmp/ping.cpp +163 -0
  886. data/ext/third_party/asio/asio/src/examples/cpp03/invocation/.gitignore +10 -0
  887. data/ext/third_party/asio/asio/src/examples/cpp03/invocation/prioritised_handlers.cpp +171 -0
  888. data/ext/third_party/asio/asio/src/examples/cpp03/iostreams/.gitignore +11 -0
  889. data/ext/third_party/asio/asio/src/examples/cpp03/iostreams/daytime_client.cpp +44 -0
  890. data/ext/third_party/asio/asio/src/examples/cpp03/iostreams/daytime_server.cpp +51 -0
  891. data/ext/third_party/asio/asio/src/examples/cpp03/iostreams/http_client.cpp +91 -0
  892. data/ext/third_party/asio/asio/src/examples/cpp03/local/.gitignore +13 -0
  893. data/ext/third_party/asio/asio/src/examples/cpp03/local/connect_pair.cpp +141 -0
  894. data/ext/third_party/asio/asio/src/examples/cpp03/local/iostream_client.cpp +62 -0
  895. data/ext/third_party/asio/asio/src/examples/cpp03/local/stream_client.cpp +61 -0
  896. data/ext/third_party/asio/asio/src/examples/cpp03/local/stream_server.cpp +141 -0
  897. data/ext/third_party/asio/asio/src/examples/cpp03/multicast/.gitignore +11 -0
  898. data/ext/third_party/asio/asio/src/examples/cpp03/multicast/receiver.cpp +93 -0
  899. data/ext/third_party/asio/asio/src/examples/cpp03/multicast/sender.cpp +98 -0
  900. data/ext/third_party/asio/asio/src/examples/cpp03/nonblocking/.gitignore +10 -0
  901. data/ext/third_party/asio/asio/src/examples/cpp03/nonblocking/third_party_lib.cpp +240 -0
  902. data/ext/third_party/asio/asio/src/examples/cpp03/porthopper/.gitignore +11 -0
  903. data/ext/third_party/asio/asio/src/examples/cpp03/porthopper/client.cpp +192 -0
  904. data/ext/third_party/asio/asio/src/examples/cpp03/porthopper/protocol.hpp +156 -0
  905. data/ext/third_party/asio/asio/src/examples/cpp03/porthopper/server.cpp +187 -0
  906. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/.gitignore +11 -0
  907. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/client.cpp +125 -0
  908. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/connection.hpp +188 -0
  909. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/server.cpp +123 -0
  910. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/stock.hpp +50 -0
  911. data/ext/third_party/asio/asio/src/examples/cpp03/services/.gitignore +11 -0
  912. data/ext/third_party/asio/asio/src/examples/cpp03/services/basic_logger.hpp +83 -0
  913. data/ext/third_party/asio/asio/src/examples/cpp03/services/daytime_client.cpp +97 -0
  914. data/ext/third_party/asio/asio/src/examples/cpp03/services/logger.hpp +24 -0
  915. data/ext/third_party/asio/asio/src/examples/cpp03/services/logger_service.cpp +11 -0
  916. data/ext/third_party/asio/asio/src/examples/cpp03/services/logger_service.hpp +145 -0
  917. data/ext/third_party/asio/asio/src/examples/cpp03/socks4/.gitignore +10 -0
  918. data/ext/third_party/asio/asio/src/examples/cpp03/socks4/socks4.hpp +144 -0
  919. data/ext/third_party/asio/asio/src/examples/cpp03/socks4/sync_client.cpp +94 -0
  920. data/ext/third_party/asio/asio/src/examples/cpp03/spawn/.gitignore +12 -0
  921. data/ext/third_party/asio/asio/src/examples/cpp03/spawn/echo_server.cpp +122 -0
  922. data/ext/third_party/asio/asio/src/examples/cpp03/spawn/parallel_grep.cpp +89 -0
  923. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/.gitignore +11 -0
  924. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/README +8 -0
  925. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/ca.pem +49 -0
  926. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/client.cpp +157 -0
  927. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/dh2048.pem +8 -0
  928. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/server.cpp +170 -0
  929. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/server.pem +71 -0
  930. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/.gitignore +11 -0
  931. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/async_tcp_client.cpp +311 -0
  932. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/blocking_tcp_client.cpp +191 -0
  933. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/blocking_token_tcp_client.cpp +200 -0
  934. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/blocking_udp_client.cpp +154 -0
  935. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/server.cpp +433 -0
  936. data/ext/third_party/asio/asio/src/examples/cpp03/timers/.gitignore +10 -0
  937. data/ext/third_party/asio/asio/src/examples/cpp03/timers/time_t_timer.cpp +106 -0
  938. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime1/.gitignore +10 -0
  939. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime1/client.cpp +57 -0
  940. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime2/.gitignore +10 -0
  941. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime2/server.cpp +50 -0
  942. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime3/.gitignore +10 -0
  943. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime3/server.cpp +119 -0
  944. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime4/.gitignore +10 -0
  945. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime4/client.cpp +52 -0
  946. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime5/.gitignore +10 -0
  947. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime5/server.cpp +53 -0
  948. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime6/.gitignore +10 -0
  949. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime6/server.cpp +89 -0
  950. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime7/.gitignore +10 -0
  951. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime7/server.cpp +160 -0
  952. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime_dox.txt +500 -0
  953. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/index_dox.txt +48 -0
  954. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer1/.gitignore +10 -0
  955. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer1/timer.cpp +24 -0
  956. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer2/.gitignore +10 -0
  957. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer2/timer.cpp +29 -0
  958. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer3/.gitignore +10 -0
  959. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer3/timer.cpp +43 -0
  960. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer4/.gitignore +10 -0
  961. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer4/timer.cpp +54 -0
  962. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer5/.gitignore +10 -0
  963. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer5/timer.cpp +80 -0
  964. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer_dox.txt +378 -0
  965. data/ext/third_party/asio/asio/src/examples/cpp03/windows/.gitignore +10 -0
  966. data/ext/third_party/asio/asio/src/examples/cpp03/windows/transmit_file.cpp +177 -0
  967. data/ext/third_party/asio/asio/src/examples/cpp11/Makefile.am +161 -0
  968. data/ext/third_party/asio/asio/src/examples/cpp11/allocation/.gitignore +10 -0
  969. data/ext/third_party/asio/asio/src/examples/cpp11/allocation/server.cpp +255 -0
  970. data/ext/third_party/asio/asio/src/examples/cpp11/buffers/.gitignore +10 -0
  971. data/ext/third_party/asio/asio/src/examples/cpp11/buffers/reference_counted.cpp +122 -0
  972. data/ext/third_party/asio/asio/src/examples/cpp11/chat/.gitignore +11 -0
  973. data/ext/third_party/asio/asio/src/examples/cpp11/chat/chat_client.cpp +167 -0
  974. data/ext/third_party/asio/asio/src/examples/cpp11/chat/chat_message.hpp +91 -0
  975. data/ext/third_party/asio/asio/src/examples/cpp11/chat/chat_server.cpp +227 -0
  976. data/ext/third_party/asio/asio/src/examples/cpp11/echo/.gitignore +11 -0
  977. data/ext/third_party/asio/asio/src/examples/cpp11/echo/async_tcp_echo_server.cpp +114 -0
  978. data/ext/third_party/asio/asio/src/examples/cpp11/echo/async_udp_echo_server.cpp +82 -0
  979. data/ext/third_party/asio/asio/src/examples/cpp11/echo/blocking_tcp_echo_client.cpp +55 -0
  980. data/ext/third_party/asio/asio/src/examples/cpp11/echo/blocking_tcp_echo_server.cpp +74 -0
  981. data/ext/third_party/asio/asio/src/examples/cpp11/echo/blocking_udp_echo_client.cpp +58 -0
  982. data/ext/third_party/asio/asio/src/examples/cpp11/echo/blocking_udp_echo_server.cpp +52 -0
  983. data/ext/third_party/asio/asio/src/examples/cpp11/executors/.gitignore +5 -0
  984. data/ext/third_party/asio/asio/src/examples/cpp11/executors/actor.cpp +286 -0
  985. data/ext/third_party/asio/asio/src/examples/cpp11/executors/bank_account_1.cpp +54 -0
  986. data/ext/third_party/asio/asio/src/examples/cpp11/executors/bank_account_2.cpp +54 -0
  987. data/ext/third_party/asio/asio/src/examples/cpp11/executors/fork_join.cpp +328 -0
  988. data/ext/third_party/asio/asio/src/examples/cpp11/executors/pipeline.cpp +299 -0
  989. data/ext/third_party/asio/asio/src/examples/cpp11/executors/priority_scheduler.cpp +174 -0
  990. data/ext/third_party/asio/asio/src/examples/cpp11/fork/.gitignore +11 -0
  991. data/ext/third_party/asio/asio/src/examples/cpp11/fork/daemon.cpp +189 -0
  992. data/ext/third_party/asio/asio/src/examples/cpp11/fork/process_per_connection.cpp +162 -0
  993. data/ext/third_party/asio/asio/src/examples/cpp11/futures/.gitignore +11 -0
  994. data/ext/third_party/asio/asio/src/examples/cpp11/futures/daytime_client.cpp +94 -0
  995. data/ext/third_party/asio/asio/src/examples/cpp11/handler_tracking/custom_tracking.hpp +201 -0
  996. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/.gitignore +11 -0
  997. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/connection.cpp +94 -0
  998. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/connection.hpp +79 -0
  999. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/connection_manager.cpp +40 -0
  1000. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/connection_manager.hpp +48 -0
  1001. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/header.hpp +28 -0
  1002. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/main.cpp +43 -0
  1003. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/mime_types.cpp +45 -0
  1004. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/mime_types.hpp +27 -0
  1005. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/reply.cpp +255 -0
  1006. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/reply.hpp +64 -0
  1007. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request.hpp +34 -0
  1008. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request_handler.cpp +121 -0
  1009. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request_handler.hpp +47 -0
  1010. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request_parser.cpp +315 -0
  1011. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request_parser.hpp +96 -0
  1012. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/server.cpp +94 -0
  1013. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/server.hpp +64 -0
  1014. data/ext/third_party/asio/asio/src/examples/cpp11/invocation/.gitignore +10 -0
  1015. data/ext/third_party/asio/asio/src/examples/cpp11/invocation/prioritised_handlers.cpp +202 -0
  1016. data/ext/third_party/asio/asio/src/examples/cpp11/iostreams/.gitignore +11 -0
  1017. data/ext/third_party/asio/asio/src/examples/cpp11/iostreams/http_client.cpp +91 -0
  1018. data/ext/third_party/asio/asio/src/examples/cpp11/local/.gitignore +13 -0
  1019. data/ext/third_party/asio/asio/src/examples/cpp11/local/connect_pair.cpp +129 -0
  1020. data/ext/third_party/asio/asio/src/examples/cpp11/local/iostream_client.cpp +61 -0
  1021. data/ext/third_party/asio/asio/src/examples/cpp11/local/stream_client.cpp +60 -0
  1022. data/ext/third_party/asio/asio/src/examples/cpp11/local/stream_server.cpp +121 -0
  1023. data/ext/third_party/asio/asio/src/examples/cpp11/multicast/.gitignore +11 -0
  1024. data/ext/third_party/asio/asio/src/examples/cpp11/multicast/receiver.cpp +88 -0
  1025. data/ext/third_party/asio/asio/src/examples/cpp11/multicast/sender.cpp +91 -0
  1026. data/ext/third_party/asio/asio/src/examples/cpp11/nonblocking/.gitignore +10 -0
  1027. data/ext/third_party/asio/asio/src/examples/cpp11/nonblocking/third_party_lib.cpp +212 -0
  1028. data/ext/third_party/asio/asio/src/examples/cpp11/operations/.gitignore +10 -0
  1029. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_1.cpp +113 -0
  1030. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_2.cpp +131 -0
  1031. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_3.cpp +192 -0
  1032. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_4.cpp +207 -0
  1033. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_5.cpp +243 -0
  1034. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_6.cpp +302 -0
  1035. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_7.cpp +222 -0
  1036. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_8.cpp +217 -0
  1037. data/ext/third_party/asio/asio/src/examples/cpp11/socks4/.gitignore +10 -0
  1038. data/ext/third_party/asio/asio/src/examples/cpp11/socks4/socks4.hpp +143 -0
  1039. data/ext/third_party/asio/asio/src/examples/cpp11/socks4/sync_client.cpp +93 -0
  1040. data/ext/third_party/asio/asio/src/examples/cpp11/spawn/.gitignore +12 -0
  1041. data/ext/third_party/asio/asio/src/examples/cpp11/spawn/echo_server.cpp +111 -0
  1042. data/ext/third_party/asio/asio/src/examples/cpp11/spawn/parallel_grep.cpp +84 -0
  1043. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/.gitignore +11 -0
  1044. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/README +8 -0
  1045. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/ca.pem +49 -0
  1046. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/client.cpp +165 -0
  1047. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/dh2048.pem +8 -0
  1048. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/server.cpp +143 -0
  1049. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/server.pem +71 -0
  1050. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/.gitignore +11 -0
  1051. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/async_tcp_client.cpp +311 -0
  1052. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/blocking_tcp_client.cpp +192 -0
  1053. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/blocking_token_tcp_client.cpp +197 -0
  1054. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/blocking_udp_client.cpp +155 -0
  1055. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/server.cpp +433 -0
  1056. data/ext/third_party/asio/asio/src/examples/cpp11/timers/.gitignore +10 -0
  1057. data/ext/third_party/asio/asio/src/examples/cpp11/timers/time_t_timer.cpp +106 -0
  1058. data/ext/third_party/asio/asio/src/examples/cpp14/Makefile.am +64 -0
  1059. data/ext/third_party/asio/asio/src/examples/cpp14/echo/.gitignore +11 -0
  1060. data/ext/third_party/asio/asio/src/examples/cpp14/echo/async_tcp_echo_server.cpp +117 -0
  1061. data/ext/third_party/asio/asio/src/examples/cpp14/echo/async_udp_echo_server.cpp +83 -0
  1062. data/ext/third_party/asio/asio/src/examples/cpp14/echo/blocking_tcp_echo_client.cpp +55 -0
  1063. data/ext/third_party/asio/asio/src/examples/cpp14/echo/blocking_tcp_echo_server.cpp +77 -0
  1064. data/ext/third_party/asio/asio/src/examples/cpp14/echo/blocking_udp_echo_client.cpp +59 -0
  1065. data/ext/third_party/asio/asio/src/examples/cpp14/echo/blocking_udp_echo_server.cpp +53 -0
  1066. data/ext/third_party/asio/asio/src/examples/cpp14/executors/.gitignore +6 -0
  1067. data/ext/third_party/asio/asio/src/examples/cpp14/executors/actor.cpp +281 -0
  1068. data/ext/third_party/asio/asio/src/examples/cpp14/executors/async_1.cpp +47 -0
  1069. data/ext/third_party/asio/asio/src/examples/cpp14/executors/async_2.cpp +68 -0
  1070. data/ext/third_party/asio/asio/src/examples/cpp14/executors/bank_account_1.cpp +54 -0
  1071. data/ext/third_party/asio/asio/src/examples/cpp14/executors/bank_account_2.cpp +53 -0
  1072. data/ext/third_party/asio/asio/src/examples/cpp14/executors/fork_join.cpp +327 -0
  1073. data/ext/third_party/asio/asio/src/examples/cpp14/executors/pipeline.cpp +294 -0
  1074. data/ext/third_party/asio/asio/src/examples/cpp14/executors/priority_scheduler.cpp +173 -0
  1075. data/ext/third_party/asio/asio/src/examples/cpp14/iostreams/.gitignore +11 -0
  1076. data/ext/third_party/asio/asio/src/examples/cpp14/iostreams/http_client.cpp +91 -0
  1077. data/ext/third_party/asio/asio/src/examples/cpp14/operations/.gitignore +10 -0
  1078. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_1.cpp +113 -0
  1079. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_2.cpp +131 -0
  1080. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_3.cpp +186 -0
  1081. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_4.cpp +201 -0
  1082. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_5.cpp +238 -0
  1083. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_6.cpp +298 -0
  1084. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_7.cpp +219 -0
  1085. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_8.cpp +212 -0
  1086. data/ext/third_party/asio/asio/src/examples/cpp17/Makefile.am +8 -0
  1087. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/chat_server.cpp +225 -0
  1088. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/echo_server.cpp +76 -0
  1089. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/echo_server_with_default.cpp +78 -0
  1090. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/range_based_for.cpp +107 -0
  1091. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/refactored_echo_server.cpp +85 -0
  1092. data/ext/third_party/asio/asio/src/tests/.gitignore +11 -0
  1093. data/ext/third_party/asio/asio/src/tests/Makefile.am +432 -0
  1094. data/ext/third_party/asio/asio/src/tests/latency/.gitignore +11 -0
  1095. data/ext/third_party/asio/asio/src/tests/latency/allocator.hpp +52 -0
  1096. data/ext/third_party/asio/asio/src/tests/latency/high_res_clock.hpp +53 -0
  1097. data/ext/third_party/asio/asio/src/tests/latency/tcp_client.cpp +124 -0
  1098. data/ext/third_party/asio/asio/src/tests/latency/tcp_server.cpp +114 -0
  1099. data/ext/third_party/asio/asio/src/tests/latency/udp_client.cpp +104 -0
  1100. data/ext/third_party/asio/asio/src/tests/latency/udp_server.cpp +125 -0
  1101. data/ext/third_party/asio/asio/src/tests/performance/.gitignore +11 -0
  1102. data/ext/third_party/asio/asio/src/tests/performance/client.cpp +286 -0
  1103. data/ext/third_party/asio/asio/src/tests/performance/handler_allocator.hpp +112 -0
  1104. data/ext/third_party/asio/asio/src/tests/performance/server.cpp +233 -0
  1105. data/ext/third_party/asio/asio/src/tests/unit/.gitignore +75 -0
  1106. data/ext/third_party/asio/asio/src/tests/unit/archetypes/async_ops.hpp +415 -0
  1107. data/ext/third_party/asio/asio/src/tests/unit/archetypes/async_result.hpp +94 -0
  1108. data/ext/third_party/asio/asio/src/tests/unit/archetypes/gettable_socket_option.hpp +54 -0
  1109. data/ext/third_party/asio/asio/src/tests/unit/archetypes/io_control_command.hpp +32 -0
  1110. data/ext/third_party/asio/asio/src/tests/unit/archetypes/settable_socket_option.hpp +49 -0
  1111. data/ext/third_party/asio/asio/src/tests/unit/associated_allocator.cpp +25 -0
  1112. data/ext/third_party/asio/asio/src/tests/unit/associated_executor.cpp +25 -0
  1113. data/ext/third_party/asio/asio/src/tests/unit/async_result.cpp +25 -0
  1114. data/ext/third_party/asio/asio/src/tests/unit/awaitable.cpp +25 -0
  1115. data/ext/third_party/asio/asio/src/tests/unit/basic_datagram_socket.cpp +25 -0
  1116. data/ext/third_party/asio/asio/src/tests/unit/basic_deadline_timer.cpp +25 -0
  1117. data/ext/third_party/asio/asio/src/tests/unit/basic_raw_socket.cpp +25 -0
  1118. data/ext/third_party/asio/asio/src/tests/unit/basic_seq_packet_socket.cpp +25 -0
  1119. data/ext/third_party/asio/asio/src/tests/unit/basic_serial_port.cpp +26 -0
  1120. data/ext/third_party/asio/asio/src/tests/unit/basic_signal_set.cpp +25 -0
  1121. data/ext/third_party/asio/asio/src/tests/unit/basic_socket.cpp +25 -0
  1122. data/ext/third_party/asio/asio/src/tests/unit/basic_socket_acceptor.cpp +25 -0
  1123. data/ext/third_party/asio/asio/src/tests/unit/basic_stream_socket.cpp +25 -0
  1124. data/ext/third_party/asio/asio/src/tests/unit/basic_streambuf.cpp +25 -0
  1125. data/ext/third_party/asio/asio/src/tests/unit/basic_waitable_timer.cpp +25 -0
  1126. data/ext/third_party/asio/asio/src/tests/unit/bind_executor.cpp +25 -0
  1127. data/ext/third_party/asio/asio/src/tests/unit/buffer.cpp +830 -0
  1128. data/ext/third_party/asio/asio/src/tests/unit/buffered_read_stream.cpp +338 -0
  1129. data/ext/third_party/asio/asio/src/tests/unit/buffered_stream.cpp +364 -0
  1130. data/ext/third_party/asio/asio/src/tests/unit/buffered_write_stream.cpp +353 -0
  1131. data/ext/third_party/asio/asio/src/tests/unit/buffers_iterator.cpp +292 -0
  1132. data/ext/third_party/asio/asio/src/tests/unit/co_spawn.cpp +25 -0
  1133. data/ext/third_party/asio/asio/src/tests/unit/completion_condition.cpp +25 -0
  1134. data/ext/third_party/asio/asio/src/tests/unit/compose.cpp +185 -0
  1135. data/ext/third_party/asio/asio/src/tests/unit/connect.cpp +1190 -0
  1136. data/ext/third_party/asio/asio/src/tests/unit/coroutine.cpp +112 -0
  1137. data/ext/third_party/asio/asio/src/tests/unit/deadline_timer.cpp +392 -0
  1138. data/ext/third_party/asio/asio/src/tests/unit/defer.cpp +25 -0
  1139. data/ext/third_party/asio/asio/src/tests/unit/detached.cpp +25 -0
  1140. data/ext/third_party/asio/asio/src/tests/unit/dispatch.cpp +25 -0
  1141. data/ext/third_party/asio/asio/src/tests/unit/error.cpp +89 -0
  1142. data/ext/third_party/asio/asio/src/tests/unit/execution_context.cpp +25 -0
  1143. data/ext/third_party/asio/asio/src/tests/unit/executor.cpp +25 -0
  1144. data/ext/third_party/asio/asio/src/tests/unit/executor_work_guard.cpp +25 -0
  1145. data/ext/third_party/asio/asio/src/tests/unit/generic/.gitignore +14 -0
  1146. data/ext/third_party/asio/asio/src/tests/unit/generic/basic_endpoint.cpp +25 -0
  1147. data/ext/third_party/asio/asio/src/tests/unit/generic/datagram_protocol.cpp +263 -0
  1148. data/ext/third_party/asio/asio/src/tests/unit/generic/raw_protocol.cpp +263 -0
  1149. data/ext/third_party/asio/asio/src/tests/unit/generic/seq_packet_protocol.cpp +205 -0
  1150. data/ext/third_party/asio/asio/src/tests/unit/generic/stream_protocol.cpp +248 -0
  1151. data/ext/third_party/asio/asio/src/tests/unit/high_resolution_timer.cpp +30 -0
  1152. data/ext/third_party/asio/asio/src/tests/unit/io_context.cpp +362 -0
  1153. data/ext/third_party/asio/asio/src/tests/unit/io_context_strand.cpp +325 -0
  1154. data/ext/third_party/asio/asio/src/tests/unit/ip/.gitignore +27 -0
  1155. data/ext/third_party/asio/asio/src/tests/unit/ip/address.cpp +144 -0
  1156. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_endpoint.cpp +25 -0
  1157. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_resolver.cpp +25 -0
  1158. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_resolver_entry.cpp +25 -0
  1159. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_resolver_iterator.cpp +25 -0
  1160. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_resolver_query.cpp +25 -0
  1161. data/ext/third_party/asio/asio/src/tests/unit/ip/host_name.cpp +55 -0
  1162. data/ext/third_party/asio/asio/src/tests/unit/ip/icmp.cpp +577 -0
  1163. data/ext/third_party/asio/asio/src/tests/unit/ip/multicast.cpp +363 -0
  1164. data/ext/third_party/asio/asio/src/tests/unit/ip/network_v4.cpp +314 -0
  1165. data/ext/third_party/asio/asio/src/tests/unit/ip/network_v6.cpp +238 -0
  1166. data/ext/third_party/asio/asio/src/tests/unit/ip/resolver_query_base.cpp +25 -0
  1167. data/ext/third_party/asio/asio/src/tests/unit/ip/tcp.cpp +1346 -0
  1168. data/ext/third_party/asio/asio/src/tests/unit/ip/udp.cpp +673 -0
  1169. data/ext/third_party/asio/asio/src/tests/unit/ip/unicast.cpp +171 -0
  1170. data/ext/third_party/asio/asio/src/tests/unit/ip/v6_only.cpp +135 -0
  1171. data/ext/third_party/asio/asio/src/tests/unit/is_read_buffered.cpp +129 -0
  1172. data/ext/third_party/asio/asio/src/tests/unit/is_write_buffered.cpp +129 -0
  1173. data/ext/third_party/asio/asio/src/tests/unit/local/.gitignore +13 -0
  1174. data/ext/third_party/asio/asio/src/tests/unit/local/basic_endpoint.cpp +25 -0
  1175. data/ext/third_party/asio/asio/src/tests/unit/local/connect_pair.cpp +76 -0
  1176. data/ext/third_party/asio/asio/src/tests/unit/local/datagram_protocol.cpp +242 -0
  1177. data/ext/third_party/asio/asio/src/tests/unit/local/stream_protocol.cpp +219 -0
  1178. data/ext/third_party/asio/asio/src/tests/unit/packaged_task.cpp +25 -0
  1179. data/ext/third_party/asio/asio/src/tests/unit/placeholders.cpp +25 -0
  1180. data/ext/third_party/asio/asio/src/tests/unit/posix/.gitignore +14 -0
  1181. data/ext/third_party/asio/asio/src/tests/unit/posix/basic_descriptor.cpp +25 -0
  1182. data/ext/third_party/asio/asio/src/tests/unit/posix/basic_stream_descriptor.cpp +25 -0
  1183. data/ext/third_party/asio/asio/src/tests/unit/posix/descriptor.cpp +25 -0
  1184. data/ext/third_party/asio/asio/src/tests/unit/posix/descriptor_base.cpp +25 -0
  1185. data/ext/third_party/asio/asio/src/tests/unit/posix/stream_descriptor.cpp +183 -0
  1186. data/ext/third_party/asio/asio/src/tests/unit/post.cpp +25 -0
  1187. data/ext/third_party/asio/asio/src/tests/unit/read.cpp +4997 -0
  1188. data/ext/third_party/asio/asio/src/tests/unit/read_at.cpp +7502 -0
  1189. data/ext/third_party/asio/asio/src/tests/unit/read_until.cpp +1658 -0
  1190. data/ext/third_party/asio/asio/src/tests/unit/redirect_error.cpp +25 -0
  1191. data/ext/third_party/asio/asio/src/tests/unit/serial_port.cpp +173 -0
  1192. data/ext/third_party/asio/asio/src/tests/unit/serial_port_base.cpp +99 -0
  1193. data/ext/third_party/asio/asio/src/tests/unit/signal_set.cpp +95 -0
  1194. data/ext/third_party/asio/asio/src/tests/unit/socket_base.cpp +650 -0
  1195. data/ext/third_party/asio/asio/src/tests/unit/ssl/.gitignore +15 -0
  1196. data/ext/third_party/asio/asio/src/tests/unit/ssl/context.cpp +25 -0
  1197. data/ext/third_party/asio/asio/src/tests/unit/ssl/context_base.cpp +25 -0
  1198. data/ext/third_party/asio/asio/src/tests/unit/ssl/error.cpp +25 -0
  1199. data/ext/third_party/asio/asio/src/tests/unit/ssl/host_name_verification.cpp +25 -0
  1200. data/ext/third_party/asio/asio/src/tests/unit/ssl/rfc2818_verification.cpp +25 -0
  1201. data/ext/third_party/asio/asio/src/tests/unit/ssl/stream.cpp +191 -0
  1202. data/ext/third_party/asio/asio/src/tests/unit/ssl/stream_base.cpp +25 -0
  1203. data/ext/third_party/asio/asio/src/tests/unit/steady_timer.cpp +30 -0
  1204. data/ext/third_party/asio/asio/src/tests/unit/strand.cpp +263 -0
  1205. data/ext/third_party/asio/asio/src/tests/unit/streambuf.cpp +62 -0
  1206. data/ext/third_party/asio/asio/src/tests/unit/system_context.cpp +30 -0
  1207. data/ext/third_party/asio/asio/src/tests/unit/system_executor.cpp +30 -0
  1208. data/ext/third_party/asio/asio/src/tests/unit/system_timer.cpp +399 -0
  1209. data/ext/third_party/asio/asio/src/tests/unit/this_coro.cpp +25 -0
  1210. data/ext/third_party/asio/asio/src/tests/unit/thread.cpp +25 -0
  1211. data/ext/third_party/asio/asio/src/tests/unit/time_traits.cpp +25 -0
  1212. data/ext/third_party/asio/asio/src/tests/unit/ts/.gitignore +17 -0
  1213. data/ext/third_party/asio/asio/src/tests/unit/ts/buffer.cpp +30 -0
  1214. data/ext/third_party/asio/asio/src/tests/unit/ts/executor.cpp +30 -0
  1215. data/ext/third_party/asio/asio/src/tests/unit/ts/internet.cpp +30 -0
  1216. data/ext/third_party/asio/asio/src/tests/unit/ts/io_context.cpp +30 -0
  1217. data/ext/third_party/asio/asio/src/tests/unit/ts/net.cpp +30 -0
  1218. data/ext/third_party/asio/asio/src/tests/unit/ts/netfwd.cpp +33 -0
  1219. data/ext/third_party/asio/asio/src/tests/unit/ts/socket.cpp +30 -0
  1220. data/ext/third_party/asio/asio/src/tests/unit/ts/timer.cpp +30 -0
  1221. data/ext/third_party/asio/asio/src/tests/unit/unit_test.hpp +175 -0
  1222. data/ext/third_party/asio/asio/src/tests/unit/use_awaitable.cpp +25 -0
  1223. data/ext/third_party/asio/asio/src/tests/unit/use_future.cpp +670 -0
  1224. data/ext/third_party/asio/asio/src/tests/unit/uses_executor.cpp +25 -0
  1225. data/ext/third_party/asio/asio/src/tests/unit/wait_traits.cpp +25 -0
  1226. data/ext/third_party/asio/asio/src/tests/unit/windows/.gitignore +18 -0
  1227. data/ext/third_party/asio/asio/src/tests/unit/windows/basic_object_handle.cpp +25 -0
  1228. data/ext/third_party/asio/asio/src/tests/unit/windows/basic_overlapped_handle.cpp +25 -0
  1229. data/ext/third_party/asio/asio/src/tests/unit/windows/basic_random_access_handle.cpp +25 -0
  1230. data/ext/third_party/asio/asio/src/tests/unit/windows/basic_stream_handle.cpp +25 -0
  1231. data/ext/third_party/asio/asio/src/tests/unit/windows/object_handle.cpp +130 -0
  1232. data/ext/third_party/asio/asio/src/tests/unit/windows/overlapped_handle.cpp +26 -0
  1233. data/ext/third_party/asio/asio/src/tests/unit/windows/overlapped_ptr.cpp +107 -0
  1234. data/ext/third_party/asio/asio/src/tests/unit/windows/random_access_handle.cpp +155 -0
  1235. data/ext/third_party/asio/asio/src/tests/unit/windows/stream_handle.cpp +148 -0
  1236. data/ext/third_party/asio/asio/src/tests/unit/write.cpp +4904 -0
  1237. data/ext/third_party/asio/asio/src/tests/unit/write_at.cpp +7563 -0
  1238. data/ext/third_party/asio/asio/src/tools/handlerviz.pl +299 -0
  1239. data/ext/third_party/asio/asio/tsify.pl +574 -0
  1240. data/ext/third_party/gsl/.clang-format +34 -0
  1241. data/ext/third_party/gsl/.github/workflows/main.yml +94 -0
  1242. data/ext/third_party/gsl/.gitignore +16 -0
  1243. data/ext/third_party/gsl/.travis.yml +551 -0
  1244. data/ext/third_party/gsl/CMakeLists.txt +119 -0
  1245. data/ext/third_party/gsl/CMakeSettings.json +18 -0
  1246. data/ext/third_party/gsl/CONTRIBUTING.md +29 -0
  1247. data/ext/third_party/gsl/GSL.natvis +98 -0
  1248. data/ext/third_party/gsl/LICENSE +21 -0
  1249. data/ext/third_party/gsl/README.md +124 -0
  1250. data/ext/third_party/gsl/ThirdPartyNotices.txt +41 -0
  1251. data/ext/third_party/gsl/appveyor.yml +128 -0
  1252. data/ext/third_party/gsl/include/gsl/gsl +29 -0
  1253. data/ext/third_party/gsl/include/gsl/gsl_algorithm +61 -0
  1254. data/ext/third_party/gsl/include/gsl/gsl_assert +133 -0
  1255. data/ext/third_party/gsl/include/gsl/gsl_byte +209 -0
  1256. data/ext/third_party/gsl/include/gsl/gsl_util +171 -0
  1257. data/ext/third_party/gsl/include/gsl/multi_span +2273 -0
  1258. data/ext/third_party/gsl/include/gsl/pointers +301 -0
  1259. data/ext/third_party/gsl/include/gsl/span +764 -0
  1260. data/ext/third_party/gsl/include/gsl/span_ext +198 -0
  1261. data/ext/third_party/gsl/include/gsl/string_span +716 -0
  1262. data/ext/third_party/gsl/tests/CMakeLists.txt +267 -0
  1263. data/ext/third_party/gsl/tests/CMakeLists.txt.in +14 -0
  1264. data/ext/third_party/gsl/tests/algorithm_tests.cpp +227 -0
  1265. data/ext/third_party/gsl/tests/assertion_tests.cpp +61 -0
  1266. data/ext/third_party/gsl/tests/at_tests.cpp +135 -0
  1267. data/ext/third_party/gsl/tests/bounds_tests.cpp +102 -0
  1268. data/ext/third_party/gsl/tests/byte_tests.cpp +129 -0
  1269. data/ext/third_party/gsl/tests/multi_span_tests.cpp +1866 -0
  1270. data/ext/third_party/gsl/tests/no_exception_ensure_tests.cpp +48 -0
  1271. data/ext/third_party/gsl/tests/notnull_tests.cpp +535 -0
  1272. data/ext/third_party/gsl/tests/owner_tests.cpp +43 -0
  1273. data/ext/third_party/gsl/tests/span_compatibility_tests.cpp +1021 -0
  1274. data/ext/third_party/gsl/tests/span_ext_tests.cpp +360 -0
  1275. data/ext/third_party/gsl/tests/span_tests.cpp +1244 -0
  1276. data/ext/third_party/gsl/tests/strict_notnull_tests.cpp +190 -0
  1277. data/ext/third_party/gsl/tests/strided_span_tests.cpp +790 -0
  1278. data/ext/third_party/gsl/tests/string_span_tests.cpp +1217 -0
  1279. data/ext/third_party/gsl/tests/utils_tests.cpp +129 -0
  1280. data/ext/third_party/http_parser/.gitignore +30 -0
  1281. data/ext/third_party/http_parser/.mailmap +8 -0
  1282. data/ext/third_party/http_parser/.travis.yml +13 -0
  1283. data/ext/third_party/http_parser/AUTHORS +68 -0
  1284. data/ext/third_party/http_parser/LICENSE-MIT +19 -0
  1285. data/ext/third_party/http_parser/README.md +246 -0
  1286. data/ext/third_party/http_parser/bench.c +128 -0
  1287. data/ext/third_party/http_parser/contrib/parsertrace.c +157 -0
  1288. data/ext/third_party/http_parser/contrib/url_parser.c +47 -0
  1289. data/ext/third_party/http_parser/fuzzers/fuzz_parser.c +26 -0
  1290. data/ext/third_party/http_parser/fuzzers/fuzz_url.c +14 -0
  1291. data/ext/third_party/http_parser/http_parser.c +2568 -0
  1292. data/ext/third_party/http_parser/http_parser.gyp +111 -0
  1293. data/ext/third_party/http_parser/http_parser.h +447 -0
  1294. data/ext/third_party/http_parser/test.c +4600 -0
  1295. data/ext/third_party/json/.appveyor.yml +44 -0
  1296. data/ext/third_party/json/.clang-format +84 -0
  1297. data/ext/third_party/json/.conan/build.py +80 -0
  1298. data/ext/third_party/json/.conan/test_package/CMakeLists.txt +12 -0
  1299. data/ext/third_party/json/.conan/test_package/conanfile.py +24 -0
  1300. data/ext/third_party/json/.conan/test_package/test_package.cpp +16 -0
  1301. data/ext/third_party/json/.gitignore +3 -0
  1302. data/ext/third_party/json/.travis.yml +173 -0
  1303. data/ext/third_party/json/CMakeLists.txt +44 -0
  1304. data/ext/third_party/json/LICENSE +21 -0
  1305. data/ext/third_party/json/LICENSE.double-conversion +32 -0
  1306. data/ext/third_party/json/LICENSE.itoa +19 -0
  1307. data/ext/third_party/json/LICENSE.ryu +201 -0
  1308. data/ext/third_party/json/README.md +149 -0
  1309. data/ext/third_party/json/conanfile.py +28 -0
  1310. data/ext/third_party/json/contrib/nlohmann.cpp +48 -0
  1311. data/ext/third_party/json/contrib/nlohmann/from_value.hpp +62 -0
  1312. data/ext/third_party/json/contrib/nlohmann/json.hpp +18928 -0
  1313. data/ext/third_party/json/contrib/nlohmann/to_value.hpp +109 -0
  1314. data/ext/third_party/json/doc/Advanced-Use-Cases.md +83 -0
  1315. data/ext/third_party/json/doc/Batteries-Included.md +212 -0
  1316. data/ext/third_party/json/doc/Binding-Traits.md +319 -0
  1317. data/ext/third_party/json/doc/Changelog.md +31 -0
  1318. data/ext/third_party/json/doc/Common-Use-Cases.md +148 -0
  1319. data/ext/third_party/json/doc/Design-Decisions.md +36 -0
  1320. data/ext/third_party/json/doc/Events-Interface.md +140 -0
  1321. data/ext/third_party/json/doc/Getting-Started.md +19 -0
  1322. data/ext/third_party/json/doc/Instance-Sharing.md +163 -0
  1323. data/ext/third_party/json/doc/Interoperability.md +75 -0
  1324. data/ext/third_party/json/doc/Overview.md +24 -0
  1325. data/ext/third_party/json/doc/Overview.png +0 -0
  1326. data/ext/third_party/json/doc/Parser-Interface.md +84 -0
  1327. data/ext/third_party/json/doc/README.md +78 -0
  1328. data/ext/third_party/json/doc/Scratchpad.md +25 -0
  1329. data/ext/third_party/json/doc/Type-Traits.md +364 -0
  1330. data/ext/third_party/json/doc/Types.png +0 -0
  1331. data/ext/third_party/json/doc/Value-Class.md +525 -0
  1332. data/ext/third_party/json/include/tao/json.hpp +45 -0
  1333. data/ext/third_party/json/include/tao/json/basic_value.hpp +941 -0
  1334. data/ext/third_party/json/include/tao/json/binary.hpp +103 -0
  1335. data/ext/third_party/json/include/tao/json/binary_view.hpp +31 -0
  1336. data/ext/third_party/json/include/tao/json/binding.hpp +71 -0
  1337. data/ext/third_party/json/include/tao/json/binding/constant.hpp +232 -0
  1338. data/ext/third_party/json/include/tao/json/binding/element.hpp +182 -0
  1339. data/ext/third_party/json/include/tao/json/binding/factory.hpp +250 -0
  1340. data/ext/third_party/json/include/tao/json/binding/for_nothing_value.hpp +17 -0
  1341. data/ext/third_party/json/include/tao/json/binding/for_unknown_key.hpp +17 -0
  1342. data/ext/third_party/json/include/tao/json/binding/inherit.hpp +14 -0
  1343. data/ext/third_party/json/include/tao/json/binding/internal/array.hpp +103 -0
  1344. data/ext/third_party/json/include/tao/json/binding/internal/inherit.hpp +45 -0
  1345. data/ext/third_party/json/include/tao/json/binding/internal/object.hpp +267 -0
  1346. data/ext/third_party/json/include/tao/json/binding/internal/type_key.hpp +54 -0
  1347. data/ext/third_party/json/include/tao/json/binding/member.hpp +32 -0
  1348. data/ext/third_party/json/include/tao/json/binding/member_kind.hpp +17 -0
  1349. data/ext/third_party/json/include/tao/json/binding/versions.hpp +127 -0
  1350. data/ext/third_party/json/include/tao/json/cbor.hpp +18 -0
  1351. data/ext/third_party/json/include/tao/json/cbor/consume_file.hpp +34 -0
  1352. data/ext/third_party/json/include/tao/json/cbor/consume_string.hpp +32 -0
  1353. data/ext/third_party/json/include/tao/json/cbor/events/from_file.hpp +27 -0
  1354. data/ext/third_party/json/include/tao/json/cbor/events/from_input.hpp +43 -0
  1355. data/ext/third_party/json/include/tao/json/cbor/events/from_string.hpp +37 -0
  1356. data/ext/third_party/json/include/tao/json/cbor/events/to_stream.hpp +161 -0
  1357. data/ext/third_party/json/include/tao/json/cbor/events/to_string.hpp +31 -0
  1358. data/ext/third_party/json/include/tao/json/cbor/from_file.hpp +33 -0
  1359. data/ext/third_party/json/include/tao/json/cbor/from_input.hpp +33 -0
  1360. data/ext/third_party/json/include/tao/json/cbor/from_string.hpp +32 -0
  1361. data/ext/third_party/json/include/tao/json/cbor/internal/grammar.hpp +417 -0
  1362. data/ext/third_party/json/include/tao/json/cbor/internal/major.hpp +28 -0
  1363. data/ext/third_party/json/include/tao/json/cbor/parts_parser.hpp +392 -0
  1364. data/ext/third_party/json/include/tao/json/cbor/to_stream.hpp +27 -0
  1365. data/ext/third_party/json/include/tao/json/cbor/to_string.hpp +28 -0
  1366. data/ext/third_party/json/include/tao/json/consume.hpp +43 -0
  1367. data/ext/third_party/json/include/tao/json/consume_file.hpp +33 -0
  1368. data/ext/third_party/json/include/tao/json/consume_string.hpp +31 -0
  1369. data/ext/third_party/json/include/tao/json/contrib/array_traits.hpp +43 -0
  1370. data/ext/third_party/json/include/tao/json/contrib/deque_traits.hpp +41 -0
  1371. data/ext/third_party/json/include/tao/json/contrib/diff.hpp +106 -0
  1372. data/ext/third_party/json/include/tao/json/contrib/get.hpp +152 -0
  1373. data/ext/third_party/json/include/tao/json/contrib/internal/array_traits.hpp +92 -0
  1374. data/ext/third_party/json/include/tao/json/contrib/internal/indirect_traits.hpp +69 -0
  1375. data/ext/third_party/json/include/tao/json/contrib/internal/object_traits.hpp +105 -0
  1376. data/ext/third_party/json/include/tao/json/contrib/internal/type_traits.hpp +36 -0
  1377. data/ext/third_party/json/include/tao/json/contrib/list_traits.hpp +41 -0
  1378. data/ext/third_party/json/include/tao/json/contrib/map_traits.hpp +43 -0
  1379. data/ext/third_party/json/include/tao/json/contrib/multimap_traits.hpp +43 -0
  1380. data/ext/third_party/json/include/tao/json/contrib/multiset_traits.hpp +41 -0
  1381. data/ext/third_party/json/include/tao/json/contrib/pair_traits.hpp +21 -0
  1382. data/ext/third_party/json/include/tao/json/contrib/patch.hpp +105 -0
  1383. data/ext/third_party/json/include/tao/json/contrib/pointer_traits.hpp +59 -0
  1384. data/ext/third_party/json/include/tao/json/contrib/position.hpp +166 -0
  1385. data/ext/third_party/json/include/tao/json/contrib/reference.hpp +115 -0
  1386. data/ext/third_party/json/include/tao/json/contrib/schema.hpp +1851 -0
  1387. data/ext/third_party/json/include/tao/json/contrib/set_traits.hpp +41 -0
  1388. data/ext/third_party/json/include/tao/json/contrib/shared_ptr_traits.hpp +90 -0
  1389. data/ext/third_party/json/include/tao/json/contrib/traits.hpp +121 -0
  1390. data/ext/third_party/json/include/tao/json/contrib/tuple_traits.hpp +51 -0
  1391. data/ext/third_party/json/include/tao/json/contrib/unique_ptr_traits.hpp +89 -0
  1392. data/ext/third_party/json/include/tao/json/contrib/unordered_map_traits.hpp +43 -0
  1393. data/ext/third_party/json/include/tao/json/contrib/unordered_set_traits.hpp +41 -0
  1394. data/ext/third_party/json/include/tao/json/contrib/vector_bool_traits.hpp +45 -0
  1395. data/ext/third_party/json/include/tao/json/contrib/vector_traits.hpp +51 -0
  1396. data/ext/third_party/json/include/tao/json/events.hpp +47 -0
  1397. data/ext/third_party/json/include/tao/json/events/apply.hpp +20 -0
  1398. data/ext/third_party/json/include/tao/json/events/binary_to_base64.hpp +26 -0
  1399. data/ext/third_party/json/include/tao/json/events/binary_to_base64url.hpp +28 -0
  1400. data/ext/third_party/json/include/tao/json/events/binary_to_exception.hpp +27 -0
  1401. data/ext/third_party/json/include/tao/json/events/binary_to_hex.hpp +26 -0
  1402. data/ext/third_party/json/include/tao/json/events/compare.hpp +265 -0
  1403. data/ext/third_party/json/include/tao/json/events/debug.hpp +145 -0
  1404. data/ext/third_party/json/include/tao/json/events/discard.hpp +43 -0
  1405. data/ext/third_party/json/include/tao/json/events/from_file.hpp +28 -0
  1406. data/ext/third_party/json/include/tao/json/events/from_input.hpp +45 -0
  1407. data/ext/third_party/json/include/tao/json/events/from_stream.hpp +33 -0
  1408. data/ext/third_party/json/include/tao/json/events/from_string.hpp +38 -0
  1409. data/ext/third_party/json/include/tao/json/events/from_value.hpp +202 -0
  1410. data/ext/third_party/json/include/tao/json/events/hash.hpp +174 -0
  1411. data/ext/third_party/json/include/tao/json/events/invalid_string_to_binary.hpp +50 -0
  1412. data/ext/third_party/json/include/tao/json/events/invalid_string_to_exception.hpp +49 -0
  1413. data/ext/third_party/json/include/tao/json/events/invalid_string_to_hex.hpp +48 -0
  1414. data/ext/third_party/json/include/tao/json/events/key_camel_case_to_snake_case.hpp +62 -0
  1415. data/ext/third_party/json/include/tao/json/events/key_snake_case_to_camel_case.hpp +57 -0
  1416. data/ext/third_party/json/include/tao/json/events/limit_nesting_depth.hpp +82 -0
  1417. data/ext/third_party/json/include/tao/json/events/limit_value_count.hpp +46 -0
  1418. data/ext/third_party/json/include/tao/json/events/non_finite_to_exception.hpp +31 -0
  1419. data/ext/third_party/json/include/tao/json/events/non_finite_to_null.hpp +32 -0
  1420. data/ext/third_party/json/include/tao/json/events/non_finite_to_string.hpp +40 -0
  1421. data/ext/third_party/json/include/tao/json/events/prefer_signed.hpp +32 -0
  1422. data/ext/third_party/json/include/tao/json/events/prefer_unsigned.hpp +32 -0
  1423. data/ext/third_party/json/include/tao/json/events/produce.hpp +22 -0
  1424. data/ext/third_party/json/include/tao/json/events/ref.hpp +111 -0
  1425. data/ext/third_party/json/include/tao/json/events/statistics.hpp +112 -0
  1426. data/ext/third_party/json/include/tao/json/events/tee.hpp +386 -0
  1427. data/ext/third_party/json/include/tao/json/events/to_pretty_stream.hpp +172 -0
  1428. data/ext/third_party/json/include/tao/json/events/to_stream.hpp +142 -0
  1429. data/ext/third_party/json/include/tao/json/events/to_string.hpp +33 -0
  1430. data/ext/third_party/json/include/tao/json/events/to_value.hpp +137 -0
  1431. data/ext/third_party/json/include/tao/json/events/transformer.hpp +70 -0
  1432. data/ext/third_party/json/include/tao/json/events/validate_event_order.hpp +411 -0
  1433. data/ext/third_party/json/include/tao/json/events/validate_keys.hpp +51 -0
  1434. data/ext/third_party/json/include/tao/json/events/virtual_base.hpp +192 -0
  1435. data/ext/third_party/json/include/tao/json/events/virtual_ref.hpp +170 -0
  1436. data/ext/third_party/json/include/tao/json/external/double.hpp +1313 -0
  1437. data/ext/third_party/json/include/tao/json/external/itoa.hpp +149 -0
  1438. data/ext/third_party/json/include/tao/json/external/pegtl.hpp +53 -0
  1439. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/analyze_cycles.hpp +127 -0
  1440. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/counted.hpp +23 -0
  1441. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/generic.hpp +31 -0
  1442. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/grammar_info.hpp +32 -0
  1443. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/insert_guard.hpp +51 -0
  1444. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/insert_rules.hpp +25 -0
  1445. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/rule_info.hpp +29 -0
  1446. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/rule_type.hpp +21 -0
  1447. data/ext/third_party/json/include/tao/json/external/pegtl/analyze.hpp +21 -0
  1448. data/ext/third_party/json/include/tao/json/external/pegtl/apply_mode.hpp +19 -0
  1449. data/ext/third_party/json/include/tao/json/external/pegtl/argv_input.hpp +51 -0
  1450. data/ext/third_party/json/include/tao/json/external/pegtl/ascii.hpp +67 -0
  1451. data/ext/third_party/json/include/tao/json/external/pegtl/buffer_input.hpp +212 -0
  1452. data/ext/third_party/json/include/tao/json/external/pegtl/change_action.hpp +38 -0
  1453. data/ext/third_party/json/include/tao/json/external/pegtl/change_action_and_state.hpp +53 -0
  1454. data/ext/third_party/json/include/tao/json/external/pegtl/change_action_and_states.hpp +62 -0
  1455. data/ext/third_party/json/include/tao/json/external/pegtl/change_control.hpp +36 -0
  1456. data/ext/third_party/json/include/tao/json/external/pegtl/change_state.hpp +50 -0
  1457. data/ext/third_party/json/include/tao/json/external/pegtl/change_states.hpp +61 -0
  1458. data/ext/third_party/json/include/tao/json/external/pegtl/config.hpp +11 -0
  1459. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/abnf.hpp +35 -0
  1460. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/alphabet.hpp +67 -0
  1461. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/counter.hpp +54 -0
  1462. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/http.hpp +253 -0
  1463. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/internal.hpp +68 -0
  1464. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/utf16.hpp +200 -0
  1465. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/utf32.hpp +200 -0
  1466. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/utf8.hpp +105 -0
  1467. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/if_then.hpp +55 -0
  1468. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/integer.hpp +446 -0
  1469. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/json.hpp +88 -0
  1470. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/json_pointer.hpp +33 -0
  1471. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/parse_tree.hpp +561 -0
  1472. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/parse_tree_to_dot.hpp +104 -0
  1473. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/raw_string.hpp +225 -0
  1474. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/remove_first_state.hpp +86 -0
  1475. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/rep_one_min_max.hpp +62 -0
  1476. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/rep_string.hpp +44 -0
  1477. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/to_string.hpp +38 -0
  1478. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/tracer.hpp +158 -0
  1479. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/unescape.hpp +199 -0
  1480. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/uri.hpp +106 -0
  1481. data/ext/third_party/json/include/tao/json/external/pegtl/cstream_input.hpp +33 -0
  1482. data/ext/third_party/json/include/tao/json/external/pegtl/disable_action.hpp +35 -0
  1483. data/ext/third_party/json/include/tao/json/external/pegtl/discard_input.hpp +37 -0
  1484. data/ext/third_party/json/include/tao/json/external/pegtl/discard_input_on_failure.hpp +39 -0
  1485. data/ext/third_party/json/include/tao/json/external/pegtl/discard_input_on_success.hpp +39 -0
  1486. data/ext/third_party/json/include/tao/json/external/pegtl/enable_action.hpp +35 -0
  1487. data/ext/third_party/json/include/tao/json/external/pegtl/eol.hpp +37 -0
  1488. data/ext/third_party/json/include/tao/json/external/pegtl/eol_pair.hpp +18 -0
  1489. data/ext/third_party/json/include/tao/json/external/pegtl/file_input.hpp +44 -0
  1490. data/ext/third_party/json/include/tao/json/external/pegtl/internal/action.hpp +44 -0
  1491. data/ext/third_party/json/include/tao/json/external/pegtl/internal/action_input.hpp +107 -0
  1492. data/ext/third_party/json/include/tao/json/external/pegtl/internal/alnum.hpp +18 -0
  1493. data/ext/third_party/json/include/tao/json/external/pegtl/internal/alpha.hpp +18 -0
  1494. data/ext/third_party/json/include/tao/json/external/pegtl/internal/always_false.hpp +21 -0
  1495. data/ext/third_party/json/include/tao/json/external/pegtl/internal/any.hpp +58 -0
  1496. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply.hpp +53 -0
  1497. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply0.hpp +50 -0
  1498. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply0_single.hpp +34 -0
  1499. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply_single.hpp +34 -0
  1500. data/ext/third_party/json/include/tao/json/external/pegtl/internal/at.hpp +53 -0
  1501. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bof.hpp +31 -0
  1502. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bol.hpp +31 -0
  1503. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bump.hpp +45 -0
  1504. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bump_help.hpp +29 -0
  1505. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bytes.hpp +36 -0
  1506. data/ext/third_party/json/include/tao/json/external/pegtl/internal/control.hpp +44 -0
  1507. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cr_crlf_eol.hpp +32 -0
  1508. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cr_eol.hpp +32 -0
  1509. data/ext/third_party/json/include/tao/json/external/pegtl/internal/crlf_eol.hpp +32 -0
  1510. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cstream_reader.hpp +49 -0
  1511. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cstring_reader.hpp +40 -0
  1512. data/ext/third_party/json/include/tao/json/external/pegtl/internal/demangle.hpp +140 -0
  1513. data/ext/third_party/json/include/tao/json/external/pegtl/internal/disable.hpp +44 -0
  1514. data/ext/third_party/json/include/tao/json/external/pegtl/internal/discard.hpp +33 -0
  1515. data/ext/third_party/json/include/tao/json/external/pegtl/internal/dusel_mode.hpp +23 -0
  1516. data/ext/third_party/json/include/tao/json/external/pegtl/internal/duseltronik.hpp +187 -0
  1517. data/ext/third_party/json/include/tao/json/external/pegtl/internal/enable.hpp +44 -0
  1518. data/ext/third_party/json/include/tao/json/external/pegtl/internal/endian.hpp +62 -0
  1519. data/ext/third_party/json/include/tao/json/external/pegtl/internal/endian_gcc.hpp +206 -0
  1520. data/ext/third_party/json/include/tao/json/external/pegtl/internal/endian_win.hpp +106 -0
  1521. data/ext/third_party/json/include/tao/json/external/pegtl/internal/eof.hpp +31 -0
  1522. data/ext/third_party/json/include/tao/json/external/pegtl/internal/eol.hpp +31 -0
  1523. data/ext/third_party/json/include/tao/json/external/pegtl/internal/eolf.hpp +32 -0
  1524. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_mapper_posix.hpp +83 -0
  1525. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_mapper_win32.hpp +219 -0
  1526. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_opener.hpp +72 -0
  1527. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_reader.hpp +114 -0
  1528. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_apply.hpp +25 -0
  1529. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_apply0.hpp +25 -0
  1530. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_match.hpp +56 -0
  1531. data/ext/third_party/json/include/tao/json/external/pegtl/internal/identifier.hpp +22 -0
  1532. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_apply.hpp +53 -0
  1533. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_must.hpp +48 -0
  1534. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_must_else.hpp +19 -0
  1535. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_then_else.hpp +51 -0
  1536. data/ext/third_party/json/include/tao/json/external/pegtl/internal/input_pair.hpp +29 -0
  1537. data/ext/third_party/json/include/tao/json/external/pegtl/internal/istream_reader.hpp +40 -0
  1538. data/ext/third_party/json/include/tao/json/external/pegtl/internal/istring.hpp +72 -0
  1539. data/ext/third_party/json/include/tao/json/external/pegtl/internal/iterator.hpp +52 -0
  1540. data/ext/third_party/json/include/tao/json/external/pegtl/internal/lf_crlf_eol.hpp +37 -0
  1541. data/ext/third_party/json/include/tao/json/external/pegtl/internal/lf_eol.hpp +32 -0
  1542. data/ext/third_party/json/include/tao/json/external/pegtl/internal/list.hpp +19 -0
  1543. data/ext/third_party/json/include/tao/json/external/pegtl/internal/list_must.hpp +20 -0
  1544. data/ext/third_party/json/include/tao/json/external/pegtl/internal/list_tail.hpp +20 -0
  1545. data/ext/third_party/json/include/tao/json/external/pegtl/internal/list_tail_pad.hpp +22 -0
  1546. data/ext/third_party/json/include/tao/json/external/pegtl/internal/marker.hpp +82 -0
  1547. data/ext/third_party/json/include/tao/json/external/pegtl/internal/missing_apply.hpp +25 -0
  1548. data/ext/third_party/json/include/tao/json/external/pegtl/internal/missing_apply0.hpp +23 -0
  1549. data/ext/third_party/json/include/tao/json/external/pegtl/internal/must.hpp +72 -0
  1550. data/ext/third_party/json/include/tao/json/external/pegtl/internal/not_at.hpp +53 -0
  1551. data/ext/third_party/json/include/tao/json/external/pegtl/internal/one.hpp +44 -0
  1552. data/ext/third_party/json/include/tao/json/external/pegtl/internal/opt.hpp +57 -0
  1553. data/ext/third_party/json/include/tao/json/external/pegtl/internal/pad.hpp +19 -0
  1554. data/ext/third_party/json/include/tao/json/external/pegtl/internal/pad_opt.hpp +20 -0
  1555. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_char.hpp +32 -0
  1556. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_mask_uint.hpp +54 -0
  1557. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_mask_uint8.hpp +34 -0
  1558. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_uint.hpp +45 -0
  1559. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_uint8.hpp +33 -0
  1560. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_utf16.hpp +54 -0
  1561. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_utf32.hpp +43 -0
  1562. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_utf8.hpp +90 -0
  1563. data/ext/third_party/json/include/tao/json/external/pegtl/internal/pegtl_string.hpp +90 -0
  1564. data/ext/third_party/json/include/tao/json/external/pegtl/internal/plus.hpp +53 -0
  1565. data/ext/third_party/json/include/tao/json/external/pegtl/internal/raise.hpp +53 -0
  1566. data/ext/third_party/json/include/tao/json/external/pegtl/internal/range.hpp +51 -0
  1567. data/ext/third_party/json/include/tao/json/external/pegtl/internal/ranges.hpp +93 -0
  1568. data/ext/third_party/json/include/tao/json/external/pegtl/internal/read_uint.hpp +77 -0
  1569. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rematch.hpp +69 -0
  1570. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep.hpp +66 -0
  1571. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep_min.hpp +20 -0
  1572. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep_min_max.hpp +79 -0
  1573. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep_opt.hpp +46 -0
  1574. data/ext/third_party/json/include/tao/json/external/pegtl/internal/require.hpp +42 -0
  1575. data/ext/third_party/json/include/tao/json/external/pegtl/internal/result_on_found.hpp +19 -0
  1576. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rules.hpp +61 -0
  1577. data/ext/third_party/json/include/tao/json/external/pegtl/internal/seq.hpp +73 -0
  1578. data/ext/third_party/json/include/tao/json/external/pegtl/internal/skip_control.hpp +25 -0
  1579. data/ext/third_party/json/include/tao/json/external/pegtl/internal/sor.hpp +60 -0
  1580. data/ext/third_party/json/include/tao/json/external/pegtl/internal/star.hpp +47 -0
  1581. data/ext/third_party/json/include/tao/json/external/pegtl/internal/star_must.hpp +19 -0
  1582. data/ext/third_party/json/include/tao/json/external/pegtl/internal/state.hpp +49 -0
  1583. data/ext/third_party/json/include/tao/json/external/pegtl/internal/string.hpp +58 -0
  1584. data/ext/third_party/json/include/tao/json/external/pegtl/internal/trivial.hpp +32 -0
  1585. data/ext/third_party/json/include/tao/json/external/pegtl/internal/try_catch_type.hpp +64 -0
  1586. data/ext/third_party/json/include/tao/json/external/pegtl/internal/until.hpp +84 -0
  1587. data/ext/third_party/json/include/tao/json/external/pegtl/istream_input.hpp +33 -0
  1588. data/ext/third_party/json/include/tao/json/external/pegtl/match.hpp +73 -0
  1589. data/ext/third_party/json/include/tao/json/external/pegtl/memory_input.hpp +381 -0
  1590. data/ext/third_party/json/include/tao/json/external/pegtl/mmap_input.hpp +79 -0
  1591. data/ext/third_party/json/include/tao/json/external/pegtl/normal.hpp +87 -0
  1592. data/ext/third_party/json/include/tao/json/external/pegtl/nothing.hpp +20 -0
  1593. data/ext/third_party/json/include/tao/json/external/pegtl/parse.hpp +53 -0
  1594. data/ext/third_party/json/include/tao/json/external/pegtl/parse_error.hpp +69 -0
  1595. data/ext/third_party/json/include/tao/json/external/pegtl/position.hpp +75 -0
  1596. data/ext/third_party/json/include/tao/json/external/pegtl/read_input.hpp +74 -0
  1597. data/ext/third_party/json/include/tao/json/external/pegtl/require_apply.hpp +16 -0
  1598. data/ext/third_party/json/include/tao/json/external/pegtl/require_apply0.hpp +16 -0
  1599. data/ext/third_party/json/include/tao/json/external/pegtl/rewind_mode.hpp +20 -0
  1600. data/ext/third_party/json/include/tao/json/external/pegtl/rules.hpp +67 -0
  1601. data/ext/third_party/json/include/tao/json/external/pegtl/string_input.hpp +66 -0
  1602. data/ext/third_party/json/include/tao/json/external/pegtl/tracking_mode.hpp +19 -0
  1603. data/ext/third_party/json/include/tao/json/external/pegtl/uint16.hpp +62 -0
  1604. data/ext/third_party/json/include/tao/json/external/pegtl/uint32.hpp +62 -0
  1605. data/ext/third_party/json/include/tao/json/external/pegtl/uint64.hpp +63 -0
  1606. data/ext/third_party/json/include/tao/json/external/pegtl/uint8.hpp +36 -0
  1607. data/ext/third_party/json/include/tao/json/external/pegtl/utf16.hpp +49 -0
  1608. data/ext/third_party/json/include/tao/json/external/pegtl/utf32.hpp +49 -0
  1609. data/ext/third_party/json/include/tao/json/external/pegtl/utf8.hpp +28 -0
  1610. data/ext/third_party/json/include/tao/json/external/pegtl/version.hpp +13 -0
  1611. data/ext/third_party/json/include/tao/json/external/ryu.hpp +1216 -0
  1612. data/ext/third_party/json/include/tao/json/forward.hpp +44 -0
  1613. data/ext/third_party/json/include/tao/json/from_file.hpp +32 -0
  1614. data/ext/third_party/json/include/tao/json/from_input.hpp +32 -0
  1615. data/ext/third_party/json/include/tao/json/from_stream.hpp +45 -0
  1616. data/ext/third_party/json/include/tao/json/from_string.hpp +41 -0
  1617. data/ext/third_party/json/include/tao/json/internal/action.hpp +268 -0
  1618. data/ext/third_party/json/include/tao/json/internal/base64.hpp +55 -0
  1619. data/ext/third_party/json/include/tao/json/internal/base64url.hpp +53 -0
  1620. data/ext/third_party/json/include/tao/json/internal/endian.hpp +60 -0
  1621. data/ext/third_party/json/include/tao/json/internal/endian_gcc.hpp +198 -0
  1622. data/ext/third_party/json/include/tao/json/internal/endian_win.hpp +103 -0
  1623. data/ext/third_party/json/include/tao/json/internal/errors.hpp +85 -0
  1624. data/ext/third_party/json/include/tao/json/internal/escape.hpp +77 -0
  1625. data/ext/third_party/json/include/tao/json/internal/format.hpp +59 -0
  1626. data/ext/third_party/json/include/tao/json/internal/grammar.hpp +229 -0
  1627. data/ext/third_party/json/include/tao/json/internal/hexdump.hpp +31 -0
  1628. data/ext/third_party/json/include/tao/json/internal/identity.hpp +22 -0
  1629. data/ext/third_party/json/include/tao/json/internal/number_state.hpp +80 -0
  1630. data/ext/third_party/json/include/tao/json/internal/number_traits.hpp +267 -0
  1631. data/ext/third_party/json/include/tao/json/internal/pair.hpp +42 -0
  1632. data/ext/third_party/json/include/tao/json/internal/parse_util.hpp +112 -0
  1633. data/ext/third_party/json/include/tao/json/internal/sha256.hpp +218 -0
  1634. data/ext/third_party/json/include/tao/json/internal/single.hpp +40 -0
  1635. data/ext/third_party/json/include/tao/json/internal/string_t.hpp +35 -0
  1636. data/ext/third_party/json/include/tao/json/internal/type_traits.hpp +113 -0
  1637. data/ext/third_party/json/include/tao/json/internal/unescape_action.hpp +24 -0
  1638. data/ext/third_party/json/include/tao/json/internal/uri_fragment.hpp +182 -0
  1639. data/ext/third_party/json/include/tao/json/jaxn.hpp +19 -0
  1640. data/ext/third_party/json/include/tao/json/jaxn/consume_file.hpp +34 -0
  1641. data/ext/third_party/json/include/tao/json/jaxn/consume_string.hpp +32 -0
  1642. data/ext/third_party/json/include/tao/json/jaxn/events/from_file.hpp +28 -0
  1643. data/ext/third_party/json/include/tao/json/jaxn/events/from_input.hpp +45 -0
  1644. data/ext/third_party/json/include/tao/json/jaxn/events/from_stream.hpp +33 -0
  1645. data/ext/third_party/json/include/tao/json/jaxn/events/from_string.hpp +39 -0
  1646. data/ext/third_party/json/include/tao/json/jaxn/events/to_pretty_stream.hpp +69 -0
  1647. data/ext/third_party/json/include/tao/json/jaxn/events/to_stream.hpp +67 -0
  1648. data/ext/third_party/json/include/tao/json/jaxn/events/to_string.hpp +33 -0
  1649. data/ext/third_party/json/include/tao/json/jaxn/from_file.hpp +33 -0
  1650. data/ext/third_party/json/include/tao/json/jaxn/from_input.hpp +33 -0
  1651. data/ext/third_party/json/include/tao/json/jaxn/from_stream.hpp +48 -0
  1652. data/ext/third_party/json/include/tao/json/jaxn/from_string.hpp +42 -0
  1653. data/ext/third_party/json/include/tao/json/jaxn/internal/action.hpp +355 -0
  1654. data/ext/third_party/json/include/tao/json/jaxn/internal/bunescape_action.hpp +114 -0
  1655. data/ext/third_party/json/include/tao/json/jaxn/internal/errors.hpp +108 -0
  1656. data/ext/third_party/json/include/tao/json/jaxn/internal/grammar.hpp +375 -0
  1657. data/ext/third_party/json/include/tao/json/jaxn/internal/integer.hpp +256 -0
  1658. data/ext/third_party/json/include/tao/json/jaxn/internal/unescape_action.hpp +28 -0
  1659. data/ext/third_party/json/include/tao/json/jaxn/is_identifier.hpp +27 -0
  1660. data/ext/third_party/json/include/tao/json/jaxn/parts_parser.hpp +263 -0
  1661. data/ext/third_party/json/include/tao/json/jaxn/to_stream.hpp +36 -0
  1662. data/ext/third_party/json/include/tao/json/jaxn/to_string.hpp +33 -0
  1663. data/ext/third_party/json/include/tao/json/message_extension.hpp +49 -0
  1664. data/ext/third_party/json/include/tao/json/msgpack.hpp +18 -0
  1665. data/ext/third_party/json/include/tao/json/msgpack/consume_file.hpp +34 -0
  1666. data/ext/third_party/json/include/tao/json/msgpack/consume_string.hpp +32 -0
  1667. data/ext/third_party/json/include/tao/json/msgpack/events/from_file.hpp +27 -0
  1668. data/ext/third_party/json/include/tao/json/msgpack/events/from_input.hpp +43 -0
  1669. data/ext/third_party/json/include/tao/json/msgpack/events/from_string.hpp +37 -0
  1670. data/ext/third_party/json/include/tao/json/msgpack/events/to_stream.hpp +214 -0
  1671. data/ext/third_party/json/include/tao/json/msgpack/events/to_string.hpp +31 -0
  1672. data/ext/third_party/json/include/tao/json/msgpack/from_file.hpp +33 -0
  1673. data/ext/third_party/json/include/tao/json/msgpack/from_input.hpp +33 -0
  1674. data/ext/third_party/json/include/tao/json/msgpack/from_string.hpp +32 -0
  1675. data/ext/third_party/json/include/tao/json/msgpack/internal/format.hpp +57 -0
  1676. data/ext/third_party/json/include/tao/json/msgpack/internal/grammar.hpp +249 -0
  1677. data/ext/third_party/json/include/tao/json/msgpack/parts_parser.hpp +311 -0
  1678. data/ext/third_party/json/include/tao/json/msgpack/to_stream.hpp +27 -0
  1679. data/ext/third_party/json/include/tao/json/msgpack/to_string.hpp +28 -0
  1680. data/ext/third_party/json/include/tao/json/operators.hpp +494 -0
  1681. data/ext/third_party/json/include/tao/json/parts_parser.hpp +306 -0
  1682. data/ext/third_party/json/include/tao/json/pointer.hpp +432 -0
  1683. data/ext/third_party/json/include/tao/json/produce.hpp +61 -0
  1684. data/ext/third_party/json/include/tao/json/self_contained.hpp +143 -0
  1685. data/ext/third_party/json/include/tao/json/span.hpp +568 -0
  1686. data/ext/third_party/json/include/tao/json/stream.hpp +38 -0
  1687. data/ext/third_party/json/include/tao/json/to_stream.hpp +42 -0
  1688. data/ext/third_party/json/include/tao/json/to_string.hpp +23 -0
  1689. data/ext/third_party/json/include/tao/json/traits.hpp +971 -0
  1690. data/ext/third_party/json/include/tao/json/type.hpp +112 -0
  1691. data/ext/third_party/json/include/tao/json/ubjson.hpp +18 -0
  1692. data/ext/third_party/json/include/tao/json/ubjson/consume_file.hpp +34 -0
  1693. data/ext/third_party/json/include/tao/json/ubjson/consume_string.hpp +32 -0
  1694. data/ext/third_party/json/include/tao/json/ubjson/events/from_file.hpp +27 -0
  1695. data/ext/third_party/json/include/tao/json/ubjson/events/from_input.hpp +43 -0
  1696. data/ext/third_party/json/include/tao/json/ubjson/events/from_string.hpp +37 -0
  1697. data/ext/third_party/json/include/tao/json/ubjson/events/to_stream.hpp +174 -0
  1698. data/ext/third_party/json/include/tao/json/ubjson/events/to_string.hpp +31 -0
  1699. data/ext/third_party/json/include/tao/json/ubjson/from_file.hpp +33 -0
  1700. data/ext/third_party/json/include/tao/json/ubjson/from_input.hpp +33 -0
  1701. data/ext/third_party/json/include/tao/json/ubjson/from_string.hpp +32 -0
  1702. data/ext/third_party/json/include/tao/json/ubjson/internal/grammar.hpp +413 -0
  1703. data/ext/third_party/json/include/tao/json/ubjson/internal/marker.hpp +46 -0
  1704. data/ext/third_party/json/include/tao/json/ubjson/parts_parser.hpp +393 -0
  1705. data/ext/third_party/json/include/tao/json/ubjson/to_stream.hpp +28 -0
  1706. data/ext/third_party/json/include/tao/json/ubjson/to_string.hpp +29 -0
  1707. data/ext/third_party/json/include/tao/json/utf8.hpp +57 -0
  1708. data/ext/third_party/json/include/tao/json/value.hpp +12 -0
  1709. data/ext/third_party/json/src/example/json/CMakeLists.txt +67 -0
  1710. data/ext/third_party/json/src/example/json/cbor_to_jaxn.cpp +18 -0
  1711. data/ext/third_party/json/src/example/json/cbor_to_json.cpp +18 -0
  1712. data/ext/third_party/json/src/example/json/cbor_to_msgpack.cpp +18 -0
  1713. data/ext/third_party/json/src/example/json/cbor_to_pretty_jaxn.cpp +18 -0
  1714. data/ext/third_party/json/src/example/json/cbor_to_pretty_json.cpp +18 -0
  1715. data/ext/third_party/json/src/example/json/cbor_to_ubjson.cpp +18 -0
  1716. data/ext/third_party/json/src/example/json/jaxn_to_cbor.cpp +18 -0
  1717. data/ext/third_party/json/src/example/json/jaxn_to_cplusplus.cpp +249 -0
  1718. data/ext/third_party/json/src/example/json/jaxn_to_jaxn.cpp +18 -0
  1719. data/ext/third_party/json/src/example/json/jaxn_to_msgpack.cpp +18 -0
  1720. data/ext/third_party/json/src/example/json/jaxn_to_pretty_jaxn.cpp +18 -0
  1721. data/ext/third_party/json/src/example/json/jaxn_to_ubjson.cpp +18 -0
  1722. data/ext/third_party/json/src/example/json/json_to_cbor.cpp +18 -0
  1723. data/ext/third_party/json/src/example/json/json_to_json.cpp +18 -0
  1724. data/ext/third_party/json/src/example/json/json_to_msgpack.cpp +18 -0
  1725. data/ext/third_party/json/src/example/json/json_to_pretty_json.cpp +18 -0
  1726. data/ext/third_party/json/src/example/json/json_to_ubjson.cpp +18 -0
  1727. data/ext/third_party/json/src/example/json/msgpack_to_cbor.cpp +18 -0
  1728. data/ext/third_party/json/src/example/json/msgpack_to_jaxn.cpp +18 -0
  1729. data/ext/third_party/json/src/example/json/msgpack_to_json.cpp +18 -0
  1730. data/ext/third_party/json/src/example/json/msgpack_to_pretty_jaxn.cpp +18 -0
  1731. data/ext/third_party/json/src/example/json/msgpack_to_pretty_json.cpp +18 -0
  1732. data/ext/third_party/json/src/example/json/msgpack_to_ubjson.cpp +18 -0
  1733. data/ext/third_party/json/src/example/json/printf_doubles.cpp +51 -0
  1734. data/ext/third_party/json/src/example/json/ubjson_to_cbor.cpp +18 -0
  1735. data/ext/third_party/json/src/example/json/ubjson_to_jaxn.cpp +18 -0
  1736. data/ext/third_party/json/src/example/json/ubjson_to_json.cpp +18 -0
  1737. data/ext/third_party/json/src/example/json/ubjson_to_msgpack.cpp +18 -0
  1738. data/ext/third_party/json/src/example/json/ubjson_to_pretty_jaxn.cpp +18 -0
  1739. data/ext/third_party/json/src/example/json/ubjson_to_pretty_json.cpp +18 -0
  1740. data/ext/third_party/json/src/example/json/validate_event_order.cpp +27 -0
  1741. data/ext/third_party/json/src/example/json/validate_integer.cpp +56 -0
  1742. data/ext/third_party/json/src/perf/json/bench_mark.hpp +43 -0
  1743. data/ext/third_party/json/src/perf/json/benchmark.cpp +34 -0
  1744. data/ext/third_party/json/src/perf/json/parse_file.cpp +17 -0
  1745. data/ext/third_party/json/src/perf/json/pretty_print_file.cpp +19 -0
  1746. data/ext/third_party/json/src/perf/json/print_double.cpp +34 -0
  1747. data/ext/third_party/json/src/perf/json/print_file.cpp +19 -0
  1748. data/ext/third_party/json/src/perf/json/sizes.cpp +24 -0
  1749. data/ext/third_party/json/src/perf/json/syntax_only.cpp +27 -0
  1750. data/ext/third_party/json/src/test/json/CMakeLists.txt +97 -0
  1751. data/ext/third_party/json/src/test/json/big_list_of_naughty_strings.cpp +43 -0
  1752. data/ext/third_party/json/src/test/json/binding_array.cpp +549 -0
  1753. data/ext/third_party/json/src/test/json/binding_factory.cpp +265 -0
  1754. data/ext/third_party/json/src/test/json/binding_object.cpp +208 -0
  1755. data/ext/third_party/json/src/test/json/binding_versions.cpp +95 -0
  1756. data/ext/third_party/json/src/test/json/cbor.cpp +149 -0
  1757. data/ext/third_party/json/src/test/json/cbor_parts_parser.cpp +36 -0
  1758. data/ext/third_party/json/src/test/json/contrib_diff.cpp +43 -0
  1759. data/ext/third_party/json/src/test/json/contrib_get.cpp +42 -0
  1760. data/ext/third_party/json/src/test/json/contrib_patch_add.cpp +75 -0
  1761. data/ext/third_party/json/src/test/json/contrib_patch_copy.cpp +113 -0
  1762. data/ext/third_party/json/src/test/json/contrib_patch_move.cpp +97 -0
  1763. data/ext/third_party/json/src/test/json/contrib_patch_remove.cpp +85 -0
  1764. data/ext/third_party/json/src/test/json/contrib_patch_replace.cpp +79 -0
  1765. data/ext/third_party/json/src/test/json/contrib_patch_test.cpp +69 -0
  1766. data/ext/third_party/json/src/test/json/contrib_position.cpp +48 -0
  1767. data/ext/third_party/json/src/test/json/contrib_reference.cpp +44 -0
  1768. data/ext/third_party/json/src/test/json/contrib_schema.cpp +132 -0
  1769. data/ext/third_party/json/src/test/json/contrib_traits.cpp +258 -0
  1770. data/ext/third_party/json/src/test/json/double.cpp +182 -0
  1771. data/ext/third_party/json/src/test/json/enable_implicit_constructor.cpp +54 -0
  1772. data/ext/third_party/json/src/test/json/escape.cpp +42 -0
  1773. data/ext/third_party/json/src/test/json/events_binary_to.cpp +56 -0
  1774. data/ext/third_party/json/src/test/json/events_compare.cpp +433 -0
  1775. data/ext/third_party/json/src/test/json/events_debug.cpp +24 -0
  1776. data/ext/third_party/json/src/test/json/events_hash.cpp +65 -0
  1777. data/ext/third_party/json/src/test/json/events_to_stream.cpp +28 -0
  1778. data/ext/third_party/json/src/test/json/events_to_string.cpp +25 -0
  1779. data/ext/third_party/json/src/test/json/include_json.cpp +14 -0
  1780. data/ext/third_party/json/src/test/json/integer.cpp +118 -0
  1781. data/ext/third_party/json/src/test/json/jaxn_ostream.cpp +76 -0
  1782. data/ext/third_party/json/src/test/json/jaxn_parse.cpp +239 -0
  1783. data/ext/third_party/json/src/test/json/jaxn_parts_parser.cpp +220 -0
  1784. data/ext/third_party/json/src/test/json/json_ostream.cpp +102 -0
  1785. data/ext/third_party/json/src/test/json/json_parse.cpp +153 -0
  1786. data/ext/third_party/json/src/test/json/json_parts_parser.cpp +124 -0
  1787. data/ext/third_party/json/src/test/json/json_pointer.cpp +176 -0
  1788. data/ext/third_party/json/src/test/json/key_camel_case_to_snake_case.cpp +38 -0
  1789. data/ext/third_party/json/src/test/json/key_snake_case_to_camel_case.cpp +33 -0
  1790. data/ext/third_party/json/src/test/json/literal.cpp +18 -0
  1791. data/ext/third_party/json/src/test/json/main.hpp +20 -0
  1792. data/ext/third_party/json/src/test/json/make_events.hpp +362 -0
  1793. data/ext/third_party/json/src/test/json/msgpack.cpp +136 -0
  1794. data/ext/third_party/json/src/test/json/object_construction.cpp +167 -0
  1795. data/ext/third_party/json/src/test/json/opaque_pointer.cpp +192 -0
  1796. data/ext/third_party/json/src/test/json/operators.cpp +494 -0
  1797. data/ext/third_party/json/src/test/json/optional.cpp +79 -0
  1798. data/ext/third_party/json/src/test/json/public_base.cpp +142 -0
  1799. data/ext/third_party/json/src/test/json/self_contained.cpp +106 -0
  1800. data/ext/third_party/json/src/test/json/sha256.cpp +38 -0
  1801. data/ext/third_party/json/src/test/json/string_view.cpp +70 -0
  1802. data/ext/third_party/json/src/test/json/temporary_parsing.cpp +339 -0
  1803. data/ext/third_party/json/src/test/json/test.hpp +74 -0
  1804. data/ext/third_party/json/src/test/json/test_events.hpp +250 -0
  1805. data/ext/third_party/json/src/test/json/test_types.hpp +557 -0
  1806. data/ext/third_party/json/src/test/json/test_unhex.hpp +42 -0
  1807. data/ext/third_party/json/src/test/json/type.cpp +35 -0
  1808. data/ext/third_party/json/src/test/json/ubjson.cpp +119 -0
  1809. data/ext/third_party/json/src/test/json/uri_fragment.cpp +52 -0
  1810. data/ext/third_party/json/src/test/json/validate_event_interfaces.cpp +177 -0
  1811. data/ext/third_party/json/src/test/json/validate_utf8.cpp +37 -0
  1812. data/ext/third_party/json/src/test/json/value_access.cpp +144 -0
  1813. data/ext/third_party/json/src/test/json/value_basics.cpp +241 -0
  1814. data/ext/third_party/json/src/test/json/value_create.cpp +372 -0
  1815. data/ext/third_party/json/src/test/json/value_ptr.cpp +33 -0
  1816. data/ext/third_party/json/src/test/json/value_subscript.cpp +89 -0
  1817. data/ext/third_party/json/src/test/json/with_arguments.cpp +98 -0
  1818. data/ext/third_party/json/tests/blns.json +496 -0
  1819. data/ext/third_party/json/tests/canada.json +9 -0
  1820. data/ext/third_party/json/tests/citm_catalog.json +50469 -0
  1821. data/ext/third_party/json/tests/draft4/additionalItems.json +82 -0
  1822. data/ext/third_party/json/tests/draft4/additionalProperties.json +88 -0
  1823. data/ext/third_party/json/tests/draft4/allOf.json +112 -0
  1824. data/ext/third_party/json/tests/draft4/anyOf.json +68 -0
  1825. data/ext/third_party/json/tests/draft4/default.json +49 -0
  1826. data/ext/third_party/json/tests/draft4/definitions.json +32 -0
  1827. data/ext/third_party/json/tests/draft4/dependencies.json +113 -0
  1828. data/ext/third_party/json/tests/draft4/enum.json +72 -0
  1829. data/ext/third_party/json/tests/draft4/items.json +46 -0
  1830. data/ext/third_party/json/tests/draft4/maxItems.json +28 -0
  1831. data/ext/third_party/json/tests/draft4/maxLength.json +33 -0
  1832. data/ext/third_party/json/tests/draft4/maxProperties.json +28 -0
  1833. data/ext/third_party/json/tests/draft4/maximum.json +42 -0
  1834. data/ext/third_party/json/tests/draft4/minItems.json +28 -0
  1835. data/ext/third_party/json/tests/draft4/minLength.json +33 -0
  1836. data/ext/third_party/json/tests/draft4/minProperties.json +28 -0
  1837. data/ext/third_party/json/tests/draft4/minimum.json +42 -0
  1838. data/ext/third_party/json/tests/draft4/multipleOf.json +60 -0
  1839. data/ext/third_party/json/tests/draft4/not.json +96 -0
  1840. data/ext/third_party/json/tests/draft4/oneOf.json +68 -0
  1841. data/ext/third_party/json/tests/draft4/optional/bignum.json +107 -0
  1842. data/ext/third_party/json/tests/draft4/optional/format.json +148 -0
  1843. data/ext/third_party/json/tests/draft4/optional/zeroTerminatedFloats.json +15 -0
  1844. data/ext/third_party/json/tests/draft4/pattern.json +34 -0
  1845. data/ext/third_party/json/tests/draft4/patternProperties.json +110 -0
  1846. data/ext/third_party/json/tests/draft4/properties.json +92 -0
  1847. data/ext/third_party/json/tests/draft4/ref.json +179 -0
  1848. data/ext/third_party/json/tests/draft4/refRemote.json +74 -0
  1849. data/ext/third_party/json/tests/draft4/required.json +44 -0
  1850. data/ext/third_party/json/tests/draft4/type.json +345 -0
  1851. data/ext/third_party/json/tests/draft4/uniqueItems.json +79 -0
  1852. data/ext/third_party/json/tests/taocpp/binary.jaxn +4 -0
  1853. data/ext/third_party/json/tests/taocpp/dateTime.json +108 -0
  1854. data/ext/third_party/json/tests/taocpp/make_events.cbor +0 -0
  1855. data/ext/third_party/json/tests/taocpp/number.json +682 -0
  1856. data/ext/third_party/json/tests/taocpp/position.json +8 -0
  1857. data/ext/third_party/json/tests/taocpp/schema.json +378 -0
  1858. data/ext/third_party/json/tests/twitter.json +15482 -0
  1859. data/ext/third_party/snappy/.appveyor.yml +36 -0
  1860. data/ext/third_party/snappy/.gitignore +8 -0
  1861. data/ext/third_party/snappy/.travis.yml +98 -0
  1862. data/ext/third_party/snappy/AUTHORS +1 -0
  1863. data/ext/third_party/snappy/CMakeLists.txt +345 -0
  1864. data/ext/third_party/snappy/CONTRIBUTING.md +26 -0
  1865. data/ext/third_party/snappy/COPYING +54 -0
  1866. data/ext/third_party/snappy/NEWS +188 -0
  1867. data/ext/third_party/snappy/README.md +148 -0
  1868. data/ext/third_party/snappy/cmake/SnappyConfig.cmake.in +33 -0
  1869. data/ext/third_party/snappy/cmake/config.h.in +59 -0
  1870. data/ext/third_party/snappy/docs/README.md +72 -0
  1871. data/ext/third_party/snappy/format_description.txt +110 -0
  1872. data/ext/third_party/snappy/framing_format.txt +135 -0
  1873. data/ext/third_party/snappy/snappy-c.cc +90 -0
  1874. data/ext/third_party/snappy/snappy-c.h +138 -0
  1875. data/ext/third_party/snappy/snappy-internal.h +315 -0
  1876. data/ext/third_party/snappy/snappy-sinksource.cc +121 -0
  1877. data/ext/third_party/snappy/snappy-sinksource.h +182 -0
  1878. data/ext/third_party/snappy/snappy-stubs-internal.cc +42 -0
  1879. data/ext/third_party/snappy/snappy-stubs-internal.h +493 -0
  1880. data/ext/third_party/snappy/snappy-stubs-public.h.in +63 -0
  1881. data/ext/third_party/snappy/snappy-test.cc +613 -0
  1882. data/ext/third_party/snappy/snappy-test.h +526 -0
  1883. data/ext/third_party/snappy/snappy.cc +1770 -0
  1884. data/ext/third_party/snappy/snappy.h +209 -0
  1885. data/ext/third_party/snappy/snappy_compress_fuzzer.cc +60 -0
  1886. data/ext/third_party/snappy/snappy_uncompress_fuzzer.cc +58 -0
  1887. data/ext/third_party/snappy/snappy_unittest.cc +1512 -0
  1888. data/ext/third_party/snappy/testdata/alice29.txt +3609 -0
  1889. data/ext/third_party/snappy/testdata/asyoulik.txt +4122 -0
  1890. data/ext/third_party/snappy/testdata/baddata1.snappy +0 -0
  1891. data/ext/third_party/snappy/testdata/baddata2.snappy +0 -0
  1892. data/ext/third_party/snappy/testdata/baddata3.snappy +0 -0
  1893. data/ext/third_party/snappy/testdata/fireworks.jpeg +0 -0
  1894. data/ext/third_party/snappy/testdata/geo.protodata +0 -0
  1895. data/ext/third_party/snappy/testdata/html +1 -0
  1896. data/ext/third_party/snappy/testdata/html_x_4 +1 -0
  1897. data/ext/third_party/snappy/testdata/kppkn.gtb +0 -0
  1898. data/ext/third_party/snappy/testdata/lcet10.txt +7519 -0
  1899. data/ext/third_party/snappy/testdata/paper-100k.pdf +600 -2
  1900. data/ext/third_party/snappy/testdata/plrabn12.txt +10699 -0
  1901. data/ext/third_party/snappy/testdata/urls.10K +10000 -0
  1902. data/ext/third_party/spdlog/.clang-format +108 -0
  1903. data/ext/third_party/spdlog/.clang-tidy +54 -0
  1904. data/ext/third_party/spdlog/.gitattributes +1 -0
  1905. data/ext/third_party/spdlog/.gitignore +83 -0
  1906. data/ext/third_party/spdlog/.travis.yml +112 -0
  1907. data/ext/third_party/spdlog/CMakeLists.txt +324 -0
  1908. data/ext/third_party/spdlog/INSTALL +24 -0
  1909. data/ext/third_party/spdlog/LICENSE +26 -0
  1910. data/ext/third_party/spdlog/README.md +423 -0
  1911. data/ext/third_party/spdlog/appveyor.yml +51 -0
  1912. data/ext/third_party/spdlog/bench/CMakeLists.txt +25 -0
  1913. data/ext/third_party/spdlog/bench/async_bench.cpp +179 -0
  1914. data/ext/third_party/spdlog/bench/bench.cpp +238 -0
  1915. data/ext/third_party/spdlog/bench/formatter-bench.cpp +80 -0
  1916. data/ext/third_party/spdlog/bench/latency.cpp +166 -0
  1917. data/ext/third_party/spdlog/bench/utils.h +34 -0
  1918. data/ext/third_party/spdlog/cmake/ide.cmake +18 -0
  1919. data/ext/third_party/spdlog/cmake/pch.h.in +258 -0
  1920. data/ext/third_party/spdlog/cmake/spdlog.pc.in +13 -0
  1921. data/ext/third_party/spdlog/cmake/spdlogCPack.cmake +46 -0
  1922. data/ext/third_party/spdlog/cmake/spdlogConfig.cmake.in +15 -0
  1923. data/ext/third_party/spdlog/cmake/utils.cmake +61 -0
  1924. data/ext/third_party/spdlog/cmake/version.rc.in +42 -0
  1925. data/ext/third_party/spdlog/example/CMakeLists.txt +23 -0
  1926. data/ext/third_party/spdlog/example/example.cpp +282 -0
  1927. data/ext/third_party/spdlog/include/spdlog/async.h +93 -0
  1928. data/ext/third_party/spdlog/include/spdlog/async_logger-inl.h +92 -0
  1929. data/ext/third_party/spdlog/include/spdlog/async_logger.h +68 -0
  1930. data/ext/third_party/spdlog/include/spdlog/cfg/argv.h +45 -0
  1931. data/ext/third_party/spdlog/include/spdlog/cfg/env.h +36 -0
  1932. data/ext/third_party/spdlog/include/spdlog/cfg/helpers-inl.h +103 -0
  1933. data/ext/third_party/spdlog/include/spdlog/cfg/helpers.h +28 -0
  1934. data/ext/third_party/spdlog/include/spdlog/cfg/log_levels.h +47 -0
  1935. data/ext/third_party/spdlog/include/spdlog/common-inl.h +76 -0
  1936. data/ext/third_party/spdlog/include/spdlog/common.h +246 -0
  1937. data/ext/third_party/spdlog/include/spdlog/details/backtracer-inl.h +69 -0
  1938. data/ext/third_party/spdlog/include/spdlog/details/backtracer.h +45 -0
  1939. data/ext/third_party/spdlog/include/spdlog/details/circular_q.h +141 -0
  1940. data/ext/third_party/spdlog/include/spdlog/details/console_globals.h +32 -0
  1941. data/ext/third_party/spdlog/include/spdlog/details/file_helper-inl.h +132 -0
  1942. data/ext/third_party/spdlog/include/spdlog/details/file_helper.h +59 -0
  1943. data/ext/third_party/spdlog/include/spdlog/details/fmt_helper.h +108 -0
  1944. data/ext/third_party/spdlog/include/spdlog/details/log_msg-inl.h +37 -0
  1945. data/ext/third_party/spdlog/include/spdlog/details/log_msg.h +36 -0
  1946. data/ext/third_party/spdlog/include/spdlog/details/log_msg_buffer-inl.h +58 -0
  1947. data/ext/third_party/spdlog/include/spdlog/details/log_msg_buffer.h +33 -0
  1948. data/ext/third_party/spdlog/include/spdlog/details/mpmc_blocking_q.h +120 -0
  1949. data/ext/third_party/spdlog/include/spdlog/details/null_mutex.h +49 -0
  1950. data/ext/third_party/spdlog/include/spdlog/details/os-inl.h +554 -0
  1951. data/ext/third_party/spdlog/include/spdlog/details/os.h +111 -0
  1952. data/ext/third_party/spdlog/include/spdlog/details/periodic_worker-inl.h +49 -0
  1953. data/ext/third_party/spdlog/include/spdlog/details/periodic_worker.h +40 -0
  1954. data/ext/third_party/spdlog/include/spdlog/details/registry-inl.h +299 -0
  1955. data/ext/third_party/spdlog/include/spdlog/details/registry.h +112 -0
  1956. data/ext/third_party/spdlog/include/spdlog/details/synchronous_factory.h +24 -0
  1957. data/ext/third_party/spdlog/include/spdlog/details/tcp_client-windows.h +175 -0
  1958. data/ext/third_party/spdlog/include/spdlog/details/tcp_client.h +145 -0
  1959. data/ext/third_party/spdlog/include/spdlog/details/thread_pool-inl.h +124 -0
  1960. data/ext/third_party/spdlog/include/spdlog/details/thread_pool.h +120 -0
  1961. data/ext/third_party/spdlog/include/spdlog/details/windows_include.h +11 -0
  1962. data/ext/third_party/spdlog/include/spdlog/fmt/bin_to_hex.h +216 -0
  1963. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/LICENSE.rst +27 -0
  1964. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/chrono.h +1119 -0
  1965. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/color.h +568 -0
  1966. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/compile.h +595 -0
  1967. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/core.h +1789 -0
  1968. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/format-inl.h +1403 -0
  1969. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/format.h +3648 -0
  1970. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/locale.h +78 -0
  1971. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/ostream.h +143 -0
  1972. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/posix.h +2 -0
  1973. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/printf.h +721 -0
  1974. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/ranges.h +387 -0
  1975. data/ext/third_party/spdlog/include/spdlog/fmt/fmt.h +25 -0
  1976. data/ext/third_party/spdlog/include/spdlog/fmt/ostr.h +20 -0
  1977. data/ext/third_party/spdlog/include/spdlog/formatter.h +18 -0
  1978. data/ext/third_party/spdlog/include/spdlog/fwd.h +14 -0
  1979. data/ext/third_party/spdlog/include/spdlog/logger-inl.h +253 -0
  1980. data/ext/third_party/spdlog/include/spdlog/logger.h +392 -0
  1981. data/ext/third_party/spdlog/include/spdlog/pattern_formatter-inl.h +1358 -0
  1982. data/ext/third_party/spdlog/include/spdlog/pattern_formatter.h +126 -0
  1983. data/ext/third_party/spdlog/include/spdlog/sinks/android_sink.h +119 -0
  1984. data/ext/third_party/spdlog/include/spdlog/sinks/ansicolor_sink-inl.h +143 -0
  1985. data/ext/third_party/spdlog/include/spdlog/sinks/ansicolor_sink.h +118 -0
  1986. data/ext/third_party/spdlog/include/spdlog/sinks/base_sink-inl.h +63 -0
  1987. data/ext/third_party/spdlog/include/spdlog/sinks/base_sink.h +52 -0
  1988. data/ext/third_party/spdlog/include/spdlog/sinks/basic_file_sink-inl.h +43 -0
  1989. data/ext/third_party/spdlog/include/spdlog/sinks/basic_file_sink.h +58 -0
  1990. data/ext/third_party/spdlog/include/spdlog/sinks/daily_file_sink.h +204 -0
  1991. data/ext/third_party/spdlog/include/spdlog/sinks/dist_sink.h +97 -0
  1992. data/ext/third_party/spdlog/include/spdlog/sinks/dup_filter_sink.h +90 -0
  1993. data/ext/third_party/spdlog/include/spdlog/sinks/msvc_sink.h +49 -0
  1994. data/ext/third_party/spdlog/include/spdlog/sinks/null_sink.h +44 -0
  1995. data/ext/third_party/spdlog/include/spdlog/sinks/ostream_sink.h +50 -0
  1996. data/ext/third_party/spdlog/include/spdlog/sinks/ringbuffer_sink.h +72 -0
  1997. data/ext/third_party/spdlog/include/spdlog/sinks/rotating_file_sink-inl.h +131 -0
  1998. data/ext/third_party/spdlog/include/spdlog/sinks/rotating_file_sink.h +78 -0
  1999. data/ext/third_party/spdlog/include/spdlog/sinks/sink-inl.h +25 -0
  2000. data/ext/third_party/spdlog/include/spdlog/sinks/sink.h +35 -0
  2001. data/ext/third_party/spdlog/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
  2002. data/ext/third_party/spdlog/include/spdlog/sinks/stdout_color_sinks.h +45 -0
  2003. data/ext/third_party/spdlog/include/spdlog/sinks/stdout_sinks-inl.h +94 -0
  2004. data/ext/third_party/spdlog/include/spdlog/sinks/stdout_sinks.h +80 -0
  2005. data/ext/third_party/spdlog/include/spdlog/sinks/syslog_sink.h +109 -0
  2006. data/ext/third_party/spdlog/include/spdlog/sinks/systemd_sink.h +103 -0
  2007. data/ext/third_party/spdlog/include/spdlog/sinks/tcp_sink.h +81 -0
  2008. data/ext/third_party/spdlog/include/spdlog/sinks/win_eventlog_sink.h +266 -0
  2009. data/ext/third_party/spdlog/include/spdlog/sinks/wincolor_sink-inl.h +180 -0
  2010. data/ext/third_party/spdlog/include/spdlog/sinks/wincolor_sink.h +94 -0
  2011. data/ext/third_party/spdlog/include/spdlog/spdlog-inl.h +115 -0
  2012. data/ext/third_party/spdlog/include/spdlog/spdlog.h +340 -0
  2013. data/ext/third_party/spdlog/include/spdlog/tweakme.h +116 -0
  2014. data/ext/third_party/spdlog/include/spdlog/version.h +10 -0
  2015. data/ext/third_party/spdlog/logos/jetbrains-variant-4.svg +43 -0
  2016. data/ext/third_party/spdlog/scripts/extract_version.py +17 -0
  2017. data/ext/third_party/spdlog/scripts/format.sh +16 -0
  2018. data/ext/third_party/spdlog/src/async.cpp +13 -0
  2019. data/ext/third_party/spdlog/src/cfg.cpp +8 -0
  2020. data/ext/third_party/spdlog/src/color_sinks.cpp +51 -0
  2021. data/ext/third_party/spdlog/src/file_sinks.cpp +20 -0
  2022. data/ext/third_party/spdlog/src/fmt.cpp +189 -0
  2023. data/ext/third_party/spdlog/src/spdlog.cpp +26 -0
  2024. data/ext/third_party/spdlog/src/stdout_sinks.cpp +29 -0
  2025. data/ext/third_party/spdlog/tests/CMakeLists.txt +70 -0
  2026. data/ext/third_party/spdlog/tests/catch.hpp +15372 -0
  2027. data/ext/third_party/spdlog/tests/catch.license +23 -0
  2028. data/ext/third_party/spdlog/tests/includes.h +26 -0
  2029. data/ext/third_party/spdlog/tests/main.cpp +2 -0
  2030. data/ext/third_party/spdlog/tests/test_async.cpp +188 -0
  2031. data/ext/third_party/spdlog/tests/test_backtrace.cpp +65 -0
  2032. data/ext/third_party/spdlog/tests/test_cfg.cpp +93 -0
  2033. data/ext/third_party/spdlog/tests/test_create_dir.cpp +80 -0
  2034. data/ext/third_party/spdlog/tests/test_daily_logger.cpp +149 -0
  2035. data/ext/third_party/spdlog/tests/test_dup_filter.cpp +88 -0
  2036. data/ext/third_party/spdlog/tests/test_errors.cpp +118 -0
  2037. data/ext/third_party/spdlog/tests/test_eventlog.cpp +71 -0
  2038. data/ext/third_party/spdlog/tests/test_file_helper.cpp +102 -0
  2039. data/ext/third_party/spdlog/tests/test_file_logging.cpp +98 -0
  2040. data/ext/third_party/spdlog/tests/test_fmt_helper.cpp +86 -0
  2041. data/ext/third_party/spdlog/tests/test_macros.cpp +60 -0
  2042. data/ext/third_party/spdlog/tests/test_misc.cpp +271 -0
  2043. data/ext/third_party/spdlog/tests/test_mpmc_q.cpp +106 -0
  2044. data/ext/third_party/spdlog/tests/test_pattern_formatter.cpp +443 -0
  2045. data/ext/third_party/spdlog/tests/test_registry.cpp +116 -0
  2046. data/ext/third_party/spdlog/tests/test_sink.h +79 -0
  2047. data/ext/third_party/spdlog/tests/test_stdout_api.cpp +98 -0
  2048. data/ext/third_party/spdlog/tests/test_systemd.cpp +15 -0
  2049. data/ext/third_party/spdlog/tests/test_time_point.cpp +36 -0
  2050. data/ext/third_party/spdlog/tests/utils.cpp +125 -0
  2051. data/ext/third_party/spdlog/tests/utils.h +18 -0
  2052. data/lib/couchbase.rb +13 -150
  2053. data/lib/couchbase/authenticator.rb +25 -0
  2054. data/lib/couchbase/binary_collection.rb +89 -0
  2055. data/lib/couchbase/binary_collection_options.rb +98 -0
  2056. data/lib/couchbase/bucket.rb +53 -423
  2057. data/lib/couchbase/cluster.rb +456 -101
  2058. data/lib/couchbase/collection.rb +319 -0
  2059. data/lib/couchbase/collection_options.rb +447 -0
  2060. data/lib/couchbase/common_options.rb +29 -0
  2061. data/lib/couchbase/errors.rb +224 -0
  2062. data/lib/couchbase/json_transcoder.rb +32 -0
  2063. data/lib/couchbase/management/analytics_index_manager.rb +319 -0
  2064. data/lib/couchbase/management/bucket_manager.rb +252 -0
  2065. data/lib/couchbase/management/collection_manager.rb +202 -0
  2066. data/lib/couchbase/management/query_index_manager.rb +297 -0
  2067. data/lib/couchbase/management/search_index_manager.rb +364 -0
  2068. data/lib/couchbase/management/user_manager.rb +323 -0
  2069. data/lib/couchbase/management/view_index_manager.rb +178 -0
  2070. data/lib/couchbase/mutation_state.rb +50 -0
  2071. data/lib/couchbase/scope.rb +49 -0
  2072. data/lib/couchbase/search_options.rb +1492 -0
  2073. data/lib/couchbase/subdoc.rb +226 -0
  2074. data/lib/couchbase/version.rb +12 -15
  2075. data/rbi/couchbase.rbi +79 -0
  2076. metadata +2118 -278
  2077. data/.travis.yml +0 -22
  2078. data/CONTRIBUTING.markdown +0 -75
  2079. data/LICENSE +0 -201
  2080. data/Makefile +0 -3
  2081. data/README.markdown +0 -592
  2082. data/RELEASE_NOTES.markdown +0 -909
  2083. data/examples/chat-em/Gemfile +0 -7
  2084. data/examples/chat-em/README.markdown +0 -45
  2085. data/examples/chat-em/server.rb +0 -82
  2086. data/examples/chat-goliath-grape/Gemfile +0 -5
  2087. data/examples/chat-goliath-grape/README.markdown +0 -50
  2088. data/examples/chat-goliath-grape/app.rb +0 -67
  2089. data/examples/chat-goliath-grape/config/app.rb +0 -20
  2090. data/examples/transcoders/Gemfile +0 -3
  2091. data/examples/transcoders/README.markdown +0 -59
  2092. data/examples/transcoders/cb-zcat +0 -40
  2093. data/examples/transcoders/cb-zcp +0 -45
  2094. data/examples/transcoders/gzip_transcoder.rb +0 -49
  2095. data/examples/transcoders/options.rb +0 -54
  2096. data/ext/couchbase_ext/.gitignore +0 -4
  2097. data/ext/couchbase_ext/arguments.c +0 -978
  2098. data/ext/couchbase_ext/arithmetic.c +0 -316
  2099. data/ext/couchbase_ext/bucket.c +0 -1438
  2100. data/ext/couchbase_ext/context.c +0 -65
  2101. data/ext/couchbase_ext/couchbase_ext.c +0 -1477
  2102. data/ext/couchbase_ext/couchbase_ext.h +0 -672
  2103. data/ext/couchbase_ext/delete.c +0 -163
  2104. data/ext/couchbase_ext/eventmachine_plugin.c +0 -466
  2105. data/ext/couchbase_ext/extconf.rb +0 -194
  2106. data/ext/couchbase_ext/get.c +0 -316
  2107. data/ext/couchbase_ext/gethrtime.c +0 -129
  2108. data/ext/couchbase_ext/http.c +0 -432
  2109. data/ext/couchbase_ext/multithread_plugin.c +0 -1084
  2110. data/ext/couchbase_ext/n1ql.c +0 -117
  2111. data/ext/couchbase_ext/observe.c +0 -171
  2112. data/ext/couchbase_ext/result.c +0 -129
  2113. data/ext/couchbase_ext/stats.c +0 -163
  2114. data/ext/couchbase_ext/store.c +0 -542
  2115. data/ext/couchbase_ext/timer.c +0 -192
  2116. data/ext/couchbase_ext/touch.c +0 -186
  2117. data/ext/couchbase_ext/unlock.c +0 -176
  2118. data/ext/couchbase_ext/utils.c +0 -558
  2119. data/ext/couchbase_ext/version.c +0 -142
  2120. data/lib/action_dispatch/middleware/session/couchbase_store.rb +0 -38
  2121. data/lib/active_support/cache/couchbase_store.rb +0 -430
  2122. data/lib/couchbase/connection_pool.rb +0 -58
  2123. data/lib/couchbase/constants.rb +0 -12
  2124. data/lib/couchbase/dns.rb +0 -76
  2125. data/lib/couchbase/result.rb +0 -26
  2126. data/lib/couchbase/transcoder.rb +0 -120
  2127. data/lib/couchbase/utils.rb +0 -62
  2128. data/lib/couchbase/view.rb +0 -506
  2129. data/lib/couchbase/view_row.rb +0 -272
  2130. data/lib/ext/multi_json_fix.rb +0 -56
  2131. data/lib/rack/session/couchbase.rb +0 -108
  2132. data/tasks/benchmark.rake +0 -6
  2133. data/tasks/compile.rake +0 -156
  2134. data/tasks/test.rake +0 -100
  2135. data/tasks/util.rake +0 -21
  2136. data/test/profile/.gitignore +0 -1
  2137. data/test/profile/Gemfile +0 -6
  2138. data/test/profile/benchmark.rb +0 -195
  2139. data/test/setup.rb +0 -178
  2140. data/test/test_arithmetic.rb +0 -185
  2141. data/test/test_async.rb +0 -316
  2142. data/test/test_bucket.rb +0 -299
  2143. data/test/test_cas.rb +0 -235
  2144. data/test/test_couchbase.rb +0 -77
  2145. data/test/test_couchbase_connection_pool.rb +0 -77
  2146. data/test/test_couchbase_rails_cache_store.rb +0 -358
  2147. data/test/test_delete.rb +0 -120
  2148. data/test/test_errors.rb +0 -82
  2149. data/test/test_eventmachine.rb +0 -78
  2150. data/test/test_format.rb +0 -164
  2151. data/test/test_get.rb +0 -407
  2152. data/test/test_stats.rb +0 -57
  2153. data/test/test_store.rb +0 -224
  2154. data/test/test_timer.rb +0 -42
  2155. data/test/test_touch.rb +0 -97
  2156. data/test/test_unlock.rb +0 -119
  2157. data/test/test_utils.rb +0 -58
  2158. data/test/test_version.rb +0 -52
@@ -0,0 +1,88 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020 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
21
+ {
22
+ struct collections_manifest {
23
+ struct collection {
24
+ std::uint64_t uid;
25
+ std::string name;
26
+ };
27
+
28
+ struct scope {
29
+ std::uint64_t uid;
30
+ std::string name;
31
+ std::vector<collection> collections;
32
+ };
33
+
34
+ uuid::uuid_t id;
35
+ std::uint64_t uid;
36
+ std::vector<scope> scopes;
37
+ };
38
+ } // namespace couchbase
39
+
40
+ template<>
41
+ struct fmt::formatter<couchbase::collections_manifest> : formatter<std::string> {
42
+ template<typename FormatContext>
43
+ auto format(const couchbase::collections_manifest& manifest, FormatContext& ctx)
44
+ {
45
+ std::vector<std::string> collections;
46
+ for (const auto& scope : manifest.scopes) {
47
+ for (const auto& collection : scope.collections) {
48
+ collections.emplace_back(fmt::format("{}.{}={}", scope.name, collection.name, collection.uid));
49
+ }
50
+ }
51
+
52
+ format_to(ctx.out(),
53
+ R"(#<manifest:{} uid={}, collections({})=[{}]>)",
54
+ couchbase::uuid::to_string(manifest.id),
55
+ manifest.uid,
56
+ collections.size(),
57
+ fmt::join(collections, ", "));
58
+ return formatter<std::string>::format("", ctx);
59
+ }
60
+ };
61
+
62
+ namespace tao::json
63
+ {
64
+ template<>
65
+ struct traits<couchbase::collections_manifest> {
66
+ template<template<typename...> class Traits>
67
+ static couchbase::collections_manifest as(const tao::json::basic_value<Traits>& v)
68
+ {
69
+ (void)v;
70
+ couchbase::collections_manifest result;
71
+ result.id = couchbase::uuid::random();
72
+ result.uid = std::stoull(v.at("uid").get_string(), 0, 16);
73
+ for (const auto& s : v.at("scopes").get_array()) {
74
+ couchbase::collections_manifest::scope scope;
75
+ scope.uid = std::stoull(s.at("uid").get_string(), 0, 16);
76
+ scope.name = s.at("name").get_string();
77
+ for (const auto& c : s.at("collections").get_array()) {
78
+ couchbase::collections_manifest::collection collection;
79
+ collection.uid = std::stoull(c.at("uid").get_string(), 0, 16);
80
+ collection.name = c.at("name").get_string();
81
+ scope.collections.emplace_back(collection);
82
+ }
83
+ result.scopes.emplace_back(scope);
84
+ }
85
+ return result;
86
+ }
87
+ };
88
+ } // namespace tao::json
@@ -0,0 +1,256 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020 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
+ #include <gsl/gsl_util>
21
+
22
+ #include <tao/json.hpp>
23
+ #include <spdlog/spdlog.h>
24
+ #include <utils/crc32.hxx>
25
+ #include <platform/uuid.h>
26
+
27
+ namespace couchbase
28
+ {
29
+ struct configuration {
30
+ struct port_map {
31
+ std::optional<std::uint16_t> key_value;
32
+ std::optional<std::uint16_t> management;
33
+ std::optional<std::uint16_t> analytics;
34
+ std::optional<std::uint16_t> search;
35
+ std::optional<std::uint16_t> views;
36
+ std::optional<std::uint16_t> query;
37
+ };
38
+ struct node {
39
+ bool this_node{ false };
40
+ size_t index;
41
+ std::string hostname;
42
+ port_map services_plain;
43
+ port_map services_tls;
44
+ };
45
+
46
+ using vbucket_map = typename std::vector<std::vector<std::int16_t>>;
47
+
48
+ std::uint64_t rev{};
49
+ couchbase::uuid::uuid_t id{};
50
+ std::optional<std::uint32_t> num_replicas{};
51
+ std::vector<node> nodes{};
52
+ std::optional<std::string> uuid{};
53
+ std::optional<std::string> bucket{};
54
+ std::optional<vbucket_map> vbmap{};
55
+
56
+ size_t index_for_endpoint(const asio::ip::tcp::endpoint& endpoint)
57
+ {
58
+ auto hostname = endpoint.address().to_string();
59
+ for (const auto& n : nodes) {
60
+ if (n.hostname == hostname) {
61
+ return n.index;
62
+ }
63
+ }
64
+ throw std::runtime_error("unable to locate node for the index");
65
+ }
66
+
67
+ [[nodiscard]] std::size_t index_for_this_node() const
68
+ {
69
+ for (const auto& n : nodes) {
70
+ if (n.this_node) {
71
+ return n.index;
72
+ }
73
+ }
74
+ throw std::runtime_error("no nodes marked as this_node");
75
+ }
76
+
77
+ std::pair<uint16_t, size_t> map_key(const std::string& key)
78
+ {
79
+ if (!vbmap.has_value()) {
80
+ throw std::runtime_error("cannot map key: partition map is not available");
81
+ }
82
+ uint32_t crc = utils::hash_crc32(key.data(), key.size());
83
+ uint16_t vbucket = uint16_t(crc % vbmap->size());
84
+ return std::make_pair(vbucket, static_cast<std::size_t>(vbmap->at(vbucket)[0]));
85
+ }
86
+ };
87
+
88
+ configuration
89
+ make_blank_configuration(const std::string& hostname, std::uint16_t plain_port, std::uint16_t tls_port)
90
+ {
91
+ configuration result;
92
+ result.id = couchbase::uuid::random();
93
+ result.rev = 0;
94
+ result.nodes.resize(1);
95
+ result.nodes[0].hostname = hostname;
96
+ result.nodes[0].this_node = true;
97
+ result.nodes[0].services_plain.key_value = plain_port;
98
+ result.nodes[0].services_tls.key_value = tls_port;
99
+ return result;
100
+ }
101
+ } // namespace couchbase
102
+
103
+ template<>
104
+ struct fmt::formatter<couchbase::configuration::node> : formatter<std::string> {
105
+ template<typename FormatContext>
106
+ auto format(const couchbase::configuration::node& node, FormatContext& ctx)
107
+ {
108
+ std::vector<std::string> plain;
109
+ if (node.services_plain.key_value) {
110
+ plain.push_back(fmt::format("kv={}", *node.services_plain.key_value));
111
+ }
112
+ if (node.services_plain.management) {
113
+ plain.push_back(fmt::format("mgmt={}", *node.services_plain.management));
114
+ }
115
+ if (node.services_plain.analytics) {
116
+ plain.push_back(fmt::format("cbas={}", *node.services_plain.analytics));
117
+ }
118
+ if (node.services_plain.search) {
119
+ plain.push_back(fmt::format("fts={}", *node.services_plain.search));
120
+ }
121
+ if (node.services_plain.query) {
122
+ plain.push_back(fmt::format("n1ql={}", *node.services_plain.query));
123
+ }
124
+ if (node.services_plain.views) {
125
+ plain.push_back(fmt::format("capi={}", *node.services_plain.views));
126
+ }
127
+ std::vector<std::string> tls;
128
+ if (node.services_tls.key_value) {
129
+ tls.push_back(fmt::format("kv={}", *node.services_tls.key_value));
130
+ }
131
+ if (node.services_tls.management) {
132
+ tls.push_back(fmt::format("mgmt={}", *node.services_tls.management));
133
+ }
134
+ if (node.services_tls.analytics) {
135
+ tls.push_back(fmt::format("cbas={}", *node.services_tls.analytics));
136
+ }
137
+ if (node.services_tls.search) {
138
+ tls.push_back(fmt::format("fts={}", *node.services_tls.search));
139
+ }
140
+ if (node.services_tls.query) {
141
+ tls.push_back(fmt::format("n1ql={}", *node.services_tls.query));
142
+ }
143
+ if (node.services_tls.views) {
144
+ tls.push_back(fmt::format("capi={}", *node.services_tls.views));
145
+ }
146
+ format_to(ctx.out(),
147
+ R"(#<node:{} hostname={}, plain=({}), tls=({})>)",
148
+ node.index,
149
+ node.hostname,
150
+ fmt::join(plain, ", "),
151
+ fmt::join(tls, ", "));
152
+ return formatter<std::string>::format("", ctx);
153
+ }
154
+ };
155
+
156
+ template<>
157
+ struct fmt::formatter<couchbase::configuration> : formatter<std::string> {
158
+ template<typename FormatContext>
159
+ auto format(const couchbase::configuration& config, FormatContext& ctx)
160
+ {
161
+ format_to(ctx.out(),
162
+ R"(#<config:{} rev={}{}{}{}{}, nodes({})=[{}]>)",
163
+ couchbase::uuid::to_string(config.id),
164
+ config.rev,
165
+ config.uuid ? fmt::format(", uuid={}", *config.uuid) : "",
166
+ config.bucket ? fmt::format(", bucket={}", *config.bucket) : "",
167
+ config.num_replicas ? fmt::format(", replicas={}", *config.num_replicas) : "",
168
+ config.vbmap.has_value() ? fmt::format(", partitions={}", config.vbmap->size()) : "",
169
+ config.nodes.size(),
170
+ fmt::join(config.nodes, ", "));
171
+ return formatter<std::string>::format("", ctx);
172
+ }
173
+ };
174
+
175
+ namespace tao::json
176
+ {
177
+ template<>
178
+ struct traits<couchbase::configuration> {
179
+ template<template<typename...> class Traits>
180
+ static couchbase::configuration as(const tao::json::basic_value<Traits>& v)
181
+ {
182
+ couchbase::configuration result;
183
+ result.id = couchbase::uuid::random();
184
+ result.rev = v.at("rev").template as<std::uint64_t>();
185
+ size_t index = 0;
186
+ for (const auto& j : v.at("nodesExt").get_array()) {
187
+ couchbase::configuration::node n;
188
+ n.index = index++;
189
+ const auto& o = j.get_object();
190
+ const auto& this_node = o.find("thisNode");
191
+ if (this_node != o.end() && this_node->second.get_boolean()) {
192
+ n.this_node = true;
193
+ }
194
+ const auto& hostname = o.find("hostname");
195
+ if (hostname != o.end()) {
196
+ n.hostname = hostname->second.get_string();
197
+ }
198
+ const auto& s = o.at("services");
199
+ n.services_plain.key_value = s.template optional<std::uint16_t>("kv");
200
+ n.services_plain.management = s.template optional<std::uint16_t>("mgmt");
201
+ n.services_plain.search = s.template optional<std::uint16_t>("fts");
202
+ n.services_plain.analytics = s.template optional<std::uint16_t>("cbas");
203
+ n.services_plain.query = s.template optional<std::uint16_t>("n1ql");
204
+ n.services_plain.views = s.template optional<std::uint16_t>("capi");
205
+ n.services_tls.key_value = s.template optional<std::uint16_t>("kvSSL");
206
+ n.services_tls.management = s.template optional<std::uint16_t>("mgmtSSL");
207
+ n.services_tls.search = s.template optional<std::uint16_t>("ftsSSL");
208
+ n.services_tls.analytics = s.template optional<std::uint16_t>("cbasSSL");
209
+ n.services_tls.query = s.template optional<std::uint16_t>("n1qlSSL");
210
+ n.services_tls.views = s.template optional<std::uint16_t>("capiSSL");
211
+ result.nodes.emplace_back(n);
212
+ }
213
+ {
214
+ const auto m = v.find("uuid");
215
+ if (m != nullptr) {
216
+ result.uuid = m->get_string();
217
+ }
218
+ }
219
+ {
220
+ const auto m = v.find("name");
221
+ if (m != nullptr) {
222
+ result.bucket = m->get_string();
223
+ }
224
+ }
225
+ {
226
+ const auto m = v.find("vBucketServerMap");
227
+ if (m != nullptr) {
228
+ const auto& o = m->get_object();
229
+ {
230
+ const auto f = o.find("numReplicas");
231
+ if (f != o.end()) {
232
+ result.num_replicas = f->second.template as<std::uint32_t>();
233
+ }
234
+ }
235
+ {
236
+ const auto f = o.find("vBucketMap");
237
+ if (f != o.end()) {
238
+ const auto& vb = f->second.get_array();
239
+ couchbase::configuration::vbucket_map vbmap;
240
+ vbmap.resize(vb.size());
241
+ for (size_t i = 0; i < vb.size(); i++) {
242
+ const auto& p = vb[i].get_array();
243
+ vbmap[i].resize(p.size());
244
+ for (size_t n = 0; n < p.size(); n++) {
245
+ vbmap[i][n] = p[n].template as<std::int16_t>();
246
+ }
247
+ }
248
+ result.vbmap = vbmap;
249
+ }
250
+ }
251
+ }
252
+ }
253
+ return result;
254
+ }
255
+ };
256
+ } // namespace tao::json
@@ -0,0 +1,93 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020 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
+ #include <functional>
21
+
22
+ #include <asio.hpp>
23
+
24
+ #include <configuration.hxx>
25
+
26
+ namespace couchbase
27
+ {
28
+ class configuration_monitor
29
+ {
30
+ public:
31
+ using listener_type = std::function<void(const configuration& conf)>;
32
+
33
+ explicit configuration_monitor(asio::io_context& ctx)
34
+ : strand_(ctx.get_executor())
35
+ {
36
+ }
37
+
38
+ void post(configuration&& conf)
39
+ {
40
+ asio::post(asio::bind_executor(strand_, [this, conf = std::move(conf)]() {
41
+ for (auto& listener : listeners_) {
42
+ listener.second(conf);
43
+ }
44
+ }));
45
+ }
46
+
47
+ void post(const std::string& bucket_name, configuration&& conf)
48
+ {
49
+ auto& listeners = bucket_listeners_[bucket_name];
50
+ if (listeners.empty()) {
51
+ return;
52
+ }
53
+ asio::post(asio::bind_executor(strand_, [&listeners, conf = std::move(conf)]() {
54
+ for (auto& listener : listeners) {
55
+ listener.second(conf);
56
+ }
57
+ }));
58
+ }
59
+
60
+ std::size_t subscribe(listener_type&& listener)
61
+ {
62
+ auto token = next_token_++;
63
+ listeners_[token] = listener;
64
+ return token;
65
+ }
66
+
67
+ std::size_t subscribe(const std::string& bucket_name, listener_type&& listener)
68
+ {
69
+ auto token = next_token_++;
70
+ bucket_listeners_[bucket_name][token] = listener;
71
+ return token;
72
+ }
73
+
74
+ void unsubscribe(size_t token)
75
+ {
76
+ listeners_.erase(token);
77
+ }
78
+
79
+ void unsubscribe(const std::string& bucket_name, size_t token)
80
+ {
81
+ auto b = bucket_listeners_.find(bucket_name);
82
+ if (b != bucket_listeners_.end()) {
83
+ b->second.erase(token);
84
+ }
85
+ }
86
+
87
+ private:
88
+ asio::strand<asio::io_context::executor_type> strand_;
89
+ std::map<size_t, listener_type> listeners_;
90
+ std::map<std::string, std::map<size_t, listener_type>> bucket_listeners_;
91
+ std::size_t next_token_{ 0 };
92
+ };
93
+ } // namespace couchbase
@@ -0,0 +1,3970 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include <openssl/crypto.h>
19
+ #include <asio/version.hpp>
20
+
21
+ #include <spdlog/spdlog.h>
22
+ #include <spdlog/cfg/env.h>
23
+
24
+ #include <http_parser.h>
25
+
26
+ #include <snappy.h>
27
+
28
+ #include <version.hxx>
29
+ #include <cluster.hxx>
30
+ #include <operations.hxx>
31
+
32
+ #include <ruby.h>
33
+ #if defined(HAVE_RUBY_VERSION_H)
34
+ #include <ruby/version.h>
35
+ #endif
36
+
37
+ #if !defined(RB_METHOD_DEFINITION_DECL)
38
+ #define VALUE_FUNC(f) reinterpret_cast<VALUE (*)(ANYARGS)>(f)
39
+ #define INT_FUNC(f) reinterpret_cast<int (*)(ANYARGS)>(f)
40
+ #else
41
+ #define VALUE_FUNC(f) (f)
42
+ #define INT_FUNC(f) (f)
43
+ #endif
44
+
45
+ static void
46
+ init_versions(VALUE mCouchbase)
47
+ {
48
+ VALUE cb_Version{};
49
+ if (rb_const_defined(mCouchbase, rb_intern("VERSION")) != 0) {
50
+ cb_Version = rb_const_get(mCouchbase, rb_intern("VERSION"));
51
+ } else {
52
+ cb_Version = rb_hash_new();
53
+ rb_const_set(mCouchbase, rb_intern("VERSION"), cb_Version);
54
+ }
55
+ #define VERSION_SPLIT_(VER) (VER) / 100000, (VER) / 100 % 1000, (VER) % 100
56
+
57
+ std::string ver;
58
+ ver = fmt::format("{}.{}.{}", BACKEND_VERSION_MAJOR, BACKEND_VERSION_MINOR, BACKEND_VERSION_PATCH);
59
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("backend")), rb_str_freeze(rb_str_new(ver.c_str(), static_cast<long>(ver.size()))));
60
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("build_timestamp")), rb_str_freeze(rb_str_new_cstr(BACKEND_BUILD_TIMESTAMP)));
61
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("revision")), rb_str_freeze(rb_str_new_cstr(BACKEND_GIT_REVISION)));
62
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("platform")), rb_str_freeze(rb_str_new_cstr(BACKEND_SYSTEM)));
63
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("cpu")), rb_str_freeze(rb_str_new_cstr(BACKEND_SYSTEM_PROCESSOR)));
64
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("cc")), rb_str_freeze(rb_str_new_cstr(BACKEND_C_COMPILER)));
65
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("cxx")), rb_str_freeze(rb_str_new_cstr(BACKEND_CXX_COMPILER)));
66
+ #if defined(HAVE_RUBY_VERSION_H)
67
+ ver = fmt::format("{}.{}.{}", RUBY_API_VERSION_MAJOR, RUBY_API_VERSION_MINOR, RUBY_API_VERSION_TEENY);
68
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("ruby")), rb_str_freeze(rb_str_new(ver.c_str(), static_cast<long>(ver.size()))));
69
+ #endif
70
+ ver = fmt::format("{}.{}.{}", SPDLOG_VER_MAJOR, SPDLOG_VER_MINOR, SPDLOG_VER_PATCH);
71
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("spdlog")), rb_str_freeze(rb_str_new(ver.c_str(), static_cast<long>(ver.size()))));
72
+ ver = fmt::format("{}.{}.{}", VERSION_SPLIT_(ASIO_VERSION));
73
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("asio")), rb_str_freeze(rb_str_new(ver.c_str(), static_cast<long>(ver.size()))));
74
+ ver = fmt::format("{}.{}.{}", SNAPPY_MAJOR, SNAPPY_MINOR, SNAPPY_PATCHLEVEL);
75
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("snappy")), rb_str_freeze(rb_str_new(ver.c_str(), static_cast<long>(ver.size()))));
76
+ ver = fmt::format("{}.{}.{}", HTTP_PARSER_VERSION_MAJOR, HTTP_PARSER_VERSION_MINOR, HTTP_PARSER_VERSION_PATCH);
77
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("http_parser")), rb_str_freeze(rb_str_new(ver.c_str(), static_cast<long>(ver.size()))));
78
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("openssl_headers")), rb_str_freeze(rb_str_new_cstr(OPENSSL_VERSION_TEXT)));
79
+ #if defined(OPENSSL_VERSION)
80
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("openssl_runtime")), rb_str_freeze(rb_str_new_cstr(OpenSSL_version(OPENSSL_VERSION))));
81
+ #elif defined(SSLEAY_VERSION)
82
+ rb_hash_aset(cb_Version, rb_id2sym(rb_intern("openssl_runtime")), rb_str_freeze(rb_str_new_cstr(SSLeay_version(SSLEAY_VERSION))));
83
+ #endif
84
+
85
+ #undef VERSION_SPLIT_
86
+ }
87
+
88
+ struct cb_backend_data {
89
+ std::unique_ptr<asio::io_context> ctx;
90
+ std::unique_ptr<couchbase::cluster> cluster;
91
+ std::thread worker;
92
+ };
93
+
94
+ static void
95
+ cb__backend_close(cb_backend_data* backend)
96
+ {
97
+ if (backend->cluster) {
98
+ auto barrier = std::make_shared<std::promise<void>>();
99
+ auto f = barrier->get_future();
100
+ backend->cluster->close([barrier]() { barrier->set_value(); });
101
+ f.wait();
102
+ backend->cluster.reset(nullptr);
103
+ if (backend->worker.joinable()) {
104
+ backend->worker.join();
105
+ }
106
+ backend->ctx.reset(nullptr);
107
+ }
108
+ }
109
+
110
+ static void
111
+ cb_Backend_mark(void* /* ptr */)
112
+ {
113
+ }
114
+
115
+ static void
116
+ cb_Backend_free(void* ptr)
117
+ {
118
+ auto* backend = reinterpret_cast<cb_backend_data*>(ptr);
119
+ cb__backend_close(backend);
120
+ ruby_xfree(backend);
121
+ }
122
+
123
+ static size_t
124
+ cb_Backend_memsize(const void* ptr)
125
+ {
126
+ const auto* backend = reinterpret_cast<const cb_backend_data*>(ptr);
127
+ return sizeof(*backend) + sizeof(*backend->cluster);
128
+ }
129
+
130
+ static const rb_data_type_t cb_backend_type{
131
+ "Couchbase/Backend",
132
+ { cb_Backend_mark,
133
+ cb_Backend_free,
134
+ cb_Backend_memsize,
135
+ // only one reserved field when GC.compact implemented
136
+ #ifdef T_MOVED
137
+ nullptr,
138
+ #endif
139
+ {} },
140
+ #ifdef RUBY_TYPED_FREE_IMMEDIATELY
141
+ nullptr,
142
+ nullptr,
143
+ RUBY_TYPED_FREE_IMMEDIATELY,
144
+ #endif
145
+ };
146
+
147
+ static VALUE
148
+ cb_Backend_allocate(VALUE klass)
149
+ {
150
+ cb_backend_data* backend = nullptr;
151
+ VALUE obj = TypedData_Make_Struct(klass, cb_backend_data, &cb_backend_type, backend);
152
+ backend->ctx = std::make_unique<asio::io_context>();
153
+ backend->cluster = std::make_unique<couchbase::cluster>(*backend->ctx);
154
+ backend->worker = std::thread([backend]() { backend->ctx->run(); });
155
+ return obj;
156
+ }
157
+
158
+ static VALUE eBackendError;
159
+ static VALUE eAmbiguousTimeout;
160
+ static VALUE eAuthenticationFailure;
161
+ static VALUE eBucketExists;
162
+ static VALUE eBucketNotFlushable;
163
+ static VALUE eBucketNotFound;
164
+ static VALUE eCasMismatch;
165
+ static VALUE eCollectionExists;
166
+ static VALUE eCollectionNotFound;
167
+ static VALUE eCompilationFailure;
168
+ static VALUE eDatasetExists;
169
+ static VALUE eDatasetNotFound;
170
+ static VALUE eDataverseExists;
171
+ static VALUE eDataverseNotFound;
172
+ static VALUE eDecodingFailure;
173
+ static VALUE eDeltaInvalid;
174
+ static VALUE eDesignDocumentNotFound;
175
+ static VALUE eDocumentExists;
176
+ static VALUE eDocumentIrretrievable;
177
+ static VALUE eDocumentLocked;
178
+ static VALUE eDocumentNotFound;
179
+ static VALUE eDocumentNotJson;
180
+ static VALUE eDurabilityAmbiguous;
181
+ static VALUE eDurabilityImpossible;
182
+ static VALUE eDurabilityLevelNotAvailable;
183
+ static VALUE eDurableWriteInProgress;
184
+ static VALUE eDurableWriteReCommitInProgress;
185
+ static VALUE eEncodingFailure;
186
+ static VALUE eFeatureNotAvailable;
187
+ static VALUE eGroupNotFound;
188
+ static VALUE eIndexExists;
189
+ static VALUE eIndexFailure;
190
+ static VALUE eIndexNotFound;
191
+ static VALUE eInternalServerFailure;
192
+ static VALUE eInvalidArgument;
193
+ static VALUE eJobQueueFull;
194
+ static VALUE eLinkNotFound;
195
+ static VALUE eNumberTooBig;
196
+ static VALUE eParsingFailure;
197
+ static VALUE ePathExists;
198
+ static VALUE ePathInvalid;
199
+ static VALUE ePathMismatch;
200
+ static VALUE ePathNotFound;
201
+ static VALUE ePathTooBig;
202
+ static VALUE ePathTooDeep;
203
+ static VALUE ePlanningFailure;
204
+ static VALUE ePreparedStatementFailure;
205
+ static VALUE eRequestCanceled;
206
+ static VALUE eScopeExists;
207
+ static VALUE eScopeNotFound;
208
+ static VALUE eServiceNotAvailable;
209
+ static VALUE eTemporaryFailure;
210
+ static VALUE eUnambiguousTimeout;
211
+ static VALUE eUnsupportedOperation;
212
+ static VALUE eUserNotFound;
213
+ static VALUE eUserExists;
214
+ static VALUE eValueInvalid;
215
+ static VALUE eValueTooDeep;
216
+ static VALUE eValueTooLarge;
217
+ static VALUE eViewNotFound;
218
+ static VALUE eXattrCannotModifyVirtualAttribute;
219
+ static VALUE eXattrInvalidKeyCombo;
220
+ static VALUE eXattrUnknownMacro;
221
+ static VALUE eXattrUnknownVirtualAttribute;
222
+
223
+ static void
224
+ init_exceptions(VALUE mCouchbase)
225
+ {
226
+ VALUE mError = rb_define_module_under(mCouchbase, "Error");
227
+ eBackendError = rb_define_class_under(mError, "BackendError", rb_eStandardError);
228
+ eAmbiguousTimeout = rb_define_class_under(mError, "AmbiguousTimeout", rb_eStandardError);
229
+ eAuthenticationFailure = rb_define_class_under(mError, "AuthenticationFailure", rb_eStandardError);
230
+ eBucketExists = rb_define_class_under(mError, "BucketExists", rb_eStandardError);
231
+ eBucketNotFlushable = rb_define_class_under(mError, "BucketNotFlushable", rb_eStandardError);
232
+ eBucketNotFound = rb_define_class_under(mError, "BucketNotFound", rb_eStandardError);
233
+ eCasMismatch = rb_define_class_under(mError, "CasMismatch", rb_eStandardError);
234
+ eCollectionExists = rb_define_class_under(mError, "CollectionExists", rb_eStandardError);
235
+ eCollectionNotFound = rb_define_class_under(mError, "CollectionNotFound", rb_eStandardError);
236
+ eCompilationFailure = rb_define_class_under(mError, "CompilationFailure", rb_eStandardError);
237
+ eDatasetExists = rb_define_class_under(mError, "DatasetExists", rb_eStandardError);
238
+ eDatasetNotFound = rb_define_class_under(mError, "DatasetNotFound", rb_eStandardError);
239
+ eDataverseExists = rb_define_class_under(mError, "DataverseExists", rb_eStandardError);
240
+ eDataverseNotFound = rb_define_class_under(mError, "DataverseNotFound", rb_eStandardError);
241
+ eDecodingFailure = rb_define_class_under(mError, "DecodingFailure", rb_eStandardError);
242
+ eDeltaInvalid = rb_define_class_under(mError, "DeltaInvalid", rb_eStandardError);
243
+ eDesignDocumentNotFound = rb_define_class_under(mError, "DesignDocumentNotFound", rb_eStandardError);
244
+ eDocumentExists = rb_define_class_under(mError, "DocumentExists", rb_eStandardError);
245
+ eDocumentIrretrievable = rb_define_class_under(mError, "DocumentIrretrievable", rb_eStandardError);
246
+ eDocumentLocked = rb_define_class_under(mError, "DocumentLocked", rb_eStandardError);
247
+ eDocumentNotFound = rb_define_class_under(mError, "DocumentNotFound", rb_eStandardError);
248
+ eDocumentNotJson = rb_define_class_under(mError, "DocumentNotJson", rb_eStandardError);
249
+ eDurabilityAmbiguous = rb_define_class_under(mError, "DurabilityAmbiguous", rb_eStandardError);
250
+ eDurabilityImpossible = rb_define_class_under(mError, "DurabilityImpossible", rb_eStandardError);
251
+ eDurabilityLevelNotAvailable = rb_define_class_under(mError, "DurabilityLevelNotAvailable", rb_eStandardError);
252
+ eDurableWriteInProgress = rb_define_class_under(mError, "DurableWriteInProgress", rb_eStandardError);
253
+ eDurableWriteReCommitInProgress = rb_define_class_under(mError, "DurableWriteReCommitInProgress", rb_eStandardError);
254
+ eEncodingFailure = rb_define_class_under(mError, "EncodingFailure", rb_eStandardError);
255
+ eFeatureNotAvailable = rb_define_class_under(mError, "FeatureNotAvailable", rb_eStandardError);
256
+ eGroupNotFound = rb_define_class_under(mError, "GroupNotFound", rb_eStandardError);
257
+ eIndexExists = rb_define_class_under(mError, "IndexExists", rb_eStandardError);
258
+ eIndexFailure = rb_define_class_under(mError, "IndexFailure", rb_eStandardError);
259
+ eIndexNotFound = rb_define_class_under(mError, "IndexNotFound", rb_eStandardError);
260
+ eInternalServerFailure = rb_define_class_under(mError, "InternalServerFailure", rb_eStandardError);
261
+ eInvalidArgument = rb_define_class_under(mError, "InvalidArgument", rb_eStandardError);
262
+ eJobQueueFull = rb_define_class_under(mError, "JobQueueFull", rb_eStandardError);
263
+ eLinkNotFound = rb_define_class_under(mError, "LinkNotFound", rb_eStandardError);
264
+ eNumberTooBig = rb_define_class_under(mError, "NumberTooBig", rb_eStandardError);
265
+ eParsingFailure = rb_define_class_under(mError, "ParsingFailure", rb_eStandardError);
266
+ ePathExists = rb_define_class_under(mError, "PathExists", rb_eStandardError);
267
+ ePathInvalid = rb_define_class_under(mError, "PathInvalid", rb_eStandardError);
268
+ ePathMismatch = rb_define_class_under(mError, "PathMismatch", rb_eStandardError);
269
+ ePathNotFound = rb_define_class_under(mError, "PathNotFound", rb_eStandardError);
270
+ ePathTooBig = rb_define_class_under(mError, "PathTooBig", rb_eStandardError);
271
+ ePathTooDeep = rb_define_class_under(mError, "PathTooDeep", rb_eStandardError);
272
+ ePlanningFailure = rb_define_class_under(mError, "PlanningFailure", rb_eStandardError);
273
+ ePreparedStatementFailure = rb_define_class_under(mError, "PreparedStatementFailure", rb_eStandardError);
274
+ eRequestCanceled = rb_define_class_under(mError, "RequestCanceled", rb_eStandardError);
275
+ eScopeExists = rb_define_class_under(mError, "ScopeExists", rb_eStandardError);
276
+ eScopeNotFound = rb_define_class_under(mError, "ScopeNotFound", rb_eStandardError);
277
+ eServiceNotAvailable = rb_define_class_under(mError, "ServiceNotAvailable", rb_eStandardError);
278
+ eTemporaryFailure = rb_define_class_under(mError, "TemporaryFailure", rb_eStandardError);
279
+ eUnambiguousTimeout = rb_define_class_under(mError, "UnambiguousTimeout", rb_eStandardError);
280
+ eUnsupportedOperation = rb_define_class_under(mError, "UnsupportedOperation", rb_eStandardError);
281
+ eUserNotFound = rb_define_class_under(mError, "UserNotFound", rb_eStandardError);
282
+ eUserExists = rb_define_class_under(mError, "UserExists", rb_eStandardError);
283
+ eValueInvalid = rb_define_class_under(mError, "ValueInvalid", rb_eStandardError);
284
+ eValueTooDeep = rb_define_class_under(mError, "ValueTooDeep", rb_eStandardError);
285
+ eValueTooLarge = rb_define_class_under(mError, "ValueTooLarge", rb_eStandardError);
286
+ eViewNotFound = rb_define_class_under(mError, "ViewNotFound", rb_eStandardError);
287
+ eXattrCannotModifyVirtualAttribute = rb_define_class_under(mError, "XattrCannotModifyVirtualAttribute", rb_eStandardError);
288
+ eXattrInvalidKeyCombo = rb_define_class_under(mError, "XattrInvalidKeyCombo", rb_eStandardError);
289
+ eXattrUnknownMacro = rb_define_class_under(mError, "XattrUnknownMacro", rb_eStandardError);
290
+ eXattrUnknownVirtualAttribute = rb_define_class_under(mError, "XattrUnknownVirtualAttribute", rb_eStandardError);
291
+ }
292
+
293
+ static VALUE
294
+ cb__map_error_code(std::error_code ec, const std::string& message)
295
+ {
296
+ if (ec.category() == couchbase::error::detail::get_common_category()) {
297
+ switch (static_cast<couchbase::error::common_errc>(ec.value())) {
298
+ case couchbase::error::common_errc::unambiguous_timeout:
299
+ return rb_exc_new_cstr(eUnambiguousTimeout, fmt::format("{}: {}", message, ec.message()).c_str());
300
+
301
+ case couchbase::error::common_errc::ambiguous_timeout:
302
+ return rb_exc_new_cstr(eAmbiguousTimeout, fmt::format("{}: {}", message, ec.message()).c_str());
303
+
304
+ case couchbase::error::common_errc::request_canceled:
305
+ return rb_exc_new_cstr(eRequestCanceled, fmt::format("{}: {}", message, ec.message()).c_str());
306
+
307
+ case couchbase::error::common_errc::invalid_argument:
308
+ return rb_exc_new_cstr(eInvalidArgument, fmt::format("{}: {}", message, ec.message()).c_str());
309
+
310
+ case couchbase::error::common_errc::service_not_available:
311
+ return rb_exc_new_cstr(eServiceNotAvailable, fmt::format("{}: {}", message, ec.message()).c_str());
312
+
313
+ case couchbase::error::common_errc::internal_server_failure:
314
+ return rb_exc_new_cstr(eInternalServerFailure, fmt::format("{}: {}", message, ec.message()).c_str());
315
+
316
+ case couchbase::error::common_errc::authentication_failure:
317
+ return rb_exc_new_cstr(eAuthenticationFailure, fmt::format("{}: {}", message, ec.message()).c_str());
318
+
319
+ case couchbase::error::common_errc::temporary_failure:
320
+ return rb_exc_new_cstr(eTemporaryFailure, fmt::format("{}: {}", message, ec.message()).c_str());
321
+
322
+ case couchbase::error::common_errc::parsing_failure:
323
+ return rb_exc_new_cstr(eParsingFailure, fmt::format("{}: {}", message, ec.message()).c_str());
324
+
325
+ case couchbase::error::common_errc::cas_mismatch:
326
+ return rb_exc_new_cstr(eCasMismatch, fmt::format("{}: {}", message, ec.message()).c_str());
327
+
328
+ case couchbase::error::common_errc::bucket_not_found:
329
+ return rb_exc_new_cstr(eBucketNotFound, fmt::format("{}: {}", message, ec.message()).c_str());
330
+
331
+ case couchbase::error::common_errc::scope_not_found:
332
+ return rb_exc_new_cstr(eScopeNotFound, fmt::format("{}: {}", message, ec.message()).c_str());
333
+
334
+ case couchbase::error::common_errc::collection_not_found:
335
+ return rb_exc_new_cstr(eCollectionNotFound, fmt::format("{}: {}", message, ec.message()).c_str());
336
+
337
+ case couchbase::error::common_errc::unsupported_operation:
338
+ return rb_exc_new_cstr(eUnsupportedOperation, fmt::format("{}: {}", message, ec.message()).c_str());
339
+
340
+ case couchbase::error::common_errc::feature_not_available:
341
+ return rb_exc_new_cstr(eFeatureNotAvailable, fmt::format("{}: {}", message, ec.message()).c_str());
342
+
343
+ case couchbase::error::common_errc::encoding_failure:
344
+ return rb_exc_new_cstr(eEncodingFailure, fmt::format("{}: {}", message, ec.message()).c_str());
345
+
346
+ case couchbase::error::common_errc::decoding_failure:
347
+ return rb_exc_new_cstr(eDecodingFailure, fmt::format("{}: {}", message, ec.message()).c_str());
348
+
349
+ case couchbase::error::common_errc::index_not_found:
350
+ return rb_exc_new_cstr(eIndexNotFound, fmt::format("{}: {}", message, ec.message()).c_str());
351
+
352
+ case couchbase::error::common_errc::index_exists:
353
+ return rb_exc_new_cstr(eIndexExists, fmt::format("{}: {}", message, ec.message()).c_str());
354
+ }
355
+ } else if (ec.category() == couchbase::error::detail::get_key_value_category()) {
356
+ switch (static_cast<couchbase::error::key_value_errc>(ec.value())) {
357
+ case couchbase::error::key_value_errc::document_not_found:
358
+ return rb_exc_new_cstr(eDocumentNotFound, fmt::format("{}: {}", message, ec.message()).c_str());
359
+
360
+ case couchbase::error::key_value_errc::document_irretrievable:
361
+ return rb_exc_new_cstr(eDocumentIrretrievable, fmt::format("{}: {}", message, ec.message()).c_str());
362
+
363
+ case couchbase::error::key_value_errc::document_locked:
364
+ return rb_exc_new_cstr(eDocumentLocked, fmt::format("{}: {}", message, ec.message()).c_str());
365
+
366
+ case couchbase::error::key_value_errc::value_too_large:
367
+ return rb_exc_new_cstr(eValueTooLarge, fmt::format("{}: {}", message, ec.message()).c_str());
368
+
369
+ case couchbase::error::key_value_errc::document_exists:
370
+ return rb_exc_new_cstr(eDocumentExists, fmt::format("{}: {}", message, ec.message()).c_str());
371
+
372
+ case couchbase::error::key_value_errc::durability_level_not_available:
373
+ return rb_exc_new_cstr(eDurabilityLevelNotAvailable, fmt::format("{}: {}", message, ec.message()).c_str());
374
+
375
+ case couchbase::error::key_value_errc::durability_impossible:
376
+ return rb_exc_new_cstr(eDurabilityImpossible, fmt::format("{}: {}", message, ec.message()).c_str());
377
+
378
+ case couchbase::error::key_value_errc::durability_ambiguous:
379
+ return rb_exc_new_cstr(eDurabilityAmbiguous, fmt::format("{}: {}", message, ec.message()).c_str());
380
+
381
+ case couchbase::error::key_value_errc::durable_write_in_progress:
382
+ return rb_exc_new_cstr(eDurableWriteInProgress, fmt::format("{}: {}", message, ec.message()).c_str());
383
+
384
+ case couchbase::error::key_value_errc::durable_write_re_commit_in_progress:
385
+ return rb_exc_new_cstr(eDurableWriteReCommitInProgress, fmt::format("{}: {}", message, ec.message()).c_str());
386
+
387
+ case couchbase::error::key_value_errc::path_not_found:
388
+ return rb_exc_new_cstr(ePathNotFound, fmt::format("{}: {}", message, ec.message()).c_str());
389
+
390
+ case couchbase::error::key_value_errc::path_mismatch:
391
+ return rb_exc_new_cstr(ePathMismatch, fmt::format("{}: {}", message, ec.message()).c_str());
392
+
393
+ case couchbase::error::key_value_errc::path_invalid:
394
+ return rb_exc_new_cstr(ePathInvalid, fmt::format("{}: {}", message, ec.message()).c_str());
395
+
396
+ case couchbase::error::key_value_errc::path_too_big:
397
+ return rb_exc_new_cstr(ePathTooBig, fmt::format("{}: {}", message, ec.message()).c_str());
398
+
399
+ case couchbase::error::key_value_errc::path_too_deep:
400
+ return rb_exc_new_cstr(ePathTooDeep, fmt::format("{}: {}", message, ec.message()).c_str());
401
+
402
+ case couchbase::error::key_value_errc::value_too_deep:
403
+ return rb_exc_new_cstr(eValueTooDeep, fmt::format("{}: {}", message, ec.message()).c_str());
404
+
405
+ case couchbase::error::key_value_errc::value_invalid:
406
+ return rb_exc_new_cstr(eValueInvalid, fmt::format("{}: {}", message, ec.message()).c_str());
407
+
408
+ case couchbase::error::key_value_errc::document_not_json:
409
+ return rb_exc_new_cstr(eDocumentNotJson, fmt::format("{}: {}", message, ec.message()).c_str());
410
+
411
+ case couchbase::error::key_value_errc::number_too_big:
412
+ return rb_exc_new_cstr(eNumberTooBig, fmt::format("{}: {}", message, ec.message()).c_str());
413
+
414
+ case couchbase::error::key_value_errc::delta_invalid:
415
+ return rb_exc_new_cstr(eDeltaInvalid, fmt::format("{}: {}", message, ec.message()).c_str());
416
+
417
+ case couchbase::error::key_value_errc::path_exists:
418
+ return rb_exc_new_cstr(ePathExists, fmt::format("{}: {}", message, ec.message()).c_str());
419
+
420
+ case couchbase::error::key_value_errc::xattr_unknown_macro:
421
+ return rb_exc_new_cstr(eXattrUnknownMacro, fmt::format("{}: {}", message, ec.message()).c_str());
422
+
423
+ case couchbase::error::key_value_errc::xattr_invalid_key_combo:
424
+ return rb_exc_new_cstr(eXattrInvalidKeyCombo, fmt::format("{}: {}", message, ec.message()).c_str());
425
+
426
+ case couchbase::error::key_value_errc::xattr_unknown_virtual_attribute:
427
+ return rb_exc_new_cstr(eXattrUnknownVirtualAttribute, fmt::format("{}: {}", message, ec.message()).c_str());
428
+
429
+ case couchbase::error::key_value_errc::xattr_cannot_modify_virtual_attribute:
430
+ return rb_exc_new_cstr(eXattrCannotModifyVirtualAttribute, fmt::format("{}: {}", message, ec.message()).c_str());
431
+ }
432
+ } else if (ec.category() == couchbase::error::detail::get_query_category()) {
433
+ switch (static_cast<couchbase::error::query_errc>(ec.value())) {
434
+ case couchbase::error::query_errc::planning_failure:
435
+ return rb_exc_new_cstr(ePlanningFailure, fmt::format("{}: {}", message, ec.message()).c_str());
436
+
437
+ case couchbase::error::query_errc::index_failure:
438
+ return rb_exc_new_cstr(eIndexFailure, fmt::format("{}: {}", message, ec.message()).c_str());
439
+
440
+ case couchbase::error::query_errc::prepared_statement_failure:
441
+ return rb_exc_new_cstr(ePreparedStatementFailure, fmt::format("{}: {}", message, ec.message()).c_str());
442
+ }
443
+ } else if (ec.category() == couchbase::error::detail::get_view_category()) {
444
+ switch (static_cast<couchbase::error::view_errc>(ec.value())) {
445
+ case couchbase::error::view_errc::view_not_found:
446
+ return rb_exc_new_cstr(eViewNotFound, fmt::format("{}: {}", message, ec.message()).c_str());
447
+
448
+ case couchbase::error::view_errc::design_document_not_found:
449
+ return rb_exc_new_cstr(eDesignDocumentNotFound, fmt::format("{}: {}", message, ec.message()).c_str());
450
+ }
451
+ } else if (ec.category() == couchbase::error::detail::get_analytics_category()) {
452
+ switch (static_cast<couchbase::error::analytics_errc>(ec.value())) {
453
+ case couchbase::error::analytics_errc::compilation_failure:
454
+ return rb_exc_new_cstr(eCompilationFailure, fmt::format("{}: {}", message, ec.message()).c_str());
455
+
456
+ case couchbase::error::analytics_errc::job_queue_full:
457
+ return rb_exc_new_cstr(eJobQueueFull, fmt::format("{}: {}", message, ec.message()).c_str());
458
+
459
+ case couchbase::error::analytics_errc::dataset_not_found:
460
+ return rb_exc_new_cstr(eDatasetNotFound, fmt::format("{}: {}", message, ec.message()).c_str());
461
+
462
+ case couchbase::error::analytics_errc::dataverse_not_found:
463
+ return rb_exc_new_cstr(eDataverseNotFound, fmt::format("{}: {}", message, ec.message()).c_str());
464
+
465
+ case couchbase::error::analytics_errc::dataset_exists:
466
+ return rb_exc_new_cstr(eDatasetExists, fmt::format("{}: {}", message, ec.message()).c_str());
467
+
468
+ case couchbase::error::analytics_errc::dataverse_exists:
469
+ return rb_exc_new_cstr(eDataverseExists, fmt::format("{}: {}", message, ec.message()).c_str());
470
+
471
+ case couchbase::error::analytics_errc::link_not_found:
472
+ return rb_exc_new_cstr(eLinkNotFound, fmt::format("{}: {}", message, ec.message()).c_str());
473
+ }
474
+ } else if (ec.category() == couchbase::error::detail::get_management_category()) {
475
+ switch (static_cast<couchbase::error::management_errc>(ec.value())) {
476
+ case couchbase::error::management_errc::collection_exists:
477
+ return rb_exc_new_cstr(eCollectionExists, fmt::format("{}: {}", message, ec.message()).c_str());
478
+
479
+ case couchbase::error::management_errc::scope_exists:
480
+ return rb_exc_new_cstr(eScopeExists, fmt::format("{}: {}", message, ec.message()).c_str());
481
+
482
+ case couchbase::error::management_errc::user_not_found:
483
+ return rb_exc_new_cstr(eUserNotFound, fmt::format("{}: {}", message, ec.message()).c_str());
484
+
485
+ case couchbase::error::management_errc::group_not_found:
486
+ return rb_exc_new_cstr(eGroupNotFound, fmt::format("{}: {}", message, ec.message()).c_str());
487
+
488
+ case couchbase::error::management_errc::user_exists:
489
+ return rb_exc_new_cstr(eUserExists, fmt::format("{}: {}", message, ec.message()).c_str());
490
+
491
+ case couchbase::error::management_errc::bucket_exists:
492
+ return rb_exc_new_cstr(eBucketExists, fmt::format("{}: {}", message, ec.message()).c_str());
493
+
494
+ case couchbase::error::management_errc::bucket_not_flushable:
495
+ return rb_exc_new_cstr(eBucketNotFlushable, fmt::format("{}: {}", message, ec.message()).c_str());
496
+ }
497
+ }
498
+
499
+ return rb_exc_new_cstr(eBackendError, fmt::format("{}: {}", message, ec.message()).c_str());
500
+ }
501
+
502
+ static VALUE
503
+ cb_Backend_open(VALUE self, VALUE hostname, VALUE username, VALUE password)
504
+ {
505
+ cb_backend_data* backend = nullptr;
506
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
507
+
508
+ if (!backend->cluster) {
509
+ rb_raise(rb_eArgError, "Cluster has been closed already");
510
+ }
511
+ VALUE exc = Qnil;
512
+
513
+ {
514
+ Check_Type(hostname, T_STRING);
515
+ Check_Type(username, T_STRING);
516
+ Check_Type(password, T_STRING);
517
+
518
+ couchbase::origin options;
519
+ options.hostname.assign(RSTRING_PTR(hostname), static_cast<size_t>(RSTRING_LEN(hostname)));
520
+ options.username.assign(RSTRING_PTR(username), static_cast<size_t>(RSTRING_LEN(username)));
521
+ options.password.assign(RSTRING_PTR(password), static_cast<size_t>(RSTRING_LEN(password)));
522
+ auto barrier = std::make_shared<std::promise<std::error_code>>();
523
+ auto f = barrier->get_future();
524
+ backend->cluster->open(options, [barrier](std::error_code ec) mutable { barrier->set_value(ec); });
525
+ if (auto ec = f.get()) {
526
+ exc = cb__map_error_code(ec, fmt::format("unable open cluster at {}", options.hostname));
527
+ }
528
+ }
529
+ if (!NIL_P(exc)) {
530
+ rb_exc_raise(exc);
531
+ }
532
+
533
+ return Qnil;
534
+ }
535
+
536
+ static VALUE
537
+ cb_Backend_close(VALUE self)
538
+ {
539
+ cb_backend_data* backend = nullptr;
540
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
541
+ cb__backend_close(backend);
542
+ return Qnil;
543
+ }
544
+
545
+ static VALUE
546
+ cb_Backend_open_bucket(VALUE self, VALUE bucket)
547
+ {
548
+ cb_backend_data* backend = nullptr;
549
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
550
+
551
+ if (!backend->cluster) {
552
+ rb_raise(rb_eArgError, "Cluster has been closed already");
553
+ }
554
+
555
+ Check_Type(bucket, T_STRING);
556
+
557
+ VALUE exc = Qnil;
558
+ {
559
+ std::string name(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
560
+
561
+ auto barrier = std::make_shared<std::promise<std::error_code>>();
562
+ auto f = barrier->get_future();
563
+ backend->cluster->open_bucket(name, [barrier](std::error_code ec) mutable { barrier->set_value(ec); });
564
+ if (auto ec = f.get()) {
565
+ exc = cb__map_error_code(ec, fmt::format("unable open bucket \"{}\"", name));
566
+ }
567
+ }
568
+ if (!NIL_P(exc)) {
569
+ rb_exc_raise(exc);
570
+ }
571
+
572
+ return Qtrue;
573
+ }
574
+
575
+ template<typename Request>
576
+ void
577
+ cb__extract_timeout(Request& req, VALUE timeout)
578
+ {
579
+ if (!NIL_P(timeout)) {
580
+ switch (TYPE(timeout)) {
581
+ case T_FIXNUM:
582
+ case T_BIGNUM:
583
+ req.timeout = std::chrono::milliseconds(NUM2ULL(timeout));
584
+ break;
585
+ default:
586
+ rb_raise(rb_eArgError, "timeout must be an Integer");
587
+ }
588
+ }
589
+ }
590
+
591
+ static VALUE
592
+ cb_Backend_document_get(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE timeout)
593
+ {
594
+ cb_backend_data* backend = nullptr;
595
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
596
+
597
+ if (!backend->cluster) {
598
+ rb_raise(rb_eArgError, "Cluster has been closed already");
599
+ }
600
+
601
+ Check_Type(bucket, T_STRING);
602
+ Check_Type(collection, T_STRING);
603
+ Check_Type(id, T_STRING);
604
+
605
+ VALUE exc = Qnil;
606
+ do {
607
+ couchbase::document_id doc_id;
608
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
609
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
610
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
611
+
612
+ couchbase::operations::get_request req{ doc_id };
613
+ cb__extract_timeout(req, timeout);
614
+ auto barrier = std::make_shared<std::promise<couchbase::operations::get_response>>();
615
+ auto f = barrier->get_future();
616
+ backend->cluster->execute(req, [barrier](couchbase::operations::get_response resp) mutable { barrier->set_value(resp); });
617
+ auto resp = f.get();
618
+ if (resp.ec) {
619
+ exc = cb__map_error_code(resp.ec, fmt::format("unable fetch {}", doc_id));
620
+ break;
621
+ }
622
+
623
+ VALUE res = rb_hash_new();
624
+ rb_hash_aset(res, rb_id2sym(rb_intern("content")), rb_str_new(resp.value.data(), static_cast<long>(resp.value.size())));
625
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
626
+ rb_hash_aset(res, rb_id2sym(rb_intern("flags")), UINT2NUM(resp.flags));
627
+ return res;
628
+ } while (false);
629
+ rb_exc_raise(exc);
630
+ return Qnil;
631
+ }
632
+
633
+ static VALUE
634
+ cb_Backend_document_get_projected(VALUE self,
635
+ VALUE bucket,
636
+ VALUE collection,
637
+ VALUE id,
638
+ VALUE timeout,
639
+ VALUE with_expiration,
640
+ VALUE projections,
641
+ VALUE preserve_array_indexes)
642
+ {
643
+ cb_backend_data* backend = nullptr;
644
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
645
+
646
+ if (!backend->cluster) {
647
+ rb_raise(rb_eArgError, "Cluster has been closed already");
648
+ }
649
+
650
+ Check_Type(bucket, T_STRING);
651
+ Check_Type(collection, T_STRING);
652
+ Check_Type(id, T_STRING);
653
+
654
+ VALUE exc = Qnil;
655
+ do {
656
+ couchbase::document_id doc_id;
657
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
658
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
659
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
660
+
661
+ couchbase::operations::get_projected_request req{ doc_id };
662
+ cb__extract_timeout(req, timeout);
663
+ req.with_expiration = RTEST(with_expiration);
664
+ req.preserve_array_indexes = RTEST(preserve_array_indexes);
665
+ if (!NIL_P(projections)) {
666
+ Check_Type(projections, T_ARRAY);
667
+ auto entries_num = static_cast<size_t>(RARRAY_LEN(projections));
668
+ req.projections.reserve(entries_num);
669
+ for (size_t i = 0; i < entries_num; ++i) {
670
+ VALUE entry = rb_ary_entry(projections, static_cast<long>(i));
671
+ Check_Type(entry, T_STRING);
672
+ req.projections.emplace_back(std::string(RSTRING_PTR(entry), static_cast<std::size_t>(RSTRING_LEN(entry))));
673
+ }
674
+ }
675
+
676
+ auto barrier = std::make_shared<std::promise<couchbase::operations::get_projected_response>>();
677
+ auto f = barrier->get_future();
678
+ backend->cluster->execute(req, [barrier](couchbase::operations::get_projected_response resp) mutable { barrier->set_value(resp); });
679
+ auto resp = f.get();
680
+ if (resp.ec) {
681
+ exc = cb__map_error_code(resp.ec, fmt::format("unable fetch with projections {}", doc_id));
682
+ break;
683
+ }
684
+
685
+ VALUE res = rb_hash_new();
686
+ rb_hash_aset(res, rb_id2sym(rb_intern("content")), rb_str_new(resp.value.data(), static_cast<long>(resp.value.size())));
687
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
688
+ rb_hash_aset(res, rb_id2sym(rb_intern("flags")), UINT2NUM(resp.flags));
689
+ if (resp.expiration) {
690
+ rb_hash_aset(res, rb_id2sym(rb_intern("expiration")), UINT2NUM(resp.expiration.value()));
691
+ }
692
+ return res;
693
+ } while (false);
694
+ rb_exc_raise(exc);
695
+ return Qnil;
696
+ }
697
+
698
+ static VALUE
699
+ cb_Backend_document_get_and_lock(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE timeout, VALUE lock_time)
700
+ {
701
+ cb_backend_data* backend = nullptr;
702
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
703
+
704
+ if (!backend->cluster) {
705
+ rb_raise(rb_eArgError, "Cluster has been closed already");
706
+ }
707
+
708
+ Check_Type(bucket, T_STRING);
709
+ Check_Type(collection, T_STRING);
710
+ Check_Type(id, T_STRING);
711
+ Check_Type(lock_time, T_FIXNUM);
712
+
713
+ VALUE exc = Qnil;
714
+ do {
715
+ couchbase::document_id doc_id;
716
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
717
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
718
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
719
+
720
+ couchbase::operations::get_and_lock_request req{ doc_id };
721
+ cb__extract_timeout(req, timeout);
722
+ req.lock_time = NUM2UINT(lock_time);
723
+
724
+ auto barrier = std::make_shared<std::promise<couchbase::operations::get_and_lock_response>>();
725
+ auto f = barrier->get_future();
726
+ backend->cluster->execute(req, [barrier](couchbase::operations::get_and_lock_response resp) mutable { barrier->set_value(resp); });
727
+ auto resp = f.get();
728
+ if (resp.ec) {
729
+ exc = cb__map_error_code(resp.ec, fmt::format("unable lock and fetch {}", doc_id));
730
+ break;
731
+ }
732
+
733
+ VALUE res = rb_hash_new();
734
+ rb_hash_aset(res, rb_id2sym(rb_intern("content")), rb_str_new(resp.value.data(), static_cast<long>(resp.value.size())));
735
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
736
+ rb_hash_aset(res, rb_id2sym(rb_intern("flags")), UINT2NUM(resp.flags));
737
+ return res;
738
+ } while (false);
739
+ rb_exc_raise(exc);
740
+ return Qnil;
741
+ }
742
+
743
+ static VALUE
744
+ cb_Backend_document_get_and_touch(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE timeout, VALUE expiration)
745
+ {
746
+ cb_backend_data* backend = nullptr;
747
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
748
+
749
+ if (!backend->cluster) {
750
+ rb_raise(rb_eArgError, "Cluster has been closed already");
751
+ }
752
+
753
+ Check_Type(bucket, T_STRING);
754
+ Check_Type(collection, T_STRING);
755
+ Check_Type(id, T_STRING);
756
+ Check_Type(expiration, T_FIXNUM);
757
+
758
+ VALUE exc = Qnil;
759
+ do {
760
+ couchbase::document_id doc_id;
761
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
762
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
763
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
764
+
765
+ couchbase::operations::get_and_touch_request req{ doc_id };
766
+ cb__extract_timeout(req, timeout);
767
+ req.expiration = NUM2UINT(expiration);
768
+
769
+ auto barrier = std::make_shared<std::promise<couchbase::operations::get_and_touch_response>>();
770
+ auto f = barrier->get_future();
771
+ backend->cluster->execute(req, [barrier](couchbase::operations::get_and_touch_response resp) mutable { barrier->set_value(resp); });
772
+ auto resp = f.get();
773
+ if (resp.ec) {
774
+ exc = cb__map_error_code(resp.ec, fmt::format("unable fetch and touch {}", doc_id));
775
+ break;
776
+ }
777
+
778
+ VALUE res = rb_hash_new();
779
+ rb_hash_aset(res, rb_id2sym(rb_intern("content")), rb_str_new(resp.value.data(), static_cast<long>(resp.value.size())));
780
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
781
+ rb_hash_aset(res, rb_id2sym(rb_intern("flags")), UINT2NUM(resp.flags));
782
+ return res;
783
+ } while (false);
784
+ rb_exc_raise(exc);
785
+ return Qnil;
786
+ }
787
+
788
+ template<typename Response>
789
+ static VALUE
790
+ cb__extract_mutation_result(Response resp)
791
+ {
792
+ VALUE res = rb_hash_new();
793
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
794
+ VALUE token = rb_hash_new();
795
+ rb_hash_aset(token, rb_id2sym(rb_intern("partition_uuid")), ULL2NUM(resp.token.partition_uuid));
796
+ rb_hash_aset(token, rb_id2sym(rb_intern("sequence_number")), ULONG2NUM(resp.token.sequence_number));
797
+ rb_hash_aset(token, rb_id2sym(rb_intern("partition_id")), UINT2NUM(resp.token.partition_id));
798
+ rb_hash_aset(token,
799
+ rb_id2sym(rb_intern("bucket_name")),
800
+ rb_str_new(resp.token.bucket_name.c_str(), static_cast<long>(resp.token.bucket_name.size())));
801
+ rb_hash_aset(res, rb_id2sym(rb_intern("mutation_token")), token);
802
+ return res;
803
+ }
804
+
805
+ static VALUE
806
+ cb_Backend_document_touch(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE timeout, VALUE expiration)
807
+ {
808
+ cb_backend_data* backend = nullptr;
809
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
810
+
811
+ if (!backend->cluster) {
812
+ rb_raise(rb_eArgError, "Cluster has been closed already");
813
+ }
814
+
815
+ Check_Type(bucket, T_STRING);
816
+ Check_Type(collection, T_STRING);
817
+ Check_Type(id, T_STRING);
818
+ Check_Type(expiration, T_FIXNUM);
819
+
820
+ VALUE exc = Qnil;
821
+ do {
822
+ couchbase::document_id doc_id;
823
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
824
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
825
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
826
+
827
+ couchbase::operations::touch_request req{ doc_id };
828
+ cb__extract_timeout(req, timeout);
829
+ req.expiration = NUM2UINT(expiration);
830
+
831
+ auto barrier = std::make_shared<std::promise<couchbase::operations::touch_response>>();
832
+ auto f = barrier->get_future();
833
+ backend->cluster->execute(req, [barrier](couchbase::operations::touch_response resp) mutable { barrier->set_value(resp); });
834
+ auto resp = f.get();
835
+ if (resp.ec) {
836
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to touch {}", doc_id));
837
+ break;
838
+ }
839
+
840
+ VALUE res = rb_hash_new();
841
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
842
+ return res;
843
+ } while (false);
844
+ rb_exc_raise(exc);
845
+ return Qnil;
846
+ }
847
+
848
+ static VALUE
849
+ cb_Backend_document_exists(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE timeout)
850
+ {
851
+ cb_backend_data* backend = nullptr;
852
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
853
+
854
+ if (!backend->cluster) {
855
+ rb_raise(rb_eArgError, "Cluster has been closed already");
856
+ }
857
+
858
+ Check_Type(bucket, T_STRING);
859
+ Check_Type(collection, T_STRING);
860
+ Check_Type(id, T_STRING);
861
+
862
+ VALUE exc = Qnil;
863
+ do {
864
+ couchbase::document_id doc_id;
865
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
866
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
867
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
868
+
869
+ couchbase::operations::exists_request req{ doc_id };
870
+ cb__extract_timeout(req, timeout);
871
+
872
+ auto barrier = std::make_shared<std::promise<couchbase::operations::exists_response>>();
873
+ auto f = barrier->get_future();
874
+ backend->cluster->execute(req, [barrier](couchbase::operations::exists_response resp) mutable { barrier->set_value(resp); });
875
+ auto resp = f.get();
876
+ if (resp.ec) {
877
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to exists {}", doc_id));
878
+ break;
879
+ }
880
+
881
+ VALUE res = rb_hash_new();
882
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
883
+ rb_hash_aset(res, rb_id2sym(rb_intern("partition_id")), UINT2NUM(resp.partition_id));
884
+ switch (resp.status) {
885
+ case couchbase::operations::exists_response::observe_status::invalid:
886
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_id2sym(rb_intern("invalid")));
887
+ break;
888
+ case couchbase::operations::exists_response::observe_status::found:
889
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_id2sym(rb_intern("found")));
890
+ break;
891
+ case couchbase::operations::exists_response::observe_status::not_found:
892
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_id2sym(rb_intern("not_found")));
893
+ break;
894
+ case couchbase::operations::exists_response::observe_status::persisted:
895
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_id2sym(rb_intern("persisted")));
896
+ break;
897
+ case couchbase::operations::exists_response::observe_status::logically_deleted:
898
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_id2sym(rb_intern("logically_deleted")));
899
+ break;
900
+ }
901
+ return res;
902
+ } while (false);
903
+ rb_exc_raise(exc);
904
+ return Qnil;
905
+ }
906
+
907
+ static VALUE
908
+ cb_Backend_document_unlock(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE timeout, VALUE cas)
909
+ {
910
+ cb_backend_data* backend = nullptr;
911
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
912
+
913
+ if (!backend->cluster) {
914
+ rb_raise(rb_eArgError, "Cluster has been closed already");
915
+ }
916
+
917
+ Check_Type(bucket, T_STRING);
918
+ Check_Type(collection, T_STRING);
919
+ Check_Type(id, T_STRING);
920
+
921
+ VALUE exc = Qnil;
922
+ do {
923
+ couchbase::document_id doc_id;
924
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
925
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
926
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
927
+
928
+ couchbase::operations::unlock_request req{ doc_id };
929
+ cb__extract_timeout(req, timeout);
930
+ switch (TYPE(cas)) {
931
+ case T_FIXNUM:
932
+ case T_BIGNUM:
933
+ req.cas = NUM2ULL(cas);
934
+ break;
935
+ default:
936
+ rb_raise(rb_eArgError, "CAS must be an Integer");
937
+ }
938
+
939
+ auto barrier = std::make_shared<std::promise<couchbase::operations::unlock_response>>();
940
+ auto f = barrier->get_future();
941
+ backend->cluster->execute(req, [barrier](couchbase::operations::unlock_response resp) mutable { barrier->set_value(resp); });
942
+ auto resp = f.get();
943
+ if (resp.ec) {
944
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to unlock {}", doc_id));
945
+ break;
946
+ }
947
+
948
+ VALUE res = rb_hash_new();
949
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
950
+ return res;
951
+ } while (false);
952
+ rb_exc_raise(exc);
953
+ return Qnil;
954
+ }
955
+
956
+ static VALUE
957
+ cb_Backend_document_upsert(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE timeout, VALUE content, VALUE flags, VALUE options)
958
+ {
959
+ cb_backend_data* backend = nullptr;
960
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
961
+
962
+ if (!backend->cluster) {
963
+ rb_raise(rb_eArgError, "Cluster has been closed already");
964
+ }
965
+
966
+ Check_Type(bucket, T_STRING);
967
+ Check_Type(collection, T_STRING);
968
+ Check_Type(id, T_STRING);
969
+ Check_Type(content, T_STRING);
970
+ Check_Type(flags, T_FIXNUM);
971
+
972
+ VALUE exc = Qnil;
973
+ do {
974
+ couchbase::document_id doc_id;
975
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
976
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
977
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
978
+ std::string value(RSTRING_PTR(content), static_cast<size_t>(RSTRING_LEN(content)));
979
+
980
+ couchbase::operations::upsert_request req{ doc_id, value };
981
+ cb__extract_timeout(req, timeout);
982
+ req.flags = FIX2UINT(flags);
983
+
984
+ if (!NIL_P(options)) {
985
+ Check_Type(options, T_HASH);
986
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
987
+ if (!NIL_P(durability_level)) {
988
+ Check_Type(durability_level, T_SYMBOL);
989
+ ID level = rb_sym2id(durability_level);
990
+ if (level == rb_intern("none")) {
991
+ req.durability_level = couchbase::protocol::durability_level::none;
992
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
993
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
994
+ } else if (level == rb_intern("persist_to_majority")) {
995
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
996
+ } else {
997
+ rb_raise(rb_eArgError, "Unknown durability level");
998
+ }
999
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
1000
+ if (!NIL_P(durability_timeout)) {
1001
+ Check_Type(durability_timeout, T_FIXNUM);
1002
+ req.durability_timeout = FIX2UINT(durability_timeout);
1003
+ }
1004
+ }
1005
+ VALUE expiration = rb_hash_aref(options, rb_id2sym(rb_intern("expiration")));
1006
+ if (!NIL_P(expiration)) {
1007
+ Check_Type(expiration, T_FIXNUM);
1008
+ req.expiration = FIX2UINT(expiration);
1009
+ }
1010
+ }
1011
+
1012
+ auto barrier = std::make_shared<std::promise<couchbase::operations::upsert_response>>();
1013
+ auto f = barrier->get_future();
1014
+ backend->cluster->execute(req, [barrier](couchbase::operations::upsert_response resp) mutable { barrier->set_value(resp); });
1015
+ auto resp = f.get();
1016
+ if (resp.ec) {
1017
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to upsert {}", doc_id));
1018
+ break;
1019
+ }
1020
+
1021
+ return cb__extract_mutation_result(resp);
1022
+ } while (false);
1023
+ rb_exc_raise(exc);
1024
+ return Qnil;
1025
+ }
1026
+
1027
+ static VALUE
1028
+ cb_Backend_document_replace(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE timeout, VALUE content, VALUE flags, VALUE options)
1029
+ {
1030
+ cb_backend_data* backend = nullptr;
1031
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1032
+
1033
+ if (!backend->cluster) {
1034
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1035
+ }
1036
+
1037
+ Check_Type(bucket, T_STRING);
1038
+ Check_Type(collection, T_STRING);
1039
+ Check_Type(id, T_STRING);
1040
+ Check_Type(content, T_STRING);
1041
+ Check_Type(flags, T_FIXNUM);
1042
+
1043
+ VALUE exc = Qnil;
1044
+ do {
1045
+ couchbase::document_id doc_id;
1046
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
1047
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
1048
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
1049
+ std::string value(RSTRING_PTR(content), static_cast<size_t>(RSTRING_LEN(content)));
1050
+
1051
+ couchbase::operations::replace_request req{ doc_id, value };
1052
+ cb__extract_timeout(req, timeout);
1053
+ req.flags = FIX2UINT(flags);
1054
+
1055
+ if (!NIL_P(options)) {
1056
+ Check_Type(options, T_HASH);
1057
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
1058
+ if (!NIL_P(durability_level)) {
1059
+ Check_Type(durability_level, T_SYMBOL);
1060
+ ID level = rb_sym2id(durability_level);
1061
+ if (level == rb_intern("none")) {
1062
+ req.durability_level = couchbase::protocol::durability_level::none;
1063
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
1064
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
1065
+ } else if (level == rb_intern("persist_to_majority")) {
1066
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
1067
+ } else {
1068
+ rb_raise(rb_eArgError, "Unknown durability level");
1069
+ }
1070
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
1071
+ if (!NIL_P(durability_timeout)) {
1072
+ Check_Type(durability_timeout, T_FIXNUM);
1073
+ req.durability_timeout = FIX2UINT(durability_timeout);
1074
+ }
1075
+ }
1076
+ VALUE expiration = rb_hash_aref(options, rb_id2sym(rb_intern("expiration")));
1077
+ if (!NIL_P(expiration)) {
1078
+ Check_Type(expiration, T_FIXNUM);
1079
+ req.expiration = FIX2UINT(expiration);
1080
+ }
1081
+ VALUE cas = rb_hash_aref(options, rb_id2sym(rb_intern("cas")));
1082
+ if (!NIL_P(cas)) {
1083
+ switch (TYPE(cas)) {
1084
+ case T_FIXNUM:
1085
+ case T_BIGNUM:
1086
+ req.cas = NUM2ULL(cas);
1087
+ break;
1088
+ default:
1089
+ rb_raise(rb_eArgError, "CAS must be an Integer");
1090
+ }
1091
+ }
1092
+ }
1093
+
1094
+ auto barrier = std::make_shared<std::promise<couchbase::operations::replace_response>>();
1095
+ auto f = barrier->get_future();
1096
+ backend->cluster->execute(req, [barrier](couchbase::operations::replace_response resp) mutable { barrier->set_value(resp); });
1097
+ auto resp = f.get();
1098
+ if (resp.ec) {
1099
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to replace {}", doc_id));
1100
+ break;
1101
+ }
1102
+
1103
+ return cb__extract_mutation_result(resp);
1104
+ } while (false);
1105
+ rb_exc_raise(exc);
1106
+ return Qnil;
1107
+ }
1108
+
1109
+ static VALUE
1110
+ cb_Backend_document_insert(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE timeout, VALUE content, VALUE flags, VALUE options)
1111
+ {
1112
+ cb_backend_data* backend = nullptr;
1113
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1114
+
1115
+ if (!backend->cluster) {
1116
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1117
+ }
1118
+
1119
+ Check_Type(bucket, T_STRING);
1120
+ Check_Type(collection, T_STRING);
1121
+ Check_Type(id, T_STRING);
1122
+ Check_Type(content, T_STRING);
1123
+ Check_Type(flags, T_FIXNUM);
1124
+
1125
+ VALUE exc = Qnil;
1126
+ do {
1127
+ couchbase::document_id doc_id;
1128
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
1129
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
1130
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
1131
+ std::string value(RSTRING_PTR(content), static_cast<size_t>(RSTRING_LEN(content)));
1132
+
1133
+ couchbase::operations::insert_request req{ doc_id, value };
1134
+ cb__extract_timeout(req, timeout);
1135
+ req.flags = FIX2UINT(flags);
1136
+
1137
+ if (!NIL_P(options)) {
1138
+ Check_Type(options, T_HASH);
1139
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
1140
+ if (!NIL_P(durability_level)) {
1141
+ Check_Type(durability_level, T_SYMBOL);
1142
+ ID level = rb_sym2id(durability_level);
1143
+ if (level == rb_intern("none")) {
1144
+ req.durability_level = couchbase::protocol::durability_level::none;
1145
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
1146
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
1147
+ } else if (level == rb_intern("persist_to_majority")) {
1148
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
1149
+ } else {
1150
+ rb_raise(rb_eArgError, "Unknown durability level");
1151
+ }
1152
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
1153
+ if (!NIL_P(durability_timeout)) {
1154
+ Check_Type(durability_timeout, T_FIXNUM);
1155
+ req.durability_timeout = FIX2UINT(durability_timeout);
1156
+ }
1157
+ }
1158
+ VALUE expiration = rb_hash_aref(options, rb_id2sym(rb_intern("expiration")));
1159
+ if (!NIL_P(expiration)) {
1160
+ Check_Type(expiration, T_FIXNUM);
1161
+ req.expiration = FIX2UINT(expiration);
1162
+ }
1163
+ }
1164
+
1165
+ auto barrier = std::make_shared<std::promise<couchbase::operations::insert_response>>();
1166
+ auto f = barrier->get_future();
1167
+ backend->cluster->execute(req, [barrier](couchbase::operations::insert_response resp) mutable { barrier->set_value(resp); });
1168
+ auto resp = f.get();
1169
+ if (resp.ec) {
1170
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to insert {}", doc_id));
1171
+ break;
1172
+ }
1173
+
1174
+ return cb__extract_mutation_result(resp);
1175
+ } while (false);
1176
+ rb_exc_raise(exc);
1177
+ return Qnil;
1178
+ }
1179
+
1180
+ static VALUE
1181
+ cb_Backend_document_remove(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE timeout, VALUE options)
1182
+ {
1183
+ cb_backend_data* backend = nullptr;
1184
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1185
+
1186
+ if (!backend->cluster) {
1187
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1188
+ }
1189
+
1190
+ Check_Type(bucket, T_STRING);
1191
+ Check_Type(collection, T_STRING);
1192
+ Check_Type(id, T_STRING);
1193
+
1194
+ VALUE exc = Qnil;
1195
+ do {
1196
+ couchbase::document_id doc_id;
1197
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
1198
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
1199
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
1200
+
1201
+ couchbase::operations::remove_request req{ doc_id };
1202
+ cb__extract_timeout(req, timeout);
1203
+ if (!NIL_P(options)) {
1204
+ Check_Type(options, T_HASH);
1205
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
1206
+ if (!NIL_P(durability_level)) {
1207
+ Check_Type(durability_level, T_SYMBOL);
1208
+ ID level = rb_sym2id(durability_level);
1209
+ if (level == rb_intern("none")) {
1210
+ req.durability_level = couchbase::protocol::durability_level::none;
1211
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
1212
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
1213
+ } else if (level == rb_intern("persist_to_majority")) {
1214
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
1215
+ } else {
1216
+ rb_raise(rb_eArgError, "Unknown durability level");
1217
+ }
1218
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
1219
+ if (!NIL_P(durability_timeout)) {
1220
+ Check_Type(durability_timeout, T_FIXNUM);
1221
+ req.durability_timeout = FIX2UINT(durability_timeout);
1222
+ }
1223
+ }
1224
+ }
1225
+
1226
+ auto barrier = std::make_shared<std::promise<couchbase::operations::remove_response>>();
1227
+ auto f = barrier->get_future();
1228
+ backend->cluster->execute(req, [barrier](couchbase::operations::remove_response resp) mutable { barrier->set_value(resp); });
1229
+ auto resp = f.get();
1230
+ if (resp.ec) {
1231
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to remove {}", doc_id));
1232
+ break;
1233
+ }
1234
+ return cb__extract_mutation_result(resp);
1235
+ } while (false);
1236
+ rb_exc_raise(exc);
1237
+ return Qnil;
1238
+ }
1239
+
1240
+ static VALUE
1241
+ cb_Backend_document_increment(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE timeout, VALUE options)
1242
+ {
1243
+ cb_backend_data* backend = nullptr;
1244
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1245
+
1246
+ if (!backend->cluster) {
1247
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1248
+ }
1249
+
1250
+ Check_Type(bucket, T_STRING);
1251
+ Check_Type(collection, T_STRING);
1252
+ Check_Type(id, T_STRING);
1253
+
1254
+ VALUE exc = Qnil;
1255
+ do {
1256
+ couchbase::document_id doc_id;
1257
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
1258
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
1259
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
1260
+
1261
+ couchbase::operations::increment_request req{ doc_id };
1262
+ cb__extract_timeout(req, timeout);
1263
+ if (!NIL_P(options)) {
1264
+ Check_Type(options, T_HASH);
1265
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
1266
+ if (!NIL_P(durability_level)) {
1267
+ Check_Type(durability_level, T_SYMBOL);
1268
+ ID level = rb_sym2id(durability_level);
1269
+ if (level == rb_intern("none")) {
1270
+ req.durability_level = couchbase::protocol::durability_level::none;
1271
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
1272
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
1273
+ } else if (level == rb_intern("persist_to_majority")) {
1274
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
1275
+ } else {
1276
+ rb_raise(rb_eArgError, "Unknown durability level");
1277
+ }
1278
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
1279
+ if (!NIL_P(durability_timeout)) {
1280
+ Check_Type(durability_timeout, T_FIXNUM);
1281
+ req.durability_timeout = FIX2UINT(durability_timeout);
1282
+ }
1283
+ }
1284
+ VALUE delta = rb_hash_aref(options, rb_id2sym(rb_intern("delta")));
1285
+ if (!NIL_P(delta)) {
1286
+ switch (TYPE(delta)) {
1287
+ case T_FIXNUM:
1288
+ case T_BIGNUM:
1289
+ req.delta = NUM2ULL(delta);
1290
+ break;
1291
+ default:
1292
+ rb_raise(rb_eArgError, "delta must be an Integer");
1293
+ }
1294
+ }
1295
+ VALUE initial_value = rb_hash_aref(options, rb_id2sym(rb_intern("initial_value")));
1296
+ if (!NIL_P(initial_value)) {
1297
+ switch (TYPE(initial_value)) {
1298
+ case T_FIXNUM:
1299
+ case T_BIGNUM:
1300
+ req.initial_value = NUM2ULL(initial_value);
1301
+ break;
1302
+ default:
1303
+ rb_raise(rb_eArgError, "initial_value must be an Integer");
1304
+ }
1305
+ }
1306
+ VALUE expiration = rb_hash_aref(options, rb_id2sym(rb_intern("expiration")));
1307
+ if (!NIL_P(expiration)) {
1308
+ Check_Type(expiration, T_FIXNUM);
1309
+ req.expiration = FIX2UINT(expiration);
1310
+ }
1311
+ }
1312
+
1313
+ auto barrier = std::make_shared<std::promise<couchbase::operations::increment_response>>();
1314
+ auto f = barrier->get_future();
1315
+ backend->cluster->execute(req, [barrier](couchbase::operations::increment_response resp) mutable { barrier->set_value(resp); });
1316
+ auto resp = f.get();
1317
+ if (resp.ec) {
1318
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to increment {} by {}", doc_id, req.delta));
1319
+ break;
1320
+ }
1321
+ VALUE res = cb__extract_mutation_result(resp);
1322
+ rb_hash_aset(res, rb_id2sym(rb_intern("content")), ULL2NUM(resp.content));
1323
+ return res;
1324
+ } while (false);
1325
+ rb_exc_raise(exc);
1326
+ return Qnil;
1327
+ }
1328
+
1329
+ static VALUE
1330
+ cb_Backend_document_decrement(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE timeout, VALUE options)
1331
+ {
1332
+ cb_backend_data* backend = nullptr;
1333
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1334
+
1335
+ if (!backend->cluster) {
1336
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1337
+ }
1338
+
1339
+ Check_Type(bucket, T_STRING);
1340
+ Check_Type(collection, T_STRING);
1341
+ Check_Type(id, T_STRING);
1342
+ Check_Type(options, T_HASH);
1343
+
1344
+ VALUE exc = Qnil;
1345
+ do {
1346
+ couchbase::document_id doc_id;
1347
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
1348
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
1349
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
1350
+
1351
+ couchbase::operations::decrement_request req{ doc_id };
1352
+ cb__extract_timeout(req, timeout);
1353
+ if (!NIL_P(options)) {
1354
+ Check_Type(options, T_HASH);
1355
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
1356
+ if (!NIL_P(durability_level)) {
1357
+ Check_Type(durability_level, T_SYMBOL);
1358
+ ID level = rb_sym2id(durability_level);
1359
+ if (level == rb_intern("none")) {
1360
+ req.durability_level = couchbase::protocol::durability_level::none;
1361
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
1362
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
1363
+ } else if (level == rb_intern("persist_to_majority")) {
1364
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
1365
+ } else {
1366
+ rb_raise(rb_eArgError, "Unknown durability level");
1367
+ }
1368
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
1369
+ if (!NIL_P(durability_timeout)) {
1370
+ Check_Type(durability_timeout, T_FIXNUM);
1371
+ req.durability_timeout = FIX2UINT(durability_timeout);
1372
+ }
1373
+ }
1374
+ VALUE delta = rb_hash_aref(options, rb_id2sym(rb_intern("delta")));
1375
+ if (!NIL_P(delta)) {
1376
+ switch (TYPE(delta)) {
1377
+ case T_FIXNUM:
1378
+ case T_BIGNUM:
1379
+ req.delta = NUM2ULL(delta);
1380
+ break;
1381
+ default:
1382
+ rb_raise(rb_eArgError, "delta must be an Integer");
1383
+ }
1384
+ }
1385
+ VALUE initial_value = rb_hash_aref(options, rb_id2sym(rb_intern("initial_value")));
1386
+ if (!NIL_P(initial_value)) {
1387
+ switch (TYPE(initial_value)) {
1388
+ case T_FIXNUM:
1389
+ case T_BIGNUM:
1390
+ req.initial_value = NUM2ULL(initial_value);
1391
+ break;
1392
+ default:
1393
+ rb_raise(rb_eArgError, "initial_value must be an Integer");
1394
+ }
1395
+ }
1396
+ VALUE expiration = rb_hash_aref(options, rb_id2sym(rb_intern("expiration")));
1397
+ if (!NIL_P(expiration)) {
1398
+ Check_Type(expiration, T_FIXNUM);
1399
+ req.expiration = FIX2UINT(expiration);
1400
+ }
1401
+ }
1402
+
1403
+ auto barrier = std::make_shared<std::promise<couchbase::operations::decrement_response>>();
1404
+ auto f = barrier->get_future();
1405
+ backend->cluster->execute(req, [barrier](couchbase::operations::decrement_response resp) mutable { barrier->set_value(resp); });
1406
+ auto resp = f.get();
1407
+ if (resp.ec) {
1408
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to decrement {} by {}", doc_id, req.delta));
1409
+ break;
1410
+ }
1411
+ VALUE res = cb__extract_mutation_result(resp);
1412
+ rb_hash_aset(res, rb_id2sym(rb_intern("content")), ULL2NUM(resp.content));
1413
+ return res;
1414
+ } while (false);
1415
+ rb_exc_raise(exc);
1416
+ return Qnil;
1417
+ }
1418
+
1419
+ static VALUE
1420
+ cb__map_subdoc_opcode(couchbase::protocol::subdoc_opcode opcode)
1421
+ {
1422
+ switch (opcode) {
1423
+ case couchbase::protocol::subdoc_opcode::get:
1424
+ return rb_id2sym(rb_intern("get"));
1425
+
1426
+ case couchbase::protocol::subdoc_opcode::exists:
1427
+ return rb_id2sym(rb_intern("exists"));
1428
+
1429
+ case couchbase::protocol::subdoc_opcode::dict_add:
1430
+ return rb_id2sym(rb_intern("dict_add"));
1431
+
1432
+ case couchbase::protocol::subdoc_opcode::dict_upsert:
1433
+ return rb_id2sym(rb_intern("dict_upsert"));
1434
+
1435
+ case couchbase::protocol::subdoc_opcode::remove:
1436
+ return rb_id2sym(rb_intern("remove"));
1437
+
1438
+ case couchbase::protocol::subdoc_opcode::replace:
1439
+ return rb_id2sym(rb_intern("replace"));
1440
+
1441
+ case couchbase::protocol::subdoc_opcode::array_push_last:
1442
+ return rb_id2sym(rb_intern("array_push_last"));
1443
+
1444
+ case couchbase::protocol::subdoc_opcode::array_push_first:
1445
+ return rb_id2sym(rb_intern("array_push_first"));
1446
+
1447
+ case couchbase::protocol::subdoc_opcode::array_insert:
1448
+ return rb_id2sym(rb_intern("array_insert"));
1449
+
1450
+ case couchbase::protocol::subdoc_opcode::array_add_unique:
1451
+ return rb_id2sym(rb_intern("array_add_unique"));
1452
+
1453
+ case couchbase::protocol::subdoc_opcode::counter:
1454
+ return rb_id2sym(rb_intern("counter"));
1455
+
1456
+ case couchbase::protocol::subdoc_opcode::get_count:
1457
+ return rb_id2sym(rb_intern("count"));
1458
+
1459
+ case couchbase::protocol::subdoc_opcode::get_doc:
1460
+ return rb_id2sym(rb_intern("get_doc"));
1461
+ }
1462
+ return rb_id2sym(rb_intern("unknown"));
1463
+ }
1464
+
1465
+ static VALUE
1466
+ cb__map_subdoc_status(couchbase::protocol::status status)
1467
+ {
1468
+ switch (status) {
1469
+ case couchbase::protocol::status::success:
1470
+ return rb_id2sym(rb_intern("success"));
1471
+
1472
+ case couchbase::protocol::status::subdoc_path_mismatch:
1473
+ return rb_id2sym(rb_intern("path_mismatch"));
1474
+
1475
+ case couchbase::protocol::status::subdoc_path_invalid:
1476
+ return rb_id2sym(rb_intern("path_invalid"));
1477
+
1478
+ case couchbase::protocol::status::subdoc_path_too_big:
1479
+ return rb_id2sym(rb_intern("path_too_big"));
1480
+
1481
+ case couchbase::protocol::status::subdoc_value_cannot_insert:
1482
+ return rb_id2sym(rb_intern("value_cannot_insert"));
1483
+
1484
+ case couchbase::protocol::status::subdoc_doc_not_json:
1485
+ return rb_id2sym(rb_intern("doc_not_json"));
1486
+
1487
+ case couchbase::protocol::status::subdoc_num_range_error:
1488
+ return rb_id2sym(rb_intern("num_range"));
1489
+
1490
+ case couchbase::protocol::status::subdoc_delta_invalid:
1491
+ return rb_id2sym(rb_intern("delta_invalid"));
1492
+
1493
+ case couchbase::protocol::status::subdoc_path_exists:
1494
+ return rb_id2sym(rb_intern("path_exists"));
1495
+
1496
+ case couchbase::protocol::status::subdoc_value_too_deep:
1497
+ return rb_id2sym(rb_intern("value_too_deep"));
1498
+
1499
+ case couchbase::protocol::status::subdoc_invalid_combo:
1500
+ return rb_id2sym(rb_intern("invalid_combo"));
1501
+
1502
+ case couchbase::protocol::status::subdoc_xattr_invalid_flag_combo:
1503
+ return rb_id2sym(rb_intern("xattr_invalid_flag_combo"));
1504
+
1505
+ case couchbase::protocol::status::subdoc_xattr_invalid_key_combo:
1506
+ return rb_id2sym(rb_intern("xattr_invalid_key_combo"));
1507
+
1508
+ case couchbase::protocol::status::subdoc_xattr_unknown_macro:
1509
+ return rb_id2sym(rb_intern("xattr_unknown_macro"));
1510
+
1511
+ case couchbase::protocol::status::subdoc_xattr_unknown_vattr:
1512
+ return rb_id2sym(rb_intern("xattr_unknown_vattr"));
1513
+
1514
+ case couchbase::protocol::status::subdoc_xattr_cannot_modify_vattr:
1515
+ return rb_id2sym(rb_intern("xattr_cannot_modify_vattr"));
1516
+
1517
+ default:
1518
+ return rb_id2sym(rb_intern("unknown"));
1519
+ }
1520
+ }
1521
+
1522
+ static VALUE
1523
+ cb_Backend_document_lookup_in(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE timeout, VALUE access_deleted, VALUE specs)
1524
+ {
1525
+ cb_backend_data* backend = nullptr;
1526
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1527
+
1528
+ if (!backend->cluster) {
1529
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1530
+ }
1531
+
1532
+ Check_Type(bucket, T_STRING);
1533
+ Check_Type(collection, T_STRING);
1534
+ Check_Type(id, T_STRING);
1535
+ Check_Type(specs, T_ARRAY);
1536
+ if (RARRAY_LEN(specs) <= 0) {
1537
+ rb_raise(rb_eArgError, "Array with specs cannot be empty");
1538
+ }
1539
+
1540
+ VALUE exc = Qnil;
1541
+ do {
1542
+ couchbase::document_id doc_id;
1543
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
1544
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
1545
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
1546
+
1547
+ couchbase::operations::lookup_in_request req{ doc_id };
1548
+ cb__extract_timeout(req, timeout);
1549
+ req.access_deleted = RTEST(access_deleted);
1550
+ auto entries_size = static_cast<size_t>(RARRAY_LEN(specs));
1551
+ req.specs.entries.reserve(entries_size);
1552
+ for (size_t i = 0; i < entries_size; ++i) {
1553
+ VALUE entry = rb_ary_entry(specs, static_cast<long>(i));
1554
+ Check_Type(entry, T_HASH);
1555
+ VALUE operation = rb_hash_aref(entry, rb_id2sym(rb_intern("opcode")));
1556
+ Check_Type(operation, T_SYMBOL);
1557
+ ID operation_id = rb_sym2id(operation);
1558
+ couchbase::protocol::subdoc_opcode opcode;
1559
+ if (operation_id == rb_intern("get_doc")) {
1560
+ opcode = couchbase::protocol::subdoc_opcode::get_doc;
1561
+ } else if (operation_id == rb_intern("get")) {
1562
+ opcode = couchbase::protocol::subdoc_opcode::get;
1563
+ } else if (operation_id == rb_intern("exists")) {
1564
+ opcode = couchbase::protocol::subdoc_opcode::exists;
1565
+ } else if (operation_id == rb_intern("count")) {
1566
+ opcode = couchbase::protocol::subdoc_opcode::get_count;
1567
+ } else {
1568
+ rb_raise(rb_eArgError, "Unsupported operation for subdocument lookup");
1569
+ }
1570
+ bool xattr = RTEST(rb_hash_aref(entry, rb_id2sym(rb_intern("xattr"))));
1571
+ VALUE path = rb_hash_aref(entry, rb_id2sym(rb_intern("path")));
1572
+ Check_Type(path, T_STRING);
1573
+ req.specs.add_spec(opcode, xattr, std::string(RSTRING_PTR(path), static_cast<size_t>(RSTRING_LEN(path))));
1574
+ }
1575
+
1576
+ auto barrier = std::make_shared<std::promise<couchbase::operations::lookup_in_response>>();
1577
+ auto f = barrier->get_future();
1578
+ backend->cluster->execute(req, [barrier](couchbase::operations::lookup_in_response resp) mutable { barrier->set_value(resp); });
1579
+ auto resp = f.get();
1580
+ if (resp.ec) {
1581
+ exc = cb__map_error_code(resp.ec, fmt::format("unable fetch {}", doc_id));
1582
+ break;
1583
+ }
1584
+
1585
+ VALUE res = rb_hash_new();
1586
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
1587
+ VALUE fields = rb_ary_new_capa(static_cast<long>(resp.fields.size()));
1588
+ rb_hash_aset(res, rb_id2sym(rb_intern("fields")), fields);
1589
+ for (size_t i = 0; i < resp.fields.size(); ++i) {
1590
+ VALUE entry = rb_hash_new();
1591
+ rb_hash_aset(entry, rb_id2sym(rb_intern("exists")), resp.fields[i].exists ? Qtrue : Qfalse);
1592
+ rb_hash_aset(
1593
+ entry, rb_id2sym(rb_intern("path")), rb_str_new(resp.fields[i].path.data(), static_cast<long>(resp.fields[i].path.size())));
1594
+ rb_hash_aset(entry,
1595
+ rb_id2sym(rb_intern("value")),
1596
+ rb_str_new(resp.fields[i].value.data(), static_cast<long>(resp.fields[i].value.size())));
1597
+ rb_hash_aset(entry, rb_id2sym(rb_intern("status")), cb__map_subdoc_status(resp.fields[i].status));
1598
+ if (resp.fields[i].opcode == couchbase::protocol::subdoc_opcode::get && resp.fields[i].path.empty()) {
1599
+ rb_hash_aset(entry, rb_id2sym(rb_intern("type")), rb_id2sym(rb_intern("get_doc")));
1600
+ } else {
1601
+ rb_hash_aset(entry, rb_id2sym(rb_intern("type")), cb__map_subdoc_opcode(resp.fields[i].opcode));
1602
+ }
1603
+ rb_ary_store(fields, static_cast<long>(i), entry);
1604
+ }
1605
+ return res;
1606
+ } while (false);
1607
+ rb_exc_raise(exc);
1608
+ return Qnil;
1609
+ }
1610
+
1611
+ static VALUE
1612
+ cb_Backend_document_mutate_in(VALUE self,
1613
+ VALUE bucket,
1614
+ VALUE collection,
1615
+ VALUE id,
1616
+ VALUE timeout,
1617
+ VALUE access_deleted,
1618
+ VALUE specs,
1619
+ VALUE options)
1620
+ {
1621
+ cb_backend_data* backend = nullptr;
1622
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1623
+
1624
+ if (!backend->cluster) {
1625
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1626
+ }
1627
+
1628
+ Check_Type(bucket, T_STRING);
1629
+ Check_Type(collection, T_STRING);
1630
+ Check_Type(id, T_STRING);
1631
+ Check_Type(specs, T_ARRAY);
1632
+ if (RARRAY_LEN(specs) <= 0) {
1633
+ rb_raise(rb_eArgError, "Array with specs cannot be empty");
1634
+ }
1635
+
1636
+ VALUE exc = Qnil;
1637
+ do {
1638
+ couchbase::document_id doc_id;
1639
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
1640
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
1641
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
1642
+
1643
+ couchbase::operations::mutate_in_request req{ doc_id };
1644
+ cb__extract_timeout(req, timeout);
1645
+ if (!NIL_P(options)) {
1646
+ Check_Type(options, T_HASH);
1647
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
1648
+ if (!NIL_P(durability_level)) {
1649
+ Check_Type(durability_level, T_SYMBOL);
1650
+ ID level = rb_sym2id(durability_level);
1651
+ if (level == rb_intern("none")) {
1652
+ req.durability_level = couchbase::protocol::durability_level::none;
1653
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
1654
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
1655
+ } else if (level == rb_intern("persist_to_majority")) {
1656
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
1657
+ } else {
1658
+ rb_raise(rb_eArgError, "Unknown durability level");
1659
+ }
1660
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
1661
+ if (!NIL_P(durability_timeout)) {
1662
+ Check_Type(durability_timeout, T_FIXNUM);
1663
+ req.durability_timeout = FIX2UINT(durability_timeout);
1664
+ }
1665
+ }
1666
+ }
1667
+ req.access_deleted = RTEST(access_deleted);
1668
+ auto entries_size = static_cast<size_t>(RARRAY_LEN(specs));
1669
+ req.specs.entries.reserve(entries_size);
1670
+ for (size_t i = 0; i < entries_size; ++i) {
1671
+ VALUE entry = rb_ary_entry(specs, static_cast<long>(i));
1672
+ Check_Type(entry, T_HASH);
1673
+ VALUE operation = rb_hash_aref(entry, rb_id2sym(rb_intern("opcode")));
1674
+ Check_Type(operation, T_SYMBOL);
1675
+ ID operation_id = rb_sym2id(operation);
1676
+ couchbase::protocol::subdoc_opcode opcode;
1677
+ if (operation_id == rb_intern("dict_add")) {
1678
+ opcode = couchbase::protocol::subdoc_opcode::dict_add;
1679
+ } else if (operation_id == rb_intern("dict_upsert")) {
1680
+ opcode = couchbase::protocol::subdoc_opcode::dict_upsert;
1681
+ } else if (operation_id == rb_intern("remove")) {
1682
+ opcode = couchbase::protocol::subdoc_opcode::remove;
1683
+ } else if (operation_id == rb_intern("replace")) {
1684
+ opcode = couchbase::protocol::subdoc_opcode::replace;
1685
+ } else if (operation_id == rb_intern("array_push_last")) {
1686
+ opcode = couchbase::protocol::subdoc_opcode::array_push_last;
1687
+ } else if (operation_id == rb_intern("array_push_first")) {
1688
+ opcode = couchbase::protocol::subdoc_opcode::array_push_first;
1689
+ } else if (operation_id == rb_intern("array_insert")) {
1690
+ opcode = couchbase::protocol::subdoc_opcode::array_insert;
1691
+ } else if (operation_id == rb_intern("array_add_unique")) {
1692
+ opcode = couchbase::protocol::subdoc_opcode::array_add_unique;
1693
+ } else if (operation_id == rb_intern("counter")) {
1694
+ opcode = couchbase::protocol::subdoc_opcode::counter;
1695
+ } else {
1696
+ rb_raise(rb_eArgError, "Unsupported operation for subdocument mutation: %+" PRIsVALUE, operation);
1697
+ }
1698
+ bool xattr = RTEST(rb_hash_aref(entry, rb_id2sym(rb_intern("xattr"))));
1699
+ bool create_parents = RTEST(rb_hash_aref(entry, rb_id2sym(rb_intern("create_parents"))));
1700
+ bool expand_macros = RTEST(rb_hash_aref(entry, rb_id2sym(rb_intern("expand_macros"))));
1701
+ VALUE path = rb_hash_aref(entry, rb_id2sym(rb_intern("path")));
1702
+ Check_Type(path, T_STRING);
1703
+ VALUE param = rb_hash_aref(entry, rb_id2sym(rb_intern("param")));
1704
+ if (NIL_P(param)) {
1705
+ req.specs.add_spec(opcode, xattr, std::string(RSTRING_PTR(path), static_cast<size_t>(RSTRING_LEN(path))));
1706
+ } else if (opcode == couchbase::protocol::subdoc_opcode::counter) {
1707
+ Check_Type(param, T_FIXNUM);
1708
+ req.specs.add_spec(opcode,
1709
+ xattr,
1710
+ create_parents,
1711
+ expand_macros,
1712
+ std::string(RSTRING_PTR(path), static_cast<size_t>(RSTRING_LEN(path))),
1713
+ FIX2LONG(param));
1714
+ } else {
1715
+ Check_Type(param, T_STRING);
1716
+ req.specs.add_spec(opcode,
1717
+ xattr,
1718
+ create_parents,
1719
+ expand_macros,
1720
+ std::string(RSTRING_PTR(path), static_cast<size_t>(RSTRING_LEN(path))),
1721
+ std::string(RSTRING_PTR(param), static_cast<size_t>(RSTRING_LEN(param))));
1722
+ }
1723
+ }
1724
+
1725
+ auto barrier = std::make_shared<std::promise<couchbase::operations::mutate_in_response>>();
1726
+ auto f = barrier->get_future();
1727
+ backend->cluster->execute(req, [barrier](couchbase::operations::mutate_in_response resp) mutable { barrier->set_value(resp); });
1728
+ auto resp = f.get();
1729
+ if (resp.ec) {
1730
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to mutate {}", doc_id));
1731
+ break;
1732
+ }
1733
+
1734
+ VALUE res = cb__extract_mutation_result(resp);
1735
+ if (resp.first_error_index) {
1736
+ rb_hash_aset(res, rb_id2sym(rb_intern("first_error_index")), ULONG2NUM(resp.first_error_index.value()));
1737
+ }
1738
+ VALUE fields = rb_ary_new_capa(static_cast<long>(resp.fields.size()));
1739
+ rb_hash_aset(res, rb_id2sym(rb_intern("fields")), fields);
1740
+ for (size_t i = 0; i < resp.fields.size(); ++i) {
1741
+ VALUE entry = rb_hash_new();
1742
+ rb_hash_aset(
1743
+ entry, rb_id2sym(rb_intern("path")), rb_str_new(resp.fields[i].path.data(), static_cast<long>(resp.fields[i].path.size())));
1744
+ if (resp.fields[i].opcode == couchbase::protocol::subdoc_opcode::counter) {
1745
+ rb_hash_aset(entry, rb_id2sym(rb_intern("value")), LONG2NUM(std::stoll(resp.fields[i].value)));
1746
+ } else {
1747
+ rb_hash_aset(entry,
1748
+ rb_id2sym(rb_intern("value")),
1749
+ rb_str_new(resp.fields[i].value.data(), static_cast<long>(resp.fields[i].value.size())));
1750
+ }
1751
+ rb_hash_aset(entry, rb_id2sym(rb_intern("status")), cb__map_subdoc_status(resp.fields[i].status));
1752
+ rb_hash_aset(entry, rb_id2sym(rb_intern("type")), cb__map_subdoc_opcode(resp.fields[i].opcode));
1753
+ rb_ary_store(fields, static_cast<long>(i), entry);
1754
+ }
1755
+ return res;
1756
+ } while (false);
1757
+ rb_exc_raise(exc);
1758
+ return Qnil;
1759
+ }
1760
+
1761
+ static int
1762
+ cb__for_each_named_param(VALUE key, VALUE value, VALUE arg)
1763
+ {
1764
+ auto* preq = reinterpret_cast<couchbase::operations::query_request*>(arg);
1765
+ Check_Type(key, T_STRING);
1766
+ Check_Type(value, T_STRING);
1767
+ preq->named_parameters.emplace(
1768
+ std::string_view(RSTRING_PTR(key), static_cast<std::size_t>(RSTRING_LEN(key))),
1769
+ tao::json::from_string(std::string_view(RSTRING_PTR(value), static_cast<std::size_t>(RSTRING_LEN(value)))));
1770
+ return ST_CONTINUE;
1771
+ }
1772
+
1773
+ static VALUE
1774
+ cb_Backend_document_query(VALUE self, VALUE statement, VALUE options)
1775
+ {
1776
+ cb_backend_data* backend = nullptr;
1777
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1778
+
1779
+ if (!backend->cluster) {
1780
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1781
+ }
1782
+
1783
+ Check_Type(statement, T_STRING);
1784
+ Check_Type(options, T_HASH);
1785
+
1786
+ VALUE exc = Qnil;
1787
+ do {
1788
+ couchbase::operations::query_request req;
1789
+ req.statement.assign(RSTRING_PTR(statement), static_cast<size_t>(RSTRING_LEN(statement)));
1790
+ VALUE client_context_id = rb_hash_aref(options, rb_id2sym(rb_intern("client_context_id")));
1791
+ if (!NIL_P(client_context_id)) {
1792
+ Check_Type(client_context_id, T_STRING);
1793
+ req.client_context_id.assign(RSTRING_PTR(client_context_id), static_cast<size_t>(RSTRING_LEN(client_context_id)));
1794
+ }
1795
+ cb__extract_timeout(req, rb_hash_aref(options, rb_id2sym(rb_intern("timeout"))));
1796
+ VALUE adhoc = rb_hash_aref(options, rb_id2sym(rb_intern("adhoc")));
1797
+ if (!NIL_P(adhoc)) {
1798
+ req.adhoc = RTEST(adhoc);
1799
+ }
1800
+ VALUE metrics = rb_hash_aref(options, rb_id2sym(rb_intern("metrics")));
1801
+ if (!NIL_P(metrics)) {
1802
+ req.metrics = RTEST(metrics);
1803
+ }
1804
+ VALUE readonly = rb_hash_aref(options, rb_id2sym(rb_intern("readonly")));
1805
+ if (!NIL_P(readonly)) {
1806
+ req.readonly = RTEST(readonly);
1807
+ }
1808
+ VALUE scan_cap = rb_hash_aref(options, rb_id2sym(rb_intern("scan_cap")));
1809
+ if (!NIL_P(scan_cap)) {
1810
+ req.scan_cap = NUM2ULONG(scan_cap);
1811
+ }
1812
+ VALUE scan_wait = rb_hash_aref(options, rb_id2sym(rb_intern("scan_wait")));
1813
+ if (!NIL_P(scan_wait)) {
1814
+ req.scan_wait = NUM2ULONG(scan_wait);
1815
+ }
1816
+ VALUE max_parallelism = rb_hash_aref(options, rb_id2sym(rb_intern("max_parallelism")));
1817
+ if (!NIL_P(max_parallelism)) {
1818
+ req.max_parallelism = NUM2ULONG(max_parallelism);
1819
+ }
1820
+ VALUE pipeline_cap = rb_hash_aref(options, rb_id2sym(rb_intern("pipeline_cap")));
1821
+ if (!NIL_P(pipeline_cap)) {
1822
+ req.pipeline_cap = NUM2ULONG(pipeline_cap);
1823
+ }
1824
+ VALUE pipeline_batch = rb_hash_aref(options, rb_id2sym(rb_intern("pipeline_batch")));
1825
+ if (!NIL_P(pipeline_batch)) {
1826
+ req.pipeline_batch = NUM2ULONG(pipeline_batch);
1827
+ }
1828
+ VALUE profile = rb_hash_aref(options, rb_id2sym(rb_intern("profile")));
1829
+ if (!NIL_P(profile)) {
1830
+ Check_Type(profile, T_SYMBOL);
1831
+ ID mode = rb_sym2id(profile);
1832
+ if (mode == rb_intern("phases")) {
1833
+ req.profile = couchbase::operations::query_request::profile_mode::phases;
1834
+ } else if (mode == rb_intern("timings")) {
1835
+ req.profile = couchbase::operations::query_request::profile_mode::timings;
1836
+ } else if (mode == rb_intern("off")) {
1837
+ req.profile = couchbase::operations::query_request::profile_mode::off;
1838
+ }
1839
+ }
1840
+ VALUE positional_params = rb_hash_aref(options, rb_id2sym(rb_intern("positional_parameters")));
1841
+ if (!NIL_P(positional_params)) {
1842
+ Check_Type(positional_params, T_ARRAY);
1843
+ auto entries_num = static_cast<size_t>(RARRAY_LEN(positional_params));
1844
+ req.positional_parameters.reserve(entries_num);
1845
+ for (size_t i = 0; i < entries_num; ++i) {
1846
+ VALUE entry = rb_ary_entry(positional_params, static_cast<long>(i));
1847
+ Check_Type(entry, T_STRING);
1848
+ req.positional_parameters.emplace_back(
1849
+ tao::json::from_string(std::string_view(RSTRING_PTR(entry), static_cast<std::size_t>(RSTRING_LEN(entry)))));
1850
+ }
1851
+ }
1852
+ VALUE named_params = rb_hash_aref(options, rb_id2sym(rb_intern("named_parameters")));
1853
+ if (!NIL_P(named_params)) {
1854
+ Check_Type(named_params, T_HASH);
1855
+ rb_hash_foreach(named_params, INT_FUNC(cb__for_each_named_param), reinterpret_cast<VALUE>(&req));
1856
+ }
1857
+ VALUE scan_consistency = rb_hash_aref(options, rb_id2sym(rb_intern("scan_consistency")));
1858
+ if (!NIL_P(scan_consistency)) {
1859
+ Check_Type(scan_consistency, T_SYMBOL);
1860
+ ID type = rb_sym2id(scan_consistency);
1861
+ if (type == rb_intern("not_bounded")) {
1862
+ req.scan_consistency = couchbase::operations::query_request::scan_consistency_type::not_bounded;
1863
+ } else if (type == rb_intern("request_plus")) {
1864
+ req.scan_consistency = couchbase::operations::query_request::scan_consistency_type::request_plus;
1865
+ }
1866
+ }
1867
+ VALUE mutation_state = rb_hash_aref(options, rb_id2sym(rb_intern("mutation_state")));
1868
+ if (!NIL_P(mutation_state)) {
1869
+ Check_Type(mutation_state, T_ARRAY);
1870
+ auto state_size = static_cast<size_t>(RARRAY_LEN(mutation_state));
1871
+ req.mutation_state.reserve(state_size);
1872
+ for (size_t i = 0; i < state_size; ++i) {
1873
+ VALUE token = rb_ary_entry(mutation_state, static_cast<long>(i));
1874
+ Check_Type(token, T_HASH);
1875
+ VALUE bucket_name = rb_hash_aref(token, rb_id2sym(rb_intern("bucket_name")));
1876
+ Check_Type(bucket_name, T_STRING);
1877
+ VALUE partition_id = rb_hash_aref(token, rb_id2sym(rb_intern("partition_id")));
1878
+ Check_Type(partition_id, T_FIXNUM);
1879
+ VALUE partition_uuid = rb_hash_aref(token, rb_id2sym(rb_intern("partition_uuid")));
1880
+ switch (TYPE(partition_uuid)) {
1881
+ case T_FIXNUM:
1882
+ case T_BIGNUM:
1883
+ break;
1884
+ default:
1885
+ rb_raise(rb_eArgError, "partition_uuid must be an Integer");
1886
+ }
1887
+ VALUE sequence_number = rb_hash_aref(token, rb_id2sym(rb_intern("sequence_number")));
1888
+ switch (TYPE(sequence_number)) {
1889
+ case T_FIXNUM:
1890
+ case T_BIGNUM:
1891
+ break;
1892
+ default:
1893
+ rb_raise(rb_eArgError, "sequence_number must be an Integer");
1894
+ }
1895
+ req.mutation_state.emplace_back(
1896
+ couchbase::mutation_token{ NUM2ULL(partition_uuid),
1897
+ NUM2ULL(sequence_number),
1898
+ gsl::narrow_cast<std::uint16_t>(NUM2UINT(partition_id)),
1899
+ std::string(RSTRING_PTR(bucket_name), static_cast<std::size_t>(RSTRING_LEN(bucket_name))) });
1900
+ }
1901
+ }
1902
+
1903
+ VALUE raw_params = rb_hash_aref(options, rb_id2sym(rb_intern("raw_parameters")));
1904
+ if (!NIL_P(raw_params)) {
1905
+ Check_Type(raw_params, T_HASH);
1906
+ rb_hash_foreach(raw_params, INT_FUNC(cb__for_each_named_param), reinterpret_cast<VALUE>(&req));
1907
+ }
1908
+
1909
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_response>>();
1910
+ auto f = barrier->get_future();
1911
+ backend->cluster->execute_http(req, [barrier](couchbase::operations::query_response resp) mutable { barrier->set_value(resp); });
1912
+ auto resp = f.get();
1913
+ if (resp.ec) {
1914
+ if (resp.payload.meta_data.errors && !resp.payload.meta_data.errors->empty()) {
1915
+ const auto& first_error = resp.payload.meta_data.errors->front();
1916
+ exc = cb__map_error_code(resp.ec,
1917
+ fmt::format("unable to query: \"{}{}\" ({}: {})",
1918
+ req.statement.substr(0, 50),
1919
+ req.statement.size() > 50 ? "..." : "",
1920
+ first_error.code,
1921
+ first_error.message));
1922
+ } else {
1923
+ exc = cb__map_error_code(
1924
+ resp.ec, fmt::format("unable to query: \"{}{}\"", req.statement.substr(0, 50), req.statement.size() > 50 ? "..." : ""));
1925
+ }
1926
+ break;
1927
+ }
1928
+ VALUE res = rb_hash_new();
1929
+ VALUE rows = rb_ary_new_capa(static_cast<long>(resp.payload.rows.size()));
1930
+ rb_hash_aset(res, rb_id2sym(rb_intern("rows")), rows);
1931
+ for (auto& row : resp.payload.rows) {
1932
+ rb_ary_push(rows, rb_str_new(row.data(), static_cast<long>(row.size())));
1933
+ }
1934
+ VALUE meta = rb_hash_new();
1935
+ rb_hash_aset(res, rb_id2sym(rb_intern("meta")), meta);
1936
+ rb_hash_aset(meta,
1937
+ rb_id2sym(rb_intern("status")),
1938
+ rb_id2sym(rb_intern2(resp.payload.meta_data.status.data(), static_cast<long>(resp.payload.meta_data.status.size()))));
1939
+ rb_hash_aset(meta,
1940
+ rb_id2sym(rb_intern("request_id")),
1941
+ rb_str_new(resp.payload.meta_data.request_id.data(), static_cast<long>(resp.payload.meta_data.request_id.size())));
1942
+ rb_hash_aset(
1943
+ meta,
1944
+ rb_id2sym(rb_intern("client_context_id")),
1945
+ rb_str_new(resp.payload.meta_data.client_context_id.data(), static_cast<long>(resp.payload.meta_data.client_context_id.size())));
1946
+ if (resp.payload.meta_data.signature) {
1947
+ rb_hash_aset(meta,
1948
+ rb_id2sym(rb_intern("signature")),
1949
+ rb_str_new(resp.payload.meta_data.signature->data(), static_cast<long>(resp.payload.meta_data.signature->size())));
1950
+ }
1951
+ if (resp.payload.meta_data.profile) {
1952
+ rb_hash_aset(meta,
1953
+ rb_id2sym(rb_intern("profile")),
1954
+ rb_str_new(resp.payload.meta_data.profile->data(), static_cast<long>(resp.payload.meta_data.profile->size())));
1955
+ }
1956
+ metrics = rb_hash_new();
1957
+ rb_hash_aset(meta, rb_id2sym(rb_intern("metrics")), metrics);
1958
+ rb_hash_aset(metrics,
1959
+ rb_id2sym(rb_intern("elapsed_time")),
1960
+ rb_str_new(resp.payload.meta_data.metrics.elapsed_time.data(),
1961
+ static_cast<long>(resp.payload.meta_data.metrics.elapsed_time.size())));
1962
+ rb_hash_aset(metrics,
1963
+ rb_id2sym(rb_intern("execution_time")),
1964
+ rb_str_new(resp.payload.meta_data.metrics.execution_time.data(),
1965
+ static_cast<long>(resp.payload.meta_data.metrics.execution_time.size())));
1966
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("result_count")), ULL2NUM(resp.payload.meta_data.metrics.result_count));
1967
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("result_size")), ULL2NUM(resp.payload.meta_data.metrics.result_count));
1968
+ if (resp.payload.meta_data.metrics.sort_count) {
1969
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("sort_count")), ULL2NUM(*resp.payload.meta_data.metrics.sort_count));
1970
+ }
1971
+ if (resp.payload.meta_data.metrics.mutation_count) {
1972
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("mutation_count")), ULL2NUM(*resp.payload.meta_data.metrics.mutation_count));
1973
+ }
1974
+ if (resp.payload.meta_data.metrics.error_count) {
1975
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("error_count")), ULL2NUM(*resp.payload.meta_data.metrics.error_count));
1976
+ }
1977
+ if (resp.payload.meta_data.metrics.warning_count) {
1978
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("warning_count")), ULL2NUM(*resp.payload.meta_data.metrics.warning_count));
1979
+ }
1980
+
1981
+ return res;
1982
+ } while (false);
1983
+ rb_exc_raise(exc);
1984
+ return Qnil;
1985
+ }
1986
+
1987
+ static void
1988
+ cb__generate_bucket_settings(VALUE bucket, couchbase::operations::bucket_settings& entry, bool is_create)
1989
+ {
1990
+ {
1991
+ VALUE bucket_type = rb_hash_aref(bucket, rb_id2sym(rb_intern("bucket_type")));
1992
+ Check_Type(bucket_type, T_SYMBOL);
1993
+ if (bucket_type == rb_id2sym(rb_intern("couchbase")) || bucket_type == rb_id2sym(rb_intern("membase"))) {
1994
+ entry.bucket_type = couchbase::operations::bucket_settings::bucket_type::couchbase;
1995
+ } else if (bucket_type == rb_id2sym(rb_intern("memcached"))) {
1996
+ entry.bucket_type = couchbase::operations::bucket_settings::bucket_type::memcached;
1997
+ } else if (bucket_type == rb_id2sym(rb_intern("ephemeral"))) {
1998
+ entry.bucket_type = couchbase::operations::bucket_settings::bucket_type::ephemeral;
1999
+ } else {
2000
+ rb_raise(rb_eArgError, "unknown bucket type");
2001
+ }
2002
+ }
2003
+ {
2004
+ VALUE name = rb_hash_aref(bucket, rb_id2sym(rb_intern("name")));
2005
+ Check_Type(name, T_STRING);
2006
+ entry.name.assign(RSTRING_PTR(name), static_cast<size_t>(RSTRING_LEN(name)));
2007
+ }
2008
+ {
2009
+ VALUE quota = rb_hash_aref(bucket, rb_id2sym(rb_intern("ram_quota_mb")));
2010
+ Check_Type(quota, T_FIXNUM);
2011
+ entry.ram_quota_mb = FIX2ULONG(quota);
2012
+ }
2013
+ {
2014
+ VALUE expiry = rb_hash_aref(bucket, rb_id2sym(rb_intern("max_expiry")));
2015
+ if (!NIL_P(expiry)) {
2016
+ Check_Type(expiry, T_FIXNUM);
2017
+ entry.max_expiry = FIX2UINT(expiry);
2018
+ }
2019
+ }
2020
+ {
2021
+ VALUE num_replicas = rb_hash_aref(bucket, rb_id2sym(rb_intern("num_replicas")));
2022
+ if (!NIL_P(num_replicas)) {
2023
+ Check_Type(num_replicas, T_FIXNUM);
2024
+ entry.num_replicas = FIX2UINT(num_replicas);
2025
+ }
2026
+ }
2027
+ {
2028
+ VALUE replica_indexes = rb_hash_aref(bucket, rb_id2sym(rb_intern("replica_indexes")));
2029
+ if (!NIL_P(replica_indexes)) {
2030
+ entry.replica_indexes = RTEST(replica_indexes);
2031
+ }
2032
+ }
2033
+ {
2034
+ VALUE flush_enabled = rb_hash_aref(bucket, rb_id2sym(rb_intern("flush_enabled")));
2035
+ if (!NIL_P(flush_enabled)) {
2036
+ entry.flush_enabled = RTEST(flush_enabled);
2037
+ }
2038
+ }
2039
+ {
2040
+ VALUE compression_mode = rb_hash_aref(bucket, rb_id2sym(rb_intern("compression_mode")));
2041
+ if (!NIL_P(compression_mode)) {
2042
+ Check_Type(compression_mode, T_SYMBOL);
2043
+ if (compression_mode == rb_id2sym(rb_intern("active"))) {
2044
+ entry.compression_mode = couchbase::operations::bucket_settings::compression_mode::active;
2045
+ } else if (compression_mode == rb_id2sym(rb_intern("passive"))) {
2046
+ entry.compression_mode = couchbase::operations::bucket_settings::compression_mode::passive;
2047
+ } else if (compression_mode == rb_id2sym(rb_intern("off"))) {
2048
+ entry.compression_mode = couchbase::operations::bucket_settings::compression_mode::off;
2049
+ } else {
2050
+ rb_raise(rb_eArgError, "unknown compression mode");
2051
+ }
2052
+ }
2053
+ }
2054
+ {
2055
+ VALUE ejection_policy = rb_hash_aref(bucket, rb_id2sym(rb_intern("ejection_policy")));
2056
+ if (!NIL_P(ejection_policy)) {
2057
+ Check_Type(ejection_policy, T_SYMBOL);
2058
+ if (ejection_policy == rb_id2sym(rb_intern("full"))) {
2059
+ entry.ejection_policy = couchbase::operations::bucket_settings::ejection_policy::full;
2060
+ } else if (ejection_policy == rb_id2sym(rb_intern("value_only"))) {
2061
+ entry.ejection_policy = couchbase::operations::bucket_settings::ejection_policy::value_only;
2062
+ } else {
2063
+ rb_raise(rb_eArgError, "unknown ejection policy");
2064
+ }
2065
+ }
2066
+ }
2067
+ if (is_create) {
2068
+ VALUE conflict_resolution_type = rb_hash_aref(bucket, rb_id2sym(rb_intern("conflict_resolution_type")));
2069
+ if (!NIL_P(conflict_resolution_type)) {
2070
+ Check_Type(conflict_resolution_type, T_SYMBOL);
2071
+ if (conflict_resolution_type == rb_id2sym(rb_intern("timestamp"))) {
2072
+ entry.conflict_resolution_type = couchbase::operations::bucket_settings::conflict_resolution_type::timestamp;
2073
+ } else if (conflict_resolution_type == rb_id2sym(rb_intern("sequence_number"))) {
2074
+ entry.conflict_resolution_type = couchbase::operations::bucket_settings::conflict_resolution_type::sequence_number;
2075
+ } else {
2076
+ rb_raise(rb_eArgError, "unknown conflict resolution type");
2077
+ }
2078
+ }
2079
+ }
2080
+ }
2081
+
2082
+ static VALUE
2083
+ cb_Backend_bucket_create(VALUE self, VALUE bucket_settings, VALUE timeout)
2084
+ {
2085
+ cb_backend_data* backend = nullptr;
2086
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2087
+
2088
+ if (!backend->cluster) {
2089
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2090
+ }
2091
+
2092
+ Check_Type(bucket_settings, T_HASH);
2093
+
2094
+ VALUE exc = Qnil;
2095
+ do {
2096
+ couchbase::operations::bucket_create_request req{};
2097
+ cb__extract_timeout(req, timeout);
2098
+ cb__generate_bucket_settings(bucket_settings, req.bucket, true);
2099
+ auto barrier = std::make_shared<std::promise<couchbase::operations::bucket_create_response>>();
2100
+ auto f = barrier->get_future();
2101
+ backend->cluster->execute_http(req,
2102
+ [barrier](couchbase::operations::bucket_create_response resp) mutable { barrier->set_value(resp); });
2103
+ auto resp = f.get();
2104
+ if (resp.ec) {
2105
+ exc = cb__map_error_code(
2106
+ resp.ec, fmt::format("unable to create bucket \"{}\" on the cluster ({})", req.bucket.name, resp.error_message));
2107
+ break;
2108
+ }
2109
+
2110
+ return Qtrue;
2111
+ } while (false);
2112
+ rb_exc_raise(exc);
2113
+ return Qnil;
2114
+ }
2115
+
2116
+ static VALUE
2117
+ cb_Backend_bucket_update(VALUE self, VALUE bucket_settings, VALUE timeout)
2118
+ {
2119
+ cb_backend_data* backend = nullptr;
2120
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2121
+
2122
+ if (!backend->cluster) {
2123
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2124
+ }
2125
+
2126
+ Check_Type(bucket_settings, T_HASH);
2127
+ VALUE exc = Qnil;
2128
+ do {
2129
+ couchbase::operations::bucket_update_request req{};
2130
+ cb__extract_timeout(req, timeout);
2131
+ cb__generate_bucket_settings(bucket_settings, req.bucket, false);
2132
+ auto barrier = std::make_shared<std::promise<couchbase::operations::bucket_update_response>>();
2133
+ auto f = barrier->get_future();
2134
+ backend->cluster->execute_http(req,
2135
+ [barrier](couchbase::operations::bucket_update_response resp) mutable { barrier->set_value(resp); });
2136
+ auto resp = f.get();
2137
+ if (resp.ec) {
2138
+ exc = cb__map_error_code(
2139
+ resp.ec, fmt::format("unable to update bucket \"{}\" on the cluster ({})", req.bucket.name, resp.error_message));
2140
+ break;
2141
+ }
2142
+ return Qtrue;
2143
+ } while (false);
2144
+ rb_exc_raise(exc);
2145
+ return Qnil;
2146
+ }
2147
+
2148
+ static VALUE
2149
+ cb_Backend_bucket_drop(VALUE self, VALUE bucket_name, VALUE timeout)
2150
+ {
2151
+ cb_backend_data* backend = nullptr;
2152
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2153
+
2154
+ if (!backend->cluster) {
2155
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2156
+ }
2157
+
2158
+ Check_Type(bucket_name, T_STRING);
2159
+
2160
+ VALUE exc = Qnil;
2161
+ do {
2162
+ couchbase::operations::bucket_drop_request req{};
2163
+ cb__extract_timeout(req, timeout);
2164
+ req.name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2165
+ auto barrier = std::make_shared<std::promise<couchbase::operations::bucket_drop_response>>();
2166
+ auto f = barrier->get_future();
2167
+ backend->cluster->execute_http(req,
2168
+ [barrier](couchbase::operations::bucket_drop_response resp) mutable { barrier->set_value(resp); });
2169
+ auto resp = f.get();
2170
+ if (resp.ec) {
2171
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to remove bucket \"{}\" on the cluster", req.name));
2172
+ break;
2173
+ }
2174
+ return Qtrue;
2175
+ } while (false);
2176
+ rb_exc_raise(exc);
2177
+ return Qnil;
2178
+ }
2179
+
2180
+ static VALUE
2181
+ cb_Backend_bucket_flush(VALUE self, VALUE bucket_name, VALUE timeout)
2182
+ {
2183
+ cb_backend_data* backend = nullptr;
2184
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2185
+
2186
+ if (!backend->cluster) {
2187
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2188
+ }
2189
+
2190
+ Check_Type(bucket_name, T_STRING);
2191
+
2192
+ VALUE exc = Qnil;
2193
+ do {
2194
+ couchbase::operations::bucket_flush_request req{};
2195
+ cb__extract_timeout(req, timeout);
2196
+ req.name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2197
+ auto barrier = std::make_shared<std::promise<couchbase::operations::bucket_flush_response>>();
2198
+ auto f = barrier->get_future();
2199
+ backend->cluster->execute_http(req,
2200
+ [barrier](couchbase::operations::bucket_flush_response resp) mutable { barrier->set_value(resp); });
2201
+ auto resp = f.get();
2202
+ if (resp.ec) {
2203
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to remove bucket \"{}\" on the cluster", req.name));
2204
+ break;
2205
+ }
2206
+
2207
+ return Qtrue;
2208
+ } while (false);
2209
+ rb_exc_raise(exc);
2210
+ return Qnil;
2211
+ }
2212
+
2213
+ static void
2214
+ cb__extract_bucket_settings(const couchbase::operations::bucket_settings& entry, VALUE bucket)
2215
+ {
2216
+ switch (entry.bucket_type) {
2217
+ case couchbase::operations::bucket_settings::bucket_type::couchbase:
2218
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("bucket_type")), rb_id2sym(rb_intern("couchbase")));
2219
+ break;
2220
+ case couchbase::operations::bucket_settings::bucket_type::memcached:
2221
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("bucket_type")), rb_id2sym(rb_intern("memcached")));
2222
+ break;
2223
+ case couchbase::operations::bucket_settings::bucket_type::ephemeral:
2224
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("bucket_type")), rb_id2sym(rb_intern("ephemeral")));
2225
+ break;
2226
+ case couchbase::operations::bucket_settings::bucket_type::unknown:
2227
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("bucket_type")), Qnil);
2228
+ break;
2229
+ }
2230
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("name")), rb_str_new(entry.name.data(), static_cast<long>(entry.name.size())));
2231
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("uuid")), rb_str_new(entry.uuid.data(), static_cast<long>(entry.uuid.size())));
2232
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("ram_quota_mb")), ULL2NUM(entry.ram_quota_mb));
2233
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("max_expiry")), ULONG2NUM(entry.max_expiry));
2234
+ switch (entry.compression_mode) {
2235
+ case couchbase::operations::bucket_settings::compression_mode::off:
2236
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("compression_mode")), rb_id2sym(rb_intern("off")));
2237
+ break;
2238
+ case couchbase::operations::bucket_settings::compression_mode::active:
2239
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("compression_mode")), rb_id2sym(rb_intern("active")));
2240
+ break;
2241
+ case couchbase::operations::bucket_settings::compression_mode::passive:
2242
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("compression_mode")), rb_id2sym(rb_intern("passive")));
2243
+ break;
2244
+ case couchbase::operations::bucket_settings::compression_mode::unknown:
2245
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("compression_mode")), Qnil);
2246
+ break;
2247
+ }
2248
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("num_replicas")), ULONG2NUM(entry.num_replicas));
2249
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("replica_indexes")), entry.replica_indexes ? Qtrue : Qfalse);
2250
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("flush_enabled")), entry.flush_enabled ? Qtrue : Qfalse);
2251
+ switch (entry.ejection_policy) {
2252
+ case couchbase::operations::bucket_settings::ejection_policy::full:
2253
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("ejection_policy")), rb_id2sym(rb_intern("full")));
2254
+ break;
2255
+ case couchbase::operations::bucket_settings::ejection_policy::value_only:
2256
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("ejection_policy")), rb_id2sym(rb_intern("value_only")));
2257
+ break;
2258
+ case couchbase::operations::bucket_settings::ejection_policy::unknown:
2259
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("ejection_policy")), Qnil);
2260
+ break;
2261
+ }
2262
+ switch (entry.conflict_resolution_type) {
2263
+ case couchbase::operations::bucket_settings::conflict_resolution_type::timestamp:
2264
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("conflict_resolution_type")), rb_id2sym(rb_intern("timestamp")));
2265
+ break;
2266
+ case couchbase::operations::bucket_settings::conflict_resolution_type::sequence_number:
2267
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("conflict_resolution_type")), rb_id2sym(rb_intern("sequence_number")));
2268
+ break;
2269
+ case couchbase::operations::bucket_settings::conflict_resolution_type::unknown:
2270
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("conflict_resolution_type")), Qnil);
2271
+ break;
2272
+ }
2273
+ VALUE capabilities = rb_ary_new_capa(static_cast<long>(entry.capabilities.size()));
2274
+ for (const auto& capa : entry.capabilities) {
2275
+ rb_ary_push(capabilities, rb_str_new(capa.data(), static_cast<long>(capa.size())));
2276
+ }
2277
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("capabilities")), capabilities);
2278
+ VALUE nodes = rb_ary_new_capa(static_cast<long>(entry.nodes.size()));
2279
+ for (const auto& n : entry.nodes) {
2280
+ VALUE node = rb_hash_new();
2281
+ rb_hash_aset(node, rb_id2sym(rb_intern("status")), rb_str_new(n.status.data(), static_cast<long>(n.status.size())));
2282
+ rb_hash_aset(node, rb_id2sym(rb_intern("hostname")), rb_str_new(n.hostname.data(), static_cast<long>(n.hostname.size())));
2283
+ rb_hash_aset(node, rb_id2sym(rb_intern("version")), rb_str_new(n.version.data(), static_cast<long>(n.version.size())));
2284
+ rb_ary_push(nodes, node);
2285
+ }
2286
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("nodes")), nodes);
2287
+ }
2288
+
2289
+ static VALUE
2290
+ cb_Backend_bucket_get_all(VALUE self, VALUE timeout)
2291
+ {
2292
+ cb_backend_data* backend = nullptr;
2293
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2294
+
2295
+ if (!backend->cluster) {
2296
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2297
+ }
2298
+
2299
+ VALUE exc = Qnil;
2300
+ do {
2301
+ couchbase::operations::bucket_get_all_request req{};
2302
+ cb__extract_timeout(req, timeout);
2303
+ auto barrier = std::make_shared<std::promise<couchbase::operations::bucket_get_all_response>>();
2304
+ auto f = barrier->get_future();
2305
+ backend->cluster->execute_http(
2306
+ req, [barrier](couchbase::operations::bucket_get_all_response resp) mutable { barrier->set_value(resp); });
2307
+ auto resp = f.get();
2308
+ if (resp.ec) {
2309
+ exc = cb__map_error_code(resp.ec, "unable to get list of the buckets of the cluster");
2310
+ break;
2311
+ }
2312
+
2313
+ VALUE res = rb_ary_new_capa(static_cast<long>(resp.buckets.size()));
2314
+ for (const auto& entry : resp.buckets) {
2315
+ VALUE bucket = rb_hash_new();
2316
+ cb__extract_bucket_settings(entry, bucket);
2317
+ rb_ary_push(res, bucket);
2318
+ }
2319
+
2320
+ return res;
2321
+ } while (false);
2322
+ rb_exc_raise(exc);
2323
+ return Qnil;
2324
+ }
2325
+
2326
+ static VALUE
2327
+ cb_Backend_bucket_get(VALUE self, VALUE bucket_name, VALUE timeout)
2328
+ {
2329
+ cb_backend_data* backend = nullptr;
2330
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2331
+
2332
+ if (!backend->cluster) {
2333
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2334
+ }
2335
+
2336
+ Check_Type(bucket_name, T_STRING);
2337
+
2338
+ VALUE exc = Qnil;
2339
+ do {
2340
+ couchbase::operations::bucket_get_request req{};
2341
+ cb__extract_timeout(req, timeout);
2342
+ req.name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2343
+ auto barrier = std::make_shared<std::promise<couchbase::operations::bucket_get_response>>();
2344
+ auto f = barrier->get_future();
2345
+ backend->cluster->execute_http(req,
2346
+ [barrier](couchbase::operations::bucket_get_response resp) mutable { barrier->set_value(resp); });
2347
+ auto resp = f.get();
2348
+ if (resp.ec) {
2349
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to locate bucket \"{}\" on the cluster", req.name));
2350
+ break;
2351
+ }
2352
+
2353
+ VALUE res = rb_hash_new();
2354
+ cb__extract_bucket_settings(resp.bucket, res);
2355
+
2356
+ return res;
2357
+ } while (false);
2358
+ rb_exc_raise(exc);
2359
+ return Qnil;
2360
+ }
2361
+
2362
+ static VALUE
2363
+ cb_Backend_cluster_enable_developer_preview(VALUE self)
2364
+ {
2365
+ cb_backend_data* backend = nullptr;
2366
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2367
+
2368
+ if (!backend->cluster) {
2369
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2370
+ }
2371
+
2372
+ VALUE exc = Qnil;
2373
+ do {
2374
+ couchbase::operations::cluster_developer_preview_enable_request req{};
2375
+ auto barrier = std::make_shared<std::promise<couchbase::operations::cluster_developer_preview_enable_response>>();
2376
+ auto f = barrier->get_future();
2377
+ backend->cluster->execute_http(
2378
+ req, [barrier](couchbase::operations::cluster_developer_preview_enable_response resp) mutable { barrier->set_value(resp); });
2379
+ auto resp = f.get();
2380
+ if (resp.ec) {
2381
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to enable developer preview for this cluster"));
2382
+ break;
2383
+ }
2384
+ spdlog::critical(
2385
+ "Developer preview cannot be disabled once it is enabled. If you enter developer preview mode you will not be able to "
2386
+ "upgrade. DO NOT USE IN PRODUCTION.");
2387
+ return Qtrue;
2388
+ } while (false);
2389
+ rb_exc_raise(exc);
2390
+ return Qnil;
2391
+ }
2392
+
2393
+ static VALUE
2394
+ cb_Backend_scope_get_all(VALUE self, VALUE bucket_name, VALUE timeout)
2395
+ {
2396
+ cb_backend_data* backend = nullptr;
2397
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2398
+
2399
+ if (!backend->cluster) {
2400
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2401
+ }
2402
+
2403
+ Check_Type(bucket_name, T_STRING);
2404
+
2405
+ VALUE exc = Qnil;
2406
+ do {
2407
+ couchbase::operations::scope_get_all_request req{};
2408
+ cb__extract_timeout(req, timeout);
2409
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2410
+ auto barrier = std::make_shared<std::promise<couchbase::operations::scope_get_all_response>>();
2411
+ auto f = barrier->get_future();
2412
+ backend->cluster->execute_http(req,
2413
+ [barrier](couchbase::operations::scope_get_all_response resp) mutable { barrier->set_value(resp); });
2414
+ auto resp = f.get();
2415
+ if (resp.ec) {
2416
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to get list of the scopes of the bucket \"{}\"", req.bucket_name));
2417
+ break;
2418
+ }
2419
+
2420
+ VALUE res = rb_hash_new();
2421
+ rb_hash_aset(res, rb_id2sym(rb_intern("uid")), ULL2NUM(resp.manifest.uid));
2422
+ VALUE scopes = rb_ary_new_capa(static_cast<long>(resp.manifest.scopes.size()));
2423
+ for (const auto& s : resp.manifest.scopes) {
2424
+ VALUE scope = rb_hash_new();
2425
+ rb_hash_aset(scope, rb_id2sym(rb_intern("uid")), ULL2NUM(s.uid));
2426
+ rb_hash_aset(scope, rb_id2sym(rb_intern("name")), rb_str_new(s.name.data(), static_cast<long>(s.name.size())));
2427
+ VALUE collections = rb_ary_new_capa(static_cast<long>(s.collections.size()));
2428
+ for (const auto& c : s.collections) {
2429
+ VALUE collection = rb_hash_new();
2430
+ rb_hash_aset(collection, rb_id2sym(rb_intern("uid")), ULL2NUM(c.uid));
2431
+ rb_hash_aset(collection, rb_id2sym(rb_intern("name")), rb_str_new(c.name.data(), static_cast<long>(c.name.size())));
2432
+ rb_ary_push(collections, collection);
2433
+ }
2434
+ rb_hash_aset(scope, rb_id2sym(rb_intern("collections")), collections);
2435
+ rb_ary_push(scopes, scope);
2436
+ }
2437
+ rb_hash_aset(res, rb_id2sym(rb_intern("scopes")), scopes);
2438
+
2439
+ return res;
2440
+ } while (false);
2441
+ rb_exc_raise(exc);
2442
+ return Qnil;
2443
+ }
2444
+
2445
+ static VALUE
2446
+ cb_Backend_scope_create(VALUE self, VALUE bucket_name, VALUE scope_name, VALUE timeout)
2447
+ {
2448
+ cb_backend_data* backend = nullptr;
2449
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2450
+
2451
+ if (!backend->cluster) {
2452
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2453
+ }
2454
+
2455
+ Check_Type(bucket_name, T_STRING);
2456
+ Check_Type(scope_name, T_STRING);
2457
+
2458
+ VALUE exc = Qnil;
2459
+ do {
2460
+ couchbase::operations::scope_create_request req{};
2461
+ cb__extract_timeout(req, timeout);
2462
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2463
+ req.scope_name.assign(RSTRING_PTR(scope_name), static_cast<size_t>(RSTRING_LEN(scope_name)));
2464
+ auto barrier = std::make_shared<std::promise<couchbase::operations::scope_create_response>>();
2465
+ auto f = barrier->get_future();
2466
+ backend->cluster->execute_http(req,
2467
+ [barrier](couchbase::operations::scope_create_response resp) mutable { barrier->set_value(resp); });
2468
+ auto resp = f.get();
2469
+ if (resp.ec) {
2470
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to create the scope on the bucket \"{}\"", req.bucket_name));
2471
+ break;
2472
+ }
2473
+ return ULL2NUM(resp.uid);
2474
+ } while (false);
2475
+ rb_exc_raise(exc);
2476
+ return Qnil;
2477
+ }
2478
+
2479
+ static VALUE
2480
+ cb_Backend_scope_drop(VALUE self, VALUE bucket_name, VALUE scope_name, VALUE timeout)
2481
+ {
2482
+ cb_backend_data* backend = nullptr;
2483
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2484
+
2485
+ if (!backend->cluster) {
2486
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2487
+ }
2488
+
2489
+ Check_Type(bucket_name, T_STRING);
2490
+ Check_Type(scope_name, T_STRING);
2491
+
2492
+ VALUE exc = Qnil;
2493
+ do {
2494
+ couchbase::operations::scope_drop_request req{};
2495
+ cb__extract_timeout(req, timeout);
2496
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2497
+ req.scope_name.assign(RSTRING_PTR(scope_name), static_cast<size_t>(RSTRING_LEN(scope_name)));
2498
+ auto barrier = std::make_shared<std::promise<couchbase::operations::scope_drop_response>>();
2499
+ auto f = barrier->get_future();
2500
+ backend->cluster->execute_http(req,
2501
+ [barrier](couchbase::operations::scope_drop_response resp) mutable { barrier->set_value(resp); });
2502
+ auto resp = f.get();
2503
+ if (resp.ec) {
2504
+ exc = cb__map_error_code(resp.ec,
2505
+ fmt::format("unable to drop the scope \"{}\" on the bucket \"{}\"", req.scope_name, req.bucket_name));
2506
+ break;
2507
+ }
2508
+ return ULL2NUM(resp.uid);
2509
+ } while (false);
2510
+ rb_exc_raise(exc);
2511
+ return Qnil;
2512
+ }
2513
+
2514
+ static VALUE
2515
+ cb_Backend_collection_create(VALUE self, VALUE bucket_name, VALUE scope_name, VALUE collection_name, VALUE max_expiry, VALUE timeout)
2516
+ {
2517
+ cb_backend_data* backend = nullptr;
2518
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2519
+
2520
+ if (!backend->cluster) {
2521
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2522
+ }
2523
+
2524
+ Check_Type(bucket_name, T_STRING);
2525
+ Check_Type(scope_name, T_STRING);
2526
+ Check_Type(collection_name, T_STRING);
2527
+
2528
+ VALUE exc = Qnil;
2529
+ do {
2530
+ couchbase::operations::collection_create_request req{};
2531
+ cb__extract_timeout(req, timeout);
2532
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2533
+ req.scope_name.assign(RSTRING_PTR(scope_name), static_cast<size_t>(RSTRING_LEN(scope_name)));
2534
+ req.collection_name.assign(RSTRING_PTR(collection_name), static_cast<size_t>(RSTRING_LEN(collection_name)));
2535
+
2536
+ if (!NIL_P(max_expiry)) {
2537
+ Check_Type(max_expiry, T_FIXNUM);
2538
+ req.max_expiry = FIX2UINT(max_expiry);
2539
+ }
2540
+ auto barrier = std::make_shared<std::promise<couchbase::operations::collection_create_response>>();
2541
+ auto f = barrier->get_future();
2542
+ backend->cluster->execute_http(
2543
+ req, [barrier](couchbase::operations::collection_create_response resp) mutable { barrier->set_value(resp); });
2544
+ auto resp = f.get();
2545
+ if (resp.ec) {
2546
+ exc = cb__map_error_code(
2547
+ resp.ec,
2548
+ fmt::format(
2549
+ R"(unable create the collection "{}.{}" on the bucket "{}")", req.scope_name, req.collection_name, req.bucket_name));
2550
+ break;
2551
+ }
2552
+ return ULL2NUM(resp.uid);
2553
+ } while (false);
2554
+ rb_exc_raise(exc);
2555
+ return Qnil;
2556
+ }
2557
+
2558
+ static VALUE
2559
+ cb_Backend_collection_drop(VALUE self, VALUE bucket_name, VALUE scope_name, VALUE collection_name, VALUE timeout)
2560
+ {
2561
+ cb_backend_data* backend = nullptr;
2562
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2563
+
2564
+ if (!backend->cluster) {
2565
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2566
+ }
2567
+
2568
+ Check_Type(bucket_name, T_STRING);
2569
+ Check_Type(scope_name, T_STRING);
2570
+ Check_Type(collection_name, T_STRING);
2571
+
2572
+ VALUE exc = Qnil;
2573
+ do {
2574
+ couchbase::operations::collection_drop_request req{};
2575
+ cb__extract_timeout(req, timeout);
2576
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2577
+ req.scope_name.assign(RSTRING_PTR(scope_name), static_cast<size_t>(RSTRING_LEN(scope_name)));
2578
+ req.collection_name.assign(RSTRING_PTR(collection_name), static_cast<size_t>(RSTRING_LEN(collection_name)));
2579
+
2580
+ auto barrier = std::make_shared<std::promise<couchbase::operations::collection_drop_response>>();
2581
+ auto f = barrier->get_future();
2582
+ backend->cluster->execute_http(
2583
+ req, [barrier](couchbase::operations::collection_drop_response resp) mutable { barrier->set_value(resp); });
2584
+ auto resp = f.get();
2585
+ if (resp.ec) {
2586
+ exc = cb__map_error_code(
2587
+ resp.ec,
2588
+ fmt::format(
2589
+ R"(unable to drop the collection "{}.{}" on the bucket "{}")", req.scope_name, req.collection_name, req.bucket_name));
2590
+ break;
2591
+ }
2592
+ return ULL2NUM(resp.uid);
2593
+ } while (false);
2594
+ rb_exc_raise(exc);
2595
+ return Qnil;
2596
+ }
2597
+
2598
+ static VALUE
2599
+ cb_Backend_query_index_get_all(VALUE self, VALUE bucket_name, VALUE timeout)
2600
+ {
2601
+ cb_backend_data* backend = nullptr;
2602
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2603
+
2604
+ if (!backend->cluster) {
2605
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2606
+ }
2607
+
2608
+ Check_Type(bucket_name, T_STRING);
2609
+
2610
+ VALUE exc = Qnil;
2611
+ do {
2612
+ couchbase::operations::query_index_get_all_request req{};
2613
+ cb__extract_timeout(req, timeout);
2614
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2615
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_index_get_all_response>>();
2616
+ auto f = barrier->get_future();
2617
+ backend->cluster->execute_http(
2618
+ req, [barrier](couchbase::operations::query_index_get_all_response resp) mutable { barrier->set_value(resp); });
2619
+ auto resp = f.get();
2620
+ if (resp.ec) {
2621
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to get list of the indexes of the bucket \"{}\"", req.bucket_name));
2622
+ break;
2623
+ }
2624
+
2625
+ VALUE res = rb_hash_new();
2626
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
2627
+ VALUE indexes = rb_ary_new_capa(static_cast<long>(resp.indexes.size()));
2628
+ for (const auto& idx : resp.indexes) {
2629
+ VALUE index = rb_hash_new();
2630
+ rb_hash_aset(index, rb_id2sym(rb_intern("id")), rb_str_new(idx.id.data(), static_cast<long>(idx.id.size())));
2631
+ rb_hash_aset(index, rb_id2sym(rb_intern("state")), rb_str_new(idx.state.data(), static_cast<long>(idx.state.size())));
2632
+ rb_hash_aset(index, rb_id2sym(rb_intern("name")), rb_str_new(idx.name.data(), static_cast<long>(idx.name.size())));
2633
+ rb_hash_aset(
2634
+ index, rb_id2sym(rb_intern("datastore_id")), rb_str_new(idx.datastore_id.data(), static_cast<long>(idx.datastore_id.size())));
2635
+ rb_hash_aset(
2636
+ index, rb_id2sym(rb_intern("keyspace_id")), rb_str_new(idx.keyspace_id.data(), static_cast<long>(idx.keyspace_id.size())));
2637
+ rb_hash_aset(
2638
+ index, rb_id2sym(rb_intern("namespace_id")), rb_str_new(idx.namespace_id.data(), static_cast<long>(idx.namespace_id.size())));
2639
+ rb_hash_aset(index, rb_id2sym(rb_intern("type")), rb_str_new(idx.type.data(), static_cast<long>(idx.type.size())));
2640
+ rb_hash_aset(index, rb_id2sym(rb_intern("is_primary")), idx.is_primary ? Qtrue : Qfalse);
2641
+ VALUE index_key = rb_ary_new_capa(static_cast<long>(idx.index_key.size()));
2642
+ for (const auto& key : idx.index_key) {
2643
+ rb_ary_push(index_key, rb_str_new(key.data(), static_cast<long>(key.size())));
2644
+ }
2645
+ rb_hash_aset(index, rb_id2sym(rb_intern("index_key")), index_key);
2646
+ if (idx.condition) {
2647
+ rb_hash_aset(
2648
+ index, rb_id2sym(rb_intern("condition")), rb_str_new(idx.condition->data(), static_cast<long>(idx.condition->size())));
2649
+ }
2650
+ rb_ary_push(indexes, index);
2651
+ }
2652
+
2653
+ rb_hash_aset(res, rb_id2sym(rb_intern("indexes")), indexes);
2654
+
2655
+ return res;
2656
+ } while (false);
2657
+ rb_exc_raise(exc);
2658
+ return Qnil;
2659
+ }
2660
+
2661
+ static VALUE
2662
+ cb_Backend_query_index_create(VALUE self, VALUE bucket_name, VALUE index_name, VALUE fields, VALUE options, VALUE timeout)
2663
+ {
2664
+ cb_backend_data* backend = nullptr;
2665
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2666
+
2667
+ if (!backend->cluster) {
2668
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2669
+ }
2670
+
2671
+ Check_Type(bucket_name, T_STRING);
2672
+ Check_Type(index_name, T_STRING);
2673
+ Check_Type(fields, T_ARRAY);
2674
+
2675
+ VALUE exc = Qnil;
2676
+ do {
2677
+ couchbase::operations::query_index_create_request req{};
2678
+ cb__extract_timeout(req, timeout);
2679
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2680
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
2681
+ auto fields_num = static_cast<size_t>(RARRAY_LEN(fields));
2682
+ req.fields.reserve(fields_num);
2683
+ for (size_t i = 0; i < fields_num; ++i) {
2684
+ VALUE entry = rb_ary_entry(fields, static_cast<long>(i));
2685
+ Check_Type(entry, T_STRING);
2686
+ req.fields.emplace_back(RSTRING_PTR(entry), static_cast<std::size_t>(RSTRING_LEN(entry)));
2687
+ }
2688
+ if (!NIL_P(options)) {
2689
+ Check_Type(options, T_HASH);
2690
+ VALUE ignore_if_exists = rb_hash_aref(options, rb_id2sym(rb_intern("ignore_if_exists")));
2691
+ if (ignore_if_exists == Qtrue) {
2692
+ req.ignore_if_exists = true;
2693
+ } else if (ignore_if_exists == Qfalse) {
2694
+ req.ignore_if_exists = false;
2695
+ } /* else use backend default */
2696
+ VALUE deferred = rb_hash_aref(options, rb_id2sym(rb_intern("deferred")));
2697
+ if (deferred == Qtrue) {
2698
+ req.deferred = true;
2699
+ } else if (deferred == Qfalse) {
2700
+ req.deferred = false;
2701
+ } /* else use backend default */
2702
+ VALUE num_replicas = rb_hash_aref(options, rb_id2sym(rb_intern("num_replicas")));
2703
+ if (!NIL_P(num_replicas)) {
2704
+ req.num_replicas = NUM2UINT(num_replicas);
2705
+ } /* else use backend default */
2706
+ VALUE condition = rb_hash_aref(options, rb_id2sym(rb_intern("condition")));
2707
+ if (!NIL_P(condition)) {
2708
+ req.condition.emplace(std::string(RSTRING_PTR(condition), static_cast<std::size_t>(RSTRING_LEN(condition))));
2709
+ } /* else use backend default */
2710
+ }
2711
+
2712
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_index_create_response>>();
2713
+ auto f = barrier->get_future();
2714
+ backend->cluster->execute_http(
2715
+ req, [barrier](couchbase::operations::query_index_create_response resp) mutable { barrier->set_value(resp); });
2716
+ auto resp = f.get();
2717
+ if (resp.ec) {
2718
+ if (!resp.errors.empty()) {
2719
+ const auto& first_error = resp.errors.front();
2720
+ exc = cb__map_error_code(resp.ec,
2721
+ fmt::format(R"(unable to create index "{}" on the bucket "{}" ({}: {}))",
2722
+ req.index_name,
2723
+ req.bucket_name,
2724
+ first_error.code,
2725
+ first_error.message));
2726
+ } else {
2727
+ exc = cb__map_error_code(resp.ec,
2728
+ fmt::format(R"(unable to create index "{}" on the bucket "{}")", req.index_name, req.bucket_name));
2729
+ }
2730
+ break;
2731
+ }
2732
+ VALUE res = rb_hash_new();
2733
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
2734
+ if (!resp.errors.empty()) {
2735
+ VALUE errors = rb_ary_new_capa(static_cast<long>(resp.errors.size()));
2736
+ for (const auto& err : resp.errors) {
2737
+ VALUE error = rb_hash_new();
2738
+ rb_hash_aset(error, rb_id2sym(rb_intern("code")), ULL2NUM(err.code));
2739
+ rb_hash_aset(error, rb_id2sym(rb_intern("message")), rb_str_new(err.message.data(), static_cast<long>(err.message.size())));
2740
+ rb_ary_push(errors, error);
2741
+ }
2742
+ rb_hash_aset(res, rb_id2sym(rb_intern("errors")), errors);
2743
+ }
2744
+ return res;
2745
+ } while (false);
2746
+ rb_exc_raise(exc);
2747
+ return Qnil;
2748
+ }
2749
+
2750
+ static VALUE
2751
+ cb_Backend_query_index_drop(VALUE self, VALUE bucket_name, VALUE index_name, VALUE options, VALUE timeout)
2752
+ {
2753
+ cb_backend_data* backend = nullptr;
2754
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2755
+
2756
+ if (!backend->cluster) {
2757
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2758
+ }
2759
+
2760
+ Check_Type(bucket_name, T_STRING);
2761
+ Check_Type(index_name, T_STRING);
2762
+
2763
+ VALUE exc = Qnil;
2764
+ do {
2765
+ couchbase::operations::query_index_drop_request req{};
2766
+ cb__extract_timeout(req, timeout);
2767
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2768
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
2769
+ if (!NIL_P(options)) {
2770
+ Check_Type(options, T_HASH);
2771
+ VALUE ignore_if_does_not_exist = rb_hash_aref(options, rb_id2sym(rb_intern("ignore_if_does_not_exist")));
2772
+ if (ignore_if_does_not_exist == Qtrue) {
2773
+ req.ignore_if_does_not_exist = true;
2774
+ } else if (ignore_if_does_not_exist == Qfalse) {
2775
+ req.ignore_if_does_not_exist = false;
2776
+ } /* else use backend default */
2777
+ }
2778
+
2779
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_index_drop_response>>();
2780
+ auto f = barrier->get_future();
2781
+ backend->cluster->execute_http(
2782
+ req, [barrier](couchbase::operations::query_index_drop_response resp) mutable { barrier->set_value(resp); });
2783
+ auto resp = f.get();
2784
+ if (resp.ec) {
2785
+ if (!resp.errors.empty()) {
2786
+ const auto& first_error = resp.errors.front();
2787
+ exc = cb__map_error_code(resp.ec,
2788
+ fmt::format(R"(unable to drop index "{}" on the bucket "{}" ({}: {}))",
2789
+ req.index_name,
2790
+ req.bucket_name,
2791
+ first_error.code,
2792
+ first_error.message));
2793
+ } else {
2794
+ exc = cb__map_error_code(resp.ec,
2795
+ fmt::format(R"(unable to drop index "{}" on the bucket "{}")", req.index_name, req.bucket_name));
2796
+ }
2797
+ break;
2798
+ }
2799
+ VALUE res = rb_hash_new();
2800
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
2801
+ if (!resp.errors.empty()) {
2802
+ VALUE errors = rb_ary_new_capa(static_cast<long>(resp.errors.size()));
2803
+ for (const auto& err : resp.errors) {
2804
+ VALUE error = rb_hash_new();
2805
+ rb_hash_aset(error, rb_id2sym(rb_intern("code")), ULL2NUM(err.code));
2806
+ rb_hash_aset(error, rb_id2sym(rb_intern("message")), rb_str_new(err.message.data(), static_cast<long>(err.message.size())));
2807
+ rb_ary_push(errors, error);
2808
+ }
2809
+ rb_hash_aset(res, rb_id2sym(rb_intern("errors")), errors);
2810
+ }
2811
+ return res;
2812
+ } while (false);
2813
+ rb_exc_raise(exc);
2814
+ return Qnil;
2815
+ }
2816
+
2817
+ static VALUE
2818
+ cb_Backend_query_index_create_primary(VALUE self, VALUE bucket_name, VALUE options, VALUE timeout)
2819
+ {
2820
+ cb_backend_data* backend = nullptr;
2821
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2822
+
2823
+ if (!backend->cluster) {
2824
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2825
+ }
2826
+
2827
+ Check_Type(bucket_name, T_STRING);
2828
+ if (!NIL_P(options)) {
2829
+ Check_Type(options, T_HASH);
2830
+ }
2831
+
2832
+ VALUE exc = Qnil;
2833
+ do {
2834
+ couchbase::operations::query_index_create_request req{};
2835
+ cb__extract_timeout(req, timeout);
2836
+ req.is_primary = true;
2837
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2838
+ if (!NIL_P(options)) {
2839
+ Check_Type(options, T_HASH);
2840
+ VALUE ignore_if_exists = rb_hash_aref(options, rb_id2sym(rb_intern("ignore_if_exists")));
2841
+ if (ignore_if_exists == Qtrue) {
2842
+ req.ignore_if_exists = true;
2843
+ } else if (ignore_if_exists == Qfalse) {
2844
+ req.ignore_if_exists = false;
2845
+ } /* else use backend default */
2846
+ VALUE deferred = rb_hash_aref(options, rb_id2sym(rb_intern("deferred")));
2847
+ if (deferred == Qtrue) {
2848
+ req.deferred = true;
2849
+ } else if (deferred == Qfalse) {
2850
+ req.deferred = false;
2851
+ } /* else use backend default */
2852
+ VALUE num_replicas = rb_hash_aref(options, rb_id2sym(rb_intern("num_replicas")));
2853
+ if (!NIL_P(num_replicas)) {
2854
+ req.num_replicas = NUM2UINT(num_replicas);
2855
+ } /* else use backend default */
2856
+ VALUE index_name = rb_hash_aref(options, rb_id2sym(rb_intern("index_name")));
2857
+ if (!NIL_P(index_name)) {
2858
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
2859
+ } /* else use backend default */
2860
+ }
2861
+
2862
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_index_create_response>>();
2863
+ auto f = barrier->get_future();
2864
+ backend->cluster->execute_http(
2865
+ req, [barrier](couchbase::operations::query_index_create_response resp) mutable { barrier->set_value(resp); });
2866
+ auto resp = f.get();
2867
+ if (resp.ec) {
2868
+ if (!resp.errors.empty()) {
2869
+ const auto& first_error = resp.errors.front();
2870
+ exc = cb__map_error_code(resp.ec,
2871
+ fmt::format(R"(unable to create primary index on the bucket "{}" ({}: {}))",
2872
+ req.bucket_name,
2873
+ first_error.code,
2874
+ first_error.message));
2875
+ } else {
2876
+ exc = cb__map_error_code(
2877
+ resp.ec, fmt::format(R"(unable to create primary index on the bucket "{}")", req.index_name, req.bucket_name));
2878
+ }
2879
+ break;
2880
+ }
2881
+ VALUE res = rb_hash_new();
2882
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
2883
+ if (!resp.errors.empty()) {
2884
+ VALUE errors = rb_ary_new_capa(static_cast<long>(resp.errors.size()));
2885
+ for (const auto& err : resp.errors) {
2886
+ VALUE error = rb_hash_new();
2887
+ rb_hash_aset(error, rb_id2sym(rb_intern("code")), ULL2NUM(err.code));
2888
+ rb_hash_aset(error, rb_id2sym(rb_intern("message")), rb_str_new(err.message.data(), static_cast<long>(err.message.size())));
2889
+ rb_ary_push(errors, error);
2890
+ }
2891
+ rb_hash_aset(res, rb_id2sym(rb_intern("errors")), errors);
2892
+ }
2893
+ return res;
2894
+ } while (false);
2895
+ rb_exc_raise(exc);
2896
+ return Qnil;
2897
+ }
2898
+
2899
+ static VALUE
2900
+ cb_Backend_query_index_drop_primary(VALUE self, VALUE bucket_name, VALUE options, VALUE timeout)
2901
+ {
2902
+ cb_backend_data* backend = nullptr;
2903
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2904
+
2905
+ if (!backend->cluster) {
2906
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2907
+ }
2908
+
2909
+ Check_Type(bucket_name, T_STRING);
2910
+
2911
+ VALUE exc = Qnil;
2912
+ do {
2913
+ couchbase::operations::query_index_drop_request req{};
2914
+ cb__extract_timeout(req, timeout);
2915
+ req.is_primary = true;
2916
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2917
+ if (!NIL_P(options)) {
2918
+ Check_Type(options, T_HASH);
2919
+ VALUE ignore_if_does_not_exist = rb_hash_aref(options, rb_id2sym(rb_intern("ignore_if_does_not_exist")));
2920
+ if (ignore_if_does_not_exist == Qtrue) {
2921
+ req.ignore_if_does_not_exist = true;
2922
+ } else if (ignore_if_does_not_exist == Qfalse) {
2923
+ req.ignore_if_does_not_exist = false;
2924
+ } /* else use backend default */
2925
+ VALUE index_name = rb_hash_aref(options, rb_id2sym(rb_intern("index_name")));
2926
+ if (!NIL_P(index_name)) {
2927
+ Check_Type(options, T_STRING);
2928
+ req.is_primary = false;
2929
+ req.bucket_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
2930
+ }
2931
+ }
2932
+
2933
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_index_drop_response>>();
2934
+ auto f = barrier->get_future();
2935
+ backend->cluster->execute_http(
2936
+ req, [barrier](couchbase::operations::query_index_drop_response resp) mutable { barrier->set_value(resp); });
2937
+ auto resp = f.get();
2938
+ if (resp.ec) {
2939
+ if (!resp.errors.empty()) {
2940
+ const auto& first_error = resp.errors.front();
2941
+ exc = cb__map_error_code(
2942
+ resp.ec,
2943
+ fmt::format(
2944
+ R"(unable to drop primary index on the bucket "{}" ({}: {}))", req.bucket_name, first_error.code, first_error.message));
2945
+ } else {
2946
+ exc = cb__map_error_code(resp.ec, fmt::format(R"(unable to drop primary index on the bucket "{}")", req.bucket_name));
2947
+ }
2948
+ break;
2949
+ }
2950
+ VALUE res = rb_hash_new();
2951
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
2952
+ if (!resp.errors.empty()) {
2953
+ VALUE errors = rb_ary_new_capa(static_cast<long>(resp.errors.size()));
2954
+ for (const auto& err : resp.errors) {
2955
+ VALUE error = rb_hash_new();
2956
+ rb_hash_aset(error, rb_id2sym(rb_intern("code")), ULL2NUM(err.code));
2957
+ rb_hash_aset(error, rb_id2sym(rb_intern("message")), rb_str_new(err.message.data(), static_cast<long>(err.message.size())));
2958
+ rb_ary_push(errors, error);
2959
+ }
2960
+ rb_hash_aset(res, rb_id2sym(rb_intern("errors")), errors);
2961
+ }
2962
+ return res;
2963
+ } while (false);
2964
+ rb_exc_raise(exc);
2965
+ return Qnil;
2966
+ }
2967
+
2968
+ static VALUE
2969
+ cb_Backend_query_index_build_deferred(VALUE self, VALUE bucket_name, VALUE timeout)
2970
+ {
2971
+ cb_backend_data* backend = nullptr;
2972
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2973
+
2974
+ if (!backend->cluster) {
2975
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2976
+ }
2977
+
2978
+ Check_Type(bucket_name, T_STRING);
2979
+
2980
+ VALUE exc = Qnil;
2981
+ do {
2982
+ couchbase::operations::query_index_build_deferred_request req{};
2983
+ cb__extract_timeout(req, timeout);
2984
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2985
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_index_build_deferred_response>>();
2986
+ auto f = barrier->get_future();
2987
+ backend->cluster->execute_http(
2988
+ req, [barrier](couchbase::operations::query_index_build_deferred_response resp) mutable { barrier->set_value(resp); });
2989
+ auto resp = f.get();
2990
+ if (resp.ec) {
2991
+ if (!resp.errors.empty()) {
2992
+ const auto& first_error = resp.errors.front();
2993
+ exc = cb__map_error_code(
2994
+ resp.ec,
2995
+ fmt::format(
2996
+ R"(unable to drop primary index on the bucket "{}" ({}: {}))", req.bucket_name, first_error.code, first_error.message));
2997
+
2998
+ } else {
2999
+ exc = cb__map_error_code(
3000
+ resp.ec, fmt::format("unable to trigger build for deferred indexes for the bucket \"{}\"", req.bucket_name));
3001
+ }
3002
+ break;
3003
+ }
3004
+ return Qtrue;
3005
+ } while (false);
3006
+ rb_exc_raise(exc);
3007
+ return Qnil;
3008
+ }
3009
+
3010
+ static VALUE
3011
+ cb_Backend_query_index_watch(VALUE self, VALUE bucket_name, VALUE index_names, VALUE timeout, VALUE options)
3012
+ {
3013
+ cb_backend_data* backend = nullptr;
3014
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3015
+
3016
+ if (!backend->cluster) {
3017
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3018
+ }
3019
+
3020
+ Check_Type(bucket_name, T_STRING);
3021
+ Check_Type(index_names, T_ARRAY);
3022
+ Check_Type(timeout, T_FIXNUM);
3023
+ if (!NIL_P(options)) {
3024
+ Check_Type(options, T_HASH);
3025
+ }
3026
+
3027
+ return Qtrue;
3028
+ }
3029
+
3030
+ static void
3031
+ cb__extract_search_index(VALUE index, const couchbase::operations::search_index& idx)
3032
+ {
3033
+ rb_hash_aset(index, rb_id2sym(rb_intern("uuid")), rb_str_new(idx.uuid.data(), static_cast<long>(idx.uuid.size())));
3034
+ rb_hash_aset(index, rb_id2sym(rb_intern("name")), rb_str_new(idx.name.data(), static_cast<long>(idx.name.size())));
3035
+ rb_hash_aset(index, rb_id2sym(rb_intern("type")), rb_str_new(idx.type.data(), static_cast<long>(idx.type.size())));
3036
+ if (!idx.params_json.empty()) {
3037
+ rb_hash_aset(index, rb_id2sym(rb_intern("params")), rb_str_new(idx.params_json.data(), static_cast<long>(idx.params_json.size())));
3038
+ }
3039
+
3040
+ if (!idx.source_uuid.empty()) {
3041
+ rb_hash_aset(
3042
+ index, rb_id2sym(rb_intern("source_uuid")), rb_str_new(idx.source_uuid.data(), static_cast<long>(idx.source_uuid.size())));
3043
+ }
3044
+ if (!idx.source_name.empty()) {
3045
+ rb_hash_aset(
3046
+ index, rb_id2sym(rb_intern("source_name")), rb_str_new(idx.source_name.data(), static_cast<long>(idx.source_name.size())));
3047
+ }
3048
+ rb_hash_aset(index, rb_id2sym(rb_intern("source_type")), rb_str_new(idx.source_type.data(), static_cast<long>(idx.source_type.size())));
3049
+ if (!idx.source_params_json.empty()) {
3050
+ rb_hash_aset(index,
3051
+ rb_id2sym(rb_intern("source_params")),
3052
+ rb_str_new(idx.source_params_json.data(), static_cast<long>(idx.source_params_json.size())));
3053
+ }
3054
+ if (!idx.plan_params_json.empty()) {
3055
+ rb_hash_aset(index,
3056
+ rb_id2sym(rb_intern("plan_params")),
3057
+ rb_str_new(idx.plan_params_json.data(), static_cast<long>(idx.plan_params_json.size())));
3058
+ }
3059
+ }
3060
+
3061
+ static VALUE
3062
+ cb_Backend_search_index_get_all(VALUE self, VALUE timeout)
3063
+ {
3064
+ cb_backend_data* backend = nullptr;
3065
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3066
+
3067
+ if (!backend->cluster) {
3068
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3069
+ }
3070
+
3071
+ VALUE exc = Qnil;
3072
+ do {
3073
+ couchbase::operations::search_index_get_all_request req{};
3074
+ cb__extract_timeout(req, timeout);
3075
+ auto barrier = std::make_shared<std::promise<couchbase::operations::search_index_get_all_response>>();
3076
+ auto f = barrier->get_future();
3077
+ backend->cluster->execute_http(
3078
+ req, [barrier](couchbase::operations::search_index_get_all_response resp) mutable { barrier->set_value(resp); });
3079
+ auto resp = f.get();
3080
+ if (resp.ec) {
3081
+ exc = cb__map_error_code(resp.ec, "unable to get list of the search indexes");
3082
+ break;
3083
+ }
3084
+ VALUE res = rb_hash_new();
3085
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
3086
+ rb_hash_aset(
3087
+ res, rb_id2sym(rb_intern("impl_version")), rb_str_new(resp.impl_version.data(), static_cast<long>(resp.impl_version.size())));
3088
+ VALUE indexes = rb_ary_new_capa(static_cast<long>(resp.indexes.size()));
3089
+ for (const auto& idx : resp.indexes) {
3090
+ VALUE index = rb_hash_new();
3091
+ cb__extract_search_index(index, idx);
3092
+ rb_ary_push(indexes, index);
3093
+ }
3094
+ rb_hash_aset(res, rb_id2sym(rb_intern("indexes")), indexes);
3095
+ return res;
3096
+ } while (false);
3097
+ rb_exc_raise(exc);
3098
+ return Qnil;
3099
+ }
3100
+
3101
+ static VALUE
3102
+ cb_Backend_search_index_get(VALUE self, VALUE index_name, VALUE timeout)
3103
+ {
3104
+ cb_backend_data* backend = nullptr;
3105
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3106
+
3107
+ if (!backend->cluster) {
3108
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3109
+ }
3110
+
3111
+ Check_Type(index_name, T_STRING);
3112
+ VALUE exc = Qnil;
3113
+ do {
3114
+ couchbase::operations::search_index_get_request req{};
3115
+ cb__extract_timeout(req, timeout);
3116
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
3117
+ auto barrier = std::make_shared<std::promise<couchbase::operations::search_index_get_response>>();
3118
+ auto f = barrier->get_future();
3119
+ backend->cluster->execute_http(
3120
+ req, [barrier](couchbase::operations::search_index_get_response resp) mutable { barrier->set_value(resp); });
3121
+ auto resp = f.get();
3122
+ if (resp.ec) {
3123
+ if (resp.error.empty()) {
3124
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to get search index \"{}\"", req.index_name));
3125
+ } else {
3126
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to get search index \"{}\": {}", req.index_name, resp.error));
3127
+ }
3128
+ break;
3129
+ }
3130
+ VALUE res = rb_hash_new();
3131
+ cb__extract_search_index(res, resp.index);
3132
+ return res;
3133
+ } while (false);
3134
+ rb_exc_raise(exc);
3135
+ return Qnil;
3136
+ }
3137
+
3138
+ static VALUE
3139
+ cb_Backend_search_index_upsert(VALUE self, VALUE index_definition, VALUE timeout)
3140
+ {
3141
+ cb_backend_data* backend = nullptr;
3142
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3143
+
3144
+ if (!backend->cluster) {
3145
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3146
+ }
3147
+
3148
+ Check_Type(index_definition, T_HASH);
3149
+ VALUE exc = Qnil;
3150
+ do {
3151
+ couchbase::operations::search_index_upsert_request req{};
3152
+ cb__extract_timeout(req, timeout);
3153
+
3154
+ VALUE index_name = rb_hash_aref(index_definition, rb_id2sym(rb_intern("name")));
3155
+ Check_Type(index_name, T_STRING);
3156
+ req.index.name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
3157
+
3158
+ VALUE index_type = rb_hash_aref(index_definition, rb_id2sym(rb_intern("type")));
3159
+ Check_Type(index_type, T_STRING);
3160
+ req.index.type.assign(RSTRING_PTR(index_type), static_cast<size_t>(RSTRING_LEN(index_type)));
3161
+
3162
+ VALUE index_uuid = rb_hash_aref(index_definition, rb_id2sym(rb_intern("uuid")));
3163
+ if (!NIL_P(index_uuid)) {
3164
+ Check_Type(index_uuid, T_STRING);
3165
+ req.index.uuid.assign(RSTRING_PTR(index_uuid), static_cast<size_t>(RSTRING_LEN(index_uuid)));
3166
+ }
3167
+
3168
+ VALUE index_params = rb_hash_aref(index_definition, rb_id2sym(rb_intern("params")));
3169
+ if (!NIL_P(index_params)) {
3170
+ Check_Type(index_params, T_STRING);
3171
+ req.index.params_json.assign(std::string(RSTRING_PTR(index_params), static_cast<size_t>(RSTRING_LEN(index_params))));
3172
+ }
3173
+
3174
+ VALUE source_name = rb_hash_aref(index_definition, rb_id2sym(rb_intern("source_name")));
3175
+ if (!NIL_P(source_name)) {
3176
+ Check_Type(source_name, T_STRING);
3177
+ req.index.source_name.assign(RSTRING_PTR(source_name), static_cast<size_t>(RSTRING_LEN(source_name)));
3178
+ }
3179
+
3180
+ VALUE source_type = rb_hash_aref(index_definition, rb_id2sym(rb_intern("source_type")));
3181
+ Check_Type(source_type, T_STRING);
3182
+ req.index.source_type.assign(RSTRING_PTR(source_type), static_cast<size_t>(RSTRING_LEN(source_type)));
3183
+
3184
+ VALUE source_uuid = rb_hash_aref(index_definition, rb_id2sym(rb_intern("source_uuid")));
3185
+ if (!NIL_P(source_uuid)) {
3186
+ Check_Type(source_uuid, T_STRING);
3187
+ req.index.source_uuid.assign(RSTRING_PTR(source_uuid), static_cast<size_t>(RSTRING_LEN(source_uuid)));
3188
+ }
3189
+
3190
+ VALUE source_params = rb_hash_aref(index_definition, rb_id2sym(rb_intern("source_params")));
3191
+ if (!NIL_P(source_params)) {
3192
+ Check_Type(source_params, T_STRING);
3193
+ req.index.source_params_json.assign(std::string(RSTRING_PTR(source_params), static_cast<size_t>(RSTRING_LEN(source_params))));
3194
+ }
3195
+
3196
+ VALUE plan_params = rb_hash_aref(index_definition, rb_id2sym(rb_intern("plan_params")));
3197
+ if (!NIL_P(plan_params)) {
3198
+ Check_Type(plan_params, T_STRING);
3199
+ req.index.plan_params_json.assign(std::string(RSTRING_PTR(plan_params), static_cast<size_t>(RSTRING_LEN(plan_params))));
3200
+ }
3201
+
3202
+ auto barrier = std::make_shared<std::promise<couchbase::operations::search_index_upsert_response>>();
3203
+ auto f = barrier->get_future();
3204
+ backend->cluster->execute_http(
3205
+ req, [barrier](couchbase::operations::search_index_upsert_response resp) mutable { barrier->set_value(resp); });
3206
+ auto resp = f.get();
3207
+ if (resp.ec) {
3208
+ if (resp.error.empty()) {
3209
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to upsert the search index \"{}\"", req.index.name));
3210
+ } else {
3211
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to upsert the search index \"{}\": {}", req.index.name, resp.error));
3212
+ }
3213
+ break;
3214
+ }
3215
+ VALUE res = rb_hash_new();
3216
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
3217
+ return res;
3218
+ } while (false);
3219
+ rb_exc_raise(exc);
3220
+ return Qnil;
3221
+ }
3222
+
3223
+ static VALUE
3224
+ cb_Backend_search_index_drop(VALUE self, VALUE index_name, VALUE timeout)
3225
+ {
3226
+ cb_backend_data* backend = nullptr;
3227
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3228
+
3229
+ if (!backend->cluster) {
3230
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3231
+ }
3232
+
3233
+ Check_Type(index_name, T_STRING);
3234
+ VALUE exc = Qnil;
3235
+ do {
3236
+ couchbase::operations::search_index_drop_request req{};
3237
+ cb__extract_timeout(req, timeout);
3238
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
3239
+ auto barrier = std::make_shared<std::promise<couchbase::operations::search_index_drop_response>>();
3240
+ auto f = barrier->get_future();
3241
+ backend->cluster->execute_http(
3242
+ req, [barrier](couchbase::operations::search_index_drop_response resp) mutable { barrier->set_value(resp); });
3243
+ auto resp = f.get();
3244
+ if (resp.ec) {
3245
+ if (resp.error.empty()) {
3246
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to drop the search index \"{}\"", req.index_name));
3247
+ } else {
3248
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to drop the search index \"{}\": {}", req.index_name, resp.error));
3249
+ }
3250
+ break;
3251
+ }
3252
+ VALUE res = rb_hash_new();
3253
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
3254
+ return res;
3255
+ } while (false);
3256
+ rb_exc_raise(exc);
3257
+ return Qnil;
3258
+ }
3259
+
3260
+ static VALUE
3261
+ cb_Backend_search_index_get_documents_count(VALUE self, VALUE index_name, VALUE timeout)
3262
+ {
3263
+ cb_backend_data* backend = nullptr;
3264
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3265
+
3266
+ if (!backend->cluster) {
3267
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3268
+ }
3269
+
3270
+ Check_Type(index_name, T_STRING);
3271
+ VALUE exc = Qnil;
3272
+ do {
3273
+ couchbase::operations::search_index_get_documents_count_request req{};
3274
+ cb__extract_timeout(req, timeout);
3275
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
3276
+ auto barrier = std::make_shared<std::promise<couchbase::operations::search_index_get_documents_count_response>>();
3277
+ auto f = barrier->get_future();
3278
+ backend->cluster->execute_http(
3279
+ req, [barrier](couchbase::operations::search_index_get_documents_count_response resp) mutable { barrier->set_value(resp); });
3280
+ auto resp = f.get();
3281
+ if (resp.ec) {
3282
+ if (resp.error.empty()) {
3283
+ exc = cb__map_error_code(
3284
+ resp.ec, fmt::format("unable to get number of the indexed documents for the search index \"{}\"", req.index_name));
3285
+ } else {
3286
+ exc = cb__map_error_code(
3287
+ resp.ec,
3288
+ fmt::format("unable to get number of the indexed documents for the search index \"{}\": {}", req.index_name, resp.error));
3289
+ }
3290
+ break;
3291
+ }
3292
+ VALUE res = rb_hash_new();
3293
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
3294
+ rb_hash_aset(res, rb_id2sym(rb_intern("count")), ULL2NUM(resp.count));
3295
+ return res;
3296
+ } while (false);
3297
+ rb_exc_raise(exc);
3298
+ return Qnil;
3299
+ }
3300
+
3301
+ static VALUE
3302
+ cb_Backend_search_index_pause_ingest(VALUE self, VALUE index_name, VALUE timeout)
3303
+ {
3304
+ cb_backend_data* backend = nullptr;
3305
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3306
+
3307
+ if (!backend->cluster) {
3308
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3309
+ }
3310
+
3311
+ Check_Type(index_name, T_STRING);
3312
+ VALUE exc = Qnil;
3313
+ do {
3314
+ couchbase::operations::search_index_control_ingest_request req{};
3315
+ cb__extract_timeout(req, timeout);
3316
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
3317
+ req.pause = true;
3318
+ auto barrier = std::make_shared<std::promise<couchbase::operations::search_index_control_ingest_response>>();
3319
+ auto f = barrier->get_future();
3320
+ backend->cluster->execute_http(
3321
+ req, [barrier](couchbase::operations::search_index_control_ingest_response resp) mutable { barrier->set_value(resp); });
3322
+ auto resp = f.get();
3323
+ if (resp.ec) {
3324
+ if (resp.error.empty()) {
3325
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to pause ingest for the search index \"{}\"", req.index_name));
3326
+ } else {
3327
+ exc = cb__map_error_code(resp.ec,
3328
+ fmt::format("unable to pause ingest for the search index \"{}\": {}", req.index_name, resp.error));
3329
+ }
3330
+ break;
3331
+ }
3332
+ VALUE res = rb_hash_new();
3333
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
3334
+ return res;
3335
+ } while (false);
3336
+ rb_exc_raise(exc);
3337
+ return Qnil;
3338
+ }
3339
+
3340
+ static VALUE
3341
+ cb_Backend_search_index_resume_ingest(VALUE self, VALUE index_name, VALUE timeout)
3342
+ {
3343
+ cb_backend_data* backend = nullptr;
3344
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3345
+
3346
+ if (!backend->cluster) {
3347
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3348
+ }
3349
+
3350
+ Check_Type(index_name, T_STRING);
3351
+ VALUE exc = Qnil;
3352
+ do {
3353
+ couchbase::operations::search_index_control_ingest_request req{};
3354
+ cb__extract_timeout(req, timeout);
3355
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
3356
+ req.pause = false;
3357
+ auto barrier = std::make_shared<std::promise<couchbase::operations::search_index_control_ingest_response>>();
3358
+ auto f = barrier->get_future();
3359
+ backend->cluster->execute_http(
3360
+ req, [barrier](couchbase::operations::search_index_control_ingest_response resp) mutable { barrier->set_value(resp); });
3361
+ auto resp = f.get();
3362
+ if (resp.ec) {
3363
+ if (resp.error.empty()) {
3364
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to resume ingest for the search index \"{}\"", req.index_name));
3365
+ } else {
3366
+ exc = cb__map_error_code(
3367
+ resp.ec, fmt::format("unable to resume ingest for the search index \"{}\": {}", req.index_name, resp.error));
3368
+ }
3369
+ break;
3370
+ }
3371
+ VALUE res = rb_hash_new();
3372
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
3373
+ return res;
3374
+ } while (false);
3375
+ rb_exc_raise(exc);
3376
+ return Qnil;
3377
+ }
3378
+
3379
+ static VALUE
3380
+ cb_Backend_search_index_allow_querying(VALUE self, VALUE index_name, VALUE timeout)
3381
+ {
3382
+ cb_backend_data* backend = nullptr;
3383
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3384
+
3385
+ if (!backend->cluster) {
3386
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3387
+ }
3388
+
3389
+ Check_Type(index_name, T_STRING);
3390
+ VALUE exc = Qnil;
3391
+ do {
3392
+ couchbase::operations::search_index_control_query_request req{};
3393
+ cb__extract_timeout(req, timeout);
3394
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
3395
+ req.allow = true;
3396
+ auto barrier = std::make_shared<std::promise<couchbase::operations::search_index_control_query_response>>();
3397
+ auto f = barrier->get_future();
3398
+ backend->cluster->execute_http(
3399
+ req, [barrier](couchbase::operations::search_index_control_query_response resp) mutable { barrier->set_value(resp); });
3400
+ auto resp = f.get();
3401
+ if (resp.ec) {
3402
+ if (resp.error.empty()) {
3403
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to allow querying for the search index \"{}\"", req.index_name));
3404
+ } else {
3405
+ exc = cb__map_error_code(
3406
+ resp.ec, fmt::format("unable to allow querying for the search index \"{}\": {}", req.index_name, resp.error));
3407
+ }
3408
+ break;
3409
+ }
3410
+ VALUE res = rb_hash_new();
3411
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
3412
+ return res;
3413
+ } while (false);
3414
+ rb_exc_raise(exc);
3415
+ return Qnil;
3416
+ }
3417
+
3418
+ static VALUE
3419
+ cb_Backend_search_index_disallow_querying(VALUE self, VALUE index_name, VALUE timeout)
3420
+ {
3421
+ cb_backend_data* backend = nullptr;
3422
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3423
+
3424
+ if (!backend->cluster) {
3425
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3426
+ }
3427
+
3428
+ Check_Type(index_name, T_STRING);
3429
+ VALUE exc = Qnil;
3430
+ do {
3431
+ couchbase::operations::search_index_control_query_request req{};
3432
+ cb__extract_timeout(req, timeout);
3433
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
3434
+ req.allow = false;
3435
+ auto barrier = std::make_shared<std::promise<couchbase::operations::search_index_control_query_response>>();
3436
+ auto f = barrier->get_future();
3437
+ backend->cluster->execute_http(
3438
+ req, [barrier](couchbase::operations::search_index_control_query_response resp) mutable { barrier->set_value(resp); });
3439
+ auto resp = f.get();
3440
+ if (resp.ec) {
3441
+ if (resp.error.empty()) {
3442
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to disallow querying for the search index \"{}\"", req.index_name));
3443
+ } else {
3444
+ exc = cb__map_error_code(
3445
+ resp.ec, fmt::format("unable to disallow querying for the search index \"{}\": {}", req.index_name, resp.error));
3446
+ }
3447
+ break;
3448
+ }
3449
+ VALUE res = rb_hash_new();
3450
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
3451
+ return res;
3452
+ } while (false);
3453
+ rb_exc_raise(exc);
3454
+ return Qnil;
3455
+ }
3456
+
3457
+ static VALUE
3458
+ cb_Backend_search_index_freeze_plan(VALUE self, VALUE index_name, VALUE timeout)
3459
+ {
3460
+ cb_backend_data* backend = nullptr;
3461
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3462
+
3463
+ if (!backend->cluster) {
3464
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3465
+ }
3466
+
3467
+ Check_Type(index_name, T_STRING);
3468
+ VALUE exc = Qnil;
3469
+ do {
3470
+ couchbase::operations::search_index_control_plan_freeze_request req{};
3471
+ cb__extract_timeout(req, timeout);
3472
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
3473
+ req.freeze = true;
3474
+ auto barrier = std::make_shared<std::promise<couchbase::operations::search_index_control_plan_freeze_response>>();
3475
+ auto f = barrier->get_future();
3476
+ backend->cluster->execute_http(
3477
+ req, [barrier](couchbase::operations::search_index_control_plan_freeze_response resp) mutable { barrier->set_value(resp); });
3478
+ auto resp = f.get();
3479
+ if (resp.ec) {
3480
+ if (resp.error.empty()) {
3481
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to freeze for the search index \"{}\"", req.index_name));
3482
+ } else {
3483
+ exc =
3484
+ cb__map_error_code(resp.ec, fmt::format("unable to freeze for the search index \"{}\": {}", req.index_name, resp.error));
3485
+ }
3486
+ break;
3487
+ }
3488
+ VALUE res = rb_hash_new();
3489
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
3490
+ return res;
3491
+ } while (false);
3492
+ rb_exc_raise(exc);
3493
+ return Qnil;
3494
+ }
3495
+
3496
+ static VALUE
3497
+ cb_Backend_search_index_unfreeze_plan(VALUE self, VALUE index_name, VALUE timeout)
3498
+ {
3499
+ cb_backend_data* backend = nullptr;
3500
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3501
+
3502
+ if (!backend->cluster) {
3503
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3504
+ }
3505
+
3506
+ Check_Type(index_name, T_STRING);
3507
+ VALUE exc = Qnil;
3508
+ do {
3509
+ couchbase::operations::search_index_control_plan_freeze_request req{};
3510
+ cb__extract_timeout(req, timeout);
3511
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
3512
+ req.freeze = false;
3513
+ auto barrier = std::make_shared<std::promise<couchbase::operations::search_index_control_plan_freeze_response>>();
3514
+ auto f = barrier->get_future();
3515
+ backend->cluster->execute_http(
3516
+ req, [barrier](couchbase::operations::search_index_control_plan_freeze_response resp) mutable { barrier->set_value(resp); });
3517
+ auto resp = f.get();
3518
+ if (resp.ec) {
3519
+ if (resp.error.empty()) {
3520
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to unfreeze plan for the search index \"{}\"", req.index_name));
3521
+ } else {
3522
+ exc = cb__map_error_code(resp.ec,
3523
+ fmt::format("unable to unfreeze for the search index \"{}\": {}", req.index_name, resp.error));
3524
+ }
3525
+ break;
3526
+ }
3527
+ VALUE res = rb_hash_new();
3528
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
3529
+ return res;
3530
+ } while (false);
3531
+ rb_exc_raise(exc);
3532
+ return Qnil;
3533
+ }
3534
+
3535
+ static VALUE
3536
+ cb_Backend_search_index_analyze_document(VALUE self, VALUE index_name, VALUE encoded_document, VALUE timeout)
3537
+ {
3538
+ cb_backend_data* backend = nullptr;
3539
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3540
+
3541
+ if (!backend->cluster) {
3542
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3543
+ }
3544
+
3545
+ Check_Type(index_name, T_STRING);
3546
+ Check_Type(encoded_document, T_STRING);
3547
+ VALUE exc = Qnil;
3548
+ do {
3549
+ couchbase::operations::search_index_analyze_document_request req{};
3550
+ cb__extract_timeout(req, timeout);
3551
+
3552
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
3553
+ req.encoded_document.assign(RSTRING_PTR(encoded_document), static_cast<size_t>(RSTRING_LEN(encoded_document)));
3554
+
3555
+ auto barrier = std::make_shared<std::promise<couchbase::operations::search_index_analyze_document_response>>();
3556
+ auto f = barrier->get_future();
3557
+ backend->cluster->execute_http(
3558
+ req, [barrier](couchbase::operations::search_index_analyze_document_response resp) mutable { barrier->set_value(resp); });
3559
+ auto resp = f.get();
3560
+ if (resp.ec) {
3561
+ if (resp.error.empty()) {
3562
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to analyze document using the search index \"{}\"", req.index_name));
3563
+ } else {
3564
+ exc = cb__map_error_code(
3565
+ resp.ec, fmt::format("unable to analyze document using the search index \"{}\": {}", req.index_name, resp.error));
3566
+ }
3567
+ break;
3568
+ }
3569
+ VALUE res = rb_hash_new();
3570
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
3571
+ rb_hash_aset(res, rb_id2sym(rb_intern("analysis")), rb_str_new(resp.analysis.data(), static_cast<long>(resp.analysis.size())));
3572
+ return res;
3573
+ } while (false);
3574
+ rb_exc_raise(exc);
3575
+ return Qnil;
3576
+ }
3577
+
3578
+ static VALUE
3579
+ cb_Backend_document_search(VALUE self, VALUE index_name, VALUE query, VALUE options)
3580
+ {
3581
+ cb_backend_data* backend = nullptr;
3582
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
3583
+
3584
+ if (!backend->cluster) {
3585
+ rb_raise(rb_eArgError, "Cluster has been closed already");
3586
+ }
3587
+
3588
+ Check_Type(index_name, T_STRING);
3589
+ Check_Type(query, T_STRING);
3590
+ Check_Type(options, T_HASH);
3591
+
3592
+ VALUE exc = Qnil;
3593
+ do {
3594
+ couchbase::operations::search_request req;
3595
+ VALUE client_context_id = rb_hash_aref(options, rb_id2sym(rb_intern("client_context_id")));
3596
+ if (!NIL_P(client_context_id)) {
3597
+ Check_Type(client_context_id, T_STRING);
3598
+ req.client_context_id.assign(RSTRING_PTR(client_context_id), static_cast<size_t>(RSTRING_LEN(client_context_id)));
3599
+ }
3600
+ cb__extract_timeout(req, rb_hash_aref(options, rb_id2sym(rb_intern("timeout"))));
3601
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
3602
+ req.query = tao::json::from_string(std::string(RSTRING_PTR(query), static_cast<size_t>(RSTRING_LEN(query))));
3603
+
3604
+ VALUE explain = rb_hash_aref(options, rb_id2sym(rb_intern("explain")));
3605
+ if (!NIL_P(explain)) {
3606
+ req.explain = RTEST(explain);
3607
+ }
3608
+
3609
+ VALUE skip = rb_hash_aref(options, rb_id2sym(rb_intern("skip")));
3610
+ if (!NIL_P(skip)) {
3611
+ Check_Type(skip, T_FIXNUM);
3612
+ req.skip = FIX2ULONG(skip);
3613
+ }
3614
+
3615
+ VALUE limit = rb_hash_aref(options, rb_id2sym(rb_intern("limit")));
3616
+ if (!NIL_P(limit)) {
3617
+ Check_Type(limit, T_FIXNUM);
3618
+ req.limit = FIX2ULONG(limit);
3619
+ }
3620
+
3621
+ VALUE highlight_style = rb_hash_aref(options, rb_id2sym(rb_intern("highlight_style")));
3622
+ if (!NIL_P(highlight_style)) {
3623
+ Check_Type(highlight_style, T_SYMBOL);
3624
+ ID type = rb_sym2id(highlight_style);
3625
+ if (type == rb_intern("html")) {
3626
+ req.highlight_style = couchbase::operations::search_request::highlight_style_type::html;
3627
+ } else if (type == rb_intern("ansi")) {
3628
+ req.highlight_style = couchbase::operations::search_request::highlight_style_type::ansi;
3629
+ }
3630
+ }
3631
+
3632
+ VALUE highlight_fields = rb_hash_aref(options, rb_id2sym(rb_intern("highlight_fields")));
3633
+ if (!NIL_P(highlight_fields)) {
3634
+ Check_Type(highlight_fields, T_ARRAY);
3635
+ auto highlight_fields_size = static_cast<size_t>(RARRAY_LEN(highlight_fields));
3636
+ req.highlight_fields.reserve(highlight_fields_size);
3637
+ for (size_t i = 0; i < highlight_fields_size; ++i) {
3638
+ VALUE field = rb_ary_entry(highlight_fields, static_cast<long>(i));
3639
+ Check_Type(field, T_STRING);
3640
+ req.highlight_fields.emplace_back(std::string(RSTRING_PTR(field), static_cast<std::size_t>(RSTRING_LEN(field))));
3641
+ }
3642
+ }
3643
+
3644
+ VALUE scan_consistency = rb_hash_aref(options, rb_id2sym(rb_intern("scan_consistency")));
3645
+ if (!NIL_P(scan_consistency)) {
3646
+ Check_Type(scan_consistency, T_SYMBOL);
3647
+ ID type = rb_sym2id(scan_consistency);
3648
+ if (type == rb_intern("not_bounded")) {
3649
+ req.scan_consistency = couchbase::operations::search_request::scan_consistency_type::not_bounded;
3650
+ }
3651
+ }
3652
+
3653
+ VALUE mutation_state = rb_hash_aref(options, rb_id2sym(rb_intern("mutation_state")));
3654
+ if (!NIL_P(mutation_state)) {
3655
+ Check_Type(mutation_state, T_ARRAY);
3656
+ auto state_size = static_cast<size_t>(RARRAY_LEN(mutation_state));
3657
+ req.mutation_state.reserve(state_size);
3658
+ for (size_t i = 0; i < state_size; ++i) {
3659
+ VALUE token = rb_ary_entry(mutation_state, static_cast<long>(i));
3660
+ Check_Type(token, T_HASH);
3661
+ VALUE bucket_name = rb_hash_aref(token, rb_id2sym(rb_intern("bucket_name")));
3662
+ Check_Type(bucket_name, T_STRING);
3663
+ VALUE partition_id = rb_hash_aref(token, rb_id2sym(rb_intern("partition_id")));
3664
+ Check_Type(partition_id, T_FIXNUM);
3665
+ VALUE partition_uuid = rb_hash_aref(token, rb_id2sym(rb_intern("partition_uuid")));
3666
+ switch (TYPE(partition_uuid)) {
3667
+ case T_FIXNUM:
3668
+ case T_BIGNUM:
3669
+ break;
3670
+ default:
3671
+ rb_raise(rb_eArgError, "partition_uuid must be an Integer");
3672
+ }
3673
+ VALUE sequence_number = rb_hash_aref(token, rb_id2sym(rb_intern("sequence_number")));
3674
+ switch (TYPE(sequence_number)) {
3675
+ case T_FIXNUM:
3676
+ case T_BIGNUM:
3677
+ break;
3678
+ default:
3679
+ rb_raise(rb_eArgError, "sequence_number must be an Integer");
3680
+ }
3681
+ req.mutation_state.emplace_back(
3682
+ couchbase::mutation_token{ NUM2ULL(partition_uuid),
3683
+ NUM2ULL(sequence_number),
3684
+ gsl::narrow_cast<std::uint16_t>(NUM2UINT(partition_id)),
3685
+ std::string(RSTRING_PTR(bucket_name), static_cast<std::size_t>(RSTRING_LEN(bucket_name))) });
3686
+ }
3687
+ }
3688
+
3689
+ VALUE fields = rb_hash_aref(options, rb_id2sym(rb_intern("fields")));
3690
+ if (!NIL_P(fields)) {
3691
+ Check_Type(fields, T_ARRAY);
3692
+ auto fields_size = static_cast<size_t>(RARRAY_LEN(fields));
3693
+ req.fields.reserve(fields_size);
3694
+ for (size_t i = 0; i < fields_size; ++i) {
3695
+ VALUE field = rb_ary_entry(fields, static_cast<long>(i));
3696
+ Check_Type(field, T_STRING);
3697
+ req.fields.emplace_back(std::string(RSTRING_PTR(field), static_cast<std::size_t>(RSTRING_LEN(field))));
3698
+ }
3699
+ }
3700
+
3701
+ VALUE sort = rb_hash_aref(options, rb_id2sym(rb_intern("sort")));
3702
+ if (!NIL_P(sort)) {
3703
+ Check_Type(sort, T_ARRAY);
3704
+ for (size_t i = 0; i < static_cast<std::size_t>(RARRAY_LEN(sort)); ++i) {
3705
+ VALUE sort_spec = rb_ary_entry(sort, static_cast<long>(i));
3706
+ req.sort_specs.emplace_back(std::string(RSTRING_PTR(sort_spec), static_cast<std::size_t>(RSTRING_LEN(sort_spec))));
3707
+ }
3708
+ }
3709
+
3710
+ VALUE facets = rb_hash_aref(options, rb_id2sym(rb_intern("facets")));
3711
+ if (!NIL_P(facets)) {
3712
+ Check_Type(facets, T_ARRAY);
3713
+ for (size_t i = 0; i < static_cast<std::size_t>(RARRAY_LEN(facets)); ++i) {
3714
+ VALUE facet_pair = rb_ary_entry(facets, static_cast<long>(i));
3715
+ Check_Type(facet_pair, T_ARRAY);
3716
+ if (RARRAY_LEN(facet_pair) == 2) {
3717
+ VALUE facet_name = rb_ary_entry(facet_pair, 0);
3718
+ Check_Type(facet_name, T_STRING);
3719
+ VALUE facet_definition = rb_ary_entry(facet_pair, 1);
3720
+ Check_Type(facet_definition, T_STRING);
3721
+ req.facets.emplace(std::string(RSTRING_PTR(facet_name), static_cast<std::size_t>(RSTRING_LEN(facet_name))),
3722
+ std::string(RSTRING_PTR(facet_definition), static_cast<std::size_t>(RSTRING_LEN(facet_definition))));
3723
+ }
3724
+ }
3725
+ }
3726
+
3727
+ VALUE raw_params = rb_hash_aref(options, rb_id2sym(rb_intern("raw_parameters")));
3728
+ if (!NIL_P(raw_params)) {
3729
+ Check_Type(raw_params, T_HASH);
3730
+ rb_hash_foreach(raw_params, INT_FUNC(cb__for_each_named_param), reinterpret_cast<VALUE>(&req));
3731
+ }
3732
+
3733
+ auto barrier = std::make_shared<std::promise<couchbase::operations::search_response>>();
3734
+ auto f = barrier->get_future();
3735
+ backend->cluster->execute_http(req, [barrier](couchbase::operations::search_response resp) mutable { barrier->set_value(resp); });
3736
+ auto resp = f.get();
3737
+ if (resp.ec) {
3738
+ exc = cb__map_error_code(resp.ec, fmt::format("unable to perform search query for index \"{}\"", req.index_name));
3739
+ break;
3740
+ }
3741
+ VALUE res = rb_hash_new();
3742
+
3743
+ VALUE meta_data = rb_hash_new();
3744
+ rb_hash_aset(meta_data,
3745
+ rb_id2sym(rb_intern("client_context_id")),
3746
+ rb_str_new(resp.meta_data.client_context_id.data(), static_cast<long>(resp.meta_data.client_context_id.size())));
3747
+
3748
+ VALUE metrics = rb_hash_new();
3749
+ rb_hash_aset(metrics,
3750
+ rb_id2sym(rb_intern("took")),
3751
+ LONG2NUM(std::chrono::duration_cast<std::chrono::milliseconds>(resp.meta_data.metrics.took).count()));
3752
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("total_rows")), ULL2NUM(resp.meta_data.metrics.total_rows));
3753
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("max_score")), DBL2NUM(resp.meta_data.metrics.max_score));
3754
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("success_partition_count")), ULL2NUM(resp.meta_data.metrics.success_partition_count));
3755
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("error_partition_count")), ULL2NUM(resp.meta_data.metrics.error_partition_count));
3756
+ rb_hash_aset(meta_data, rb_id2sym(rb_intern("metrics")), metrics);
3757
+
3758
+ if (!resp.meta_data.errors.empty()) {
3759
+ VALUE errors = rb_hash_new();
3760
+ for (auto err : resp.meta_data.errors) {
3761
+ rb_hash_aset(errors,
3762
+ rb_str_new(err.first.data(), static_cast<long>(err.first.size())),
3763
+ rb_str_new(err.second.data(), static_cast<long>(err.second.size())));
3764
+ }
3765
+ rb_hash_aset(meta_data, rb_id2sym(rb_intern("errors")), errors);
3766
+ }
3767
+
3768
+ rb_hash_aset(res, rb_id2sym(rb_intern("meta_data")), meta_data);
3769
+
3770
+ VALUE rows = rb_ary_new_capa(static_cast<long>(resp.rows.size()));
3771
+ for (const auto& entry : resp.rows) {
3772
+ VALUE row = rb_hash_new();
3773
+ rb_hash_aset(row, rb_id2sym(rb_intern("index")), rb_str_new(entry.index.data(), static_cast<long>(entry.index.size())));
3774
+ rb_hash_aset(row, rb_id2sym(rb_intern("id")), rb_str_new(entry.id.data(), static_cast<long>(entry.id.size())));
3775
+ rb_hash_aset(row, rb_id2sym(rb_intern("score")), DBL2NUM(entry.score));
3776
+ VALUE locations = rb_ary_new_capa(static_cast<long>(entry.locations.size()));
3777
+ for (const auto& loc : entry.locations) {
3778
+ VALUE location = rb_hash_new();
3779
+ rb_hash_aset(row, rb_id2sym(rb_intern("field")), rb_str_new(loc.field.data(), static_cast<long>(loc.field.size())));
3780
+ rb_hash_aset(row, rb_id2sym(rb_intern("term")), rb_str_new(loc.term.data(), static_cast<long>(loc.term.size())));
3781
+ rb_hash_aset(row, rb_id2sym(rb_intern("pos")), ULL2NUM(loc.position));
3782
+ rb_hash_aset(row, rb_id2sym(rb_intern("start_offset")), ULL2NUM(loc.start_offset));
3783
+ rb_hash_aset(row, rb_id2sym(rb_intern("end_offset")), ULL2NUM(loc.end_offset));
3784
+ if (loc.array_positions) {
3785
+ VALUE ap = rb_ary_new_capa(static_cast<long>(loc.array_positions->size()));
3786
+ for (const auto& pos : *loc.array_positions) {
3787
+ rb_ary_push(ap, ULL2NUM(pos));
3788
+ }
3789
+ rb_hash_aset(row, rb_id2sym(rb_intern("array_positions")), ap);
3790
+ }
3791
+ rb_ary_push(locations, location);
3792
+ }
3793
+ rb_hash_aset(row, rb_id2sym(rb_intern("locations")), locations);
3794
+ if (!entry.fragments.empty()) {
3795
+ VALUE fragments = rb_hash_new();
3796
+ for (const auto& field_fragments : entry.fragments) {
3797
+ VALUE fragments_list = rb_ary_new_capa(static_cast<long>(field_fragments.second.size()));
3798
+ for (const auto& fragment : field_fragments.second) {
3799
+ rb_ary_push(fragments_list, rb_str_new(fragment.data(), static_cast<long>(fragment.size())));
3800
+ }
3801
+ rb_hash_aset(
3802
+ fragments, rb_str_new(field_fragments.first.data(), static_cast<long>(field_fragments.first.size())), fragments_list);
3803
+ }
3804
+ rb_hash_aset(row, rb_id2sym(rb_intern("fragments")), fragments);
3805
+ }
3806
+ if (!entry.fields.empty()) {
3807
+ rb_hash_aset(row, rb_id2sym(rb_intern("fields")), rb_str_new(entry.fields.data(), static_cast<long>(entry.fields.size())));
3808
+ }
3809
+ if (!entry.explanation.empty()) {
3810
+ rb_hash_aset(row,
3811
+ rb_id2sym(rb_intern("explanation")),
3812
+ rb_str_new(entry.explanation.data(), static_cast<long>(entry.explanation.size())));
3813
+ }
3814
+ rb_ary_push(rows, row);
3815
+ }
3816
+ rb_hash_aset(res, rb_id2sym(rb_intern("rows")), rows);
3817
+
3818
+ if (!resp.facets.empty()) {
3819
+ VALUE result_facets = rb_hash_new();
3820
+ for (const auto& entry : resp.facets) {
3821
+ VALUE facet = rb_hash_new();
3822
+ VALUE facet_name = rb_str_new(entry.name.data(), static_cast<long>(entry.name.size()));
3823
+ rb_hash_aset(facet, rb_id2sym(rb_intern("name")), facet_name);
3824
+ rb_hash_aset(facet, rb_id2sym(rb_intern("field")), rb_str_new(entry.field.data(), static_cast<long>(entry.field.size())));
3825
+ rb_hash_aset(facet, rb_id2sym(rb_intern("total")), ULL2NUM(entry.total));
3826
+ rb_hash_aset(facet, rb_id2sym(rb_intern("missing")), ULL2NUM(entry.missing));
3827
+ rb_hash_aset(facet, rb_id2sym(rb_intern("other")), ULL2NUM(entry.other));
3828
+ if (!entry.terms.empty()) {
3829
+ VALUE terms = rb_ary_new_capa(static_cast<long>(entry.terms.size()));
3830
+ for (const auto& item : entry.terms) {
3831
+ VALUE term = rb_hash_new();
3832
+ rb_hash_aset(term, rb_id2sym(rb_intern("term")), rb_str_new(item.term.data(), static_cast<long>(item.term.size())));
3833
+ rb_hash_aset(term, rb_id2sym(rb_intern("count")), ULL2NUM(item.count));
3834
+ rb_ary_push(terms, term);
3835
+ }
3836
+ rb_hash_aset(facet, rb_id2sym(rb_intern("terms")), terms);
3837
+ } else if (!entry.date_ranges.empty()) {
3838
+ VALUE date_ranges = rb_ary_new_capa(static_cast<long>(entry.date_ranges.size()));
3839
+ for (const auto& item : entry.date_ranges) {
3840
+ VALUE date_range = rb_hash_new();
3841
+ rb_hash_aset(
3842
+ date_range, rb_id2sym(rb_intern("name")), rb_str_new(item.name.data(), static_cast<long>(item.name.size())));
3843
+ rb_hash_aset(date_range, rb_id2sym(rb_intern("count")), ULL2NUM(item.count));
3844
+ if (item.start) {
3845
+ rb_hash_aset(date_range,
3846
+ rb_id2sym(rb_intern("start_time")),
3847
+ rb_str_new(item.start->data(), static_cast<long>(item.start->size())));
3848
+ }
3849
+ if (item.end) {
3850
+ rb_hash_aset(date_range,
3851
+ rb_id2sym(rb_intern("end_time")),
3852
+ rb_str_new(item.end->data(), static_cast<long>(item.end->size())));
3853
+ }
3854
+ rb_ary_push(date_ranges, date_range);
3855
+ }
3856
+ rb_hash_aset(facet, rb_id2sym(rb_intern("date_ranges")), date_ranges);
3857
+ } else if (!entry.numeric_ranges.empty()) {
3858
+ VALUE numeric_ranges = rb_ary_new_capa(static_cast<long>(entry.numeric_ranges.size()));
3859
+ for (const auto& item : entry.numeric_ranges) {
3860
+ VALUE numeric_range = rb_hash_new();
3861
+ rb_hash_aset(
3862
+ numeric_range, rb_id2sym(rb_intern("name")), rb_str_new(item.name.data(), static_cast<long>(item.name.size())));
3863
+ rb_hash_aset(numeric_range, rb_id2sym(rb_intern("count")), ULL2NUM(item.count));
3864
+ if (std::holds_alternative<double>(item.min)) {
3865
+ rb_hash_aset(numeric_range, rb_id2sym(rb_intern("min")), DBL2NUM(std::get<double>(item.min)));
3866
+ } else if (std::holds_alternative<std::uint64_t>(item.min)) {
3867
+ rb_hash_aset(numeric_range, rb_id2sym(rb_intern("min")), ULL2NUM(std::get<std::uint64_t>(item.min)));
3868
+ }
3869
+ if (std::holds_alternative<double>(item.max)) {
3870
+ rb_hash_aset(numeric_range, rb_id2sym(rb_intern("max")), DBL2NUM(std::get<double>(item.max)));
3871
+ } else if (std::holds_alternative<std::uint64_t>(item.max)) {
3872
+ rb_hash_aset(numeric_range, rb_id2sym(rb_intern("max")), ULL2NUM(std::get<std::uint64_t>(item.max)));
3873
+ }
3874
+ rb_ary_push(numeric_ranges, numeric_range);
3875
+ }
3876
+ rb_hash_aset(facet, rb_id2sym(rb_intern("numeric_ranges")), numeric_ranges);
3877
+ }
3878
+ rb_hash_aset(result_facets, facet_name, facet);
3879
+ }
3880
+ rb_hash_aset(res, rb_id2sym(rb_intern("facets")), result_facets);
3881
+ }
3882
+
3883
+ return res;
3884
+ } while (false);
3885
+ rb_exc_raise(exc);
3886
+ return Qnil;
3887
+ }
3888
+
3889
+ static void
3890
+ init_backend(VALUE mCouchbase)
3891
+ {
3892
+ VALUE cBackend = rb_define_class_under(mCouchbase, "Backend", rb_cBasicObject);
3893
+ rb_define_alloc_func(cBackend, cb_Backend_allocate);
3894
+ rb_define_method(cBackend, "open", VALUE_FUNC(cb_Backend_open), 3);
3895
+ rb_define_method(cBackend, "close", VALUE_FUNC(cb_Backend_close), 0);
3896
+ rb_define_method(cBackend, "open_bucket", VALUE_FUNC(cb_Backend_open_bucket), 1);
3897
+
3898
+ rb_define_method(cBackend, "document_get", VALUE_FUNC(cb_Backend_document_get), 4);
3899
+ rb_define_method(cBackend, "document_get_projected", VALUE_FUNC(cb_Backend_document_get_projected), 7);
3900
+ rb_define_method(cBackend, "document_get_and_lock", VALUE_FUNC(cb_Backend_document_get_and_lock), 5);
3901
+ rb_define_method(cBackend, "document_get_and_touch", VALUE_FUNC(cb_Backend_document_get_and_touch), 5);
3902
+ rb_define_method(cBackend, "document_insert", VALUE_FUNC(cb_Backend_document_insert), 7);
3903
+ rb_define_method(cBackend, "document_replace", VALUE_FUNC(cb_Backend_document_replace), 7);
3904
+ rb_define_method(cBackend, "document_upsert", VALUE_FUNC(cb_Backend_document_upsert), 7);
3905
+ rb_define_method(cBackend, "document_remove", VALUE_FUNC(cb_Backend_document_remove), 5);
3906
+ rb_define_method(cBackend, "document_lookup_in", VALUE_FUNC(cb_Backend_document_lookup_in), 6);
3907
+ rb_define_method(cBackend, "document_mutate_in", VALUE_FUNC(cb_Backend_document_mutate_in), 7);
3908
+ rb_define_method(cBackend, "document_query", VALUE_FUNC(cb_Backend_document_query), 2);
3909
+ rb_define_method(cBackend, "document_touch", VALUE_FUNC(cb_Backend_document_touch), 5);
3910
+ rb_define_method(cBackend, "document_exists", VALUE_FUNC(cb_Backend_document_exists), 4);
3911
+ rb_define_method(cBackend, "document_unlock", VALUE_FUNC(cb_Backend_document_unlock), 5);
3912
+ rb_define_method(cBackend, "document_increment", VALUE_FUNC(cb_Backend_document_increment), 5);
3913
+ rb_define_method(cBackend, "document_decrement", VALUE_FUNC(cb_Backend_document_decrement), 5);
3914
+ rb_define_method(cBackend, "document_search", VALUE_FUNC(cb_Backend_document_search), 3);
3915
+
3916
+ rb_define_method(cBackend, "bucket_create", VALUE_FUNC(cb_Backend_bucket_create), 2);
3917
+ rb_define_method(cBackend, "bucket_update", VALUE_FUNC(cb_Backend_bucket_update), 2);
3918
+ rb_define_method(cBackend, "bucket_drop", VALUE_FUNC(cb_Backend_bucket_drop), 2);
3919
+ rb_define_method(cBackend, "bucket_flush", VALUE_FUNC(cb_Backend_bucket_flush), 2);
3920
+ rb_define_method(cBackend, "bucket_get_all", VALUE_FUNC(cb_Backend_bucket_get_all), 1);
3921
+ rb_define_method(cBackend, "bucket_get", VALUE_FUNC(cb_Backend_bucket_get), 2);
3922
+
3923
+ rb_define_method(cBackend, "cluster_enable_developer_preview!", VALUE_FUNC(cb_Backend_cluster_enable_developer_preview), 0);
3924
+
3925
+ rb_define_method(cBackend, "scope_get_all", VALUE_FUNC(cb_Backend_scope_get_all), 2);
3926
+ rb_define_method(cBackend, "scope_create", VALUE_FUNC(cb_Backend_scope_create), 3);
3927
+ rb_define_method(cBackend, "scope_drop", VALUE_FUNC(cb_Backend_scope_drop), 3);
3928
+ rb_define_method(cBackend, "collection_create", VALUE_FUNC(cb_Backend_collection_create), 5);
3929
+ rb_define_method(cBackend, "collection_drop", VALUE_FUNC(cb_Backend_collection_drop), 4);
3930
+
3931
+ rb_define_method(cBackend, "query_index_get_all", VALUE_FUNC(cb_Backend_query_index_get_all), 2);
3932
+ rb_define_method(cBackend, "query_index_create", VALUE_FUNC(cb_Backend_query_index_create), 5);
3933
+ rb_define_method(cBackend, "query_index_create_primary", VALUE_FUNC(cb_Backend_query_index_create_primary), 3);
3934
+ rb_define_method(cBackend, "query_index_drop", VALUE_FUNC(cb_Backend_query_index_drop), 4);
3935
+ rb_define_method(cBackend, "query_index_drop_primary", VALUE_FUNC(cb_Backend_query_index_drop_primary), 3);
3936
+ rb_define_method(cBackend, "query_index_build_deferred", VALUE_FUNC(cb_Backend_query_index_build_deferred), 2);
3937
+ rb_define_method(cBackend, "query_index_watch", VALUE_FUNC(cb_Backend_query_index_watch), 4);
3938
+
3939
+ rb_define_method(cBackend, "search_index_get_all", VALUE_FUNC(cb_Backend_search_index_get_all), 1);
3940
+ rb_define_method(cBackend, "search_index_get", VALUE_FUNC(cb_Backend_search_index_get), 2);
3941
+ rb_define_method(cBackend, "search_index_upsert", VALUE_FUNC(cb_Backend_search_index_upsert), 2);
3942
+ rb_define_method(cBackend, "search_index_drop", VALUE_FUNC(cb_Backend_search_index_drop), 2);
3943
+ rb_define_method(cBackend, "search_index_get_documents_count", VALUE_FUNC(cb_Backend_search_index_get_documents_count), 2);
3944
+ rb_define_method(cBackend, "search_index_pause_ingest", VALUE_FUNC(cb_Backend_search_index_pause_ingest), 2);
3945
+ rb_define_method(cBackend, "search_index_resume_ingest", VALUE_FUNC(cb_Backend_search_index_resume_ingest), 2);
3946
+ rb_define_method(cBackend, "search_index_allow_querying", VALUE_FUNC(cb_Backend_search_index_allow_querying), 2);
3947
+ rb_define_method(cBackend, "search_index_disallow_querying", VALUE_FUNC(cb_Backend_search_index_disallow_querying), 2);
3948
+ rb_define_method(cBackend, "search_index_freeze_plan", VALUE_FUNC(cb_Backend_search_index_freeze_plan), 2);
3949
+ rb_define_method(cBackend, "search_index_unfreeze_plan", VALUE_FUNC(cb_Backend_search_index_unfreeze_plan), 2);
3950
+ rb_define_method(cBackend, "search_index_analyze_document", VALUE_FUNC(cb_Backend_search_index_analyze_document), 3);
3951
+ }
3952
+
3953
+ extern "C" {
3954
+ void
3955
+ Init_libcouchbase(void)
3956
+ {
3957
+ auto env_val = spdlog::details::os::getenv("SPDLOG_LEVEL");
3958
+ if (env_val.empty()) {
3959
+ spdlog::set_level(spdlog::level::critical);
3960
+ } else {
3961
+ spdlog::cfg::load_env_levels();
3962
+ }
3963
+ spdlog::set_pattern("[%Y-%m-%d %T.%e] [%P,%t] [%^%l%$] %v");
3964
+
3965
+ VALUE mCouchbase = rb_define_module("Couchbase");
3966
+ init_versions(mCouchbase);
3967
+ init_backend(mCouchbase);
3968
+ init_exceptions(mCouchbase);
3969
+ }
3970
+ }