neo4j-ruby-driver 6.0.3.alpha.0 → 6.2.1.beta.2
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 +113 -411
- data/{ruby → lib}/neo4j/driver/access_mode.rb +2 -1
- data/lib/neo4j/driver/auth_token_managers.rb +31 -0
- data/lib/neo4j/driver/auth_tokens.rb +41 -0
- data/lib/neo4j/driver/auto_commit_retries_mode.rb +18 -0
- data/lib/neo4j/driver/bolt/bolt_version.rb +67 -0
- data/lib/neo4j/driver/bolt/connection.rb +1091 -0
- data/lib/neo4j/driver/bolt/handshake.rb +236 -0
- data/lib/neo4j/driver/bolt/message/failure.rb +139 -0
- data/lib/neo4j/driver/bolt/message/ignored.rb +27 -0
- data/lib/neo4j/driver/bolt/message/record.rb +30 -0
- data/lib/neo4j/driver/bolt/message/success.rb +34 -0
- data/lib/neo4j/driver/bolt/message.rb +112 -0
- data/lib/neo4j/driver/bolt/pool.rb +255 -0
- data/lib/neo4j/driver/bolt/protocol/base.rb +146 -0
- data/lib/neo4j/driver/bolt/protocol/v3.rb +43 -0
- data/lib/neo4j/driver/bolt/protocol/v4.rb +24 -0
- data/lib/neo4j/driver/bolt/protocol/v43.rb +28 -0
- data/lib/neo4j/driver/bolt/protocol/v44.rb +23 -0
- data/lib/neo4j/driver/bolt/protocol/v5.rb +27 -0
- data/lib/neo4j/driver/bolt/protocol/v51.rb +24 -0
- data/lib/neo4j/driver/bolt/protocol/v52.rb +28 -0
- data/lib/neo4j/driver/bolt/protocol/v53.rb +27 -0
- data/lib/neo4j/driver/bolt/protocol/v54.rb +14 -0
- data/lib/neo4j/driver/bolt/protocol/v55.rb +17 -0
- data/lib/neo4j/driver/bolt/protocol/v56.rb +14 -0
- data/lib/neo4j/driver/bolt/protocol/v57.rb +31 -0
- data/lib/neo4j/driver/bolt/protocol/v58.rb +15 -0
- data/lib/neo4j/driver/bolt/protocol/v6.rb +43 -0
- data/lib/neo4j/driver/bolt/protocol/v61.rb +21 -0
- data/lib/neo4j/driver/bolt/protocol_version_handler.rb +39 -0
- data/lib/neo4j/driver/bolt/record_buffer.rb +143 -0
- data/lib/neo4j/driver/bolt/stream_handler.rb +53 -0
- data/lib/neo4j/driver/bolt/tls_config.rb +129 -0
- data/lib/neo4j/driver/bolt/wire.rb +321 -0
- data/lib/neo4j/driver/bookmark.rb +15 -0
- data/lib/neo4j/driver/bookmark_managers.rb +39 -0
- data/lib/neo4j/driver/client_certificate.rb +19 -0
- data/lib/neo4j/driver/client_certificate_manager.rb +37 -0
- data/lib/neo4j/driver/client_certificate_managers.rb +15 -0
- data/lib/neo4j/driver/client_certificates.rb +14 -0
- data/lib/neo4j/driver/direct/connection_provider.rb +262 -0
- data/lib/neo4j/driver/driver.rb +268 -0
- data/lib/neo4j/driver/eager_result.rb +10 -0
- data/lib/neo4j/driver/exceptions/neo4j_exception.rb +16 -7
- data/lib/neo4j/driver/exceptions/no_such_record_exception.rb +1 -1
- data/lib/neo4j/driver/exceptions/protocol_exception.rb +0 -5
- data/lib/neo4j/driver/exceptions/security_retryable_exception.rb +14 -0
- data/lib/neo4j/driver/exceptions/transaction_terminated_exception.rb +13 -0
- data/lib/neo4j/driver/graph_database.rb +29 -0
- data/lib/neo4j/driver/internal/clock.rb +20 -0
- data/lib/neo4j/driver/internal/clock_adapter.rb +21 -0
- data/lib/neo4j/driver/internal/default_bookmark_manager.rb +54 -0
- data/lib/neo4j/driver/internal/deprecator.rb +9 -5
- data/lib/neo4j/driver/internal/driver_factory.rb +128 -0
- data/lib/neo4j/driver/internal/duration_normalizer.rb +14 -39
- data/lib/neo4j/driver/internal/extras.rb +23 -0
- data/lib/neo4j/driver/internal/home_db_cache.rb +57 -0
- data/lib/neo4j/driver/internal/internal_auth_token_manager.rb +37 -0
- data/lib/neo4j/driver/internal/metrics.rb +31 -0
- data/lib/neo4j/driver/internal/security/static_auth_token_manager.rb +25 -0
- data/lib/neo4j/driver/internal/validator.rb +16 -2
- data/lib/neo4j/driver/net.rb +29 -0
- data/lib/neo4j/driver/packstream/markers.rb +49 -0
- data/lib/neo4j/driver/packstream/packer.rb +335 -0
- data/lib/neo4j/driver/packstream/structure.rb +27 -0
- data/lib/neo4j/driver/packstream/unpacker.rb +170 -0
- data/lib/neo4j/driver/record.rb +43 -0
- data/lib/neo4j/driver/result.rb +282 -0
- data/lib/neo4j/driver/routing/load_balancer.rb +706 -0
- data/lib/neo4j/driver/routing/routed_connection.rb +132 -0
- data/lib/neo4j/driver/routing/routing_table.rb +127 -0
- data/lib/neo4j/driver/routing/server_address.rb +25 -0
- data/lib/neo4j/driver/routing_control.rb +13 -0
- data/lib/neo4j/driver/session.rb +577 -0
- data/lib/neo4j/driver/summary/database_info.rb +25 -0
- data/lib/neo4j/driver/summary/gql_notification.rb +38 -0
- data/lib/neo4j/driver/summary/gql_status_object.rb +35 -0
- data/lib/neo4j/driver/summary/notification.rb +46 -0
- data/lib/neo4j/driver/summary/plan.rb +23 -0
- data/lib/neo4j/driver/summary/profile.rb +28 -0
- data/lib/neo4j/driver/summary/query.rb +19 -0
- data/lib/neo4j/driver/summary/query_type.rb +5 -1
- data/lib/neo4j/driver/summary/result_summary.rb +215 -0
- data/lib/neo4j/driver/summary/server_info.rb +33 -0
- data/lib/neo4j/driver/summary/summary_counters.rb +72 -0
- data/lib/neo4j/driver/transaction.rb +344 -0
- data/lib/neo4j/driver/types/duration.rb +76 -0
- data/lib/neo4j/driver/types/entity.rb +40 -0
- data/lib/neo4j/driver/types/local_date_time.rb +77 -8
- data/lib/neo4j/driver/types/local_time.rb +50 -7
- data/lib/neo4j/driver/types/node.rb +18 -0
- data/lib/neo4j/driver/types/offset_time.rb +78 -7
- data/lib/neo4j/driver/types/path.rb +68 -0
- data/lib/neo4j/driver/types/point.rb +38 -18
- data/lib/neo4j/driver/types/relationship.rb +32 -0
- data/lib/neo4j/driver/types/temporal_value.rb +44 -0
- data/lib/neo4j/driver/types/unbound_relationship.rb +24 -0
- data/lib/neo4j/driver/types/unresolvable_zoned_date_time.rb +38 -0
- data/lib/neo4j/driver/types/unsupported_type.rb +25 -0
- data/lib/neo4j/driver/types/uuid.rb +29 -0
- data/{ruby → lib}/neo4j/driver/version.rb +1 -1
- data/lib/neo4j/driver.rb +15 -0
- data/lib/neo4j-ruby-driver_loader.rb +34 -20
- metadata +115 -441
- data/lib/neo4j/driver/internal/bolt_server_address.rb +0 -97
- data/lib/neo4j/driver/synchronizable.rb +0 -23
- data/lib/neo4j/driver/types/time.rb +0 -45
- data/ruby/neo4j/driver/auth_tokens.rb +0 -34
- data/ruby/neo4j/driver/bookmark.rb +0 -21
- data/ruby/neo4j/driver/config.rb +0 -89
- data/ruby/neo4j/driver/graph_database.rb +0 -78
- data/ruby/neo4j/driver/internal/async/connection/bolt_protocol_util.rb +0 -51
- data/ruby/neo4j/driver/internal/async/connection/bootstrap_factory.rb +0 -22
- data/ruby/neo4j/driver/internal/async/connection/channel_attributes.rb +0 -31
- data/ruby/neo4j/driver/internal/async/connection/channel_connected_listener.rb +0 -32
- data/ruby/neo4j/driver/internal/async/connection/channel_connector_impl.rb +0 -83
- data/ruby/neo4j/driver/internal/async/connection/channel_pipeline_builder_impl.rb +0 -22
- data/ruby/neo4j/driver/internal/async/connection/direct_connection.rb +0 -30
- data/ruby/neo4j/driver/internal/async/connection/event_loop_group_factory.rb +0 -83
- data/ruby/neo4j/driver/internal/async/connection/handshake_completed_listener.rb +0 -27
- data/ruby/neo4j/driver/internal/async/connection/handshake_handler.rb +0 -113
- data/ruby/neo4j/driver/internal/async/connection/netty_channel_initializer.rb +0 -57
- data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver.rb +0 -26
- data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver_group.rb +0 -19
- data/ruby/neo4j/driver/internal/async/connection/routing_connection.rb +0 -36
- data/ruby/neo4j/driver/internal/async/connection/stream.rb +0 -12
- data/ruby/neo4j/driver/internal/async/connection/stream_reader.rb +0 -16
- data/ruby/neo4j/driver/internal/async/connection_context.rb +0 -10
- data/ruby/neo4j/driver/internal/async/immutable_connection_context.rb +0 -24
- data/ruby/neo4j/driver/internal/async/inbound/byte_buf_input.rb +0 -30
- data/ruby/neo4j/driver/internal/async/inbound/channel_error_handler.rb +0 -77
- data/ruby/neo4j/driver/internal/async/inbound/chunk_decoder.rb +0 -41
- data/ruby/neo4j/driver/internal/async/inbound/connect_timeout_handler.rb +0 -32
- data/ruby/neo4j/driver/internal/async/inbound/connection_read_timeout_handler.rb +0 -17
- data/ruby/neo4j/driver/internal/async/inbound/inbound_message_dispatcher.rb +0 -171
- data/ruby/neo4j/driver/internal/async/inbound/inbound_message_handler.rb +0 -42
- data/ruby/neo4j/driver/internal/async/inbound/message_decoder.rb +0 -51
- data/ruby/neo4j/driver/internal/async/internal_async_session.rb +0 -92
- data/ruby/neo4j/driver/internal/async/internal_async_transaction.rb +0 -13
- data/ruby/neo4j/driver/internal/async/leak_logging_network_session.rb +0 -34
- data/ruby/neo4j/driver/internal/async/network_connection.rb +0 -194
- data/ruby/neo4j/driver/internal/async/network_session.rb +0 -150
- data/ruby/neo4j/driver/internal/async/outbound/chunk_aware_byte_buf_output.rb +0 -110
- data/ruby/neo4j/driver/internal/async/outbound/outbound_message_handler.rb +0 -39
- data/ruby/neo4j/driver/internal/async/pool/channel.rb +0 -66
- data/ruby/neo4j/driver/internal/async/pool/channel_pool.rb +0 -31
- data/ruby/neo4j/driver/internal/async/pool/channel_tracker.rb +0 -135
- data/ruby/neo4j/driver/internal/async/pool/connection_pool_impl.rb +0 -156
- data/ruby/neo4j/driver/internal/async/pool/netty_channel_health_checker.rb +0 -87
- data/ruby/neo4j/driver/internal/async/pool/netty_channel_pool.rb +0 -52
- data/ruby/neo4j/driver/internal/async/pool/network_connection_factory.rb +0 -21
- data/ruby/neo4j/driver/internal/async/pool/pool_settings.rb +0 -34
- data/ruby/neo4j/driver/internal/async/pool/timed_stack.rb +0 -15
- data/ruby/neo4j/driver/internal/async/result_cursors_holder.rb +0 -17
- data/ruby/neo4j/driver/internal/async/unmanaged_transaction.rb +0 -212
- data/ruby/neo4j/driver/internal/bookmark_holder.rb +0 -9
- data/ruby/neo4j/driver/internal/cluster/cluster_composition.rb +0 -48
- data/ruby/neo4j/driver/internal/cluster/cluster_composition_lookup_result.rb +0 -14
- data/ruby/neo4j/driver/internal/cluster/cluster_routing_table.rb +0 -122
- data/ruby/neo4j/driver/internal/cluster/identity_resolver.rb +0 -10
- data/ruby/neo4j/driver/internal/cluster/loadbalancing/least_connected_load_balancing_strategy.rb +0 -68
- data/ruby/neo4j/driver/internal/cluster/loadbalancing/load_balancer.rb +0 -125
- data/ruby/neo4j/driver/internal/cluster/loadbalancing/round_robin_array_index.rb +0 -13
- data/ruby/neo4j/driver/internal/cluster/multi_databases_routing_procedure_runner.rb +0 -31
- data/ruby/neo4j/driver/internal/cluster/rediscovery_impl.rb +0 -147
- data/ruby/neo4j/driver/internal/cluster/route_message_routing_procedure_runner.rb +0 -43
- data/ruby/neo4j/driver/internal/cluster/routing_context.rb +0 -77
- data/ruby/neo4j/driver/internal/cluster/routing_procedure_cluster_composition_provider.rb +0 -60
- data/ruby/neo4j/driver/internal/cluster/routing_procedure_response.rb +0 -35
- data/ruby/neo4j/driver/internal/cluster/routing_settings.rb +0 -24
- data/ruby/neo4j/driver/internal/cluster/routing_table_handler_impl.rb +0 -95
- data/ruby/neo4j/driver/internal/cluster/routing_table_registry_impl.rb +0 -121
- data/ruby/neo4j/driver/internal/cluster/single_database_routing_procedure_runner.rb +0 -73
- data/ruby/neo4j/driver/internal/connection_settings.rb +0 -16
- data/ruby/neo4j/driver/internal/cursor/async_result_cursor_impl.rb +0 -55
- data/ruby/neo4j/driver/internal/cursor/async_result_cursor_only_factory.rb +0 -24
- data/ruby/neo4j/driver/internal/cursor/disposable_async_result_cursor.rb +0 -61
- data/ruby/neo4j/driver/internal/cursor/result_cursor_factory_impl.rb +0 -24
- data/ruby/neo4j/driver/internal/cursor/rx_result_cursor_impl.rb +0 -110
- data/ruby/neo4j/driver/internal/database_name_util.rb +0 -37
- data/ruby/neo4j/driver/internal/default_bookmark_holder.rb +0 -9
- data/ruby/neo4j/driver/internal/default_domain_name_resolver.rb +0 -11
- data/ruby/neo4j/driver/internal/direct_connection_provider.rb +0 -40
- data/ruby/neo4j/driver/internal/driver_factory.rb +0 -126
- data/ruby/neo4j/driver/internal/eager_result_value.rb +0 -5
- data/ruby/neo4j/driver/internal/handlers/begin_tx_response_handler.rb +0 -20
- data/ruby/neo4j/driver/internal/handlers/channel_releasing_reset_response_handler.rb +0 -30
- data/ruby/neo4j/driver/internal/handlers/commit_tx_response_handler.rb +0 -23
- data/ruby/neo4j/driver/internal/handlers/hello_response_handler.rb +0 -65
- data/ruby/neo4j/driver/internal/handlers/init_response_handler.rb +0 -34
- data/ruby/neo4j/driver/internal/handlers/legacy_pull_all_response_handler.rb +0 -199
- data/ruby/neo4j/driver/internal/handlers/no_op_response_handler.rb +0 -16
- data/ruby/neo4j/driver/internal/handlers/ping_response_handler.rb +0 -29
- data/ruby/neo4j/driver/internal/handlers/pull_handlers.rb +0 -32
- data/ruby/neo4j/driver/internal/handlers/pulln/auto_pull_response_handler.rb +0 -169
- data/ruby/neo4j/driver/internal/handlers/pulln/basic_pull_response_handler.rb +0 -298
- data/ruby/neo4j/driver/internal/handlers/pulln/fetch_size_util.rb +0 -20
- data/ruby/neo4j/driver/internal/handlers/reset_response_handler.rb +0 -34
- data/ruby/neo4j/driver/internal/handlers/rollback_tx_response_handler.rb +0 -25
- data/ruby/neo4j/driver/internal/handlers/route_message_response_handler.rb +0 -21
- data/ruby/neo4j/driver/internal/handlers/routing_response_handler.rb +0 -79
- data/ruby/neo4j/driver/internal/handlers/run_response_handler.rb +0 -38
- data/ruby/neo4j/driver/internal/handlers/session_pull_response_completion_listener.rb +0 -34
- data/ruby/neo4j/driver/internal/handlers/transaction_pull_response_completion_listener.rb +0 -20
- data/ruby/neo4j/driver/internal/impersonation_util.rb +0 -22
- data/ruby/neo4j/driver/internal/internal_bookmark.rb +0 -9
- data/ruby/neo4j/driver/internal/internal_database_name.rb +0 -9
- data/ruby/neo4j/driver/internal/internal_driver.rb +0 -83
- data/ruby/neo4j/driver/internal/internal_entity.rb +0 -21
- data/ruby/neo4j/driver/internal/internal_node.rb +0 -21
- data/ruby/neo4j/driver/internal/internal_pair.rb +0 -9
- data/ruby/neo4j/driver/internal/internal_path.rb +0 -35
- data/ruby/neo4j/driver/internal/internal_point2_d.rb +0 -9
- data/ruby/neo4j/driver/internal/internal_point3_d.rb +0 -6
- data/ruby/neo4j/driver/internal/internal_record.rb +0 -27
- data/ruby/neo4j/driver/internal/internal_relationship.rb +0 -27
- data/ruby/neo4j/driver/internal/internal_result.rb +0 -49
- data/ruby/neo4j/driver/internal/internal_session.rb +0 -91
- data/ruby/neo4j/driver/internal/internal_transaction.rb +0 -48
- data/ruby/neo4j/driver/internal/logging/channel_activity_logger.rb +0 -29
- data/ruby/neo4j/driver/internal/logging/channel_error_logger.rb +0 -17
- data/ruby/neo4j/driver/internal/logging/prefixed_logger.rb +0 -19
- data/ruby/neo4j/driver/internal/logging/reformatted_logger.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/abstract_message_writer.rb +0 -23
- data/ruby/neo4j/driver/internal/messaging/bolt_protocol.rb +0 -32
- data/ruby/neo4j/driver/internal/messaging/bolt_protocol_version.rb +0 -48
- data/ruby/neo4j/driver/internal/messaging/common/common_message_reader.rb +0 -51
- data/ruby/neo4j/driver/internal/messaging/common/common_value.rb +0 -33
- data/ruby/neo4j/driver/internal/messaging/common/common_value_packer.rb +0 -104
- data/ruby/neo4j/driver/internal/messaging/common/common_value_unpacker.rb +0 -256
- data/ruby/neo4j/driver/internal/messaging/encode/begin_message_encoder.rb +0 -15
- data/ruby/neo4j/driver/internal/messaging/encode/commit_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/discard_all_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/discard_message_encoder.rb +0 -15
- data/ruby/neo4j/driver/internal/messaging/encode/goodbye_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/hello_message_encoder.rb +0 -15
- data/ruby/neo4j/driver/internal/messaging/encode/init_message_encoder.rb +0 -16
- data/ruby/neo4j/driver/internal/messaging/encode/logoff_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/logon_message_encoder.rb +0 -15
- data/ruby/neo4j/driver/internal/messaging/encode/pull_all_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/pull_message_encoder.rb +0 -15
- data/ruby/neo4j/driver/internal/messaging/encode/reset_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/rollback_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/route_message_encoder.rb +0 -24
- data/ruby/neo4j/driver/internal/messaging/encode/route_v44_message_encoder.rb +0 -22
- data/ruby/neo4j/driver/internal/messaging/encode/run_message_encoder.rb +0 -16
- data/ruby/neo4j/driver/internal/messaging/encode/run_with_metadata_message_encoder.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/request/abstract_streaming_message.rb +0 -25
- data/ruby/neo4j/driver/internal/messaging/request/begin_message.rb +0 -25
- data/ruby/neo4j/driver/internal/messaging/request/commit_message.rb +0 -20
- data/ruby/neo4j/driver/internal/messaging/request/discard_all_message.rb +0 -20
- data/ruby/neo4j/driver/internal/messaging/request/discard_message.rb +0 -23
- data/ruby/neo4j/driver/internal/messaging/request/goodbye_message.rb +0 -20
- data/ruby/neo4j/driver/internal/messaging/request/hello_message.rb +0 -30
- data/ruby/neo4j/driver/internal/messaging/request/init_message.rb +0 -19
- data/ruby/neo4j/driver/internal/messaging/request/logoff_message.rb +0 -13
- data/ruby/neo4j/driver/internal/messaging/request/logon_message.rb +0 -13
- data/ruby/neo4j/driver/internal/messaging/request/message_with_metadata.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/request/multi_database_util.rb +0 -26
- data/ruby/neo4j/driver/internal/messaging/request/pull_all_message.rb +0 -23
- data/ruby/neo4j/driver/internal/messaging/request/pull_message.rb +0 -22
- data/ruby/neo4j/driver/internal/messaging/request/reset_message.rb +0 -32
- data/ruby/neo4j/driver/internal/messaging/request/rollback_message.rb +0 -20
- data/ruby/neo4j/driver/internal/messaging/request/route_message.rb +0 -28
- data/ruby/neo4j/driver/internal/messaging/request/run_message.rb +0 -23
- data/ruby/neo4j/driver/internal/messaging/request/run_with_metadata_message.rb +0 -49
- data/ruby/neo4j/driver/internal/messaging/request/transaction_metadata_builder.rb +0 -24
- data/ruby/neo4j/driver/internal/messaging/response/failure_message.rb +0 -40
- data/ruby/neo4j/driver/internal/messaging/response/ignored_message.rb +0 -29
- data/ruby/neo4j/driver/internal/messaging/response/record_message.rb +0 -33
- data/ruby/neo4j/driver/internal/messaging/response/success_message.rb +0 -34
- data/ruby/neo4j/driver/internal/messaging/v3/bolt_protocol_v3.rb +0 -82
- data/ruby/neo4j/driver/internal/messaging/v3/message_format_v3.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/v3/message_writer_v3.rb +0 -27
- data/ruby/neo4j/driver/internal/messaging/v4/bolt_protocol_v4.rb +0 -29
- data/ruby/neo4j/driver/internal/messaging/v4/message_format_v4.rb +0 -13
- data/ruby/neo4j/driver/internal/messaging/v4/message_writer_v4.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/v41/bolt_protocol_v41.rb +0 -25
- data/ruby/neo4j/driver/internal/messaging/v42/bolt_protocol_v42.rb +0 -13
- data/ruby/neo4j/driver/internal/messaging/v43/bolt_protocol_v43.rb +0 -19
- data/ruby/neo4j/driver/internal/messaging/v43/message_format_v43.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/v43/message_writer_v43.rb +0 -20
- data/ruby/neo4j/driver/internal/messaging/v44/bolt_protocol_v44.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/v44/message_format_v44.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/v44/message_writer_v44.rb +0 -15
- data/ruby/neo4j/driver/internal/messaging/v5/bolt_protocol_v5.rb +0 -21
- data/ruby/neo4j/driver/internal/messaging/v5/message_format_v5.rb +0 -18
- data/ruby/neo4j/driver/internal/messaging/v5/value_unpacker_v5.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/v51/bolt_protocol_v51.rb +0 -40
- data/ruby/neo4j/driver/internal/messaging/v51/message_format_v51.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/v51/message_writer_v51.rb +0 -17
- data/ruby/neo4j/driver/internal/metrics/connection_pool_metrics_listener.rb +0 -34
- data/ruby/neo4j/driver/internal/metrics/internal_abstract_metrics.rb +0 -46
- data/ruby/neo4j/driver/internal/metrics/internal_connection_pool_metrics.rb +0 -105
- data/ruby/neo4j/driver/internal/metrics/internal_metrics.rb +0 -82
- data/ruby/neo4j/driver/internal/metrics/internal_metrics_provider.rb +0 -18
- data/ruby/neo4j/driver/internal/metrics/listener_event.rb +0 -17
- data/ruby/neo4j/driver/internal/metrics/metrics_provider.rb +0 -24
- data/ruby/neo4j/driver/internal/metrics/time_recorder_listener_event.rb +0 -15
- data/ruby/neo4j/driver/internal/packstream/byte_array_incompatible_packer.rb +0 -12
- data/ruby/neo4j/driver/internal/packstream/pack_input.rb +0 -47
- data/ruby/neo4j/driver/internal/packstream/pack_output.rb +0 -39
- data/ruby/neo4j/driver/internal/packstream/pack_stream.rb +0 -324
- data/ruby/neo4j/driver/internal/packstream/pack_type.rb +0 -17
- data/ruby/neo4j/driver/internal/read_only_bookmark_holder.rb +0 -13
- data/ruby/neo4j/driver/internal/resolved_bolt_server_address.rb +0 -35
- data/ruby/neo4j/driver/internal/retry/exponential_backoff_retry_logic.rb +0 -150
- data/ruby/neo4j/driver/internal/revocation_strategy.rb +0 -19
- data/ruby/neo4j/driver/internal/scheme.rb +0 -32
- data/ruby/neo4j/driver/internal/security/internal_auth_token.rb +0 -15
- data/ruby/neo4j/driver/internal/security/security_plan_impl.rb +0 -48
- data/ruby/neo4j/driver/internal/security_setting.rb +0 -66
- data/ruby/neo4j/driver/internal/session_factory_impl.rb +0 -32
- data/ruby/neo4j/driver/internal/spi/connection.rb +0 -19
- data/ruby/neo4j/driver/internal/spi/connection_pool.rb +0 -9
- data/ruby/neo4j/driver/internal/spi/response_handler.rb +0 -23
- data/ruby/neo4j/driver/internal/summary/internal_database_info.rb +0 -7
- data/ruby/neo4j/driver/internal/summary/internal_input_position.rb +0 -11
- data/ruby/neo4j/driver/internal/summary/internal_notification.rb +0 -16
- data/ruby/neo4j/driver/internal/summary/internal_plan.rb +0 -41
- data/ruby/neo4j/driver/internal/summary/internal_profiled_plan.rb +0 -32
- data/ruby/neo4j/driver/internal/summary/internal_result_summary.rb +0 -33
- data/ruby/neo4j/driver/internal/summary/internal_server_info.rb +0 -6
- data/ruby/neo4j/driver/internal/summary/internal_summary_counters.rb +0 -18
- data/ruby/neo4j/driver/internal/svm/netty_substitutions.rb +0 -196
- data/ruby/neo4j/driver/internal/svm/z_lib_substitutions.rb +0 -21
- data/ruby/neo4j/driver/internal/util/certificate_tool.rb +0 -65
- data/ruby/neo4j/driver/internal/util/clock.rb +0 -29
- data/ruby/neo4j/driver/internal/util/error_util.rb +0 -104
- data/ruby/neo4j/driver/internal/util/extract.rb +0 -123
- data/ruby/neo4j/driver/internal/util/format.rb +0 -39
- data/ruby/neo4j/driver/internal/util/futures.rb +0 -99
- data/ruby/neo4j/driver/internal/util/iterables.rb +0 -35
- data/ruby/neo4j/driver/internal/util/lock_util.rb +0 -23
- data/ruby/neo4j/driver/internal/util/metadata_extractor.rb +0 -101
- data/ruby/neo4j/driver/internal/util/mutex.rb +0 -9
- data/ruby/neo4j/driver/internal/util/preconditions.rb +0 -16
- data/ruby/neo4j/driver/internal/util/result_holder.rb +0 -72
- data/ruby/neo4j/driver/internal/util/server_version.rb +0 -60
- data/ruby/neo4j/driver/logging1.rb +0 -51
- data/ruby/neo4j/driver/net/server_address.rb +0 -9
- data/ruby/neo4j/driver/query.rb +0 -48
- data/ruby/neo4j/driver/records.rb +0 -13
- data/ruby/neo4j/driver/transaction_config.rb +0 -50
- data/ruby/neo4j/driver/values.rb +0 -26
- data/ruby/neo4j/driver.rb +0 -30
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module Routing
|
|
6
|
+
# Bolt::Connection wrapper that classifies routing-relevant
|
|
7
|
+
# errors and feeds the routing table back. Mirrors Java's
|
|
8
|
+
# RoutedBoltConnection + RoutingErrorHandler.onWriteFailure /
|
|
9
|
+
# onConnectionFailure.
|
|
10
|
+
#
|
|
11
|
+
# The wrapper is a pure delegator on the read/write path — every
|
|
12
|
+
# method is forwarded straight to the inner Bolt::Connection.
|
|
13
|
+
# Classification doesn't happen on the wire-call boundary because
|
|
14
|
+
# Bolt failures only become exceptions when the caller does
|
|
15
|
+
# `.assert_success!` on the response (which raises outside the
|
|
16
|
+
# delegator), and streaming failures only become exceptions when
|
|
17
|
+
# Result's visitor dispatches to `on_failure`. Both of those call
|
|
18
|
+
# sites — plus session.rb / transaction.rb's wire-error rescues —
|
|
19
|
+
# invoke `classify_failure(error)` explicitly to run the side
|
|
20
|
+
# effects (deactivate / on_write_failure) and get the
|
|
21
|
+
# (possibly-swapped) exception to re-raise.
|
|
22
|
+
class RoutedConnection
|
|
23
|
+
extend Forwardable
|
|
24
|
+
|
|
25
|
+
# Server-side error codes that indicate the connected node is no
|
|
26
|
+
# longer the leader for the database we wrote to. Surface is
|
|
27
|
+
# narrow on purpose — anything else (constraint violations,
|
|
28
|
+
# syntax errors, etc.) is a user-facing failure that mustn't
|
|
29
|
+
# invalidate the routing table.
|
|
30
|
+
WRITE_FAILURE_CODES = %w[
|
|
31
|
+
Neo.ClientError.Cluster.NotALeader
|
|
32
|
+
Neo.ClientError.General.ForbiddenOnReadOnlyDatabase
|
|
33
|
+
].freeze
|
|
34
|
+
|
|
35
|
+
DATABASE_UNAVAILABLE_CODE = 'Neo.TransientError.General.DatabaseUnavailable'
|
|
36
|
+
|
|
37
|
+
attr_reader :inner, :address_obj
|
|
38
|
+
attr_accessor :discard_on_release
|
|
39
|
+
|
|
40
|
+
def initialize(pool, inner, address_obj, access_mode, database)
|
|
41
|
+
@pool = pool
|
|
42
|
+
@inner = inner
|
|
43
|
+
@address_obj = address_obj
|
|
44
|
+
@access_mode = access_mode
|
|
45
|
+
@database = database
|
|
46
|
+
@discard_on_release = false
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def_delegators :@inner,
|
|
50
|
+
:address, :server_agent, :server_version, :protocol,
|
|
51
|
+
:closed?, :close, :pending_responses?,
|
|
52
|
+
:send_message, :send_all, :flush, :telemetry,
|
|
53
|
+
:fetch_response, :fetch_all,
|
|
54
|
+
:reset!, :route,
|
|
55
|
+
:auth, :driver_auth, :authenticate,
|
|
56
|
+
:auth_failed, :notify_security_exception, :ssr_enabled?
|
|
57
|
+
|
|
58
|
+
# Run a caught exception through the routing classifier:
|
|
59
|
+
# - ServiceUnavailableException → deactivate(address); mark
|
|
60
|
+
# the connection discardable; return the same exception.
|
|
61
|
+
# - TransientException with DatabaseUnavailable → same.
|
|
62
|
+
# - ClientException with NotALeader / ForbiddenOnReadOnly on
|
|
63
|
+
# a WRITE → on_write_failure(address, database) to forget the
|
|
64
|
+
# writer (forces a re-route); the connection is NOT discarded
|
|
65
|
+
# (the node is fine, just not the leader) — RESET on release
|
|
66
|
+
# makes it reusable. Returns a SessionExpiredException (so
|
|
67
|
+
# session retry catches it) with the original error code preserved.
|
|
68
|
+
# - Anything else → return the same exception unchanged.
|
|
69
|
+
#
|
|
70
|
+
# Callers: session.rb (RUN-response rescue), transaction.rb
|
|
71
|
+
# (BEGIN/RUN/COMMIT rescues), Result#on_failure (streaming
|
|
72
|
+
# PULL/DISCARD). Each invokes this in its catch-Neo4jException
|
|
73
|
+
# block and re-raises whatever we return.
|
|
74
|
+
def classify_failure(error)
|
|
75
|
+
# Funnel security failures to the auth-token manager first (via
|
|
76
|
+
# the inner connection's provider-set handler); a retryable one
|
|
77
|
+
# comes back wrapped as SecurityRetryableException. Then apply
|
|
78
|
+
# routing classification to whatever we surface.
|
|
79
|
+
error = @inner.notify_security_exception(error)
|
|
80
|
+
# A security failure compromises the connection (server closes
|
|
81
|
+
# it; identity is bad) — discard regardless of routing role.
|
|
82
|
+
@discard_on_release = true if error.is_a?(Exceptions::SecurityException)
|
|
83
|
+
|
|
84
|
+
case error
|
|
85
|
+
when Exceptions::SessionExpiredException
|
|
86
|
+
# Already routing-classified — deactivate and keep the type.
|
|
87
|
+
@discard_on_release = true
|
|
88
|
+
@pool.deactivate(@address_obj)
|
|
89
|
+
error
|
|
90
|
+
when Exceptions::ServiceUnavailableException
|
|
91
|
+
@discard_on_release = true
|
|
92
|
+
@pool.deactivate(@address_obj)
|
|
93
|
+
# In routing, a dead connection means this server can no longer
|
|
94
|
+
# serve the session — surface as SessionExpired so managed-tx
|
|
95
|
+
# retry picks a different server (mirrors Java's RoutingConnection
|
|
96
|
+
# mapping connection failures to SessionExpired). Both are
|
|
97
|
+
# retryable, so retry behaviour is unchanged; only the surfaced
|
|
98
|
+
# type differs. The original is chained as `cause` automatically
|
|
99
|
+
# when the caller re-raises this inside its `rescue => error`.
|
|
100
|
+
Exceptions::SessionExpiredException.new(error.message, code: error.code)
|
|
101
|
+
when Exceptions::TransientException
|
|
102
|
+
if error.code == DATABASE_UNAVAILABLE_CODE
|
|
103
|
+
@discard_on_release = true
|
|
104
|
+
@pool.deactivate(@address_obj)
|
|
105
|
+
end
|
|
106
|
+
error
|
|
107
|
+
when Exceptions::ClientException
|
|
108
|
+
if @access_mode == :write && WRITE_FAILURE_CODES.include?(error.code)
|
|
109
|
+
# NotALeader / ForbiddenOnReadOnlyDatabase: the node is no longer
|
|
110
|
+
# the leader, but the connection itself is fine. Forget it as a
|
|
111
|
+
# writer (forces a re-route) but DON'T discard it — RESET on
|
|
112
|
+
# release (Bolt::Pool#push) clears the FAILED state so the retry
|
|
113
|
+
# can reuse it (matches Java's onWriteFailure, which keeps the
|
|
114
|
+
# connection; testkit's retry_with_fail_after_pull reuses it).
|
|
115
|
+
@pool.on_write_failure(@address_obj, @database)
|
|
116
|
+
# Original ClientException chained as `cause` at re-raise.
|
|
117
|
+
Exceptions::SessionExpiredException.new(
|
|
118
|
+
"Server at #{@address_obj} no longer accepts writes for database " \
|
|
119
|
+
"#{@database.inspect} (#{error.code})",
|
|
120
|
+
code: error.code
|
|
121
|
+
)
|
|
122
|
+
else
|
|
123
|
+
error
|
|
124
|
+
end
|
|
125
|
+
else
|
|
126
|
+
error
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module Routing
|
|
6
|
+
# Snapshot of the cluster's routing roles, plus mutators used by the
|
|
7
|
+
# error→action handlers (`forget` on connection failure, `forget_writer`
|
|
8
|
+
# on NotALeader / ForbiddenOnReadOnlyDatabase). Mirrors the design of
|
|
9
|
+
# Java's ClusterRoutingTable + Python's _routing.RoutingTable.
|
|
10
|
+
#
|
|
11
|
+
# Threading: callers (LoadBalancer) hold @refresh_lock while mutating
|
|
12
|
+
# or reading. Methods here are not internally synchronised.
|
|
13
|
+
class RoutingTable
|
|
14
|
+
# Servers don't always return a writer right away (e.g. cluster
|
|
15
|
+
# mid-leader-election). The table is still usable for reads in
|
|
16
|
+
# that window, but the next routing refresh should prefer the
|
|
17
|
+
# initial address (the seed router) over the existing routers list
|
|
18
|
+
# since the latter may have been populated by a leaderless reply.
|
|
19
|
+
attr_reader :database, :routers, :readers, :writers,
|
|
20
|
+
:last_updated, :ttl, :initialized_without_writers
|
|
21
|
+
|
|
22
|
+
ROLE_TO_KEY = { 'READ' => :readers, 'WRITE' => :writers, 'ROUTE' => :routers }.freeze
|
|
23
|
+
|
|
24
|
+
# Build a table from the `rt` map returned by the BOLT ROUTE message:
|
|
25
|
+
# {ttl: 1000, db: "homedb", servers: [{addresses: [...], role: "READ"}, ...]}
|
|
26
|
+
def self.from_response(rt, requested_database, clock: Internal::Clock.new)
|
|
27
|
+
buckets = { readers: [], writers: [], routers: [] }
|
|
28
|
+
(rt[:servers] || []).each do |server|
|
|
29
|
+
key = ROLE_TO_KEY[server[:role]] or next
|
|
30
|
+
(server[:addresses] || []).each { |addr| buckets[key] << ServerAddress.parse(addr) }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
new(
|
|
34
|
+
database: requested_database || rt[:db],
|
|
35
|
+
routers: buckets[:routers].uniq,
|
|
36
|
+
readers: buckets[:readers].uniq,
|
|
37
|
+
writers: buckets[:writers].uniq,
|
|
38
|
+
ttl: (rt[:ttl] || 0).to_f,
|
|
39
|
+
clock: clock
|
|
40
|
+
)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def initialize(database:, routers: [], readers: [], writers: [], ttl: 0, clock: Internal::Clock.new)
|
|
44
|
+
@database = database
|
|
45
|
+
@routers = routers.to_set
|
|
46
|
+
@readers = readers.to_set
|
|
47
|
+
@writers = writers.to_set
|
|
48
|
+
@ttl = ttl
|
|
49
|
+
@clock = clock
|
|
50
|
+
@last_updated = @clock.realtime
|
|
51
|
+
@initialized_without_writers = @writers.empty?
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# A table is fresh when it isn't expired AND has the servers needed
|
|
55
|
+
# for the requested access mode. An empty writers list is acceptable
|
|
56
|
+
# for read-only acquires (initialized_without_writers state), but a
|
|
57
|
+
# write-mode acquire needs a writer.
|
|
58
|
+
def fresh?(readonly:, now: @clock.realtime)
|
|
59
|
+
return false if expired?(now)
|
|
60
|
+
return false if @routers.empty?
|
|
61
|
+
|
|
62
|
+
readonly ? @readers.any? : @writers.any?
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def expired?(now = @clock.realtime)
|
|
66
|
+
now >= @last_updated + @ttl
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Absolute expiry in epoch millis (last_updated + ttl). testkit's
|
|
70
|
+
# backend derives the relative ttl from this — uniformly with JRuby,
|
|
71
|
+
# whose Java RoutingTable exposes only this absolute timestamp.
|
|
72
|
+
def expiration_timestamp
|
|
73
|
+
((@last_updated + @ttl).to_f * 1000).round
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Past the cache grace period? Used by LoadBalancer to drop tables
|
|
77
|
+
# for databases nobody is touching anymore.
|
|
78
|
+
def purge?(grace:, now: @clock.realtime)
|
|
79
|
+
now >= @last_updated + @ttl + grace
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Replace the contents in place with another table's roles. The
|
|
83
|
+
# existing table identity is preserved so anyone holding a reference
|
|
84
|
+
# sees the new state.
|
|
85
|
+
def update(other)
|
|
86
|
+
@routers = other.routers.dup
|
|
87
|
+
@readers = other.readers.dup
|
|
88
|
+
@writers = other.writers.dup
|
|
89
|
+
@ttl = other.ttl
|
|
90
|
+
@last_updated = @clock.realtime
|
|
91
|
+
@initialized_without_writers = @writers.empty?
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Remove an address from every role bucket. Called on connection
|
|
95
|
+
# failure: the server is gone, drop it everywhere.
|
|
96
|
+
def forget(address)
|
|
97
|
+
@routers.delete(address)
|
|
98
|
+
@readers.delete(address)
|
|
99
|
+
@writers.delete(address)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Remove an address only from the writers bucket. Called when a
|
|
103
|
+
# WRITE op fails with NotALeader / ForbiddenOnReadOnlyDatabase:
|
|
104
|
+
# the server is alive but no longer the leader, so it can still
|
|
105
|
+
# serve reads.
|
|
106
|
+
def forget_writer(address)
|
|
107
|
+
@writers.delete(address)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def servers_for(access_mode)
|
|
111
|
+
case access_mode
|
|
112
|
+
when :read then @readers
|
|
113
|
+
when :write then @writers
|
|
114
|
+
when :route then @routers
|
|
115
|
+
else raise ArgumentError, "Unknown access mode: #{access_mode.inspect}"
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Union of all role buckets — used when shutting down per-server
|
|
120
|
+
# pools that no current routing table references.
|
|
121
|
+
def servers
|
|
122
|
+
@routers | @readers | @writers
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module Routing
|
|
6
|
+
# Host:port pair for a single Bolt server. Hashable so it works as
|
|
7
|
+
# a key in the LoadBalancer's per-server pool map.
|
|
8
|
+
class ServerAddress < Data.define(:host, :port)
|
|
9
|
+
DEFAULT_PORT = 7687
|
|
10
|
+
|
|
11
|
+
# Parse "host:port" or "[ipv6]:port" (or bare "host" → default port).
|
|
12
|
+
def self.parse(string)
|
|
13
|
+
host, sep, port = string.to_s.rpartition(':')
|
|
14
|
+
return new(host: string.to_s, port: DEFAULT_PORT) if sep.empty?
|
|
15
|
+
|
|
16
|
+
new(host: host, port: Integer(port))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def to_s
|
|
20
|
+
host.include?(':') && !host.start_with?('[') ? "[#{host}]:#{port}" : "#{host}:#{port}"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
# Per-query routing for `driver.execute_query` — the Java driver's
|
|
6
|
+
# RoutingControl. It is the same READ/WRITE concept as AccessMode (Java's
|
|
7
|
+
# execute_query lowers RoutingControl to AccessMode internally), so on MRI
|
|
8
|
+
# we make it a synonym. Kept as a distinct name to mirror the Java API
|
|
9
|
+
# surface (AccessMode for sessions, RoutingControl for queries) and to
|
|
10
|
+
# allow the two to diverge later without an API change.
|
|
11
|
+
RoutingControl = AccessMode
|
|
12
|
+
end
|
|
13
|
+
end
|