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,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module Internal
|
|
6
|
+
# Adapts a `#now_millis` time source (epoch milliseconds) to the driver's
|
|
7
|
+
# monotonic/realtime Clock interface. The MRI counterpart of the jruby
|
|
8
|
+
# `ClockAdapter` that bridges `#now_millis` into a `java.time.Clock`;
|
|
9
|
+
# `DriverFactory#to_clock` wraps testkit-backend's clock in it so the
|
|
10
|
+
# driver internals consume it like any other Clock.
|
|
11
|
+
class ClockAdapter
|
|
12
|
+
def initialize(source)
|
|
13
|
+
@source = source
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def monotonic = @source.now_millis / 1000.0
|
|
17
|
+
def realtime = ::Time.at(@source.now_millis / 1000.0)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module Internal
|
|
6
|
+
# Thread-safe in-memory implementation behind
|
|
7
|
+
# `BookmarkManagers.default_manager`. Internal because callers
|
|
8
|
+
# code against the duck type (`bookmarks` + `update_bookmarks`)
|
|
9
|
+
# and shouldn't depend on this class name.
|
|
10
|
+
#
|
|
11
|
+
# `bookmarks_supplier` runs on every `bookmarks` call so external
|
|
12
|
+
# state (e.g. bookmarks persisted by another node in a cluster of
|
|
13
|
+
# app servers) is folded into what we send on BEGIN.
|
|
14
|
+
# `bookmarks_consumer` runs on every successful `update_bookmarks`
|
|
15
|
+
# so external listeners can react.
|
|
16
|
+
class DefaultBookmarkManager
|
|
17
|
+
def initialize(initial_bookmarks: nil, bookmarks_supplier: nil, bookmarks_consumer: nil)
|
|
18
|
+
@bookmarks = normalize(initial_bookmarks)
|
|
19
|
+
@supplier = bookmarks_supplier
|
|
20
|
+
@consumer = bookmarks_consumer
|
|
21
|
+
@lock = Mutex.new
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def bookmarks
|
|
25
|
+
@lock.synchronize { @bookmarks.dup } | normalize(@supplier&.call)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Java's BookmarkManagerImpl semantics: drop everything in
|
|
29
|
+
# `previous` (set-difference is a no-op for entries we don't
|
|
30
|
+
# have, so callers can pass the full "what I sent on BEGIN"
|
|
31
|
+
# snapshot — including the session's own bookmarks — without
|
|
32
|
+
# special-casing), then add the new ones from the commit
|
|
33
|
+
# response. Consumer sees the post-update set.
|
|
34
|
+
def update_bookmarks(previous, new)
|
|
35
|
+
prev_set = normalize(previous)
|
|
36
|
+
new_set = normalize(new)
|
|
37
|
+
updated_snapshot = nil
|
|
38
|
+
@lock.synchronize do
|
|
39
|
+
@bookmarks -= prev_set
|
|
40
|
+
@bookmarks |= new_set
|
|
41
|
+
updated_snapshot = @bookmarks.dup
|
|
42
|
+
end
|
|
43
|
+
@consumer&.call(updated_snapshot)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def normalize(bookmarks)
|
|
49
|
+
Set.new(Array(bookmarks).map(&Bookmark.method(:from)))
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Neo4j
|
|
2
4
|
module Driver
|
|
3
5
|
module Internal
|
|
4
6
|
module Deprecator
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
class << self
|
|
8
|
+
def deprecator
|
|
9
|
+
self
|
|
10
|
+
end
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
12
|
+
def behavior=(value)
|
|
13
|
+
# No-op for now
|
|
14
|
+
end
|
|
11
15
|
end
|
|
12
16
|
end
|
|
13
17
|
end
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module Internal
|
|
6
|
+
# MRI flavour of the impl-agnostic `Internal::DriverFactory`
|
|
7
|
+
# seam. Owns the actual driver-construction logic — URI
|
|
8
|
+
# validation + `Internal::Driver.new(...)` — so that
|
|
9
|
+
# `GraphDatabase.driver` is just the convenience entry point
|
|
10
|
+
# that wraps the user-supplied `AuthToken` in a
|
|
11
|
+
# `StaticAuthTokenManager` and calls us.
|
|
12
|
+
#
|
|
13
|
+
# The factory is also the single owner of the driver's non-public
|
|
14
|
+
# extension hooks: `getDomainNameResolver` (nil by default = system DNS)
|
|
15
|
+
# and `create_clock` (the real system clock by default). testkit's
|
|
16
|
+
# subclass overrides them. Rather than leaking these into the
|
|
17
|
+
# user-facing config, new_instance threads them as their own parameters
|
|
18
|
+
# into the ConnectionProvider it assembles, so the Driver and the
|
|
19
|
+
# user-facing `config` never carry them. `to_domain_name_resolver` is
|
|
20
|
+
# identity (MRI doesn't bridge resolver types); `to_clock` wraps a
|
|
21
|
+
# `#now_millis` source in Internal::ClockAdapter.
|
|
22
|
+
class DriverFactory
|
|
23
|
+
VALID_SCHEMES = %w[bolt bolt+s bolt+ssc neo4j neo4j+s neo4j+ssc].freeze
|
|
24
|
+
|
|
25
|
+
def to_domain_name_resolver(resolver_proc)
|
|
26
|
+
resolver_proc
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Wrap a `#now_millis` time source in the driver's Clock interface. The
|
|
30
|
+
# jruby flavour wraps it in a java.time.Clock adapter instead.
|
|
31
|
+
def to_clock(clock)
|
|
32
|
+
Internal::ClockAdapter.new(clock)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# camelCase to match the name Java's DriverFactory exposes and that
|
|
36
|
+
# subclasses (testkit's DriverFactoryWithDomainNameResolver) call
|
|
37
|
+
# `super` on. Default: no custom resolver (system DNS is used). The
|
|
38
|
+
# subclass returns its proc when one is registered, else falls through
|
|
39
|
+
# to this via `super`.
|
|
40
|
+
def getDomainNameResolver = nil
|
|
41
|
+
|
|
42
|
+
# The clock the driver's internals run on. Default is the real system
|
|
43
|
+
# clock; testkit's subclass overrides this (returning `to_clock` of its
|
|
44
|
+
# own time source) so its tests can freeze/advance time — the driver
|
|
45
|
+
# stays agnostic.
|
|
46
|
+
def create_clock = Internal::Clock.new
|
|
47
|
+
|
|
48
|
+
# Mutual-TLS client certificates (Feature:API:SSLClientCertificate): the
|
|
49
|
+
# ClientCertificateManager is threaded into the options every connection's
|
|
50
|
+
# TlsConfig reads, so each connection's SSL context presents the current
|
|
51
|
+
# (rotatable) client certificate. nil (the common case) leaves TLS
|
|
52
|
+
# unchanged.
|
|
53
|
+
def new_instance(uri, auth_token_manager, client_certificate_manager: nil, **config)
|
|
54
|
+
parsed_uri = validate_uri(uri)
|
|
55
|
+
validate_security_settings(parsed_uri.scheme, config)
|
|
56
|
+
config = config.merge(client_certificate_manager: client_certificate_manager) if client_certificate_manager
|
|
57
|
+
# The factory is the single place that knows about the non-public
|
|
58
|
+
# extension hooks (the domain-name resolver and the clock). It
|
|
59
|
+
# assembles a fully-wired ConnectionProvider with
|
|
60
|
+
# those baked in and hands it to the Driver, so the Driver and the
|
|
61
|
+
# user-facing `config` never carry these hooks.
|
|
62
|
+
#
|
|
63
|
+
# Retain the manager (not a frozen token): the provider consults it
|
|
64
|
+
# for the current token on every acquire and on security failures,
|
|
65
|
+
# so token refresh / re-auth works.
|
|
66
|
+
#
|
|
67
|
+
# The clock the internals run on (default real, testkit's own
|
|
68
|
+
# otherwise) is an internal extension hook like the domain-name
|
|
69
|
+
# resolver — threaded as its own parameter to the provider / pool /
|
|
70
|
+
# connection / routing / session, never mixed into the user-facing
|
|
71
|
+
# `config`.
|
|
72
|
+
clock = create_clock
|
|
73
|
+
provider = build_connection_provider(parsed_uri, auth_token_manager, config, clock)
|
|
74
|
+
Driver.new(uri, config, provider, clock: clock)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
def build_connection_provider(uri, auth_manager, options, clock)
|
|
80
|
+
klass = uri.scheme.start_with?('neo4j') ? Routing::LoadBalancer : Direct::ConnectionProvider
|
|
81
|
+
klass.new(uri, auth_manager, options, domain_name_resolver: getDomainNameResolver, clock: clock)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def validate_uri(uri)
|
|
85
|
+
parsed = URI(uri)
|
|
86
|
+
raise ArgumentError, 'Scheme must not be null' if parsed.scheme.nil? || parsed.scheme.empty?
|
|
87
|
+
raise ArgumentError, "Unsupported URI scheme: #{parsed.scheme}" unless VALID_SCHEMES.include?(parsed.scheme)
|
|
88
|
+
|
|
89
|
+
# Routing context (URI query parameters, e.g. region/policy) only
|
|
90
|
+
# applies to routing drivers (neo4j://). A direct bolt:// driver
|
|
91
|
+
# would silently drop it — so reject it instead, matching Java's
|
|
92
|
+
# IllegalArgumentException. Server Side Routing is not enabled by
|
|
93
|
+
# passing a routing context to a direct connection.
|
|
94
|
+
if parsed.scheme.start_with?('bolt') && !parsed.query.to_s.empty?
|
|
95
|
+
raise ArgumentError,
|
|
96
|
+
"Routing parameters are not supported with scheme '#{parsed.scheme}'. Given URI: '#{uri}'"
|
|
97
|
+
end
|
|
98
|
+
parsed
|
|
99
|
+
rescue URI::InvalidURIError
|
|
100
|
+
raise ArgumentError, 'Scheme must not be null'
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# A +s/+ssc scheme already fixes the security plan (encrypted, plus
|
|
104
|
+
# trust-all for +ssc). Combining it with *manually configured*
|
|
105
|
+
# encryption or trust settings is a conflict — mirror Java's
|
|
106
|
+
# SecuritySettings.assertSecuritySettingsNotUserConfigured and raise.
|
|
107
|
+
#
|
|
108
|
+
# Value equality (Detail:DefaultSecurityConfigValueEquality): a setting
|
|
109
|
+
# whose value equals the driver default (encryption off; trust = system
|
|
110
|
+
# certificates) is treated as *not* configured, so it is not a conflict.
|
|
111
|
+
# That is why `encryption: false` / no trust strategy on a +s scheme is
|
|
112
|
+
# accepted while `encryption: true` or an explicit trust strategy raises.
|
|
113
|
+
def validate_security_settings(scheme, config)
|
|
114
|
+
return unless Driver::ENCRYPTED_SCHEMES.include?(scheme)
|
|
115
|
+
return unless security_settings_customized?(config)
|
|
116
|
+
|
|
117
|
+
raise Exceptions::ClientException,
|
|
118
|
+
"Scheme #{scheme} is not configurable with manual encryption and trust settings"
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def security_settings_customized?(config)
|
|
122
|
+
config[:encryption] == true ||
|
|
123
|
+
![nil, :trust_system_certificates].include?(config.dig(:trust_strategy, :strategy))
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
@@ -4,47 +4,22 @@ module Neo4j
|
|
|
4
4
|
module Driver
|
|
5
5
|
module Internal
|
|
6
6
|
module DurationNormalizer
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
7
|
+
# Convert timeout from seconds (or ActiveSupport::Duration) to
|
|
8
|
+
# milliseconds for the Bolt protocol. A negative timeout is
|
|
9
|
+
# invalid — reject it client-side (matches Java, which raises
|
|
10
|
+
# rather than sending a negative tx_timeout to the server).
|
|
11
|
+
def timeout_to_milliseconds(timeout)
|
|
12
|
+
return if timeout.nil?
|
|
13
|
+
|
|
14
|
+
# Check the sign before rounding: a tiny negative timeout
|
|
15
|
+
# (e.g. -0.4ms) would otherwise round to 0 and slip through.
|
|
16
|
+
ms = timeout.to_f * 1000
|
|
17
|
+
if ms.negative?
|
|
18
|
+
raise Exceptions::ClientException,
|
|
19
|
+
"Transaction timeout must not be negative, but was #{ms}ms"
|
|
18
20
|
end
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
duration&.in_milliseconds&.round
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def create(months, days, seconds, nanoseconds)
|
|
25
|
-
{ months:, days:, seconds: seconds + (nanoseconds.zero? ? 0 : nanoseconds * BigDecimal('1e-9')) }
|
|
26
|
-
.sum { |key, value| ActiveSupport::Duration.send(key, value) }
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
def divmod(number, factor)
|
|
32
|
-
number_i, remainder = number.divmod(1)
|
|
33
|
-
[number_i.to_i, remainder * factor]
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def months(parts)
|
|
37
|
-
parts[:years] * 12 + parts[:months]
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def days(parts)
|
|
41
|
-
parts[:weeks] * 7 + parts[:days]
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def seconds(parts)
|
|
45
|
-
parts[:hours] * ActiveSupport::Duration::SECONDS_PER_HOUR +
|
|
46
|
-
parts[:minutes] * ActiveSupport::Duration::SECONDS_PER_MINUTE + parts[:seconds]
|
|
47
|
-
end
|
|
22
|
+
ms.round
|
|
48
23
|
end
|
|
49
24
|
end
|
|
50
25
|
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module Internal
|
|
6
|
+
# Shared helpers for building Bolt protocol extras maps (RUN /
|
|
7
|
+
# BEGIN / etc). Kept tiny on purpose — we don't depend on
|
|
8
|
+
# ActiveSupport so this is the local replacement for
|
|
9
|
+
# `Hash#compact_blank!`.
|
|
10
|
+
module Extras
|
|
11
|
+
# Use as a Hash#reject! predicate to drop nil and
|
|
12
|
+
# empty-collection values:
|
|
13
|
+
#
|
|
14
|
+
# extras.reject!(&Internal::Extras::BLANK)
|
|
15
|
+
#
|
|
16
|
+
# Matches what other drivers serialise — testkit stub scripts
|
|
17
|
+
# strictly compare the map, so an empty `tx_metadata: {}` or
|
|
18
|
+
# an empty `bookmarks: []` left in the payload would mismatch.
|
|
19
|
+
BLANK = ->(_, v) { v.nil? || (v.respond_to?(:empty?) && v.empty?) }
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module Internal
|
|
6
|
+
# Driver-level cache mapping a user identity to their most recently
|
|
7
|
+
# resolved home database (Optimization:HomeDatabaseCache). It lets a routed
|
|
8
|
+
# session skip home-database discovery by optimistically guessing the
|
|
9
|
+
# cached database — safe only when every pooled connection advertised
|
|
10
|
+
# server-side routing (`ssr.enabled`), so the server transparently
|
|
11
|
+
# re-routes a wrong guess. Bounded, least-recently-used eviction.
|
|
12
|
+
class HomeDbCache
|
|
13
|
+
DEFAULT_MAX_SIZE = 10_000
|
|
14
|
+
|
|
15
|
+
def initialize(max_size: DEFAULT_MAX_SIZE)
|
|
16
|
+
@max_size = max_size
|
|
17
|
+
# Insertion order doubles as LRU recency: a Ruby Hash preserves it, so
|
|
18
|
+
# #get re-inserts the touched key at the end and #set evicts from the
|
|
19
|
+
# front once the cache is full.
|
|
20
|
+
@entries = {}
|
|
21
|
+
@mutex = Mutex.new
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# The cache key for an identity: the impersonated user when set, else the
|
|
25
|
+
# per-session auth token (driver-level auth is nil, so every default-auth
|
|
26
|
+
# session shares one entry — the cache is bound to the identity, not the
|
|
27
|
+
# rotating token). Matches the Java driver: a basic-auth principal is NOT
|
|
28
|
+
# folded into the impersonated-user space
|
|
29
|
+
# (Optimization:HomeDbCacheBasicPrincipalIsImpersonatedUser stays off).
|
|
30
|
+
def compute_key(imp_user, auth) = imp_user || auth
|
|
31
|
+
|
|
32
|
+
# The cached database for this key, or nil on a miss. Touches recency.
|
|
33
|
+
def get(key)
|
|
34
|
+
@mutex.synchronize do
|
|
35
|
+
next nil unless @entries.key?(key)
|
|
36
|
+
|
|
37
|
+
database = @entries.delete(key)
|
|
38
|
+
@entries[key] = database
|
|
39
|
+
database
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Remember (or refresh) the resolved home database for this key. A nil
|
|
44
|
+
# database is ignored — there's nothing to guess next time.
|
|
45
|
+
def set(key, database)
|
|
46
|
+
return if database.nil?
|
|
47
|
+
|
|
48
|
+
@mutex.synchronize do
|
|
49
|
+
@entries.delete(key)
|
|
50
|
+
@entries[key] = database
|
|
51
|
+
@entries.shift while @entries.size > @max_size
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module Internal
|
|
6
|
+
# Auth-token manager: anything responding to
|
|
7
|
+
#
|
|
8
|
+
# get_token -> AuthToken
|
|
9
|
+
# handle_security_exception(token, exception) -> Boolean
|
|
10
|
+
#
|
|
11
|
+
# is a manager. Pass an instance to `GraphDatabase.driver` via the
|
|
12
|
+
# `:auth_token_manager` kw arg and the driver will call back into
|
|
13
|
+
# it when it needs a fresh token or when the server rejects the
|
|
14
|
+
# current one.
|
|
15
|
+
#
|
|
16
|
+
# This concrete class is the Proc-based shortcut — supply two
|
|
17
|
+
# callables and you're done. Clients that need richer behaviour
|
|
18
|
+
# subclass and override the methods; the JRuby flavour's class
|
|
19
|
+
# additionally implements `org.neo4j.driver.AuthTokenManager`, so
|
|
20
|
+
# subclasses there automatically slot into the Java driver.
|
|
21
|
+
class InternalAuthTokenManager
|
|
22
|
+
def initialize(get_token:, handle_security_exception:)
|
|
23
|
+
@get_token = get_token
|
|
24
|
+
@handle_security_exception = handle_security_exception
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def get_token
|
|
28
|
+
@get_token.call
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def handle_security_exception(token, exception)
|
|
32
|
+
@handle_security_exception.call(token, exception)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module Internal
|
|
6
|
+
# Driver metrics surface (testkit's `driver.metrics`). Today only the
|
|
7
|
+
# per-server connection-pool metrics are exposed — how many connections
|
|
8
|
+
# to each server address are in use vs. idle — which is what testkit's
|
|
9
|
+
# GetConnectionPoolMetrics / test_should_drop_connections_failing_
|
|
10
|
+
# liveness_check reads. The provider (Direct or Routing::LoadBalancer)
|
|
11
|
+
# owns the pools, so it produces the per-address snapshots.
|
|
12
|
+
class Metrics
|
|
13
|
+
# Per-server-address snapshot. `address` is a Routing::ServerAddress
|
|
14
|
+
# (responds to #host/#port so the testkit handler can match it). `#id`
|
|
15
|
+
# is the "host:port" string form, the forward-compatible duck-typed key
|
|
16
|
+
# DECISIONS.md (2026-06-05) describes for a future metrics contract.
|
|
17
|
+
ConnectionPoolMetrics = Struct.new(:address, :in_use, :idle) do
|
|
18
|
+
def id = address.to_s
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def initialize(connection_provider)
|
|
22
|
+
@connection_provider = connection_provider
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def connection_pool_metrics
|
|
26
|
+
@connection_provider.connection_pool_metrics
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module Internal
|
|
6
|
+
module Security
|
|
7
|
+
# MRI counterpart to Java's
|
|
8
|
+
# `org.neo4j.driver.internal.security.StaticAuthTokenManager`.
|
|
9
|
+
# Returns the same `AuthToken` forever and never treats a
|
|
10
|
+
# security exception as retryable. Subclasses our
|
|
11
|
+
# duck-typed `Neo4j::Driver::AuthTokenManager` so the protocol
|
|
12
|
+
# — `get_token` / `handle_security_exception` — matches
|
|
13
|
+
# everything else MRI consumes.
|
|
14
|
+
class StaticAuthTokenManager < InternalAuthTokenManager
|
|
15
|
+
def initialize(token)
|
|
16
|
+
super(
|
|
17
|
+
get_token: -> { token },
|
|
18
|
+
handle_security_exception: ->(_, _) { false }
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -16,12 +16,26 @@ module Neo4j
|
|
|
16
16
|
|
|
17
17
|
def self.require_non_nil!(obj, message = nil)
|
|
18
18
|
raise ArgumentError, [message, "can't be nil"].compact.join(' ') if obj.nil?
|
|
19
|
+
|
|
19
20
|
obj
|
|
20
21
|
end
|
|
21
22
|
|
|
23
|
+
# Matches Java's driver-side query-text validation (the JRuby
|
|
24
|
+
# flavour gets this for free from the Java driver). A Query
|
|
25
|
+
# object carries its own text, so only bare strings are checked.
|
|
26
|
+
def self.require_query_text!(query)
|
|
27
|
+
raise ArgumentError, 'Cypher query text should not be null' if query.nil?
|
|
28
|
+
if query.is_a?(String) && query.strip.empty?
|
|
29
|
+
raise ArgumentError,
|
|
30
|
+
'Cypher query text should not be an empty string'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
query
|
|
34
|
+
end
|
|
35
|
+
|
|
22
36
|
def self.require_non_nil_credentials!(username, password)
|
|
23
|
-
require_non_nil! username,
|
|
24
|
-
require_non_nil! password,
|
|
37
|
+
require_non_nil! username, 'Username'
|
|
38
|
+
require_non_nil! password, 'Password'
|
|
25
39
|
end
|
|
26
40
|
end
|
|
27
41
|
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
# Mirrors Java's org.neo4j.driver.net package — just enough to let
|
|
6
|
+
# cross-flavour callers (testkit-backend, user resolver code) build
|
|
7
|
+
# ServerAddress values without branching on flavour.
|
|
8
|
+
module Net
|
|
9
|
+
ServerAddress = Data.define(:host, :port) do
|
|
10
|
+
def self.of(host, port)
|
|
11
|
+
new(host, port)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# "host:port" (IPv6 hosts bracketed) — matches Java's
|
|
15
|
+
# ServerAddress.toString and Routing::ServerAddress#to_s. Without
|
|
16
|
+
# this, the default Data inspect (`#<data … host="h", port=N>`)
|
|
17
|
+
# leaks anywhere a caller stringifies the address: a custom
|
|
18
|
+
# resolver returns Net::ServerAddress values and
|
|
19
|
+
# Bolt::Connection#split_addr does `addr.to_s.rpartition(":")`,
|
|
20
|
+
# which then split on the `::` inside the class name and fed the
|
|
21
|
+
# tail to Integer() — the ArgumentError across the v4x4/v5x0
|
|
22
|
+
# resolver routing tests.
|
|
23
|
+
def to_s
|
|
24
|
+
host.include?(':') && !host.start_with?('[') ? "[#{host}]:#{port}" : "#{host}:#{port}"
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module PackStream
|
|
6
|
+
# PackStream wire-format marker bytes.
|
|
7
|
+
# See https://neo4j.com/docs/bolt/current/packstream/ for the full table.
|
|
8
|
+
module Markers
|
|
9
|
+
TINY_STRING = 0x80
|
|
10
|
+
TINY_LIST = 0x90
|
|
11
|
+
TINY_MAP = 0xA0
|
|
12
|
+
TINY_STRUCT = 0xB0
|
|
13
|
+
|
|
14
|
+
NULL = 0xC0
|
|
15
|
+
FLOAT_64 = 0xC1
|
|
16
|
+
BOOLEAN_FALSE = 0xC2
|
|
17
|
+
BOOLEAN_TRUE = 0xC3
|
|
18
|
+
|
|
19
|
+
INT_8 = 0xC8
|
|
20
|
+
INT_16 = 0xC9
|
|
21
|
+
INT_32 = 0xCA
|
|
22
|
+
INT_64 = 0xCB
|
|
23
|
+
|
|
24
|
+
BYTES_8 = 0xCC
|
|
25
|
+
BYTES_16 = 0xCD
|
|
26
|
+
BYTES_32 = 0xCE
|
|
27
|
+
|
|
28
|
+
STRING_8 = 0xD0
|
|
29
|
+
STRING_16 = 0xD1
|
|
30
|
+
STRING_32 = 0xD2
|
|
31
|
+
|
|
32
|
+
LIST_8 = 0xD4
|
|
33
|
+
LIST_16 = 0xD5
|
|
34
|
+
LIST_32 = 0xD6
|
|
35
|
+
|
|
36
|
+
MAP_8 = 0xD8
|
|
37
|
+
MAP_16 = 0xD9
|
|
38
|
+
MAP_32 = 0xDA
|
|
39
|
+
|
|
40
|
+
STRUCT_8 = 0xDC
|
|
41
|
+
STRUCT_16 = 0xDD
|
|
42
|
+
|
|
43
|
+
# PackStream V2 (Bolt 6.1+): a UUID is a top-level value — the marker
|
|
44
|
+
# 0xE0 followed by the 16 raw bytes (big-endian) — not a struct.
|
|
45
|
+
UUID = 0xE0
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|