couchbase 1.3.12 → 3.0.0.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2140) hide show
  1. checksums.yaml +5 -13
  2. data/.github/workflows/tests-6.0.3.yml +49 -0
  3. data/.github/workflows/tests.yml +47 -0
  4. data/.gitignore +17 -12
  5. data/.gitmodules +18 -0
  6. data/.idea/.gitignore +5 -0
  7. data/.idea/dictionaries/gem_terms.xml +18 -0
  8. data/.idea/inspectionProfiles/Project_Default.xml +8 -0
  9. data/.idea/vcs.xml +12 -0
  10. data/Gemfile +22 -2
  11. data/LICENSE.txt +202 -0
  12. data/README.md +60 -0
  13. data/Rakefile +42 -15
  14. data/bin/console +21 -0
  15. data/bin/init-cluster +62 -0
  16. data/bin/setup +24 -0
  17. data/couchbase.gemspec +37 -41
  18. data/examples/crud.rb +20 -0
  19. data/examples/managing_buckets.rb +47 -0
  20. data/examples/managing_collections.rb +58 -0
  21. data/examples/managing_query_indexes.rb +63 -0
  22. data/examples/query.rb +18 -0
  23. data/examples/query_with_consistency.rb +76 -0
  24. data/examples/subdocument.rb +51 -0
  25. data/ext/.clang-format +15 -0
  26. data/ext/.clang-tidy +20 -0
  27. data/ext/.cmake-format.yaml +8 -0
  28. data/ext/.gitignore +2 -0
  29. data/ext/.idea/.name +1 -0
  30. data/ext/.idea/dictionaries/couchbase_terms.xml +14 -0
  31. data/ext/.idea/ext.iml +2 -0
  32. data/ext/.idea/misc.xml +4 -0
  33. data/ext/.idea/modules.xml +8 -0
  34. data/ext/.idea/vcs.xml +12 -0
  35. data/ext/CMakeLists.txt +163 -0
  36. data/ext/LICENSE.txt +202 -0
  37. data/ext/build_version.hxx.in +26 -0
  38. data/ext/couchbase/bucket.hxx +136 -0
  39. data/ext/couchbase/cbcrypto/cbcrypto.cc +888 -0
  40. data/ext/couchbase/cbcrypto/cbcrypto.h +89 -0
  41. data/ext/couchbase/cbsasl/client.cc +48 -0
  42. data/ext/couchbase/cbsasl/client.h +127 -0
  43. data/ext/couchbase/cbsasl/context.cc +33 -0
  44. data/ext/couchbase/cbsasl/context.h +52 -0
  45. data/ext/couchbase/cbsasl/error.h +72 -0
  46. data/ext/couchbase/cbsasl/mechanism.cc +48 -0
  47. data/ext/couchbase/cbsasl/mechanism.h +55 -0
  48. data/ext/couchbase/cbsasl/plain/plain.cc +36 -0
  49. data/ext/couchbase/cbsasl/plain/plain.h +53 -0
  50. data/ext/couchbase/cbsasl/scram-sha/scram-sha.cc +390 -0
  51. data/ext/couchbase/cbsasl/scram-sha/scram-sha.h +185 -0
  52. data/ext/couchbase/cbsasl/scram-sha/stringutils.cc +81 -0
  53. data/ext/couchbase/cbsasl/scram-sha/stringutils.h +48 -0
  54. data/ext/couchbase/cluster.hxx +175 -0
  55. data/ext/couchbase/collections_manifest.hxx +88 -0
  56. data/ext/couchbase/configuration.hxx +256 -0
  57. data/ext/couchbase/configuration_monitor.hxx +93 -0
  58. data/ext/couchbase/couchbase.cxx +2760 -0
  59. data/ext/couchbase/document_id.hxx +38 -0
  60. data/ext/couchbase/error_map.hxx +61 -0
  61. data/ext/couchbase/errors.hxx +691 -0
  62. data/ext/couchbase/io/http_message.hxx +38 -0
  63. data/ext/couchbase/io/http_parser.hxx +174 -0
  64. data/ext/couchbase/io/http_session.hxx +284 -0
  65. data/ext/couchbase/io/mcbp_message.hxx +41 -0
  66. data/ext/couchbase/io/mcbp_parser.hxx +99 -0
  67. data/ext/couchbase/io/mcbp_session.hxx +859 -0
  68. data/ext/couchbase/io/session_manager.hxx +122 -0
  69. data/ext/couchbase/mutation_token.hxx +38 -0
  70. data/ext/couchbase/operations.hxx +59 -0
  71. data/ext/couchbase/operations/bucket_create.hxx +138 -0
  72. data/ext/couchbase/operations/bucket_drop.hxx +65 -0
  73. data/ext/couchbase/operations/bucket_flush.hxx +65 -0
  74. data/ext/couchbase/operations/bucket_get.hxx +69 -0
  75. data/ext/couchbase/operations/bucket_get_all.hxx +62 -0
  76. data/ext/couchbase/operations/bucket_settings.hxx +111 -0
  77. data/ext/couchbase/operations/bucket_update.hxx +115 -0
  78. data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +60 -0
  79. data/ext/couchbase/operations/collection_create.hxx +86 -0
  80. data/ext/couchbase/operations/collection_drop.hxx +82 -0
  81. data/ext/couchbase/operations/command.hxx +77 -0
  82. data/ext/couchbase/operations/document_decrement.hxx +80 -0
  83. data/ext/couchbase/operations/document_exists.hxx +80 -0
  84. data/ext/couchbase/operations/document_get.hxx +62 -0
  85. data/ext/couchbase/operations/document_get_and_lock.hxx +64 -0
  86. data/ext/couchbase/operations/document_get_and_touch.hxx +64 -0
  87. data/ext/couchbase/operations/document_increment.hxx +80 -0
  88. data/ext/couchbase/operations/document_insert.hxx +74 -0
  89. data/ext/couchbase/operations/document_lookup_in.hxx +85 -0
  90. data/ext/couchbase/operations/document_mutate_in.hxx +96 -0
  91. data/ext/couchbase/operations/document_query.hxx +325 -0
  92. data/ext/couchbase/operations/document_remove.hxx +67 -0
  93. data/ext/couchbase/operations/document_replace.hxx +76 -0
  94. data/ext/couchbase/operations/document_touch.hxx +60 -0
  95. data/ext/couchbase/operations/document_unlock.hxx +60 -0
  96. data/ext/couchbase/operations/document_upsert.hxx +74 -0
  97. data/ext/couchbase/operations/query_index_build_deferred.hxx +85 -0
  98. data/ext/couchbase/operations/query_index_create.hxx +134 -0
  99. data/ext/couchbase/operations/query_index_drop.hxx +108 -0
  100. data/ext/couchbase/operations/query_index_get_all.hxx +106 -0
  101. data/ext/couchbase/operations/scope_create.hxx +81 -0
  102. data/ext/couchbase/operations/scope_drop.hxx +79 -0
  103. data/ext/couchbase/operations/scope_get_all.hxx +72 -0
  104. data/ext/couchbase/platform/base64.cc +234 -0
  105. data/ext/couchbase/platform/base64.h +47 -0
  106. data/ext/couchbase/platform/random.cc +119 -0
  107. data/ext/couchbase/platform/random.h +39 -0
  108. data/ext/couchbase/platform/string_hex.cc +99 -0
  109. data/ext/couchbase/platform/string_hex.h +50 -0
  110. data/ext/couchbase/platform/uuid.cc +96 -0
  111. data/ext/couchbase/platform/uuid.h +56 -0
  112. data/ext/couchbase/protocol/client_opcode.hxx +250 -0
  113. data/ext/couchbase/protocol/client_request.hxx +160 -0
  114. data/ext/couchbase/protocol/client_response.hxx +218 -0
  115. data/ext/couchbase/protocol/cmd_cluster_map_change_notification.hxx +81 -0
  116. data/ext/couchbase/protocol/cmd_decrement.hxx +187 -0
  117. data/ext/couchbase/protocol/cmd_exists.hxx +171 -0
  118. data/ext/couchbase/protocol/cmd_get.hxx +122 -0
  119. data/ext/couchbase/protocol/cmd_get_and_lock.hxx +142 -0
  120. data/ext/couchbase/protocol/cmd_get_and_touch.hxx +142 -0
  121. data/ext/couchbase/protocol/cmd_get_cluster_config.hxx +124 -0
  122. data/ext/couchbase/protocol/cmd_get_collections_manifest.hxx +99 -0
  123. data/ext/couchbase/protocol/cmd_get_error_map.hxx +126 -0
  124. data/ext/couchbase/protocol/cmd_hello.hxx +146 -0
  125. data/ext/couchbase/protocol/cmd_increment.hxx +187 -0
  126. data/ext/couchbase/protocol/cmd_info.hxx +36 -0
  127. data/ext/couchbase/protocol/cmd_insert.hxx +172 -0
  128. data/ext/couchbase/protocol/cmd_lookup_in.hxx +218 -0
  129. data/ext/couchbase/protocol/cmd_mutate_in.hxx +317 -0
  130. data/ext/couchbase/protocol/cmd_remove.hxx +134 -0
  131. data/ext/couchbase/protocol/cmd_replace.hxx +172 -0
  132. data/ext/couchbase/protocol/cmd_sasl_auth.hxx +106 -0
  133. data/ext/couchbase/protocol/cmd_sasl_list_mechs.hxx +100 -0
  134. data/ext/couchbase/protocol/cmd_sasl_step.hxx +104 -0
  135. data/ext/couchbase/protocol/cmd_select_bucket.hxx +85 -0
  136. data/ext/couchbase/protocol/cmd_touch.hxx +102 -0
  137. data/ext/couchbase/protocol/cmd_unlock.hxx +95 -0
  138. data/ext/couchbase/protocol/cmd_upsert.hxx +172 -0
  139. data/ext/couchbase/protocol/datatype.hxx +48 -0
  140. data/ext/couchbase/protocol/durability_level.hxx +67 -0
  141. data/ext/couchbase/protocol/frame_info_id.hxx +187 -0
  142. data/ext/couchbase/protocol/hello_feature.hxx +255 -0
  143. data/ext/couchbase/protocol/magic.hxx +83 -0
  144. data/ext/couchbase/protocol/server_opcode.hxx +57 -0
  145. data/ext/couchbase/protocol/server_request.hxx +122 -0
  146. data/ext/couchbase/protocol/status.hxx +333 -0
  147. data/ext/couchbase/protocol/unsigned_leb128.h +195 -0
  148. data/ext/couchbase/service_type.hxx +23 -0
  149. data/ext/couchbase/utils/byteswap.hxx +33 -0
  150. data/ext/couchbase/utils/crc32.hxx +48 -0
  151. data/ext/couchbase/utils/url_codec.hxx +225 -0
  152. data/ext/couchbase/version.hxx +24 -0
  153. data/ext/extconf.rb +47 -0
  154. data/ext/test/main.cxx +67 -0
  155. data/ext/third_party/asio/.appveyor.yml +107 -0
  156. data/ext/third_party/asio/.cirrus.yml +16 -0
  157. data/ext/third_party/asio/.gitignore +3 -0
  158. data/ext/third_party/asio/.travis.yml +323 -0
  159. data/ext/third_party/asio/asio/.gitignore +23 -0
  160. data/ext/third_party/asio/asio/COPYING +4 -0
  161. data/ext/third_party/asio/asio/INSTALL +5 -0
  162. data/ext/third_party/asio/asio/LICENSE_1_0.txt +23 -0
  163. data/ext/third_party/asio/asio/Makefile.am +19 -0
  164. data/ext/third_party/asio/asio/README +4 -0
  165. data/ext/third_party/asio/asio/asio.manifest +4865 -0
  166. data/ext/third_party/asio/asio/autogen.sh +55 -0
  167. data/ext/third_party/asio/asio/boost_asio.manifest +5193 -0
  168. data/ext/third_party/asio/asio/boostify.pl +603 -0
  169. data/ext/third_party/asio/asio/configure.ac +182 -0
  170. data/ext/third_party/asio/asio/include/.gitignore +2 -0
  171. data/ext/third_party/asio/asio/include/Makefile.am +484 -0
  172. data/ext/third_party/asio/asio/include/asio.hpp +147 -0
  173. data/ext/third_party/asio/asio/include/asio/associated_allocator.hpp +131 -0
  174. data/ext/third_party/asio/asio/include/asio/associated_executor.hpp +149 -0
  175. data/ext/third_party/asio/asio/include/asio/async_result.hpp +589 -0
  176. data/ext/third_party/asio/asio/include/asio/awaitable.hpp +123 -0
  177. data/ext/third_party/asio/asio/include/asio/basic_datagram_socket.hpp +1210 -0
  178. data/ext/third_party/asio/asio/include/asio/basic_deadline_timer.hpp +693 -0
  179. data/ext/third_party/asio/asio/include/asio/basic_io_object.hpp +290 -0
  180. data/ext/third_party/asio/asio/include/asio/basic_raw_socket.hpp +1202 -0
  181. data/ext/third_party/asio/asio/include/asio/basic_seq_packet_socket.hpp +756 -0
  182. data/ext/third_party/asio/asio/include/asio/basic_serial_port.hpp +907 -0
  183. data/ext/third_party/asio/asio/include/asio/basic_signal_set.hpp +568 -0
  184. data/ext/third_party/asio/asio/include/asio/basic_socket.hpp +1894 -0
  185. data/ext/third_party/asio/asio/include/asio/basic_socket_acceptor.hpp +2495 -0
  186. data/ext/third_party/asio/asio/include/asio/basic_socket_iostream.hpp +407 -0
  187. data/ext/third_party/asio/asio/include/asio/basic_socket_streambuf.hpp +687 -0
  188. data/ext/third_party/asio/asio/include/asio/basic_stream_socket.hpp +1049 -0
  189. data/ext/third_party/asio/asio/include/asio/basic_streambuf.hpp +452 -0
  190. data/ext/third_party/asio/asio/include/asio/basic_streambuf_fwd.hpp +36 -0
  191. data/ext/third_party/asio/asio/include/asio/basic_waitable_timer.hpp +763 -0
  192. data/ext/third_party/asio/asio/include/asio/bind_executor.hpp +580 -0
  193. data/ext/third_party/asio/asio/include/asio/buffer.hpp +2494 -0
  194. data/ext/third_party/asio/asio/include/asio/buffered_read_stream.hpp +253 -0
  195. data/ext/third_party/asio/asio/include/asio/buffered_read_stream_fwd.hpp +25 -0
  196. data/ext/third_party/asio/asio/include/asio/buffered_stream.hpp +279 -0
  197. data/ext/third_party/asio/asio/include/asio/buffered_stream_fwd.hpp +25 -0
  198. data/ext/third_party/asio/asio/include/asio/buffered_write_stream.hpp +245 -0
  199. data/ext/third_party/asio/asio/include/asio/buffered_write_stream_fwd.hpp +25 -0
  200. data/ext/third_party/asio/asio/include/asio/buffers_iterator.hpp +521 -0
  201. data/ext/third_party/asio/asio/include/asio/co_spawn.hpp +100 -0
  202. data/ext/third_party/asio/asio/include/asio/completion_condition.hpp +218 -0
  203. data/ext/third_party/asio/asio/include/asio/compose.hpp +136 -0
  204. data/ext/third_party/asio/asio/include/asio/connect.hpp +1076 -0
  205. data/ext/third_party/asio/asio/include/asio/coroutine.hpp +328 -0
  206. data/ext/third_party/asio/asio/include/asio/deadline_timer.hpp +38 -0
  207. data/ext/third_party/asio/asio/include/asio/defer.hpp +127 -0
  208. data/ext/third_party/asio/asio/include/asio/detached.hpp +62 -0
  209. data/ext/third_party/asio/asio/include/asio/detail/array.hpp +38 -0
  210. data/ext/third_party/asio/asio/include/asio/detail/array_fwd.hpp +34 -0
  211. data/ext/third_party/asio/asio/include/asio/detail/assert.hpp +32 -0
  212. data/ext/third_party/asio/asio/include/asio/detail/atomic_count.hpp +45 -0
  213. data/ext/third_party/asio/asio/include/asio/detail/base_from_completion_cond.hpp +69 -0
  214. data/ext/third_party/asio/asio/include/asio/detail/bind_handler.hpp +816 -0
  215. data/ext/third_party/asio/asio/include/asio/detail/buffer_resize_guard.hpp +66 -0
  216. data/ext/third_party/asio/asio/include/asio/detail/buffer_sequence_adapter.hpp +544 -0
  217. data/ext/third_party/asio/asio/include/asio/detail/buffered_stream_storage.hpp +126 -0
  218. data/ext/third_party/asio/asio/include/asio/detail/call_stack.hpp +125 -0
  219. data/ext/third_party/asio/asio/include/asio/detail/chrono.hpp +66 -0
  220. data/ext/third_party/asio/asio/include/asio/detail/chrono_time_traits.hpp +190 -0
  221. data/ext/third_party/asio/asio/include/asio/detail/completion_handler.hpp +83 -0
  222. data/ext/third_party/asio/asio/include/asio/detail/concurrency_hint.hpp +94 -0
  223. data/ext/third_party/asio/asio/include/asio/detail/conditionally_enabled_event.hpp +112 -0
  224. data/ext/third_party/asio/asio/include/asio/detail/conditionally_enabled_mutex.hpp +149 -0
  225. data/ext/third_party/asio/asio/include/asio/detail/config.hpp +1499 -0
  226. data/ext/third_party/asio/asio/include/asio/detail/consuming_buffers.hpp +414 -0
  227. data/ext/third_party/asio/asio/include/asio/detail/cstddef.hpp +31 -0
  228. data/ext/third_party/asio/asio/include/asio/detail/cstdint.hpp +60 -0
  229. data/ext/third_party/asio/asio/include/asio/detail/date_time_fwd.hpp +34 -0
  230. data/ext/third_party/asio/asio/include/asio/detail/deadline_timer_service.hpp +280 -0
  231. data/ext/third_party/asio/asio/include/asio/detail/dependent_type.hpp +36 -0
  232. data/ext/third_party/asio/asio/include/asio/detail/descriptor_ops.hpp +121 -0
  233. data/ext/third_party/asio/asio/include/asio/detail/descriptor_read_op.hpp +130 -0
  234. data/ext/third_party/asio/asio/include/asio/detail/descriptor_write_op.hpp +130 -0
  235. data/ext/third_party/asio/asio/include/asio/detail/dev_poll_reactor.hpp +218 -0
  236. data/ext/third_party/asio/asio/include/asio/detail/epoll_reactor.hpp +266 -0
  237. data/ext/third_party/asio/asio/include/asio/detail/event.hpp +48 -0
  238. data/ext/third_party/asio/asio/include/asio/detail/eventfd_select_interrupter.hpp +83 -0
  239. data/ext/third_party/asio/asio/include/asio/detail/executor_function.hpp +104 -0
  240. data/ext/third_party/asio/asio/include/asio/detail/executor_op.hpp +84 -0
  241. data/ext/third_party/asio/asio/include/asio/detail/fd_set_adapter.hpp +39 -0
  242. data/ext/third_party/asio/asio/include/asio/detail/fenced_block.hpp +80 -0
  243. data/ext/third_party/asio/asio/include/asio/detail/functional.hpp +38 -0
  244. data/ext/third_party/asio/asio/include/asio/detail/future.hpp +33 -0
  245. data/ext/third_party/asio/asio/include/asio/detail/gcc_arm_fenced_block.hpp +91 -0
  246. data/ext/third_party/asio/asio/include/asio/detail/gcc_hppa_fenced_block.hpp +68 -0
  247. data/ext/third_party/asio/asio/include/asio/detail/gcc_sync_fenced_block.hpp +65 -0
  248. data/ext/third_party/asio/asio/include/asio/detail/gcc_x86_fenced_block.hpp +99 -0
  249. data/ext/third_party/asio/asio/include/asio/detail/global.hpp +52 -0
  250. data/ext/third_party/asio/asio/include/asio/detail/handler_alloc_helpers.hpp +242 -0
  251. data/ext/third_party/asio/asio/include/asio/detail/handler_cont_helpers.hpp +45 -0
  252. data/ext/third_party/asio/asio/include/asio/detail/handler_invoke_helpers.hpp +57 -0
  253. data/ext/third_party/asio/asio/include/asio/detail/handler_tracking.hpp +238 -0
  254. data/ext/third_party/asio/asio/include/asio/detail/handler_type_requirements.hpp +556 -0
  255. data/ext/third_party/asio/asio/include/asio/detail/handler_work.hpp +113 -0
  256. data/ext/third_party/asio/asio/include/asio/detail/hash_map.hpp +331 -0
  257. data/ext/third_party/asio/asio/include/asio/detail/impl/buffer_sequence_adapter.ipp +118 -0
  258. data/ext/third_party/asio/asio/include/asio/detail/impl/descriptor_ops.ipp +474 -0
  259. data/ext/third_party/asio/asio/include/asio/detail/impl/dev_poll_reactor.hpp +91 -0
  260. data/ext/third_party/asio/asio/include/asio/detail/impl/dev_poll_reactor.ipp +446 -0
  261. data/ext/third_party/asio/asio/include/asio/detail/impl/epoll_reactor.hpp +89 -0
  262. data/ext/third_party/asio/asio/include/asio/detail/impl/epoll_reactor.ipp +787 -0
  263. data/ext/third_party/asio/asio/include/asio/detail/impl/eventfd_select_interrupter.ipp +169 -0
  264. data/ext/third_party/asio/asio/include/asio/detail/impl/handler_tracking.ipp +358 -0
  265. data/ext/third_party/asio/asio/include/asio/detail/impl/kqueue_reactor.hpp +93 -0
  266. data/ext/third_party/asio/asio/include/asio/detail/impl/kqueue_reactor.ipp +570 -0
  267. data/ext/third_party/asio/asio/include/asio/detail/impl/null_event.ipp +74 -0
  268. data/ext/third_party/asio/asio/include/asio/detail/impl/pipe_select_interrupter.ipp +129 -0
  269. data/ext/third_party/asio/asio/include/asio/detail/impl/posix_event.ipp +59 -0
  270. data/ext/third_party/asio/asio/include/asio/detail/impl/posix_mutex.ipp +46 -0
  271. data/ext/third_party/asio/asio/include/asio/detail/impl/posix_thread.ipp +84 -0
  272. data/ext/third_party/asio/asio/include/asio/detail/impl/posix_tss_ptr.ipp +46 -0
  273. data/ext/third_party/asio/asio/include/asio/detail/impl/reactive_descriptor_service.ipp +223 -0
  274. data/ext/third_party/asio/asio/include/asio/detail/impl/reactive_serial_port_service.ipp +152 -0
  275. data/ext/third_party/asio/asio/include/asio/detail/impl/reactive_socket_service_base.ipp +300 -0
  276. data/ext/third_party/asio/asio/include/asio/detail/impl/resolver_service_base.ipp +158 -0
  277. data/ext/third_party/asio/asio/include/asio/detail/impl/scheduler.ipp +617 -0
  278. data/ext/third_party/asio/asio/include/asio/detail/impl/select_reactor.hpp +100 -0
  279. data/ext/third_party/asio/asio/include/asio/detail/impl/select_reactor.ipp +338 -0
  280. data/ext/third_party/asio/asio/include/asio/detail/impl/service_registry.hpp +94 -0
  281. data/ext/third_party/asio/asio/include/asio/detail/impl/service_registry.ipp +197 -0
  282. data/ext/third_party/asio/asio/include/asio/detail/impl/signal_set_service.ipp +667 -0
  283. data/ext/third_party/asio/asio/include/asio/detail/impl/socket_ops.ipp +3575 -0
  284. data/ext/third_party/asio/asio/include/asio/detail/impl/socket_select_interrupter.ipp +185 -0
  285. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_executor_service.hpp +179 -0
  286. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_executor_service.ipp +134 -0
  287. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_service.hpp +118 -0
  288. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_service.ipp +177 -0
  289. data/ext/third_party/asio/asio/include/asio/detail/impl/throw_error.ipp +60 -0
  290. data/ext/third_party/asio/asio/include/asio/detail/impl/timer_queue_ptime.ipp +91 -0
  291. data/ext/third_party/asio/asio/include/asio/detail/impl/timer_queue_set.ipp +101 -0
  292. data/ext/third_party/asio/asio/include/asio/detail/impl/win_event.ipp +76 -0
  293. data/ext/third_party/asio/asio/include/asio/detail/impl/win_iocp_handle_service.ipp +525 -0
  294. data/ext/third_party/asio/asio/include/asio/detail/impl/win_iocp_io_context.hpp +103 -0
  295. data/ext/third_party/asio/asio/include/asio/detail/impl/win_iocp_io_context.ipp +594 -0
  296. data/ext/third_party/asio/asio/include/asio/detail/impl/win_iocp_serial_port_service.ipp +192 -0
  297. data/ext/third_party/asio/asio/include/asio/detail/impl/win_iocp_socket_service_base.ipp +801 -0
  298. data/ext/third_party/asio/asio/include/asio/detail/impl/win_mutex.ipp +84 -0
  299. data/ext/third_party/asio/asio/include/asio/detail/impl/win_object_handle_service.ipp +448 -0
  300. data/ext/third_party/asio/asio/include/asio/detail/impl/win_static_mutex.ipp +136 -0
  301. data/ext/third_party/asio/asio/include/asio/detail/impl/win_thread.ipp +150 -0
  302. data/ext/third_party/asio/asio/include/asio/detail/impl/win_tss_ptr.ipp +57 -0
  303. data/ext/third_party/asio/asio/include/asio/detail/impl/winrt_ssocket_service_base.ipp +626 -0
  304. data/ext/third_party/asio/asio/include/asio/detail/impl/winrt_timer_scheduler.hpp +92 -0
  305. data/ext/third_party/asio/asio/include/asio/detail/impl/winrt_timer_scheduler.ipp +121 -0
  306. data/ext/third_party/asio/asio/include/asio/detail/impl/winsock_init.ipp +82 -0
  307. data/ext/third_party/asio/asio/include/asio/detail/io_control.hpp +84 -0
  308. data/ext/third_party/asio/asio/include/asio/detail/io_object_executor.hpp +167 -0
  309. data/ext/third_party/asio/asio/include/asio/detail/io_object_impl.hpp +193 -0
  310. data/ext/third_party/asio/asio/include/asio/detail/is_buffer_sequence.hpp +312 -0
  311. data/ext/third_party/asio/asio/include/asio/detail/is_executor.hpp +126 -0
  312. data/ext/third_party/asio/asio/include/asio/detail/keyword_tss_ptr.hpp +70 -0
  313. data/ext/third_party/asio/asio/include/asio/detail/kqueue_reactor.hpp +242 -0
  314. data/ext/third_party/asio/asio/include/asio/detail/limits.hpp +26 -0
  315. data/ext/third_party/asio/asio/include/asio/detail/local_free_on_block_exit.hpp +59 -0
  316. data/ext/third_party/asio/asio/include/asio/detail/macos_fenced_block.hpp +62 -0
  317. data/ext/third_party/asio/asio/include/asio/detail/memory.hpp +70 -0
  318. data/ext/third_party/asio/asio/include/asio/detail/mutex.hpp +48 -0
  319. data/ext/third_party/asio/asio/include/asio/detail/non_const_lvalue.hpp +54 -0
  320. data/ext/third_party/asio/asio/include/asio/detail/noncopyable.hpp +43 -0
  321. data/ext/third_party/asio/asio/include/asio/detail/null_event.hpp +100 -0
  322. data/ext/third_party/asio/asio/include/asio/detail/null_fenced_block.hpp +47 -0
  323. data/ext/third_party/asio/asio/include/asio/detail/null_global.hpp +59 -0
  324. data/ext/third_party/asio/asio/include/asio/detail/null_mutex.hpp +64 -0
  325. data/ext/third_party/asio/asio/include/asio/detail/null_reactor.hpp +68 -0
  326. data/ext/third_party/asio/asio/include/asio/detail/null_signal_blocker.hpp +69 -0
  327. data/ext/third_party/asio/asio/include/asio/detail/null_socket_service.hpp +519 -0
  328. data/ext/third_party/asio/asio/include/asio/detail/null_static_mutex.hpp +60 -0
  329. data/ext/third_party/asio/asio/include/asio/detail/null_thread.hpp +67 -0
  330. data/ext/third_party/asio/asio/include/asio/detail/null_tss_ptr.hpp +68 -0
  331. data/ext/third_party/asio/asio/include/asio/detail/object_pool.hpp +171 -0
  332. data/ext/third_party/asio/asio/include/asio/detail/old_win_sdk_compat.hpp +214 -0
  333. data/ext/third_party/asio/asio/include/asio/detail/op_queue.hpp +162 -0
  334. data/ext/third_party/asio/asio/include/asio/detail/operation.hpp +38 -0
  335. data/ext/third_party/asio/asio/include/asio/detail/pipe_select_interrupter.hpp +89 -0
  336. data/ext/third_party/asio/asio/include/asio/detail/pop_options.hpp +141 -0
  337. data/ext/third_party/asio/asio/include/asio/detail/posix_event.hpp +162 -0
  338. data/ext/third_party/asio/asio/include/asio/detail/posix_fd_set_adapter.hpp +118 -0
  339. data/ext/third_party/asio/asio/include/asio/detail/posix_global.hpp +80 -0
  340. data/ext/third_party/asio/asio/include/asio/detail/posix_mutex.hpp +76 -0
  341. data/ext/third_party/asio/asio/include/asio/detail/posix_signal_blocker.hpp +85 -0
  342. data/ext/third_party/asio/asio/include/asio/detail/posix_static_mutex.hpp +64 -0
  343. data/ext/third_party/asio/asio/include/asio/detail/posix_thread.hpp +109 -0
  344. data/ext/third_party/asio/asio/include/asio/detail/posix_tss_ptr.hpp +79 -0
  345. data/ext/third_party/asio/asio/include/asio/detail/push_options.hpp +185 -0
  346. data/ext/third_party/asio/asio/include/asio/detail/reactive_descriptor_service.hpp +391 -0
  347. data/ext/third_party/asio/asio/include/asio/detail/reactive_null_buffers_op.hpp +92 -0
  348. data/ext/third_party/asio/asio/include/asio/detail/reactive_serial_port_service.hpp +238 -0
  349. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_accept_op.hpp +230 -0
  350. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_connect_op.hpp +116 -0
  351. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_recv_op.hpp +137 -0
  352. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_recvfrom_op.hpp +142 -0
  353. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_recvmsg_op.hpp +135 -0
  354. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_send_op.hpp +136 -0
  355. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_sendto_op.hpp +134 -0
  356. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_service.hpp +505 -0
  357. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_service_base.hpp +518 -0
  358. data/ext/third_party/asio/asio/include/asio/detail/reactive_wait_op.hpp +92 -0
  359. data/ext/third_party/asio/asio/include/asio/detail/reactor.hpp +32 -0
  360. data/ext/third_party/asio/asio/include/asio/detail/reactor_fwd.hpp +40 -0
  361. data/ext/third_party/asio/asio/include/asio/detail/reactor_op.hpp +65 -0
  362. data/ext/third_party/asio/asio/include/asio/detail/reactor_op_queue.hpp +168 -0
  363. data/ext/third_party/asio/asio/include/asio/detail/recycling_allocator.hpp +106 -0
  364. data/ext/third_party/asio/asio/include/asio/detail/regex_fwd.hpp +35 -0
  365. data/ext/third_party/asio/asio/include/asio/detail/resolve_endpoint_op.hpp +138 -0
  366. data/ext/third_party/asio/asio/include/asio/detail/resolve_op.hpp +45 -0
  367. data/ext/third_party/asio/asio/include/asio/detail/resolve_query_op.hpp +148 -0
  368. data/ext/third_party/asio/asio/include/asio/detail/resolver_service.hpp +145 -0
  369. data/ext/third_party/asio/asio/include/asio/detail/resolver_service_base.hpp +143 -0
  370. data/ext/third_party/asio/asio/include/asio/detail/scheduler.hpp +224 -0
  371. data/ext/third_party/asio/asio/include/asio/detail/scheduler_operation.hpp +78 -0
  372. data/ext/third_party/asio/asio/include/asio/detail/scheduler_thread_info.hpp +40 -0
  373. data/ext/third_party/asio/asio/include/asio/detail/scoped_lock.hpp +101 -0
  374. data/ext/third_party/asio/asio/include/asio/detail/scoped_ptr.hpp +87 -0
  375. data/ext/third_party/asio/asio/include/asio/detail/select_interrupter.hpp +46 -0
  376. data/ext/third_party/asio/asio/include/asio/detail/select_reactor.hpp +238 -0
  377. data/ext/third_party/asio/asio/include/asio/detail/service_registry.hpp +164 -0
  378. data/ext/third_party/asio/asio/include/asio/detail/signal_blocker.hpp +44 -0
  379. data/ext/third_party/asio/asio/include/asio/detail/signal_handler.hpp +88 -0
  380. data/ext/third_party/asio/asio/include/asio/detail/signal_init.hpp +47 -0
  381. data/ext/third_party/asio/asio/include/asio/detail/signal_op.hpp +49 -0
  382. data/ext/third_party/asio/asio/include/asio/detail/signal_set_service.hpp +229 -0
  383. data/ext/third_party/asio/asio/include/asio/detail/socket_holder.hpp +98 -0
  384. data/ext/third_party/asio/asio/include/asio/detail/socket_ops.hpp +337 -0
  385. data/ext/third_party/asio/asio/include/asio/detail/socket_option.hpp +316 -0
  386. data/ext/third_party/asio/asio/include/asio/detail/socket_select_interrupter.hpp +91 -0
  387. data/ext/third_party/asio/asio/include/asio/detail/socket_types.hpp +416 -0
  388. data/ext/third_party/asio/asio/include/asio/detail/solaris_fenced_block.hpp +62 -0
  389. data/ext/third_party/asio/asio/include/asio/detail/static_mutex.hpp +52 -0
  390. data/ext/third_party/asio/asio/include/asio/detail/std_event.hpp +176 -0
  391. data/ext/third_party/asio/asio/include/asio/detail/std_fenced_block.hpp +62 -0
  392. data/ext/third_party/asio/asio/include/asio/detail/std_global.hpp +70 -0
  393. data/ext/third_party/asio/asio/include/asio/detail/std_mutex.hpp +73 -0
  394. data/ext/third_party/asio/asio/include/asio/detail/std_static_mutex.hpp +81 -0
  395. data/ext/third_party/asio/asio/include/asio/detail/std_thread.hpp +71 -0
  396. data/ext/third_party/asio/asio/include/asio/detail/strand_executor_service.hpp +142 -0
  397. data/ext/third_party/asio/asio/include/asio/detail/strand_service.hpp +142 -0
  398. data/ext/third_party/asio/asio/include/asio/detail/string_view.hpp +47 -0
  399. data/ext/third_party/asio/asio/include/asio/detail/thread.hpp +60 -0
  400. data/ext/third_party/asio/asio/include/asio/detail/thread_context.hpp +42 -0
  401. data/ext/third_party/asio/asio/include/asio/detail/thread_group.hpp +95 -0
  402. data/ext/third_party/asio/asio/include/asio/detail/thread_info_base.hpp +125 -0
  403. data/ext/third_party/asio/asio/include/asio/detail/throw_error.hpp +53 -0
  404. data/ext/third_party/asio/asio/include/asio/detail/throw_exception.hpp +51 -0
  405. data/ext/third_party/asio/asio/include/asio/detail/timer_queue.hpp +360 -0
  406. data/ext/third_party/asio/asio/include/asio/detail/timer_queue_base.hpp +68 -0
  407. data/ext/third_party/asio/asio/include/asio/detail/timer_queue_ptime.hpp +99 -0
  408. data/ext/third_party/asio/asio/include/asio/detail/timer_queue_set.hpp +66 -0
  409. data/ext/third_party/asio/asio/include/asio/detail/timer_scheduler.hpp +35 -0
  410. data/ext/third_party/asio/asio/include/asio/detail/timer_scheduler_fwd.hpp +40 -0
  411. data/ext/third_party/asio/asio/include/asio/detail/tss_ptr.hpp +69 -0
  412. data/ext/third_party/asio/asio/include/asio/detail/type_traits.hpp +89 -0
  413. data/ext/third_party/asio/asio/include/asio/detail/variadic_templates.hpp +151 -0
  414. data/ext/third_party/asio/asio/include/asio/detail/wait_handler.hpp +87 -0
  415. data/ext/third_party/asio/asio/include/asio/detail/wait_op.hpp +45 -0
  416. data/ext/third_party/asio/asio/include/asio/detail/win_event.hpp +151 -0
  417. data/ext/third_party/asio/asio/include/asio/detail/win_fd_set_adapter.hpp +149 -0
  418. data/ext/third_party/asio/asio/include/asio/detail/win_fenced_block.hpp +90 -0
  419. data/ext/third_party/asio/asio/include/asio/detail/win_global.hpp +71 -0
  420. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_handle_read_op.hpp +113 -0
  421. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_handle_service.hpp +335 -0
  422. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_handle_write_op.hpp +106 -0
  423. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_io_context.hpp +338 -0
  424. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_null_buffers_op.hpp +123 -0
  425. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_operation.hpp +96 -0
  426. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_overlapped_op.hpp +92 -0
  427. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp +159 -0
  428. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_serial_port_service.hpp +232 -0
  429. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_accept_op.hpp +308 -0
  430. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_connect_op.hpp +130 -0
  431. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_recv_op.hpp +120 -0
  432. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_recvfrom_op.hpp +129 -0
  433. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_recvmsg_op.hpp +121 -0
  434. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_send_op.hpp +114 -0
  435. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_service.hpp +581 -0
  436. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_service_base.hpp +600 -0
  437. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_thread_info.hpp +34 -0
  438. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_wait_op.hpp +123 -0
  439. data/ext/third_party/asio/asio/include/asio/detail/win_mutex.hpp +78 -0
  440. data/ext/third_party/asio/asio/include/asio/detail/win_object_handle_service.hpp +195 -0
  441. data/ext/third_party/asio/asio/include/asio/detail/win_static_mutex.hpp +74 -0
  442. data/ext/third_party/asio/asio/include/asio/detail/win_thread.hpp +147 -0
  443. data/ext/third_party/asio/asio/include/asio/detail/win_tss_ptr.hpp +79 -0
  444. data/ext/third_party/asio/asio/include/asio/detail/winapp_thread.hpp +124 -0
  445. data/ext/third_party/asio/asio/include/asio/detail/wince_thread.hpp +124 -0
  446. data/ext/third_party/asio/asio/include/asio/detail/winrt_async_manager.hpp +305 -0
  447. data/ext/third_party/asio/asio/include/asio/detail/winrt_async_op.hpp +65 -0
  448. data/ext/third_party/asio/asio/include/asio/detail/winrt_resolve_op.hpp +121 -0
  449. data/ext/third_party/asio/asio/include/asio/detail/winrt_resolver_service.hpp +212 -0
  450. data/ext/third_party/asio/asio/include/asio/detail/winrt_socket_connect_op.hpp +94 -0
  451. data/ext/third_party/asio/asio/include/asio/detail/winrt_socket_recv_op.hpp +115 -0
  452. data/ext/third_party/asio/asio/include/asio/detail/winrt_socket_send_op.hpp +106 -0
  453. data/ext/third_party/asio/asio/include/asio/detail/winrt_ssocket_service.hpp +250 -0
  454. data/ext/third_party/asio/asio/include/asio/detail/winrt_ssocket_service_base.hpp +362 -0
  455. data/ext/third_party/asio/asio/include/asio/detail/winrt_timer_scheduler.hpp +147 -0
  456. data/ext/third_party/asio/asio/include/asio/detail/winrt_utils.hpp +106 -0
  457. data/ext/third_party/asio/asio/include/asio/detail/winsock_init.hpp +128 -0
  458. data/ext/third_party/asio/asio/include/asio/detail/work_dispatcher.hpp +73 -0
  459. data/ext/third_party/asio/asio/include/asio/detail/wrapped_handler.hpp +291 -0
  460. data/ext/third_party/asio/asio/include/asio/dispatch.hpp +118 -0
  461. data/ext/third_party/asio/asio/include/asio/error.hpp +356 -0
  462. data/ext/third_party/asio/asio/include/asio/error_code.hpp +202 -0
  463. data/ext/third_party/asio/asio/include/asio/execution_context.hpp +412 -0
  464. data/ext/third_party/asio/asio/include/asio/executor.hpp +341 -0
  465. data/ext/third_party/asio/asio/include/asio/executor_work_guard.hpp +170 -0
  466. data/ext/third_party/asio/asio/include/asio/generic/basic_endpoint.hpp +193 -0
  467. data/ext/third_party/asio/asio/include/asio/generic/datagram_protocol.hpp +123 -0
  468. data/ext/third_party/asio/asio/include/asio/generic/detail/endpoint.hpp +133 -0
  469. data/ext/third_party/asio/asio/include/asio/generic/detail/impl/endpoint.ipp +110 -0
  470. data/ext/third_party/asio/asio/include/asio/generic/raw_protocol.hpp +121 -0
  471. data/ext/third_party/asio/asio/include/asio/generic/seq_packet_protocol.hpp +122 -0
  472. data/ext/third_party/asio/asio/include/asio/generic/stream_protocol.hpp +127 -0
  473. data/ext/third_party/asio/asio/include/asio/handler_alloc_hook.hpp +81 -0
  474. data/ext/third_party/asio/asio/include/asio/handler_continuation_hook.hpp +54 -0
  475. data/ext/third_party/asio/asio/include/asio/handler_invoke_hook.hpp +85 -0
  476. data/ext/third_party/asio/asio/include/asio/high_resolution_timer.hpp +44 -0
  477. data/ext/third_party/asio/asio/include/asio/impl/awaitable.hpp +422 -0
  478. data/ext/third_party/asio/asio/include/asio/impl/buffered_read_stream.hpp +491 -0
  479. data/ext/third_party/asio/asio/include/asio/impl/buffered_write_stream.hpp +471 -0
  480. data/ext/third_party/asio/asio/include/asio/impl/co_spawn.hpp +160 -0
  481. data/ext/third_party/asio/asio/include/asio/impl/compose.hpp +533 -0
  482. data/ext/third_party/asio/asio/include/asio/impl/connect.hpp +872 -0
  483. data/ext/third_party/asio/asio/include/asio/impl/defer.hpp +113 -0
  484. data/ext/third_party/asio/asio/include/asio/impl/detached.hpp +130 -0
  485. data/ext/third_party/asio/asio/include/asio/impl/dispatch.hpp +113 -0
  486. data/ext/third_party/asio/asio/include/asio/impl/error.ipp +128 -0
  487. data/ext/third_party/asio/asio/include/asio/impl/error_code.ipp +206 -0
  488. data/ext/third_party/asio/asio/include/asio/impl/execution_context.hpp +109 -0
  489. data/ext/third_party/asio/asio/include/asio/impl/execution_context.ipp +82 -0
  490. data/ext/third_party/asio/asio/include/asio/impl/executor.hpp +387 -0
  491. data/ext/third_party/asio/asio/include/asio/impl/executor.ipp +38 -0
  492. data/ext/third_party/asio/asio/include/asio/impl/handler_alloc_hook.ipp +52 -0
  493. data/ext/third_party/asio/asio/include/asio/impl/io_context.hpp +353 -0
  494. data/ext/third_party/asio/asio/include/asio/impl/io_context.ipp +175 -0
  495. data/ext/third_party/asio/asio/include/asio/impl/post.hpp +113 -0
  496. data/ext/third_party/asio/asio/include/asio/impl/read.hpp +1135 -0
  497. data/ext/third_party/asio/asio/include/asio/impl/read_at.hpp +699 -0
  498. data/ext/third_party/asio/asio/include/asio/impl/read_until.hpp +3150 -0
  499. data/ext/third_party/asio/asio/include/asio/impl/redirect_error.hpp +372 -0
  500. data/ext/third_party/asio/asio/include/asio/impl/serial_port_base.hpp +59 -0
  501. data/ext/third_party/asio/asio/include/asio/impl/serial_port_base.ipp +554 -0
  502. data/ext/third_party/asio/asio/include/asio/impl/spawn.hpp +490 -0
  503. data/ext/third_party/asio/asio/include/asio/impl/src.cpp +25 -0
  504. data/ext/third_party/asio/asio/include/asio/impl/src.hpp +82 -0
  505. data/ext/third_party/asio/asio/include/asio/impl/system_context.hpp +34 -0
  506. data/ext/third_party/asio/asio/include/asio/impl/system_context.ipp +80 -0
  507. data/ext/third_party/asio/asio/include/asio/impl/system_executor.hpp +85 -0
  508. data/ext/third_party/asio/asio/include/asio/impl/thread_pool.hpp +127 -0
  509. data/ext/third_party/asio/asio/include/asio/impl/thread_pool.ipp +87 -0
  510. data/ext/third_party/asio/asio/include/asio/impl/use_awaitable.hpp +276 -0
  511. data/ext/third_party/asio/asio/include/asio/impl/use_future.hpp +887 -0
  512. data/ext/third_party/asio/asio/include/asio/impl/write.hpp +1043 -0
  513. data/ext/third_party/asio/asio/include/asio/impl/write_at.hpp +624 -0
  514. data/ext/third_party/asio/asio/include/asio/io_context.hpp +872 -0
  515. data/ext/third_party/asio/asio/include/asio/io_context_strand.hpp +374 -0
  516. data/ext/third_party/asio/asio/include/asio/io_service.hpp +33 -0
  517. data/ext/third_party/asio/asio/include/asio/io_service_strand.hpp +20 -0
  518. data/ext/third_party/asio/asio/include/asio/ip/address.hpp +268 -0
  519. data/ext/third_party/asio/asio/include/asio/ip/address_v4.hpp +335 -0
  520. data/ext/third_party/asio/asio/include/asio/ip/address_v4_iterator.hpp +162 -0
  521. data/ext/third_party/asio/asio/include/asio/ip/address_v4_range.hpp +134 -0
  522. data/ext/third_party/asio/asio/include/asio/ip/address_v6.hpp +341 -0
  523. data/ext/third_party/asio/asio/include/asio/ip/address_v6_iterator.hpp +183 -0
  524. data/ext/third_party/asio/asio/include/asio/ip/address_v6_range.hpp +129 -0
  525. data/ext/third_party/asio/asio/include/asio/ip/bad_address_cast.hpp +53 -0
  526. data/ext/third_party/asio/asio/include/asio/ip/basic_endpoint.hpp +264 -0
  527. data/ext/third_party/asio/asio/include/asio/ip/basic_resolver.hpp +1030 -0
  528. data/ext/third_party/asio/asio/include/asio/ip/basic_resolver_entry.hpp +113 -0
  529. data/ext/third_party/asio/asio/include/asio/ip/basic_resolver_iterator.hpp +192 -0
  530. data/ext/third_party/asio/asio/include/asio/ip/basic_resolver_query.hpp +244 -0
  531. data/ext/third_party/asio/asio/include/asio/ip/basic_resolver_results.hpp +311 -0
  532. data/ext/third_party/asio/asio/include/asio/ip/detail/endpoint.hpp +141 -0
  533. data/ext/third_party/asio/asio/include/asio/ip/detail/impl/endpoint.ipp +199 -0
  534. data/ext/third_party/asio/asio/include/asio/ip/detail/socket_option.hpp +566 -0
  535. data/ext/third_party/asio/asio/include/asio/ip/host_name.hpp +42 -0
  536. data/ext/third_party/asio/asio/include/asio/ip/icmp.hpp +115 -0
  537. data/ext/third_party/asio/asio/include/asio/ip/impl/address.hpp +67 -0
  538. data/ext/third_party/asio/asio/include/asio/ip/impl/address.ipp +239 -0
  539. data/ext/third_party/asio/asio/include/asio/ip/impl/address_v4.hpp +67 -0
  540. data/ext/third_party/asio/asio/include/asio/ip/impl/address_v4.ipp +210 -0
  541. data/ext/third_party/asio/asio/include/asio/ip/impl/address_v6.hpp +67 -0
  542. data/ext/third_party/asio/asio/include/asio/ip/impl/address_v6.ipp +350 -0
  543. data/ext/third_party/asio/asio/include/asio/ip/impl/basic_endpoint.hpp +43 -0
  544. data/ext/third_party/asio/asio/include/asio/ip/impl/host_name.ipp +54 -0
  545. data/ext/third_party/asio/asio/include/asio/ip/impl/network_v4.hpp +54 -0
  546. data/ext/third_party/asio/asio/include/asio/ip/impl/network_v4.ipp +216 -0
  547. data/ext/third_party/asio/asio/include/asio/ip/impl/network_v6.hpp +53 -0
  548. data/ext/third_party/asio/asio/include/asio/ip/impl/network_v6.ipp +185 -0
  549. data/ext/third_party/asio/asio/include/asio/ip/multicast.hpp +191 -0
  550. data/ext/third_party/asio/asio/include/asio/ip/network_v4.hpp +261 -0
  551. data/ext/third_party/asio/asio/include/asio/ip/network_v6.hpp +235 -0
  552. data/ext/third_party/asio/asio/include/asio/ip/resolver_base.hpp +129 -0
  553. data/ext/third_party/asio/asio/include/asio/ip/resolver_query_base.hpp +43 -0
  554. data/ext/third_party/asio/asio/include/asio/ip/tcp.hpp +155 -0
  555. data/ext/third_party/asio/asio/include/asio/ip/udp.hpp +111 -0
  556. data/ext/third_party/asio/asio/include/asio/ip/unicast.hpp +70 -0
  557. data/ext/third_party/asio/asio/include/asio/ip/v6_only.hpp +69 -0
  558. data/ext/third_party/asio/asio/include/asio/is_executor.hpp +46 -0
  559. data/ext/third_party/asio/asio/include/asio/is_read_buffered.hpp +59 -0
  560. data/ext/third_party/asio/asio/include/asio/is_write_buffered.hpp +59 -0
  561. data/ext/third_party/asio/asio/include/asio/local/basic_endpoint.hpp +247 -0
  562. data/ext/third_party/asio/asio/include/asio/local/connect_pair.hpp +101 -0
  563. data/ext/third_party/asio/asio/include/asio/local/datagram_protocol.hpp +80 -0
  564. data/ext/third_party/asio/asio/include/asio/local/detail/endpoint.hpp +139 -0
  565. data/ext/third_party/asio/asio/include/asio/local/detail/impl/endpoint.ipp +136 -0
  566. data/ext/third_party/asio/asio/include/asio/local/stream_protocol.hpp +90 -0
  567. data/ext/third_party/asio/asio/include/asio/packaged_task.hpp +126 -0
  568. data/ext/third_party/asio/asio/include/asio/placeholders.hpp +151 -0
  569. data/ext/third_party/asio/asio/include/asio/posix/basic_descriptor.hpp +697 -0
  570. data/ext/third_party/asio/asio/include/asio/posix/basic_stream_descriptor.hpp +470 -0
  571. data/ext/third_party/asio/asio/include/asio/posix/descriptor.hpp +37 -0
  572. data/ext/third_party/asio/asio/include/asio/posix/descriptor_base.hpp +90 -0
  573. data/ext/third_party/asio/asio/include/asio/posix/stream_descriptor.hpp +37 -0
  574. data/ext/third_party/asio/asio/include/asio/post.hpp +123 -0
  575. data/ext/third_party/asio/asio/include/asio/read.hpp +1288 -0
  576. data/ext/third_party/asio/asio/include/asio/read_at.hpp +694 -0
  577. data/ext/third_party/asio/asio/include/asio/read_until.hpp +2863 -0
  578. data/ext/third_party/asio/asio/include/asio/redirect_error.hpp +66 -0
  579. data/ext/third_party/asio/asio/include/asio/serial_port.hpp +36 -0
  580. data/ext/third_party/asio/asio/include/asio/serial_port_base.hpp +167 -0
  581. data/ext/third_party/asio/asio/include/asio/signal_set.hpp +28 -0
  582. data/ext/third_party/asio/asio/include/asio/socket_base.hpp +559 -0
  583. data/ext/third_party/asio/asio/include/asio/spawn.hpp +336 -0
  584. data/ext/third_party/asio/asio/include/asio/ssl.hpp +28 -0
  585. data/ext/third_party/asio/asio/include/asio/ssl/context.hpp +761 -0
  586. data/ext/third_party/asio/asio/include/asio/ssl/context_base.hpp +209 -0
  587. data/ext/third_party/asio/asio/include/asio/ssl/detail/buffered_handshake_op.hpp +114 -0
  588. data/ext/third_party/asio/asio/include/asio/ssl/detail/engine.hpp +160 -0
  589. data/ext/third_party/asio/asio/include/asio/ssl/detail/handshake_op.hpp +62 -0
  590. data/ext/third_party/asio/asio/include/asio/ssl/detail/impl/engine.ipp +336 -0
  591. data/ext/third_party/asio/asio/include/asio/ssl/detail/impl/openssl_init.ipp +165 -0
  592. data/ext/third_party/asio/asio/include/asio/ssl/detail/io.hpp +381 -0
  593. data/ext/third_party/asio/asio/include/asio/ssl/detail/openssl_init.hpp +101 -0
  594. data/ext/third_party/asio/asio/include/asio/ssl/detail/openssl_types.hpp +34 -0
  595. data/ext/third_party/asio/asio/include/asio/ssl/detail/password_callback.hpp +66 -0
  596. data/ext/third_party/asio/asio/include/asio/ssl/detail/read_op.hpp +67 -0
  597. data/ext/third_party/asio/asio/include/asio/ssl/detail/shutdown_op.hpp +64 -0
  598. data/ext/third_party/asio/asio/include/asio/ssl/detail/stream_core.hpp +135 -0
  599. data/ext/third_party/asio/asio/include/asio/ssl/detail/verify_callback.hpp +62 -0
  600. data/ext/third_party/asio/asio/include/asio/ssl/detail/write_op.hpp +67 -0
  601. data/ext/third_party/asio/asio/include/asio/ssl/error.hpp +125 -0
  602. data/ext/third_party/asio/asio/include/asio/ssl/host_name_verification.hpp +90 -0
  603. data/ext/third_party/asio/asio/include/asio/ssl/impl/context.hpp +67 -0
  604. data/ext/third_party/asio/asio/include/asio/ssl/impl/context.ipp +1238 -0
  605. data/ext/third_party/asio/asio/include/asio/ssl/impl/error.ipp +102 -0
  606. data/ext/third_party/asio/asio/include/asio/ssl/impl/host_name_verification.ipp +73 -0
  607. data/ext/third_party/asio/asio/include/asio/ssl/impl/rfc2818_verification.ipp +164 -0
  608. data/ext/third_party/asio/asio/include/asio/ssl/impl/src.hpp +29 -0
  609. data/ext/third_party/asio/asio/include/asio/ssl/rfc2818_verification.hpp +98 -0
  610. data/ext/third_party/asio/asio/include/asio/ssl/stream.hpp +885 -0
  611. data/ext/third_party/asio/asio/include/asio/ssl/stream_base.hpp +52 -0
  612. data/ext/third_party/asio/asio/include/asio/ssl/verify_context.hpp +67 -0
  613. data/ext/third_party/asio/asio/include/asio/ssl/verify_mode.hpp +63 -0
  614. data/ext/third_party/asio/asio/include/asio/steady_timer.hpp +42 -0
  615. data/ext/third_party/asio/asio/include/asio/strand.hpp +314 -0
  616. data/ext/third_party/asio/asio/include/asio/streambuf.hpp +33 -0
  617. data/ext/third_party/asio/asio/include/asio/system_context.hpp +81 -0
  618. data/ext/third_party/asio/asio/include/asio/system_error.hpp +131 -0
  619. data/ext/third_party/asio/asio/include/asio/system_executor.hpp +129 -0
  620. data/ext/third_party/asio/asio/include/asio/system_timer.hpp +42 -0
  621. data/ext/third_party/asio/asio/include/asio/this_coro.hpp +45 -0
  622. data/ext/third_party/asio/asio/include/asio/thread.hpp +92 -0
  623. data/ext/third_party/asio/asio/include/asio/thread_pool.hpp +235 -0
  624. data/ext/third_party/asio/asio/include/asio/time_traits.hpp +86 -0
  625. data/ext/third_party/asio/asio/include/asio/ts/buffer.hpp +24 -0
  626. data/ext/third_party/asio/asio/include/asio/ts/executor.hpp +34 -0
  627. data/ext/third_party/asio/asio/include/asio/ts/internet.hpp +40 -0
  628. data/ext/third_party/asio/asio/include/asio/ts/io_context.hpp +20 -0
  629. data/ext/third_party/asio/asio/include/asio/ts/net.hpp +26 -0
  630. data/ext/third_party/asio/asio/include/asio/ts/netfwd.hpp +203 -0
  631. data/ext/third_party/asio/asio/include/asio/ts/socket.hpp +27 -0
  632. data/ext/third_party/asio/asio/include/asio/ts/timer.hpp +26 -0
  633. data/ext/third_party/asio/asio/include/asio/unyield.hpp +21 -0
  634. data/ext/third_party/asio/asio/include/asio/use_awaitable.hpp +110 -0
  635. data/ext/third_party/asio/asio/include/asio/use_future.hpp +160 -0
  636. data/ext/third_party/asio/asio/include/asio/uses_executor.hpp +71 -0
  637. data/ext/third_party/asio/asio/include/asio/version.hpp +23 -0
  638. data/ext/third_party/asio/asio/include/asio/wait_traits.hpp +56 -0
  639. data/ext/third_party/asio/asio/include/asio/windows/basic_object_handle.hpp +435 -0
  640. data/ext/third_party/asio/asio/include/asio/windows/basic_overlapped_handle.hpp +361 -0
  641. data/ext/third_party/asio/asio/include/asio/windows/basic_random_access_handle.hpp +490 -0
  642. data/ext/third_party/asio/asio/include/asio/windows/basic_stream_handle.hpp +474 -0
  643. data/ext/third_party/asio/asio/include/asio/windows/object_handle.hpp +38 -0
  644. data/ext/third_party/asio/asio/include/asio/windows/overlapped_handle.hpp +39 -0
  645. data/ext/third_party/asio/asio/include/asio/windows/overlapped_ptr.hpp +143 -0
  646. data/ext/third_party/asio/asio/include/asio/windows/random_access_handle.hpp +37 -0
  647. data/ext/third_party/asio/asio/include/asio/windows/stream_handle.hpp +37 -0
  648. data/ext/third_party/asio/asio/include/asio/write.hpp +1246 -0
  649. data/ext/third_party/asio/asio/include/asio/write_at.hpp +702 -0
  650. data/ext/third_party/asio/asio/include/asio/yield.hpp +23 -0
  651. data/ext/third_party/asio/asio/release.pl +440 -0
  652. data/ext/third_party/asio/asio/src/.gitignore +11 -0
  653. data/ext/third_party/asio/asio/src/Makefile.am +23 -0
  654. data/ext/third_party/asio/asio/src/Makefile.mgw +204 -0
  655. data/ext/third_party/asio/asio/src/Makefile.msc +497 -0
  656. data/ext/third_party/asio/asio/src/asio.cpp +11 -0
  657. data/ext/third_party/asio/asio/src/asio_ssl.cpp +11 -0
  658. data/ext/third_party/asio/asio/src/doc/.gitignore +5 -0
  659. data/ext/third_party/asio/asio/src/doc/Jamfile.v2 +62 -0
  660. data/ext/third_party/asio/asio/src/doc/asio.png +0 -0
  661. data/ext/third_party/asio/asio/src/doc/asio.qbk +127 -0
  662. data/ext/third_party/asio/asio/src/doc/asioref.sty +90 -0
  663. data/ext/third_party/asio/asio/src/doc/asioref.xsl +94 -0
  664. data/ext/third_party/asio/asio/src/doc/boost_bind_dox.txt +5 -0
  665. data/ext/third_party/asio/asio/src/doc/doxy2qbk.pl +22 -0
  666. data/ext/third_party/asio/asio/src/doc/examples.qbk +564 -0
  667. data/ext/third_party/asio/asio/src/doc/history.qbk +1794 -0
  668. data/ext/third_party/asio/asio/src/doc/index.xml +13 -0
  669. data/ext/third_party/asio/asio/src/doc/makepdf.pl +26 -0
  670. data/ext/third_party/asio/asio/src/doc/net_ts.qbk +479 -0
  671. data/ext/third_party/asio/asio/src/doc/noncopyable_dox.txt +3 -0
  672. data/ext/third_party/asio/asio/src/doc/overview.qbk +103 -0
  673. data/ext/third_party/asio/asio/src/doc/overview/allocation.qbk +89 -0
  674. data/ext/third_party/asio/asio/src/doc/overview/async.qbk +185 -0
  675. data/ext/third_party/asio/asio/src/doc/overview/async_op1.dot +78 -0
  676. data/ext/third_party/asio/asio/src/doc/overview/async_op1.png +0 -0
  677. data/ext/third_party/asio/asio/src/doc/overview/async_op2.dot +78 -0
  678. data/ext/third_party/asio/asio/src/doc/overview/async_op2.png +0 -0
  679. data/ext/third_party/asio/asio/src/doc/overview/basics.qbk +106 -0
  680. data/ext/third_party/asio/asio/src/doc/overview/bsd_sockets.qbk +270 -0
  681. data/ext/third_party/asio/asio/src/doc/overview/buffers.qbk +163 -0
  682. data/ext/third_party/asio/asio/src/doc/overview/concurrency_hint.qbk +88 -0
  683. data/ext/third_party/asio/asio/src/doc/overview/coroutine.qbk +51 -0
  684. data/ext/third_party/asio/asio/src/doc/overview/coroutines_ts.qbk +97 -0
  685. data/ext/third_party/asio/asio/src/doc/overview/cpp2011.qbk +271 -0
  686. data/ext/third_party/asio/asio/src/doc/overview/handler_tracking.qbk +220 -0
  687. data/ext/third_party/asio/asio/src/doc/overview/implementation.qbk +305 -0
  688. data/ext/third_party/asio/asio/src/doc/overview/iostreams.qbk +72 -0
  689. data/ext/third_party/asio/asio/src/doc/overview/line_based.qbk +118 -0
  690. data/ext/third_party/asio/asio/src/doc/overview/other_protocols.qbk +94 -0
  691. data/ext/third_party/asio/asio/src/doc/overview/posix.qbk +152 -0
  692. data/ext/third_party/asio/asio/src/doc/overview/proactor.dot +100 -0
  693. data/ext/third_party/asio/asio/src/doc/overview/proactor.png +0 -0
  694. data/ext/third_party/asio/asio/src/doc/overview/protocols.qbk +149 -0
  695. data/ext/third_party/asio/asio/src/doc/overview/rationale.qbk +54 -0
  696. data/ext/third_party/asio/asio/src/doc/overview/reactor.qbk +44 -0
  697. data/ext/third_party/asio/asio/src/doc/overview/serial_ports.qbk +45 -0
  698. data/ext/third_party/asio/asio/src/doc/overview/signals.qbk +44 -0
  699. data/ext/third_party/asio/asio/src/doc/overview/spawn.qbk +102 -0
  700. data/ext/third_party/asio/asio/src/doc/overview/ssl.qbk +124 -0
  701. data/ext/third_party/asio/asio/src/doc/overview/strands.qbk +114 -0
  702. data/ext/third_party/asio/asio/src/doc/overview/streams.qbk +62 -0
  703. data/ext/third_party/asio/asio/src/doc/overview/sync_op.dot +67 -0
  704. data/ext/third_party/asio/asio/src/doc/overview/sync_op.png +0 -0
  705. data/ext/third_party/asio/asio/src/doc/overview/threads.qbk +67 -0
  706. data/ext/third_party/asio/asio/src/doc/overview/timers.qbk +52 -0
  707. data/ext/third_party/asio/asio/src/doc/overview/windows.qbk +126 -0
  708. data/ext/third_party/asio/asio/src/doc/project-root.jam +1 -0
  709. data/ext/third_party/asio/asio/src/doc/quickref.xml +561 -0
  710. data/ext/third_party/asio/asio/src/doc/reference.dox +264 -0
  711. data/ext/third_party/asio/asio/src/doc/reference.qbk +125973 -0
  712. data/ext/third_party/asio/asio/src/doc/reference.xsl +1831 -0
  713. data/ext/third_party/asio/asio/src/doc/release_checklist.htm +68 -0
  714. data/ext/third_party/asio/asio/src/doc/requirements/AcceptHandler.qbk +72 -0
  715. data/ext/third_party/asio/asio/src/doc/requirements/AcceptableProtocol.qbk +25 -0
  716. data/ext/third_party/asio/asio/src/doc/requirements/AsyncRandomAccessReadDevice.qbk +56 -0
  717. data/ext/third_party/asio/asio/src/doc/requirements/AsyncRandomAccessWriteDevice.qbk +57 -0
  718. data/ext/third_party/asio/asio/src/doc/requirements/AsyncReadStream.qbk +50 -0
  719. data/ext/third_party/asio/asio/src/doc/requirements/AsyncWriteStream.qbk +48 -0
  720. data/ext/third_party/asio/asio/src/doc/requirements/BufferedHandshakeHandler.qbk +55 -0
  721. data/ext/third_party/asio/asio/src/doc/requirements/CompletionCondition.qbk +42 -0
  722. data/ext/third_party/asio/asio/src/doc/requirements/CompletionHandler.qbk +63 -0
  723. data/ext/third_party/asio/asio/src/doc/requirements/ConnectCondition.qbk +34 -0
  724. data/ext/third_party/asio/asio/src/doc/requirements/ConnectHandler.qbk +72 -0
  725. data/ext/third_party/asio/asio/src/doc/requirements/ConstBufferSequence.qbk +53 -0
  726. data/ext/third_party/asio/asio/src/doc/requirements/DynamicBuffer.qbk +16 -0
  727. data/ext/third_party/asio/asio/src/doc/requirements/DynamicBuffer_v1.qbk +93 -0
  728. data/ext/third_party/asio/asio/src/doc/requirements/DynamicBuffer_v2.qbk +94 -0
  729. data/ext/third_party/asio/asio/src/doc/requirements/Endpoint.qbk +97 -0
  730. data/ext/third_party/asio/asio/src/doc/requirements/EndpointSequence.qbk +30 -0
  731. data/ext/third_party/asio/asio/src/doc/requirements/ExecutionContext.qbk +36 -0
  732. data/ext/third_party/asio/asio/src/doc/requirements/Executor.qbk +141 -0
  733. data/ext/third_party/asio/asio/src/doc/requirements/GettableSerialPortOption.qbk +33 -0
  734. data/ext/third_party/asio/asio/src/doc/requirements/GettableSocketOption.qbk +67 -0
  735. data/ext/third_party/asio/asio/src/doc/requirements/Handler.qbk +64 -0
  736. data/ext/third_party/asio/asio/src/doc/requirements/HandshakeHandler.qbk +72 -0
  737. data/ext/third_party/asio/asio/src/doc/requirements/InternetProtocol.qbk +47 -0
  738. data/ext/third_party/asio/asio/src/doc/requirements/IoControlCommand.qbk +34 -0
  739. data/ext/third_party/asio/asio/src/doc/requirements/IoObjectService.qbk +62 -0
  740. data/ext/third_party/asio/asio/src/doc/requirements/IteratorConnectHandler.qbk +81 -0
  741. data/ext/third_party/asio/asio/src/doc/requirements/LegacyCompletionHandler.qbk +65 -0
  742. data/ext/third_party/asio/asio/src/doc/requirements/MoveAcceptHandler.qbk +61 -0
  743. data/ext/third_party/asio/asio/src/doc/requirements/MutableBufferSequence.qbk +54 -0
  744. data/ext/third_party/asio/asio/src/doc/requirements/ProtoAllocator.qbk +19 -0
  745. data/ext/third_party/asio/asio/src/doc/requirements/Protocol.qbk +56 -0
  746. data/ext/third_party/asio/asio/src/doc/requirements/RangeConnectHandler.qbk +82 -0
  747. data/ext/third_party/asio/asio/src/doc/requirements/ReadHandler.qbk +79 -0
  748. data/ext/third_party/asio/asio/src/doc/requirements/ResolveHandler.qbk +82 -0
  749. data/ext/third_party/asio/asio/src/doc/requirements/Service.qbk +40 -0
  750. data/ext/third_party/asio/asio/src/doc/requirements/SettableSerialPortOption.qbk +33 -0
  751. data/ext/third_party/asio/asio/src/doc/requirements/SettableSocketOption.qbk +54 -0
  752. data/ext/third_party/asio/asio/src/doc/requirements/ShutdownHandler.qbk +72 -0
  753. data/ext/third_party/asio/asio/src/doc/requirements/SignalHandler.qbk +79 -0
  754. data/ext/third_party/asio/asio/src/doc/requirements/SyncRandomAccessReadDevice.qbk +49 -0
  755. data/ext/third_party/asio/asio/src/doc/requirements/SyncRandomAccessWriteDevice.qbk +49 -0
  756. data/ext/third_party/asio/asio/src/doc/requirements/SyncReadStream.qbk +41 -0
  757. data/ext/third_party/asio/asio/src/doc/requirements/SyncWriteStream.qbk +39 -0
  758. data/ext/third_party/asio/asio/src/doc/requirements/TimeTraits.qbk +72 -0
  759. data/ext/third_party/asio/asio/src/doc/requirements/WaitHandler.qbk +72 -0
  760. data/ext/third_party/asio/asio/src/doc/requirements/WaitTraits.qbk +52 -0
  761. data/ext/third_party/asio/asio/src/doc/requirements/WriteHandler.qbk +79 -0
  762. data/ext/third_party/asio/asio/src/doc/requirements/asynchronous_operations.qbk +300 -0
  763. data/ext/third_party/asio/asio/src/doc/requirements/asynchronous_socket_operations.qbk +39 -0
  764. data/ext/third_party/asio/asio/src/doc/requirements/read_write_operations.qbk +34 -0
  765. data/ext/third_party/asio/asio/src/doc/requirements/synchronous_socket_operations.qbk +37 -0
  766. data/ext/third_party/asio/asio/src/doc/std_exception_dox.txt +7 -0
  767. data/ext/third_party/asio/asio/src/doc/tutorial.dox +226 -0
  768. data/ext/third_party/asio/asio/src/doc/tutorial.qbk +2387 -0
  769. data/ext/third_party/asio/asio/src/doc/tutorial.xsl +437 -0
  770. data/ext/third_party/asio/asio/src/doc/using.qbk +309 -0
  771. data/ext/third_party/asio/asio/src/examples/cpp03/Makefile.am +251 -0
  772. data/ext/third_party/asio/asio/src/examples/cpp03/allocation/.gitignore +10 -0
  773. data/ext/third_party/asio/asio/src/examples/cpp03/allocation/server.cpp +285 -0
  774. data/ext/third_party/asio/asio/src/examples/cpp03/buffers/.gitignore +10 -0
  775. data/ext/third_party/asio/asio/src/examples/cpp03/buffers/reference_counted.cpp +131 -0
  776. data/ext/third_party/asio/asio/src/examples/cpp03/chat/.gitignore +11 -0
  777. data/ext/third_party/asio/asio/src/examples/cpp03/chat/chat_client.cpp +177 -0
  778. data/ext/third_party/asio/asio/src/examples/cpp03/chat/chat_message.hpp +93 -0
  779. data/ext/third_party/asio/asio/src/examples/cpp03/chat/chat_server.cpp +249 -0
  780. data/ext/third_party/asio/asio/src/examples/cpp03/chat/posix_chat_client.cpp +204 -0
  781. data/ext/third_party/asio/asio/src/examples/cpp03/echo/.gitignore +11 -0
  782. data/ext/third_party/asio/asio/src/examples/cpp03/echo/async_tcp_echo_server.cpp +137 -0
  783. data/ext/third_party/asio/asio/src/examples/cpp03/echo/async_udp_echo_server.cpp +92 -0
  784. data/ext/third_party/asio/asio/src/examples/cpp03/echo/blocking_tcp_echo_client.cpp +59 -0
  785. data/ext/third_party/asio/asio/src/examples/cpp03/echo/blocking_tcp_echo_server.cpp +79 -0
  786. data/ext/third_party/asio/asio/src/examples/cpp03/echo/blocking_udp_echo_client.cpp +59 -0
  787. data/ext/third_party/asio/asio/src/examples/cpp03/echo/blocking_udp_echo_server.cpp +53 -0
  788. data/ext/third_party/asio/asio/src/examples/cpp03/fork/.gitignore +11 -0
  789. data/ext/third_party/asio/asio/src/examples/cpp03/fork/daemon.cpp +190 -0
  790. data/ext/third_party/asio/asio/src/examples/cpp03/fork/process_per_connection.cpp +161 -0
  791. data/ext/third_party/asio/asio/src/examples/cpp03/http/client/.gitignore +10 -0
  792. data/ext/third_party/asio/asio/src/examples/cpp03/http/client/async_client.cpp +204 -0
  793. data/ext/third_party/asio/asio/src/examples/cpp03/http/client/sync_client.cpp +106 -0
  794. data/ext/third_party/asio/asio/src/examples/cpp03/http/doc_root/data_1K.html +28 -0
  795. data/ext/third_party/asio/asio/src/examples/cpp03/http/doc_root/data_2K.html +49 -0
  796. data/ext/third_party/asio/asio/src/examples/cpp03/http/doc_root/data_4K.html +91 -0
  797. data/ext/third_party/asio/asio/src/examples/cpp03/http/doc_root/data_8K.html +175 -0
  798. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/.gitignore +11 -0
  799. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/connection.cpp +99 -0
  800. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/connection.hpp +83 -0
  801. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/connection_manager.cpp +38 -0
  802. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/connection_manager.hpp +44 -0
  803. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/header.hpp +28 -0
  804. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/main.cpp +44 -0
  805. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/mime_types.cpp +46 -0
  806. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/mime_types.hpp +27 -0
  807. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/reply.cpp +256 -0
  808. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/reply.hpp +64 -0
  809. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request.hpp +34 -0
  810. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request_handler.cpp +122 -0
  811. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request_handler.hpp +46 -0
  812. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request_parser.cpp +315 -0
  813. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request_parser.hpp +95 -0
  814. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/server.cpp +94 -0
  815. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/server.hpp +69 -0
  816. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/.gitignore +11 -0
  817. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/connection.cpp +93 -0
  818. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/connection.hpp +75 -0
  819. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/header.hpp +28 -0
  820. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/io_context_pool.cpp +69 -0
  821. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/io_context_pool.hpp +58 -0
  822. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/main.cpp +46 -0
  823. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/mime_types.cpp +46 -0
  824. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/mime_types.hpp +27 -0
  825. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/reply.cpp +256 -0
  826. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/reply.hpp +64 -0
  827. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request.hpp +34 -0
  828. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request_handler.cpp +122 -0
  829. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request_handler.hpp +46 -0
  830. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request_parser.cpp +315 -0
  831. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request_parser.hpp +95 -0
  832. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/server.cpp +77 -0
  833. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/server.hpp +68 -0
  834. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/.gitignore +11 -0
  835. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/connection.cpp +94 -0
  836. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/connection.hpp +78 -0
  837. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/header.hpp +28 -0
  838. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/main.cpp +46 -0
  839. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/mime_types.cpp +46 -0
  840. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/mime_types.hpp +27 -0
  841. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/reply.cpp +256 -0
  842. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/reply.hpp +64 -0
  843. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request.hpp +34 -0
  844. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request_handler.cpp +122 -0
  845. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request_handler.hpp +46 -0
  846. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request_parser.cpp +315 -0
  847. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request_parser.hpp +95 -0
  848. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/server.cpp +89 -0
  849. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/server.hpp +70 -0
  850. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/.gitignore +11 -0
  851. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/file_handler.cpp +122 -0
  852. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/file_handler.hpp +44 -0
  853. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/header.hpp +28 -0
  854. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/main.cpp +58 -0
  855. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/mime_types.cpp +46 -0
  856. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/mime_types.hpp +27 -0
  857. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/reply.cpp +256 -0
  858. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/reply.hpp +64 -0
  859. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/request.hpp +46 -0
  860. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/request_parser.cpp +226 -0
  861. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/request_parser.hpp +78 -0
  862. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/server.cpp +122 -0
  863. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/server.hpp +73 -0
  864. data/ext/third_party/asio/asio/src/examples/cpp03/icmp/.gitignore +10 -0
  865. data/ext/third_party/asio/asio/src/examples/cpp03/icmp/icmp_header.hpp +94 -0
  866. data/ext/third_party/asio/asio/src/examples/cpp03/icmp/ipv4_header.hpp +102 -0
  867. data/ext/third_party/asio/asio/src/examples/cpp03/icmp/ping.cpp +163 -0
  868. data/ext/third_party/asio/asio/src/examples/cpp03/invocation/.gitignore +10 -0
  869. data/ext/third_party/asio/asio/src/examples/cpp03/invocation/prioritised_handlers.cpp +171 -0
  870. data/ext/third_party/asio/asio/src/examples/cpp03/iostreams/.gitignore +11 -0
  871. data/ext/third_party/asio/asio/src/examples/cpp03/iostreams/daytime_client.cpp +44 -0
  872. data/ext/third_party/asio/asio/src/examples/cpp03/iostreams/daytime_server.cpp +51 -0
  873. data/ext/third_party/asio/asio/src/examples/cpp03/iostreams/http_client.cpp +91 -0
  874. data/ext/third_party/asio/asio/src/examples/cpp03/local/.gitignore +13 -0
  875. data/ext/third_party/asio/asio/src/examples/cpp03/local/connect_pair.cpp +141 -0
  876. data/ext/third_party/asio/asio/src/examples/cpp03/local/iostream_client.cpp +62 -0
  877. data/ext/third_party/asio/asio/src/examples/cpp03/local/stream_client.cpp +61 -0
  878. data/ext/third_party/asio/asio/src/examples/cpp03/local/stream_server.cpp +141 -0
  879. data/ext/third_party/asio/asio/src/examples/cpp03/multicast/.gitignore +11 -0
  880. data/ext/third_party/asio/asio/src/examples/cpp03/multicast/receiver.cpp +93 -0
  881. data/ext/third_party/asio/asio/src/examples/cpp03/multicast/sender.cpp +98 -0
  882. data/ext/third_party/asio/asio/src/examples/cpp03/nonblocking/.gitignore +10 -0
  883. data/ext/third_party/asio/asio/src/examples/cpp03/nonblocking/third_party_lib.cpp +240 -0
  884. data/ext/third_party/asio/asio/src/examples/cpp03/porthopper/.gitignore +11 -0
  885. data/ext/third_party/asio/asio/src/examples/cpp03/porthopper/client.cpp +192 -0
  886. data/ext/third_party/asio/asio/src/examples/cpp03/porthopper/protocol.hpp +156 -0
  887. data/ext/third_party/asio/asio/src/examples/cpp03/porthopper/server.cpp +187 -0
  888. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/.gitignore +11 -0
  889. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/client.cpp +125 -0
  890. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/connection.hpp +188 -0
  891. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/server.cpp +123 -0
  892. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/stock.hpp +50 -0
  893. data/ext/third_party/asio/asio/src/examples/cpp03/services/.gitignore +11 -0
  894. data/ext/third_party/asio/asio/src/examples/cpp03/services/basic_logger.hpp +83 -0
  895. data/ext/third_party/asio/asio/src/examples/cpp03/services/daytime_client.cpp +97 -0
  896. data/ext/third_party/asio/asio/src/examples/cpp03/services/logger.hpp +24 -0
  897. data/ext/third_party/asio/asio/src/examples/cpp03/services/logger_service.cpp +11 -0
  898. data/ext/third_party/asio/asio/src/examples/cpp03/services/logger_service.hpp +145 -0
  899. data/ext/third_party/asio/asio/src/examples/cpp03/socks4/.gitignore +10 -0
  900. data/ext/third_party/asio/asio/src/examples/cpp03/socks4/socks4.hpp +144 -0
  901. data/ext/third_party/asio/asio/src/examples/cpp03/socks4/sync_client.cpp +94 -0
  902. data/ext/third_party/asio/asio/src/examples/cpp03/spawn/.gitignore +12 -0
  903. data/ext/third_party/asio/asio/src/examples/cpp03/spawn/echo_server.cpp +122 -0
  904. data/ext/third_party/asio/asio/src/examples/cpp03/spawn/parallel_grep.cpp +89 -0
  905. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/.gitignore +11 -0
  906. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/README +8 -0
  907. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/ca.pem +49 -0
  908. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/client.cpp +157 -0
  909. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/dh2048.pem +8 -0
  910. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/server.cpp +170 -0
  911. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/server.pem +71 -0
  912. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/.gitignore +11 -0
  913. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/async_tcp_client.cpp +311 -0
  914. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/blocking_tcp_client.cpp +191 -0
  915. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/blocking_token_tcp_client.cpp +200 -0
  916. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/blocking_udp_client.cpp +154 -0
  917. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/server.cpp +433 -0
  918. data/ext/third_party/asio/asio/src/examples/cpp03/timers/.gitignore +10 -0
  919. data/ext/third_party/asio/asio/src/examples/cpp03/timers/time_t_timer.cpp +106 -0
  920. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime1/.gitignore +10 -0
  921. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime1/client.cpp +57 -0
  922. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime2/.gitignore +10 -0
  923. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime2/server.cpp +50 -0
  924. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime3/.gitignore +10 -0
  925. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime3/server.cpp +119 -0
  926. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime4/.gitignore +10 -0
  927. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime4/client.cpp +52 -0
  928. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime5/.gitignore +10 -0
  929. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime5/server.cpp +53 -0
  930. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime6/.gitignore +10 -0
  931. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime6/server.cpp +89 -0
  932. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime7/.gitignore +10 -0
  933. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime7/server.cpp +160 -0
  934. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime_dox.txt +500 -0
  935. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/index_dox.txt +48 -0
  936. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer1/.gitignore +10 -0
  937. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer1/timer.cpp +24 -0
  938. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer2/.gitignore +10 -0
  939. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer2/timer.cpp +29 -0
  940. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer3/.gitignore +10 -0
  941. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer3/timer.cpp +43 -0
  942. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer4/.gitignore +10 -0
  943. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer4/timer.cpp +54 -0
  944. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer5/.gitignore +10 -0
  945. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer5/timer.cpp +80 -0
  946. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer_dox.txt +378 -0
  947. data/ext/third_party/asio/asio/src/examples/cpp03/windows/.gitignore +10 -0
  948. data/ext/third_party/asio/asio/src/examples/cpp03/windows/transmit_file.cpp +177 -0
  949. data/ext/third_party/asio/asio/src/examples/cpp11/Makefile.am +161 -0
  950. data/ext/third_party/asio/asio/src/examples/cpp11/allocation/.gitignore +10 -0
  951. data/ext/third_party/asio/asio/src/examples/cpp11/allocation/server.cpp +255 -0
  952. data/ext/third_party/asio/asio/src/examples/cpp11/buffers/.gitignore +10 -0
  953. data/ext/third_party/asio/asio/src/examples/cpp11/buffers/reference_counted.cpp +122 -0
  954. data/ext/third_party/asio/asio/src/examples/cpp11/chat/.gitignore +11 -0
  955. data/ext/third_party/asio/asio/src/examples/cpp11/chat/chat_client.cpp +167 -0
  956. data/ext/third_party/asio/asio/src/examples/cpp11/chat/chat_message.hpp +91 -0
  957. data/ext/third_party/asio/asio/src/examples/cpp11/chat/chat_server.cpp +227 -0
  958. data/ext/third_party/asio/asio/src/examples/cpp11/echo/.gitignore +11 -0
  959. data/ext/third_party/asio/asio/src/examples/cpp11/echo/async_tcp_echo_server.cpp +114 -0
  960. data/ext/third_party/asio/asio/src/examples/cpp11/echo/async_udp_echo_server.cpp +82 -0
  961. data/ext/third_party/asio/asio/src/examples/cpp11/echo/blocking_tcp_echo_client.cpp +55 -0
  962. data/ext/third_party/asio/asio/src/examples/cpp11/echo/blocking_tcp_echo_server.cpp +74 -0
  963. data/ext/third_party/asio/asio/src/examples/cpp11/echo/blocking_udp_echo_client.cpp +58 -0
  964. data/ext/third_party/asio/asio/src/examples/cpp11/echo/blocking_udp_echo_server.cpp +52 -0
  965. data/ext/third_party/asio/asio/src/examples/cpp11/executors/.gitignore +5 -0
  966. data/ext/third_party/asio/asio/src/examples/cpp11/executors/actor.cpp +286 -0
  967. data/ext/third_party/asio/asio/src/examples/cpp11/executors/bank_account_1.cpp +54 -0
  968. data/ext/third_party/asio/asio/src/examples/cpp11/executors/bank_account_2.cpp +54 -0
  969. data/ext/third_party/asio/asio/src/examples/cpp11/executors/fork_join.cpp +328 -0
  970. data/ext/third_party/asio/asio/src/examples/cpp11/executors/pipeline.cpp +299 -0
  971. data/ext/third_party/asio/asio/src/examples/cpp11/executors/priority_scheduler.cpp +174 -0
  972. data/ext/third_party/asio/asio/src/examples/cpp11/fork/.gitignore +11 -0
  973. data/ext/third_party/asio/asio/src/examples/cpp11/fork/daemon.cpp +189 -0
  974. data/ext/third_party/asio/asio/src/examples/cpp11/fork/process_per_connection.cpp +162 -0
  975. data/ext/third_party/asio/asio/src/examples/cpp11/futures/.gitignore +11 -0
  976. data/ext/third_party/asio/asio/src/examples/cpp11/futures/daytime_client.cpp +94 -0
  977. data/ext/third_party/asio/asio/src/examples/cpp11/handler_tracking/custom_tracking.hpp +201 -0
  978. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/.gitignore +11 -0
  979. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/connection.cpp +94 -0
  980. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/connection.hpp +79 -0
  981. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/connection_manager.cpp +40 -0
  982. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/connection_manager.hpp +48 -0
  983. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/header.hpp +28 -0
  984. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/main.cpp +43 -0
  985. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/mime_types.cpp +45 -0
  986. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/mime_types.hpp +27 -0
  987. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/reply.cpp +255 -0
  988. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/reply.hpp +64 -0
  989. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request.hpp +34 -0
  990. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request_handler.cpp +121 -0
  991. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request_handler.hpp +47 -0
  992. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request_parser.cpp +315 -0
  993. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request_parser.hpp +96 -0
  994. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/server.cpp +94 -0
  995. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/server.hpp +64 -0
  996. data/ext/third_party/asio/asio/src/examples/cpp11/invocation/.gitignore +10 -0
  997. data/ext/third_party/asio/asio/src/examples/cpp11/invocation/prioritised_handlers.cpp +202 -0
  998. data/ext/third_party/asio/asio/src/examples/cpp11/iostreams/.gitignore +11 -0
  999. data/ext/third_party/asio/asio/src/examples/cpp11/iostreams/http_client.cpp +91 -0
  1000. data/ext/third_party/asio/asio/src/examples/cpp11/local/.gitignore +13 -0
  1001. data/ext/third_party/asio/asio/src/examples/cpp11/local/connect_pair.cpp +129 -0
  1002. data/ext/third_party/asio/asio/src/examples/cpp11/local/iostream_client.cpp +61 -0
  1003. data/ext/third_party/asio/asio/src/examples/cpp11/local/stream_client.cpp +60 -0
  1004. data/ext/third_party/asio/asio/src/examples/cpp11/local/stream_server.cpp +121 -0
  1005. data/ext/third_party/asio/asio/src/examples/cpp11/multicast/.gitignore +11 -0
  1006. data/ext/third_party/asio/asio/src/examples/cpp11/multicast/receiver.cpp +88 -0
  1007. data/ext/third_party/asio/asio/src/examples/cpp11/multicast/sender.cpp +91 -0
  1008. data/ext/third_party/asio/asio/src/examples/cpp11/nonblocking/.gitignore +10 -0
  1009. data/ext/third_party/asio/asio/src/examples/cpp11/nonblocking/third_party_lib.cpp +212 -0
  1010. data/ext/third_party/asio/asio/src/examples/cpp11/operations/.gitignore +10 -0
  1011. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_1.cpp +113 -0
  1012. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_2.cpp +131 -0
  1013. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_3.cpp +192 -0
  1014. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_4.cpp +207 -0
  1015. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_5.cpp +243 -0
  1016. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_6.cpp +302 -0
  1017. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_7.cpp +222 -0
  1018. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_8.cpp +217 -0
  1019. data/ext/third_party/asio/asio/src/examples/cpp11/socks4/.gitignore +10 -0
  1020. data/ext/third_party/asio/asio/src/examples/cpp11/socks4/socks4.hpp +143 -0
  1021. data/ext/third_party/asio/asio/src/examples/cpp11/socks4/sync_client.cpp +93 -0
  1022. data/ext/third_party/asio/asio/src/examples/cpp11/spawn/.gitignore +12 -0
  1023. data/ext/third_party/asio/asio/src/examples/cpp11/spawn/echo_server.cpp +111 -0
  1024. data/ext/third_party/asio/asio/src/examples/cpp11/spawn/parallel_grep.cpp +84 -0
  1025. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/.gitignore +11 -0
  1026. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/README +8 -0
  1027. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/ca.pem +49 -0
  1028. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/client.cpp +165 -0
  1029. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/dh2048.pem +8 -0
  1030. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/server.cpp +143 -0
  1031. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/server.pem +71 -0
  1032. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/.gitignore +11 -0
  1033. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/async_tcp_client.cpp +311 -0
  1034. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/blocking_tcp_client.cpp +192 -0
  1035. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/blocking_token_tcp_client.cpp +197 -0
  1036. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/blocking_udp_client.cpp +155 -0
  1037. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/server.cpp +433 -0
  1038. data/ext/third_party/asio/asio/src/examples/cpp11/timers/.gitignore +10 -0
  1039. data/ext/third_party/asio/asio/src/examples/cpp11/timers/time_t_timer.cpp +106 -0
  1040. data/ext/third_party/asio/asio/src/examples/cpp14/Makefile.am +64 -0
  1041. data/ext/third_party/asio/asio/src/examples/cpp14/echo/.gitignore +11 -0
  1042. data/ext/third_party/asio/asio/src/examples/cpp14/echo/async_tcp_echo_server.cpp +117 -0
  1043. data/ext/third_party/asio/asio/src/examples/cpp14/echo/async_udp_echo_server.cpp +83 -0
  1044. data/ext/third_party/asio/asio/src/examples/cpp14/echo/blocking_tcp_echo_client.cpp +55 -0
  1045. data/ext/third_party/asio/asio/src/examples/cpp14/echo/blocking_tcp_echo_server.cpp +77 -0
  1046. data/ext/third_party/asio/asio/src/examples/cpp14/echo/blocking_udp_echo_client.cpp +59 -0
  1047. data/ext/third_party/asio/asio/src/examples/cpp14/echo/blocking_udp_echo_server.cpp +53 -0
  1048. data/ext/third_party/asio/asio/src/examples/cpp14/executors/.gitignore +6 -0
  1049. data/ext/third_party/asio/asio/src/examples/cpp14/executors/actor.cpp +281 -0
  1050. data/ext/third_party/asio/asio/src/examples/cpp14/executors/async_1.cpp +47 -0
  1051. data/ext/third_party/asio/asio/src/examples/cpp14/executors/async_2.cpp +68 -0
  1052. data/ext/third_party/asio/asio/src/examples/cpp14/executors/bank_account_1.cpp +54 -0
  1053. data/ext/third_party/asio/asio/src/examples/cpp14/executors/bank_account_2.cpp +53 -0
  1054. data/ext/third_party/asio/asio/src/examples/cpp14/executors/fork_join.cpp +327 -0
  1055. data/ext/third_party/asio/asio/src/examples/cpp14/executors/pipeline.cpp +294 -0
  1056. data/ext/third_party/asio/asio/src/examples/cpp14/executors/priority_scheduler.cpp +173 -0
  1057. data/ext/third_party/asio/asio/src/examples/cpp14/iostreams/.gitignore +11 -0
  1058. data/ext/third_party/asio/asio/src/examples/cpp14/iostreams/http_client.cpp +91 -0
  1059. data/ext/third_party/asio/asio/src/examples/cpp14/operations/.gitignore +10 -0
  1060. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_1.cpp +113 -0
  1061. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_2.cpp +131 -0
  1062. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_3.cpp +186 -0
  1063. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_4.cpp +201 -0
  1064. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_5.cpp +238 -0
  1065. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_6.cpp +298 -0
  1066. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_7.cpp +219 -0
  1067. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_8.cpp +212 -0
  1068. data/ext/third_party/asio/asio/src/examples/cpp17/Makefile.am +8 -0
  1069. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/chat_server.cpp +225 -0
  1070. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/echo_server.cpp +76 -0
  1071. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/echo_server_with_default.cpp +78 -0
  1072. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/range_based_for.cpp +107 -0
  1073. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/refactored_echo_server.cpp +85 -0
  1074. data/ext/third_party/asio/asio/src/tests/.gitignore +11 -0
  1075. data/ext/third_party/asio/asio/src/tests/Makefile.am +432 -0
  1076. data/ext/third_party/asio/asio/src/tests/latency/.gitignore +11 -0
  1077. data/ext/third_party/asio/asio/src/tests/latency/allocator.hpp +52 -0
  1078. data/ext/third_party/asio/asio/src/tests/latency/high_res_clock.hpp +53 -0
  1079. data/ext/third_party/asio/asio/src/tests/latency/tcp_client.cpp +124 -0
  1080. data/ext/third_party/asio/asio/src/tests/latency/tcp_server.cpp +114 -0
  1081. data/ext/third_party/asio/asio/src/tests/latency/udp_client.cpp +104 -0
  1082. data/ext/third_party/asio/asio/src/tests/latency/udp_server.cpp +125 -0
  1083. data/ext/third_party/asio/asio/src/tests/performance/.gitignore +11 -0
  1084. data/ext/third_party/asio/asio/src/tests/performance/client.cpp +286 -0
  1085. data/ext/third_party/asio/asio/src/tests/performance/handler_allocator.hpp +112 -0
  1086. data/ext/third_party/asio/asio/src/tests/performance/server.cpp +233 -0
  1087. data/ext/third_party/asio/asio/src/tests/unit/.gitignore +75 -0
  1088. data/ext/third_party/asio/asio/src/tests/unit/archetypes/async_ops.hpp +415 -0
  1089. data/ext/third_party/asio/asio/src/tests/unit/archetypes/async_result.hpp +94 -0
  1090. data/ext/third_party/asio/asio/src/tests/unit/archetypes/gettable_socket_option.hpp +54 -0
  1091. data/ext/third_party/asio/asio/src/tests/unit/archetypes/io_control_command.hpp +32 -0
  1092. data/ext/third_party/asio/asio/src/tests/unit/archetypes/settable_socket_option.hpp +49 -0
  1093. data/ext/third_party/asio/asio/src/tests/unit/associated_allocator.cpp +25 -0
  1094. data/ext/third_party/asio/asio/src/tests/unit/associated_executor.cpp +25 -0
  1095. data/ext/third_party/asio/asio/src/tests/unit/async_result.cpp +25 -0
  1096. data/ext/third_party/asio/asio/src/tests/unit/awaitable.cpp +25 -0
  1097. data/ext/third_party/asio/asio/src/tests/unit/basic_datagram_socket.cpp +25 -0
  1098. data/ext/third_party/asio/asio/src/tests/unit/basic_deadline_timer.cpp +25 -0
  1099. data/ext/third_party/asio/asio/src/tests/unit/basic_raw_socket.cpp +25 -0
  1100. data/ext/third_party/asio/asio/src/tests/unit/basic_seq_packet_socket.cpp +25 -0
  1101. data/ext/third_party/asio/asio/src/tests/unit/basic_serial_port.cpp +26 -0
  1102. data/ext/third_party/asio/asio/src/tests/unit/basic_signal_set.cpp +25 -0
  1103. data/ext/third_party/asio/asio/src/tests/unit/basic_socket.cpp +25 -0
  1104. data/ext/third_party/asio/asio/src/tests/unit/basic_socket_acceptor.cpp +25 -0
  1105. data/ext/third_party/asio/asio/src/tests/unit/basic_stream_socket.cpp +25 -0
  1106. data/ext/third_party/asio/asio/src/tests/unit/basic_streambuf.cpp +25 -0
  1107. data/ext/third_party/asio/asio/src/tests/unit/basic_waitable_timer.cpp +25 -0
  1108. data/ext/third_party/asio/asio/src/tests/unit/bind_executor.cpp +25 -0
  1109. data/ext/third_party/asio/asio/src/tests/unit/buffer.cpp +830 -0
  1110. data/ext/third_party/asio/asio/src/tests/unit/buffered_read_stream.cpp +338 -0
  1111. data/ext/third_party/asio/asio/src/tests/unit/buffered_stream.cpp +364 -0
  1112. data/ext/third_party/asio/asio/src/tests/unit/buffered_write_stream.cpp +353 -0
  1113. data/ext/third_party/asio/asio/src/tests/unit/buffers_iterator.cpp +292 -0
  1114. data/ext/third_party/asio/asio/src/tests/unit/co_spawn.cpp +25 -0
  1115. data/ext/third_party/asio/asio/src/tests/unit/completion_condition.cpp +25 -0
  1116. data/ext/third_party/asio/asio/src/tests/unit/compose.cpp +185 -0
  1117. data/ext/third_party/asio/asio/src/tests/unit/connect.cpp +1190 -0
  1118. data/ext/third_party/asio/asio/src/tests/unit/coroutine.cpp +112 -0
  1119. data/ext/third_party/asio/asio/src/tests/unit/deadline_timer.cpp +392 -0
  1120. data/ext/third_party/asio/asio/src/tests/unit/defer.cpp +25 -0
  1121. data/ext/third_party/asio/asio/src/tests/unit/detached.cpp +25 -0
  1122. data/ext/third_party/asio/asio/src/tests/unit/dispatch.cpp +25 -0
  1123. data/ext/third_party/asio/asio/src/tests/unit/error.cpp +89 -0
  1124. data/ext/third_party/asio/asio/src/tests/unit/execution_context.cpp +25 -0
  1125. data/ext/third_party/asio/asio/src/tests/unit/executor.cpp +25 -0
  1126. data/ext/third_party/asio/asio/src/tests/unit/executor_work_guard.cpp +25 -0
  1127. data/ext/third_party/asio/asio/src/tests/unit/generic/.gitignore +14 -0
  1128. data/ext/third_party/asio/asio/src/tests/unit/generic/basic_endpoint.cpp +25 -0
  1129. data/ext/third_party/asio/asio/src/tests/unit/generic/datagram_protocol.cpp +263 -0
  1130. data/ext/third_party/asio/asio/src/tests/unit/generic/raw_protocol.cpp +263 -0
  1131. data/ext/third_party/asio/asio/src/tests/unit/generic/seq_packet_protocol.cpp +205 -0
  1132. data/ext/third_party/asio/asio/src/tests/unit/generic/stream_protocol.cpp +248 -0
  1133. data/ext/third_party/asio/asio/src/tests/unit/high_resolution_timer.cpp +30 -0
  1134. data/ext/third_party/asio/asio/src/tests/unit/io_context.cpp +362 -0
  1135. data/ext/third_party/asio/asio/src/tests/unit/io_context_strand.cpp +325 -0
  1136. data/ext/third_party/asio/asio/src/tests/unit/ip/.gitignore +27 -0
  1137. data/ext/third_party/asio/asio/src/tests/unit/ip/address.cpp +144 -0
  1138. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_endpoint.cpp +25 -0
  1139. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_resolver.cpp +25 -0
  1140. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_resolver_entry.cpp +25 -0
  1141. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_resolver_iterator.cpp +25 -0
  1142. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_resolver_query.cpp +25 -0
  1143. data/ext/third_party/asio/asio/src/tests/unit/ip/host_name.cpp +55 -0
  1144. data/ext/third_party/asio/asio/src/tests/unit/ip/icmp.cpp +577 -0
  1145. data/ext/third_party/asio/asio/src/tests/unit/ip/multicast.cpp +363 -0
  1146. data/ext/third_party/asio/asio/src/tests/unit/ip/network_v4.cpp +314 -0
  1147. data/ext/third_party/asio/asio/src/tests/unit/ip/network_v6.cpp +238 -0
  1148. data/ext/third_party/asio/asio/src/tests/unit/ip/resolver_query_base.cpp +25 -0
  1149. data/ext/third_party/asio/asio/src/tests/unit/ip/tcp.cpp +1346 -0
  1150. data/ext/third_party/asio/asio/src/tests/unit/ip/udp.cpp +673 -0
  1151. data/ext/third_party/asio/asio/src/tests/unit/ip/unicast.cpp +171 -0
  1152. data/ext/third_party/asio/asio/src/tests/unit/ip/v6_only.cpp +135 -0
  1153. data/ext/third_party/asio/asio/src/tests/unit/is_read_buffered.cpp +129 -0
  1154. data/ext/third_party/asio/asio/src/tests/unit/is_write_buffered.cpp +129 -0
  1155. data/ext/third_party/asio/asio/src/tests/unit/local/.gitignore +13 -0
  1156. data/ext/third_party/asio/asio/src/tests/unit/local/basic_endpoint.cpp +25 -0
  1157. data/ext/third_party/asio/asio/src/tests/unit/local/connect_pair.cpp +76 -0
  1158. data/ext/third_party/asio/asio/src/tests/unit/local/datagram_protocol.cpp +242 -0
  1159. data/ext/third_party/asio/asio/src/tests/unit/local/stream_protocol.cpp +219 -0
  1160. data/ext/third_party/asio/asio/src/tests/unit/packaged_task.cpp +25 -0
  1161. data/ext/third_party/asio/asio/src/tests/unit/placeholders.cpp +25 -0
  1162. data/ext/third_party/asio/asio/src/tests/unit/posix/.gitignore +14 -0
  1163. data/ext/third_party/asio/asio/src/tests/unit/posix/basic_descriptor.cpp +25 -0
  1164. data/ext/third_party/asio/asio/src/tests/unit/posix/basic_stream_descriptor.cpp +25 -0
  1165. data/ext/third_party/asio/asio/src/tests/unit/posix/descriptor.cpp +25 -0
  1166. data/ext/third_party/asio/asio/src/tests/unit/posix/descriptor_base.cpp +25 -0
  1167. data/ext/third_party/asio/asio/src/tests/unit/posix/stream_descriptor.cpp +183 -0
  1168. data/ext/third_party/asio/asio/src/tests/unit/post.cpp +25 -0
  1169. data/ext/third_party/asio/asio/src/tests/unit/read.cpp +4997 -0
  1170. data/ext/third_party/asio/asio/src/tests/unit/read_at.cpp +7502 -0
  1171. data/ext/third_party/asio/asio/src/tests/unit/read_until.cpp +1658 -0
  1172. data/ext/third_party/asio/asio/src/tests/unit/redirect_error.cpp +25 -0
  1173. data/ext/third_party/asio/asio/src/tests/unit/serial_port.cpp +173 -0
  1174. data/ext/third_party/asio/asio/src/tests/unit/serial_port_base.cpp +99 -0
  1175. data/ext/third_party/asio/asio/src/tests/unit/signal_set.cpp +95 -0
  1176. data/ext/third_party/asio/asio/src/tests/unit/socket_base.cpp +650 -0
  1177. data/ext/third_party/asio/asio/src/tests/unit/ssl/.gitignore +15 -0
  1178. data/ext/third_party/asio/asio/src/tests/unit/ssl/context.cpp +25 -0
  1179. data/ext/third_party/asio/asio/src/tests/unit/ssl/context_base.cpp +25 -0
  1180. data/ext/third_party/asio/asio/src/tests/unit/ssl/error.cpp +25 -0
  1181. data/ext/third_party/asio/asio/src/tests/unit/ssl/host_name_verification.cpp +25 -0
  1182. data/ext/third_party/asio/asio/src/tests/unit/ssl/rfc2818_verification.cpp +25 -0
  1183. data/ext/third_party/asio/asio/src/tests/unit/ssl/stream.cpp +191 -0
  1184. data/ext/third_party/asio/asio/src/tests/unit/ssl/stream_base.cpp +25 -0
  1185. data/ext/third_party/asio/asio/src/tests/unit/steady_timer.cpp +30 -0
  1186. data/ext/third_party/asio/asio/src/tests/unit/strand.cpp +263 -0
  1187. data/ext/third_party/asio/asio/src/tests/unit/streambuf.cpp +62 -0
  1188. data/ext/third_party/asio/asio/src/tests/unit/system_context.cpp +30 -0
  1189. data/ext/third_party/asio/asio/src/tests/unit/system_executor.cpp +30 -0
  1190. data/ext/third_party/asio/asio/src/tests/unit/system_timer.cpp +399 -0
  1191. data/ext/third_party/asio/asio/src/tests/unit/this_coro.cpp +25 -0
  1192. data/ext/third_party/asio/asio/src/tests/unit/thread.cpp +25 -0
  1193. data/ext/third_party/asio/asio/src/tests/unit/time_traits.cpp +25 -0
  1194. data/ext/third_party/asio/asio/src/tests/unit/ts/.gitignore +17 -0
  1195. data/ext/third_party/asio/asio/src/tests/unit/ts/buffer.cpp +30 -0
  1196. data/ext/third_party/asio/asio/src/tests/unit/ts/executor.cpp +30 -0
  1197. data/ext/third_party/asio/asio/src/tests/unit/ts/internet.cpp +30 -0
  1198. data/ext/third_party/asio/asio/src/tests/unit/ts/io_context.cpp +30 -0
  1199. data/ext/third_party/asio/asio/src/tests/unit/ts/net.cpp +30 -0
  1200. data/ext/third_party/asio/asio/src/tests/unit/ts/netfwd.cpp +33 -0
  1201. data/ext/third_party/asio/asio/src/tests/unit/ts/socket.cpp +30 -0
  1202. data/ext/third_party/asio/asio/src/tests/unit/ts/timer.cpp +30 -0
  1203. data/ext/third_party/asio/asio/src/tests/unit/unit_test.hpp +175 -0
  1204. data/ext/third_party/asio/asio/src/tests/unit/use_awaitable.cpp +25 -0
  1205. data/ext/third_party/asio/asio/src/tests/unit/use_future.cpp +670 -0
  1206. data/ext/third_party/asio/asio/src/tests/unit/uses_executor.cpp +25 -0
  1207. data/ext/third_party/asio/asio/src/tests/unit/wait_traits.cpp +25 -0
  1208. data/ext/third_party/asio/asio/src/tests/unit/windows/.gitignore +18 -0
  1209. data/ext/third_party/asio/asio/src/tests/unit/windows/basic_object_handle.cpp +25 -0
  1210. data/ext/third_party/asio/asio/src/tests/unit/windows/basic_overlapped_handle.cpp +25 -0
  1211. data/ext/third_party/asio/asio/src/tests/unit/windows/basic_random_access_handle.cpp +25 -0
  1212. data/ext/third_party/asio/asio/src/tests/unit/windows/basic_stream_handle.cpp +25 -0
  1213. data/ext/third_party/asio/asio/src/tests/unit/windows/object_handle.cpp +130 -0
  1214. data/ext/third_party/asio/asio/src/tests/unit/windows/overlapped_handle.cpp +26 -0
  1215. data/ext/third_party/asio/asio/src/tests/unit/windows/overlapped_ptr.cpp +107 -0
  1216. data/ext/third_party/asio/asio/src/tests/unit/windows/random_access_handle.cpp +155 -0
  1217. data/ext/third_party/asio/asio/src/tests/unit/windows/stream_handle.cpp +148 -0
  1218. data/ext/third_party/asio/asio/src/tests/unit/write.cpp +4904 -0
  1219. data/ext/third_party/asio/asio/src/tests/unit/write_at.cpp +7563 -0
  1220. data/ext/third_party/asio/asio/src/tools/handlerviz.pl +299 -0
  1221. data/ext/third_party/asio/asio/tsify.pl +574 -0
  1222. data/ext/third_party/gsl/.clang-format +34 -0
  1223. data/ext/third_party/gsl/.github/workflows/main.yml +94 -0
  1224. data/ext/third_party/gsl/.gitignore +16 -0
  1225. data/ext/third_party/gsl/.travis.yml +551 -0
  1226. data/ext/third_party/gsl/CMakeLists.txt +119 -0
  1227. data/ext/third_party/gsl/CMakeSettings.json +18 -0
  1228. data/ext/third_party/gsl/CONTRIBUTING.md +29 -0
  1229. data/ext/third_party/gsl/GSL.natvis +98 -0
  1230. data/ext/third_party/gsl/LICENSE +21 -0
  1231. data/ext/third_party/gsl/README.md +124 -0
  1232. data/ext/third_party/gsl/ThirdPartyNotices.txt +41 -0
  1233. data/ext/third_party/gsl/appveyor.yml +128 -0
  1234. data/ext/third_party/gsl/include/gsl/gsl +29 -0
  1235. data/ext/third_party/gsl/include/gsl/gsl_algorithm +61 -0
  1236. data/ext/third_party/gsl/include/gsl/gsl_assert +133 -0
  1237. data/ext/third_party/gsl/include/gsl/gsl_byte +209 -0
  1238. data/ext/third_party/gsl/include/gsl/gsl_util +171 -0
  1239. data/ext/third_party/gsl/include/gsl/multi_span +2273 -0
  1240. data/ext/third_party/gsl/include/gsl/pointers +301 -0
  1241. data/ext/third_party/gsl/include/gsl/span +764 -0
  1242. data/ext/third_party/gsl/include/gsl/span_ext +198 -0
  1243. data/ext/third_party/gsl/include/gsl/string_span +716 -0
  1244. data/ext/third_party/gsl/tests/CMakeLists.txt +267 -0
  1245. data/ext/third_party/gsl/tests/CMakeLists.txt.in +14 -0
  1246. data/ext/third_party/gsl/tests/algorithm_tests.cpp +227 -0
  1247. data/ext/third_party/gsl/tests/assertion_tests.cpp +61 -0
  1248. data/ext/third_party/gsl/tests/at_tests.cpp +135 -0
  1249. data/ext/third_party/gsl/tests/bounds_tests.cpp +102 -0
  1250. data/ext/third_party/gsl/tests/byte_tests.cpp +129 -0
  1251. data/ext/third_party/gsl/tests/multi_span_tests.cpp +1866 -0
  1252. data/ext/third_party/gsl/tests/no_exception_ensure_tests.cpp +48 -0
  1253. data/ext/third_party/gsl/tests/notnull_tests.cpp +535 -0
  1254. data/ext/third_party/gsl/tests/owner_tests.cpp +43 -0
  1255. data/ext/third_party/gsl/tests/span_compatibility_tests.cpp +1021 -0
  1256. data/ext/third_party/gsl/tests/span_ext_tests.cpp +360 -0
  1257. data/ext/third_party/gsl/tests/span_tests.cpp +1244 -0
  1258. data/ext/third_party/gsl/tests/strict_notnull_tests.cpp +190 -0
  1259. data/ext/third_party/gsl/tests/strided_span_tests.cpp +790 -0
  1260. data/ext/third_party/gsl/tests/string_span_tests.cpp +1217 -0
  1261. data/ext/third_party/gsl/tests/utils_tests.cpp +129 -0
  1262. data/ext/third_party/http_parser/.gitignore +30 -0
  1263. data/ext/third_party/http_parser/.mailmap +8 -0
  1264. data/ext/third_party/http_parser/.travis.yml +13 -0
  1265. data/ext/third_party/http_parser/AUTHORS +68 -0
  1266. data/ext/third_party/http_parser/LICENSE-MIT +19 -0
  1267. data/ext/third_party/http_parser/README.md +246 -0
  1268. data/ext/third_party/http_parser/bench.c +128 -0
  1269. data/ext/third_party/http_parser/contrib/parsertrace.c +157 -0
  1270. data/ext/third_party/http_parser/contrib/url_parser.c +47 -0
  1271. data/ext/third_party/http_parser/fuzzers/fuzz_parser.c +26 -0
  1272. data/ext/third_party/http_parser/fuzzers/fuzz_url.c +14 -0
  1273. data/ext/third_party/http_parser/http_parser.c +2568 -0
  1274. data/ext/third_party/http_parser/http_parser.gyp +111 -0
  1275. data/ext/third_party/http_parser/http_parser.h +447 -0
  1276. data/ext/third_party/http_parser/test.c +4600 -0
  1277. data/ext/third_party/json/.appveyor.yml +44 -0
  1278. data/ext/third_party/json/.clang-format +84 -0
  1279. data/ext/third_party/json/.conan/build.py +80 -0
  1280. data/ext/third_party/json/.conan/test_package/CMakeLists.txt +12 -0
  1281. data/ext/third_party/json/.conan/test_package/conanfile.py +24 -0
  1282. data/ext/third_party/json/.conan/test_package/test_package.cpp +16 -0
  1283. data/ext/third_party/json/.gitignore +3 -0
  1284. data/ext/third_party/json/.travis.yml +173 -0
  1285. data/ext/third_party/json/CMakeLists.txt +44 -0
  1286. data/ext/third_party/json/LICENSE +21 -0
  1287. data/ext/third_party/json/LICENSE.double-conversion +32 -0
  1288. data/ext/third_party/json/LICENSE.itoa +19 -0
  1289. data/ext/third_party/json/LICENSE.ryu +201 -0
  1290. data/ext/third_party/json/README.md +149 -0
  1291. data/ext/third_party/json/conanfile.py +28 -0
  1292. data/ext/third_party/json/contrib/nlohmann.cpp +48 -0
  1293. data/ext/third_party/json/contrib/nlohmann/from_value.hpp +62 -0
  1294. data/ext/third_party/json/contrib/nlohmann/json.hpp +18928 -0
  1295. data/ext/third_party/json/contrib/nlohmann/to_value.hpp +109 -0
  1296. data/ext/third_party/json/doc/Advanced-Use-Cases.md +83 -0
  1297. data/ext/third_party/json/doc/Batteries-Included.md +212 -0
  1298. data/ext/third_party/json/doc/Binding-Traits.md +319 -0
  1299. data/ext/third_party/json/doc/Changelog.md +31 -0
  1300. data/ext/third_party/json/doc/Common-Use-Cases.md +148 -0
  1301. data/ext/third_party/json/doc/Design-Decisions.md +36 -0
  1302. data/ext/third_party/json/doc/Events-Interface.md +140 -0
  1303. data/ext/third_party/json/doc/Getting-Started.md +19 -0
  1304. data/ext/third_party/json/doc/Instance-Sharing.md +163 -0
  1305. data/ext/third_party/json/doc/Interoperability.md +75 -0
  1306. data/ext/third_party/json/doc/Overview.md +24 -0
  1307. data/ext/third_party/json/doc/Overview.png +0 -0
  1308. data/ext/third_party/json/doc/Parser-Interface.md +84 -0
  1309. data/ext/third_party/json/doc/README.md +78 -0
  1310. data/ext/third_party/json/doc/Scratchpad.md +25 -0
  1311. data/ext/third_party/json/doc/Type-Traits.md +364 -0
  1312. data/ext/third_party/json/doc/Types.png +0 -0
  1313. data/ext/third_party/json/doc/Value-Class.md +525 -0
  1314. data/ext/third_party/json/include/tao/json.hpp +45 -0
  1315. data/ext/third_party/json/include/tao/json/basic_value.hpp +941 -0
  1316. data/ext/third_party/json/include/tao/json/binary.hpp +103 -0
  1317. data/ext/third_party/json/include/tao/json/binary_view.hpp +31 -0
  1318. data/ext/third_party/json/include/tao/json/binding.hpp +71 -0
  1319. data/ext/third_party/json/include/tao/json/binding/constant.hpp +232 -0
  1320. data/ext/third_party/json/include/tao/json/binding/element.hpp +182 -0
  1321. data/ext/third_party/json/include/tao/json/binding/factory.hpp +250 -0
  1322. data/ext/third_party/json/include/tao/json/binding/for_nothing_value.hpp +17 -0
  1323. data/ext/third_party/json/include/tao/json/binding/for_unknown_key.hpp +17 -0
  1324. data/ext/third_party/json/include/tao/json/binding/inherit.hpp +14 -0
  1325. data/ext/third_party/json/include/tao/json/binding/internal/array.hpp +103 -0
  1326. data/ext/third_party/json/include/tao/json/binding/internal/inherit.hpp +45 -0
  1327. data/ext/third_party/json/include/tao/json/binding/internal/object.hpp +267 -0
  1328. data/ext/third_party/json/include/tao/json/binding/internal/type_key.hpp +54 -0
  1329. data/ext/third_party/json/include/tao/json/binding/member.hpp +32 -0
  1330. data/ext/third_party/json/include/tao/json/binding/member_kind.hpp +17 -0
  1331. data/ext/third_party/json/include/tao/json/binding/versions.hpp +127 -0
  1332. data/ext/third_party/json/include/tao/json/cbor.hpp +18 -0
  1333. data/ext/third_party/json/include/tao/json/cbor/consume_file.hpp +34 -0
  1334. data/ext/third_party/json/include/tao/json/cbor/consume_string.hpp +32 -0
  1335. data/ext/third_party/json/include/tao/json/cbor/events/from_file.hpp +27 -0
  1336. data/ext/third_party/json/include/tao/json/cbor/events/from_input.hpp +43 -0
  1337. data/ext/third_party/json/include/tao/json/cbor/events/from_string.hpp +37 -0
  1338. data/ext/third_party/json/include/tao/json/cbor/events/to_stream.hpp +161 -0
  1339. data/ext/third_party/json/include/tao/json/cbor/events/to_string.hpp +31 -0
  1340. data/ext/third_party/json/include/tao/json/cbor/from_file.hpp +33 -0
  1341. data/ext/third_party/json/include/tao/json/cbor/from_input.hpp +33 -0
  1342. data/ext/third_party/json/include/tao/json/cbor/from_string.hpp +32 -0
  1343. data/ext/third_party/json/include/tao/json/cbor/internal/grammar.hpp +417 -0
  1344. data/ext/third_party/json/include/tao/json/cbor/internal/major.hpp +28 -0
  1345. data/ext/third_party/json/include/tao/json/cbor/parts_parser.hpp +392 -0
  1346. data/ext/third_party/json/include/tao/json/cbor/to_stream.hpp +27 -0
  1347. data/ext/third_party/json/include/tao/json/cbor/to_string.hpp +28 -0
  1348. data/ext/third_party/json/include/tao/json/consume.hpp +43 -0
  1349. data/ext/third_party/json/include/tao/json/consume_file.hpp +33 -0
  1350. data/ext/third_party/json/include/tao/json/consume_string.hpp +31 -0
  1351. data/ext/third_party/json/include/tao/json/contrib/array_traits.hpp +43 -0
  1352. data/ext/third_party/json/include/tao/json/contrib/deque_traits.hpp +41 -0
  1353. data/ext/third_party/json/include/tao/json/contrib/diff.hpp +106 -0
  1354. data/ext/third_party/json/include/tao/json/contrib/get.hpp +152 -0
  1355. data/ext/third_party/json/include/tao/json/contrib/internal/array_traits.hpp +92 -0
  1356. data/ext/third_party/json/include/tao/json/contrib/internal/indirect_traits.hpp +69 -0
  1357. data/ext/third_party/json/include/tao/json/contrib/internal/object_traits.hpp +105 -0
  1358. data/ext/third_party/json/include/tao/json/contrib/internal/type_traits.hpp +36 -0
  1359. data/ext/third_party/json/include/tao/json/contrib/list_traits.hpp +41 -0
  1360. data/ext/third_party/json/include/tao/json/contrib/map_traits.hpp +43 -0
  1361. data/ext/third_party/json/include/tao/json/contrib/multimap_traits.hpp +43 -0
  1362. data/ext/third_party/json/include/tao/json/contrib/multiset_traits.hpp +41 -0
  1363. data/ext/third_party/json/include/tao/json/contrib/pair_traits.hpp +21 -0
  1364. data/ext/third_party/json/include/tao/json/contrib/patch.hpp +105 -0
  1365. data/ext/third_party/json/include/tao/json/contrib/pointer_traits.hpp +59 -0
  1366. data/ext/third_party/json/include/tao/json/contrib/position.hpp +166 -0
  1367. data/ext/third_party/json/include/tao/json/contrib/reference.hpp +115 -0
  1368. data/ext/third_party/json/include/tao/json/contrib/schema.hpp +1851 -0
  1369. data/ext/third_party/json/include/tao/json/contrib/set_traits.hpp +41 -0
  1370. data/ext/third_party/json/include/tao/json/contrib/shared_ptr_traits.hpp +90 -0
  1371. data/ext/third_party/json/include/tao/json/contrib/traits.hpp +121 -0
  1372. data/ext/third_party/json/include/tao/json/contrib/tuple_traits.hpp +51 -0
  1373. data/ext/third_party/json/include/tao/json/contrib/unique_ptr_traits.hpp +89 -0
  1374. data/ext/third_party/json/include/tao/json/contrib/unordered_map_traits.hpp +43 -0
  1375. data/ext/third_party/json/include/tao/json/contrib/unordered_set_traits.hpp +41 -0
  1376. data/ext/third_party/json/include/tao/json/contrib/vector_bool_traits.hpp +45 -0
  1377. data/ext/third_party/json/include/tao/json/contrib/vector_traits.hpp +51 -0
  1378. data/ext/third_party/json/include/tao/json/events.hpp +47 -0
  1379. data/ext/third_party/json/include/tao/json/events/apply.hpp +20 -0
  1380. data/ext/third_party/json/include/tao/json/events/binary_to_base64.hpp +26 -0
  1381. data/ext/third_party/json/include/tao/json/events/binary_to_base64url.hpp +28 -0
  1382. data/ext/third_party/json/include/tao/json/events/binary_to_exception.hpp +27 -0
  1383. data/ext/third_party/json/include/tao/json/events/binary_to_hex.hpp +26 -0
  1384. data/ext/third_party/json/include/tao/json/events/compare.hpp +265 -0
  1385. data/ext/third_party/json/include/tao/json/events/debug.hpp +145 -0
  1386. data/ext/third_party/json/include/tao/json/events/discard.hpp +43 -0
  1387. data/ext/third_party/json/include/tao/json/events/from_file.hpp +28 -0
  1388. data/ext/third_party/json/include/tao/json/events/from_input.hpp +45 -0
  1389. data/ext/third_party/json/include/tao/json/events/from_stream.hpp +33 -0
  1390. data/ext/third_party/json/include/tao/json/events/from_string.hpp +38 -0
  1391. data/ext/third_party/json/include/tao/json/events/from_value.hpp +202 -0
  1392. data/ext/third_party/json/include/tao/json/events/hash.hpp +174 -0
  1393. data/ext/third_party/json/include/tao/json/events/invalid_string_to_binary.hpp +50 -0
  1394. data/ext/third_party/json/include/tao/json/events/invalid_string_to_exception.hpp +49 -0
  1395. data/ext/third_party/json/include/tao/json/events/invalid_string_to_hex.hpp +48 -0
  1396. data/ext/third_party/json/include/tao/json/events/key_camel_case_to_snake_case.hpp +62 -0
  1397. data/ext/third_party/json/include/tao/json/events/key_snake_case_to_camel_case.hpp +57 -0
  1398. data/ext/third_party/json/include/tao/json/events/limit_nesting_depth.hpp +82 -0
  1399. data/ext/third_party/json/include/tao/json/events/limit_value_count.hpp +46 -0
  1400. data/ext/third_party/json/include/tao/json/events/non_finite_to_exception.hpp +31 -0
  1401. data/ext/third_party/json/include/tao/json/events/non_finite_to_null.hpp +32 -0
  1402. data/ext/third_party/json/include/tao/json/events/non_finite_to_string.hpp +40 -0
  1403. data/ext/third_party/json/include/tao/json/events/prefer_signed.hpp +32 -0
  1404. data/ext/third_party/json/include/tao/json/events/prefer_unsigned.hpp +32 -0
  1405. data/ext/third_party/json/include/tao/json/events/produce.hpp +22 -0
  1406. data/ext/third_party/json/include/tao/json/events/ref.hpp +111 -0
  1407. data/ext/third_party/json/include/tao/json/events/statistics.hpp +112 -0
  1408. data/ext/third_party/json/include/tao/json/events/tee.hpp +386 -0
  1409. data/ext/third_party/json/include/tao/json/events/to_pretty_stream.hpp +172 -0
  1410. data/ext/third_party/json/include/tao/json/events/to_stream.hpp +142 -0
  1411. data/ext/third_party/json/include/tao/json/events/to_string.hpp +33 -0
  1412. data/ext/third_party/json/include/tao/json/events/to_value.hpp +137 -0
  1413. data/ext/third_party/json/include/tao/json/events/transformer.hpp +70 -0
  1414. data/ext/third_party/json/include/tao/json/events/validate_event_order.hpp +411 -0
  1415. data/ext/third_party/json/include/tao/json/events/validate_keys.hpp +51 -0
  1416. data/ext/third_party/json/include/tao/json/events/virtual_base.hpp +192 -0
  1417. data/ext/third_party/json/include/tao/json/events/virtual_ref.hpp +170 -0
  1418. data/ext/third_party/json/include/tao/json/external/double.hpp +1313 -0
  1419. data/ext/third_party/json/include/tao/json/external/itoa.hpp +149 -0
  1420. data/ext/third_party/json/include/tao/json/external/pegtl.hpp +53 -0
  1421. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/analyze_cycles.hpp +127 -0
  1422. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/counted.hpp +23 -0
  1423. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/generic.hpp +31 -0
  1424. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/grammar_info.hpp +32 -0
  1425. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/insert_guard.hpp +51 -0
  1426. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/insert_rules.hpp +25 -0
  1427. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/rule_info.hpp +29 -0
  1428. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/rule_type.hpp +21 -0
  1429. data/ext/third_party/json/include/tao/json/external/pegtl/analyze.hpp +21 -0
  1430. data/ext/third_party/json/include/tao/json/external/pegtl/apply_mode.hpp +19 -0
  1431. data/ext/third_party/json/include/tao/json/external/pegtl/argv_input.hpp +51 -0
  1432. data/ext/third_party/json/include/tao/json/external/pegtl/ascii.hpp +67 -0
  1433. data/ext/third_party/json/include/tao/json/external/pegtl/buffer_input.hpp +212 -0
  1434. data/ext/third_party/json/include/tao/json/external/pegtl/change_action.hpp +38 -0
  1435. data/ext/third_party/json/include/tao/json/external/pegtl/change_action_and_state.hpp +53 -0
  1436. data/ext/third_party/json/include/tao/json/external/pegtl/change_action_and_states.hpp +62 -0
  1437. data/ext/third_party/json/include/tao/json/external/pegtl/change_control.hpp +36 -0
  1438. data/ext/third_party/json/include/tao/json/external/pegtl/change_state.hpp +50 -0
  1439. data/ext/third_party/json/include/tao/json/external/pegtl/change_states.hpp +61 -0
  1440. data/ext/third_party/json/include/tao/json/external/pegtl/config.hpp +11 -0
  1441. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/abnf.hpp +35 -0
  1442. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/alphabet.hpp +67 -0
  1443. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/counter.hpp +54 -0
  1444. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/http.hpp +253 -0
  1445. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/internal.hpp +68 -0
  1446. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/utf16.hpp +200 -0
  1447. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/utf32.hpp +200 -0
  1448. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/utf8.hpp +105 -0
  1449. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/if_then.hpp +55 -0
  1450. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/integer.hpp +446 -0
  1451. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/json.hpp +88 -0
  1452. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/json_pointer.hpp +33 -0
  1453. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/parse_tree.hpp +561 -0
  1454. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/parse_tree_to_dot.hpp +104 -0
  1455. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/raw_string.hpp +225 -0
  1456. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/remove_first_state.hpp +86 -0
  1457. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/rep_one_min_max.hpp +62 -0
  1458. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/rep_string.hpp +44 -0
  1459. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/to_string.hpp +38 -0
  1460. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/tracer.hpp +158 -0
  1461. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/unescape.hpp +199 -0
  1462. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/uri.hpp +106 -0
  1463. data/ext/third_party/json/include/tao/json/external/pegtl/cstream_input.hpp +33 -0
  1464. data/ext/third_party/json/include/tao/json/external/pegtl/disable_action.hpp +35 -0
  1465. data/ext/third_party/json/include/tao/json/external/pegtl/discard_input.hpp +37 -0
  1466. data/ext/third_party/json/include/tao/json/external/pegtl/discard_input_on_failure.hpp +39 -0
  1467. data/ext/third_party/json/include/tao/json/external/pegtl/discard_input_on_success.hpp +39 -0
  1468. data/ext/third_party/json/include/tao/json/external/pegtl/enable_action.hpp +35 -0
  1469. data/ext/third_party/json/include/tao/json/external/pegtl/eol.hpp +37 -0
  1470. data/ext/third_party/json/include/tao/json/external/pegtl/eol_pair.hpp +18 -0
  1471. data/ext/third_party/json/include/tao/json/external/pegtl/file_input.hpp +44 -0
  1472. data/ext/third_party/json/include/tao/json/external/pegtl/internal/action.hpp +44 -0
  1473. data/ext/third_party/json/include/tao/json/external/pegtl/internal/action_input.hpp +107 -0
  1474. data/ext/third_party/json/include/tao/json/external/pegtl/internal/alnum.hpp +18 -0
  1475. data/ext/third_party/json/include/tao/json/external/pegtl/internal/alpha.hpp +18 -0
  1476. data/ext/third_party/json/include/tao/json/external/pegtl/internal/always_false.hpp +21 -0
  1477. data/ext/third_party/json/include/tao/json/external/pegtl/internal/any.hpp +58 -0
  1478. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply.hpp +53 -0
  1479. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply0.hpp +50 -0
  1480. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply0_single.hpp +34 -0
  1481. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply_single.hpp +34 -0
  1482. data/ext/third_party/json/include/tao/json/external/pegtl/internal/at.hpp +53 -0
  1483. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bof.hpp +31 -0
  1484. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bol.hpp +31 -0
  1485. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bump.hpp +45 -0
  1486. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bump_help.hpp +29 -0
  1487. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bytes.hpp +36 -0
  1488. data/ext/third_party/json/include/tao/json/external/pegtl/internal/control.hpp +44 -0
  1489. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cr_crlf_eol.hpp +32 -0
  1490. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cr_eol.hpp +32 -0
  1491. data/ext/third_party/json/include/tao/json/external/pegtl/internal/crlf_eol.hpp +32 -0
  1492. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cstream_reader.hpp +49 -0
  1493. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cstring_reader.hpp +40 -0
  1494. data/ext/third_party/json/include/tao/json/external/pegtl/internal/demangle.hpp +140 -0
  1495. data/ext/third_party/json/include/tao/json/external/pegtl/internal/disable.hpp +44 -0
  1496. data/ext/third_party/json/include/tao/json/external/pegtl/internal/discard.hpp +33 -0
  1497. data/ext/third_party/json/include/tao/json/external/pegtl/internal/dusel_mode.hpp +23 -0
  1498. data/ext/third_party/json/include/tao/json/external/pegtl/internal/duseltronik.hpp +187 -0
  1499. data/ext/third_party/json/include/tao/json/external/pegtl/internal/enable.hpp +44 -0
  1500. data/ext/third_party/json/include/tao/json/external/pegtl/internal/endian.hpp +62 -0
  1501. data/ext/third_party/json/include/tao/json/external/pegtl/internal/endian_gcc.hpp +206 -0
  1502. data/ext/third_party/json/include/tao/json/external/pegtl/internal/endian_win.hpp +106 -0
  1503. data/ext/third_party/json/include/tao/json/external/pegtl/internal/eof.hpp +31 -0
  1504. data/ext/third_party/json/include/tao/json/external/pegtl/internal/eol.hpp +31 -0
  1505. data/ext/third_party/json/include/tao/json/external/pegtl/internal/eolf.hpp +32 -0
  1506. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_mapper_posix.hpp +83 -0
  1507. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_mapper_win32.hpp +219 -0
  1508. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_opener.hpp +72 -0
  1509. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_reader.hpp +114 -0
  1510. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_apply.hpp +25 -0
  1511. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_apply0.hpp +25 -0
  1512. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_match.hpp +56 -0
  1513. data/ext/third_party/json/include/tao/json/external/pegtl/internal/identifier.hpp +22 -0
  1514. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_apply.hpp +53 -0
  1515. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_must.hpp +48 -0
  1516. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_must_else.hpp +19 -0
  1517. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_then_else.hpp +51 -0
  1518. data/ext/third_party/json/include/tao/json/external/pegtl/internal/input_pair.hpp +29 -0
  1519. data/ext/third_party/json/include/tao/json/external/pegtl/internal/istream_reader.hpp +40 -0
  1520. data/ext/third_party/json/include/tao/json/external/pegtl/internal/istring.hpp +72 -0
  1521. data/ext/third_party/json/include/tao/json/external/pegtl/internal/iterator.hpp +52 -0
  1522. data/ext/third_party/json/include/tao/json/external/pegtl/internal/lf_crlf_eol.hpp +37 -0
  1523. data/ext/third_party/json/include/tao/json/external/pegtl/internal/lf_eol.hpp +32 -0
  1524. data/ext/third_party/json/include/tao/json/external/pegtl/internal/list.hpp +19 -0
  1525. data/ext/third_party/json/include/tao/json/external/pegtl/internal/list_must.hpp +20 -0
  1526. data/ext/third_party/json/include/tao/json/external/pegtl/internal/list_tail.hpp +20 -0
  1527. data/ext/third_party/json/include/tao/json/external/pegtl/internal/list_tail_pad.hpp +22 -0
  1528. data/ext/third_party/json/include/tao/json/external/pegtl/internal/marker.hpp +82 -0
  1529. data/ext/third_party/json/include/tao/json/external/pegtl/internal/missing_apply.hpp +25 -0
  1530. data/ext/third_party/json/include/tao/json/external/pegtl/internal/missing_apply0.hpp +23 -0
  1531. data/ext/third_party/json/include/tao/json/external/pegtl/internal/must.hpp +72 -0
  1532. data/ext/third_party/json/include/tao/json/external/pegtl/internal/not_at.hpp +53 -0
  1533. data/ext/third_party/json/include/tao/json/external/pegtl/internal/one.hpp +44 -0
  1534. data/ext/third_party/json/include/tao/json/external/pegtl/internal/opt.hpp +57 -0
  1535. data/ext/third_party/json/include/tao/json/external/pegtl/internal/pad.hpp +19 -0
  1536. data/ext/third_party/json/include/tao/json/external/pegtl/internal/pad_opt.hpp +20 -0
  1537. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_char.hpp +32 -0
  1538. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_mask_uint.hpp +54 -0
  1539. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_mask_uint8.hpp +34 -0
  1540. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_uint.hpp +45 -0
  1541. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_uint8.hpp +33 -0
  1542. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_utf16.hpp +54 -0
  1543. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_utf32.hpp +43 -0
  1544. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_utf8.hpp +90 -0
  1545. data/ext/third_party/json/include/tao/json/external/pegtl/internal/pegtl_string.hpp +90 -0
  1546. data/ext/third_party/json/include/tao/json/external/pegtl/internal/plus.hpp +53 -0
  1547. data/ext/third_party/json/include/tao/json/external/pegtl/internal/raise.hpp +53 -0
  1548. data/ext/third_party/json/include/tao/json/external/pegtl/internal/range.hpp +51 -0
  1549. data/ext/third_party/json/include/tao/json/external/pegtl/internal/ranges.hpp +93 -0
  1550. data/ext/third_party/json/include/tao/json/external/pegtl/internal/read_uint.hpp +77 -0
  1551. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rematch.hpp +69 -0
  1552. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep.hpp +66 -0
  1553. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep_min.hpp +20 -0
  1554. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep_min_max.hpp +79 -0
  1555. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep_opt.hpp +46 -0
  1556. data/ext/third_party/json/include/tao/json/external/pegtl/internal/require.hpp +42 -0
  1557. data/ext/third_party/json/include/tao/json/external/pegtl/internal/result_on_found.hpp +19 -0
  1558. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rules.hpp +61 -0
  1559. data/ext/third_party/json/include/tao/json/external/pegtl/internal/seq.hpp +73 -0
  1560. data/ext/third_party/json/include/tao/json/external/pegtl/internal/skip_control.hpp +25 -0
  1561. data/ext/third_party/json/include/tao/json/external/pegtl/internal/sor.hpp +60 -0
  1562. data/ext/third_party/json/include/tao/json/external/pegtl/internal/star.hpp +47 -0
  1563. data/ext/third_party/json/include/tao/json/external/pegtl/internal/star_must.hpp +19 -0
  1564. data/ext/third_party/json/include/tao/json/external/pegtl/internal/state.hpp +49 -0
  1565. data/ext/third_party/json/include/tao/json/external/pegtl/internal/string.hpp +58 -0
  1566. data/ext/third_party/json/include/tao/json/external/pegtl/internal/trivial.hpp +32 -0
  1567. data/ext/third_party/json/include/tao/json/external/pegtl/internal/try_catch_type.hpp +64 -0
  1568. data/ext/third_party/json/include/tao/json/external/pegtl/internal/until.hpp +84 -0
  1569. data/ext/third_party/json/include/tao/json/external/pegtl/istream_input.hpp +33 -0
  1570. data/ext/third_party/json/include/tao/json/external/pegtl/match.hpp +73 -0
  1571. data/ext/third_party/json/include/tao/json/external/pegtl/memory_input.hpp +381 -0
  1572. data/ext/third_party/json/include/tao/json/external/pegtl/mmap_input.hpp +79 -0
  1573. data/ext/third_party/json/include/tao/json/external/pegtl/normal.hpp +87 -0
  1574. data/ext/third_party/json/include/tao/json/external/pegtl/nothing.hpp +20 -0
  1575. data/ext/third_party/json/include/tao/json/external/pegtl/parse.hpp +53 -0
  1576. data/ext/third_party/json/include/tao/json/external/pegtl/parse_error.hpp +69 -0
  1577. data/ext/third_party/json/include/tao/json/external/pegtl/position.hpp +75 -0
  1578. data/ext/third_party/json/include/tao/json/external/pegtl/read_input.hpp +74 -0
  1579. data/ext/third_party/json/include/tao/json/external/pegtl/require_apply.hpp +16 -0
  1580. data/ext/third_party/json/include/tao/json/external/pegtl/require_apply0.hpp +16 -0
  1581. data/ext/third_party/json/include/tao/json/external/pegtl/rewind_mode.hpp +20 -0
  1582. data/ext/third_party/json/include/tao/json/external/pegtl/rules.hpp +67 -0
  1583. data/ext/third_party/json/include/tao/json/external/pegtl/string_input.hpp +66 -0
  1584. data/ext/third_party/json/include/tao/json/external/pegtl/tracking_mode.hpp +19 -0
  1585. data/ext/third_party/json/include/tao/json/external/pegtl/uint16.hpp +62 -0
  1586. data/ext/third_party/json/include/tao/json/external/pegtl/uint32.hpp +62 -0
  1587. data/ext/third_party/json/include/tao/json/external/pegtl/uint64.hpp +63 -0
  1588. data/ext/third_party/json/include/tao/json/external/pegtl/uint8.hpp +36 -0
  1589. data/ext/third_party/json/include/tao/json/external/pegtl/utf16.hpp +49 -0
  1590. data/ext/third_party/json/include/tao/json/external/pegtl/utf32.hpp +49 -0
  1591. data/ext/third_party/json/include/tao/json/external/pegtl/utf8.hpp +28 -0
  1592. data/ext/third_party/json/include/tao/json/external/pegtl/version.hpp +13 -0
  1593. data/ext/third_party/json/include/tao/json/external/ryu.hpp +1216 -0
  1594. data/ext/third_party/json/include/tao/json/forward.hpp +44 -0
  1595. data/ext/third_party/json/include/tao/json/from_file.hpp +32 -0
  1596. data/ext/third_party/json/include/tao/json/from_input.hpp +32 -0
  1597. data/ext/third_party/json/include/tao/json/from_stream.hpp +45 -0
  1598. data/ext/third_party/json/include/tao/json/from_string.hpp +41 -0
  1599. data/ext/third_party/json/include/tao/json/internal/action.hpp +268 -0
  1600. data/ext/third_party/json/include/tao/json/internal/base64.hpp +55 -0
  1601. data/ext/third_party/json/include/tao/json/internal/base64url.hpp +53 -0
  1602. data/ext/third_party/json/include/tao/json/internal/endian.hpp +60 -0
  1603. data/ext/third_party/json/include/tao/json/internal/endian_gcc.hpp +198 -0
  1604. data/ext/third_party/json/include/tao/json/internal/endian_win.hpp +103 -0
  1605. data/ext/third_party/json/include/tao/json/internal/errors.hpp +85 -0
  1606. data/ext/third_party/json/include/tao/json/internal/escape.hpp +77 -0
  1607. data/ext/third_party/json/include/tao/json/internal/format.hpp +59 -0
  1608. data/ext/third_party/json/include/tao/json/internal/grammar.hpp +229 -0
  1609. data/ext/third_party/json/include/tao/json/internal/hexdump.hpp +31 -0
  1610. data/ext/third_party/json/include/tao/json/internal/identity.hpp +22 -0
  1611. data/ext/third_party/json/include/tao/json/internal/number_state.hpp +80 -0
  1612. data/ext/third_party/json/include/tao/json/internal/number_traits.hpp +267 -0
  1613. data/ext/third_party/json/include/tao/json/internal/pair.hpp +42 -0
  1614. data/ext/third_party/json/include/tao/json/internal/parse_util.hpp +112 -0
  1615. data/ext/third_party/json/include/tao/json/internal/sha256.hpp +218 -0
  1616. data/ext/third_party/json/include/tao/json/internal/single.hpp +40 -0
  1617. data/ext/third_party/json/include/tao/json/internal/string_t.hpp +35 -0
  1618. data/ext/third_party/json/include/tao/json/internal/type_traits.hpp +113 -0
  1619. data/ext/third_party/json/include/tao/json/internal/unescape_action.hpp +24 -0
  1620. data/ext/third_party/json/include/tao/json/internal/uri_fragment.hpp +182 -0
  1621. data/ext/third_party/json/include/tao/json/jaxn.hpp +19 -0
  1622. data/ext/third_party/json/include/tao/json/jaxn/consume_file.hpp +34 -0
  1623. data/ext/third_party/json/include/tao/json/jaxn/consume_string.hpp +32 -0
  1624. data/ext/third_party/json/include/tao/json/jaxn/events/from_file.hpp +28 -0
  1625. data/ext/third_party/json/include/tao/json/jaxn/events/from_input.hpp +45 -0
  1626. data/ext/third_party/json/include/tao/json/jaxn/events/from_stream.hpp +33 -0
  1627. data/ext/third_party/json/include/tao/json/jaxn/events/from_string.hpp +39 -0
  1628. data/ext/third_party/json/include/tao/json/jaxn/events/to_pretty_stream.hpp +69 -0
  1629. data/ext/third_party/json/include/tao/json/jaxn/events/to_stream.hpp +67 -0
  1630. data/ext/third_party/json/include/tao/json/jaxn/events/to_string.hpp +33 -0
  1631. data/ext/third_party/json/include/tao/json/jaxn/from_file.hpp +33 -0
  1632. data/ext/third_party/json/include/tao/json/jaxn/from_input.hpp +33 -0
  1633. data/ext/third_party/json/include/tao/json/jaxn/from_stream.hpp +48 -0
  1634. data/ext/third_party/json/include/tao/json/jaxn/from_string.hpp +42 -0
  1635. data/ext/third_party/json/include/tao/json/jaxn/internal/action.hpp +355 -0
  1636. data/ext/third_party/json/include/tao/json/jaxn/internal/bunescape_action.hpp +114 -0
  1637. data/ext/third_party/json/include/tao/json/jaxn/internal/errors.hpp +108 -0
  1638. data/ext/third_party/json/include/tao/json/jaxn/internal/grammar.hpp +375 -0
  1639. data/ext/third_party/json/include/tao/json/jaxn/internal/integer.hpp +256 -0
  1640. data/ext/third_party/json/include/tao/json/jaxn/internal/unescape_action.hpp +28 -0
  1641. data/ext/third_party/json/include/tao/json/jaxn/is_identifier.hpp +27 -0
  1642. data/ext/third_party/json/include/tao/json/jaxn/parts_parser.hpp +263 -0
  1643. data/ext/third_party/json/include/tao/json/jaxn/to_stream.hpp +36 -0
  1644. data/ext/third_party/json/include/tao/json/jaxn/to_string.hpp +33 -0
  1645. data/ext/third_party/json/include/tao/json/message_extension.hpp +49 -0
  1646. data/ext/third_party/json/include/tao/json/msgpack.hpp +18 -0
  1647. data/ext/third_party/json/include/tao/json/msgpack/consume_file.hpp +34 -0
  1648. data/ext/third_party/json/include/tao/json/msgpack/consume_string.hpp +32 -0
  1649. data/ext/third_party/json/include/tao/json/msgpack/events/from_file.hpp +27 -0
  1650. data/ext/third_party/json/include/tao/json/msgpack/events/from_input.hpp +43 -0
  1651. data/ext/third_party/json/include/tao/json/msgpack/events/from_string.hpp +37 -0
  1652. data/ext/third_party/json/include/tao/json/msgpack/events/to_stream.hpp +214 -0
  1653. data/ext/third_party/json/include/tao/json/msgpack/events/to_string.hpp +31 -0
  1654. data/ext/third_party/json/include/tao/json/msgpack/from_file.hpp +33 -0
  1655. data/ext/third_party/json/include/tao/json/msgpack/from_input.hpp +33 -0
  1656. data/ext/third_party/json/include/tao/json/msgpack/from_string.hpp +32 -0
  1657. data/ext/third_party/json/include/tao/json/msgpack/internal/format.hpp +57 -0
  1658. data/ext/third_party/json/include/tao/json/msgpack/internal/grammar.hpp +249 -0
  1659. data/ext/third_party/json/include/tao/json/msgpack/parts_parser.hpp +311 -0
  1660. data/ext/third_party/json/include/tao/json/msgpack/to_stream.hpp +27 -0
  1661. data/ext/third_party/json/include/tao/json/msgpack/to_string.hpp +28 -0
  1662. data/ext/third_party/json/include/tao/json/operators.hpp +494 -0
  1663. data/ext/third_party/json/include/tao/json/parts_parser.hpp +306 -0
  1664. data/ext/third_party/json/include/tao/json/pointer.hpp +432 -0
  1665. data/ext/third_party/json/include/tao/json/produce.hpp +61 -0
  1666. data/ext/third_party/json/include/tao/json/self_contained.hpp +143 -0
  1667. data/ext/third_party/json/include/tao/json/span.hpp +568 -0
  1668. data/ext/third_party/json/include/tao/json/stream.hpp +38 -0
  1669. data/ext/third_party/json/include/tao/json/to_stream.hpp +42 -0
  1670. data/ext/third_party/json/include/tao/json/to_string.hpp +23 -0
  1671. data/ext/third_party/json/include/tao/json/traits.hpp +971 -0
  1672. data/ext/third_party/json/include/tao/json/type.hpp +112 -0
  1673. data/ext/third_party/json/include/tao/json/ubjson.hpp +18 -0
  1674. data/ext/third_party/json/include/tao/json/ubjson/consume_file.hpp +34 -0
  1675. data/ext/third_party/json/include/tao/json/ubjson/consume_string.hpp +32 -0
  1676. data/ext/third_party/json/include/tao/json/ubjson/events/from_file.hpp +27 -0
  1677. data/ext/third_party/json/include/tao/json/ubjson/events/from_input.hpp +43 -0
  1678. data/ext/third_party/json/include/tao/json/ubjson/events/from_string.hpp +37 -0
  1679. data/ext/third_party/json/include/tao/json/ubjson/events/to_stream.hpp +174 -0
  1680. data/ext/third_party/json/include/tao/json/ubjson/events/to_string.hpp +31 -0
  1681. data/ext/third_party/json/include/tao/json/ubjson/from_file.hpp +33 -0
  1682. data/ext/third_party/json/include/tao/json/ubjson/from_input.hpp +33 -0
  1683. data/ext/third_party/json/include/tao/json/ubjson/from_string.hpp +32 -0
  1684. data/ext/third_party/json/include/tao/json/ubjson/internal/grammar.hpp +413 -0
  1685. data/ext/third_party/json/include/tao/json/ubjson/internal/marker.hpp +46 -0
  1686. data/ext/third_party/json/include/tao/json/ubjson/parts_parser.hpp +393 -0
  1687. data/ext/third_party/json/include/tao/json/ubjson/to_stream.hpp +28 -0
  1688. data/ext/third_party/json/include/tao/json/ubjson/to_string.hpp +29 -0
  1689. data/ext/third_party/json/include/tao/json/utf8.hpp +57 -0
  1690. data/ext/third_party/json/include/tao/json/value.hpp +12 -0
  1691. data/ext/third_party/json/src/example/json/CMakeLists.txt +67 -0
  1692. data/ext/third_party/json/src/example/json/cbor_to_jaxn.cpp +18 -0
  1693. data/ext/third_party/json/src/example/json/cbor_to_json.cpp +18 -0
  1694. data/ext/third_party/json/src/example/json/cbor_to_msgpack.cpp +18 -0
  1695. data/ext/third_party/json/src/example/json/cbor_to_pretty_jaxn.cpp +18 -0
  1696. data/ext/third_party/json/src/example/json/cbor_to_pretty_json.cpp +18 -0
  1697. data/ext/third_party/json/src/example/json/cbor_to_ubjson.cpp +18 -0
  1698. data/ext/third_party/json/src/example/json/jaxn_to_cbor.cpp +18 -0
  1699. data/ext/third_party/json/src/example/json/jaxn_to_cplusplus.cpp +249 -0
  1700. data/ext/third_party/json/src/example/json/jaxn_to_jaxn.cpp +18 -0
  1701. data/ext/third_party/json/src/example/json/jaxn_to_msgpack.cpp +18 -0
  1702. data/ext/third_party/json/src/example/json/jaxn_to_pretty_jaxn.cpp +18 -0
  1703. data/ext/third_party/json/src/example/json/jaxn_to_ubjson.cpp +18 -0
  1704. data/ext/third_party/json/src/example/json/json_to_cbor.cpp +18 -0
  1705. data/ext/third_party/json/src/example/json/json_to_json.cpp +18 -0
  1706. data/ext/third_party/json/src/example/json/json_to_msgpack.cpp +18 -0
  1707. data/ext/third_party/json/src/example/json/json_to_pretty_json.cpp +18 -0
  1708. data/ext/third_party/json/src/example/json/json_to_ubjson.cpp +18 -0
  1709. data/ext/third_party/json/src/example/json/msgpack_to_cbor.cpp +18 -0
  1710. data/ext/third_party/json/src/example/json/msgpack_to_jaxn.cpp +18 -0
  1711. data/ext/third_party/json/src/example/json/msgpack_to_json.cpp +18 -0
  1712. data/ext/third_party/json/src/example/json/msgpack_to_pretty_jaxn.cpp +18 -0
  1713. data/ext/third_party/json/src/example/json/msgpack_to_pretty_json.cpp +18 -0
  1714. data/ext/third_party/json/src/example/json/msgpack_to_ubjson.cpp +18 -0
  1715. data/ext/third_party/json/src/example/json/printf_doubles.cpp +51 -0
  1716. data/ext/third_party/json/src/example/json/ubjson_to_cbor.cpp +18 -0
  1717. data/ext/third_party/json/src/example/json/ubjson_to_jaxn.cpp +18 -0
  1718. data/ext/third_party/json/src/example/json/ubjson_to_json.cpp +18 -0
  1719. data/ext/third_party/json/src/example/json/ubjson_to_msgpack.cpp +18 -0
  1720. data/ext/third_party/json/src/example/json/ubjson_to_pretty_jaxn.cpp +18 -0
  1721. data/ext/third_party/json/src/example/json/ubjson_to_pretty_json.cpp +18 -0
  1722. data/ext/third_party/json/src/example/json/validate_event_order.cpp +27 -0
  1723. data/ext/third_party/json/src/example/json/validate_integer.cpp +56 -0
  1724. data/ext/third_party/json/src/perf/json/bench_mark.hpp +43 -0
  1725. data/ext/third_party/json/src/perf/json/benchmark.cpp +34 -0
  1726. data/ext/third_party/json/src/perf/json/parse_file.cpp +17 -0
  1727. data/ext/third_party/json/src/perf/json/pretty_print_file.cpp +19 -0
  1728. data/ext/third_party/json/src/perf/json/print_double.cpp +34 -0
  1729. data/ext/third_party/json/src/perf/json/print_file.cpp +19 -0
  1730. data/ext/third_party/json/src/perf/json/sizes.cpp +24 -0
  1731. data/ext/third_party/json/src/perf/json/syntax_only.cpp +27 -0
  1732. data/ext/third_party/json/src/test/json/CMakeLists.txt +97 -0
  1733. data/ext/third_party/json/src/test/json/big_list_of_naughty_strings.cpp +43 -0
  1734. data/ext/third_party/json/src/test/json/binding_array.cpp +549 -0
  1735. data/ext/third_party/json/src/test/json/binding_factory.cpp +265 -0
  1736. data/ext/third_party/json/src/test/json/binding_object.cpp +208 -0
  1737. data/ext/third_party/json/src/test/json/binding_versions.cpp +95 -0
  1738. data/ext/third_party/json/src/test/json/cbor.cpp +149 -0
  1739. data/ext/third_party/json/src/test/json/cbor_parts_parser.cpp +36 -0
  1740. data/ext/third_party/json/src/test/json/contrib_diff.cpp +43 -0
  1741. data/ext/third_party/json/src/test/json/contrib_get.cpp +42 -0
  1742. data/ext/third_party/json/src/test/json/contrib_patch_add.cpp +75 -0
  1743. data/ext/third_party/json/src/test/json/contrib_patch_copy.cpp +113 -0
  1744. data/ext/third_party/json/src/test/json/contrib_patch_move.cpp +97 -0
  1745. data/ext/third_party/json/src/test/json/contrib_patch_remove.cpp +85 -0
  1746. data/ext/third_party/json/src/test/json/contrib_patch_replace.cpp +79 -0
  1747. data/ext/third_party/json/src/test/json/contrib_patch_test.cpp +69 -0
  1748. data/ext/third_party/json/src/test/json/contrib_position.cpp +48 -0
  1749. data/ext/third_party/json/src/test/json/contrib_reference.cpp +44 -0
  1750. data/ext/third_party/json/src/test/json/contrib_schema.cpp +132 -0
  1751. data/ext/third_party/json/src/test/json/contrib_traits.cpp +258 -0
  1752. data/ext/third_party/json/src/test/json/double.cpp +182 -0
  1753. data/ext/third_party/json/src/test/json/enable_implicit_constructor.cpp +54 -0
  1754. data/ext/third_party/json/src/test/json/escape.cpp +42 -0
  1755. data/ext/third_party/json/src/test/json/events_binary_to.cpp +56 -0
  1756. data/ext/third_party/json/src/test/json/events_compare.cpp +433 -0
  1757. data/ext/third_party/json/src/test/json/events_debug.cpp +24 -0
  1758. data/ext/third_party/json/src/test/json/events_hash.cpp +65 -0
  1759. data/ext/third_party/json/src/test/json/events_to_stream.cpp +28 -0
  1760. data/ext/third_party/json/src/test/json/events_to_string.cpp +25 -0
  1761. data/ext/third_party/json/src/test/json/include_json.cpp +14 -0
  1762. data/ext/third_party/json/src/test/json/integer.cpp +118 -0
  1763. data/ext/third_party/json/src/test/json/jaxn_ostream.cpp +76 -0
  1764. data/ext/third_party/json/src/test/json/jaxn_parse.cpp +239 -0
  1765. data/ext/third_party/json/src/test/json/jaxn_parts_parser.cpp +220 -0
  1766. data/ext/third_party/json/src/test/json/json_ostream.cpp +102 -0
  1767. data/ext/third_party/json/src/test/json/json_parse.cpp +153 -0
  1768. data/ext/third_party/json/src/test/json/json_parts_parser.cpp +124 -0
  1769. data/ext/third_party/json/src/test/json/json_pointer.cpp +176 -0
  1770. data/ext/third_party/json/src/test/json/key_camel_case_to_snake_case.cpp +38 -0
  1771. data/ext/third_party/json/src/test/json/key_snake_case_to_camel_case.cpp +33 -0
  1772. data/ext/third_party/json/src/test/json/literal.cpp +18 -0
  1773. data/ext/third_party/json/src/test/json/main.hpp +20 -0
  1774. data/ext/third_party/json/src/test/json/make_events.hpp +362 -0
  1775. data/ext/third_party/json/src/test/json/msgpack.cpp +136 -0
  1776. data/ext/third_party/json/src/test/json/object_construction.cpp +167 -0
  1777. data/ext/third_party/json/src/test/json/opaque_pointer.cpp +192 -0
  1778. data/ext/third_party/json/src/test/json/operators.cpp +494 -0
  1779. data/ext/third_party/json/src/test/json/optional.cpp +79 -0
  1780. data/ext/third_party/json/src/test/json/public_base.cpp +142 -0
  1781. data/ext/third_party/json/src/test/json/self_contained.cpp +106 -0
  1782. data/ext/third_party/json/src/test/json/sha256.cpp +38 -0
  1783. data/ext/third_party/json/src/test/json/string_view.cpp +70 -0
  1784. data/ext/third_party/json/src/test/json/temporary_parsing.cpp +339 -0
  1785. data/ext/third_party/json/src/test/json/test.hpp +74 -0
  1786. data/ext/third_party/json/src/test/json/test_events.hpp +250 -0
  1787. data/ext/third_party/json/src/test/json/test_types.hpp +557 -0
  1788. data/ext/third_party/json/src/test/json/test_unhex.hpp +42 -0
  1789. data/ext/third_party/json/src/test/json/type.cpp +35 -0
  1790. data/ext/third_party/json/src/test/json/ubjson.cpp +119 -0
  1791. data/ext/third_party/json/src/test/json/uri_fragment.cpp +52 -0
  1792. data/ext/third_party/json/src/test/json/validate_event_interfaces.cpp +177 -0
  1793. data/ext/third_party/json/src/test/json/validate_utf8.cpp +37 -0
  1794. data/ext/third_party/json/src/test/json/value_access.cpp +144 -0
  1795. data/ext/third_party/json/src/test/json/value_basics.cpp +241 -0
  1796. data/ext/third_party/json/src/test/json/value_create.cpp +372 -0
  1797. data/ext/third_party/json/src/test/json/value_ptr.cpp +33 -0
  1798. data/ext/third_party/json/src/test/json/value_subscript.cpp +89 -0
  1799. data/ext/third_party/json/src/test/json/with_arguments.cpp +98 -0
  1800. data/ext/third_party/json/tests/blns.json +496 -0
  1801. data/ext/third_party/json/tests/canada.json +9 -0
  1802. data/ext/third_party/json/tests/citm_catalog.json +50469 -0
  1803. data/ext/third_party/json/tests/draft4/additionalItems.json +82 -0
  1804. data/ext/third_party/json/tests/draft4/additionalProperties.json +88 -0
  1805. data/ext/third_party/json/tests/draft4/allOf.json +112 -0
  1806. data/ext/third_party/json/tests/draft4/anyOf.json +68 -0
  1807. data/ext/third_party/json/tests/draft4/default.json +49 -0
  1808. data/ext/third_party/json/tests/draft4/definitions.json +32 -0
  1809. data/ext/third_party/json/tests/draft4/dependencies.json +113 -0
  1810. data/ext/third_party/json/tests/draft4/enum.json +72 -0
  1811. data/ext/third_party/json/tests/draft4/items.json +46 -0
  1812. data/ext/third_party/json/tests/draft4/maxItems.json +28 -0
  1813. data/ext/third_party/json/tests/draft4/maxLength.json +33 -0
  1814. data/ext/third_party/json/tests/draft4/maxProperties.json +28 -0
  1815. data/ext/third_party/json/tests/draft4/maximum.json +42 -0
  1816. data/ext/third_party/json/tests/draft4/minItems.json +28 -0
  1817. data/ext/third_party/json/tests/draft4/minLength.json +33 -0
  1818. data/ext/third_party/json/tests/draft4/minProperties.json +28 -0
  1819. data/ext/third_party/json/tests/draft4/minimum.json +42 -0
  1820. data/ext/third_party/json/tests/draft4/multipleOf.json +60 -0
  1821. data/ext/third_party/json/tests/draft4/not.json +96 -0
  1822. data/ext/third_party/json/tests/draft4/oneOf.json +68 -0
  1823. data/ext/third_party/json/tests/draft4/optional/bignum.json +107 -0
  1824. data/ext/third_party/json/tests/draft4/optional/format.json +148 -0
  1825. data/ext/third_party/json/tests/draft4/optional/zeroTerminatedFloats.json +15 -0
  1826. data/ext/third_party/json/tests/draft4/pattern.json +34 -0
  1827. data/ext/third_party/json/tests/draft4/patternProperties.json +110 -0
  1828. data/ext/third_party/json/tests/draft4/properties.json +92 -0
  1829. data/ext/third_party/json/tests/draft4/ref.json +179 -0
  1830. data/ext/third_party/json/tests/draft4/refRemote.json +74 -0
  1831. data/ext/third_party/json/tests/draft4/required.json +44 -0
  1832. data/ext/third_party/json/tests/draft4/type.json +345 -0
  1833. data/ext/third_party/json/tests/draft4/uniqueItems.json +79 -0
  1834. data/ext/third_party/json/tests/taocpp/binary.jaxn +4 -0
  1835. data/ext/third_party/json/tests/taocpp/dateTime.json +108 -0
  1836. data/ext/third_party/json/tests/taocpp/make_events.cbor +0 -0
  1837. data/ext/third_party/json/tests/taocpp/number.json +682 -0
  1838. data/ext/third_party/json/tests/taocpp/position.json +8 -0
  1839. data/ext/third_party/json/tests/taocpp/schema.json +378 -0
  1840. data/ext/third_party/json/tests/twitter.json +15482 -0
  1841. data/ext/third_party/snappy/.appveyor.yml +36 -0
  1842. data/ext/third_party/snappy/.gitignore +8 -0
  1843. data/ext/third_party/snappy/.travis.yml +98 -0
  1844. data/ext/third_party/snappy/AUTHORS +1 -0
  1845. data/ext/third_party/snappy/CMakeLists.txt +345 -0
  1846. data/ext/third_party/snappy/CONTRIBUTING.md +26 -0
  1847. data/ext/third_party/snappy/COPYING +54 -0
  1848. data/ext/third_party/snappy/NEWS +188 -0
  1849. data/ext/third_party/snappy/README.md +148 -0
  1850. data/ext/third_party/snappy/cmake/SnappyConfig.cmake.in +33 -0
  1851. data/ext/third_party/snappy/cmake/config.h.in +59 -0
  1852. data/ext/third_party/snappy/docs/README.md +72 -0
  1853. data/ext/third_party/snappy/format_description.txt +110 -0
  1854. data/ext/third_party/snappy/framing_format.txt +135 -0
  1855. data/ext/third_party/snappy/snappy-c.cc +90 -0
  1856. data/ext/third_party/snappy/snappy-c.h +138 -0
  1857. data/ext/third_party/snappy/snappy-internal.h +315 -0
  1858. data/ext/third_party/snappy/snappy-sinksource.cc +121 -0
  1859. data/ext/third_party/snappy/snappy-sinksource.h +182 -0
  1860. data/ext/third_party/snappy/snappy-stubs-internal.cc +42 -0
  1861. data/ext/third_party/snappy/snappy-stubs-internal.h +493 -0
  1862. data/ext/third_party/snappy/snappy-stubs-public.h.in +63 -0
  1863. data/ext/third_party/snappy/snappy-test.cc +613 -0
  1864. data/ext/third_party/snappy/snappy-test.h +526 -0
  1865. data/ext/third_party/snappy/snappy.cc +1770 -0
  1866. data/ext/third_party/snappy/snappy.h +209 -0
  1867. data/ext/third_party/snappy/snappy_compress_fuzzer.cc +60 -0
  1868. data/ext/third_party/snappy/snappy_uncompress_fuzzer.cc +58 -0
  1869. data/ext/third_party/snappy/snappy_unittest.cc +1512 -0
  1870. data/ext/third_party/snappy/testdata/alice29.txt +3609 -0
  1871. data/ext/third_party/snappy/testdata/asyoulik.txt +4122 -0
  1872. data/ext/third_party/snappy/testdata/baddata1.snappy +0 -0
  1873. data/ext/third_party/snappy/testdata/baddata2.snappy +0 -0
  1874. data/ext/third_party/snappy/testdata/baddata3.snappy +0 -0
  1875. data/ext/third_party/snappy/testdata/fireworks.jpeg +0 -0
  1876. data/ext/third_party/snappy/testdata/geo.protodata +0 -0
  1877. data/ext/third_party/snappy/testdata/html +1 -0
  1878. data/ext/third_party/snappy/testdata/html_x_4 +1 -0
  1879. data/ext/third_party/snappy/testdata/kppkn.gtb +0 -0
  1880. data/ext/third_party/snappy/testdata/lcet10.txt +7519 -0
  1881. data/ext/third_party/snappy/testdata/paper-100k.pdf +600 -2
  1882. data/ext/third_party/snappy/testdata/plrabn12.txt +10699 -0
  1883. data/ext/third_party/snappy/testdata/urls.10K +10000 -0
  1884. data/ext/third_party/spdlog/.clang-format +108 -0
  1885. data/ext/third_party/spdlog/.clang-tidy +54 -0
  1886. data/ext/third_party/spdlog/.gitattributes +1 -0
  1887. data/ext/third_party/spdlog/.gitignore +83 -0
  1888. data/ext/third_party/spdlog/.travis.yml +112 -0
  1889. data/ext/third_party/spdlog/CMakeLists.txt +324 -0
  1890. data/ext/third_party/spdlog/INSTALL +24 -0
  1891. data/ext/third_party/spdlog/LICENSE +26 -0
  1892. data/ext/third_party/spdlog/README.md +423 -0
  1893. data/ext/third_party/spdlog/appveyor.yml +51 -0
  1894. data/ext/third_party/spdlog/bench/CMakeLists.txt +25 -0
  1895. data/ext/third_party/spdlog/bench/async_bench.cpp +179 -0
  1896. data/ext/third_party/spdlog/bench/bench.cpp +238 -0
  1897. data/ext/third_party/spdlog/bench/formatter-bench.cpp +80 -0
  1898. data/ext/third_party/spdlog/bench/latency.cpp +166 -0
  1899. data/ext/third_party/spdlog/bench/utils.h +34 -0
  1900. data/ext/third_party/spdlog/cmake/ide.cmake +18 -0
  1901. data/ext/third_party/spdlog/cmake/pch.h.in +258 -0
  1902. data/ext/third_party/spdlog/cmake/spdlog.pc.in +13 -0
  1903. data/ext/third_party/spdlog/cmake/spdlogCPack.cmake +46 -0
  1904. data/ext/third_party/spdlog/cmake/spdlogConfig.cmake.in +15 -0
  1905. data/ext/third_party/spdlog/cmake/utils.cmake +61 -0
  1906. data/ext/third_party/spdlog/cmake/version.rc.in +42 -0
  1907. data/ext/third_party/spdlog/example/CMakeLists.txt +23 -0
  1908. data/ext/third_party/spdlog/example/example.cpp +282 -0
  1909. data/ext/third_party/spdlog/include/spdlog/async.h +93 -0
  1910. data/ext/third_party/spdlog/include/spdlog/async_logger-inl.h +92 -0
  1911. data/ext/third_party/spdlog/include/spdlog/async_logger.h +68 -0
  1912. data/ext/third_party/spdlog/include/spdlog/cfg/argv.h +45 -0
  1913. data/ext/third_party/spdlog/include/spdlog/cfg/env.h +36 -0
  1914. data/ext/third_party/spdlog/include/spdlog/cfg/helpers-inl.h +103 -0
  1915. data/ext/third_party/spdlog/include/spdlog/cfg/helpers.h +28 -0
  1916. data/ext/third_party/spdlog/include/spdlog/cfg/log_levels.h +47 -0
  1917. data/ext/third_party/spdlog/include/spdlog/common-inl.h +76 -0
  1918. data/ext/third_party/spdlog/include/spdlog/common.h +246 -0
  1919. data/ext/third_party/spdlog/include/spdlog/details/backtracer-inl.h +69 -0
  1920. data/ext/third_party/spdlog/include/spdlog/details/backtracer.h +45 -0
  1921. data/ext/third_party/spdlog/include/spdlog/details/circular_q.h +141 -0
  1922. data/ext/third_party/spdlog/include/spdlog/details/console_globals.h +32 -0
  1923. data/ext/third_party/spdlog/include/spdlog/details/file_helper-inl.h +132 -0
  1924. data/ext/third_party/spdlog/include/spdlog/details/file_helper.h +59 -0
  1925. data/ext/third_party/spdlog/include/spdlog/details/fmt_helper.h +108 -0
  1926. data/ext/third_party/spdlog/include/spdlog/details/log_msg-inl.h +37 -0
  1927. data/ext/third_party/spdlog/include/spdlog/details/log_msg.h +36 -0
  1928. data/ext/third_party/spdlog/include/spdlog/details/log_msg_buffer-inl.h +58 -0
  1929. data/ext/third_party/spdlog/include/spdlog/details/log_msg_buffer.h +33 -0
  1930. data/ext/third_party/spdlog/include/spdlog/details/mpmc_blocking_q.h +120 -0
  1931. data/ext/third_party/spdlog/include/spdlog/details/null_mutex.h +49 -0
  1932. data/ext/third_party/spdlog/include/spdlog/details/os-inl.h +554 -0
  1933. data/ext/third_party/spdlog/include/spdlog/details/os.h +111 -0
  1934. data/ext/third_party/spdlog/include/spdlog/details/periodic_worker-inl.h +49 -0
  1935. data/ext/third_party/spdlog/include/spdlog/details/periodic_worker.h +40 -0
  1936. data/ext/third_party/spdlog/include/spdlog/details/registry-inl.h +299 -0
  1937. data/ext/third_party/spdlog/include/spdlog/details/registry.h +112 -0
  1938. data/ext/third_party/spdlog/include/spdlog/details/synchronous_factory.h +24 -0
  1939. data/ext/third_party/spdlog/include/spdlog/details/tcp_client-windows.h +175 -0
  1940. data/ext/third_party/spdlog/include/spdlog/details/tcp_client.h +145 -0
  1941. data/ext/third_party/spdlog/include/spdlog/details/thread_pool-inl.h +124 -0
  1942. data/ext/third_party/spdlog/include/spdlog/details/thread_pool.h +120 -0
  1943. data/ext/third_party/spdlog/include/spdlog/details/windows_include.h +11 -0
  1944. data/ext/third_party/spdlog/include/spdlog/fmt/bin_to_hex.h +216 -0
  1945. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/LICENSE.rst +27 -0
  1946. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/chrono.h +1119 -0
  1947. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/color.h +568 -0
  1948. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/compile.h +595 -0
  1949. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/core.h +1789 -0
  1950. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/format-inl.h +1403 -0
  1951. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/format.h +3648 -0
  1952. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/locale.h +78 -0
  1953. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/ostream.h +143 -0
  1954. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/posix.h +2 -0
  1955. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/printf.h +721 -0
  1956. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/ranges.h +387 -0
  1957. data/ext/third_party/spdlog/include/spdlog/fmt/fmt.h +25 -0
  1958. data/ext/third_party/spdlog/include/spdlog/fmt/ostr.h +20 -0
  1959. data/ext/third_party/spdlog/include/spdlog/formatter.h +18 -0
  1960. data/ext/third_party/spdlog/include/spdlog/fwd.h +14 -0
  1961. data/ext/third_party/spdlog/include/spdlog/logger-inl.h +253 -0
  1962. data/ext/third_party/spdlog/include/spdlog/logger.h +392 -0
  1963. data/ext/third_party/spdlog/include/spdlog/pattern_formatter-inl.h +1358 -0
  1964. data/ext/third_party/spdlog/include/spdlog/pattern_formatter.h +126 -0
  1965. data/ext/third_party/spdlog/include/spdlog/sinks/android_sink.h +119 -0
  1966. data/ext/third_party/spdlog/include/spdlog/sinks/ansicolor_sink-inl.h +143 -0
  1967. data/ext/third_party/spdlog/include/spdlog/sinks/ansicolor_sink.h +118 -0
  1968. data/ext/third_party/spdlog/include/spdlog/sinks/base_sink-inl.h +63 -0
  1969. data/ext/third_party/spdlog/include/spdlog/sinks/base_sink.h +52 -0
  1970. data/ext/third_party/spdlog/include/spdlog/sinks/basic_file_sink-inl.h +43 -0
  1971. data/ext/third_party/spdlog/include/spdlog/sinks/basic_file_sink.h +58 -0
  1972. data/ext/third_party/spdlog/include/spdlog/sinks/daily_file_sink.h +204 -0
  1973. data/ext/third_party/spdlog/include/spdlog/sinks/dist_sink.h +97 -0
  1974. data/ext/third_party/spdlog/include/spdlog/sinks/dup_filter_sink.h +90 -0
  1975. data/ext/third_party/spdlog/include/spdlog/sinks/msvc_sink.h +49 -0
  1976. data/ext/third_party/spdlog/include/spdlog/sinks/null_sink.h +44 -0
  1977. data/ext/third_party/spdlog/include/spdlog/sinks/ostream_sink.h +50 -0
  1978. data/ext/third_party/spdlog/include/spdlog/sinks/ringbuffer_sink.h +72 -0
  1979. data/ext/third_party/spdlog/include/spdlog/sinks/rotating_file_sink-inl.h +131 -0
  1980. data/ext/third_party/spdlog/include/spdlog/sinks/rotating_file_sink.h +78 -0
  1981. data/ext/third_party/spdlog/include/spdlog/sinks/sink-inl.h +25 -0
  1982. data/ext/third_party/spdlog/include/spdlog/sinks/sink.h +35 -0
  1983. data/ext/third_party/spdlog/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
  1984. data/ext/third_party/spdlog/include/spdlog/sinks/stdout_color_sinks.h +45 -0
  1985. data/ext/third_party/spdlog/include/spdlog/sinks/stdout_sinks-inl.h +94 -0
  1986. data/ext/third_party/spdlog/include/spdlog/sinks/stdout_sinks.h +80 -0
  1987. data/ext/third_party/spdlog/include/spdlog/sinks/syslog_sink.h +109 -0
  1988. data/ext/third_party/spdlog/include/spdlog/sinks/systemd_sink.h +103 -0
  1989. data/ext/third_party/spdlog/include/spdlog/sinks/tcp_sink.h +81 -0
  1990. data/ext/third_party/spdlog/include/spdlog/sinks/win_eventlog_sink.h +266 -0
  1991. data/ext/third_party/spdlog/include/spdlog/sinks/wincolor_sink-inl.h +180 -0
  1992. data/ext/third_party/spdlog/include/spdlog/sinks/wincolor_sink.h +94 -0
  1993. data/ext/third_party/spdlog/include/spdlog/spdlog-inl.h +115 -0
  1994. data/ext/third_party/spdlog/include/spdlog/spdlog.h +340 -0
  1995. data/ext/third_party/spdlog/include/spdlog/tweakme.h +116 -0
  1996. data/ext/third_party/spdlog/include/spdlog/version.h +10 -0
  1997. data/ext/third_party/spdlog/logos/jetbrains-variant-4.svg +43 -0
  1998. data/ext/third_party/spdlog/scripts/extract_version.py +17 -0
  1999. data/ext/third_party/spdlog/scripts/format.sh +16 -0
  2000. data/ext/third_party/spdlog/src/async.cpp +13 -0
  2001. data/ext/third_party/spdlog/src/cfg.cpp +8 -0
  2002. data/ext/third_party/spdlog/src/color_sinks.cpp +51 -0
  2003. data/ext/third_party/spdlog/src/file_sinks.cpp +20 -0
  2004. data/ext/third_party/spdlog/src/fmt.cpp +189 -0
  2005. data/ext/third_party/spdlog/src/spdlog.cpp +26 -0
  2006. data/ext/third_party/spdlog/src/stdout_sinks.cpp +29 -0
  2007. data/ext/third_party/spdlog/tests/CMakeLists.txt +70 -0
  2008. data/ext/third_party/spdlog/tests/catch.hpp +15372 -0
  2009. data/ext/third_party/spdlog/tests/catch.license +23 -0
  2010. data/ext/third_party/spdlog/tests/includes.h +26 -0
  2011. data/ext/third_party/spdlog/tests/main.cpp +2 -0
  2012. data/ext/third_party/spdlog/tests/test_async.cpp +188 -0
  2013. data/ext/third_party/spdlog/tests/test_backtrace.cpp +65 -0
  2014. data/ext/third_party/spdlog/tests/test_cfg.cpp +93 -0
  2015. data/ext/third_party/spdlog/tests/test_create_dir.cpp +80 -0
  2016. data/ext/third_party/spdlog/tests/test_daily_logger.cpp +149 -0
  2017. data/ext/third_party/spdlog/tests/test_dup_filter.cpp +88 -0
  2018. data/ext/third_party/spdlog/tests/test_errors.cpp +118 -0
  2019. data/ext/third_party/spdlog/tests/test_eventlog.cpp +71 -0
  2020. data/ext/third_party/spdlog/tests/test_file_helper.cpp +102 -0
  2021. data/ext/third_party/spdlog/tests/test_file_logging.cpp +98 -0
  2022. data/ext/third_party/spdlog/tests/test_fmt_helper.cpp +86 -0
  2023. data/ext/third_party/spdlog/tests/test_macros.cpp +60 -0
  2024. data/ext/third_party/spdlog/tests/test_misc.cpp +271 -0
  2025. data/ext/third_party/spdlog/tests/test_mpmc_q.cpp +106 -0
  2026. data/ext/third_party/spdlog/tests/test_pattern_formatter.cpp +443 -0
  2027. data/ext/third_party/spdlog/tests/test_registry.cpp +116 -0
  2028. data/ext/third_party/spdlog/tests/test_sink.h +79 -0
  2029. data/ext/third_party/spdlog/tests/test_stdout_api.cpp +98 -0
  2030. data/ext/third_party/spdlog/tests/test_systemd.cpp +15 -0
  2031. data/ext/third_party/spdlog/tests/test_time_point.cpp +36 -0
  2032. data/ext/third_party/spdlog/tests/utils.cpp +125 -0
  2033. data/ext/third_party/spdlog/tests/utils.h +18 -0
  2034. data/lib/couchbase.rb +13 -150
  2035. data/lib/couchbase/authenticator.rb +25 -0
  2036. data/lib/couchbase/binary_collection.rb +85 -0
  2037. data/lib/couchbase/binary_collection_options.rb +94 -0
  2038. data/lib/couchbase/bucket.rb +53 -423
  2039. data/lib/couchbase/cluster.rb +376 -101
  2040. data/lib/couchbase/collection.rb +295 -0
  2041. data/lib/couchbase/collection_options.rb +430 -0
  2042. data/lib/couchbase/common_options.rb +29 -0
  2043. data/lib/couchbase/errors.rb +224 -0
  2044. data/lib/couchbase/json_transcoder.rb +32 -0
  2045. data/lib/couchbase/management/analytics_index_manager.rb +319 -0
  2046. data/lib/couchbase/management/bucket_manager.rb +238 -0
  2047. data/lib/couchbase/management/collection_manager.rb +193 -0
  2048. data/lib/couchbase/management/query_index_manager.rb +287 -0
  2049. data/lib/couchbase/management/search_index_manager.rb +317 -0
  2050. data/lib/couchbase/management/user_manager.rb +323 -0
  2051. data/lib/couchbase/management/view_index_manager.rb +178 -0
  2052. data/lib/couchbase/mutation_state.rb +50 -0
  2053. data/lib/couchbase/scope.rb +49 -0
  2054. data/lib/couchbase/subdoc.rb +226 -0
  2055. data/lib/couchbase/version.rb +12 -15
  2056. data/rbi/couchbase.rbi +79 -0
  2057. metadata +2098 -278
  2058. data/.travis.yml +0 -22
  2059. data/.yardopts +0 -5
  2060. data/CONTRIBUTING.markdown +0 -75
  2061. data/LICENSE +0 -201
  2062. data/Makefile +0 -3
  2063. data/README.markdown +0 -592
  2064. data/RELEASE_NOTES.markdown +0 -905
  2065. data/examples/chat-em/Gemfile +0 -7
  2066. data/examples/chat-em/README.markdown +0 -45
  2067. data/examples/chat-em/server.rb +0 -82
  2068. data/examples/chat-goliath-grape/Gemfile +0 -5
  2069. data/examples/chat-goliath-grape/README.markdown +0 -50
  2070. data/examples/chat-goliath-grape/app.rb +0 -67
  2071. data/examples/chat-goliath-grape/config/app.rb +0 -20
  2072. data/examples/transcoders/Gemfile +0 -3
  2073. data/examples/transcoders/README.markdown +0 -59
  2074. data/examples/transcoders/cb-zcat +0 -40
  2075. data/examples/transcoders/cb-zcp +0 -45
  2076. data/examples/transcoders/gzip_transcoder.rb +0 -49
  2077. data/examples/transcoders/options.rb +0 -54
  2078. data/ext/couchbase_ext/.gitignore +0 -4
  2079. data/ext/couchbase_ext/arguments.c +0 -978
  2080. data/ext/couchbase_ext/arithmetic.c +0 -316
  2081. data/ext/couchbase_ext/bucket.c +0 -1447
  2082. data/ext/couchbase_ext/context.c +0 -65
  2083. data/ext/couchbase_ext/couchbase_ext.c +0 -1477
  2084. data/ext/couchbase_ext/couchbase_ext.h +0 -668
  2085. data/ext/couchbase_ext/delete.c +0 -163
  2086. data/ext/couchbase_ext/eventmachine_plugin.c +0 -464
  2087. data/ext/couchbase_ext/extconf.rb +0 -194
  2088. data/ext/couchbase_ext/get.c +0 -316
  2089. data/ext/couchbase_ext/gethrtime.c +0 -129
  2090. data/ext/couchbase_ext/http.c +0 -432
  2091. data/ext/couchbase_ext/multithread_plugin.c +0 -1092
  2092. data/ext/couchbase_ext/n1ql.c +0 -117
  2093. data/ext/couchbase_ext/observe.c +0 -171
  2094. data/ext/couchbase_ext/result.c +0 -129
  2095. data/ext/couchbase_ext/stats.c +0 -163
  2096. data/ext/couchbase_ext/store.c +0 -542
  2097. data/ext/couchbase_ext/timer.c +0 -192
  2098. data/ext/couchbase_ext/touch.c +0 -186
  2099. data/ext/couchbase_ext/unlock.c +0 -176
  2100. data/ext/couchbase_ext/utils.c +0 -558
  2101. data/ext/couchbase_ext/version.c +0 -142
  2102. data/lib/action_dispatch/middleware/session/couchbase_store.rb +0 -38
  2103. data/lib/active_support/cache/couchbase_store.rb +0 -430
  2104. data/lib/couchbase/connection_pool.rb +0 -58
  2105. data/lib/couchbase/constants.rb +0 -12
  2106. data/lib/couchbase/dns.rb +0 -76
  2107. data/lib/couchbase/result.rb +0 -26
  2108. data/lib/couchbase/transcoder.rb +0 -120
  2109. data/lib/couchbase/utils.rb +0 -62
  2110. data/lib/couchbase/view.rb +0 -506
  2111. data/lib/couchbase/view_row.rb +0 -272
  2112. data/lib/ext/multi_json_fix.rb +0 -56
  2113. data/lib/rack/session/couchbase.rb +0 -108
  2114. data/tasks/benchmark.rake +0 -6
  2115. data/tasks/compile.rake +0 -156
  2116. data/tasks/test.rake +0 -100
  2117. data/tasks/util.rake +0 -21
  2118. data/test/profile/.gitignore +0 -1
  2119. data/test/profile/Gemfile +0 -6
  2120. data/test/profile/benchmark.rb +0 -195
  2121. data/test/setup.rb +0 -178
  2122. data/test/test_arithmetic.rb +0 -185
  2123. data/test/test_async.rb +0 -316
  2124. data/test/test_bucket.rb +0 -299
  2125. data/test/test_cas.rb +0 -235
  2126. data/test/test_couchbase.rb +0 -77
  2127. data/test/test_couchbase_connection_pool.rb +0 -77
  2128. data/test/test_couchbase_rails_cache_store.rb +0 -358
  2129. data/test/test_delete.rb +0 -120
  2130. data/test/test_errors.rb +0 -82
  2131. data/test/test_eventmachine.rb +0 -78
  2132. data/test/test_format.rb +0 -164
  2133. data/test/test_get.rb +0 -407
  2134. data/test/test_stats.rb +0 -57
  2135. data/test/test_store.rb +0 -224
  2136. data/test/test_timer.rb +0 -42
  2137. data/test/test_touch.rb +0 -97
  2138. data/test/test_unlock.rb +0 -119
  2139. data/test/test_utils.rb +0 -58
  2140. 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,2760 @@
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 NORETURN(void cb_raise_error_code(std::error_code ec, const std::string& message))
294
+ {
295
+ if (ec.category() == couchbase::error::detail::get_common_category()) {
296
+ switch (static_cast<couchbase::error::common_errc>(ec.value())) {
297
+ case couchbase::error::common_errc::unambiguous_timeout:
298
+ rb_raise(eUnambiguousTimeout, "%s: %s", message.c_str(), ec.message().c_str());
299
+
300
+ case couchbase::error::common_errc::ambiguous_timeout:
301
+ rb_raise(eAmbiguousTimeout, "%s: %s", message.c_str(), ec.message().c_str());
302
+
303
+ case couchbase::error::common_errc::request_canceled:
304
+ rb_raise(eRequestCanceled, "%s: %s", message.c_str(), ec.message().c_str());
305
+
306
+ case couchbase::error::common_errc::invalid_argument:
307
+ rb_raise(eInvalidArgument, "%s: %s", message.c_str(), ec.message().c_str());
308
+
309
+ case couchbase::error::common_errc::service_not_available:
310
+ rb_raise(eServiceNotAvailable, "%s: %s", message.c_str(), ec.message().c_str());
311
+
312
+ case couchbase::error::common_errc::internal_server_failure:
313
+ rb_raise(eInternalServerFailure, "%s: %s", message.c_str(), ec.message().c_str());
314
+
315
+ case couchbase::error::common_errc::authentication_failure:
316
+ rb_raise(eAuthenticationFailure, "%s: %s", message.c_str(), ec.message().c_str());
317
+
318
+ case couchbase::error::common_errc::temporary_failure:
319
+ rb_raise(eTemporaryFailure, "%s: %s", message.c_str(), ec.message().c_str());
320
+
321
+ case couchbase::error::common_errc::parsing_failure:
322
+ rb_raise(eParsingFailure, "%s: %s", message.c_str(), ec.message().c_str());
323
+
324
+ case couchbase::error::common_errc::cas_mismatch:
325
+ rb_raise(eCasMismatch, "%s: %s", message.c_str(), ec.message().c_str());
326
+
327
+ case couchbase::error::common_errc::bucket_not_found:
328
+ rb_raise(eBucketNotFound, "%s: %s", message.c_str(), ec.message().c_str());
329
+
330
+ case couchbase::error::common_errc::scope_not_found:
331
+ rb_raise(eScopeNotFound, "%s: %s", message.c_str(), ec.message().c_str());
332
+
333
+ case couchbase::error::common_errc::collection_not_found:
334
+ rb_raise(eCollectionNotFound, "%s: %s", message.c_str(), ec.message().c_str());
335
+
336
+ case couchbase::error::common_errc::unsupported_operation:
337
+ rb_raise(eUnsupportedOperation, "%s: %s", message.c_str(), ec.message().c_str());
338
+
339
+ case couchbase::error::common_errc::feature_not_available:
340
+ rb_raise(eFeatureNotAvailable, "%s: %s", message.c_str(), ec.message().c_str());
341
+
342
+ case couchbase::error::common_errc::encoding_failure:
343
+ rb_raise(eEncodingFailure, "%s: %s", message.c_str(), ec.message().c_str());
344
+
345
+ case couchbase::error::common_errc::decoding_failure:
346
+ rb_raise(eDecodingFailure, "%s: %s", message.c_str(), ec.message().c_str());
347
+
348
+ case couchbase::error::common_errc::index_not_found:
349
+ rb_raise(eIndexNotFound, "%s: %s", message.c_str(), ec.message().c_str());
350
+
351
+ case couchbase::error::common_errc::index_exists:
352
+ rb_raise(eIndexExists, "%s: %s", message.c_str(), ec.message().c_str());
353
+ }
354
+ } else if (ec.category() == couchbase::error::detail::get_key_value_category()) {
355
+ switch (static_cast<couchbase::error::key_value_errc>(ec.value())) {
356
+ case couchbase::error::key_value_errc::document_not_found:
357
+ rb_raise(eDocumentNotFound, "%s: %s", message.c_str(), ec.message().c_str());
358
+
359
+ case couchbase::error::key_value_errc::document_irretrievable:
360
+ rb_raise(eDocumentIrretrievable, "%s: %s", message.c_str(), ec.message().c_str());
361
+
362
+ case couchbase::error::key_value_errc::document_locked:
363
+ rb_raise(eDocumentLocked, "%s: %s", message.c_str(), ec.message().c_str());
364
+
365
+ case couchbase::error::key_value_errc::value_too_large:
366
+ rb_raise(eValueTooLarge, "%s: %s", message.c_str(), ec.message().c_str());
367
+
368
+ case couchbase::error::key_value_errc::document_exists:
369
+ rb_raise(eDocumentExists, "%s: %s", message.c_str(), ec.message().c_str());
370
+
371
+ case couchbase::error::key_value_errc::durability_level_not_available:
372
+ rb_raise(eDurabilityLevelNotAvailable, "%s: %s", message.c_str(), ec.message().c_str());
373
+
374
+ case couchbase::error::key_value_errc::durability_impossible:
375
+ rb_raise(eDurabilityImpossible, "%s: %s", message.c_str(), ec.message().c_str());
376
+
377
+ case couchbase::error::key_value_errc::durability_ambiguous:
378
+ rb_raise(eDurabilityAmbiguous, "%s: %s", message.c_str(), ec.message().c_str());
379
+
380
+ case couchbase::error::key_value_errc::durable_write_in_progress:
381
+ rb_raise(eDurableWriteInProgress, "%s: %s", message.c_str(), ec.message().c_str());
382
+
383
+ case couchbase::error::key_value_errc::durable_write_re_commit_in_progress:
384
+ rb_raise(eDurableWriteReCommitInProgress, "%s: %s", message.c_str(), ec.message().c_str());
385
+
386
+ case couchbase::error::key_value_errc::path_not_found:
387
+ rb_raise(ePathNotFound, "%s: %s", message.c_str(), ec.message().c_str());
388
+
389
+ case couchbase::error::key_value_errc::path_mismatch:
390
+ rb_raise(ePathMismatch, "%s: %s", message.c_str(), ec.message().c_str());
391
+
392
+ case couchbase::error::key_value_errc::path_invalid:
393
+ rb_raise(ePathInvalid, "%s: %s", message.c_str(), ec.message().c_str());
394
+
395
+ case couchbase::error::key_value_errc::path_too_big:
396
+ rb_raise(ePathTooBig, "%s: %s", message.c_str(), ec.message().c_str());
397
+
398
+ case couchbase::error::key_value_errc::path_too_deep:
399
+ rb_raise(ePathTooDeep, "%s: %s", message.c_str(), ec.message().c_str());
400
+
401
+ case couchbase::error::key_value_errc::value_too_deep:
402
+ rb_raise(eValueTooDeep, "%s: %s", message.c_str(), ec.message().c_str());
403
+
404
+ case couchbase::error::key_value_errc::value_invalid:
405
+ rb_raise(eValueInvalid, "%s: %s", message.c_str(), ec.message().c_str());
406
+
407
+ case couchbase::error::key_value_errc::document_not_json:
408
+ rb_raise(eDocumentNotJson, "%s: %s", message.c_str(), ec.message().c_str());
409
+
410
+ case couchbase::error::key_value_errc::number_too_big:
411
+ rb_raise(eNumberTooBig, "%s: %s", message.c_str(), ec.message().c_str());
412
+
413
+ case couchbase::error::key_value_errc::delta_invalid:
414
+ rb_raise(eDeltaInvalid, "%s: %s", message.c_str(), ec.message().c_str());
415
+
416
+ case couchbase::error::key_value_errc::path_exists:
417
+ rb_raise(ePathExists, "%s: %s", message.c_str(), ec.message().c_str());
418
+
419
+ case couchbase::error::key_value_errc::xattr_unknown_macro:
420
+ rb_raise(eXattrUnknownMacro, "%s: %s", message.c_str(), ec.message().c_str());
421
+
422
+ case couchbase::error::key_value_errc::xattr_invalid_key_combo:
423
+ rb_raise(eXattrInvalidKeyCombo, "%s: %s", message.c_str(), ec.message().c_str());
424
+
425
+ case couchbase::error::key_value_errc::xattr_unknown_virtual_attribute:
426
+ rb_raise(eXattrUnknownVirtualAttribute, "%s: %s", message.c_str(), ec.message().c_str());
427
+
428
+ case couchbase::error::key_value_errc::xattr_cannot_modify_virtual_attribute:
429
+ rb_raise(eXattrCannotModifyVirtualAttribute, "%s: %s", message.c_str(), ec.message().c_str());
430
+ }
431
+ } else if (ec.category() == couchbase::error::detail::get_query_category()) {
432
+ switch (static_cast<couchbase::error::query_errc>(ec.value())) {
433
+ case couchbase::error::query_errc::planning_failure:
434
+ rb_raise(ePlanningFailure, "%s: %s", message.c_str(), ec.message().c_str());
435
+
436
+ case couchbase::error::query_errc::index_failure:
437
+ rb_raise(eIndexFailure, "%s: %s", message.c_str(), ec.message().c_str());
438
+
439
+ case couchbase::error::query_errc::prepared_statement_failure:
440
+ rb_raise(ePreparedStatementFailure, "%s: %s", message.c_str(), ec.message().c_str());
441
+ }
442
+ } else if (ec.category() == couchbase::error::detail::get_view_category()) {
443
+ switch (static_cast<couchbase::error::view_errc>(ec.value())) {
444
+ case couchbase::error::view_errc::view_not_found:
445
+ rb_raise(eViewNotFound, "%s: %s", message.c_str(), ec.message().c_str());
446
+
447
+ case couchbase::error::view_errc::design_document_not_found:
448
+ rb_raise(eDesignDocumentNotFound, "%s: %s", message.c_str(), ec.message().c_str());
449
+ }
450
+ } else if (ec.category() == couchbase::error::detail::get_analytics_category()) {
451
+ switch (static_cast<couchbase::error::analytics_errc>(ec.value())) {
452
+ case couchbase::error::analytics_errc::compilation_failure:
453
+ rb_raise(eCompilationFailure, "%s: %s", message.c_str(), ec.message().c_str());
454
+
455
+ case couchbase::error::analytics_errc::job_queue_full:
456
+ rb_raise(eJobQueueFull, "%s: %s", message.c_str(), ec.message().c_str());
457
+
458
+ case couchbase::error::analytics_errc::dataset_not_found:
459
+ rb_raise(eDatasetNotFound, "%s: %s", message.c_str(), ec.message().c_str());
460
+
461
+ case couchbase::error::analytics_errc::dataverse_not_found:
462
+ rb_raise(eDataverseNotFound, "%s: %s", message.c_str(), ec.message().c_str());
463
+
464
+ case couchbase::error::analytics_errc::dataset_exists:
465
+ rb_raise(eDatasetExists, "%s: %s", message.c_str(), ec.message().c_str());
466
+
467
+ case couchbase::error::analytics_errc::dataverse_exists:
468
+ rb_raise(eDataverseExists, "%s: %s", message.c_str(), ec.message().c_str());
469
+
470
+ case couchbase::error::analytics_errc::link_not_found:
471
+ rb_raise(eLinkNotFound, "%s: %s", message.c_str(), ec.message().c_str());
472
+ }
473
+ } else if (ec.category() == couchbase::error::detail::get_management_category()) {
474
+ switch (static_cast<couchbase::error::management_errc>(ec.value())) {
475
+ case couchbase::error::management_errc::collection_exists:
476
+ rb_raise(eCollectionExists, "%s: %s", message.c_str(), ec.message().c_str());
477
+
478
+ case couchbase::error::management_errc::scope_exists:
479
+ rb_raise(eScopeExists, "%s: %s", message.c_str(), ec.message().c_str());
480
+
481
+ case couchbase::error::management_errc::user_not_found:
482
+ rb_raise(eUserNotFound, "%s: %s", message.c_str(), ec.message().c_str());
483
+
484
+ case couchbase::error::management_errc::group_not_found:
485
+ rb_raise(eGroupNotFound, "%s: %s", message.c_str(), ec.message().c_str());
486
+
487
+ case couchbase::error::management_errc::user_exists:
488
+ rb_raise(eUserExists, "%s: %s", message.c_str(), ec.message().c_str());
489
+
490
+ case couchbase::error::management_errc::bucket_exists:
491
+ rb_raise(eBucketExists, "%s: %s", message.c_str(), ec.message().c_str());
492
+
493
+ case couchbase::error::management_errc::bucket_not_flushable:
494
+ rb_raise(eBucketNotFlushable, "%s: %s", message.c_str(), ec.message().c_str());
495
+ }
496
+ }
497
+
498
+ rb_raise(eBackendError, "%s: %s", message.c_str(), ec.message().c_str());
499
+ }
500
+
501
+ static VALUE
502
+ cb_Backend_open(VALUE self, VALUE hostname, VALUE username, VALUE password)
503
+ {
504
+ cb_backend_data* backend = nullptr;
505
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
506
+
507
+ if (!backend->cluster) {
508
+ rb_raise(rb_eArgError, "Cluster has been closed already");
509
+ }
510
+
511
+ Check_Type(hostname, T_STRING);
512
+ Check_Type(username, T_STRING);
513
+ Check_Type(password, T_STRING);
514
+
515
+ couchbase::origin options;
516
+ options.hostname.assign(RSTRING_PTR(hostname), static_cast<size_t>(RSTRING_LEN(hostname)));
517
+ options.username.assign(RSTRING_PTR(username), static_cast<size_t>(RSTRING_LEN(username)));
518
+ options.password.assign(RSTRING_PTR(password), static_cast<size_t>(RSTRING_LEN(password)));
519
+ auto barrier = std::make_shared<std::promise<std::error_code>>();
520
+ auto f = barrier->get_future();
521
+ backend->cluster->open(options, [barrier](std::error_code ec) mutable { barrier->set_value(ec); });
522
+ if (auto ec = f.get()) {
523
+ cb_raise_error_code(ec, fmt::format("unable open cluster at {}", options.hostname));
524
+ }
525
+
526
+ return Qnil;
527
+ }
528
+
529
+ static VALUE
530
+ cb_Backend_close(VALUE self)
531
+ {
532
+ cb_backend_data* backend = nullptr;
533
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
534
+ cb__backend_close(backend);
535
+ return Qnil;
536
+ }
537
+
538
+ static VALUE
539
+ cb_Backend_open_bucket(VALUE self, VALUE bucket)
540
+ {
541
+ cb_backend_data* backend = nullptr;
542
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
543
+
544
+ if (!backend->cluster) {
545
+ rb_raise(rb_eArgError, "Cluster has been closed already");
546
+ }
547
+
548
+ Check_Type(bucket, T_STRING);
549
+ std::string name(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
550
+
551
+ auto barrier = std::make_shared<std::promise<std::error_code>>();
552
+ auto f = barrier->get_future();
553
+ backend->cluster->open_bucket(name, [barrier](std::error_code ec) mutable { barrier->set_value(ec); });
554
+ if (auto ec = f.get()) {
555
+ cb_raise_error_code(ec, fmt::format("unable open bucket \"{}\"", name));
556
+ }
557
+
558
+ return Qtrue;
559
+ }
560
+
561
+ static VALUE
562
+ cb_Backend_document_get(VALUE self, VALUE bucket, VALUE collection, VALUE id)
563
+ {
564
+ cb_backend_data* backend = nullptr;
565
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
566
+
567
+ if (!backend->cluster) {
568
+ rb_raise(rb_eArgError, "Cluster has been closed already");
569
+ }
570
+
571
+ Check_Type(bucket, T_STRING);
572
+ Check_Type(collection, T_STRING);
573
+ Check_Type(id, T_STRING);
574
+
575
+ couchbase::document_id doc_id;
576
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
577
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
578
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
579
+
580
+ couchbase::operations::get_request req{ doc_id };
581
+ auto barrier = std::make_shared<std::promise<couchbase::operations::get_response>>();
582
+ auto f = barrier->get_future();
583
+ backend->cluster->execute(req, [barrier](couchbase::operations::get_response resp) mutable { barrier->set_value(resp); });
584
+ auto resp = f.get();
585
+ if (resp.ec) {
586
+ cb_raise_error_code(resp.ec, fmt::format("unable fetch {}", doc_id));
587
+ }
588
+
589
+ VALUE res = rb_hash_new();
590
+ rb_hash_aset(res, rb_id2sym(rb_intern("content")), rb_str_new(resp.value.data(), static_cast<long>(resp.value.size())));
591
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
592
+ rb_hash_aset(res, rb_id2sym(rb_intern("flags")), UINT2NUM(resp.flags));
593
+ return res;
594
+ }
595
+
596
+ static VALUE
597
+ cb_Backend_document_get_and_lock(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE lock_time)
598
+ {
599
+ cb_backend_data* backend = nullptr;
600
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
601
+
602
+ if (!backend->cluster) {
603
+ rb_raise(rb_eArgError, "Cluster has been closed already");
604
+ }
605
+
606
+ Check_Type(bucket, T_STRING);
607
+ Check_Type(collection, T_STRING);
608
+ Check_Type(id, T_STRING);
609
+ Check_Type(lock_time, T_FIXNUM);
610
+
611
+ couchbase::document_id doc_id;
612
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
613
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
614
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
615
+
616
+ couchbase::operations::get_and_lock_request req{ doc_id };
617
+ req.lock_time = NUM2UINT(lock_time);
618
+
619
+ auto barrier = std::make_shared<std::promise<couchbase::operations::get_and_lock_response>>();
620
+ auto f = barrier->get_future();
621
+ backend->cluster->execute(req, [barrier](couchbase::operations::get_and_lock_response resp) mutable { barrier->set_value(resp); });
622
+ auto resp = f.get();
623
+ if (resp.ec) {
624
+ cb_raise_error_code(resp.ec, fmt::format("unable lock and fetch {}", doc_id));
625
+ }
626
+
627
+ VALUE res = rb_hash_new();
628
+ rb_hash_aset(res, rb_id2sym(rb_intern("content")), rb_str_new(resp.value.data(), static_cast<long>(resp.value.size())));
629
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
630
+ rb_hash_aset(res, rb_id2sym(rb_intern("flags")), UINT2NUM(resp.flags));
631
+ return res;
632
+ }
633
+
634
+ static VALUE
635
+ cb_Backend_document_get_and_touch(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE expiration)
636
+ {
637
+ cb_backend_data* backend = nullptr;
638
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
639
+
640
+ if (!backend->cluster) {
641
+ rb_raise(rb_eArgError, "Cluster has been closed already");
642
+ }
643
+
644
+ Check_Type(bucket, T_STRING);
645
+ Check_Type(collection, T_STRING);
646
+ Check_Type(id, T_STRING);
647
+ Check_Type(expiration, T_FIXNUM);
648
+
649
+ couchbase::document_id doc_id;
650
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
651
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
652
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
653
+
654
+ couchbase::operations::get_and_touch_request req{ doc_id };
655
+ req.expiration = NUM2UINT(expiration);
656
+
657
+ auto barrier = std::make_shared<std::promise<couchbase::operations::get_and_touch_response>>();
658
+ auto f = barrier->get_future();
659
+ backend->cluster->execute(req, [barrier](couchbase::operations::get_and_touch_response resp) mutable { barrier->set_value(resp); });
660
+ auto resp = f.get();
661
+ if (resp.ec) {
662
+ cb_raise_error_code(resp.ec, fmt::format("unable fetch and touch {}", doc_id));
663
+ }
664
+
665
+ VALUE res = rb_hash_new();
666
+ rb_hash_aset(res, rb_id2sym(rb_intern("content")), rb_str_new(resp.value.data(), static_cast<long>(resp.value.size())));
667
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
668
+ rb_hash_aset(res, rb_id2sym(rb_intern("flags")), UINT2NUM(resp.flags));
669
+ return res;
670
+ }
671
+
672
+ template<typename Response>
673
+ static VALUE
674
+ cb__extract_mutation_result(Response resp)
675
+ {
676
+ VALUE res = rb_hash_new();
677
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
678
+ VALUE token = rb_hash_new();
679
+ rb_hash_aset(token, rb_id2sym(rb_intern("partition_uuid")), ULL2NUM(resp.token.partition_uuid));
680
+ rb_hash_aset(token, rb_id2sym(rb_intern("sequence_number")), ULONG2NUM(resp.token.sequence_number));
681
+ rb_hash_aset(token, rb_id2sym(rb_intern("partition_id")), UINT2NUM(resp.token.partition_id));
682
+ rb_hash_aset(token,
683
+ rb_id2sym(rb_intern("bucket_name")),
684
+ rb_str_new(resp.token.bucket_name.c_str(), static_cast<long>(resp.token.bucket_name.size())));
685
+ rb_hash_aset(res, rb_id2sym(rb_intern("mutation_token")), token);
686
+ return res;
687
+ }
688
+
689
+ static VALUE
690
+ cb_Backend_document_touch(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE expiration)
691
+ {
692
+ cb_backend_data* backend = nullptr;
693
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
694
+
695
+ if (!backend->cluster) {
696
+ rb_raise(rb_eArgError, "Cluster has been closed already");
697
+ }
698
+
699
+ Check_Type(bucket, T_STRING);
700
+ Check_Type(collection, T_STRING);
701
+ Check_Type(id, T_STRING);
702
+ Check_Type(expiration, T_FIXNUM);
703
+
704
+ couchbase::document_id doc_id;
705
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
706
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
707
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
708
+
709
+ couchbase::operations::touch_request req{ doc_id };
710
+ req.expiration = NUM2UINT(expiration);
711
+
712
+ auto barrier = std::make_shared<std::promise<couchbase::operations::touch_response>>();
713
+ auto f = barrier->get_future();
714
+ backend->cluster->execute(req, [barrier](couchbase::operations::touch_response resp) mutable { barrier->set_value(resp); });
715
+ auto resp = f.get();
716
+ if (resp.ec) {
717
+ cb_raise_error_code(resp.ec, fmt::format("unable to touch {}", doc_id));
718
+ }
719
+
720
+ VALUE res = rb_hash_new();
721
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
722
+ return res;
723
+ }
724
+
725
+ static VALUE
726
+ cb_Backend_document_exists(VALUE self, VALUE bucket, VALUE collection, VALUE id)
727
+ {
728
+ cb_backend_data* backend = nullptr;
729
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
730
+
731
+ if (!backend->cluster) {
732
+ rb_raise(rb_eArgError, "Cluster has been closed already");
733
+ }
734
+
735
+ Check_Type(bucket, T_STRING);
736
+ Check_Type(collection, T_STRING);
737
+ Check_Type(id, T_STRING);
738
+
739
+ couchbase::document_id doc_id;
740
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
741
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
742
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
743
+
744
+ couchbase::operations::exists_request req{ doc_id };
745
+
746
+ auto barrier = std::make_shared<std::promise<couchbase::operations::exists_response>>();
747
+ auto f = barrier->get_future();
748
+ backend->cluster->execute(req, [barrier](couchbase::operations::exists_response resp) mutable { barrier->set_value(resp); });
749
+ auto resp = f.get();
750
+ if (resp.ec) {
751
+ cb_raise_error_code(resp.ec, fmt::format("unable to exists {}", doc_id));
752
+ }
753
+
754
+ VALUE res = rb_hash_new();
755
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
756
+ rb_hash_aset(res, rb_id2sym(rb_intern("partition_id")), UINT2NUM(resp.partition_id));
757
+ switch (resp.status) {
758
+ case couchbase::operations::exists_response::observe_status::invalid:
759
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_id2sym(rb_intern("invalid")));
760
+ break;
761
+ case couchbase::operations::exists_response::observe_status::found:
762
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_id2sym(rb_intern("found")));
763
+ break;
764
+ case couchbase::operations::exists_response::observe_status::not_found:
765
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_id2sym(rb_intern("not_found")));
766
+ break;
767
+ case couchbase::operations::exists_response::observe_status::persisted:
768
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_id2sym(rb_intern("persisted")));
769
+ break;
770
+ case couchbase::operations::exists_response::observe_status::logically_deleted:
771
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_id2sym(rb_intern("logically_deleted")));
772
+ break;
773
+ }
774
+ return res;
775
+ }
776
+
777
+ static VALUE
778
+ cb_Backend_document_unlock(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE cas)
779
+ {
780
+ cb_backend_data* backend = nullptr;
781
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
782
+
783
+ if (!backend->cluster) {
784
+ rb_raise(rb_eArgError, "Cluster has been closed already");
785
+ }
786
+
787
+ Check_Type(bucket, T_STRING);
788
+ Check_Type(collection, T_STRING);
789
+ Check_Type(id, T_STRING);
790
+
791
+ couchbase::document_id doc_id;
792
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
793
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
794
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
795
+
796
+ couchbase::operations::unlock_request req{ doc_id };
797
+ switch (TYPE(cas)) {
798
+ case T_FIXNUM:
799
+ case T_BIGNUM:
800
+ req.cas = NUM2ULL(cas);
801
+ break;
802
+ default:
803
+ rb_raise(rb_eArgError, "CAS must be an Integer");
804
+ }
805
+
806
+ auto barrier = std::make_shared<std::promise<couchbase::operations::unlock_response>>();
807
+ auto f = barrier->get_future();
808
+ backend->cluster->execute(req, [barrier](couchbase::operations::unlock_response resp) mutable { barrier->set_value(resp); });
809
+ auto resp = f.get();
810
+ if (resp.ec) {
811
+ cb_raise_error_code(resp.ec, fmt::format("unable to unlock {}", doc_id));
812
+ }
813
+
814
+ VALUE res = rb_hash_new();
815
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
816
+ return res;
817
+ }
818
+
819
+ static VALUE
820
+ cb_Backend_document_upsert(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE content, VALUE flags, VALUE options)
821
+ {
822
+ cb_backend_data* backend = nullptr;
823
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
824
+
825
+ if (!backend->cluster) {
826
+ rb_raise(rb_eArgError, "Cluster has been closed already");
827
+ }
828
+
829
+ Check_Type(bucket, T_STRING);
830
+ Check_Type(collection, T_STRING);
831
+ Check_Type(id, T_STRING);
832
+ Check_Type(content, T_STRING);
833
+ Check_Type(flags, T_FIXNUM);
834
+
835
+ couchbase::document_id doc_id;
836
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
837
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
838
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
839
+ std::string value(RSTRING_PTR(content), static_cast<size_t>(RSTRING_LEN(content)));
840
+
841
+ couchbase::operations::upsert_request req{ doc_id, value };
842
+ req.flags = FIX2UINT(flags);
843
+
844
+ if (!NIL_P(options)) {
845
+ Check_Type(options, T_HASH);
846
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
847
+ if (!NIL_P(durability_level)) {
848
+ Check_Type(durability_level, T_SYMBOL);
849
+ ID level = rb_sym2id(durability_level);
850
+ if (level == rb_intern("none")) {
851
+ req.durability_level = couchbase::protocol::durability_level::none;
852
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
853
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
854
+ } else if (level == rb_intern("persist_to_majority")) {
855
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
856
+ } else {
857
+ rb_raise(rb_eArgError, "Unknown durability level");
858
+ }
859
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
860
+ if (!NIL_P(durability_timeout)) {
861
+ Check_Type(durability_timeout, T_FIXNUM);
862
+ req.durability_timeout = FIX2UINT(durability_timeout);
863
+ }
864
+ }
865
+ VALUE expiration = rb_hash_aref(options, rb_id2sym(rb_intern("expiration")));
866
+ if (!NIL_P(expiration)) {
867
+ Check_Type(expiration, T_FIXNUM);
868
+ req.expiration = FIX2UINT(expiration);
869
+ }
870
+ }
871
+
872
+ auto barrier = std::make_shared<std::promise<couchbase::operations::upsert_response>>();
873
+ auto f = barrier->get_future();
874
+ backend->cluster->execute(req, [barrier](couchbase::operations::upsert_response resp) mutable { barrier->set_value(resp); });
875
+ auto resp = f.get();
876
+ if (resp.ec) {
877
+ cb_raise_error_code(resp.ec, fmt::format("unable to upsert {}", doc_id));
878
+ }
879
+
880
+ return cb__extract_mutation_result(resp);
881
+ }
882
+
883
+ static VALUE
884
+ cb_Backend_document_replace(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE content, VALUE flags, VALUE options)
885
+ {
886
+ cb_backend_data* backend = nullptr;
887
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
888
+
889
+ if (!backend->cluster) {
890
+ rb_raise(rb_eArgError, "Cluster has been closed already");
891
+ }
892
+
893
+ Check_Type(bucket, T_STRING);
894
+ Check_Type(collection, T_STRING);
895
+ Check_Type(id, T_STRING);
896
+ Check_Type(content, T_STRING);
897
+ Check_Type(flags, T_FIXNUM);
898
+
899
+ couchbase::document_id doc_id;
900
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
901
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
902
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
903
+ std::string value(RSTRING_PTR(content), static_cast<size_t>(RSTRING_LEN(content)));
904
+
905
+ couchbase::operations::replace_request req{ doc_id, value };
906
+ req.flags = FIX2UINT(flags);
907
+
908
+ if (!NIL_P(options)) {
909
+ Check_Type(options, T_HASH);
910
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
911
+ if (!NIL_P(durability_level)) {
912
+ Check_Type(durability_level, T_SYMBOL);
913
+ ID level = rb_sym2id(durability_level);
914
+ if (level == rb_intern("none")) {
915
+ req.durability_level = couchbase::protocol::durability_level::none;
916
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
917
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
918
+ } else if (level == rb_intern("persist_to_majority")) {
919
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
920
+ } else {
921
+ rb_raise(rb_eArgError, "Unknown durability level");
922
+ }
923
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
924
+ if (!NIL_P(durability_timeout)) {
925
+ Check_Type(durability_timeout, T_FIXNUM);
926
+ req.durability_timeout = FIX2UINT(durability_timeout);
927
+ }
928
+ }
929
+ VALUE expiration = rb_hash_aref(options, rb_id2sym(rb_intern("expiration")));
930
+ if (!NIL_P(expiration)) {
931
+ Check_Type(expiration, T_FIXNUM);
932
+ req.expiration = FIX2UINT(expiration);
933
+ }
934
+ VALUE cas = rb_hash_aref(options, rb_id2sym(rb_intern("cas")));
935
+ if (!NIL_P(cas)) {
936
+ switch (TYPE(cas)) {
937
+ case T_FIXNUM:
938
+ case T_BIGNUM:
939
+ req.cas = NUM2ULL(cas);
940
+ break;
941
+ default:
942
+ rb_raise(rb_eArgError, "CAS must be an Integer");
943
+ }
944
+ }
945
+ }
946
+
947
+ auto barrier = std::make_shared<std::promise<couchbase::operations::replace_response>>();
948
+ auto f = barrier->get_future();
949
+ backend->cluster->execute(req, [barrier](couchbase::operations::replace_response resp) mutable { barrier->set_value(resp); });
950
+ auto resp = f.get();
951
+ if (resp.ec) {
952
+ cb_raise_error_code(resp.ec, fmt::format("unable to replace {}", doc_id));
953
+ }
954
+
955
+ return cb__extract_mutation_result(resp);
956
+ }
957
+
958
+ static VALUE
959
+ cb_Backend_document_insert(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE content, VALUE flags, VALUE options)
960
+ {
961
+ cb_backend_data* backend = nullptr;
962
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
963
+
964
+ if (!backend->cluster) {
965
+ rb_raise(rb_eArgError, "Cluster has been closed already");
966
+ }
967
+
968
+ Check_Type(bucket, T_STRING);
969
+ Check_Type(collection, T_STRING);
970
+ Check_Type(id, T_STRING);
971
+ Check_Type(content, T_STRING);
972
+ Check_Type(flags, T_FIXNUM);
973
+
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::insert_request req{ doc_id, value };
981
+ req.flags = FIX2UINT(flags);
982
+
983
+ if (!NIL_P(options)) {
984
+ Check_Type(options, T_HASH);
985
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
986
+ if (!NIL_P(durability_level)) {
987
+ Check_Type(durability_level, T_SYMBOL);
988
+ ID level = rb_sym2id(durability_level);
989
+ if (level == rb_intern("none")) {
990
+ req.durability_level = couchbase::protocol::durability_level::none;
991
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
992
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
993
+ } else if (level == rb_intern("persist_to_majority")) {
994
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
995
+ } else {
996
+ rb_raise(rb_eArgError, "Unknown durability level");
997
+ }
998
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
999
+ if (!NIL_P(durability_timeout)) {
1000
+ Check_Type(durability_timeout, T_FIXNUM);
1001
+ req.durability_timeout = FIX2UINT(durability_timeout);
1002
+ }
1003
+ }
1004
+ VALUE expiration = rb_hash_aref(options, rb_id2sym(rb_intern("expiration")));
1005
+ if (!NIL_P(expiration)) {
1006
+ Check_Type(expiration, T_FIXNUM);
1007
+ req.expiration = FIX2UINT(expiration);
1008
+ }
1009
+ }
1010
+
1011
+ auto barrier = std::make_shared<std::promise<couchbase::operations::insert_response>>();
1012
+ auto f = barrier->get_future();
1013
+ backend->cluster->execute(req, [barrier](couchbase::operations::insert_response resp) mutable { barrier->set_value(resp); });
1014
+ auto resp = f.get();
1015
+ if (resp.ec) {
1016
+ cb_raise_error_code(resp.ec, fmt::format("unable to insert {}", doc_id));
1017
+ }
1018
+
1019
+ return cb__extract_mutation_result(resp);
1020
+ }
1021
+
1022
+ static VALUE
1023
+ cb_Backend_document_remove(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE options)
1024
+ {
1025
+ cb_backend_data* backend = nullptr;
1026
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1027
+
1028
+ if (!backend->cluster) {
1029
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1030
+ }
1031
+
1032
+ Check_Type(bucket, T_STRING);
1033
+ Check_Type(collection, T_STRING);
1034
+ Check_Type(id, T_STRING);
1035
+
1036
+ couchbase::document_id doc_id;
1037
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
1038
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
1039
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
1040
+
1041
+ couchbase::operations::remove_request req{ doc_id };
1042
+ if (!NIL_P(options)) {
1043
+ Check_Type(options, T_HASH);
1044
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
1045
+ if (!NIL_P(durability_level)) {
1046
+ Check_Type(durability_level, T_SYMBOL);
1047
+ ID level = rb_sym2id(durability_level);
1048
+ if (level == rb_intern("none")) {
1049
+ req.durability_level = couchbase::protocol::durability_level::none;
1050
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
1051
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
1052
+ } else if (level == rb_intern("persist_to_majority")) {
1053
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
1054
+ } else {
1055
+ rb_raise(rb_eArgError, "Unknown durability level");
1056
+ }
1057
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
1058
+ if (!NIL_P(durability_timeout)) {
1059
+ Check_Type(durability_timeout, T_FIXNUM);
1060
+ req.durability_timeout = FIX2UINT(durability_timeout);
1061
+ }
1062
+ }
1063
+ }
1064
+
1065
+ auto barrier = std::make_shared<std::promise<couchbase::operations::remove_response>>();
1066
+ auto f = barrier->get_future();
1067
+ backend->cluster->execute(req, [barrier](couchbase::operations::remove_response resp) mutable { barrier->set_value(resp); });
1068
+ auto resp = f.get();
1069
+ if (resp.ec) {
1070
+ cb_raise_error_code(resp.ec, fmt::format("unable to remove {}", doc_id));
1071
+ }
1072
+ return cb__extract_mutation_result(resp);
1073
+ }
1074
+
1075
+ static VALUE
1076
+ cb_Backend_document_increment(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE options)
1077
+ {
1078
+ cb_backend_data* backend = nullptr;
1079
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1080
+
1081
+ if (!backend->cluster) {
1082
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1083
+ }
1084
+
1085
+ Check_Type(bucket, T_STRING);
1086
+ Check_Type(collection, T_STRING);
1087
+ Check_Type(id, T_STRING);
1088
+
1089
+ couchbase::document_id doc_id;
1090
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
1091
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
1092
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
1093
+
1094
+ couchbase::operations::increment_request req{ doc_id };
1095
+ if (!NIL_P(options)) {
1096
+ Check_Type(options, T_HASH);
1097
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
1098
+ if (!NIL_P(durability_level)) {
1099
+ Check_Type(durability_level, T_SYMBOL);
1100
+ ID level = rb_sym2id(durability_level);
1101
+ if (level == rb_intern("none")) {
1102
+ req.durability_level = couchbase::protocol::durability_level::none;
1103
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
1104
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
1105
+ } else if (level == rb_intern("persist_to_majority")) {
1106
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
1107
+ } else {
1108
+ rb_raise(rb_eArgError, "Unknown durability level");
1109
+ }
1110
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
1111
+ if (!NIL_P(durability_timeout)) {
1112
+ Check_Type(durability_timeout, T_FIXNUM);
1113
+ req.durability_timeout = FIX2UINT(durability_timeout);
1114
+ }
1115
+ }
1116
+ VALUE delta = rb_hash_aref(options, rb_id2sym(rb_intern("delta")));
1117
+ if (!NIL_P(delta)) {
1118
+ switch (TYPE(delta)) {
1119
+ case T_FIXNUM:
1120
+ case T_BIGNUM:
1121
+ req.delta = NUM2ULL(delta);
1122
+ break;
1123
+ default:
1124
+ rb_raise(rb_eArgError, "delta must be an Integer");
1125
+ }
1126
+ }
1127
+ VALUE initial_value = rb_hash_aref(options, rb_id2sym(rb_intern("initial_value")));
1128
+ if (!NIL_P(initial_value)) {
1129
+ switch (TYPE(initial_value)) {
1130
+ case T_FIXNUM:
1131
+ case T_BIGNUM:
1132
+ req.initial_value = NUM2ULL(initial_value);
1133
+ break;
1134
+ default:
1135
+ rb_raise(rb_eArgError, "initial_value must be an Integer");
1136
+ }
1137
+ }
1138
+ VALUE expiration = rb_hash_aref(options, rb_id2sym(rb_intern("expiration")));
1139
+ if (!NIL_P(expiration)) {
1140
+ Check_Type(expiration, T_FIXNUM);
1141
+ req.expiration = FIX2UINT(expiration);
1142
+ }
1143
+ }
1144
+
1145
+ auto barrier = std::make_shared<std::promise<couchbase::operations::increment_response>>();
1146
+ auto f = barrier->get_future();
1147
+ backend->cluster->execute(req, [barrier](couchbase::operations::increment_response resp) mutable { barrier->set_value(resp); });
1148
+ auto resp = f.get();
1149
+ if (resp.ec) {
1150
+ cb_raise_error_code(resp.ec, fmt::format("unable to increment {} by {}", doc_id, req.delta));
1151
+ }
1152
+ VALUE res = cb__extract_mutation_result(resp);
1153
+ rb_hash_aset(res, rb_id2sym(rb_intern("content")), ULL2NUM(resp.content));
1154
+ return res;
1155
+ }
1156
+
1157
+ static VALUE
1158
+ cb_Backend_document_decrement(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE options)
1159
+ {
1160
+ cb_backend_data* backend = nullptr;
1161
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1162
+
1163
+ if (!backend->cluster) {
1164
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1165
+ }
1166
+
1167
+ Check_Type(bucket, T_STRING);
1168
+ Check_Type(collection, T_STRING);
1169
+ Check_Type(id, T_STRING);
1170
+ Check_Type(options, T_HASH);
1171
+
1172
+ couchbase::document_id doc_id;
1173
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
1174
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
1175
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
1176
+
1177
+ couchbase::operations::decrement_request req{ doc_id };
1178
+ if (!NIL_P(options)) {
1179
+ Check_Type(options, T_HASH);
1180
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
1181
+ if (!NIL_P(durability_level)) {
1182
+ Check_Type(durability_level, T_SYMBOL);
1183
+ ID level = rb_sym2id(durability_level);
1184
+ if (level == rb_intern("none")) {
1185
+ req.durability_level = couchbase::protocol::durability_level::none;
1186
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
1187
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
1188
+ } else if (level == rb_intern("persist_to_majority")) {
1189
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
1190
+ } else {
1191
+ rb_raise(rb_eArgError, "Unknown durability level");
1192
+ }
1193
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
1194
+ if (!NIL_P(durability_timeout)) {
1195
+ Check_Type(durability_timeout, T_FIXNUM);
1196
+ req.durability_timeout = FIX2UINT(durability_timeout);
1197
+ }
1198
+ }
1199
+ VALUE delta = rb_hash_aref(options, rb_id2sym(rb_intern("delta")));
1200
+ if (!NIL_P(delta)) {
1201
+ switch (TYPE(delta)) {
1202
+ case T_FIXNUM:
1203
+ case T_BIGNUM:
1204
+ req.delta = NUM2ULL(delta);
1205
+ break;
1206
+ default:
1207
+ rb_raise(rb_eArgError, "delta must be an Integer");
1208
+ }
1209
+ }
1210
+ VALUE initial_value = rb_hash_aref(options, rb_id2sym(rb_intern("initial_value")));
1211
+ if (!NIL_P(initial_value)) {
1212
+ switch (TYPE(initial_value)) {
1213
+ case T_FIXNUM:
1214
+ case T_BIGNUM:
1215
+ req.initial_value = NUM2ULL(initial_value);
1216
+ break;
1217
+ default:
1218
+ rb_raise(rb_eArgError, "initial_value must be an Integer");
1219
+ }
1220
+ }
1221
+ VALUE expiration = rb_hash_aref(options, rb_id2sym(rb_intern("expiration")));
1222
+ if (!NIL_P(expiration)) {
1223
+ Check_Type(expiration, T_FIXNUM);
1224
+ req.expiration = FIX2UINT(expiration);
1225
+ }
1226
+ }
1227
+
1228
+ auto barrier = std::make_shared<std::promise<couchbase::operations::decrement_response>>();
1229
+ auto f = barrier->get_future();
1230
+ backend->cluster->execute(req, [barrier](couchbase::operations::decrement_response resp) mutable { barrier->set_value(resp); });
1231
+ auto resp = f.get();
1232
+ if (resp.ec) {
1233
+ cb_raise_error_code(resp.ec, fmt::format("unable to decrement {} by {}", doc_id, req.delta));
1234
+ }
1235
+ VALUE res = cb__extract_mutation_result(resp);
1236
+ rb_hash_aset(res, rb_id2sym(rb_intern("content")), ULL2NUM(resp.content));
1237
+ return res;
1238
+ }
1239
+
1240
+ static VALUE
1241
+ cb__map_subdoc_opcode(couchbase::protocol::subdoc_opcode opcode)
1242
+ {
1243
+ switch (opcode) {
1244
+ case couchbase::protocol::subdoc_opcode::get:
1245
+ return rb_id2sym(rb_intern("get"));
1246
+
1247
+ case couchbase::protocol::subdoc_opcode::exists:
1248
+ return rb_id2sym(rb_intern("exists"));
1249
+
1250
+ case couchbase::protocol::subdoc_opcode::dict_add:
1251
+ return rb_id2sym(rb_intern("dict_add"));
1252
+
1253
+ case couchbase::protocol::subdoc_opcode::dict_upsert:
1254
+ return rb_id2sym(rb_intern("dict_upsert"));
1255
+
1256
+ case couchbase::protocol::subdoc_opcode::remove:
1257
+ return rb_id2sym(rb_intern("remove"));
1258
+
1259
+ case couchbase::protocol::subdoc_opcode::replace:
1260
+ return rb_id2sym(rb_intern("replace"));
1261
+
1262
+ case couchbase::protocol::subdoc_opcode::array_push_last:
1263
+ return rb_id2sym(rb_intern("array_push_last"));
1264
+
1265
+ case couchbase::protocol::subdoc_opcode::array_push_first:
1266
+ return rb_id2sym(rb_intern("array_push_first"));
1267
+
1268
+ case couchbase::protocol::subdoc_opcode::array_insert:
1269
+ return rb_id2sym(rb_intern("array_insert"));
1270
+
1271
+ case couchbase::protocol::subdoc_opcode::array_add_unique:
1272
+ return rb_id2sym(rb_intern("array_add_unique"));
1273
+
1274
+ case couchbase::protocol::subdoc_opcode::counter:
1275
+ return rb_id2sym(rb_intern("counter"));
1276
+
1277
+ case couchbase::protocol::subdoc_opcode::get_count:
1278
+ return rb_id2sym(rb_intern("count"));
1279
+ }
1280
+ return rb_id2sym(rb_intern("unknown"));
1281
+ }
1282
+
1283
+ static VALUE
1284
+ cb__map_subdoc_status(couchbase::protocol::status status)
1285
+ {
1286
+ switch (status) {
1287
+ case couchbase::protocol::status::success:
1288
+ return rb_id2sym(rb_intern("success"));
1289
+
1290
+ case couchbase::protocol::status::subdoc_path_mismatch:
1291
+ return rb_id2sym(rb_intern("path_mismatch"));
1292
+
1293
+ case couchbase::protocol::status::subdoc_path_invalid:
1294
+ return rb_id2sym(rb_intern("path_invalid"));
1295
+
1296
+ case couchbase::protocol::status::subdoc_path_too_big:
1297
+ return rb_id2sym(rb_intern("path_too_big"));
1298
+
1299
+ case couchbase::protocol::status::subdoc_value_cannot_insert:
1300
+ return rb_id2sym(rb_intern("value_cannot_insert"));
1301
+
1302
+ case couchbase::protocol::status::subdoc_doc_not_json:
1303
+ return rb_id2sym(rb_intern("doc_not_json"));
1304
+
1305
+ case couchbase::protocol::status::subdoc_num_range_error:
1306
+ return rb_id2sym(rb_intern("num_range"));
1307
+
1308
+ case couchbase::protocol::status::subdoc_delta_invalid:
1309
+ return rb_id2sym(rb_intern("delta_invalid"));
1310
+
1311
+ case couchbase::protocol::status::subdoc_path_exists:
1312
+ return rb_id2sym(rb_intern("path_exists"));
1313
+
1314
+ case couchbase::protocol::status::subdoc_value_too_deep:
1315
+ return rb_id2sym(rb_intern("value_too_deep"));
1316
+
1317
+ case couchbase::protocol::status::subdoc_invalid_combo:
1318
+ return rb_id2sym(rb_intern("invalid_combo"));
1319
+
1320
+ case couchbase::protocol::status::subdoc_xattr_invalid_flag_combo:
1321
+ return rb_id2sym(rb_intern("xattr_invalid_flag_combo"));
1322
+
1323
+ case couchbase::protocol::status::subdoc_xattr_invalid_key_combo:
1324
+ return rb_id2sym(rb_intern("xattr_invalid_key_combo"));
1325
+
1326
+ case couchbase::protocol::status::subdoc_xattr_unknown_macro:
1327
+ return rb_id2sym(rb_intern("xattr_unknown_macro"));
1328
+
1329
+ case couchbase::protocol::status::subdoc_xattr_unknown_vattr:
1330
+ return rb_id2sym(rb_intern("xattr_unknown_vattr"));
1331
+
1332
+ case couchbase::protocol::status::subdoc_xattr_cannot_modify_vattr:
1333
+ return rb_id2sym(rb_intern("xattr_cannot_modify_vattr"));
1334
+
1335
+ default:
1336
+ return rb_id2sym(rb_intern("unknown"));
1337
+ }
1338
+ }
1339
+
1340
+ static VALUE
1341
+ cb_Backend_document_lookup_in(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE access_deleted, VALUE specs)
1342
+ {
1343
+ cb_backend_data* backend = nullptr;
1344
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1345
+
1346
+ if (!backend->cluster) {
1347
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1348
+ }
1349
+
1350
+ Check_Type(bucket, T_STRING);
1351
+ Check_Type(collection, T_STRING);
1352
+ Check_Type(id, T_STRING);
1353
+ Check_Type(specs, T_ARRAY);
1354
+ if (RARRAY_LEN(specs) <= 0) {
1355
+ rb_raise(rb_eArgError, "Array with specs cannot be empty");
1356
+ }
1357
+
1358
+ couchbase::document_id doc_id;
1359
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
1360
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
1361
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
1362
+
1363
+ couchbase::operations::lookup_in_request req{ doc_id };
1364
+ req.access_deleted = RTEST(access_deleted);
1365
+ auto entries_size = static_cast<size_t>(RARRAY_LEN(specs));
1366
+ req.specs.entries.reserve(entries_size);
1367
+ for (size_t i = 0; i < entries_size; ++i) {
1368
+ VALUE entry = rb_ary_entry(specs, static_cast<long>(i));
1369
+ Check_Type(entry, T_HASH);
1370
+ VALUE operation = rb_hash_aref(entry, rb_id2sym(rb_intern("opcode")));
1371
+ Check_Type(operation, T_SYMBOL);
1372
+ ID operation_id = rb_sym2id(operation);
1373
+ couchbase::protocol::subdoc_opcode opcode;
1374
+ if (operation_id == rb_intern("get") || operation_id == rb_intern("get_doc")) {
1375
+ opcode = couchbase::protocol::subdoc_opcode::get;
1376
+ } else if (operation_id == rb_intern("exists")) {
1377
+ opcode = couchbase::protocol::subdoc_opcode::exists;
1378
+ } else if (operation_id == rb_intern("count")) {
1379
+ opcode = couchbase::protocol::subdoc_opcode::get_count;
1380
+ } else {
1381
+ rb_raise(rb_eArgError, "Unsupported operation for subdocument lookup");
1382
+ }
1383
+ bool xattr = RTEST(rb_hash_aref(entry, rb_id2sym(rb_intern("xattr"))));
1384
+ VALUE path = rb_hash_aref(entry, rb_id2sym(rb_intern("path")));
1385
+ Check_Type(path, T_STRING);
1386
+ req.specs.add_spec(opcode, xattr, std::string(RSTRING_PTR(path), static_cast<size_t>(RSTRING_LEN(path))));
1387
+ }
1388
+
1389
+ auto barrier = std::make_shared<std::promise<couchbase::operations::lookup_in_response>>();
1390
+ auto f = barrier->get_future();
1391
+ backend->cluster->execute(req, [barrier](couchbase::operations::lookup_in_response resp) mutable { barrier->set_value(resp); });
1392
+ auto resp = f.get();
1393
+ if (resp.ec) {
1394
+ cb_raise_error_code(resp.ec, fmt::format("unable fetch {}", doc_id));
1395
+ }
1396
+
1397
+ VALUE res = rb_hash_new();
1398
+ rb_hash_aset(res, rb_id2sym(rb_intern("cas")), ULL2NUM(resp.cas));
1399
+ VALUE fields = rb_ary_new_capa(static_cast<long>(resp.fields.size()));
1400
+ rb_hash_aset(res, rb_id2sym(rb_intern("fields")), fields);
1401
+ for (size_t i = 0; i < resp.fields.size(); ++i) {
1402
+ VALUE entry = rb_hash_new();
1403
+ rb_hash_aset(entry, rb_id2sym(rb_intern("exists")), resp.fields[i].exists ? Qtrue : Qfalse);
1404
+ rb_hash_aset(
1405
+ entry, rb_id2sym(rb_intern("path")), rb_str_new(resp.fields[i].path.data(), static_cast<long>(resp.fields[i].path.size())));
1406
+ rb_hash_aset(
1407
+ entry, rb_id2sym(rb_intern("value")), rb_str_new(resp.fields[i].value.data(), static_cast<long>(resp.fields[i].value.size())));
1408
+ rb_hash_aset(entry, rb_id2sym(rb_intern("status")), cb__map_subdoc_status(resp.fields[i].status));
1409
+ if (resp.fields[i].opcode == couchbase::protocol::subdoc_opcode::get && resp.fields[i].path.empty()) {
1410
+ rb_hash_aset(entry, rb_id2sym(rb_intern("type")), rb_id2sym(rb_intern("get_doc")));
1411
+ } else {
1412
+ rb_hash_aset(entry, rb_id2sym(rb_intern("type")), cb__map_subdoc_opcode(resp.fields[i].opcode));
1413
+ }
1414
+ rb_ary_store(fields, static_cast<long>(i), entry);
1415
+ }
1416
+ return res;
1417
+ }
1418
+
1419
+ static VALUE
1420
+ cb_Backend_document_mutate_in(VALUE self, VALUE bucket, VALUE collection, VALUE id, VALUE access_deleted, VALUE specs, VALUE options)
1421
+ {
1422
+ cb_backend_data* backend = nullptr;
1423
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1424
+
1425
+ if (!backend->cluster) {
1426
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1427
+ }
1428
+
1429
+ Check_Type(bucket, T_STRING);
1430
+ Check_Type(collection, T_STRING);
1431
+ Check_Type(id, T_STRING);
1432
+ Check_Type(specs, T_ARRAY);
1433
+ if (RARRAY_LEN(specs) <= 0) {
1434
+ rb_raise(rb_eArgError, "Array with specs cannot be empty");
1435
+ }
1436
+
1437
+ couchbase::document_id doc_id;
1438
+ doc_id.bucket.assign(RSTRING_PTR(bucket), static_cast<size_t>(RSTRING_LEN(bucket)));
1439
+ doc_id.collection.assign(RSTRING_PTR(collection), static_cast<size_t>(RSTRING_LEN(collection)));
1440
+ doc_id.key.assign(RSTRING_PTR(id), static_cast<size_t>(RSTRING_LEN(id)));
1441
+
1442
+ couchbase::operations::mutate_in_request req{ doc_id };
1443
+ if (!NIL_P(options)) {
1444
+ Check_Type(options, T_HASH);
1445
+ VALUE durability_level = rb_hash_aref(options, rb_id2sym(rb_intern("durability_level")));
1446
+ if (!NIL_P(durability_level)) {
1447
+ Check_Type(durability_level, T_SYMBOL);
1448
+ ID level = rb_sym2id(durability_level);
1449
+ if (level == rb_intern("none")) {
1450
+ req.durability_level = couchbase::protocol::durability_level::none;
1451
+ } else if (level == rb_intern("majority_and_persist_to_active")) {
1452
+ req.durability_level = couchbase::protocol::durability_level::majority_and_persist_to_active;
1453
+ } else if (level == rb_intern("persist_to_majority")) {
1454
+ req.durability_level = couchbase::protocol::durability_level::persist_to_majority;
1455
+ } else {
1456
+ rb_raise(rb_eArgError, "Unknown durability level");
1457
+ }
1458
+ VALUE durability_timeout = rb_hash_aref(options, rb_id2sym(rb_intern("durability_timeout")));
1459
+ if (!NIL_P(durability_timeout)) {
1460
+ Check_Type(durability_timeout, T_FIXNUM);
1461
+ req.durability_timeout = FIX2UINT(durability_timeout);
1462
+ }
1463
+ }
1464
+ }
1465
+ req.access_deleted = RTEST(access_deleted);
1466
+ auto entries_size = static_cast<size_t>(RARRAY_LEN(specs));
1467
+ req.specs.entries.reserve(entries_size);
1468
+ for (size_t i = 0; i < entries_size; ++i) {
1469
+ VALUE entry = rb_ary_entry(specs, static_cast<long>(i));
1470
+ Check_Type(entry, T_HASH);
1471
+ VALUE operation = rb_hash_aref(entry, rb_id2sym(rb_intern("opcode")));
1472
+ Check_Type(operation, T_SYMBOL);
1473
+ ID operation_id = rb_sym2id(operation);
1474
+ couchbase::protocol::subdoc_opcode opcode;
1475
+ if (operation_id == rb_intern("dict_add")) {
1476
+ opcode = couchbase::protocol::subdoc_opcode::dict_add;
1477
+ } else if (operation_id == rb_intern("dict_upsert")) {
1478
+ opcode = couchbase::protocol::subdoc_opcode::dict_upsert;
1479
+ } else if (operation_id == rb_intern("remove")) {
1480
+ opcode = couchbase::protocol::subdoc_opcode::remove;
1481
+ } else if (operation_id == rb_intern("replace")) {
1482
+ opcode = couchbase::protocol::subdoc_opcode::replace;
1483
+ } else if (operation_id == rb_intern("array_push_last")) {
1484
+ opcode = couchbase::protocol::subdoc_opcode::array_push_last;
1485
+ } else if (operation_id == rb_intern("array_push_first")) {
1486
+ opcode = couchbase::protocol::subdoc_opcode::array_push_first;
1487
+ } else if (operation_id == rb_intern("array_insert")) {
1488
+ opcode = couchbase::protocol::subdoc_opcode::array_insert;
1489
+ } else if (operation_id == rb_intern("array_add_unique")) {
1490
+ opcode = couchbase::protocol::subdoc_opcode::array_add_unique;
1491
+ } else if (operation_id == rb_intern("counter")) {
1492
+ opcode = couchbase::protocol::subdoc_opcode::counter;
1493
+ } else {
1494
+ rb_raise(rb_eArgError, "Unsupported operation for subdocument mutation: %+" PRIsVALUE, operation);
1495
+ }
1496
+ bool xattr = RTEST(rb_hash_aref(entry, rb_id2sym(rb_intern("xattr"))));
1497
+ bool create_parents = RTEST(rb_hash_aref(entry, rb_id2sym(rb_intern("create_parents"))));
1498
+ bool expand_macros = RTEST(rb_hash_aref(entry, rb_id2sym(rb_intern("expand_macros"))));
1499
+ VALUE path = rb_hash_aref(entry, rb_id2sym(rb_intern("path")));
1500
+ Check_Type(path, T_STRING);
1501
+ VALUE param = rb_hash_aref(entry, rb_id2sym(rb_intern("param")));
1502
+ if (NIL_P(param)) {
1503
+ req.specs.add_spec(opcode, xattr, std::string(RSTRING_PTR(path), static_cast<size_t>(RSTRING_LEN(path))));
1504
+ } else if (opcode == couchbase::protocol::subdoc_opcode::counter) {
1505
+ Check_Type(param, T_FIXNUM);
1506
+ req.specs.add_spec(opcode,
1507
+ xattr,
1508
+ create_parents,
1509
+ expand_macros,
1510
+ std::string(RSTRING_PTR(path), static_cast<size_t>(RSTRING_LEN(path))),
1511
+ FIX2LONG(param));
1512
+ } else {
1513
+ Check_Type(param, T_STRING);
1514
+ req.specs.add_spec(opcode,
1515
+ xattr,
1516
+ create_parents,
1517
+ expand_macros,
1518
+ std::string(RSTRING_PTR(path), static_cast<size_t>(RSTRING_LEN(path))),
1519
+ std::string(RSTRING_PTR(param), static_cast<size_t>(RSTRING_LEN(param))));
1520
+ }
1521
+ }
1522
+
1523
+ auto barrier = std::make_shared<std::promise<couchbase::operations::mutate_in_response>>();
1524
+ auto f = barrier->get_future();
1525
+ backend->cluster->execute(req, [barrier](couchbase::operations::mutate_in_response resp) mutable { barrier->set_value(resp); });
1526
+ auto resp = f.get();
1527
+ if (resp.ec) {
1528
+ cb_raise_error_code(resp.ec, fmt::format("unable to mutate {}", doc_id));
1529
+ }
1530
+
1531
+ VALUE res = cb__extract_mutation_result(resp);
1532
+ if (resp.first_error_index) {
1533
+ rb_hash_aset(res, rb_id2sym(rb_intern("first_error_index")), ULONG2NUM(resp.first_error_index.value()));
1534
+ }
1535
+ VALUE fields = rb_ary_new_capa(static_cast<long>(resp.fields.size()));
1536
+ rb_hash_aset(res, rb_id2sym(rb_intern("fields")), fields);
1537
+ for (size_t i = 0; i < resp.fields.size(); ++i) {
1538
+ VALUE entry = rb_hash_new();
1539
+ rb_hash_aset(
1540
+ entry, rb_id2sym(rb_intern("path")), rb_str_new(resp.fields[i].path.data(), static_cast<long>(resp.fields[i].path.size())));
1541
+ if (resp.fields[i].opcode == couchbase::protocol::subdoc_opcode::counter) {
1542
+ rb_hash_aset(entry, rb_id2sym(rb_intern("value")), LONG2NUM(std::stoll(resp.fields[i].value)));
1543
+ } else {
1544
+ rb_hash_aset(entry,
1545
+ rb_id2sym(rb_intern("value")),
1546
+ rb_str_new(resp.fields[i].value.data(), static_cast<long>(resp.fields[i].value.size())));
1547
+ }
1548
+ rb_hash_aset(entry, rb_id2sym(rb_intern("status")), cb__map_subdoc_status(resp.fields[i].status));
1549
+ rb_hash_aset(entry, rb_id2sym(rb_intern("type")), cb__map_subdoc_opcode(resp.fields[i].opcode));
1550
+ rb_ary_store(fields, static_cast<long>(i), entry);
1551
+ }
1552
+ return res;
1553
+ }
1554
+
1555
+ static int
1556
+ cb__for_each_named_param(VALUE key, VALUE value, VALUE arg)
1557
+ {
1558
+ auto* preq = reinterpret_cast<couchbase::operations::query_request*>(arg);
1559
+ Check_Type(key, T_STRING);
1560
+ Check_Type(value, T_STRING);
1561
+ preq->named_parameters.emplace(
1562
+ std::string_view(RSTRING_PTR(key), static_cast<std::size_t>(RSTRING_LEN(key))),
1563
+ tao::json::from_string(std::string_view(RSTRING_PTR(value), static_cast<std::size_t>(RSTRING_LEN(value)))));
1564
+ return ST_CONTINUE;
1565
+ }
1566
+
1567
+ static VALUE
1568
+ cb_Backend_document_query(VALUE self, VALUE statement, VALUE options)
1569
+ {
1570
+ cb_backend_data* backend = nullptr;
1571
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1572
+
1573
+ if (!backend->cluster) {
1574
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1575
+ }
1576
+
1577
+ Check_Type(statement, T_STRING);
1578
+ Check_Type(options, T_HASH);
1579
+
1580
+ couchbase::operations::query_request req;
1581
+ req.statement.assign(RSTRING_PTR(statement), static_cast<size_t>(RSTRING_LEN(statement)));
1582
+ VALUE client_context_id = rb_hash_aref(options, rb_id2sym(rb_intern("client_context_id")));
1583
+ if (!NIL_P(client_context_id)) {
1584
+ Check_Type(client_context_id, T_STRING);
1585
+ req.client_context_id.assign(RSTRING_PTR(client_context_id), static_cast<size_t>(RSTRING_LEN(client_context_id)));
1586
+ }
1587
+ VALUE timeout = rb_hash_aref(options, rb_id2sym(rb_intern("timeout")));
1588
+ if (!NIL_P(timeout)) {
1589
+ switch (TYPE(timeout)) {
1590
+ case T_FIXNUM:
1591
+ case T_BIGNUM:
1592
+ break;
1593
+ default:
1594
+ rb_raise(rb_eArgError, "timeout must be an Integer");
1595
+ }
1596
+ req.timeout = NUM2ULL(timeout);
1597
+ }
1598
+ VALUE adhoc = rb_hash_aref(options, rb_id2sym(rb_intern("adhoc")));
1599
+ if (!NIL_P(adhoc)) {
1600
+ req.adhoc = RTEST(adhoc);
1601
+ }
1602
+ VALUE metrics = rb_hash_aref(options, rb_id2sym(rb_intern("metrics")));
1603
+ if (!NIL_P(metrics)) {
1604
+ req.metrics = RTEST(metrics);
1605
+ }
1606
+ VALUE readonly = rb_hash_aref(options, rb_id2sym(rb_intern("readonly")));
1607
+ if (!NIL_P(readonly)) {
1608
+ req.readonly = RTEST(readonly);
1609
+ }
1610
+ VALUE scan_cap = rb_hash_aref(options, rb_id2sym(rb_intern("scan_cap")));
1611
+ if (!NIL_P(scan_cap)) {
1612
+ req.scan_cap = NUM2ULONG(scan_cap);
1613
+ }
1614
+ VALUE scan_wait = rb_hash_aref(options, rb_id2sym(rb_intern("scan_wait")));
1615
+ if (!NIL_P(scan_wait)) {
1616
+ req.scan_wait = NUM2ULONG(scan_wait);
1617
+ }
1618
+ VALUE max_parallelism = rb_hash_aref(options, rb_id2sym(rb_intern("max_parallelism")));
1619
+ if (!NIL_P(max_parallelism)) {
1620
+ req.max_parallelism = NUM2ULONG(max_parallelism);
1621
+ }
1622
+ VALUE pipeline_cap = rb_hash_aref(options, rb_id2sym(rb_intern("pipeline_cap")));
1623
+ if (!NIL_P(pipeline_cap)) {
1624
+ req.pipeline_cap = NUM2ULONG(pipeline_cap);
1625
+ }
1626
+ VALUE pipeline_batch = rb_hash_aref(options, rb_id2sym(rb_intern("pipeline_batch")));
1627
+ if (!NIL_P(pipeline_batch)) {
1628
+ req.pipeline_batch = NUM2ULONG(pipeline_batch);
1629
+ }
1630
+ VALUE profile = rb_hash_aref(options, rb_id2sym(rb_intern("profile")));
1631
+ if (!NIL_P(profile)) {
1632
+ Check_Type(profile, T_SYMBOL);
1633
+ ID mode = rb_sym2id(profile);
1634
+ if (mode == rb_intern("phases")) {
1635
+ req.profile = couchbase::operations::query_request::profile_mode::phases;
1636
+ } else if (mode == rb_intern("timings")) {
1637
+ req.profile = couchbase::operations::query_request::profile_mode::timings;
1638
+ } else if (mode == rb_intern("off")) {
1639
+ req.profile = couchbase::operations::query_request::profile_mode::off;
1640
+ }
1641
+ }
1642
+ VALUE positional_params = rb_hash_aref(options, rb_id2sym(rb_intern("positional_parameters")));
1643
+ if (!NIL_P(positional_params)) {
1644
+ Check_Type(positional_params, T_ARRAY);
1645
+ auto entries_num = static_cast<size_t>(RARRAY_LEN(positional_params));
1646
+ req.positional_parameters.reserve(entries_num);
1647
+ for (size_t i = 0; i < entries_num; ++i) {
1648
+ VALUE entry = rb_ary_entry(positional_params, static_cast<long>(i));
1649
+ Check_Type(entry, T_STRING);
1650
+ req.positional_parameters.emplace_back(
1651
+ tao::json::from_string(std::string_view(RSTRING_PTR(entry), static_cast<std::size_t>(RSTRING_LEN(entry)))));
1652
+ }
1653
+ }
1654
+ VALUE named_params = rb_hash_aref(options, rb_id2sym(rb_intern("named_parameters")));
1655
+ if (!NIL_P(named_params)) {
1656
+ Check_Type(named_params, T_HASH);
1657
+ rb_hash_foreach(named_params, INT_FUNC(cb__for_each_named_param), reinterpret_cast<VALUE>(&req));
1658
+ }
1659
+ VALUE scan_consistency = rb_hash_aref(options, rb_id2sym(rb_intern("scan_consistency")));
1660
+ if (!NIL_P(scan_consistency)) {
1661
+ Check_Type(scan_consistency, T_SYMBOL);
1662
+ ID type = rb_sym2id(scan_consistency);
1663
+ if (type == rb_intern("not_bounded")) {
1664
+ req.scan_consistency = couchbase::operations::query_request::scan_consistency_type::not_bounded;
1665
+ } else if (type == rb_intern("request_plus")) {
1666
+ req.scan_consistency = couchbase::operations::query_request::scan_consistency_type::request_plus;
1667
+ }
1668
+ }
1669
+ VALUE mutation_state = rb_hash_aref(options, rb_id2sym(rb_intern("mutation_state")));
1670
+ if (!NIL_P(mutation_state)) {
1671
+ Check_Type(mutation_state, T_ARRAY);
1672
+ auto state_size = static_cast<size_t>(RARRAY_LEN(mutation_state));
1673
+ req.mutation_state.reserve(state_size);
1674
+ for (size_t i = 0; i < state_size; ++i) {
1675
+ VALUE token = rb_ary_entry(mutation_state, static_cast<long>(i));
1676
+ Check_Type(token, T_HASH);
1677
+ VALUE bucket_name = rb_hash_aref(token, rb_id2sym(rb_intern("bucket_name")));
1678
+ Check_Type(bucket_name, T_STRING);
1679
+ VALUE partition_id = rb_hash_aref(token, rb_id2sym(rb_intern("partition_id")));
1680
+ Check_Type(partition_id, T_FIXNUM);
1681
+ VALUE partition_uuid = rb_hash_aref(token, rb_id2sym(rb_intern("partition_uuid")));
1682
+ switch (TYPE(partition_uuid)) {
1683
+ case T_FIXNUM:
1684
+ case T_BIGNUM:
1685
+ break;
1686
+ default:
1687
+ rb_raise(rb_eArgError, "partition_uuid must be an Integer");
1688
+ }
1689
+ VALUE sequence_number = rb_hash_aref(token, rb_id2sym(rb_intern("sequence_number")));
1690
+ switch (TYPE(sequence_number)) {
1691
+ case T_FIXNUM:
1692
+ case T_BIGNUM:
1693
+ break;
1694
+ default:
1695
+ rb_raise(rb_eArgError, "sequence_number must be an Integer");
1696
+ }
1697
+ req.mutation_state.emplace_back(
1698
+ couchbase::mutation_token{ NUM2ULL(partition_uuid),
1699
+ NUM2ULL(sequence_number),
1700
+ gsl::narrow_cast<std::uint16_t>(NUM2UINT(partition_id)),
1701
+ std::string(RSTRING_PTR(bucket_name), static_cast<std::size_t>(RSTRING_LEN(bucket_name))) });
1702
+ }
1703
+ }
1704
+
1705
+ VALUE raw_params = rb_hash_aref(options, rb_id2sym(rb_intern("raw_parameters")));
1706
+ if (!NIL_P(raw_params)) {
1707
+ Check_Type(raw_params, T_HASH);
1708
+ rb_hash_foreach(raw_params, INT_FUNC(cb__for_each_named_param), reinterpret_cast<VALUE>(&req));
1709
+ }
1710
+
1711
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_response>>();
1712
+ auto f = barrier->get_future();
1713
+ backend->cluster->execute_http(req, [barrier](couchbase::operations::query_response resp) mutable { barrier->set_value(resp); });
1714
+ auto resp = f.get();
1715
+ if (resp.ec) {
1716
+ if (resp.payload.meta_data.errors && !resp.payload.meta_data.errors->empty()) {
1717
+ const auto& first_error = resp.payload.meta_data.errors->front();
1718
+ cb_raise_error_code(resp.ec,
1719
+ fmt::format("unable to query: \"{}{}\" ({}: {})",
1720
+ req.statement.substr(0, 50),
1721
+ req.statement.size() > 50 ? "..." : "",
1722
+ first_error.code,
1723
+ first_error.message));
1724
+ } else {
1725
+ cb_raise_error_code(
1726
+ resp.ec, fmt::format("unable to query: \"{}{}\"", req.statement.substr(0, 50), req.statement.size() > 50 ? "..." : ""));
1727
+ }
1728
+ }
1729
+ VALUE res = rb_hash_new();
1730
+ VALUE rows = rb_ary_new_capa(static_cast<long>(resp.payload.rows.size()));
1731
+ rb_hash_aset(res, rb_id2sym(rb_intern("rows")), rows);
1732
+ for (auto& row : resp.payload.rows) {
1733
+ rb_ary_push(rows, rb_str_new(row.data(), static_cast<long>(row.size())));
1734
+ }
1735
+ VALUE meta = rb_hash_new();
1736
+ rb_hash_aset(res, rb_id2sym(rb_intern("meta")), meta);
1737
+ rb_hash_aset(meta,
1738
+ rb_id2sym(rb_intern("status")),
1739
+ rb_id2sym(rb_intern2(resp.payload.meta_data.status.data(), static_cast<long>(resp.payload.meta_data.status.size()))));
1740
+ rb_hash_aset(meta,
1741
+ rb_id2sym(rb_intern("request_id")),
1742
+ rb_str_new(resp.payload.meta_data.request_id.data(), static_cast<long>(resp.payload.meta_data.request_id.size())));
1743
+ rb_hash_aset(
1744
+ meta,
1745
+ rb_id2sym(rb_intern("client_context_id")),
1746
+ rb_str_new(resp.payload.meta_data.client_context_id.data(), static_cast<long>(resp.payload.meta_data.client_context_id.size())));
1747
+ if (resp.payload.meta_data.signature) {
1748
+ rb_hash_aset(meta,
1749
+ rb_id2sym(rb_intern("signature")),
1750
+ rb_str_new(resp.payload.meta_data.signature->data(), static_cast<long>(resp.payload.meta_data.signature->size())));
1751
+ }
1752
+ if (resp.payload.meta_data.profile) {
1753
+ rb_hash_aset(meta,
1754
+ rb_id2sym(rb_intern("profile")),
1755
+ rb_str_new(resp.payload.meta_data.profile->data(), static_cast<long>(resp.payload.meta_data.profile->size())));
1756
+ }
1757
+ metrics = rb_hash_new();
1758
+ rb_hash_aset(meta, rb_id2sym(rb_intern("metrics")), metrics);
1759
+ rb_hash_aset(metrics,
1760
+ rb_id2sym(rb_intern("elapsed_time")),
1761
+ rb_str_new(resp.payload.meta_data.metrics.elapsed_time.data(),
1762
+ static_cast<long>(resp.payload.meta_data.metrics.elapsed_time.size())));
1763
+ rb_hash_aset(metrics,
1764
+ rb_id2sym(rb_intern("execution_time")),
1765
+ rb_str_new(resp.payload.meta_data.metrics.execution_time.data(),
1766
+ static_cast<long>(resp.payload.meta_data.metrics.execution_time.size())));
1767
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("result_count")), ULL2NUM(resp.payload.meta_data.metrics.result_count));
1768
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("result_size")), ULL2NUM(resp.payload.meta_data.metrics.result_count));
1769
+ if (resp.payload.meta_data.metrics.sort_count) {
1770
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("sort_count")), ULL2NUM(*resp.payload.meta_data.metrics.sort_count));
1771
+ }
1772
+ if (resp.payload.meta_data.metrics.mutation_count) {
1773
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("mutation_count")), ULL2NUM(*resp.payload.meta_data.metrics.mutation_count));
1774
+ }
1775
+ if (resp.payload.meta_data.metrics.error_count) {
1776
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("error_count")), ULL2NUM(*resp.payload.meta_data.metrics.error_count));
1777
+ }
1778
+ if (resp.payload.meta_data.metrics.warning_count) {
1779
+ rb_hash_aset(metrics, rb_id2sym(rb_intern("warning_count")), ULL2NUM(*resp.payload.meta_data.metrics.warning_count));
1780
+ }
1781
+
1782
+ return res;
1783
+ }
1784
+
1785
+ static void
1786
+ cb__generate_bucket_settings(VALUE bucket, couchbase::operations::bucket_settings& entry, bool is_create)
1787
+ {
1788
+ {
1789
+ VALUE bucket_type = rb_hash_aref(bucket, rb_id2sym(rb_intern("bucket_type")));
1790
+ Check_Type(bucket_type, T_SYMBOL);
1791
+ if (bucket_type == rb_id2sym(rb_intern("couchbase")) || bucket_type == rb_id2sym(rb_intern("membase"))) {
1792
+ entry.bucket_type = couchbase::operations::bucket_settings::bucket_type::couchbase;
1793
+ } else if (bucket_type == rb_id2sym(rb_intern("memcached"))) {
1794
+ entry.bucket_type = couchbase::operations::bucket_settings::bucket_type::memcached;
1795
+ } else if (bucket_type == rb_id2sym(rb_intern("ephemeral"))) {
1796
+ entry.bucket_type = couchbase::operations::bucket_settings::bucket_type::ephemeral;
1797
+ } else {
1798
+ rb_raise(rb_eArgError, "unknown bucket type");
1799
+ }
1800
+ }
1801
+ {
1802
+ VALUE name = rb_hash_aref(bucket, rb_id2sym(rb_intern("name")));
1803
+ Check_Type(name, T_STRING);
1804
+ entry.name.assign(RSTRING_PTR(name), static_cast<size_t>(RSTRING_LEN(name)));
1805
+ }
1806
+ {
1807
+ VALUE quota = rb_hash_aref(bucket, rb_id2sym(rb_intern("ram_quota_mb")));
1808
+ Check_Type(quota, T_FIXNUM);
1809
+ entry.ram_quota_mb = FIX2ULONG(quota);
1810
+ }
1811
+ {
1812
+ VALUE expiry = rb_hash_aref(bucket, rb_id2sym(rb_intern("max_expiry")));
1813
+ if (!NIL_P(expiry)) {
1814
+ Check_Type(expiry, T_FIXNUM);
1815
+ entry.max_expiry = FIX2UINT(expiry);
1816
+ }
1817
+ }
1818
+ {
1819
+ VALUE num_replicas = rb_hash_aref(bucket, rb_id2sym(rb_intern("num_replicas")));
1820
+ if (!NIL_P(num_replicas)) {
1821
+ Check_Type(num_replicas, T_FIXNUM);
1822
+ entry.num_replicas = FIX2UINT(num_replicas);
1823
+ }
1824
+ }
1825
+ {
1826
+ VALUE replica_indexes = rb_hash_aref(bucket, rb_id2sym(rb_intern("replica_indexes")));
1827
+ if (!NIL_P(replica_indexes)) {
1828
+ entry.replica_indexes = RTEST(replica_indexes);
1829
+ }
1830
+ }
1831
+ {
1832
+ VALUE flush_enabled = rb_hash_aref(bucket, rb_id2sym(rb_intern("flush_enabled")));
1833
+ if (!NIL_P(flush_enabled)) {
1834
+ entry.flush_enabled = RTEST(flush_enabled);
1835
+ }
1836
+ }
1837
+ {
1838
+ VALUE compression_mode = rb_hash_aref(bucket, rb_id2sym(rb_intern("compression_mode")));
1839
+ if (!NIL_P(compression_mode)) {
1840
+ Check_Type(compression_mode, T_SYMBOL);
1841
+ if (compression_mode == rb_id2sym(rb_intern("active"))) {
1842
+ entry.compression_mode = couchbase::operations::bucket_settings::compression_mode::active;
1843
+ } else if (compression_mode == rb_id2sym(rb_intern("passive"))) {
1844
+ entry.compression_mode = couchbase::operations::bucket_settings::compression_mode::passive;
1845
+ } else if (compression_mode == rb_id2sym(rb_intern("off"))) {
1846
+ entry.compression_mode = couchbase::operations::bucket_settings::compression_mode::off;
1847
+ } else {
1848
+ rb_raise(rb_eArgError, "unknown compression mode");
1849
+ }
1850
+ }
1851
+ }
1852
+ {
1853
+ VALUE ejection_policy = rb_hash_aref(bucket, rb_id2sym(rb_intern("ejection_policy")));
1854
+ if (!NIL_P(ejection_policy)) {
1855
+ Check_Type(ejection_policy, T_SYMBOL);
1856
+ if (ejection_policy == rb_id2sym(rb_intern("full"))) {
1857
+ entry.ejection_policy = couchbase::operations::bucket_settings::ejection_policy::full;
1858
+ } else if (ejection_policy == rb_id2sym(rb_intern("value_only"))) {
1859
+ entry.ejection_policy = couchbase::operations::bucket_settings::ejection_policy::value_only;
1860
+ } else {
1861
+ rb_raise(rb_eArgError, "unknown ejection policy");
1862
+ }
1863
+ }
1864
+ }
1865
+ if (is_create) {
1866
+ VALUE conflict_resolution_type = rb_hash_aref(bucket, rb_id2sym(rb_intern("conflict_resolution_type")));
1867
+ if (!NIL_P(conflict_resolution_type)) {
1868
+ Check_Type(conflict_resolution_type, T_SYMBOL);
1869
+ if (conflict_resolution_type == rb_id2sym(rb_intern("timestamp"))) {
1870
+ entry.conflict_resolution_type = couchbase::operations::bucket_settings::conflict_resolution_type::timestamp;
1871
+ } else if (conflict_resolution_type == rb_id2sym(rb_intern("sequence_number"))) {
1872
+ entry.conflict_resolution_type = couchbase::operations::bucket_settings::conflict_resolution_type::sequence_number;
1873
+ } else {
1874
+ rb_raise(rb_eArgError, "unknown conflict resolution type");
1875
+ }
1876
+ }
1877
+ }
1878
+ }
1879
+
1880
+ static VALUE
1881
+ cb_Backend_bucket_create(VALUE self, VALUE bucket_settings)
1882
+ {
1883
+ cb_backend_data* backend = nullptr;
1884
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1885
+
1886
+ if (!backend->cluster) {
1887
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1888
+ }
1889
+
1890
+ Check_Type(bucket_settings, T_HASH);
1891
+ couchbase::operations::bucket_create_request req{};
1892
+ cb__generate_bucket_settings(bucket_settings, req.bucket, true);
1893
+ auto barrier = std::make_shared<std::promise<couchbase::operations::bucket_create_response>>();
1894
+ auto f = barrier->get_future();
1895
+ backend->cluster->execute_http(req,
1896
+ [barrier](couchbase::operations::bucket_create_response resp) mutable { barrier->set_value(resp); });
1897
+ auto resp = f.get();
1898
+ if (resp.ec) {
1899
+ cb_raise_error_code(resp.ec,
1900
+ fmt::format("unable to create bucket \"{}\" on the cluster ({})", req.bucket.name, resp.error_message));
1901
+ }
1902
+
1903
+ return Qtrue;
1904
+ }
1905
+
1906
+ static VALUE
1907
+ cb_Backend_bucket_update(VALUE self, VALUE bucket_settings)
1908
+ {
1909
+ cb_backend_data* backend = nullptr;
1910
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1911
+
1912
+ if (!backend->cluster) {
1913
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1914
+ }
1915
+
1916
+ Check_Type(bucket_settings, T_HASH);
1917
+ couchbase::operations::bucket_update_request req{};
1918
+ cb__generate_bucket_settings(bucket_settings, req.bucket, false);
1919
+ auto barrier = std::make_shared<std::promise<couchbase::operations::bucket_update_response>>();
1920
+ auto f = barrier->get_future();
1921
+ backend->cluster->execute_http(req,
1922
+ [barrier](couchbase::operations::bucket_update_response resp) mutable { barrier->set_value(resp); });
1923
+ auto resp = f.get();
1924
+ if (resp.ec) {
1925
+ cb_raise_error_code(resp.ec,
1926
+ fmt::format("unable to update bucket \"{}\" on the cluster ({})", req.bucket.name, resp.error_message));
1927
+ }
1928
+
1929
+ return Qtrue;
1930
+ }
1931
+
1932
+ static VALUE
1933
+ cb_Backend_bucket_drop(VALUE self, VALUE bucket_name)
1934
+ {
1935
+ cb_backend_data* backend = nullptr;
1936
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1937
+
1938
+ if (!backend->cluster) {
1939
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1940
+ }
1941
+
1942
+ Check_Type(bucket_name, T_STRING);
1943
+
1944
+ couchbase::operations::bucket_drop_request req{};
1945
+ req.name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
1946
+ auto barrier = std::make_shared<std::promise<couchbase::operations::bucket_drop_response>>();
1947
+ auto f = barrier->get_future();
1948
+ backend->cluster->execute_http(req, [barrier](couchbase::operations::bucket_drop_response resp) mutable { barrier->set_value(resp); });
1949
+ auto resp = f.get();
1950
+ if (resp.ec) {
1951
+ cb_raise_error_code(resp.ec, fmt::format("unable to remove bucket \"{}\" on the cluster", req.name));
1952
+ }
1953
+
1954
+ return Qtrue;
1955
+ }
1956
+
1957
+ static VALUE
1958
+ cb_Backend_bucket_flush(VALUE self, VALUE bucket_name)
1959
+ {
1960
+ cb_backend_data* backend = nullptr;
1961
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
1962
+
1963
+ if (!backend->cluster) {
1964
+ rb_raise(rb_eArgError, "Cluster has been closed already");
1965
+ }
1966
+
1967
+ Check_Type(bucket_name, T_STRING);
1968
+
1969
+ couchbase::operations::bucket_flush_request req{};
1970
+ req.name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
1971
+ auto barrier = std::make_shared<std::promise<couchbase::operations::bucket_flush_response>>();
1972
+ auto f = barrier->get_future();
1973
+ backend->cluster->execute_http(req, [barrier](couchbase::operations::bucket_flush_response resp) mutable { barrier->set_value(resp); });
1974
+ auto resp = f.get();
1975
+ if (resp.ec) {
1976
+ cb_raise_error_code(resp.ec, fmt::format("unable to remove bucket \"{}\" on the cluster", req.name));
1977
+ }
1978
+
1979
+ return Qtrue;
1980
+ }
1981
+
1982
+ static void
1983
+ cb__extract_bucket_settings(const couchbase::operations::bucket_settings& entry, VALUE bucket)
1984
+ {
1985
+ switch (entry.bucket_type) {
1986
+ case couchbase::operations::bucket_settings::bucket_type::couchbase:
1987
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("bucket_type")), rb_id2sym(rb_intern("couchbase")));
1988
+ break;
1989
+ case couchbase::operations::bucket_settings::bucket_type::memcached:
1990
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("bucket_type")), rb_id2sym(rb_intern("memcached")));
1991
+ break;
1992
+ case couchbase::operations::bucket_settings::bucket_type::ephemeral:
1993
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("bucket_type")), rb_id2sym(rb_intern("ephemeral")));
1994
+ break;
1995
+ case couchbase::operations::bucket_settings::bucket_type::unknown:
1996
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("bucket_type")), Qnil);
1997
+ break;
1998
+ }
1999
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("name")), rb_str_new(entry.name.data(), static_cast<long>(entry.name.size())));
2000
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("uuid")), rb_str_new(entry.uuid.data(), static_cast<long>(entry.uuid.size())));
2001
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("ram_quota_mb")), ULL2NUM(entry.ram_quota_mb));
2002
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("max_expiry")), ULONG2NUM(entry.max_expiry));
2003
+ switch (entry.compression_mode) {
2004
+ case couchbase::operations::bucket_settings::compression_mode::off:
2005
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("compression_mode")), rb_id2sym(rb_intern("off")));
2006
+ break;
2007
+ case couchbase::operations::bucket_settings::compression_mode::active:
2008
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("compression_mode")), rb_id2sym(rb_intern("active")));
2009
+ break;
2010
+ case couchbase::operations::bucket_settings::compression_mode::passive:
2011
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("compression_mode")), rb_id2sym(rb_intern("passive")));
2012
+ break;
2013
+ case couchbase::operations::bucket_settings::compression_mode::unknown:
2014
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("compression_mode")), Qnil);
2015
+ break;
2016
+ }
2017
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("num_replicas")), ULONG2NUM(entry.num_replicas));
2018
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("replica_indexes")), entry.replica_indexes ? Qtrue : Qfalse);
2019
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("flush_enabled")), entry.flush_enabled ? Qtrue : Qfalse);
2020
+ switch (entry.ejection_policy) {
2021
+ case couchbase::operations::bucket_settings::ejection_policy::full:
2022
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("ejection_policy")), rb_id2sym(rb_intern("full")));
2023
+ break;
2024
+ case couchbase::operations::bucket_settings::ejection_policy::value_only:
2025
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("ejection_policy")), rb_id2sym(rb_intern("value_only")));
2026
+ break;
2027
+ case couchbase::operations::bucket_settings::ejection_policy::unknown:
2028
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("ejection_policy")), Qnil);
2029
+ break;
2030
+ }
2031
+ switch (entry.conflict_resolution_type) {
2032
+ case couchbase::operations::bucket_settings::conflict_resolution_type::timestamp:
2033
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("conflict_resolution_type")), rb_id2sym(rb_intern("timestamp")));
2034
+ break;
2035
+ case couchbase::operations::bucket_settings::conflict_resolution_type::sequence_number:
2036
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("conflict_resolution_type")), rb_id2sym(rb_intern("sequence_number")));
2037
+ break;
2038
+ case couchbase::operations::bucket_settings::conflict_resolution_type::unknown:
2039
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("conflict_resolution_type")), Qnil);
2040
+ break;
2041
+ }
2042
+ VALUE capabilities = rb_ary_new_capa(static_cast<long>(entry.capabilities.size()));
2043
+ for (const auto& capa : entry.capabilities) {
2044
+ rb_ary_push(capabilities, rb_str_new(capa.data(), static_cast<long>(capa.size())));
2045
+ }
2046
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("capabilities")), capabilities);
2047
+ VALUE nodes = rb_ary_new_capa(static_cast<long>(entry.nodes.size()));
2048
+ for (const auto& n : entry.nodes) {
2049
+ VALUE node = rb_hash_new();
2050
+ rb_hash_aset(node, rb_id2sym(rb_intern("status")), rb_str_new(n.status.data(), static_cast<long>(n.status.size())));
2051
+ rb_hash_aset(node, rb_id2sym(rb_intern("hostname")), rb_str_new(n.hostname.data(), static_cast<long>(n.hostname.size())));
2052
+ rb_hash_aset(node, rb_id2sym(rb_intern("version")), rb_str_new(n.version.data(), static_cast<long>(n.version.size())));
2053
+ rb_ary_push(nodes, node);
2054
+ }
2055
+ rb_hash_aset(bucket, rb_id2sym(rb_intern("nodes")), nodes);
2056
+ }
2057
+
2058
+ static VALUE
2059
+ cb_Backend_bucket_get_all(VALUE self)
2060
+ {
2061
+ cb_backend_data* backend = nullptr;
2062
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2063
+
2064
+ if (!backend->cluster) {
2065
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2066
+ }
2067
+
2068
+ couchbase::operations::bucket_get_all_request req{};
2069
+ auto barrier = std::make_shared<std::promise<couchbase::operations::bucket_get_all_response>>();
2070
+ auto f = barrier->get_future();
2071
+ backend->cluster->execute_http(req,
2072
+ [barrier](couchbase::operations::bucket_get_all_response resp) mutable { barrier->set_value(resp); });
2073
+ auto resp = f.get();
2074
+ if (resp.ec) {
2075
+ cb_raise_error_code(resp.ec, "unable to get list of the buckets of the cluster");
2076
+ }
2077
+
2078
+ VALUE res = rb_ary_new_capa(static_cast<long>(resp.buckets.size()));
2079
+ for (const auto& entry : resp.buckets) {
2080
+ VALUE bucket = rb_hash_new();
2081
+ cb__extract_bucket_settings(entry, bucket);
2082
+ rb_ary_push(res, bucket);
2083
+ }
2084
+
2085
+ return res;
2086
+ }
2087
+
2088
+ static VALUE
2089
+ cb_Backend_bucket_get(VALUE self, VALUE bucket_name)
2090
+ {
2091
+ cb_backend_data* backend = nullptr;
2092
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2093
+
2094
+ if (!backend->cluster) {
2095
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2096
+ }
2097
+
2098
+ Check_Type(bucket_name, T_STRING);
2099
+
2100
+ couchbase::operations::bucket_get_request req{};
2101
+ req.name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2102
+ auto barrier = std::make_shared<std::promise<couchbase::operations::bucket_get_response>>();
2103
+ auto f = barrier->get_future();
2104
+ backend->cluster->execute_http(req, [barrier](couchbase::operations::bucket_get_response resp) mutable { barrier->set_value(resp); });
2105
+ auto resp = f.get();
2106
+ if (resp.ec) {
2107
+ cb_raise_error_code(resp.ec, fmt::format("unable to locate bucket \"{}\" on the cluster", req.name));
2108
+ }
2109
+
2110
+ VALUE res = rb_hash_new();
2111
+ cb__extract_bucket_settings(resp.bucket, res);
2112
+
2113
+ return res;
2114
+ }
2115
+
2116
+ static VALUE
2117
+ cb_Backend_cluster_enable_developer_preview(VALUE self)
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
+ couchbase::operations::cluster_developer_preview_enable_request req{};
2127
+ auto barrier = std::make_shared<std::promise<couchbase::operations::cluster_developer_preview_enable_response>>();
2128
+ auto f = barrier->get_future();
2129
+ backend->cluster->execute_http(
2130
+ req, [barrier](couchbase::operations::cluster_developer_preview_enable_response resp) mutable { barrier->set_value(resp); });
2131
+ auto resp = f.get();
2132
+ if (resp.ec) {
2133
+ cb_raise_error_code(resp.ec, fmt::format("unable to enable developer preview for this cluster"));
2134
+ }
2135
+ spdlog::critical("Developer preview cannot be disabled once it is enabled. If you enter developer preview mode you will not be able to "
2136
+ "upgrade. DO NOT USE IN PRODUCTION.");
2137
+ return Qtrue;
2138
+ }
2139
+
2140
+ static VALUE
2141
+ cb_Backend_scope_get_all(VALUE self, VALUE bucket_name)
2142
+ {
2143
+ cb_backend_data* backend = nullptr;
2144
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2145
+
2146
+ if (!backend->cluster) {
2147
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2148
+ }
2149
+
2150
+ Check_Type(bucket_name, T_STRING);
2151
+
2152
+ couchbase::operations::scope_get_all_request req{};
2153
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2154
+ auto barrier = std::make_shared<std::promise<couchbase::operations::scope_get_all_response>>();
2155
+ auto f = barrier->get_future();
2156
+ backend->cluster->execute_http(req,
2157
+ [barrier](couchbase::operations::scope_get_all_response resp) mutable { barrier->set_value(resp); });
2158
+ auto resp = f.get();
2159
+ if (resp.ec) {
2160
+ cb_raise_error_code(resp.ec, fmt::format("unable to get list of the scopes of the bucket \"{}\"", req.bucket_name));
2161
+ }
2162
+
2163
+ VALUE res = rb_hash_new();
2164
+ rb_hash_aset(res, rb_id2sym(rb_intern("uid")), ULL2NUM(resp.manifest.uid));
2165
+ VALUE scopes = rb_ary_new_capa(static_cast<long>(resp.manifest.scopes.size()));
2166
+ for (const auto& s : resp.manifest.scopes) {
2167
+ VALUE scope = rb_hash_new();
2168
+ rb_hash_aset(scope, rb_id2sym(rb_intern("uid")), ULL2NUM(s.uid));
2169
+ rb_hash_aset(scope, rb_id2sym(rb_intern("name")), rb_str_new(s.name.data(), static_cast<long>(s.name.size())));
2170
+ VALUE collections = rb_ary_new_capa(static_cast<long>(s.collections.size()));
2171
+ for (const auto& c : s.collections) {
2172
+ VALUE collection = rb_hash_new();
2173
+ rb_hash_aset(collection, rb_id2sym(rb_intern("uid")), ULL2NUM(c.uid));
2174
+ rb_hash_aset(collection, rb_id2sym(rb_intern("name")), rb_str_new(c.name.data(), static_cast<long>(c.name.size())));
2175
+ rb_ary_push(collections, collection);
2176
+ }
2177
+ rb_hash_aset(scope, rb_id2sym(rb_intern("collections")), collections);
2178
+ rb_ary_push(scopes, scope);
2179
+ }
2180
+ rb_hash_aset(res, rb_id2sym(rb_intern("scopes")), scopes);
2181
+
2182
+ return res;
2183
+ }
2184
+
2185
+ static VALUE
2186
+ cb_Backend_scope_create(VALUE self, VALUE bucket_name, VALUE scope_name)
2187
+ {
2188
+ cb_backend_data* backend = nullptr;
2189
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2190
+
2191
+ if (!backend->cluster) {
2192
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2193
+ }
2194
+
2195
+ Check_Type(bucket_name, T_STRING);
2196
+ Check_Type(scope_name, T_STRING);
2197
+
2198
+ couchbase::operations::scope_create_request req{};
2199
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2200
+ req.scope_name.assign(RSTRING_PTR(scope_name), static_cast<size_t>(RSTRING_LEN(scope_name)));
2201
+ auto barrier = std::make_shared<std::promise<couchbase::operations::scope_create_response>>();
2202
+ auto f = barrier->get_future();
2203
+ backend->cluster->execute_http(req, [barrier](couchbase::operations::scope_create_response resp) mutable { barrier->set_value(resp); });
2204
+ auto resp = f.get();
2205
+ if (resp.ec) {
2206
+ cb_raise_error_code(resp.ec, fmt::format("unable to create the scope on the bucket \"{}\"", req.bucket_name));
2207
+ }
2208
+ return ULL2NUM(resp.uid);
2209
+ }
2210
+
2211
+ static VALUE
2212
+ cb_Backend_scope_drop(VALUE self, VALUE bucket_name, VALUE scope_name)
2213
+ {
2214
+ cb_backend_data* backend = nullptr;
2215
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2216
+
2217
+ if (!backend->cluster) {
2218
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2219
+ }
2220
+
2221
+ Check_Type(bucket_name, T_STRING);
2222
+ Check_Type(scope_name, T_STRING);
2223
+
2224
+ couchbase::operations::scope_drop_request req{};
2225
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2226
+ req.scope_name.assign(RSTRING_PTR(scope_name), static_cast<size_t>(RSTRING_LEN(scope_name)));
2227
+ auto barrier = std::make_shared<std::promise<couchbase::operations::scope_drop_response>>();
2228
+ auto f = barrier->get_future();
2229
+ backend->cluster->execute_http(req, [barrier](couchbase::operations::scope_drop_response resp) mutable { barrier->set_value(resp); });
2230
+ auto resp = f.get();
2231
+ if (resp.ec) {
2232
+ cb_raise_error_code(resp.ec, fmt::format("unable to drop the scope \"{}\" on the bucket \"{}\"", req.scope_name, req.bucket_name));
2233
+ }
2234
+ return ULL2NUM(resp.uid);
2235
+ }
2236
+
2237
+ static VALUE
2238
+ cb_Backend_collection_create(VALUE self, VALUE bucket_name, VALUE scope_name, VALUE collection_name, VALUE max_expiry)
2239
+ {
2240
+ cb_backend_data* backend = nullptr;
2241
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2242
+
2243
+ if (!backend->cluster) {
2244
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2245
+ }
2246
+
2247
+ Check_Type(bucket_name, T_STRING);
2248
+ Check_Type(scope_name, T_STRING);
2249
+ Check_Type(collection_name, T_STRING);
2250
+
2251
+ couchbase::operations::collection_create_request req{};
2252
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2253
+ req.scope_name.assign(RSTRING_PTR(scope_name), static_cast<size_t>(RSTRING_LEN(scope_name)));
2254
+ req.collection_name.assign(RSTRING_PTR(collection_name), static_cast<size_t>(RSTRING_LEN(collection_name)));
2255
+
2256
+ if (!NIL_P(max_expiry)) {
2257
+ Check_Type(max_expiry, T_FIXNUM);
2258
+ req.max_expiry = FIX2UINT(max_expiry);
2259
+ }
2260
+ auto barrier = std::make_shared<std::promise<couchbase::operations::collection_create_response>>();
2261
+ auto f = barrier->get_future();
2262
+ backend->cluster->execute_http(req,
2263
+ [barrier](couchbase::operations::collection_create_response resp) mutable { barrier->set_value(resp); });
2264
+ auto resp = f.get();
2265
+ if (resp.ec) {
2266
+ cb_raise_error_code(resp.ec, fmt::format("unable to create the collection on the bucket \"{}\"", req.bucket_name));
2267
+ }
2268
+ return ULL2NUM(resp.uid);
2269
+ }
2270
+
2271
+ static VALUE
2272
+ cb_Backend_collection_drop(VALUE self, VALUE bucket_name, VALUE scope_name, VALUE collection_name)
2273
+ {
2274
+ cb_backend_data* backend = nullptr;
2275
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2276
+
2277
+ if (!backend->cluster) {
2278
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2279
+ }
2280
+
2281
+ Check_Type(bucket_name, T_STRING);
2282
+ Check_Type(scope_name, T_STRING);
2283
+ Check_Type(collection_name, T_STRING);
2284
+
2285
+ couchbase::operations::collection_drop_request req{};
2286
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2287
+ req.scope_name.assign(RSTRING_PTR(scope_name), static_cast<size_t>(RSTRING_LEN(scope_name)));
2288
+ req.collection_name.assign(RSTRING_PTR(collection_name), static_cast<size_t>(RSTRING_LEN(collection_name)));
2289
+
2290
+ auto barrier = std::make_shared<std::promise<couchbase::operations::collection_drop_response>>();
2291
+ auto f = barrier->get_future();
2292
+ backend->cluster->execute_http(req,
2293
+ [barrier](couchbase::operations::collection_drop_response resp) mutable { barrier->set_value(resp); });
2294
+ auto resp = f.get();
2295
+ if (resp.ec) {
2296
+ cb_raise_error_code(
2297
+ resp.ec,
2298
+ fmt::format(
2299
+ R"(unable to drop the collection "{}.{}" on the bucket "{}")", req.scope_name, req.collection_name, req.bucket_name));
2300
+ }
2301
+ return ULL2NUM(resp.uid);
2302
+ }
2303
+
2304
+ static VALUE
2305
+ cb_Backend_query_index_get_all(VALUE self, VALUE bucket_name)
2306
+ {
2307
+ cb_backend_data* backend = nullptr;
2308
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2309
+
2310
+ if (!backend->cluster) {
2311
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2312
+ }
2313
+
2314
+ Check_Type(bucket_name, T_STRING);
2315
+
2316
+ couchbase::operations::query_index_get_all_request req{};
2317
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2318
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_index_get_all_response>>();
2319
+ auto f = barrier->get_future();
2320
+ backend->cluster->execute_http(
2321
+ req, [barrier](couchbase::operations::query_index_get_all_response resp) mutable { barrier->set_value(resp); });
2322
+ auto resp = f.get();
2323
+ if (resp.ec) {
2324
+ cb_raise_error_code(resp.ec, fmt::format("unable to get list of the indexes of the bucket \"{}\"", req.bucket_name));
2325
+ }
2326
+
2327
+ VALUE res = rb_hash_new();
2328
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
2329
+ VALUE indexes = rb_ary_new_capa(static_cast<long>(resp.indexes.size()));
2330
+ for (const auto& idx : resp.indexes) {
2331
+ VALUE index = rb_hash_new();
2332
+ rb_hash_aset(index, rb_id2sym(rb_intern("id")), rb_str_new(idx.id.data(), static_cast<long>(idx.id.size())));
2333
+ rb_hash_aset(index, rb_id2sym(rb_intern("state")), rb_str_new(idx.state.data(), static_cast<long>(idx.state.size())));
2334
+ rb_hash_aset(index, rb_id2sym(rb_intern("name")), rb_str_new(idx.name.data(), static_cast<long>(idx.name.size())));
2335
+ rb_hash_aset(
2336
+ index, rb_id2sym(rb_intern("datastore_id")), rb_str_new(idx.datastore_id.data(), static_cast<long>(idx.datastore_id.size())));
2337
+ rb_hash_aset(
2338
+ index, rb_id2sym(rb_intern("keyspace_id")), rb_str_new(idx.keyspace_id.data(), static_cast<long>(idx.keyspace_id.size())));
2339
+ rb_hash_aset(
2340
+ index, rb_id2sym(rb_intern("namespace_id")), rb_str_new(idx.namespace_id.data(), static_cast<long>(idx.namespace_id.size())));
2341
+ rb_hash_aset(index, rb_id2sym(rb_intern("type")), rb_str_new(idx.type.data(), static_cast<long>(idx.type.size())));
2342
+ rb_hash_aset(index, rb_id2sym(rb_intern("is_primary")), idx.is_primary ? Qtrue : Qfalse);
2343
+ VALUE index_key = rb_ary_new_capa(static_cast<long>(idx.index_key.size()));
2344
+ for (const auto& key : idx.index_key) {
2345
+ rb_ary_push(index_key, rb_str_new(key.data(), static_cast<long>(key.size())));
2346
+ }
2347
+ rb_hash_aset(index, rb_id2sym(rb_intern("index_key")), index_key);
2348
+ if (idx.condition) {
2349
+ rb_hash_aset(
2350
+ index, rb_id2sym(rb_intern("condition")), rb_str_new(idx.condition->data(), static_cast<long>(idx.condition->size())));
2351
+ }
2352
+ rb_ary_push(indexes, index);
2353
+ }
2354
+
2355
+ rb_hash_aset(res, rb_id2sym(rb_intern("indexes")), indexes);
2356
+
2357
+ return res;
2358
+ }
2359
+
2360
+ static VALUE
2361
+ cb_Backend_query_index_create(VALUE self, VALUE bucket_name, VALUE index_name, VALUE fields, VALUE options)
2362
+ {
2363
+ cb_backend_data* backend = nullptr;
2364
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2365
+
2366
+ if (!backend->cluster) {
2367
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2368
+ }
2369
+
2370
+ Check_Type(bucket_name, T_STRING);
2371
+ Check_Type(index_name, T_STRING);
2372
+ Check_Type(fields, T_ARRAY);
2373
+
2374
+ couchbase::operations::query_index_create_request req{};
2375
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2376
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
2377
+ auto fields_num = static_cast<size_t>(RARRAY_LEN(fields));
2378
+ req.fields.reserve(fields_num);
2379
+ for (size_t i = 0; i < fields_num; ++i) {
2380
+ VALUE entry = rb_ary_entry(fields, static_cast<long>(i));
2381
+ Check_Type(entry, T_STRING);
2382
+ req.fields.emplace_back(RSTRING_PTR(entry), static_cast<std::size_t>(RSTRING_LEN(entry)));
2383
+ }
2384
+ if (!NIL_P(options)) {
2385
+ Check_Type(options, T_HASH);
2386
+ VALUE ignore_if_exists = rb_hash_aref(options, rb_id2sym(rb_intern("ignore_if_exists")));
2387
+ if (ignore_if_exists == Qtrue) {
2388
+ req.ignore_if_exists = true;
2389
+ } else if (ignore_if_exists == Qfalse) {
2390
+ req.ignore_if_exists = false;
2391
+ } /* else use backend default */
2392
+ VALUE deferred = rb_hash_aref(options, rb_id2sym(rb_intern("deferred")));
2393
+ if (deferred == Qtrue) {
2394
+ req.deferred = true;
2395
+ } else if (deferred == Qfalse) {
2396
+ req.deferred = false;
2397
+ } /* else use backend default */
2398
+ VALUE num_replicas = rb_hash_aref(options, rb_id2sym(rb_intern("num_replicas")));
2399
+ if (!NIL_P(num_replicas)) {
2400
+ req.num_replicas = NUM2UINT(num_replicas);
2401
+ } /* else use backend default */
2402
+ VALUE condition = rb_hash_aref(options, rb_id2sym(rb_intern("condition")));
2403
+ if (!NIL_P(condition)) {
2404
+ req.condition.emplace(std::string(RSTRING_PTR(condition), static_cast<std::size_t>(RSTRING_LEN(condition))));
2405
+ } /* else use backend default */
2406
+ }
2407
+
2408
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_index_create_response>>();
2409
+ auto f = barrier->get_future();
2410
+ backend->cluster->execute_http(
2411
+ req, [barrier](couchbase::operations::query_index_create_response resp) mutable { barrier->set_value(resp); });
2412
+ auto resp = f.get();
2413
+ if (resp.ec) {
2414
+ if (!resp.errors.empty()) {
2415
+ const auto& first_error = resp.errors.front();
2416
+ cb_raise_error_code(resp.ec,
2417
+ fmt::format(R"(unable to create index "{}" on the bucket "{}" ({}: {}))",
2418
+ req.index_name,
2419
+ req.bucket_name,
2420
+ first_error.code,
2421
+ first_error.message));
2422
+ } else {
2423
+ cb_raise_error_code(resp.ec, fmt::format(R"(unable to create index "{}" on the bucket "{}")", req.index_name, req.bucket_name));
2424
+ }
2425
+ }
2426
+ VALUE res = rb_hash_new();
2427
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
2428
+ if (!resp.errors.empty()) {
2429
+ VALUE errors = rb_ary_new_capa(static_cast<long>(resp.errors.size()));
2430
+ for (const auto& err : resp.errors) {
2431
+ VALUE error = rb_hash_new();
2432
+ rb_hash_aset(error, rb_id2sym(rb_intern("code")), ULL2NUM(err.code));
2433
+ rb_hash_aset(error, rb_id2sym(rb_intern("message")), rb_str_new(err.message.data(), static_cast<long>(err.message.size())));
2434
+ rb_ary_push(errors, error);
2435
+ }
2436
+ rb_hash_aset(res, rb_id2sym(rb_intern("errors")), errors);
2437
+ }
2438
+ return res;
2439
+ }
2440
+
2441
+ static VALUE
2442
+ cb_Backend_query_index_drop(VALUE self, VALUE bucket_name, VALUE index_name, VALUE options)
2443
+ {
2444
+ cb_backend_data* backend = nullptr;
2445
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2446
+
2447
+ if (!backend->cluster) {
2448
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2449
+ }
2450
+
2451
+ Check_Type(bucket_name, T_STRING);
2452
+ Check_Type(index_name, T_STRING);
2453
+
2454
+ couchbase::operations::query_index_drop_request req{};
2455
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2456
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
2457
+ if (!NIL_P(options)) {
2458
+ Check_Type(options, T_HASH);
2459
+ VALUE ignore_if_does_not_exist = rb_hash_aref(options, rb_id2sym(rb_intern("ignore_if_does_not_exist")));
2460
+ if (ignore_if_does_not_exist == Qtrue) {
2461
+ req.ignore_if_does_not_exist = true;
2462
+ } else if (ignore_if_does_not_exist == Qfalse) {
2463
+ req.ignore_if_does_not_exist = false;
2464
+ } /* else use backend default */
2465
+ }
2466
+
2467
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_index_drop_response>>();
2468
+ auto f = barrier->get_future();
2469
+ backend->cluster->execute_http(req,
2470
+ [barrier](couchbase::operations::query_index_drop_response resp) mutable { barrier->set_value(resp); });
2471
+ auto resp = f.get();
2472
+ if (resp.ec) {
2473
+ if (!resp.errors.empty()) {
2474
+ const auto& first_error = resp.errors.front();
2475
+ cb_raise_error_code(resp.ec,
2476
+ fmt::format(R"(unable to drop index "{}" on the bucket "{}" ({}: {}))",
2477
+ req.index_name,
2478
+ req.bucket_name,
2479
+ first_error.code,
2480
+ first_error.message));
2481
+ } else {
2482
+ cb_raise_error_code(resp.ec, fmt::format(R"(unable to drop index "{}" on the bucket "{}")", req.index_name, req.bucket_name));
2483
+ }
2484
+ }
2485
+ VALUE res = rb_hash_new();
2486
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
2487
+ if (!resp.errors.empty()) {
2488
+ VALUE errors = rb_ary_new_capa(static_cast<long>(resp.errors.size()));
2489
+ for (const auto& err : resp.errors) {
2490
+ VALUE error = rb_hash_new();
2491
+ rb_hash_aset(error, rb_id2sym(rb_intern("code")), ULL2NUM(err.code));
2492
+ rb_hash_aset(error, rb_id2sym(rb_intern("message")), rb_str_new(err.message.data(), static_cast<long>(err.message.size())));
2493
+ rb_ary_push(errors, error);
2494
+ }
2495
+ rb_hash_aset(res, rb_id2sym(rb_intern("errors")), errors);
2496
+ }
2497
+ return res;
2498
+ }
2499
+
2500
+ static VALUE
2501
+ cb_Backend_query_index_create_primary(VALUE self, VALUE bucket_name, VALUE options)
2502
+ {
2503
+ cb_backend_data* backend = nullptr;
2504
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2505
+
2506
+ if (!backend->cluster) {
2507
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2508
+ }
2509
+
2510
+ Check_Type(bucket_name, T_STRING);
2511
+ if (!NIL_P(options)) {
2512
+ Check_Type(options, T_HASH);
2513
+ }
2514
+
2515
+ couchbase::operations::query_index_create_request req{};
2516
+ req.is_primary = true;
2517
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2518
+ if (!NIL_P(options)) {
2519
+ Check_Type(options, T_HASH);
2520
+ VALUE ignore_if_exists = rb_hash_aref(options, rb_id2sym(rb_intern("ignore_if_exists")));
2521
+ if (ignore_if_exists == Qtrue) {
2522
+ req.ignore_if_exists = true;
2523
+ } else if (ignore_if_exists == Qfalse) {
2524
+ req.ignore_if_exists = false;
2525
+ } /* else use backend default */
2526
+ VALUE deferred = rb_hash_aref(options, rb_id2sym(rb_intern("deferred")));
2527
+ if (deferred == Qtrue) {
2528
+ req.deferred = true;
2529
+ } else if (deferred == Qfalse) {
2530
+ req.deferred = false;
2531
+ } /* else use backend default */
2532
+ VALUE num_replicas = rb_hash_aref(options, rb_id2sym(rb_intern("num_replicas")));
2533
+ if (!NIL_P(num_replicas)) {
2534
+ req.num_replicas = NUM2UINT(num_replicas);
2535
+ } /* else use backend default */
2536
+ VALUE index_name = rb_hash_aref(options, rb_id2sym(rb_intern("index_name")));
2537
+ if (!NIL_P(index_name)) {
2538
+ req.index_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
2539
+ } /* else use backend default */
2540
+ }
2541
+
2542
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_index_create_response>>();
2543
+ auto f = barrier->get_future();
2544
+ backend->cluster->execute_http(
2545
+ req, [barrier](couchbase::operations::query_index_create_response resp) mutable { barrier->set_value(resp); });
2546
+ auto resp = f.get();
2547
+ if (resp.ec) {
2548
+ if (!resp.errors.empty()) {
2549
+ const auto& first_error = resp.errors.front();
2550
+ cb_raise_error_code(
2551
+ resp.ec,
2552
+ fmt::format(
2553
+ R"(unable to create primary index on the bucket "{}" ({}: {}))", req.bucket_name, first_error.code, first_error.message));
2554
+ } else {
2555
+ cb_raise_error_code(resp.ec,
2556
+ fmt::format(R"(unable to create primary index on the bucket "{}")", req.index_name, req.bucket_name));
2557
+ }
2558
+ }
2559
+ VALUE res = rb_hash_new();
2560
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
2561
+ if (!resp.errors.empty()) {
2562
+ VALUE errors = rb_ary_new_capa(static_cast<long>(resp.errors.size()));
2563
+ for (const auto& err : resp.errors) {
2564
+ VALUE error = rb_hash_new();
2565
+ rb_hash_aset(error, rb_id2sym(rb_intern("code")), ULL2NUM(err.code));
2566
+ rb_hash_aset(error, rb_id2sym(rb_intern("message")), rb_str_new(err.message.data(), static_cast<long>(err.message.size())));
2567
+ rb_ary_push(errors, error);
2568
+ }
2569
+ rb_hash_aset(res, rb_id2sym(rb_intern("errors")), errors);
2570
+ }
2571
+ return res;
2572
+ }
2573
+
2574
+ static VALUE
2575
+ cb_Backend_query_index_drop_primary(VALUE self, VALUE bucket_name, VALUE options)
2576
+ {
2577
+ cb_backend_data* backend = nullptr;
2578
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2579
+
2580
+ if (!backend->cluster) {
2581
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2582
+ }
2583
+
2584
+ Check_Type(bucket_name, T_STRING);
2585
+
2586
+ couchbase::operations::query_index_drop_request req{};
2587
+ req.is_primary = true;
2588
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2589
+ if (!NIL_P(options)) {
2590
+ Check_Type(options, T_HASH);
2591
+ VALUE ignore_if_does_not_exist = rb_hash_aref(options, rb_id2sym(rb_intern("ignore_if_does_not_exist")));
2592
+ if (ignore_if_does_not_exist == Qtrue) {
2593
+ req.ignore_if_does_not_exist = true;
2594
+ } else if (ignore_if_does_not_exist == Qfalse) {
2595
+ req.ignore_if_does_not_exist = false;
2596
+ } /* else use backend default */
2597
+ VALUE index_name = rb_hash_aref(options, rb_id2sym(rb_intern("index_name")));
2598
+ if (!NIL_P(index_name)) {
2599
+ Check_Type(options, T_STRING);
2600
+ req.is_primary = false;
2601
+ req.bucket_name.assign(RSTRING_PTR(index_name), static_cast<size_t>(RSTRING_LEN(index_name)));
2602
+ }
2603
+ }
2604
+
2605
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_index_drop_response>>();
2606
+ auto f = barrier->get_future();
2607
+ backend->cluster->execute_http(req,
2608
+ [barrier](couchbase::operations::query_index_drop_response resp) mutable { barrier->set_value(resp); });
2609
+ auto resp = f.get();
2610
+ if (resp.ec) {
2611
+ if (!resp.errors.empty()) {
2612
+ const auto& first_error = resp.errors.front();
2613
+ cb_raise_error_code(
2614
+ resp.ec,
2615
+ fmt::format(
2616
+ R"(unable to drop primary index on the bucket "{}" ({}: {}))", req.bucket_name, first_error.code, first_error.message));
2617
+ } else {
2618
+ cb_raise_error_code(resp.ec, fmt::format(R"(unable to drop primary index on the bucket "{}")", req.bucket_name));
2619
+ }
2620
+ }
2621
+ VALUE res = rb_hash_new();
2622
+ rb_hash_aset(res, rb_id2sym(rb_intern("status")), rb_str_new(resp.status.data(), static_cast<long>(resp.status.size())));
2623
+ if (!resp.errors.empty()) {
2624
+ VALUE errors = rb_ary_new_capa(static_cast<long>(resp.errors.size()));
2625
+ for (const auto& err : resp.errors) {
2626
+ VALUE error = rb_hash_new();
2627
+ rb_hash_aset(error, rb_id2sym(rb_intern("code")), ULL2NUM(err.code));
2628
+ rb_hash_aset(error, rb_id2sym(rb_intern("message")), rb_str_new(err.message.data(), static_cast<long>(err.message.size())));
2629
+ rb_ary_push(errors, error);
2630
+ }
2631
+ rb_hash_aset(res, rb_id2sym(rb_intern("errors")), errors);
2632
+ }
2633
+ return res;
2634
+ }
2635
+
2636
+ static VALUE
2637
+ cb_Backend_query_index_build_deferred(VALUE self, VALUE bucket_name, VALUE options)
2638
+ {
2639
+ cb_backend_data* backend = nullptr;
2640
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2641
+
2642
+ if (!backend->cluster) {
2643
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2644
+ }
2645
+
2646
+ Check_Type(bucket_name, T_STRING);
2647
+ if (!NIL_P(options)) {
2648
+ Check_Type(options, T_HASH);
2649
+ }
2650
+
2651
+ couchbase::operations::query_index_build_deferred_request req{};
2652
+ req.bucket_name.assign(RSTRING_PTR(bucket_name), static_cast<size_t>(RSTRING_LEN(bucket_name)));
2653
+ auto barrier = std::make_shared<std::promise<couchbase::operations::query_index_build_deferred_response>>();
2654
+ auto f = barrier->get_future();
2655
+ backend->cluster->execute_http(
2656
+ req, [barrier](couchbase::operations::query_index_build_deferred_response resp) mutable { barrier->set_value(resp); });
2657
+ auto resp = f.get();
2658
+ if (resp.ec) {
2659
+ if (!resp.errors.empty()) {
2660
+ const auto& first_error = resp.errors.front();
2661
+ cb_raise_error_code(
2662
+ resp.ec,
2663
+ fmt::format(
2664
+ R"(unable to drop primary index on the bucket "{}" ({}: {}))", req.bucket_name, first_error.code, first_error.message));
2665
+
2666
+ } else {
2667
+ cb_raise_error_code(resp.ec,
2668
+ fmt::format("unable to trigger build for deferred indexes for the bucket \"{}\"", req.bucket_name));
2669
+ }
2670
+ }
2671
+ return Qtrue;
2672
+ }
2673
+
2674
+ static VALUE
2675
+ cb_Backend_query_index_watch(VALUE self, VALUE bucket_name, VALUE index_names, VALUE timeout, VALUE options)
2676
+ {
2677
+ cb_backend_data* backend = nullptr;
2678
+ TypedData_Get_Struct(self, cb_backend_data, &cb_backend_type, backend);
2679
+
2680
+ if (!backend->cluster) {
2681
+ rb_raise(rb_eArgError, "Cluster has been closed already");
2682
+ }
2683
+
2684
+ Check_Type(bucket_name, T_STRING);
2685
+ Check_Type(index_names, T_ARRAY);
2686
+ Check_Type(timeout, T_FIXNUM);
2687
+ if (!NIL_P(options)) {
2688
+ Check_Type(options, T_HASH);
2689
+ }
2690
+
2691
+ return Qtrue;
2692
+ }
2693
+
2694
+ static void
2695
+ init_backend(VALUE mCouchbase)
2696
+ {
2697
+ VALUE cBackend = rb_define_class_under(mCouchbase, "Backend", rb_cBasicObject);
2698
+ rb_define_alloc_func(cBackend, cb_Backend_allocate);
2699
+ rb_define_method(cBackend, "open", VALUE_FUNC(cb_Backend_open), 3);
2700
+ rb_define_method(cBackend, "close", VALUE_FUNC(cb_Backend_close), 0);
2701
+ rb_define_method(cBackend, "open_bucket", VALUE_FUNC(cb_Backend_open_bucket), 1);
2702
+
2703
+ rb_define_method(cBackend, "document_get", VALUE_FUNC(cb_Backend_document_get), 3);
2704
+ rb_define_method(cBackend, "document_get_and_lock", VALUE_FUNC(cb_Backend_document_get_and_lock), 4);
2705
+ rb_define_method(cBackend, "document_get_and_touch", VALUE_FUNC(cb_Backend_document_get_and_touch), 4);
2706
+ rb_define_method(cBackend, "document_insert", VALUE_FUNC(cb_Backend_document_insert), 6);
2707
+ rb_define_method(cBackend, "document_replace", VALUE_FUNC(cb_Backend_document_replace), 6);
2708
+ rb_define_method(cBackend, "document_upsert", VALUE_FUNC(cb_Backend_document_upsert), 6);
2709
+ rb_define_method(cBackend, "document_remove", VALUE_FUNC(cb_Backend_document_remove), 4);
2710
+ rb_define_method(cBackend, "document_lookup_in", VALUE_FUNC(cb_Backend_document_lookup_in), 5);
2711
+ rb_define_method(cBackend, "document_mutate_in", VALUE_FUNC(cb_Backend_document_mutate_in), 6);
2712
+ rb_define_method(cBackend, "document_query", VALUE_FUNC(cb_Backend_document_query), 2);
2713
+ rb_define_method(cBackend, "document_touch", VALUE_FUNC(cb_Backend_document_touch), 4);
2714
+ rb_define_method(cBackend, "document_exists", VALUE_FUNC(cb_Backend_document_exists), 3);
2715
+ rb_define_method(cBackend, "document_unlock", VALUE_FUNC(cb_Backend_document_unlock), 4);
2716
+ rb_define_method(cBackend, "document_increment", VALUE_FUNC(cb_Backend_document_increment), 4);
2717
+ rb_define_method(cBackend, "document_decrement", VALUE_FUNC(cb_Backend_document_decrement), 4);
2718
+
2719
+ rb_define_method(cBackend, "bucket_create", VALUE_FUNC(cb_Backend_bucket_create), 1);
2720
+ rb_define_method(cBackend, "bucket_update", VALUE_FUNC(cb_Backend_bucket_update), 1);
2721
+ rb_define_method(cBackend, "bucket_drop", VALUE_FUNC(cb_Backend_bucket_drop), 1);
2722
+ rb_define_method(cBackend, "bucket_flush", VALUE_FUNC(cb_Backend_bucket_flush), 1);
2723
+ rb_define_method(cBackend, "bucket_get_all", VALUE_FUNC(cb_Backend_bucket_get_all), 0);
2724
+ rb_define_method(cBackend, "bucket_get", VALUE_FUNC(cb_Backend_bucket_get), 1);
2725
+
2726
+ rb_define_method(cBackend, "cluster_enable_developer_preview!", VALUE_FUNC(cb_Backend_cluster_enable_developer_preview), 0);
2727
+
2728
+ rb_define_method(cBackend, "scope_get_all", VALUE_FUNC(cb_Backend_scope_get_all), 1);
2729
+ rb_define_method(cBackend, "scope_create", VALUE_FUNC(cb_Backend_scope_create), 2);
2730
+ rb_define_method(cBackend, "scope_drop", VALUE_FUNC(cb_Backend_scope_drop), 2);
2731
+ rb_define_method(cBackend, "collection_create", VALUE_FUNC(cb_Backend_collection_create), 4);
2732
+ rb_define_method(cBackend, "collection_drop", VALUE_FUNC(cb_Backend_collection_drop), 3);
2733
+
2734
+ rb_define_method(cBackend, "query_index_get_all", VALUE_FUNC(cb_Backend_query_index_get_all), 1);
2735
+ rb_define_method(cBackend, "query_index_create", VALUE_FUNC(cb_Backend_query_index_create), 4);
2736
+ rb_define_method(cBackend, "query_index_create_primary", VALUE_FUNC(cb_Backend_query_index_create_primary), 2);
2737
+ rb_define_method(cBackend, "query_index_drop", VALUE_FUNC(cb_Backend_query_index_drop), 3);
2738
+ rb_define_method(cBackend, "query_index_drop_primary", VALUE_FUNC(cb_Backend_query_index_drop_primary), 2);
2739
+ rb_define_method(cBackend, "query_index_build_deferred", VALUE_FUNC(cb_Backend_query_index_build_deferred), 2);
2740
+ rb_define_method(cBackend, "query_index_watch", VALUE_FUNC(cb_Backend_query_index_watch), 4);
2741
+ }
2742
+
2743
+ extern "C" {
2744
+ void
2745
+ Init_libcouchbase(void)
2746
+ {
2747
+ auto env_val = spdlog::details::os::getenv("SPDLOG_LEVEL");
2748
+ if (env_val.empty()) {
2749
+ spdlog::set_level(spdlog::level::critical);
2750
+ } else {
2751
+ spdlog::cfg::load_env_levels();
2752
+ }
2753
+ spdlog::set_pattern("[%Y-%m-%d %T.%e] [%P,%t] [%^%l%$] %v");
2754
+
2755
+ VALUE mCouchbase = rb_define_module("Couchbase");
2756
+ init_versions(mCouchbase);
2757
+ init_backend(mCouchbase);
2758
+ init_exceptions(mCouchbase);
2759
+ }
2760
+ }