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