neo4j-ruby-driver 1.7.4 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +37 -42
  3. data/lib/loader.rb +5 -3
  4. data/lib/neo4j/driver/auto_closable.rb +2 -2
  5. data/lib/neo4j/driver/exceptions/authentication_exception.rb +6 -1
  6. data/lib/neo4j/driver/exceptions/authorization_expired_exception.rb +14 -0
  7. data/lib/neo4j/driver/{types/bytes.rb → exceptions/certificate_exception.rb} +2 -2
  8. data/lib/neo4j/driver/exceptions/client_exception.rb +3 -0
  9. data/lib/neo4j/driver/exceptions/connection_read_timeout_exception.rb +14 -0
  10. data/lib/neo4j/driver/exceptions/database_exception.rb +3 -0
  11. data/lib/neo4j/driver/exceptions/discovery_exception.rb +16 -0
  12. data/lib/neo4j/driver/exceptions/fatal_discovery_exception.rb +13 -0
  13. data/lib/neo4j/driver/exceptions/protocol_exception.rb +7 -0
  14. data/lib/neo4j/driver/exceptions/result_consumed_exception.rb +13 -0
  15. data/lib/neo4j/driver/exceptions/security_exception.rb +5 -1
  16. data/lib/neo4j/driver/exceptions/service_unavailable_exception.rb +2 -0
  17. data/lib/neo4j/driver/exceptions/session_expired_exception.rb +4 -0
  18. data/lib/neo4j/driver/exceptions/token_expired_exception.rb +15 -0
  19. data/lib/neo4j/driver/exceptions/transaction_nesting_exception.rb +11 -0
  20. data/lib/neo4j/driver/exceptions/transient_exception.rb +3 -0
  21. data/lib/neo4j/driver/exceptions/untrusted_server_exception.rb +1 -0
  22. data/lib/neo4j/driver/exceptions/value/lossy_coercion.rb +15 -0
  23. data/lib/neo4j/driver/exceptions/value/not_multi_valued.rb +13 -0
  24. data/lib/neo4j/driver/exceptions/value/uncoercible.rb +15 -0
  25. data/lib/neo4j/driver/exceptions/value/unsizable.rb +12 -0
  26. data/lib/neo4j/driver/exceptions/value/value_exception.rb +12 -0
  27. data/lib/neo4j/driver/internal/bolt_server_address.rb +97 -0
  28. data/lib/neo4j/driver/internal/duration_normalizer.rb +1 -1
  29. data/lib/neo4j/driver/internal/validator.rb +5 -4
  30. data/{ffi/neo4j/driver/summary/statement_type.rb → lib/neo4j/driver/summary/query_type.rb} +1 -3
  31. data/lib/neo4j/driver/synchronizable.rb +23 -0
  32. data/lib/neo4j/driver/types/time.rb +4 -2
  33. data/lib/neo4j_ruby_driver.rb +5 -10
  34. data/{ffi → ruby}/neo4j/driver/access_mode.rb +2 -2
  35. data/ruby/neo4j/driver/auth_tokens.rb +34 -0
  36. data/ruby/neo4j/driver/bookmark.rb +21 -0
  37. data/ruby/neo4j/driver/config.rb +89 -0
  38. data/ruby/neo4j/driver/graph_database.rb +80 -0
  39. data/ruby/neo4j/driver/internal/async/connection/bolt_protocol_util.rb +51 -0
  40. data/ruby/neo4j/driver/internal/async/connection/bootstrap_factory.rb +22 -0
  41. data/ruby/neo4j/driver/internal/async/connection/channel_attributes.rb +31 -0
  42. data/ruby/neo4j/driver/internal/async/connection/channel_connected_listener.rb +32 -0
  43. data/ruby/neo4j/driver/internal/async/connection/channel_connector_impl.rb +83 -0
  44. data/ruby/neo4j/driver/internal/async/connection/channel_pipeline_builder_impl.rb +22 -0
  45. data/ruby/neo4j/driver/internal/async/connection/direct_connection.rb +30 -0
  46. data/ruby/neo4j/driver/internal/async/connection/event_loop_group_factory.rb +83 -0
  47. data/ruby/neo4j/driver/internal/async/connection/handshake_completed_listener.rb +27 -0
  48. data/ruby/neo4j/driver/internal/async/connection/handshake_handler.rb +113 -0
  49. data/ruby/neo4j/driver/internal/async/connection/netty_channel_initializer.rb +57 -0
  50. data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver.rb +26 -0
  51. data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver_group.rb +19 -0
  52. data/ruby/neo4j/driver/internal/async/connection/routing_connection.rb +36 -0
  53. data/ruby/neo4j/driver/internal/async/connection/stream.rb +12 -0
  54. data/ruby/neo4j/driver/internal/async/connection/stream_reader.rb +16 -0
  55. data/ruby/neo4j/driver/internal/async/connection_context.rb +10 -0
  56. data/ruby/neo4j/driver/internal/async/immutable_connection_context.rb +24 -0
  57. data/ruby/neo4j/driver/internal/async/inbound/byte_buf_input.rb +30 -0
  58. data/ruby/neo4j/driver/internal/async/inbound/channel_error_handler.rb +77 -0
  59. data/ruby/neo4j/driver/internal/async/inbound/chunk_decoder.rb +41 -0
  60. data/ruby/neo4j/driver/internal/async/inbound/connect_timeout_handler.rb +32 -0
  61. data/ruby/neo4j/driver/internal/async/inbound/connection_read_timeout_handler.rb +17 -0
  62. data/ruby/neo4j/driver/internal/async/inbound/inbound_message_dispatcher.rb +171 -0
  63. data/ruby/neo4j/driver/internal/async/inbound/inbound_message_handler.rb +42 -0
  64. data/ruby/neo4j/driver/internal/async/inbound/message_decoder.rb +51 -0
  65. data/ruby/neo4j/driver/internal/async/internal_async_session.rb +98 -0
  66. data/ruby/neo4j/driver/internal/async/internal_async_transaction.rb +13 -0
  67. data/ruby/neo4j/driver/internal/async/leak_logging_network_session.rb +34 -0
  68. data/ruby/neo4j/driver/internal/async/network_connection.rb +194 -0
  69. data/ruby/neo4j/driver/internal/async/network_session.rb +150 -0
  70. data/ruby/neo4j/driver/internal/async/outbound/chunk_aware_byte_buf_output.rb +110 -0
  71. data/ruby/neo4j/driver/internal/async/outbound/outbound_message_handler.rb +39 -0
  72. data/ruby/neo4j/driver/internal/async/pool/channel.rb +62 -0
  73. data/ruby/neo4j/driver/internal/async/pool/channel_pool.rb +31 -0
  74. data/ruby/neo4j/driver/internal/async/pool/channel_tracker.rb +135 -0
  75. data/ruby/neo4j/driver/internal/async/pool/connection_pool_impl.rb +156 -0
  76. data/ruby/neo4j/driver/internal/async/pool/netty_channel_health_checker.rb +87 -0
  77. data/ruby/neo4j/driver/internal/async/pool/netty_channel_pool.rb +52 -0
  78. data/ruby/neo4j/driver/internal/async/pool/network_connection_factory.rb +21 -0
  79. data/ruby/neo4j/driver/internal/async/pool/pool_settings.rb +34 -0
  80. data/ruby/neo4j/driver/internal/async/pool/timed_stack.rb +15 -0
  81. data/ruby/neo4j/driver/internal/async/result_cursors_holder.rb +17 -0
  82. data/ruby/neo4j/driver/internal/async/unmanaged_transaction.rb +212 -0
  83. data/ruby/neo4j/driver/internal/bookmark_holder.rb +9 -0
  84. data/ruby/neo4j/driver/internal/cluster/cluster_composition.rb +48 -0
  85. data/ruby/neo4j/driver/internal/cluster/cluster_composition_lookup_result.rb +14 -0
  86. data/ruby/neo4j/driver/internal/cluster/cluster_routing_table.rb +122 -0
  87. data/ruby/neo4j/driver/internal/cluster/identity_resolver.rb +10 -0
  88. data/ruby/neo4j/driver/internal/cluster/loadbalancing/least_connected_load_balancing_strategy.rb +68 -0
  89. data/ruby/neo4j/driver/internal/cluster/loadbalancing/load_balancer.rb +125 -0
  90. data/ruby/neo4j/driver/internal/cluster/loadbalancing/round_robin_array_index.rb +13 -0
  91. data/ruby/neo4j/driver/internal/cluster/multi_databases_routing_procedure_runner.rb +31 -0
  92. data/ruby/neo4j/driver/internal/cluster/rediscovery_impl.rb +147 -0
  93. data/ruby/neo4j/driver/internal/cluster/route_message_routing_procedure_runner.rb +43 -0
  94. data/ruby/neo4j/driver/internal/cluster/routing_context.rb +77 -0
  95. data/ruby/neo4j/driver/internal/cluster/routing_procedure_cluster_composition_provider.rb +60 -0
  96. data/ruby/neo4j/driver/internal/cluster/routing_procedure_response.rb +35 -0
  97. data/ruby/neo4j/driver/internal/cluster/routing_settings.rb +24 -0
  98. data/ruby/neo4j/driver/internal/cluster/routing_table_handler_impl.rb +95 -0
  99. data/ruby/neo4j/driver/internal/cluster/routing_table_registry_impl.rb +121 -0
  100. data/ruby/neo4j/driver/internal/cluster/single_database_routing_procedure_runner.rb +73 -0
  101. data/ruby/neo4j/driver/internal/connection_settings.rb +16 -0
  102. data/ruby/neo4j/driver/internal/cursor/async_result_cursor_impl.rb +55 -0
  103. data/ruby/neo4j/driver/internal/cursor/async_result_cursor_only_factory.rb +24 -0
  104. data/ruby/neo4j/driver/internal/cursor/disposable_async_result_cursor.rb +61 -0
  105. data/ruby/neo4j/driver/internal/cursor/result_cursor_factory_impl.rb +24 -0
  106. data/ruby/neo4j/driver/internal/cursor/rx_result_cursor_impl.rb +110 -0
  107. data/ruby/neo4j/driver/internal/database_name_util.rb +37 -0
  108. data/ruby/neo4j/driver/internal/default_bookmark_holder.rb +9 -0
  109. data/ruby/neo4j/driver/internal/default_domain_name_resolver.rb +11 -0
  110. data/ruby/neo4j/driver/internal/direct_connection_provider.rb +40 -0
  111. data/ruby/neo4j/driver/internal/driver_factory.rb +126 -0
  112. data/ruby/neo4j/driver/internal/handlers/begin_tx_response_handler.rb +20 -0
  113. data/ruby/neo4j/driver/internal/handlers/channel_releasing_reset_response_handler.rb +30 -0
  114. data/ruby/neo4j/driver/internal/handlers/commit_tx_response_handler.rb +25 -0
  115. data/ruby/neo4j/driver/internal/handlers/hello_response_handler.rb +65 -0
  116. data/ruby/neo4j/driver/internal/handlers/init_response_handler.rb +34 -0
  117. data/ruby/neo4j/driver/internal/handlers/legacy_pull_all_response_handler.rb +199 -0
  118. data/ruby/neo4j/driver/internal/handlers/no_op_response_handler.rb +16 -0
  119. data/ruby/neo4j/driver/internal/handlers/ping_response_handler.rb +29 -0
  120. data/ruby/neo4j/driver/internal/handlers/pull_handlers.rb +32 -0
  121. data/ruby/neo4j/driver/internal/handlers/pulln/auto_pull_response_handler.rb +168 -0
  122. data/ruby/neo4j/driver/internal/handlers/pulln/basic_pull_response_handler.rb +298 -0
  123. data/ruby/neo4j/driver/internal/handlers/pulln/fetch_size_util.rb +20 -0
  124. data/ruby/neo4j/driver/internal/handlers/reset_response_handler.rb +34 -0
  125. data/ruby/neo4j/driver/internal/handlers/rollback_tx_response_handler.rb +25 -0
  126. data/ruby/neo4j/driver/internal/handlers/route_message_response_handler.rb +21 -0
  127. data/ruby/neo4j/driver/internal/handlers/routing_response_handler.rb +70 -0
  128. data/ruby/neo4j/driver/internal/handlers/run_response_handler.rb +38 -0
  129. data/ruby/neo4j/driver/internal/handlers/session_pull_response_completion_listener.rb +34 -0
  130. data/ruby/neo4j/driver/internal/handlers/transaction_pull_response_completion_listener.rb +20 -0
  131. data/ruby/neo4j/driver/internal/impersonation_util.rb +22 -0
  132. data/ruby/neo4j/driver/internal/internal_bookmark.rb +36 -0
  133. data/ruby/neo4j/driver/internal/internal_database_name.rb +9 -0
  134. data/ruby/neo4j/driver/internal/internal_driver.rb +74 -0
  135. data/ruby/neo4j/driver/internal/internal_entity.rb +20 -0
  136. data/ruby/neo4j/driver/internal/internal_node.rb +21 -0
  137. data/ruby/neo4j/driver/internal/internal_pair.rb +9 -0
  138. data/ruby/neo4j/driver/internal/internal_path.rb +35 -0
  139. data/ruby/neo4j/driver/internal/internal_point2_d.rb +9 -0
  140. data/ruby/neo4j/driver/internal/internal_point3_d.rb +6 -0
  141. data/{ffi → ruby}/neo4j/driver/internal/internal_record.rb +2 -1
  142. data/ruby/neo4j/driver/internal/internal_relationship.rb +26 -0
  143. data/ruby/neo4j/driver/internal/internal_result.rb +49 -0
  144. data/ruby/neo4j/driver/internal/internal_session.rb +81 -0
  145. data/ruby/neo4j/driver/internal/internal_transaction.rb +48 -0
  146. data/ruby/neo4j/driver/internal/logging/channel_activity_logger.rb +29 -0
  147. data/ruby/neo4j/driver/internal/logging/channel_error_logger.rb +17 -0
  148. data/ruby/neo4j/driver/internal/logging/prefixed_logger.rb +19 -0
  149. data/ruby/neo4j/driver/internal/logging/reformatted_logger.rb +17 -0
  150. data/ruby/neo4j/driver/internal/messaging/abstract_message_writer.rb +23 -0
  151. data/ruby/neo4j/driver/internal/messaging/bolt_protocol.rb +30 -0
  152. data/ruby/neo4j/driver/internal/messaging/bolt_protocol_version.rb +48 -0
  153. data/ruby/neo4j/driver/internal/messaging/common/common_message_reader.rb +51 -0
  154. data/ruby/neo4j/driver/internal/messaging/common/common_value.rb +31 -0
  155. data/ruby/neo4j/driver/internal/messaging/common/common_value_packer.rb +101 -0
  156. data/ruby/neo4j/driver/internal/messaging/common/common_value_unpacker.rb +234 -0
  157. data/ruby/neo4j/driver/internal/messaging/encode/begin_message_encoder.rb +15 -0
  158. data/ruby/neo4j/driver/internal/messaging/encode/commit_message_encoder.rb +14 -0
  159. data/ruby/neo4j/driver/internal/messaging/encode/discard_all_message_encoder.rb +14 -0
  160. data/ruby/neo4j/driver/internal/messaging/encode/discard_message_encoder.rb +15 -0
  161. data/ruby/neo4j/driver/internal/messaging/encode/goodbye_message_encoder.rb +14 -0
  162. data/ruby/neo4j/driver/internal/messaging/encode/hello_message_encoder.rb +15 -0
  163. data/ruby/neo4j/driver/internal/messaging/encode/init_message_encoder.rb +16 -0
  164. data/ruby/neo4j/driver/internal/messaging/encode/pull_all_message_encoder.rb +14 -0
  165. data/ruby/neo4j/driver/internal/messaging/encode/pull_message_encoder.rb +15 -0
  166. data/ruby/neo4j/driver/internal/messaging/encode/reset_message_encoder.rb +14 -0
  167. data/ruby/neo4j/driver/internal/messaging/encode/rollback_message_encoder.rb +14 -0
  168. data/ruby/neo4j/driver/internal/messaging/encode/route_message_encoder.rb +24 -0
  169. data/ruby/neo4j/driver/internal/messaging/encode/route_v44_message_encoder.rb +22 -0
  170. data/ruby/neo4j/driver/internal/messaging/encode/run_message_encoder.rb +16 -0
  171. data/ruby/neo4j/driver/internal/messaging/encode/run_with_metadata_message_encoder.rb +17 -0
  172. data/ruby/neo4j/driver/internal/messaging/request/abstract_streaming_message.rb +25 -0
  173. data/ruby/neo4j/driver/internal/messaging/request/begin_message.rb +25 -0
  174. data/ruby/neo4j/driver/internal/messaging/request/commit_message.rb +20 -0
  175. data/ruby/neo4j/driver/internal/messaging/request/discard_all_message.rb +20 -0
  176. data/ruby/neo4j/driver/internal/messaging/request/discard_message.rb +23 -0
  177. data/ruby/neo4j/driver/internal/messaging/request/goodbye_message.rb +20 -0
  178. data/ruby/neo4j/driver/internal/messaging/request/hello_message.rb +31 -0
  179. data/ruby/neo4j/driver/internal/messaging/request/init_message.rb +19 -0
  180. data/ruby/neo4j/driver/internal/messaging/request/message_with_metadata.rb +10 -0
  181. data/ruby/neo4j/driver/internal/messaging/request/multi_database_util.rb +26 -0
  182. data/ruby/neo4j/driver/internal/messaging/request/pull_all_message.rb +23 -0
  183. data/ruby/neo4j/driver/internal/messaging/request/pull_message.rb +22 -0
  184. data/ruby/neo4j/driver/internal/messaging/request/reset_message.rb +32 -0
  185. data/ruby/neo4j/driver/internal/messaging/request/rollback_message.rb +20 -0
  186. data/ruby/neo4j/driver/internal/messaging/request/route_message.rb +28 -0
  187. data/ruby/neo4j/driver/internal/messaging/request/run_message.rb +23 -0
  188. data/ruby/neo4j/driver/internal/messaging/request/run_with_metadata_message.rb +49 -0
  189. data/ruby/neo4j/driver/internal/messaging/request/transaction_metadata_builder.rb +24 -0
  190. data/ruby/neo4j/driver/internal/messaging/response/failure_message.rb +40 -0
  191. data/ruby/neo4j/driver/internal/messaging/response/ignored_message.rb +29 -0
  192. data/ruby/neo4j/driver/internal/messaging/response/record_message.rb +33 -0
  193. data/ruby/neo4j/driver/internal/messaging/response/success_message.rb +34 -0
  194. data/ruby/neo4j/driver/internal/messaging/v3/bolt_protocol_v3.rb +82 -0
  195. data/ruby/neo4j/driver/internal/messaging/v3/message_format_v3.rb +17 -0
  196. data/ruby/neo4j/driver/internal/messaging/v3/message_writer_v3.rb +27 -0
  197. data/ruby/neo4j/driver/internal/messaging/v4/bolt_protocol_v4.rb +29 -0
  198. data/ruby/neo4j/driver/internal/messaging/v4/message_format_v4.rb +17 -0
  199. data/ruby/neo4j/driver/internal/messaging/v4/message_writer_v4.rb +17 -0
  200. data/ruby/neo4j/driver/internal/messaging/v41/bolt_protocol_v41.rb +25 -0
  201. data/ruby/neo4j/driver/internal/messaging/v42/bolt_protocol_v42.rb +13 -0
  202. data/ruby/neo4j/driver/internal/messaging/v43/bolt_protocol_v43.rb +19 -0
  203. data/ruby/neo4j/driver/internal/messaging/v43/message_format_v43.rb +18 -0
  204. data/ruby/neo4j/driver/internal/messaging/v43/message_writer_v43.rb +20 -0
  205. data/ruby/neo4j/driver/internal/messaging/v44/bolt_protocol_v44.rb +17 -0
  206. data/ruby/neo4j/driver/internal/messaging/v44/message_format_v44.rb +18 -0
  207. data/ruby/neo4j/driver/internal/messaging/v44/message_writer_v44.rb +15 -0
  208. data/ruby/neo4j/driver/internal/metrics/connection_pool_metrics_listener.rb +34 -0
  209. data/ruby/neo4j/driver/internal/metrics/internal_abstract_metrics.rb +46 -0
  210. data/ruby/neo4j/driver/internal/metrics/internal_connection_pool_metrics.rb +105 -0
  211. data/ruby/neo4j/driver/internal/metrics/internal_metrics.rb +82 -0
  212. data/ruby/neo4j/driver/internal/metrics/internal_metrics_provider.rb +18 -0
  213. data/ruby/neo4j/driver/internal/metrics/listener_event.rb +17 -0
  214. data/ruby/neo4j/driver/internal/metrics/metrics_provider.rb +24 -0
  215. data/ruby/neo4j/driver/internal/metrics/time_recorder_listener_event.rb +15 -0
  216. data/ruby/neo4j/driver/internal/packstream/byte_array_incompatible_packer.rb +12 -0
  217. data/ruby/neo4j/driver/internal/packstream/pack_input.rb +47 -0
  218. data/ruby/neo4j/driver/internal/packstream/pack_output.rb +39 -0
  219. data/ruby/neo4j/driver/internal/packstream/pack_stream.rb +326 -0
  220. data/ruby/neo4j/driver/internal/packstream/pack_type.rb +17 -0
  221. data/ruby/neo4j/driver/internal/read_only_bookmark_holder.rb +13 -0
  222. data/ruby/neo4j/driver/internal/resolved_bolt_server_address.rb +35 -0
  223. data/ruby/neo4j/driver/internal/retry/exponential_backoff_retry_logic.rb +151 -0
  224. data/ruby/neo4j/driver/internal/revocation_strategy.rb +19 -0
  225. data/ruby/neo4j/driver/internal/scheme.rb +32 -0
  226. data/ruby/neo4j/driver/internal/security/internal_auth_token.rb +15 -0
  227. data/ruby/neo4j/driver/internal/security/security_plan_impl.rb +48 -0
  228. data/ruby/neo4j/driver/internal/security_setting.rb +66 -0
  229. data/ruby/neo4j/driver/internal/session_factory_impl.rb +32 -0
  230. data/ruby/neo4j/driver/internal/spi/connection.rb +19 -0
  231. data/ruby/neo4j/driver/internal/spi/connection_pool.rb +9 -0
  232. data/ruby/neo4j/driver/internal/spi/response_handler.rb +23 -0
  233. data/ruby/neo4j/driver/internal/summary/internal_database_info.rb +7 -0
  234. data/ruby/neo4j/driver/internal/summary/internal_input_position.rb +11 -0
  235. data/ruby/neo4j/driver/internal/summary/internal_notification.rb +16 -0
  236. data/ruby/neo4j/driver/internal/summary/internal_plan.rb +41 -0
  237. data/ruby/neo4j/driver/internal/summary/internal_profiled_plan.rb +32 -0
  238. data/ruby/neo4j/driver/internal/summary/internal_result_summary.rb +33 -0
  239. data/ruby/neo4j/driver/internal/summary/internal_server_info.rb +6 -0
  240. data/ruby/neo4j/driver/internal/summary/internal_summary_counters.rb +18 -0
  241. data/ruby/neo4j/driver/internal/svm/netty_substitutions.rb +196 -0
  242. data/ruby/neo4j/driver/internal/svm/z_lib_substitutions.rb +21 -0
  243. data/ruby/neo4j/driver/internal/util/certificate_tool.rb +65 -0
  244. data/ruby/neo4j/driver/internal/util/clock.rb +29 -0
  245. data/ruby/neo4j/driver/internal/util/error_util.rb +104 -0
  246. data/ruby/neo4j/driver/internal/util/extract.rb +123 -0
  247. data/ruby/neo4j/driver/internal/util/format.rb +39 -0
  248. data/ruby/neo4j/driver/internal/util/futures.rb +99 -0
  249. data/ruby/neo4j/driver/internal/util/iterables.rb +35 -0
  250. data/ruby/neo4j/driver/internal/util/lock_util.rb +23 -0
  251. data/ruby/neo4j/driver/internal/util/metadata_extractor.rb +107 -0
  252. data/ruby/neo4j/driver/internal/util/mutex.rb +9 -0
  253. data/ruby/neo4j/driver/internal/util/preconditions.rb +16 -0
  254. data/ruby/neo4j/driver/internal/util/result_holder.rb +72 -0
  255. data/ruby/neo4j/driver/internal/util/server_version.rb +60 -0
  256. data/ruby/neo4j/driver/logging1.rb +51 -0
  257. data/ruby/neo4j/driver/net/server_address.rb +9 -0
  258. data/ruby/neo4j/driver/query.rb +48 -0
  259. data/ruby/neo4j/driver/records.rb +13 -0
  260. data/ruby/neo4j/driver/transaction_config.rb +50 -0
  261. data/ruby/neo4j/driver/values.rb +26 -0
  262. data/{lib → ruby}/neo4j/driver/version.rb +1 -1
  263. data/ruby/neo4j/driver.rb +29 -0
  264. metadata +264 -101
  265. data/ffi/bolt/address.rb +0 -11
  266. data/ffi/bolt/address_resolver.rb +0 -12
  267. data/ffi/bolt/address_set.rb +0 -9
  268. data/ffi/bolt/auth.rb +0 -10
  269. data/ffi/bolt/auto_releasable.rb +0 -22
  270. data/ffi/bolt/boolean.rb +0 -9
  271. data/ffi/bolt/bytes.rb +0 -10
  272. data/ffi/bolt/config.rb +0 -45
  273. data/ffi/bolt/connection.rb +0 -44
  274. data/ffi/bolt/connector.rb +0 -17
  275. data/ffi/bolt/dictionary.rb +0 -15
  276. data/ffi/bolt/error.rb +0 -74
  277. data/ffi/bolt/float.rb +0 -9
  278. data/ffi/bolt/integer.rb +0 -9
  279. data/ffi/bolt/library.rb +0 -12
  280. data/ffi/bolt/lifecycle.rb +0 -9
  281. data/ffi/bolt/list.rb +0 -10
  282. data/ffi/bolt/log.rb +0 -16
  283. data/ffi/bolt/socket_options.rb +0 -14
  284. data/ffi/bolt/status.rb +0 -25
  285. data/ffi/bolt/string.rb +0 -9
  286. data/ffi/bolt/structure.rb +0 -10
  287. data/ffi/bolt/value.rb +0 -35
  288. data/ffi/neo4j/driver/auth_tokens.rb +0 -18
  289. data/ffi/neo4j/driver/config.rb +0 -40
  290. data/ffi/neo4j/driver/graph_database.rb +0 -52
  291. data/ffi/neo4j/driver/internal/async/access_mode_connection.rb +0 -19
  292. data/ffi/neo4j/driver/internal/async/direct_connection.rb +0 -106
  293. data/ffi/neo4j/driver/internal/bolt_server_address.rb +0 -18
  294. data/ffi/neo4j/driver/internal/bookmarks_holder.rb +0 -30
  295. data/ffi/neo4j/driver/internal/direct_connection_provider.rb +0 -28
  296. data/ffi/neo4j/driver/internal/driver_factory.rb +0 -125
  297. data/ffi/neo4j/driver/internal/error_handling.rb +0 -112
  298. data/ffi/neo4j/driver/internal/explicit_transaction.rb +0 -146
  299. data/ffi/neo4j/driver/internal/handlers/pull_all_response_handler.rb +0 -104
  300. data/ffi/neo4j/driver/internal/handlers/response_handler.rb +0 -49
  301. data/ffi/neo4j/driver/internal/handlers/run_response_handler.rb +0 -32
  302. data/ffi/neo4j/driver/internal/handlers/session_pull_all_response_handler.rb +0 -32
  303. data/ffi/neo4j/driver/internal/handlers/transaction_pull_all_response_handler.rb +0 -23
  304. data/ffi/neo4j/driver/internal/internal_driver.rb +0 -45
  305. data/ffi/neo4j/driver/internal/internal_logger.rb +0 -32
  306. data/ffi/neo4j/driver/internal/internal_resolver.rb +0 -31
  307. data/ffi/neo4j/driver/internal/internal_statement_result.rb +0 -52
  308. data/ffi/neo4j/driver/internal/messaging/bolt_protocol.rb +0 -24
  309. data/ffi/neo4j/driver/internal/messaging/v1/bolt_protocol_v1.rb +0 -59
  310. data/ffi/neo4j/driver/internal/messaging/v2/bolt_protocol_v2.rb +0 -16
  311. data/ffi/neo4j/driver/internal/messaging/v3/bolt_protocol_v3.rb +0 -63
  312. data/ffi/neo4j/driver/internal/network_session.rb +0 -129
  313. data/ffi/neo4j/driver/internal/retry/exponential_backoff_retry_logic.rb +0 -80
  314. data/ffi/neo4j/driver/internal/session_factory_impl.rb +0 -28
  315. data/ffi/neo4j/driver/internal/summary/internal_result_summary.rb +0 -67
  316. data/ffi/neo4j/driver/internal/summary/internal_server_info.rb +0 -19
  317. data/ffi/neo4j/driver/internal/summary/internal_summary_counters.rb +0 -23
  318. data/ffi/neo4j/driver/internal/util/metadata_extractor.rb +0 -15
  319. data/ffi/neo4j/driver/internal/value/base_time_value.rb +0 -22
  320. data/ffi/neo4j/driver/internal/value/date_value.rb +0 -25
  321. data/ffi/neo4j/driver/internal/value/duration_value.rb +0 -27
  322. data/ffi/neo4j/driver/internal/value/local_date_time_value.rb +0 -24
  323. data/ffi/neo4j/driver/internal/value/local_time_value.rb +0 -19
  324. data/ffi/neo4j/driver/internal/value/node_value.rb +0 -18
  325. data/ffi/neo4j/driver/internal/value/offset_time_value.rb +0 -25
  326. data/ffi/neo4j/driver/internal/value/path_value.rb +0 -41
  327. data/ffi/neo4j/driver/internal/value/point2_d_value.rb +0 -24
  328. data/ffi/neo4j/driver/internal/value/point3_d_value.rb +0 -24
  329. data/ffi/neo4j/driver/internal/value/relationship_value.rb +0 -18
  330. data/ffi/neo4j/driver/internal/value/structure_value.rb +0 -42
  331. data/ffi/neo4j/driver/internal/value/time_with_zone_id_value.rb +0 -25
  332. data/ffi/neo4j/driver/internal/value/time_with_zone_offset_value.rb +0 -28
  333. data/ffi/neo4j/driver/internal/value/unbound_relationship_value.rb +0 -18
  334. data/ffi/neo4j/driver/internal/value/value_adapter.rb +0 -101
  335. data/ffi/neo4j/driver/net/server_address.rb +0 -13
  336. data/ffi/neo4j/driver/statement.rb +0 -15
  337. data/ffi/neo4j/driver/types/entity.rb +0 -21
  338. data/ffi/neo4j/driver/types/node.rb +0 -16
  339. data/ffi/neo4j/driver/types/path.rb +0 -35
  340. data/ffi/neo4j/driver/types/relationship.rb +0 -19
  341. data/ffi/neo4j/driver.rb +0 -61
  342. data/lib/neo4j/driver/internal/ruby_signature.rb +0 -18
@@ -0,0 +1,126 @@
1
+ module Neo4j::Driver::Internal
2
+ class DriverFactory
3
+ include Scheme
4
+ NO_ROUTING_CONTEXT_ERROR_MESSAGE = "Routing parameters are not supported with scheme 'bolt'. Given URI: "
5
+
6
+ def initialize(domain_name_resolver = ->(name) { [name] })
7
+ @domain_name_resolver = domain_name_resolver
8
+ end
9
+
10
+ def new_instance(uri, auth_token, routing_settings, retry_settings, config, security_plan, event_loop_group = nil)
11
+ bootstrap = create_bootstrap(
12
+ **event_loop_group ? { event_loop_group: event_loop_group } : { thread_count: config[:event_loop_threads] }
13
+ )
14
+
15
+ address = BoltServerAddress.new(uri: uri)
16
+ new_routing_settings = routing_settings.with_routing_context(Cluster::RoutingContext.new(uri))
17
+
18
+ # org.neo4j.driver.internal.shaded.io.netty.util.internal.logging.InternalLoggerFactory.setDefaultFactory(org.neo4j.driver.internal.logging.NettyLogging.new(config.logging))
19
+ _event_executor_group = nil #bootstrap.group
20
+ retry_logic = Retry::ExponentialBackoffRetryLogic.new(retry_settings, _event_executor_group, config[:logger])
21
+
22
+ metrics_provider = create_driver_metrics(config)
23
+ connection_pool = create_connection_pool(auth_token, security_plan, bootstrap, metrics_provider, config,
24
+ event_loop_group.nil?, new_routing_settings.routing_context)
25
+
26
+ create_driver(uri, security_plan, address, connection_pool, _event_executor_group, new_routing_settings, retry_logic, metrics_provider, config)
27
+ end
28
+
29
+ private
30
+
31
+ def create_connection_pool(auth_token, security_plan, bootstrap, metrics_provider, config, owns_event_loop_group, routing_context)
32
+ clock = Util::Clock::System
33
+ settings = ConnectionSettings.new(auth_token, config[:user_agent], config[:connection_timeout].in_milliseconds)
34
+ connector = create_connector(settings, security_plan, config, clock, routing_context)
35
+ pool_settings = Async::Pool::PoolSettings.new(
36
+ config[:max_connection_pool_size],
37
+ config[:connection_acquisition_timeout],
38
+ config[:max_connection_lifetime].in_milliseconds,
39
+ config[:idle_time_before_connection_test]&.in_milliseconds || -1 # TODO: remember to get rid of -1
40
+ )
41
+ Async::Pool::ConnectionPoolImpl.new(connector, pool_settings, config[:logger])
42
+ end
43
+
44
+ def create_driver_metrics(config)
45
+ if config[:metrics_enabled]
46
+ Metrics::InternalMetricsProvider.new(config[:logger])
47
+ else
48
+ Metrics::MetricsProvider::METRICS_DISABLED_PROVIDER
49
+ end
50
+ end
51
+
52
+ def create_resolver(config)
53
+ config[:resolver] || ->(address) { [address] }
54
+ end
55
+
56
+ def assert_no_routing_context(uri, routing_settings)
57
+ routing_context = routing_settings.routing_context
58
+ if routing_context.defined?
59
+ raise ArgumentError, "Routing parameters are not supported with scheme 'bolt'. Given URI: '#{uri}'"
60
+ end
61
+ end
62
+
63
+ def create_connector(settings, security_plan, config, clock, routing_context)
64
+ Async::Connection::ChannelConnectorImpl.new(
65
+ settings, security_plan, config[:logger], clock, routing_context, &method(:domain_name_resolver))
66
+ end
67
+
68
+ def create_driver(uri, security_plan, address, connection_pool, eventExecutorGroup, routing_settings, retryLogic, metricsProvider, config)
69
+ if routing_scheme?(uri.scheme.downcase)
70
+ create_routing_driver(security_plan, address, connection_pool, eventExecutorGroup, routing_settings, retryLogic, metricsProvider, config)
71
+ else
72
+ assert_no_routing_context(uri, routing_settings)
73
+ create_direct_driver(security_plan, address, connection_pool, retryLogic, metricsProvider, config)
74
+ end
75
+ rescue => driver_error
76
+ # we need to close the connection pool if driver creation threw exception
77
+ close_connection_pool_and_suppress_error(connection_pool, driver_error)
78
+ raise
79
+ end
80
+
81
+ def create_direct_driver(securityPlan, address, connection_pool, retryLogic, metricsProvider, config)
82
+ connection_provider = DirectConnectionProvider.new(address, connection_pool)
83
+ driver(:Direct, securityPlan, address, connection_provider, retryLogic, metricsProvider, config)
84
+ end
85
+
86
+ def create_routing_driver(securityPlan, address, connection_pool, eventExecutorGroup, routing_settings, retryLogic, metricsProvider, config)
87
+ connection_provider = create_load_balancer(address, connection_pool, eventExecutorGroup, config, routing_settings)
88
+ driver(:Routing, securityPlan, address, connection_provider, retryLogic, metricsProvider, config)
89
+ end
90
+
91
+ def driver(type, security_plan, address, connection_provider, retry_logic, metrics_provider, config)
92
+ session_factory = SessionFactoryImpl.new(connection_provider, retry_logic, config)
93
+ InternalDriver.new(security_plan, session_factory, metrics_provider, config[:logger]).tap do |driver|
94
+ config[:logger]&.info { "#{type} driver instance #{driver.object_id} created for server address #{address}" }
95
+ end
96
+ end
97
+
98
+ def create_load_balancer(address, connection_pool, eventExecutorGroup, config, routing_settings)
99
+ load_balancing_strategy = Cluster::Loadbalancing::LeastConnectedLoadBalancingStrategy.new(connection_pool, config[:logger])
100
+ resolver = create_resolver(config)
101
+ Cluster::Loadbalancing::LoadBalancer.new(
102
+ address, routing_settings, connection_pool, eventExecutorGroup,
103
+ config[:logger], load_balancing_strategy, resolver, &method(:domain_name_resolver))
104
+ end
105
+
106
+ def create_bootstrap(**args)
107
+ Async::Connection::BootstrapFactory.new_bootstrap(**args)
108
+ end
109
+
110
+ protected
111
+
112
+ def close_connection_pool_and_suppress_error(connection_pool, main_error)
113
+ connection_pool.close
114
+ rescue => close_error
115
+ Util::ErrorUtil.add_suppressed(main_error, close_error)
116
+ end
117
+
118
+ # def getDomainNameResolver(name)
119
+ # domain_name_resolver(name).map { |addrinfo| java.net.InetAddress.getByName(addrinfo.canonname) }.to_java(java.net.InetAddress)
120
+ # end
121
+
122
+ def domain_name_resolver(name)
123
+ @domain_name_resolver.call(name).flat_map { |n| Addrinfo.getaddrinfo(n, nil, nil, nil, Socket::IPPROTO_TCP) }
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,20 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Handlers
4
+ class BeginTxResponseHandler
5
+ include Spi::ResponseHandler
6
+
7
+ def on_success(_metadata)
8
+ end
9
+
10
+ def on_failure(error)
11
+ raise error
12
+ end
13
+
14
+ def on_record(fields)
15
+ raise "Transaction begin is not expected to receive records: #{fields}"
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Handlers
4
+ class ChannelReleasingResetResponseHandler < ResetResponseHandler
5
+ def initialize(channel, pool, message_dispatcher, log, release_future)
6
+ super(message_dispatcher, release_future)
7
+ @channel = channel
8
+ @pool = pool
9
+ @log = log
10
+ end
11
+
12
+ def reset_completed(success)
13
+ if success
14
+ # update the last-used timestamp before returning the channel back to the pool
15
+ # Async::Connection::ChannelAttributes.set_last_used_timestamp(@channel, @clock.millis)
16
+ # closure_stage = Util::Futures.completed_with_null
17
+ else
18
+ # close the channel before returning it back to the pool if RESET failed
19
+ @channel.close
20
+ end
21
+ rescue
22
+ nil
23
+ ensure
24
+ @pool.release(@channel)
25
+ @log.debug { "Channel #{@channel.object_id} released." }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,25 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Handlers
4
+ class CommitTxResponseHandler
5
+ include Spi::ResponseHandler
6
+
7
+ def initialize(result_holder)
8
+ @result_holder = result_holder
9
+ end
10
+
11
+ def on_success(metadata)
12
+ @result_holder.succeed(metadata[:bookmark]&.then(&InternalBookmark.method(:parse)))
13
+ end
14
+
15
+ def on_failure(error)
16
+ @result_holder.fail(error)
17
+ end
18
+
19
+ def on_record(fields)
20
+ raise "Transaction commit is not expected to receive records: #{fields}"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,65 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Handlers
4
+ class HelloResponseHandler
5
+ include Spi::ResponseHandler
6
+ CONNECTION_ID_METADATA_KEY = :connection_id
7
+ CONFIGURATION_HINTS_KEY = :hints
8
+ CONNECTION_RECEIVE_TIMEOUT_SECONDS_KEY = :'connection.recv_timeout_seconds'
9
+ delegate :attributes, to: :@channel
10
+
11
+ def initialize(channel, protocol_version)
12
+ @channel = channel
13
+ @protocol_version = protocol_version
14
+ end
15
+
16
+ def on_success(metadata)
17
+ begin
18
+ attributes[:server_agent] = Util::MetadataExtractor.extract_server(metadata)
19
+ # From Server V4 extracting server from metadata in the success message is unreliable
20
+ # so we fix the Server version against the Bolt Protocol version for Server V4 and above.
21
+ attributes[:server_version] =
22
+ if Messaging::V3::BoltProtocolV3::VERSION == @protocol_version
23
+ Util::MetadataExtractor.extract_neo4j_server_version(metadata)
24
+ else
25
+ Util::ServerVersion.from_bolt_protocol_version(@protocol_version)
26
+ end
27
+
28
+ attributes[:connection_id] = extract_connection_id(metadata)
29
+ process_configuration_hints(metadata)
30
+ rescue => error
31
+ on_failure(error)
32
+ raise error
33
+ end
34
+ end
35
+
36
+ def on_failure(error)
37
+ @channel.close
38
+ raise error ### Not sure about that
39
+ end
40
+
41
+ def on_record(_fields)
42
+ raise NotImplementedError
43
+ end
44
+
45
+ private
46
+
47
+ def extract_connection_id(metadata)
48
+ value = metadata[CONNECTION_ID_METADATA_KEY]
49
+
50
+ if value.nil?
51
+ raise Exceptions::IllegalStateException, "Unable to extract #{CONNECTION_ID_METADATA_KEY} from a response to HELLO message. Received metadata: #{metadata}"
52
+ end
53
+
54
+ value
55
+ end
56
+
57
+ def process_configuration_hints(metadata)
58
+ metadata[CONFIGURATION_HINTS_KEY]&.dig(CONNECTION_RECEIVE_TIMEOUT_SECONDS_KEY)&.tap do |value|
59
+ attributes[:connection_read_timeout] = value
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,34 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Handlers
4
+ class InitResponseHandler
5
+ include Spi::ResponseHandler
6
+
7
+ def initialize(connection_initialized_promise)
8
+ @connection_initialized_promise = connection_initialized_promise
9
+ @channel = connection_initialized_promise
10
+ end
11
+
12
+ def on_success(_metadata)
13
+ begin
14
+ server_version = Util::MetadataExtractor.extract_neo4j_server_version(metadata)
15
+ Async::Connection::ChannelAttributes.set_server_version(@channel, server_version)
16
+
17
+ @connection_initialized_promise.set_success
18
+ rescue StandardError => error
19
+ @connection_initialized_promise.set_failure(error)
20
+ raise error
21
+ end
22
+ end
23
+
24
+ def on_failure(error)
25
+ @channel.close.add_listener(-> (_future) { @connection_initialized_promise.set_failure(error) })
26
+ end
27
+
28
+ def on_record(fields)
29
+ raise java.lang.UnsupportedOperationException
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,199 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Handlers
4
+ # This is the Pull All response handler that handles pull all messages in Bolt v3 and previous protocol versions.
5
+ class LegacyPullAllResponseHandler
6
+ include Spi::ResponseHandler
7
+ RECORD_BUFFER_LOW_WATERMARK = ENV['record_buffer_low_watermark']&.to_i || 300
8
+ RECORD_BUFFER_HIGH_WATERMARK = ENV['record_buffer_high_watermark']&.to_i || 1000
9
+
10
+ def initialize(query, run_response_handler, connection, metadata_extractor, completion_listener)
11
+ @query = Internal::Validator.require_non_nil!(query)
12
+ @run_response_handler = Internal::Validator.require_non_nil!(run_response_handler)
13
+ @metadata_extractor = Internal::Validator.require_non_nil!(metadata_extractor)
14
+ @connection = Internal::Validator.require_non_nil!(connection)
15
+ @completion_listener = Internal::Validator.require_non_nil!(completion_listener)
16
+ @records = ::Async::Queue.new
17
+ end
18
+
19
+ def can_manage_auto_read?
20
+ true
21
+ end
22
+
23
+ def on_success(metadata)
24
+ @finished = true
25
+ @summary = extract_result_summary(metadata)
26
+
27
+ @completion_listener.after_success(metadata)
28
+
29
+ complete_record_future(nil)
30
+ complete_failure_future(nil)
31
+ end
32
+
33
+ def on_failure(error)
34
+ @finished = true
35
+ @summary = extract_result_summary({})
36
+
37
+ @completion_listener.after_failure(error)
38
+
39
+ failed_record_future = fail_record_future(error)
40
+
41
+ if failed_record_future
42
+ # error propagated through the record future
43
+ complete_failure_future(nil)
44
+ else
45
+ completed_failure_future = complete_failure_future(error)
46
+
47
+ # error has not been propagated to the user, remember it
48
+ @failure = error unless completed_failure_future
49
+ end
50
+ end
51
+
52
+ def on_record(fields)
53
+ if @ignore_records
54
+ complete_record_future(nil)
55
+ else
56
+ record = InternalRecord.new(@run_response_handler.query_keys, fields)
57
+ enqueue_record(record)
58
+ complete_record_future(record)
59
+ end
60
+ end
61
+
62
+ def disable_auto_read_management
63
+ @auto_read_management_enabled = false
64
+ end
65
+
66
+ def peek_async
67
+ while @records.empty? && !(@ignore_records || @finished)
68
+ @records.wait
69
+ end
70
+ @records.items.first&.then(&Util::ResultHolder.method(:successful)) or
71
+ @failure ? Util::ResultHolder.failed(extract_failure) : Util::ResultHolder.successful(nil)
72
+ end
73
+
74
+ def next_async
75
+ peek_async.then { |record| dequeue_record if record }
76
+ end
77
+
78
+ def consume_async
79
+ @ignore_records = true
80
+ @records.items.clear
81
+ pull_all_failure_async.result!&.then(&Util::ResultHolder.method(:failed)) or
82
+ Util::ResultHolder.successful(@summary)
83
+ end
84
+
85
+ def list_async(&block)
86
+ pull_all_failure_async.then do |error|
87
+ raise error if error
88
+ unless @finished
89
+ raise Exceptions::IllegalStateException, "Can't get records as list because SUCCESS or FAILURE did not arrive"
90
+ end
91
+ @records.items.map(&block)
92
+ ensure
93
+ @records.items.clear
94
+ end
95
+ end
96
+
97
+ def pre_populate_records
98
+ @connection.write_and_flush(Messaging::Request::PullAllMessage::PULL_ALL, self)
99
+ end
100
+
101
+ def pull_all_failure_async
102
+ if @failure
103
+ Util::ResultHolder.successful(extract_failure)
104
+ elsif @finished
105
+ Util::ResultHolder.successful
106
+ else
107
+ (@failed_future ||= Util::ResultHolder.new).tap do |_|
108
+ # neither SUCCESS nor FAILURE message has arrived, register future to be notified when it arrives
109
+ # future will be completed with null on SUCCESS and completed with Throwable on FAILURE
110
+ # enable auto-read, otherwise we might not read SUCCESS/FAILURE if records are not consumed
111
+ enable_auto_read
112
+ end
113
+ end
114
+ end
115
+
116
+ private
117
+
118
+ def enqueue_record(record)
119
+ @records << record
120
+
121
+ should_buffer_all_records = !@failure_future.nil?
122
+
123
+ # when failure is requested we have to buffer all remaining records and then return the error
124
+ # do not disable auto-read in this case, otherwise records will not be consumed and trailing
125
+ # SUCCESS or FAILURE message will not arrive as well, so callers will get stuck waiting for the error
126
+ if !should_buffer_all_records && @records.size > RECORD_BUFFER_HIGH_WATERMARK
127
+ # more than high watermark records are already queued, tell connection to stop auto-reading from network
128
+ # this is needed to deal with slow consumers, we do not want to buffer all records in memory if they are
129
+ # fetched from network faster than consumed
130
+ disable_auto_read
131
+ end
132
+ end
133
+
134
+ def dequeue_record
135
+ record = @records.dequeue
136
+
137
+ if @records.size < RECORD_BUFFER_LOW_WATERMARK
138
+ # less than low watermark records are now available in the buffer, tell connection to pre-fetch more
139
+ # and populate queue with new records from network
140
+ enable_auto_read
141
+ end
142
+
143
+ record
144
+ end
145
+
146
+ def records_as_list(map_function)
147
+ unless @finished
148
+ raise Exceptions::IllegalStateException, "Can't get records as list because SUCCESS or FAILURE did not arrive"
149
+ end
150
+
151
+ result = []
152
+
153
+ @records.each do |record|
154
+ result << map_function.apply(record)
155
+ end
156
+
157
+ @records.items.clear
158
+ result
159
+ end
160
+
161
+ def extract_failure
162
+ @failure or raise Exceptions::IllegalStateException, "Can't extract failure because it does not exist"
163
+ ensure
164
+ @failure = nil # propagate failure only once
165
+ end
166
+
167
+ def complete_record_future(record)
168
+ @record_future&.succeed(record)
169
+ @record_future = nil
170
+ end
171
+
172
+ def fail_record_future(error)
173
+ @record_future&.fail(error)
174
+ ensure
175
+ @record_future = nil
176
+ end
177
+
178
+ def complete_failure_future(error)
179
+ @failure_future&.fail(error)
180
+ ensure
181
+ @failure_future = nil
182
+ end
183
+
184
+ def extract_result_summary(metadata)
185
+ result_available_after = @run_response_handler.result_available_after
186
+ @metadata_extractor.extract_summary(@query, @connection, result_available_after, metadata)
187
+ end
188
+
189
+ def enable_auto_read
190
+ @connection.enable_auto_read if @auto_read_management_enabled
191
+ end
192
+
193
+ def disable_auto_read
194
+ @connection.disable_auto_read if @auto_read_management_enabled
195
+ end
196
+ end
197
+ end
198
+ end
199
+ end
@@ -0,0 +1,16 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Handlers
4
+ class NoOpResponseHandler
5
+ include Spi::ResponseHandler
6
+ INSTANCE = new
7
+
8
+ def on_success(metadata) end
9
+
10
+ def on_failure(error) end
11
+
12
+ def on_record(fields) end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,29 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Handlers
4
+ class PingResponseHandler
5
+ include Spi::ResponseHandler
6
+
7
+ def initialize(result, channel, logger)
8
+ @result = result
9
+ @channel = channel
10
+ @log = logger
11
+ end
12
+
13
+ def on_success(_metadata)
14
+ @log.debug("Channel #{@channel} pinged successfully")
15
+ @result.set_success(true)
16
+ end
17
+
18
+ def on_failure(error)
19
+ @log.debug("Channel #{@channel} failed ping #{error}")
20
+ @result.set_success(false)
21
+ end
22
+
23
+ def on_record(fields)
24
+ raise java.lang.UnsupportedOperationException
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,32 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Handlers
4
+ class PullHandlers
5
+ include Spi::ResponseHandler
6
+
7
+ class << self
8
+ def new_bolt_v3_pull_all_handler(query, run_handler, connection, bookmark_holder, tx)
9
+ completion_listener = create_pull_response_completion_listener(connection, bookmark_holder, tx)
10
+ LegacyPullAllResponseHandler.new(query, run_handler, connection, Messaging::V3::BoltProtocolV3::METADATA_EXTRACTOR, completion_listener)
11
+ end
12
+
13
+ def new_bolt_v4_auto_pull_handler(query, run_handler, connection, bookmark_holder, tx, fetch_size)
14
+ completion_listener = create_pull_response_completion_listener(connection, bookmark_holder, tx)
15
+ Pulln::AutoPullResponseHandler.new(query, run_handler, connection, Messaging::V3::BoltProtocolV3::METADATA_EXTRACTOR, completion_listener, fetch_size)
16
+ end
17
+
18
+ def new_bolt_v4_basic_pull_handler(query, run_handler, connection, bookmark_holder, tx)
19
+ completion_listener = create_pull_response_completion_listener(connection, bookmark_holder, tx)
20
+ Pulln::BasicPullResponseHandler.new(query, run_handler, connection, Messaging::V3::BoltProtocolV3::METADATA_EXTRACTOR, completion_listener)
21
+ end
22
+
23
+ private
24
+
25
+ def create_pull_response_completion_listener(connection, bookmark_holder, tx)
26
+ tx.nil? ? SessionPullResponseCompletionListener.new(connection, bookmark_holder) : TransactionPullResponseCompletionListener.new(tx)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end