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,32 @@
1
+ module Neo4j::Driver::Internal::Scheme
2
+ BOLT_URI_SCHEME = 'bolt'
3
+ BOLT_HIGH_TRUST_URI_SCHEME = 'bolt+s'
4
+ BOLT_LOW_TRUST_URI_SCHEME = 'bolt+ssc'
5
+ NEO4J_URI_SCHEME = 'neo4j'
6
+ NEO4J_HIGH_TRUST_URI_SCHEME = 'neo4j+s'
7
+ NEO4J_LOW_TRUST_URI_SCHEME = 'neo4j+ssc'
8
+
9
+ def validate_scheme!(scheme)
10
+ unless [BOLT_URI_SCHEME, BOLT_LOW_TRUST_URI_SCHEME, BOLT_HIGH_TRUST_URI_SCHEME, NEO4J_URI_SCHEME,
11
+ NEO4J_LOW_TRUST_URI_SCHEME, NEO4J_HIGH_TRUST_URI_SCHEME].include?(scheme)
12
+ raise ArgumentError, scheme ? "Invalid address format #{scheme}" : 'Scheme must not be null'
13
+ end
14
+ end
15
+
16
+ def high_trust_scheme?(scheme)
17
+ [BOLT_HIGH_TRUST_URI_SCHEME, NEO4J_HIGH_TRUST_URI_SCHEME].include?(scheme)
18
+ end
19
+
20
+ def low_trust_scheme?(scheme)
21
+ [BOLT_LOW_TRUST_URI_SCHEME, NEO4J_LOW_TRUST_URI_SCHEME].include?(scheme)
22
+ end
23
+
24
+ def security_scheme?(scheme)
25
+ [BOLT_LOW_TRUST_URI_SCHEME, NEO4J_LOW_TRUST_URI_SCHEME, BOLT_HIGH_TRUST_URI_SCHEME, NEO4J_HIGH_TRUST_URI_SCHEME]
26
+ .include?(scheme)
27
+ end
28
+
29
+ def routing_scheme?(scheme)
30
+ [NEO4J_LOW_TRUST_URI_SCHEME, NEO4J_HIGH_TRUST_URI_SCHEME, NEO4J_URI_SCHEME].include?(scheme)
31
+ end
32
+ end
@@ -0,0 +1,15 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Security
4
+ # A simple common token for authentication schemes that easily convert to
5
+ # an auth token map
6
+ class InternalAuthToken < Hash
7
+ SCHEME_KEY = :scheme
8
+ PRINCIPAL_KEY = :principal
9
+ CREDENTIALS_KEY = :credentials
10
+ REALM_KEY = :realm
11
+ PARAMETERS_KEY = :parameters
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,48 @@
1
+ module Neo4j::Driver::Internal
2
+ module Security
3
+ class SecurityPlanImpl < Struct.new(:requires_encryption?, :ssl_context, :requires_hostname_verification?,
4
+ :revocation_strategy)
5
+ class << self
6
+ def for_all_certificates(requires_hostname_verification, revocation_strategy)
7
+ new(true, all_context(requires_hostname_verification), requires_hostname_verification, revocation_strategy)
8
+ end
9
+
10
+ def for_custom_ca_signed_certificates(cert_files, requires_hostname_verification, revocation_strategy)
11
+ new(true, custom_ca_signed_context(cert_files, requires_hostname_verification),
12
+ requires_hostname_verification, revocation_strategy)
13
+ end
14
+
15
+ def for_system_ca_signed_certificates(requires_hostname_verification, revocation_strategy)
16
+ new(true, ca_signed_context(requires_hostname_verification), requires_hostname_verification,
17
+ revocation_strategy)
18
+ end
19
+
20
+ def insecure
21
+ new(false, nil, false, RevocationStrategy::NO_CHECKS)
22
+ end
23
+
24
+ private
25
+
26
+ def all_context(requires_hostname_verification)
27
+ ssl_context(verify_mode: OpenSSL::SSL::VERIFY_NONE, verify_hostname: requires_hostname_verification)
28
+ end
29
+
30
+ def ca_signed_context(requires_hostname_verification)
31
+ ssl_context(verify_hostname: requires_hostname_verification)
32
+ end
33
+
34
+ def custom_ca_signed_context(cert_files, requires_hostname_verification)
35
+ ssl_context(
36
+ cert_store: OpenSSL::X509::Store.new.tap do |store|
37
+ cert_files.each(&store.method(:add_file))
38
+ end,
39
+ verify_hostname: requires_hostname_verification)
40
+ end
41
+
42
+ def ssl_context(**params)
43
+ OpenSSL::SSL::SSLContext.new.tap { |context| context.set_params(params) }
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j::Driver
4
+ module Internal
5
+ class SecuritySetting
6
+ include Scheme
7
+
8
+ attr_reader :encrypted, :trust_strategy, :customized
9
+
10
+ def initialize(encrypted, trust_strategy, customized)
11
+ @encrypted = encrypted
12
+ @trust_strategy = trust_strategy
13
+ @customized = customized
14
+ end
15
+
16
+ def create_security_plan(uri_scheme)
17
+ validate_scheme!(uri_scheme)
18
+ if security_scheme?(uri_scheme)
19
+ assert_security_settings_not_user_configured(uri_scheme)
20
+ create_security_plan_from_scheme(uri_scheme)
21
+ else
22
+ create_security_plan_impl(encrypted, trust_strategy)
23
+ end
24
+ rescue IOError
25
+ raise Neo4j::Driver::Exceptions::ClientException, 'Unable to establish SSL parameters'
26
+ end
27
+
28
+ def create_security_plan_from_scheme(uri_scheme)
29
+ if high_trust_scheme?(uri_scheme)
30
+ Security::SecurityPlanImpl.for_system_ca_signed_certificates(true, RevocationStrategy::NO_CHECKS)
31
+ else
32
+ Security::SecurityPlanImpl.for_all_certificates(false, RevocationStrategy::NO_CHECKS)
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def assert_security_settings_not_user_configured(uri_scheme)
39
+ if customized
40
+ raise Neo4j::Driver::Exceptions::ClientException,
41
+ "Scheme #{uri_scheme} is not configurable with manual encryption and trust settings"
42
+ end
43
+ end
44
+
45
+ def create_security_plan_impl(encrypted, trust_strategy)
46
+ return Security::SecurityPlanImpl.insecure unless encrypted
47
+
48
+ hostname_verification_enabled = trust_strategy.hostname_verification_enabled?
49
+ revocation_strategy = trust_strategy.revocation_strategy
50
+
51
+ case trust_strategy.strategy
52
+ when Config::TrustStrategy::TRUST_CUSTOM_CA_SIGNED_CERTIFICATES
53
+ Security::SecurityPlanImpl.for_custom_ca_signed_certificates(
54
+ trust_strategy.cert_files, hostname_verification_enabled, revocation_strategy)
55
+ when Config::TrustStrategy::TRUST_SYSTEM_CA_SIGNED_CERTIFICATES
56
+ Security::SecurityPlanImpl
57
+ .for_system_ca_signed_certificates(hostname_verification_enabled, revocation_strategy)
58
+ when Config::TrustStrategy::TRUST_ALL_CERTIFICATES
59
+ Security::SecurityPlanImpl.for_all_certificates(hostname_verification_enabled, revocation_strategy)
60
+ else
61
+ raise ClientException, "Unknown TLS authentication strategy: #{trust_strategy.strategy}"
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,32 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ class SessionFactoryImpl
4
+ attr_reader :connection_provider
5
+ delegate :verify_connectivity, :close, :supports_multi_db?, to: :connection_provider
6
+
7
+ def initialize(connection_provider, retry_logic, config)
8
+ @connection_provider = connection_provider
9
+ @leaked_sessions_logging_enabled = config[:leaked_session_logging]
10
+ @retry_logic = retry_logic
11
+ @logger = config[:logger]
12
+ @default_fetch_size = config[:fetch_size]
13
+ end
14
+
15
+ def new_instance(fetch_size: @default_fetch_size, default_access_mode: AccessMode::WRITE, **config)
16
+ bookmark_holder = DefaultBookmarkHolder.new(InternalBookmark.from(*config[:bookmarks]))
17
+ create_session(parse_database_name(config), default_access_mode, bookmark_holder, fetch_size, config[:impersonated_user])
18
+ end
19
+
20
+ private
21
+
22
+ def parse_database_name(config)
23
+ config[:database]&.then(&DatabaseNameUtil.method(:database)) || DatabaseNameUtil.default_database
24
+ end
25
+
26
+ def create_session(database_name, mode, bookmark_holder, fetch_size, impersonated_user)
27
+ (@leaked_sessions_logging_enabled ? org.neo4j.driver.internal.async.LeakLoggingNetworkSession : Async::NetworkSession)
28
+ .new(@connection_provider, @retry_logic, database_name, mode, bookmark_holder, impersonated_user, fetch_size, @logger)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,19 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Spi
4
+ module Connection
5
+ def mode
6
+ raise java.lang.UnsupportedOperationException, "#{self.class} does not support access mode."
7
+ end
8
+
9
+ def database_name
10
+ raise java.lang.UnsupportedOperationException, "#{self.class} does not support database name."
11
+ end
12
+
13
+ def impersonated_user
14
+ raise java.lang.UnsupportedOperationException, "#{self.class} does not support impersonated user."
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Spi
4
+ module ConnectionPool
5
+ CONNECTION_POOL_CLOSED_ERROR_MESSAGE = 'Pool closed'
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Spi
4
+ module ResponseHandler
5
+ # Tells whether this response handler is able to manage auto-read of the underlying connection using {@link Connection#enableAutoRead()} and
6
+ # {@link Connection#disableAutoRead()}.
7
+ # <p>
8
+ # Implementations can use auto-read management to apply network-level backpressure when receiving a stream of records.
9
+ # There should only be a single such handler active for a connection at one point in time. Otherwise, handlers can interfere and turn on/off auto-read
10
+ # racing with each other. {@link InboundMessageDispatcher} is responsible for tracking these handlers and disabling auto-read management to maintain just
11
+ # a single auto-read managing handler per connection.
12
+ def can_manage_auto_read?
13
+ false
14
+ end
15
+
16
+ # If this response handler is able to manage auto-read of the underlying connection, then this method signals it to
17
+ # stop changing auto-read setting for the connection.
18
+ def disable_auto_read_management
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j::Driver::Internal::Summary
4
+ class InternalDatabaseInfo < Struct.new(:name)
5
+ DEFAULT_DATABASE_INFO = new
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j::Driver::Internal::Summary
4
+ # Creating a position from and offset, line number and a column number.
5
+ #
6
+ # @param offset the offset from the start of the string, starting from 0.
7
+ # @param line the line number, starting from 1.
8
+ # @param column the column number, starting from 1.
9
+ class InternalInputPosition < Struct.new(:offset, :line, :column)
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j::Driver::Internal::Summary
4
+ class InternalNotification < Struct.new(:code, :title, :description, :severity, :position)
5
+
6
+ VALUE_TO_NOTIFICATION = lambda do |value|
7
+ severity = value[:severity] || 'N/A'
8
+
9
+ position = value[:position]&.then do |pos_value|
10
+ InternalInputPosition.new(*pos_value.values_at(:offset, :line, :column).map(&:to_i))
11
+ end
12
+
13
+ InternalNotification.new(*value.values_at(:code, :title, :description), severity, position)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j::Driver::Internal::Summary
4
+ # Only call #initialize when sub-classing, for constructing plans, use .plan instead
5
+ class InternalPlan < Struct.new(:operator_type, :arguments, :identifiers, :children)
6
+ # Since a plan with or without profiling looks almost the same, we just keep two impls. of this
7
+ # around to contain the small difference, and share the rest of the code for building plan trees.
8
+ # @param <T>
9
+
10
+ class Converter
11
+ def initialize(&plan_creator)
12
+ @plan_creator = plan_creator
13
+ end
14
+
15
+ def apply(plan)
16
+ operator_type = plan[:operatorType]
17
+
18
+ arguments_value = plan[:args]
19
+ arguments = arguments_value || {}
20
+
21
+ identifiers_value = plan[:identifiers]
22
+ identifiers = identifiers_value || []
23
+
24
+ children_value = plan[:children]
25
+ children = children_value || []
26
+
27
+ @plan_creator.call(operator_type, arguments, identifiers, children, plan)
28
+ end
29
+ end
30
+
31
+ EXPLAIN_PLAN = lambda { |operator_type, arguments, identifiers, children, _original_plan_value|
32
+ new(operator_type, arguments, identifiers, children) }
33
+
34
+ # Builds a regular plan without profiling information - eg. a plan that came as a result of an `EXPLAIN` query
35
+ EXPLAIN_PLAN_FROM_VALUE = Converter.new(&EXPLAIN_PLAN).method(:apply)
36
+
37
+ def self.plan(operator_type, arguments, identifiers, children)
38
+ EXPLAIN_PLAN.call(operator_type, arguments, identifiers, children, nil)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j::Driver::Internal::Summary
4
+ class InternalProfiledPlan < InternalPlan
5
+ attr_reader :db_hits, :records, :page_cache_hits, :page_cache_misses, :page_cache_hit_ratio, :time
6
+
7
+ PROFILED_PLAN = lambda { |operator_type, arguments, identifiers, children, original_plan_value|
8
+ new(
9
+ operator_type, arguments, identifiers, children, original_plan_value[:db_hits].to_i,
10
+ original_plan_value[:rows].to_i, original_plan_value[:page_cache_hits].to_i,
11
+ original_plan_value[:page_cache_misses].to_i, original_plan_value[:page_cache_hit_ratio].to_f,
12
+ original_plan_value[:time].to_i
13
+ ) }
14
+
15
+ # Builds a regular plan without profiling information - eg. a plan that came as a result of an `EXPLAIN` query
16
+ PROFILED_PLAN_FROM_VALUE = Converter.new(&PROFILED_PLAN).method(:apply)
17
+
18
+ def initialize(operator_type, arguments, identifiers, children, db_hits, records, page_cache_hits, page_cache_misses, page_cache_hit_ratio, time)
19
+ super(operator_type, arguments, identifiers, children)
20
+ @db_hits = db_hits
21
+ @records = records
22
+ @page_cache_hits = page_cache_hits
23
+ @page_cache_misses = page_cache_misses
24
+ @page_cache_hit_ratio = page_cache_hit_ratio
25
+ @time = time
26
+ end
27
+
28
+ def page_cache_stats?
29
+ page_cache_hits.positive? || page_cache_misses.positive? || page_cache_hit_ratio.positive?
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j::Driver::Internal::Summary
4
+ class InternalResultSummary < Struct.new(:query, :server, :database, :query_type, :counters, :plan, :profile,
5
+ :notifications, :result_available_after, :result_consumed_after)
6
+ alias has_plan? plan
7
+ alias has_profile? profile
8
+
9
+ def initialize(*args)
10
+ super
11
+ self.plan = resolve_plan(plan, profile)
12
+ end
13
+
14
+ def counters
15
+ super || InternalSummaryCounters::EMPTY_STATS
16
+ end
17
+
18
+ def notifications
19
+ super || []
20
+ end
21
+
22
+ private
23
+
24
+ # Profiled plan is a superset of plan. This method returns profiled plan if plan is {@code null}.
25
+ #
26
+ # @param plan the given plan, possibly {@code null}.
27
+ # @param profiled_plan the given profiled plan, possibly {@code null}.
28
+ # @return available plan.
29
+ def resolve_plan(plan, profiled_plan)
30
+ plan || profiled_plan
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j::Driver::Internal::Summary
4
+ class InternalServerInfo < Struct.new(:agent, :address, :version, :protocol_version)
5
+ end
6
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j::Driver::Internal::Summary
4
+ class InternalSummaryCounters < Struct.new(:nodes_created, :nodes_deleted, :relationships_created,
5
+ :relationships_deleted, :properties_set, :labels_added, :labels_removed,
6
+ :indexes_added, :indexes_removed, :constraints_added, :constraints_removed,
7
+ :system_updates)
8
+ EMPTY_STATS = InternalSummaryCounters.new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
9
+
10
+ def contains_updates?
11
+ any?(&:positive?)
12
+ end
13
+
14
+ def contains_system_updates?
15
+ system_updates.positive?
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,196 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Svm
4
+ # This substitution avoid having loggers added to the build
5
+ class Target_io_netty_util_internal_logging_InternalLoggerFactory
6
+ def self.new_default_factory(name)
7
+ org.neo4j.driver.internal.shaded.io.netty.util.internal.logging.JdkLoggerFactory::INSTANCE
8
+ end
9
+ end
10
+ # SSL
11
+ # This whole section is mostly about removing static analysis references to openssl/tcnative
12
+ class Target_io_netty_handler_ssl_JdkSslServerContext
13
+ def initialize(provider, trust_cert_collection, trust_manager_factory, key_cert_chain, key, key_password,
14
+ key_manager_factory, ciphers, cipher_filter, apn, session_cache_size, session_timeout, client_auth,
15
+ protocols, start_tls, key_store)
16
+ end
17
+ end
18
+
19
+ class Target_io_netty_handler_ssl_JdkSslClientContext
20
+ def initialize(ssl_context_provider, trust_cert_collection, trust_manager_factory, key_cert_chain, key, key_password,
21
+ key_manager_factory, ciphers, cipher_filter, apn, protocols, session_cache_size, session_timeout,
22
+ key_store_type)
23
+ end
24
+ end
25
+
26
+ class Target_io_netty_handler_ssl_SslHandler
27
+ JDK = nil
28
+ def for_engine
29
+ JDK
30
+ end
31
+ end
32
+
33
+ class Target_io_netty_handler_ssl_JdkAlpnApplicationProtocolNegotiator_AlpnWrapper
34
+ def wrap_ssl_engine(engine, alloc, application_negotiator, server)
35
+ Target_io_netty_handler_ssl_JdkAlpnSslEngine.new(engine, application_negotiator, server)
36
+ end
37
+ end
38
+
39
+ def Target_io_netty_handler_ssl_JdkAlpnApplicationProtocolNegotiator_AlpnWrapperJava8
40
+ def wrap_ssl_engine(engine, alloc, application_negotiator, server)
41
+ if Target_io_netty_handler_ssl_JettyAlpnSslEngine.available?
42
+ return server ? Target_io_netty_handler_ssl_JettyAlpnSslEngine.new_server_engine(engine, application_negotiator) : Target_io_netty_handler_ssl_JettyAlpnSslEngine.new_client_engine(engine, application_negotiator)
43
+ end
44
+
45
+ raise RuntimeError, "Unable to wrap SSLEngine of type #{engine.class.name}"
46
+ end
47
+ end
48
+
49
+ class Target_io_netty_handler_ssl_JettyAlpnSslEngine
50
+ def self.available?
51
+ false
52
+ end
53
+
54
+ def new_client_engine(engine, application_negotiator)
55
+ nil
56
+ end
57
+
58
+ def new_server_engine(engine, application_negotiator)
59
+ nil
60
+ end
61
+ end
62
+
63
+ class Target_io_netty_handler_ssl_JdkAlpnSslEngine
64
+ def initialize(engine, application_negotiator, server)
65
+ end
66
+ end
67
+
68
+ class Target_io_netty_handler_ssl_SslContext
69
+ def new_client_context_internal(provider, ssl_context_provider, trust_cert_collection, trust_manager_factory, key_cert_chain, key, key_password,
70
+ key_manager_factory, ciphers, cipher_filter, apn, session_cache_size, session_timeout, client_auth,
71
+ protocols, start_tls, enable_ocsp, key_store_type, ctx_options)
72
+
73
+ if enable_ocsp
74
+ raise ArgumentError, "OCSP is not supported with this SslProvider: #{provider}"
75
+ else
76
+ Target_io_netty_handler_ssl_JdkSslServerContext.new(ssl_context_provider, trust_cert_collection, trust_manager_factory, key_cert_chain, key, key_password,
77
+ key_manager_factory, ciphers, cipher_filter, apn, session_cache_size, session_timeout, client_auth,
78
+ protocols, start_tls, key_store_type)
79
+ end
80
+ end
81
+
82
+ def new_client_context_internal(provider, ssl_context_provider, trust_cert, trust_manager_factory, key_cert_chain,
83
+ key, key_password, key_manager_factory, ciphers, cipher_filter, apn, protocols,
84
+ session_cache_size, session_timeout, enable_ocsp, key_store_type, options)
85
+
86
+ if enable_ocsp
87
+ raise ArgumentError, "OCSP is not supported with this SslProvider: #{provider}"
88
+ else
89
+ Target_io_netty_handler_ssl_JdkSslClientContext.new(ssl_context_provider, trust_cert, trust_manager_factory, key_cert_chain, key, key_password,
90
+ key_manager_factory, ciphers, cipher_filter, apn, protocols, session_cache_size, session_timeout, key_store_type)
91
+ end
92
+ end
93
+ end
94
+
95
+ class Target_io_netty_handler_ssl_JdkDefaultApplicationProtocolNegotiator
96
+ INSTANCE = :instance
97
+ end
98
+
99
+ class Target_io_netty_handler_ssl_JdkSslContext
100
+ def self.to_negotiator(config, server)
101
+ if config.nil?
102
+ return Target_io_netty_handler_ssl_JdkDefaultApplicationProtocolNegotiator::INSTANCE
103
+ end
104
+
105
+ case config.protocol
106
+ when NONE
107
+ Target_io_netty_handler_ssl_JdkDefaultApplicationProtocolNegotiator::INSTANCE
108
+ when ALPN
109
+ if server
110
+ # GRAAL RC9 bug: https://github.com/oracle/graal/issues/813
111
+ # switch(config.selectorFailureBehavior()) {
112
+ # case FATAL_ALERT:
113
+ # return new JdkAlpnApplicationProtocolNegotiator(true, config.supportedProtocols());
114
+ # case NO_ADVERTISE:
115
+ # return new JdkAlpnApplicationProtocolNegotiator(false, config.supportedProtocols());
116
+ # default:
117
+ # throw new UnsupportedOperationException(new StringBuilder("JDK provider does not support ")
118
+ # . append(config.selectorFailureBehavior()).append(" failure behavior").toString());
119
+ # }
120
+ behavior = config.selector_failure_behavior
121
+ if behavior == org.neo4j.driver.internal.shaded.io.netty.handler.ssl.ApplicationProtocolConfig.SelectorFailureBehavior::FATAL_ALERT
122
+ return org.neo4j.driver.internal.shaded.io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator.new(true, config.supported_protocols)
123
+ elsif org.neo4j.driver.internal.shaded.io.netty.handler.ssl.ApplicationProtocolConfig.SelectorFailureBehavior::NO_ADVERTISE
124
+ return org.neo4j.driver.internal.shaded.io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator.new(false, config.supported_protocols)
125
+ else
126
+ raise UnsupportedOperationException, "JDK provider does not support #{config.selector_failure_behavior} failure behavior"
127
+ end
128
+ else
129
+ case config.selected_listener_failure_behavior
130
+ when ACCEPT
131
+ org.neo4j.driver.internal.shaded.io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator.new(false, config.supported_protocols)
132
+ when FATAL_ALERT
133
+ return org.neo4j.driver.internal.shaded.io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator.new(true, config.supported_protocols)
134
+ else
135
+ raise UnsupportedOperationException, "JDK provider does not support #{config.selected_listener_failure_behavior} failure behavior"
136
+ end
137
+ end
138
+ else
139
+ raise UnsupportedOperationException, "JDK provider does not support #{config.protocol} protocol"
140
+ end
141
+ end
142
+ end
143
+
144
+ # This one only prints exceptions otherwise we get a useless bogus
145
+ # exception message: https://github.com/eclipse-vertx/vert.x/issues/1657
146
+ class Target_io_netty_bootstrap_AbstractBootstrap
147
+ def initialize(channel)
148
+ @channel_factory = org.neo4j.driver.internal.shaded.io.netty.bootstrap.ChannelFactory.new
149
+ end
150
+
151
+ def config
152
+ nil
153
+ end
154
+
155
+ def init_and_register
156
+ begin
157
+ channel = @channel_factory.new_channel
158
+ new(channel)
159
+ rescue StandardError => e
160
+ # THE FIX IS HERE:
161
+ t.print_stack_trace
162
+ unless channel.nil?
163
+ # channel can be null if newChannel crashed (eg SocketException("too many open files"))
164
+ channel.unsafe.close_forcibly
165
+ end
166
+
167
+ # as the Channel is not registered yet we need to force the usage of the GlobalEventExecutor
168
+ org.neo4j.driver.internal.shaded.io.netty.channel.DefaultChannelPromise.new(channel, io.netty.util.concurrent.GlobalEventExecutor::INSTANCE).set_failure(e)
169
+ end
170
+
171
+ reg_future = config.group.register(channel)
172
+ if reg_future.cause
173
+ if channel.registered?
174
+ channel.close
175
+ else
176
+ channel.unsafe.close_forcibly
177
+ end
178
+ end
179
+
180
+ # If we are here and the promise is not failed, it's one of the following cases:
181
+ # 1) If we attempted registration from the event loop, the registration has been completed at this point.
182
+ # i.e. It's safe to attempt bind() or connect() now because the channel has been registered.
183
+ # 2) If we attempted registration from the other thread, the registration request has been successfully
184
+ # added to the event loop's task queue for later execution.
185
+ # i.e. It's safe to attempt bind() or connect() now:
186
+ # because bind() or connect() will be executed *after* the scheduled registration task is executed
187
+ # because register(), bind(), and connect() are all bound to the same thread.
188
+ reg_future
189
+ end
190
+ end
191
+
192
+ class NettySubstitutions
193
+ end
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,21 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Svm
4
+ # This substitution avoid having jcraft zlib added to the build
5
+ class Target_org_neo4j_driver_internal_shaded_io_netty_handler_codec_compression_ZlibCodecFactory
6
+ class << self
7
+ def new_zlib_encoder(wrapper, compression_level)
8
+ org.neo4j.driver.internal.shaded.io.netty.handler.codec.compression.JdkZlibEncoder.new(wrapper, compression_level)
9
+ end
10
+
11
+ def zlib_decoder(wrapper)
12
+ org.neo4j.driver.internal.shaded.io.netty.handler.codec.compression.jdk_zlib_decoder(wrapper)
13
+ end
14
+ end
15
+ end
16
+
17
+ class ZLibSubstitutions
18
+ end
19
+ end
20
+ end
21
+ end