neo4j-ruby-driver 5.7.0.alpha.4 → 6.0.3.alpha.0-java

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 (279) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +440 -40
  3. data/jruby/neo4j/driver/ext/async_converter.rb +55 -0
  4. data/jruby/neo4j/driver/ext/auth_tokens.rb +20 -0
  5. data/jruby/neo4j/driver/ext/config_converter.rb +83 -0
  6. data/jruby/neo4j/driver/ext/exception_checkable.rb +34 -0
  7. data/jruby/neo4j/driver/ext/exception_mapper.rb +92 -0
  8. data/jruby/neo4j/driver/ext/graph_database.rb +33 -0
  9. data/jruby/neo4j/driver/ext/internal/abstract_query_runner.rb +18 -0
  10. data/jruby/neo4j/driver/ext/internal/async/internal_async_session.rb +23 -0
  11. data/jruby/neo4j/driver/ext/internal/cluster/routing_table_registry_impl.rb +15 -0
  12. data/jruby/neo4j/driver/ext/internal/cursor/disposable_async_result_cursor.rb +15 -0
  13. data/jruby/neo4j/driver/ext/internal/driver_factory.rb +24 -0
  14. data/jruby/neo4j/driver/ext/internal/eager_result_value.rb +17 -0
  15. data/jruby/neo4j/driver/ext/internal/metrics/internal_connection_pool_metrics.rb +17 -0
  16. data/jruby/neo4j/driver/ext/internal/summary/internal_notification.rb +27 -0
  17. data/jruby/neo4j/driver/ext/internal/summary/internal_plan.rb +26 -0
  18. data/jruby/neo4j/driver/ext/internal/summary/internal_result_summary.rb +34 -0
  19. data/jruby/neo4j/driver/ext/internal_driver.rb +52 -0
  20. data/jruby/neo4j/driver/ext/internal_entity.rb +21 -0
  21. data/jruby/neo4j/driver/ext/internal_keys.rb +15 -0
  22. data/jruby/neo4j/driver/ext/internal_node.rb +13 -0
  23. data/jruby/neo4j/driver/ext/internal_record.rb +29 -0
  24. data/jruby/neo4j/driver/ext/internal_relationship.rb +13 -0
  25. data/jruby/neo4j/driver/ext/internal_result.rb +27 -0
  26. data/jruby/neo4j/driver/ext/internal_session.rb +44 -0
  27. data/jruby/neo4j/driver/ext/internal_transaction.rb +19 -0
  28. data/jruby/neo4j/driver/ext/logger.rb +60 -0
  29. data/jruby/neo4j/driver/ext/map_converter.rb +14 -0
  30. data/jruby/neo4j/driver/ext/neo_converter.rb +59 -0
  31. data/jruby/neo4j/driver/ext/query.rb +13 -0
  32. data/jruby/neo4j/driver/ext/ruby_converter.rb +57 -0
  33. data/jruby/neo4j/driver/ext/run_override.rb +22 -0
  34. data/jruby/neo4j/driver/ext/start_end_naming.rb +17 -0
  35. data/{ruby → jruby}/neo4j/driver/version.rb +1 -1
  36. data/jruby/neo4j/driver.rb +62 -0
  37. data/lib/neo4j/driver/{auto_closable.rb → auto_closeable.rb} +6 -6
  38. data/lib/neo4j/driver/exceptions/neo4j_exception.rb +6 -6
  39. data/lib/neo4j/driver/internal/deprecator.rb +15 -0
  40. metadata +91 -277
  41. data/ruby/neo4j/driver/access_mode.rb +0 -10
  42. data/ruby/neo4j/driver/auth_tokens.rb +0 -34
  43. data/ruby/neo4j/driver/bookmark.rb +0 -21
  44. data/ruby/neo4j/driver/config.rb +0 -89
  45. data/ruby/neo4j/driver/graph_database.rb +0 -78
  46. data/ruby/neo4j/driver/internal/async/connection/bolt_protocol_util.rb +0 -51
  47. data/ruby/neo4j/driver/internal/async/connection/bootstrap_factory.rb +0 -22
  48. data/ruby/neo4j/driver/internal/async/connection/channel_attributes.rb +0 -31
  49. data/ruby/neo4j/driver/internal/async/connection/channel_connected_listener.rb +0 -32
  50. data/ruby/neo4j/driver/internal/async/connection/channel_connector_impl.rb +0 -83
  51. data/ruby/neo4j/driver/internal/async/connection/channel_pipeline_builder_impl.rb +0 -22
  52. data/ruby/neo4j/driver/internal/async/connection/direct_connection.rb +0 -30
  53. data/ruby/neo4j/driver/internal/async/connection/event_loop_group_factory.rb +0 -83
  54. data/ruby/neo4j/driver/internal/async/connection/handshake_completed_listener.rb +0 -27
  55. data/ruby/neo4j/driver/internal/async/connection/handshake_handler.rb +0 -113
  56. data/ruby/neo4j/driver/internal/async/connection/netty_channel_initializer.rb +0 -57
  57. data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver.rb +0 -26
  58. data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver_group.rb +0 -19
  59. data/ruby/neo4j/driver/internal/async/connection/routing_connection.rb +0 -36
  60. data/ruby/neo4j/driver/internal/async/connection/stream.rb +0 -12
  61. data/ruby/neo4j/driver/internal/async/connection/stream_reader.rb +0 -16
  62. data/ruby/neo4j/driver/internal/async/connection_context.rb +0 -10
  63. data/ruby/neo4j/driver/internal/async/immutable_connection_context.rb +0 -24
  64. data/ruby/neo4j/driver/internal/async/inbound/byte_buf_input.rb +0 -30
  65. data/ruby/neo4j/driver/internal/async/inbound/channel_error_handler.rb +0 -77
  66. data/ruby/neo4j/driver/internal/async/inbound/chunk_decoder.rb +0 -41
  67. data/ruby/neo4j/driver/internal/async/inbound/connect_timeout_handler.rb +0 -32
  68. data/ruby/neo4j/driver/internal/async/inbound/connection_read_timeout_handler.rb +0 -17
  69. data/ruby/neo4j/driver/internal/async/inbound/inbound_message_dispatcher.rb +0 -171
  70. data/ruby/neo4j/driver/internal/async/inbound/inbound_message_handler.rb +0 -42
  71. data/ruby/neo4j/driver/internal/async/inbound/message_decoder.rb +0 -51
  72. data/ruby/neo4j/driver/internal/async/internal_async_session.rb +0 -98
  73. data/ruby/neo4j/driver/internal/async/internal_async_transaction.rb +0 -13
  74. data/ruby/neo4j/driver/internal/async/leak_logging_network_session.rb +0 -34
  75. data/ruby/neo4j/driver/internal/async/network_connection.rb +0 -194
  76. data/ruby/neo4j/driver/internal/async/network_session.rb +0 -150
  77. data/ruby/neo4j/driver/internal/async/outbound/chunk_aware_byte_buf_output.rb +0 -110
  78. data/ruby/neo4j/driver/internal/async/outbound/outbound_message_handler.rb +0 -39
  79. data/ruby/neo4j/driver/internal/async/pool/channel.rb +0 -66
  80. data/ruby/neo4j/driver/internal/async/pool/channel_pool.rb +0 -31
  81. data/ruby/neo4j/driver/internal/async/pool/channel_tracker.rb +0 -135
  82. data/ruby/neo4j/driver/internal/async/pool/connection_pool_impl.rb +0 -156
  83. data/ruby/neo4j/driver/internal/async/pool/netty_channel_health_checker.rb +0 -87
  84. data/ruby/neo4j/driver/internal/async/pool/netty_channel_pool.rb +0 -52
  85. data/ruby/neo4j/driver/internal/async/pool/network_connection_factory.rb +0 -21
  86. data/ruby/neo4j/driver/internal/async/pool/pool_settings.rb +0 -34
  87. data/ruby/neo4j/driver/internal/async/pool/timed_stack.rb +0 -15
  88. data/ruby/neo4j/driver/internal/async/result_cursors_holder.rb +0 -17
  89. data/ruby/neo4j/driver/internal/async/unmanaged_transaction.rb +0 -212
  90. data/ruby/neo4j/driver/internal/bookmark_holder.rb +0 -9
  91. data/ruby/neo4j/driver/internal/cluster/cluster_composition.rb +0 -48
  92. data/ruby/neo4j/driver/internal/cluster/cluster_composition_lookup_result.rb +0 -14
  93. data/ruby/neo4j/driver/internal/cluster/cluster_routing_table.rb +0 -122
  94. data/ruby/neo4j/driver/internal/cluster/identity_resolver.rb +0 -10
  95. data/ruby/neo4j/driver/internal/cluster/loadbalancing/least_connected_load_balancing_strategy.rb +0 -68
  96. data/ruby/neo4j/driver/internal/cluster/loadbalancing/load_balancer.rb +0 -125
  97. data/ruby/neo4j/driver/internal/cluster/loadbalancing/round_robin_array_index.rb +0 -13
  98. data/ruby/neo4j/driver/internal/cluster/multi_databases_routing_procedure_runner.rb +0 -31
  99. data/ruby/neo4j/driver/internal/cluster/rediscovery_impl.rb +0 -147
  100. data/ruby/neo4j/driver/internal/cluster/route_message_routing_procedure_runner.rb +0 -43
  101. data/ruby/neo4j/driver/internal/cluster/routing_context.rb +0 -77
  102. data/ruby/neo4j/driver/internal/cluster/routing_procedure_cluster_composition_provider.rb +0 -60
  103. data/ruby/neo4j/driver/internal/cluster/routing_procedure_response.rb +0 -35
  104. data/ruby/neo4j/driver/internal/cluster/routing_settings.rb +0 -24
  105. data/ruby/neo4j/driver/internal/cluster/routing_table_handler_impl.rb +0 -95
  106. data/ruby/neo4j/driver/internal/cluster/routing_table_registry_impl.rb +0 -121
  107. data/ruby/neo4j/driver/internal/cluster/single_database_routing_procedure_runner.rb +0 -73
  108. data/ruby/neo4j/driver/internal/connection_settings.rb +0 -16
  109. data/ruby/neo4j/driver/internal/cursor/async_result_cursor_impl.rb +0 -55
  110. data/ruby/neo4j/driver/internal/cursor/async_result_cursor_only_factory.rb +0 -24
  111. data/ruby/neo4j/driver/internal/cursor/disposable_async_result_cursor.rb +0 -61
  112. data/ruby/neo4j/driver/internal/cursor/result_cursor_factory_impl.rb +0 -24
  113. data/ruby/neo4j/driver/internal/cursor/rx_result_cursor_impl.rb +0 -110
  114. data/ruby/neo4j/driver/internal/database_name_util.rb +0 -37
  115. data/ruby/neo4j/driver/internal/default_bookmark_holder.rb +0 -9
  116. data/ruby/neo4j/driver/internal/default_domain_name_resolver.rb +0 -11
  117. data/ruby/neo4j/driver/internal/direct_connection_provider.rb +0 -40
  118. data/ruby/neo4j/driver/internal/driver_factory.rb +0 -126
  119. data/ruby/neo4j/driver/internal/handlers/begin_tx_response_handler.rb +0 -20
  120. data/ruby/neo4j/driver/internal/handlers/channel_releasing_reset_response_handler.rb +0 -30
  121. data/ruby/neo4j/driver/internal/handlers/commit_tx_response_handler.rb +0 -25
  122. data/ruby/neo4j/driver/internal/handlers/hello_response_handler.rb +0 -65
  123. data/ruby/neo4j/driver/internal/handlers/init_response_handler.rb +0 -34
  124. data/ruby/neo4j/driver/internal/handlers/legacy_pull_all_response_handler.rb +0 -199
  125. data/ruby/neo4j/driver/internal/handlers/no_op_response_handler.rb +0 -16
  126. data/ruby/neo4j/driver/internal/handlers/ping_response_handler.rb +0 -29
  127. data/ruby/neo4j/driver/internal/handlers/pull_handlers.rb +0 -32
  128. data/ruby/neo4j/driver/internal/handlers/pulln/auto_pull_response_handler.rb +0 -168
  129. data/ruby/neo4j/driver/internal/handlers/pulln/basic_pull_response_handler.rb +0 -298
  130. data/ruby/neo4j/driver/internal/handlers/pulln/fetch_size_util.rb +0 -20
  131. data/ruby/neo4j/driver/internal/handlers/reset_response_handler.rb +0 -34
  132. data/ruby/neo4j/driver/internal/handlers/rollback_tx_response_handler.rb +0 -25
  133. data/ruby/neo4j/driver/internal/handlers/route_message_response_handler.rb +0 -21
  134. data/ruby/neo4j/driver/internal/handlers/routing_response_handler.rb +0 -70
  135. data/ruby/neo4j/driver/internal/handlers/run_response_handler.rb +0 -38
  136. data/ruby/neo4j/driver/internal/handlers/session_pull_response_completion_listener.rb +0 -34
  137. data/ruby/neo4j/driver/internal/handlers/transaction_pull_response_completion_listener.rb +0 -20
  138. data/ruby/neo4j/driver/internal/impersonation_util.rb +0 -22
  139. data/ruby/neo4j/driver/internal/internal_bookmark.rb +0 -36
  140. data/ruby/neo4j/driver/internal/internal_database_name.rb +0 -9
  141. data/ruby/neo4j/driver/internal/internal_driver.rb +0 -74
  142. data/ruby/neo4j/driver/internal/internal_entity.rb +0 -21
  143. data/ruby/neo4j/driver/internal/internal_node.rb +0 -21
  144. data/ruby/neo4j/driver/internal/internal_pair.rb +0 -9
  145. data/ruby/neo4j/driver/internal/internal_path.rb +0 -35
  146. data/ruby/neo4j/driver/internal/internal_point2_d.rb +0 -9
  147. data/ruby/neo4j/driver/internal/internal_point3_d.rb +0 -6
  148. data/ruby/neo4j/driver/internal/internal_record.rb +0 -27
  149. data/ruby/neo4j/driver/internal/internal_relationship.rb +0 -27
  150. data/ruby/neo4j/driver/internal/internal_result.rb +0 -49
  151. data/ruby/neo4j/driver/internal/internal_session.rb +0 -81
  152. data/ruby/neo4j/driver/internal/internal_transaction.rb +0 -48
  153. data/ruby/neo4j/driver/internal/logging/channel_activity_logger.rb +0 -29
  154. data/ruby/neo4j/driver/internal/logging/channel_error_logger.rb +0 -17
  155. data/ruby/neo4j/driver/internal/logging/prefixed_logger.rb +0 -19
  156. data/ruby/neo4j/driver/internal/logging/reformatted_logger.rb +0 -17
  157. data/ruby/neo4j/driver/internal/messaging/abstract_message_writer.rb +0 -23
  158. data/ruby/neo4j/driver/internal/messaging/bolt_protocol.rb +0 -32
  159. data/ruby/neo4j/driver/internal/messaging/bolt_protocol_version.rb +0 -48
  160. data/ruby/neo4j/driver/internal/messaging/common/common_message_reader.rb +0 -51
  161. data/ruby/neo4j/driver/internal/messaging/common/common_value.rb +0 -33
  162. data/ruby/neo4j/driver/internal/messaging/common/common_value_packer.rb +0 -104
  163. data/ruby/neo4j/driver/internal/messaging/common/common_value_unpacker.rb +0 -256
  164. data/ruby/neo4j/driver/internal/messaging/encode/begin_message_encoder.rb +0 -15
  165. data/ruby/neo4j/driver/internal/messaging/encode/commit_message_encoder.rb +0 -14
  166. data/ruby/neo4j/driver/internal/messaging/encode/discard_all_message_encoder.rb +0 -14
  167. data/ruby/neo4j/driver/internal/messaging/encode/discard_message_encoder.rb +0 -15
  168. data/ruby/neo4j/driver/internal/messaging/encode/goodbye_message_encoder.rb +0 -14
  169. data/ruby/neo4j/driver/internal/messaging/encode/hello_message_encoder.rb +0 -15
  170. data/ruby/neo4j/driver/internal/messaging/encode/init_message_encoder.rb +0 -16
  171. data/ruby/neo4j/driver/internal/messaging/encode/logoff_message_encoder.rb +0 -14
  172. data/ruby/neo4j/driver/internal/messaging/encode/logon_message_encoder.rb +0 -15
  173. data/ruby/neo4j/driver/internal/messaging/encode/pull_all_message_encoder.rb +0 -14
  174. data/ruby/neo4j/driver/internal/messaging/encode/pull_message_encoder.rb +0 -15
  175. data/ruby/neo4j/driver/internal/messaging/encode/reset_message_encoder.rb +0 -14
  176. data/ruby/neo4j/driver/internal/messaging/encode/rollback_message_encoder.rb +0 -14
  177. data/ruby/neo4j/driver/internal/messaging/encode/route_message_encoder.rb +0 -24
  178. data/ruby/neo4j/driver/internal/messaging/encode/route_v44_message_encoder.rb +0 -22
  179. data/ruby/neo4j/driver/internal/messaging/encode/run_message_encoder.rb +0 -16
  180. data/ruby/neo4j/driver/internal/messaging/encode/run_with_metadata_message_encoder.rb +0 -17
  181. data/ruby/neo4j/driver/internal/messaging/request/abstract_streaming_message.rb +0 -25
  182. data/ruby/neo4j/driver/internal/messaging/request/begin_message.rb +0 -25
  183. data/ruby/neo4j/driver/internal/messaging/request/commit_message.rb +0 -20
  184. data/ruby/neo4j/driver/internal/messaging/request/discard_all_message.rb +0 -20
  185. data/ruby/neo4j/driver/internal/messaging/request/discard_message.rb +0 -23
  186. data/ruby/neo4j/driver/internal/messaging/request/goodbye_message.rb +0 -20
  187. data/ruby/neo4j/driver/internal/messaging/request/hello_message.rb +0 -30
  188. data/ruby/neo4j/driver/internal/messaging/request/init_message.rb +0 -19
  189. data/ruby/neo4j/driver/internal/messaging/request/logoff_message.rb +0 -13
  190. data/ruby/neo4j/driver/internal/messaging/request/logon_message.rb +0 -13
  191. data/ruby/neo4j/driver/internal/messaging/request/message_with_metadata.rb +0 -17
  192. data/ruby/neo4j/driver/internal/messaging/request/multi_database_util.rb +0 -26
  193. data/ruby/neo4j/driver/internal/messaging/request/pull_all_message.rb +0 -23
  194. data/ruby/neo4j/driver/internal/messaging/request/pull_message.rb +0 -22
  195. data/ruby/neo4j/driver/internal/messaging/request/reset_message.rb +0 -32
  196. data/ruby/neo4j/driver/internal/messaging/request/rollback_message.rb +0 -20
  197. data/ruby/neo4j/driver/internal/messaging/request/route_message.rb +0 -28
  198. data/ruby/neo4j/driver/internal/messaging/request/run_message.rb +0 -23
  199. data/ruby/neo4j/driver/internal/messaging/request/run_with_metadata_message.rb +0 -49
  200. data/ruby/neo4j/driver/internal/messaging/request/transaction_metadata_builder.rb +0 -24
  201. data/ruby/neo4j/driver/internal/messaging/response/failure_message.rb +0 -40
  202. data/ruby/neo4j/driver/internal/messaging/response/ignored_message.rb +0 -29
  203. data/ruby/neo4j/driver/internal/messaging/response/record_message.rb +0 -33
  204. data/ruby/neo4j/driver/internal/messaging/response/success_message.rb +0 -34
  205. data/ruby/neo4j/driver/internal/messaging/v3/bolt_protocol_v3.rb +0 -82
  206. data/ruby/neo4j/driver/internal/messaging/v3/message_format_v3.rb +0 -17
  207. data/ruby/neo4j/driver/internal/messaging/v3/message_writer_v3.rb +0 -27
  208. data/ruby/neo4j/driver/internal/messaging/v4/bolt_protocol_v4.rb +0 -29
  209. data/ruby/neo4j/driver/internal/messaging/v4/message_format_v4.rb +0 -13
  210. data/ruby/neo4j/driver/internal/messaging/v4/message_writer_v4.rb +0 -17
  211. data/ruby/neo4j/driver/internal/messaging/v41/bolt_protocol_v41.rb +0 -25
  212. data/ruby/neo4j/driver/internal/messaging/v42/bolt_protocol_v42.rb +0 -13
  213. data/ruby/neo4j/driver/internal/messaging/v43/bolt_protocol_v43.rb +0 -19
  214. data/ruby/neo4j/driver/internal/messaging/v43/message_format_v43.rb +0 -14
  215. data/ruby/neo4j/driver/internal/messaging/v43/message_writer_v43.rb +0 -20
  216. data/ruby/neo4j/driver/internal/messaging/v44/bolt_protocol_v44.rb +0 -17
  217. data/ruby/neo4j/driver/internal/messaging/v44/message_format_v44.rb +0 -14
  218. data/ruby/neo4j/driver/internal/messaging/v44/message_writer_v44.rb +0 -15
  219. data/ruby/neo4j/driver/internal/messaging/v5/bolt_protocol_v5.rb +0 -21
  220. data/ruby/neo4j/driver/internal/messaging/v5/message_format_v5.rb +0 -18
  221. data/ruby/neo4j/driver/internal/messaging/v5/value_unpacker_v5.rb +0 -17
  222. data/ruby/neo4j/driver/internal/messaging/v51/bolt_protocol_v51.rb +0 -40
  223. data/ruby/neo4j/driver/internal/messaging/v51/message_format_v51.rb +0 -14
  224. data/ruby/neo4j/driver/internal/messaging/v51/message_writer_v51.rb +0 -17
  225. data/ruby/neo4j/driver/internal/metrics/connection_pool_metrics_listener.rb +0 -34
  226. data/ruby/neo4j/driver/internal/metrics/internal_abstract_metrics.rb +0 -46
  227. data/ruby/neo4j/driver/internal/metrics/internal_connection_pool_metrics.rb +0 -105
  228. data/ruby/neo4j/driver/internal/metrics/internal_metrics.rb +0 -82
  229. data/ruby/neo4j/driver/internal/metrics/internal_metrics_provider.rb +0 -18
  230. data/ruby/neo4j/driver/internal/metrics/listener_event.rb +0 -17
  231. data/ruby/neo4j/driver/internal/metrics/metrics_provider.rb +0 -24
  232. data/ruby/neo4j/driver/internal/metrics/time_recorder_listener_event.rb +0 -15
  233. data/ruby/neo4j/driver/internal/packstream/byte_array_incompatible_packer.rb +0 -12
  234. data/ruby/neo4j/driver/internal/packstream/pack_input.rb +0 -47
  235. data/ruby/neo4j/driver/internal/packstream/pack_output.rb +0 -39
  236. data/ruby/neo4j/driver/internal/packstream/pack_stream.rb +0 -326
  237. data/ruby/neo4j/driver/internal/packstream/pack_type.rb +0 -17
  238. data/ruby/neo4j/driver/internal/read_only_bookmark_holder.rb +0 -13
  239. data/ruby/neo4j/driver/internal/resolved_bolt_server_address.rb +0 -35
  240. data/ruby/neo4j/driver/internal/retry/exponential_backoff_retry_logic.rb +0 -151
  241. data/ruby/neo4j/driver/internal/revocation_strategy.rb +0 -19
  242. data/ruby/neo4j/driver/internal/scheme.rb +0 -32
  243. data/ruby/neo4j/driver/internal/security/internal_auth_token.rb +0 -15
  244. data/ruby/neo4j/driver/internal/security/security_plan_impl.rb +0 -48
  245. data/ruby/neo4j/driver/internal/security_setting.rb +0 -66
  246. data/ruby/neo4j/driver/internal/session_factory_impl.rb +0 -32
  247. data/ruby/neo4j/driver/internal/spi/connection.rb +0 -19
  248. data/ruby/neo4j/driver/internal/spi/connection_pool.rb +0 -9
  249. data/ruby/neo4j/driver/internal/spi/response_handler.rb +0 -23
  250. data/ruby/neo4j/driver/internal/summary/internal_database_info.rb +0 -7
  251. data/ruby/neo4j/driver/internal/summary/internal_input_position.rb +0 -11
  252. data/ruby/neo4j/driver/internal/summary/internal_notification.rb +0 -16
  253. data/ruby/neo4j/driver/internal/summary/internal_plan.rb +0 -41
  254. data/ruby/neo4j/driver/internal/summary/internal_profiled_plan.rb +0 -32
  255. data/ruby/neo4j/driver/internal/summary/internal_result_summary.rb +0 -33
  256. data/ruby/neo4j/driver/internal/summary/internal_server_info.rb +0 -6
  257. data/ruby/neo4j/driver/internal/summary/internal_summary_counters.rb +0 -18
  258. data/ruby/neo4j/driver/internal/svm/netty_substitutions.rb +0 -196
  259. data/ruby/neo4j/driver/internal/svm/z_lib_substitutions.rb +0 -21
  260. data/ruby/neo4j/driver/internal/util/certificate_tool.rb +0 -65
  261. data/ruby/neo4j/driver/internal/util/clock.rb +0 -29
  262. data/ruby/neo4j/driver/internal/util/error_util.rb +0 -104
  263. data/ruby/neo4j/driver/internal/util/extract.rb +0 -123
  264. data/ruby/neo4j/driver/internal/util/format.rb +0 -39
  265. data/ruby/neo4j/driver/internal/util/futures.rb +0 -99
  266. data/ruby/neo4j/driver/internal/util/iterables.rb +0 -35
  267. data/ruby/neo4j/driver/internal/util/lock_util.rb +0 -23
  268. data/ruby/neo4j/driver/internal/util/metadata_extractor.rb +0 -107
  269. data/ruby/neo4j/driver/internal/util/mutex.rb +0 -9
  270. data/ruby/neo4j/driver/internal/util/preconditions.rb +0 -16
  271. data/ruby/neo4j/driver/internal/util/result_holder.rb +0 -72
  272. data/ruby/neo4j/driver/internal/util/server_version.rb +0 -60
  273. data/ruby/neo4j/driver/logging1.rb +0 -51
  274. data/ruby/neo4j/driver/net/server_address.rb +0 -9
  275. data/ruby/neo4j/driver/query.rb +0 -48
  276. data/ruby/neo4j/driver/records.rb +0 -13
  277. data/ruby/neo4j/driver/transaction_config.rb +0 -50
  278. data/ruby/neo4j/driver/values.rb +0 -26
  279. data/ruby/neo4j/driver.rb +0 -28
@@ -1,147 +0,0 @@
1
- module Neo4j::Driver
2
- module Internal
3
- module Cluster
4
- class RediscoveryImpl
5
- NO_ROUTERS_AVAILABLE = "Could not perform discovery for database '%s'. No routing server available."
6
- RECOVERABLE_ROUTING_ERROR = "Failed to update routing table with server '%s'."
7
- RECOVERABLE_DISCOVERY_ERROR_WITH_SERVER = "Received a recoverable discovery error with server '%s', will continue discovery with other routing servers if available. Complete failure is reported separately from this entry."
8
- INVALID_BOOKMARK_CODE = 'Neo.ClientError.Transaction.InvalidBookmark'
9
- INVALID_BOOKMARK_MIXTURE_CODE = 'Neo.ClientError.Transaction.InvalidBookmarkMixture'
10
-
11
- def initialize(initial_router, settings, provider, event_executor_group, resolver, logger, domain_name_resolver)
12
- @initial_router = initial_router
13
- @settings = settings
14
- @log = logger
15
- @provider = provider
16
- @resolver = resolver
17
- @event_executor_group = event_executor_group
18
- @domain_name_resolver = Internal::Validator.require_non_nil!(domain_name_resolver)
19
- end
20
-
21
- # Given a database and its current routing table, and the global connection pool, use the global cluster composition provider to fetch a new cluster
22
- # composition, which would be used to update the routing table of the given database and global connection pool.
23
-
24
- # @param routingTable current routing table of the given database.
25
- # @param connectionPool connection pool.
26
- # @return new cluster composition and an optional set of resolved initial router addresses.
27
- def lookup_cluster_composition(
28
- routing_table, connection_pool, bookmark, impersonated_user,
29
- failures = 0,
30
- previous_delay = 0,
31
- base_error = Exceptions::ServiceUnavailableException.new(NO_ROUTERS_AVAILABLE % routing_table.database.description))
32
-
33
- lookup(routing_table, connection_pool, bookmark, impersonated_user, base_error) ||
34
- if failures > @settings.max_routing_failures
35
- # now we throw our saved error out
36
- raise base_error
37
- else
38
- next_delay = [@settings.retry_timeout_delay, previous_delay * 2].max
39
- @log.info("Unable to fetch new routing table, will try again in #{next_delay} ms")
40
- sleep next_delay
41
- lookup_cluster_composition(routing_table, connection_pool, bookmark, impersonated_user, failures + 1, next_delay, base_error)
42
- end
43
- end
44
-
45
- def resolve
46
- exception = nil
47
-
48
- resolved_addresses = @resolver.call(@initial_router).flat_map do |server_address|
49
- resolve_all_by_domain_name(server_address).unicast_stream
50
- # rescue java.net.UnknownHostException => e
51
- rescue SocketError => e
52
- exception ||= e
53
- []
54
- end
55
-
56
- # give up only if there are no addresses to work with at all
57
- raise exception if resolved_addresses.empty? && exception
58
-
59
- resolved_addresses
60
- end
61
-
62
- private
63
-
64
- def lookup(routing_table, connection_pool, bookmark, impersonated_user, base_error)
65
- if routing_table.prefer_initial_router
66
- lookup_on_initial_router_then_on_known_routers(routing_table, connection_pool, bookmark, impersonated_user, base_error)
67
- else
68
- lookup_on_known_routers_then_on_initial_router(routing_table, connection_pool, bookmark, impersonated_user, base_error)
69
- end
70
- end
71
-
72
- def lookup_on_known_routers_then_on_initial_router(routing_table, connection_pool, bookmark, impersonated_user, base_error)
73
- seen_servers = Set.new
74
- lookup_on_known_routers(routing_table, connection_pool, seen_servers, bookmark, impersonated_user, base_error) ||
75
- lookup_on_initial_router(routing_table, connection_pool, seen_servers, bookmark, impersonated_user, base_error)
76
- end
77
-
78
- def lookup_on_initial_router_then_on_known_routers(routing_table, connection_pool, bookmark, impersonated_user, base_error)
79
- lookup_on_initial_router(routing_table, connection_pool, Set.new, bookmark, impersonated_user, base_error) ||
80
- lookup_on_known_routers(routing_table, connection_pool, Set.new, bookmark, impersonated_user, base_error)
81
- end
82
-
83
- def lookup_on_known_routers(routing_table, connection_pool, seen_servers, bookmark, impersonated_user, base_error)
84
- routing_table.routers.lazy.map do |address|
85
- lookup_on_router(address, true, routing_table, connection_pool, seen_servers, bookmark, impersonated_user, base_error)
86
- end.first&.then(&ClusterCompositionLookupResult.method(:new))
87
- end
88
-
89
- def lookup_on_initial_router(routing_table, connection_pool, seen_servers, bookmark, impersonated_user, base_error)
90
- resolved_routers = resolve
91
- (resolved_routers - seen_servers.to_a).lazy.filter_map do |address|
92
- lookup_on_router(address, false, routing_table, connection_pool, nil, bookmark,
93
- impersonated_user, base_error)
94
- end.first&.then { |composition| ClusterCompositionLookupResult.new(composition, Set.new(resolved_routers)) }
95
- end
96
-
97
- def lookup_on_router(router_address, resolve_address, routing_table, connection_pool, seen_servers, bookmark, impersonated_user, base_error)
98
- address = resolve_address ? resolve_by_domain_name_or_throw_completion_exception(router_address, routing_table) : router_address
99
- seen_servers&.send(:<<, address)
100
- connection = connection_pool.acquire(address)
101
- ImpersonationUtil.ensure_impersonation_support(connection, impersonated_user)
102
- @provider.get_cluster_composition(connection, routing_table.database, bookmark, impersonated_user)
103
- rescue => error
104
- handle_routing_procedure_error(error, routing_table, router_address, base_error)
105
- end
106
-
107
- def handle_routing_procedure_error(error, routing_table, router_address, base_error)
108
- raise error if must_abort_discovery(error)
109
-
110
- # Retriable error happened during discovery.
111
- discovery_error = Exceptions::DiscoveryException.new(nil, RECOVERABLE_ROUTING_ERROR % router_address, error)
112
- Util::Futures.combine_errors(base_error, discovery_error) # we record each failure here
113
- warning_message = RECOVERABLE_DISCOVERY_ERROR_WITH_SERVER % router_address
114
- @log.warn(warning_message)
115
- @log.debug(discovery_error)
116
- routing_table.forget(router_address)
117
- nil
118
- end
119
-
120
- def must_abort_discovery(error)
121
- !error.is_a?(Exceptions::AuthorizationExpiredException) && error.is_a?(Exceptions::SecurityException) ||
122
- error.is_a?(Exceptions::FatalDiscoveryException) ||
123
- error.is_a?(Exceptions::IllegalStateException) &&
124
- Spi::ConnectionPool::CONNECTION_POOL_CLOSED_ERROR_MESSAGE == error.message ||
125
- error.is_a?(Exceptions::ClientException) &&
126
- [INVALID_BOOKMARK_CODE, INVALID_BOOKMARK_MIXTURE_CODE].include?(error.code) ||
127
- # Not sure why this is not im java
128
- !error.is_a?(Exceptions::Neo4jException) ||
129
- Util::ErrorUtil.fatal?(error)
130
- end
131
-
132
- def resolve_by_domain_name_or_throw_completion_exception(address, routing_table)
133
- resolved_address = resolve_all_by_domain_name(address)
134
- routing_table.replace_router_if_present(address, resolved_address)
135
-
136
- resolved_address.unicast_stream.first or
137
- raise Exceptions::IllegalStateException,
138
- 'Unexpected condition, the ResolvedBoltServerAddress must always have at least one unicast address'
139
- end
140
-
141
- def resolve_all_by_domain_name(address)
142
- ResolvedBoltServerAddress.new(address.host, address.port, *@domain_name_resolver.call(address.host))
143
- end
144
- end
145
- end
146
- end
147
- end
@@ -1,43 +0,0 @@
1
- module Neo4j::Driver
2
- module Internal
3
- module Cluster
4
- # This implementation of the {@link RoutingProcedureRunner} access the routing procedure
5
- # through the bolt's ROUTE message.
6
- class RouteMessageRoutingProcedureRunner
7
- attr_writer :routing_table
8
-
9
- def initialize(routing_context)
10
- @routing_context = routing_context.to_h
11
- end
12
-
13
- def run(connection, database_name, bookmark, impersonated_user)
14
- direct_connection = to_direct_connection(connection, database_name, impersonated_user)
15
- direct_connection.write_and_flush(
16
- Messaging::Request::RouteMessage.new(@routing_context, bookmark, database_name.database_name,
17
- impersonated_user),
18
- Handlers::RouteMessageResponseHandler.new(self))
19
- RoutingProcedureResponse.new(query(database_name), records: [to_record(@routing_table)])
20
- rescue => e
21
- RoutingProcedureResponse.new(query(database_name), error: e)
22
- ensure
23
- direct_connection.release
24
- end
25
-
26
- private
27
-
28
- def to_record(routing_table)
29
- InternalRecord.new(routing_table.keys, routing_table.values)
30
- end
31
-
32
- def to_direct_connection(connection, database_name, impersonated_user)
33
- Async::Connection::DirectConnection.new(connection, database_name, AccessMode::READ, impersonated_user)
34
- end
35
-
36
- def query(database_name)
37
- Query.new('ROUTE $routing_context $database_name', routing_context: @routing_context,
38
- database_name: database_name.database_name)
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,77 +0,0 @@
1
- module Neo4j::Driver
2
- module Internal
3
- module Cluster
4
- class RoutingContext
5
- include Scheme
6
- EMPTY = new
7
- ROUTING_ADDRESS_KEY = :address
8
-
9
- def initialize(uri = nil)
10
- if uri
11
- @server_routing_enabled = routing_scheme?(uri.scheme)
12
- @context = parse_parameters(uri).freeze
13
- else
14
- @server_routing_enabled = true
15
- @context = {}
16
- end
17
- end
18
-
19
- def defined?
20
- @context.size > 1
21
- end
22
-
23
- def to_h
24
- @context
25
- end
26
-
27
- def server_routing_enabled?
28
- @server_routing_enabled
29
- end
30
-
31
- def to_s
32
- "RoutingContext #{@context} ServerRoutingEnabled=#{@server_routing_enabled}"
33
- end
34
-
35
- private
36
-
37
- def parse_parameters(uri)
38
- query = uri.query
39
- address = "#{uri.host}:#{uri.port || BoltServerAddress::DEFAULT_PORT}"
40
- parameters = { ROUTING_ADDRESS_KEY => address }
41
- return parameters if query.blank?
42
-
43
- pairs = query.split('&')
44
- pairs.each do |pair|
45
- key_value = pair.split('=')
46
-
47
- if key_value.size != 2
48
- raise ArgumentError, "Invalid parameters: '#{pair}' in URI '#{uri}'"
49
- end
50
-
51
- key = trim_and_verify_key(key_value[0], 'key', uri)
52
- if parameters.key?(key)
53
- raise ArgumentError, "Duplicated query parameters with key '#{key}' in URI '#{uri}'"
54
- end
55
- parameters[key] = trim_and_verify(key_value[1], 'value', uri)
56
- end
57
-
58
- parameters
59
- end
60
-
61
- def trim_and_verify_key(s, key, uri)
62
- trim_and_verify(s, key, uri).tap do |trimmed|
63
- if trimmed == ROUTING_ADDRESS_KEY
64
- raise ArgumentError, "The key 'address' is reserved for routing context."
65
- end
66
- end
67
- end
68
-
69
- def trim_and_verify(string, name, uri)
70
- string.strip.tap do |result|
71
- raise ArgumentError, "Illegal empty #{name} in URI query '#{uri}'" if result.empty?
72
- end
73
- end
74
- end
75
- end
76
- end
77
- end
@@ -1,60 +0,0 @@
1
- module Neo4j::Driver
2
- module Internal
3
- module Cluster
4
- class RoutingProcedureClusterCompositionProvider
5
- PROTOCOL_ERROR_MESSAGE = "Failed to parse '%s' result received from server due to "
6
-
7
- def initialize(_clock, routing_context)
8
- @single_database_routing_procedure_runner = SingleDatabaseRoutingProcedureRunner.new(routing_context)
9
- @multi_database_routing_procedure_runner = MultiDatabasesRoutingProcedureRunner.new(routing_context)
10
- @route_message_routing_procedure_runner = RouteMessageRoutingProcedureRunner.new(routing_context)
11
- end
12
-
13
- def get_cluster_composition(connection, database_name, bookmark, impersonated_user)
14
- runner = if Messaging::Request::MultiDatabaseUtil.supports_route_message?(connection)
15
- @route_message_routing_procedure_runner
16
- elsif Messaging::Request::MultiDatabaseUtil.supports_multi_database?(connection)
17
- @multi_database_routing_procedure_runner
18
- else
19
- @single_database_routing_procedure_runner
20
- end
21
-
22
- process_routing_response(runner.run(connection, database_name, bookmark, impersonated_user))
23
- end
24
-
25
- def process_routing_response(response)
26
- unless response.success?
27
- raise response.error, "Failed to run '#{invoked_procedure_string(response)}' on server. Please make sure that there is a Neo4j server or cluster up running."
28
- end
29
-
30
- records = response.records
31
-
32
- # the record size is wrong
33
- if records.size != 1
34
- raise Exceptions::ProtocolException, "#{PROTOCOL_ERROR_MESSAGE % invoked_procedure_string(response)} records received '#{records.size}' is too few or too many."
35
- end
36
-
37
- # failed to parse the record
38
- begin
39
- cluster = ClusterComposition.parse(records[0], Time.now)
40
- rescue Exceptions::Value::ValueException => e
41
- raise Exceptions::ProtocolException, "#{PROTOCOL_ERROR_MESSAGE % invoked_procedure_string(response)} unparsable record received. #{e}"
42
- end
43
-
44
- # the cluster result is not a legal reply
45
- if !cluster.has_routers_and_readers?
46
- raise Exceptions::ProtocolException, "#{PROTOCOL_ERROR_MESSAGE % invoked_procedure_string(response)} no router or reader found in response."
47
- end
48
-
49
- # all good
50
- cluster
51
- end
52
-
53
- def invoked_procedure_string(response)
54
- query = response.procedure
55
- "#{query.text} #{query.parameters}"
56
- end
57
- end
58
- end
59
- end
60
- end
@@ -1,35 +0,0 @@
1
- module Neo4j::Driver
2
- module Internal
3
- module Cluster
4
- class RoutingProcedureResponse
5
- attr_reader :procedure
6
-
7
- def initialize(procedure, records: nil, error: nil)
8
- @procedure = procedure
9
- @records = records
10
- @error = error
11
- end
12
-
13
- def success?
14
- !@records.nil?
15
- end
16
-
17
- def records
18
- if success?
19
- @records
20
- else
21
- raise Exceptions::IllegalStateException, "Can't access records of a failed result #{@error}"
22
- end
23
- end
24
-
25
- def error
26
- if success?
27
- raise Exceptions::IllegalStateException, "Can't access error of a succeeded result #{@records}"
28
- else
29
- @error
30
- end
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,24 +0,0 @@
1
- module Neo4j::Driver
2
- module Internal
3
- module Cluster
4
- class RoutingSettings
5
- attr_reader :max_routing_failures, :retry_timeout_delay, :routing_context, :routing_table_purge_delay
6
-
7
- def initialize(max_routing_failures, retry_timeout_delay, routing_table_purge_delay,
8
- routing_context = RoutingContext::EMPTY)
9
- @max_routing_failures = max_routing_failures
10
- @retry_timeout_delay = retry_timeout_delay
11
- @routing_context = routing_context
12
- @routing_table_purge_delay = routing_table_purge_delay
13
- end
14
-
15
- STALE_ROUTING_TABLE_PURGE_DELAY = 30.seconds
16
- DEFAULT = new(1, 5.seconds, STALE_ROUTING_TABLE_PURGE_DELAY)
17
-
18
- def with_routing_context(new_routing_context)
19
- self.class.new(@max_routing_failures, @retry_timeout_delay, @routing_table_purge_delay, new_routing_context)
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,95 +0,0 @@
1
- module Neo4j::Driver
2
- module Internal
3
- module Cluster
4
- class RoutingTableHandlerImpl
5
- attr_reader :routing_table
6
-
7
- delegate :servers, to: :routing_table
8
-
9
- def initialize(routing_table, rediscovery, connection_pool, routing_table_registry, logger, routing_table_purge_delay)
10
- @routing_table = routing_table
11
- @database_name = routing_table.database
12
- @rediscovery = rediscovery
13
- @connection_pool = connection_pool
14
- @routing_table_registry = routing_table_registry
15
- @log = logger
16
- @routing_table_purge_delay = routing_table_purge_delay
17
- @mutex = Concurrent::ReentrantReadWriteLock.new
18
- end
19
-
20
- def on_connection_failure(address)
21
- # remove server from the routing table, to prevent concurrent threads from making connections to this address
22
- @routing_table.forget(address)
23
- end
24
-
25
- def on_write_failure(address)
26
- @routing_table.forget_writer(address)
27
- end
28
-
29
- def ensure_routing_table(context)
30
- @mutex.with_write_lock do
31
- if @routing_table.stale_for?(context.mode)
32
- # existing routing table is not fresh and should be updated
33
- @log.debug("Routing table for database '#{@database_name.description}' is stale. #{@routing_table}")
34
-
35
- fresh_cluster_composition_fetched(
36
- @rediscovery.lookup_cluster_composition(@routing_table, @connection_pool, context.rediscovery_bookmark,
37
- nil))
38
- else
39
- # existing routing table is fresh, use it
40
- @routing_table
41
- end
42
- rescue => error
43
- cluster_composition_lookup_failed(error)
44
- end
45
- end
46
-
47
- def update_routing_table(composition_lookup_result)
48
- @mutex.with_write_lock do
49
- if composition_lookup_result.cluster_composition.expiration_timestamp < @routing_table.expiration_timestamp
50
- @routing_table
51
- else
52
- fresh_cluster_composition_fetched(composition_lookup_result)
53
- end
54
- end
55
- end
56
-
57
- private
58
-
59
- def fresh_cluster_composition_fetched(composition_lookup_result)
60
- @log.debug("Fetched cluster composition for database '#{@database_name.description}'. #{composition_lookup_result.cluster_composition}")
61
- @routing_table.update(composition_lookup_result.cluster_composition)
62
- @routing_table_registry.remove_aged
63
- addresses_to_retain = @routing_table_registry.all_servers.map(&:unicast_stream).reduce(&:+)
64
-
65
- composition_lookup_result.resolved_initial_routers&.then do |addresses|
66
- addresses_to_retain.merge(addresses)
67
- end
68
-
69
- @connection_pool.retain_all(addresses_to_retain)
70
-
71
- @log.debug("Updated routing table for database '#{@database_name.description}'. #{routing_table}")
72
- @routing_table
73
- rescue => error
74
- cluster_composition_lookup_failed(error)
75
- end
76
-
77
- def cluster_composition_lookup_failed(error)
78
- @log.error do
79
- "Failed to update routing table for database '#{@database_name.description}'. Current routing table: #{@routing_table}."
80
- end
81
- @log.error(error)
82
- @routing_table_registry.remove(@database_name)
83
- raise error
84
- end
85
-
86
- public
87
-
88
- # This method cannot be synchronized as it will be visited by all routing table handler's threads concurrently
89
- def routing_table_aged?
90
- @mutex.with_read_lock { @routing_table.has_been_stale_for?(@routing_table_purge_delay) }
91
- end
92
- end
93
- end
94
- end
95
- end
@@ -1,121 +0,0 @@
1
- module Neo4j::Driver
2
- module Internal
3
- module Cluster
4
- class RoutingTableRegistryImpl
5
- def initialize(connection_pool, rediscovery, clock, logger, routing_table_purge_delay)
6
- @factory = RoutingTableHandlerFactory.new(connection_pool, rediscovery, clock, logger, routing_table_purge_delay)
7
- @routing_table_handlers = Concurrent::Map.new
8
- @principal_to_database_name = {}
9
- @clock = clock
10
- @connection_pool = connection_pool
11
- @rediscovery = rediscovery
12
- @log = logger
13
- @mutex = Mutex.new
14
- end
15
-
16
- def ensure_routing_table(context)
17
- ctx_and_handler = ensure_database_name_is_completed(context)
18
- (ctx_and_handler.handler || get_or_create(context.database_name))
19
- .tap { |handler| handler.ensure_routing_table(ctx_and_handler.context) }
20
- end
21
-
22
- private def ensure_database_name_is_completed(context)
23
- context_database_name = context.database_name
24
-
25
- return ConnectionContextAndHandler.new(context, nil) if context_database_name
26
- @mutex.synchronize do
27
- return ConnectionContextAndHandler.new(context, nil) if context_database_name
28
-
29
- impersonated_user = context.impersonated_user
30
- principal = Principal.new(impersonated_user)
31
- database_name = @principal_to_database_name[principal]
32
- handler_ref = Concurrent::AtomicReference.new
33
-
34
- if database_name.nil?
35
- @principal_to_database_name[principal] = database_name
36
-
37
- routing_table = ClusterRoutingTable.new(DatabaseNameUtil.default_database, @clock)
38
-
39
- composition_lookup_result = @rediscovery.lookup_cluster_composition(routing_table, @connection_pool, context.rediscovery_bookmark, impersonated_user)
40
- database_name = DatabaseNameUtil.database(composition_lookup_result.cluster_composition.database_name)
41
- handler = get_or_create(database_name)
42
- handler_ref.set(handler)
43
- handler.update_routing_table(composition_lookup_result)
44
- @principal_to_database_name.delete(principal)
45
- end
46
-
47
- context.database_name = database_name
48
- ConnectionContextAndHandler.new(context, handler_ref.get)
49
- end
50
- end
51
-
52
- def all_servers
53
- # obviously we just had a snapshot of all servers in all routing tables
54
- # after we read it, the set could already be changed.
55
- @routing_table_handlers.values.map(&:servers).reduce(&:+)
56
- end
57
-
58
- def remove(database_name)
59
- @routing_table_handlers.delete(database_name)
60
- @log.debug("Routing table handler for database '#{database_name.description}' is removed.")
61
- end
62
-
63
- def remove_aged
64
- @routing_table_handlers.each do |database_name, handler|
65
- if handler.routing_table_aged?
66
- @log.info("Routing table handler for database '#{database_name.description}' is removed because it has not been used for a long time. Routing table: #{handler.routing_table}")
67
- @routing_table_handlers.delete(database_name)
68
- end
69
- end
70
- end
71
-
72
- def routing_table_handler(database_name)
73
- database_name = DatabaseNameUtil.database(database_name) unless database_name.is_a?(InternalDatabaseName)
74
- @routing_table_handlers[database_name]
75
- end
76
-
77
- # For tests
78
- delegate :key?, to: :@routing_table_handlers
79
-
80
- def get_or_create(database_name)
81
- @routing_table_handlers.compute_if_absent(database_name) do
82
- # TODO: Verify if applies
83
- # Note: Atomic methods taking a block do not allow the self instance to be used within the block. Doing so will cause a deadlock.
84
- handler = @factory.new_instance(database_name, self)
85
- @log.debug("Routing table handler for database '#{database_name.description}' is added.")
86
- handler
87
- end
88
- end
89
-
90
- private
91
-
92
- class RoutingTableHandlerFactory
93
- def initialize(connection_pool, rediscovery, clock, logger, routing_table_purge_delay)
94
- @connection_pool = connection_pool
95
- @rediscovery = rediscovery
96
- @clock = clock
97
- @logger = logger
98
- @routing_table_purge_delay = routing_table_purge_delay
99
- end
100
-
101
- def new_instance(database_name, all_tables)
102
- routing_table = ClusterRoutingTable.new(database_name, @clock)
103
- RoutingTableHandlerImpl.new(routing_table, @rediscovery, @connection_pool, all_tables, @logger, @routing_table_purge_delay)
104
- end
105
- end
106
-
107
- class Principal < Struct.new(:id)
108
- end
109
-
110
- class ConnectionContextAndHandler
111
- attr_reader :context, :handler
112
-
113
- def initialize(context, handler)
114
- @context = context
115
- @handler = handler
116
- end
117
- end
118
- end
119
- end
120
- end
121
- end
@@ -1,73 +0,0 @@
1
- module Neo4j::Driver
2
- module Internal
3
- module Cluster
4
-
5
- # This implementation of the {@link RoutingProcedureRunner} works with single database versions of Neo4j calling
6
- # the procedure `dbms.cluster.routing.getRoutingTable`
7
- class SingleDatabaseRoutingProcedureRunner
8
- ROUTING_CONTEXT = :context
9
- GET_ROUTING_TABLE = "CALL dbms.cluster.routing.getRoutingTable($#{ROUTING_CONTEXT})"
10
-
11
- def initialize(context)
12
- @context = context
13
- end
14
-
15
- def run(connection, database_name, bookmark, impersonated_user)
16
- delegate = connection(connection)
17
- procedure = procedure_query(connection.server_version, database_name)
18
- bookmark_holder = bookmark_holder(bookmark)
19
- begin
20
- result = run_procedure(delegate, procedure, bookmark_holder)
21
- RoutingProcedureResponse.new(procedure, **result.error ? { error: result.error } : { records: result.result! })
22
- rescue => error
23
- handle_error(procedure, error)
24
- ensure
25
- release_connection(delegate)
26
- end
27
- end
28
-
29
- private
30
-
31
- def connection(connection)
32
- Async::Connection::DirectConnection.new(connection, DatabaseNameUtil.default_database, AccessMode::WRITE, nil)
33
- end
34
-
35
- def procedure_query(server_version, database_name)
36
- if database_name.database_name.present?
37
- raise Exceptions::FatalDiscoveryException, "Refreshing routing table for multi-databases is not supported in server version lower than 4.0. Current server version: #{server_version}. Database name: '#{database_name.description}'"
38
- end
39
-
40
- Query.new(GET_ROUTING_TABLE, ROUTING_CONTEXT => @context.to_h)
41
- end
42
-
43
- def bookmark_holder(_ignored)
44
- BookmarkHolder::NO_OP
45
- end
46
-
47
- def run_procedure(connection, procedure, bookmark_holder)
48
- connection.protocol
49
- .run_in_auto_commit_transaction(connection, procedure, bookmark_holder, TransactionConfig.empty,
50
- Handlers::Pulln::FetchSizeUtil::UNLIMITED_FETCH_SIZE)
51
- .async_result.list_async
52
- end
53
-
54
- def release_connection(connection)
55
- # It is not strictly required to release connection after routing procedure invocation because it'll
56
- # be released by the PULL_ALL response handler after result is fully fetched. Such release will happen
57
- # in background. However, releasing it early as part of whole chain makes it easier to reason about
58
- # rediscovery in stub server tests. Some of them assume connections to instances not present in new
59
- # routing table will be closed immediately.
60
- connection.release
61
- end
62
-
63
- def handle_error(procedure, error)
64
- if error.is_a? Exceptions::ClientException
65
- RoutingProcedureResponse.new(procedure, error: error)
66
- else
67
- raise error
68
- end
69
- end
70
- end
71
- end
72
- end
73
- end