neo4j-ruby-driver 1.7.6 → 4.4.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (339) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +26 -42
  3. data/lib/loader.rb +2 -1
  4. data/lib/neo4j/driver/auto_closable.rb +2 -2
  5. data/lib/neo4j/driver/exceptions/authentication_exception.rb +6 -1
  6. data/lib/neo4j/driver/exceptions/authorization_expired_exception.rb +14 -0
  7. data/lib/neo4j/driver/{types/bytes.rb → exceptions/certificate_exception.rb} +2 -2
  8. data/lib/neo4j/driver/exceptions/client_exception.rb +3 -0
  9. data/lib/neo4j/driver/exceptions/connection_read_timeout_exception.rb +14 -0
  10. data/lib/neo4j/driver/exceptions/database_exception.rb +3 -0
  11. data/lib/neo4j/driver/exceptions/discovery_exception.rb +16 -0
  12. data/lib/neo4j/driver/exceptions/fatal_discovery_exception.rb +13 -0
  13. data/lib/neo4j/driver/exceptions/protocol_exception.rb +7 -0
  14. data/lib/neo4j/driver/exceptions/result_consumed_exception.rb +13 -0
  15. data/lib/neo4j/driver/exceptions/security_exception.rb +5 -1
  16. data/lib/neo4j/driver/exceptions/service_unavailable_exception.rb +2 -0
  17. data/lib/neo4j/driver/exceptions/session_expired_exception.rb +4 -0
  18. data/lib/neo4j/driver/exceptions/token_expired_exception.rb +15 -0
  19. data/lib/neo4j/driver/exceptions/transaction_nesting_exception.rb +11 -0
  20. data/lib/neo4j/driver/exceptions/transient_exception.rb +3 -0
  21. data/lib/neo4j/driver/exceptions/untrusted_server_exception.rb +1 -0
  22. data/lib/neo4j/driver/exceptions/value/lossy_coercion.rb +15 -0
  23. data/lib/neo4j/driver/exceptions/value/not_multi_valued.rb +13 -0
  24. data/lib/neo4j/driver/exceptions/value/uncoercible.rb +15 -0
  25. data/lib/neo4j/driver/exceptions/value/unsizable.rb +12 -0
  26. data/lib/neo4j/driver/exceptions/value/value_exception.rb +12 -0
  27. data/lib/neo4j/driver/internal/bolt_server_address.rb +97 -0
  28. data/lib/neo4j/driver/internal/duration_normalizer.rb +1 -1
  29. data/lib/neo4j/driver/internal/validator.rb +5 -4
  30. data/{ffi/neo4j/driver/summary/statement_type.rb → lib/neo4j/driver/summary/query_type.rb} +1 -3
  31. data/lib/neo4j/driver/synchronizable.rb +23 -0
  32. data/lib/neo4j/driver/version.rb +1 -1
  33. data/lib/neo4j_ruby_driver.rb +5 -11
  34. data/{ffi → ruby}/neo4j/driver/access_mode.rb +2 -2
  35. data/ruby/neo4j/driver/auth_tokens.rb +34 -0
  36. data/ruby/neo4j/driver/bookmark.rb +21 -0
  37. data/ruby/neo4j/driver/config.rb +91 -0
  38. data/ruby/neo4j/driver/graph_database.rb +140 -0
  39. data/ruby/neo4j/driver/internal/async/connection/bolt_protocol_util.rb +51 -0
  40. data/ruby/neo4j/driver/internal/async/connection/bootstrap_factory.rb +22 -0
  41. data/ruby/neo4j/driver/internal/async/connection/channel_attributes.rb +31 -0
  42. data/ruby/neo4j/driver/internal/async/connection/channel_connected_listener.rb +32 -0
  43. data/ruby/neo4j/driver/internal/async/connection/channel_connector_impl.rb +77 -0
  44. data/ruby/neo4j/driver/internal/async/connection/channel_pipeline_builder_impl.rb +22 -0
  45. data/ruby/neo4j/driver/internal/async/connection/direct_connection.rb +30 -0
  46. data/ruby/neo4j/driver/internal/async/connection/event_loop_group_factory.rb +83 -0
  47. data/ruby/neo4j/driver/internal/async/connection/handshake_completed_listener.rb +27 -0
  48. data/ruby/neo4j/driver/internal/async/connection/handshake_handler.rb +113 -0
  49. data/ruby/neo4j/driver/internal/async/connection/netty_channel_initializer.rb +57 -0
  50. data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver.rb +26 -0
  51. data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver_group.rb +19 -0
  52. data/ruby/neo4j/driver/internal/async/connection/routing_connection.rb +36 -0
  53. data/ruby/neo4j/driver/internal/async/connection/stream.rb +12 -0
  54. data/ruby/neo4j/driver/internal/async/connection/stream_reader.rb +16 -0
  55. data/ruby/neo4j/driver/internal/async/connection_context.rb +10 -0
  56. data/ruby/neo4j/driver/internal/async/immutable_connection_context.rb +24 -0
  57. data/ruby/neo4j/driver/internal/async/inbound/byte_buf_input.rb +30 -0
  58. data/ruby/neo4j/driver/internal/async/inbound/channel_error_handler.rb +77 -0
  59. data/ruby/neo4j/driver/internal/async/inbound/chunk_decoder.rb +41 -0
  60. data/ruby/neo4j/driver/internal/async/inbound/connect_timeout_handler.rb +32 -0
  61. data/ruby/neo4j/driver/internal/async/inbound/connection_read_timeout_handler.rb +17 -0
  62. data/ruby/neo4j/driver/internal/async/inbound/inbound_message_dispatcher.rb +172 -0
  63. data/ruby/neo4j/driver/internal/async/inbound/inbound_message_handler.rb +42 -0
  64. data/ruby/neo4j/driver/internal/async/inbound/message_decoder.rb +51 -0
  65. data/ruby/neo4j/driver/internal/async/internal_async_session.rb +98 -0
  66. data/ruby/neo4j/driver/internal/async/internal_async_transaction.rb +13 -0
  67. data/ruby/neo4j/driver/internal/async/leak_logging_network_session.rb +34 -0
  68. data/ruby/neo4j/driver/internal/async/network_connection.rb +196 -0
  69. data/ruby/neo4j/driver/internal/async/network_session.rb +152 -0
  70. data/ruby/neo4j/driver/internal/async/outbound/chunk_aware_byte_buf_output.rb +110 -0
  71. data/ruby/neo4j/driver/internal/async/outbound/outbound_message_handler.rb +39 -0
  72. data/ruby/neo4j/driver/internal/async/pool/channel.rb +63 -0
  73. data/ruby/neo4j/driver/internal/async/pool/connection_pool_impl.rb +149 -0
  74. data/ruby/neo4j/driver/internal/async/pool/controller.rb +25 -0
  75. data/ruby/neo4j/driver/internal/async/pool/netty_channel_health_checker.rb +87 -0
  76. data/ruby/neo4j/driver/internal/async/pool/netty_channel_pool.rb +52 -0
  77. data/ruby/neo4j/driver/internal/async/pool/netty_channel_tracker.rb +137 -0
  78. data/ruby/neo4j/driver/internal/async/pool/network_connection_factory.rb +21 -0
  79. data/ruby/neo4j/driver/internal/async/pool/pool_settings.rb +34 -0
  80. data/ruby/neo4j/driver/internal/async/result_cursors_holder.rb +17 -0
  81. data/ruby/neo4j/driver/internal/async/unmanaged_transaction.rb +214 -0
  82. data/ruby/neo4j/driver/internal/bookmark_holder.rb +9 -0
  83. data/ruby/neo4j/driver/internal/cluster/cluster_composition.rb +58 -0
  84. data/ruby/neo4j/driver/internal/cluster/cluster_composition_lookup_result.rb +14 -0
  85. data/ruby/neo4j/driver/internal/cluster/cluster_routing_table.rb +139 -0
  86. data/ruby/neo4j/driver/internal/cluster/identity_resolver.rb +13 -0
  87. data/ruby/neo4j/driver/internal/cluster/loadbalancing/least_connected_load_balancing_strategy.rb +68 -0
  88. data/ruby/neo4j/driver/internal/cluster/loadbalancing/load_balancer.rb +159 -0
  89. data/ruby/neo4j/driver/internal/cluster/loadbalancing/round_robin_array_index.rb +13 -0
  90. data/ruby/neo4j/driver/internal/cluster/multi_databases_routing_procedure_runner.rb +34 -0
  91. data/ruby/neo4j/driver/internal/cluster/rediscovery_impl.rb +238 -0
  92. data/ruby/neo4j/driver/internal/cluster/route_message_routing_procedure_runner.rb +43 -0
  93. data/ruby/neo4j/driver/internal/cluster/routing_context.rb +77 -0
  94. data/ruby/neo4j/driver/internal/cluster/routing_procedure_cluster_composition_provider.rb +64 -0
  95. data/ruby/neo4j/driver/internal/cluster/routing_procedure_response.rb +19 -0
  96. data/ruby/neo4j/driver/internal/cluster/routing_settings.rb +24 -0
  97. data/ruby/neo4j/driver/internal/cluster/routing_table_handler_impl.rb +116 -0
  98. data/ruby/neo4j/driver/internal/cluster/routing_table_registry_impl.rb +140 -0
  99. data/ruby/neo4j/driver/internal/cluster/single_database_routing_procedure_runner.rb +76 -0
  100. data/ruby/neo4j/driver/internal/connection_settings.rb +16 -0
  101. data/ruby/neo4j/driver/internal/cursor/async_result_cursor_impl.rb +76 -0
  102. data/ruby/neo4j/driver/internal/cursor/async_result_cursor_only_factory.rb +29 -0
  103. data/ruby/neo4j/driver/internal/cursor/disposable_async_result_cursor.rb +59 -0
  104. data/ruby/neo4j/driver/internal/cursor/result_cursor_factory_impl.rb +29 -0
  105. data/ruby/neo4j/driver/internal/cursor/rx_result_cursor_impl.rb +110 -0
  106. data/ruby/neo4j/driver/internal/database_name.rb +12 -0
  107. data/ruby/neo4j/driver/internal/database_name_util.rb +37 -0
  108. data/ruby/neo4j/driver/internal/default_bookmark_holder.rb +15 -0
  109. data/ruby/neo4j/driver/internal/default_domain_name_resolver.rb +11 -0
  110. data/ruby/neo4j/driver/internal/direct_connection_provider.rb +40 -0
  111. data/ruby/neo4j/driver/internal/driver_factory.rb +127 -0
  112. data/ruby/neo4j/driver/internal/handlers/begin_tx_response_handler.rb +20 -0
  113. data/ruby/neo4j/driver/internal/handlers/channel_releasing_reset_response_handler.rb +29 -0
  114. data/ruby/neo4j/driver/internal/handlers/commit_tx_response_handler.rb +25 -0
  115. data/ruby/neo4j/driver/internal/handlers/hello_response_handler.rb +65 -0
  116. data/ruby/neo4j/driver/internal/handlers/init_response_handler.rb +34 -0
  117. data/ruby/neo4j/driver/internal/handlers/legacy_pull_all_response_handler.rb +228 -0
  118. data/ruby/neo4j/driver/internal/handlers/no_op_response_handler.rb +16 -0
  119. data/ruby/neo4j/driver/internal/handlers/ping_response_handler.rb +29 -0
  120. data/ruby/neo4j/driver/internal/handlers/pull_handlers.rb +32 -0
  121. data/ruby/neo4j/driver/internal/handlers/pulln/auto_pull_response_handler.rb +174 -0
  122. data/ruby/neo4j/driver/internal/handlers/pulln/basic_pull_response_handler.rb +288 -0
  123. data/ruby/neo4j/driver/internal/handlers/pulln/fetch_size_util.rb +20 -0
  124. data/ruby/neo4j/driver/internal/handlers/reset_response_handler.rb +34 -0
  125. data/ruby/neo4j/driver/internal/handlers/rollback_tx_response_handler.rb +19 -0
  126. data/ruby/neo4j/driver/internal/handlers/route_message_response_handler.rb +21 -0
  127. data/ruby/neo4j/driver/internal/handlers/routing_response_handler.rb +70 -0
  128. data/ruby/neo4j/driver/internal/handlers/run_response_handler.rb +37 -0
  129. data/ruby/neo4j/driver/internal/handlers/session_pull_response_completion_listener.rb +34 -0
  130. data/ruby/neo4j/driver/internal/handlers/transaction_pull_response_completion_listener.rb +20 -0
  131. data/ruby/neo4j/driver/internal/impersonation_util.rb +22 -0
  132. data/ruby/neo4j/driver/internal/internal_bookmark.rb +38 -0
  133. data/ruby/neo4j/driver/internal/internal_database_name.rb +11 -0
  134. data/ruby/neo4j/driver/internal/internal_driver.rb +78 -0
  135. data/ruby/neo4j/driver/internal/internal_entity.rb +22 -0
  136. data/ruby/neo4j/driver/internal/internal_node.rb +21 -0
  137. data/ruby/neo4j/driver/internal/internal_pair.rb +9 -0
  138. data/ruby/neo4j/driver/internal/internal_path.rb +35 -0
  139. data/ruby/neo4j/driver/internal/internal_point2_d.rb +9 -0
  140. data/ruby/neo4j/driver/internal/internal_point3_d.rb +6 -0
  141. data/{ffi → ruby}/neo4j/driver/internal/internal_record.rb +2 -1
  142. data/ruby/neo4j/driver/internal/internal_relationship.rb +26 -0
  143. data/ruby/neo4j/driver/internal/internal_result.rb +60 -0
  144. data/ruby/neo4j/driver/internal/internal_session.rb +81 -0
  145. data/ruby/neo4j/driver/internal/internal_transaction.rb +48 -0
  146. data/ruby/neo4j/driver/internal/logging/channel_activity_logger.rb +29 -0
  147. data/ruby/neo4j/driver/internal/logging/channel_error_logger.rb +17 -0
  148. data/ruby/neo4j/driver/internal/logging/prefixed_logger.rb +19 -0
  149. data/ruby/neo4j/driver/internal/logging/reformatted_logger.rb +17 -0
  150. data/ruby/neo4j/driver/internal/messaging/abstract_message_writer.rb +23 -0
  151. data/ruby/neo4j/driver/internal/messaging/bolt_protocol.rb +30 -0
  152. data/ruby/neo4j/driver/internal/messaging/bolt_protocol_version.rb +46 -0
  153. data/ruby/neo4j/driver/internal/messaging/common/common_message_reader.rb +51 -0
  154. data/ruby/neo4j/driver/internal/messaging/common/common_value.rb +31 -0
  155. data/ruby/neo4j/driver/internal/messaging/common/common_value_packer.rb +101 -0
  156. data/ruby/neo4j/driver/internal/messaging/common/common_value_unpacker.rb +234 -0
  157. data/ruby/neo4j/driver/internal/messaging/encode/begin_message_encoder.rb +15 -0
  158. data/ruby/neo4j/driver/internal/messaging/encode/commit_message_encoder.rb +14 -0
  159. data/ruby/neo4j/driver/internal/messaging/encode/discard_all_message_encoder.rb +14 -0
  160. data/ruby/neo4j/driver/internal/messaging/encode/discard_message_encoder.rb +15 -0
  161. data/ruby/neo4j/driver/internal/messaging/encode/goodbye_message_encoder.rb +14 -0
  162. data/ruby/neo4j/driver/internal/messaging/encode/hello_message_encoder.rb +15 -0
  163. data/ruby/neo4j/driver/internal/messaging/encode/init_message_encoder.rb +16 -0
  164. data/ruby/neo4j/driver/internal/messaging/encode/pull_all_message_encoder.rb +14 -0
  165. data/ruby/neo4j/driver/internal/messaging/encode/pull_message_encoder.rb +15 -0
  166. data/ruby/neo4j/driver/internal/messaging/encode/reset_message_encoder.rb +14 -0
  167. data/ruby/neo4j/driver/internal/messaging/encode/rollback_message_encoder.rb +14 -0
  168. data/ruby/neo4j/driver/internal/messaging/encode/route_message_encoder.rb +18 -0
  169. data/ruby/neo4j/driver/internal/messaging/encode/route_v44_message_encoder.rb +27 -0
  170. data/ruby/neo4j/driver/internal/messaging/encode/run_message_encoder.rb +16 -0
  171. data/ruby/neo4j/driver/internal/messaging/encode/run_with_metadata_message_encoder.rb +17 -0
  172. data/ruby/neo4j/driver/internal/messaging/request/abstract_streaming_message.rb +22 -0
  173. data/ruby/neo4j/driver/internal/messaging/request/begin_message.rb +26 -0
  174. data/ruby/neo4j/driver/internal/messaging/request/commit_message.rb +20 -0
  175. data/ruby/neo4j/driver/internal/messaging/request/discard_all_message.rb +20 -0
  176. data/ruby/neo4j/driver/internal/messaging/request/discard_message.rb +23 -0
  177. data/ruby/neo4j/driver/internal/messaging/request/goodbye_message.rb +20 -0
  178. data/ruby/neo4j/driver/internal/messaging/request/hello_message.rb +31 -0
  179. data/ruby/neo4j/driver/internal/messaging/request/init_message.rb +19 -0
  180. data/ruby/neo4j/driver/internal/messaging/request/message_with_metadata.rb +10 -0
  181. data/ruby/neo4j/driver/internal/messaging/request/multi_database_util.rb +26 -0
  182. data/ruby/neo4j/driver/internal/messaging/request/pull_all_message.rb +23 -0
  183. data/ruby/neo4j/driver/internal/messaging/request/pull_message.rb +22 -0
  184. data/ruby/neo4j/driver/internal/messaging/request/reset_message.rb +32 -0
  185. data/ruby/neo4j/driver/internal/messaging/request/rollback_message.rb +20 -0
  186. data/ruby/neo4j/driver/internal/messaging/request/route_message.rb +33 -0
  187. data/ruby/neo4j/driver/internal/messaging/request/run_message.rb +23 -0
  188. data/ruby/neo4j/driver/internal/messaging/request/run_with_metadata_message.rb +47 -0
  189. data/ruby/neo4j/driver/internal/messaging/request/transaction_metadata_builder.rb +24 -0
  190. data/ruby/neo4j/driver/internal/messaging/response/failure_message.rb +40 -0
  191. data/ruby/neo4j/driver/internal/messaging/response/ignored_message.rb +29 -0
  192. data/ruby/neo4j/driver/internal/messaging/response/record_message.rb +33 -0
  193. data/ruby/neo4j/driver/internal/messaging/response/success_message.rb +34 -0
  194. data/ruby/neo4j/driver/internal/messaging/v3/bolt_protocol_v3.rb +79 -0
  195. data/ruby/neo4j/driver/internal/messaging/v3/message_format_v3.rb +17 -0
  196. data/ruby/neo4j/driver/internal/messaging/v3/message_writer_v3.rb +32 -0
  197. data/ruby/neo4j/driver/internal/messaging/v4/bolt_protocol_v4.rb +29 -0
  198. data/ruby/neo4j/driver/internal/messaging/v4/message_format_v4.rb +17 -0
  199. data/ruby/neo4j/driver/internal/messaging/v4/message_writer_v4.rb +33 -0
  200. data/ruby/neo4j/driver/internal/messaging/v41/bolt_protocol_v41.rb +25 -0
  201. data/ruby/neo4j/driver/internal/messaging/v42/bolt_protocol_v42.rb +13 -0
  202. data/ruby/neo4j/driver/internal/messaging/v43/bolt_protocol_v43.rb +19 -0
  203. data/ruby/neo4j/driver/internal/messaging/v43/message_format_v43.rb +18 -0
  204. data/ruby/neo4j/driver/internal/messaging/v43/message_writer_v43.rb +39 -0
  205. data/ruby/neo4j/driver/internal/messaging/v44/bolt_protocol_v44.rb +17 -0
  206. data/ruby/neo4j/driver/internal/messaging/v44/message_format_v44.rb +18 -0
  207. data/ruby/neo4j/driver/internal/messaging/v44/message_writer_v44.rb +30 -0
  208. data/ruby/neo4j/driver/internal/metrics/connection_pool_metrics_listener.rb +34 -0
  209. data/ruby/neo4j/driver/internal/metrics/internal_abstract_metrics.rb +46 -0
  210. data/ruby/neo4j/driver/internal/metrics/internal_connection_pool_metrics.rb +105 -0
  211. data/ruby/neo4j/driver/internal/metrics/internal_metrics.rb +82 -0
  212. data/ruby/neo4j/driver/internal/metrics/internal_metrics_provider.rb +18 -0
  213. data/ruby/neo4j/driver/internal/metrics/listener_event.rb +17 -0
  214. data/ruby/neo4j/driver/internal/metrics/metrics_provider.rb +24 -0
  215. data/ruby/neo4j/driver/internal/metrics/time_recorder_listener_event.rb +15 -0
  216. data/ruby/neo4j/driver/internal/packstream/byte_array_incompatible_packer.rb +12 -0
  217. data/ruby/neo4j/driver/internal/packstream/pack_input.rb +47 -0
  218. data/ruby/neo4j/driver/internal/packstream/pack_output.rb +39 -0
  219. data/ruby/neo4j/driver/internal/packstream/pack_stream.rb +326 -0
  220. data/ruby/neo4j/driver/internal/packstream/pack_type.rb +17 -0
  221. data/ruby/neo4j/driver/internal/retry/exponential_backoff_retry_logic.rb +151 -0
  222. data/ruby/neo4j/driver/internal/revocation_strategy.rb +19 -0
  223. data/ruby/neo4j/driver/internal/scheme.rb +32 -0
  224. data/ruby/neo4j/driver/internal/security/internal_auth_token.rb +15 -0
  225. data/ruby/neo4j/driver/internal/security/security_plan_impl.rb +92 -0
  226. data/ruby/neo4j/driver/internal/security_setting.rb +73 -0
  227. data/ruby/neo4j/driver/internal/session_factory_impl.rb +32 -0
  228. data/ruby/neo4j/driver/internal/spi/connection.rb +19 -0
  229. data/ruby/neo4j/driver/internal/spi/connection_pool.rb +9 -0
  230. data/ruby/neo4j/driver/internal/spi/response_handler.rb +23 -0
  231. data/ruby/neo4j/driver/internal/summary/internal_database_info.rb +7 -0
  232. data/ruby/neo4j/driver/internal/summary/internal_input_position.rb +11 -0
  233. data/ruby/neo4j/driver/internal/summary/internal_notification.rb +16 -0
  234. data/ruby/neo4j/driver/internal/summary/internal_plan.rb +41 -0
  235. data/ruby/neo4j/driver/internal/summary/internal_profiled_plan.rb +32 -0
  236. data/ruby/neo4j/driver/internal/summary/internal_result_summary.rb +33 -0
  237. data/ruby/neo4j/driver/internal/summary/internal_server_info.rb +6 -0
  238. data/ruby/neo4j/driver/internal/summary/internal_summary_counters.rb +18 -0
  239. data/ruby/neo4j/driver/internal/svm/netty_substitutions.rb +196 -0
  240. data/ruby/neo4j/driver/internal/svm/z_lib_substitutions.rb +21 -0
  241. data/ruby/neo4j/driver/internal/util/certificate_tool.rb +65 -0
  242. data/ruby/neo4j/driver/internal/util/clock.rb +29 -0
  243. data/ruby/neo4j/driver/internal/util/error_util.rb +104 -0
  244. data/ruby/neo4j/driver/internal/util/extract.rb +123 -0
  245. data/ruby/neo4j/driver/internal/util/format.rb +39 -0
  246. data/ruby/neo4j/driver/internal/util/futures.rb +99 -0
  247. data/ruby/neo4j/driver/internal/util/iterables.rb +35 -0
  248. data/ruby/neo4j/driver/internal/util/lock_util.rb +23 -0
  249. data/ruby/neo4j/driver/internal/util/metadata_extractor.rb +109 -0
  250. data/ruby/neo4j/driver/internal/util/mutex.rb +9 -0
  251. data/ruby/neo4j/driver/internal/util/preconditions.rb +16 -0
  252. data/ruby/neo4j/driver/internal/util/server_version.rb +60 -0
  253. data/ruby/neo4j/driver/logging1.rb +51 -0
  254. data/ruby/neo4j/driver/net/server_address1.rb +9 -0
  255. data/ruby/neo4j/driver/query.rb +48 -0
  256. data/ruby/neo4j/driver/records.rb +13 -0
  257. data/ruby/neo4j/driver/session_config.rb +15 -0
  258. data/ruby/neo4j/driver/transaction_config.rb +46 -0
  259. data/ruby/neo4j/driver/values.rb +26 -0
  260. data/ruby/neo4j/driver.rb +30 -0
  261. metadata +266 -91
  262. data/ffi/bolt/address.rb +0 -11
  263. data/ffi/bolt/address_resolver.rb +0 -12
  264. data/ffi/bolt/address_set.rb +0 -9
  265. data/ffi/bolt/auth.rb +0 -10
  266. data/ffi/bolt/auto_releasable.rb +0 -22
  267. data/ffi/bolt/boolean.rb +0 -9
  268. data/ffi/bolt/bytes.rb +0 -10
  269. data/ffi/bolt/config.rb +0 -45
  270. data/ffi/bolt/connection.rb +0 -44
  271. data/ffi/bolt/connector.rb +0 -17
  272. data/ffi/bolt/dictionary.rb +0 -15
  273. data/ffi/bolt/error.rb +0 -74
  274. data/ffi/bolt/float.rb +0 -9
  275. data/ffi/bolt/integer.rb +0 -9
  276. data/ffi/bolt/library.rb +0 -12
  277. data/ffi/bolt/lifecycle.rb +0 -9
  278. data/ffi/bolt/list.rb +0 -10
  279. data/ffi/bolt/log.rb +0 -16
  280. data/ffi/bolt/socket_options.rb +0 -14
  281. data/ffi/bolt/status.rb +0 -25
  282. data/ffi/bolt/string.rb +0 -9
  283. data/ffi/bolt/structure.rb +0 -10
  284. data/ffi/bolt/value.rb +0 -35
  285. data/ffi/neo4j/driver/auth_tokens.rb +0 -18
  286. data/ffi/neo4j/driver/config.rb +0 -40
  287. data/ffi/neo4j/driver/graph_database.rb +0 -52
  288. data/ffi/neo4j/driver/internal/async/access_mode_connection.rb +0 -19
  289. data/ffi/neo4j/driver/internal/async/direct_connection.rb +0 -106
  290. data/ffi/neo4j/driver/internal/bolt_server_address.rb +0 -18
  291. data/ffi/neo4j/driver/internal/bookmarks_holder.rb +0 -30
  292. data/ffi/neo4j/driver/internal/direct_connection_provider.rb +0 -28
  293. data/ffi/neo4j/driver/internal/driver_factory.rb +0 -126
  294. data/ffi/neo4j/driver/internal/error_handling.rb +0 -112
  295. data/ffi/neo4j/driver/internal/explicit_transaction.rb +0 -146
  296. data/ffi/neo4j/driver/internal/handlers/pull_all_response_handler.rb +0 -104
  297. data/ffi/neo4j/driver/internal/handlers/response_handler.rb +0 -49
  298. data/ffi/neo4j/driver/internal/handlers/run_response_handler.rb +0 -32
  299. data/ffi/neo4j/driver/internal/handlers/session_pull_all_response_handler.rb +0 -32
  300. data/ffi/neo4j/driver/internal/handlers/transaction_pull_all_response_handler.rb +0 -23
  301. data/ffi/neo4j/driver/internal/internal_driver.rb +0 -45
  302. data/ffi/neo4j/driver/internal/internal_logger.rb +0 -32
  303. data/ffi/neo4j/driver/internal/internal_resolver.rb +0 -31
  304. data/ffi/neo4j/driver/internal/internal_statement_result.rb +0 -52
  305. data/ffi/neo4j/driver/internal/messaging/bolt_protocol.rb +0 -24
  306. data/ffi/neo4j/driver/internal/messaging/v1/bolt_protocol_v1.rb +0 -59
  307. data/ffi/neo4j/driver/internal/messaging/v2/bolt_protocol_v2.rb +0 -16
  308. data/ffi/neo4j/driver/internal/messaging/v3/bolt_protocol_v3.rb +0 -63
  309. data/ffi/neo4j/driver/internal/network_session.rb +0 -129
  310. data/ffi/neo4j/driver/internal/retry/exponential_backoff_retry_logic.rb +0 -80
  311. data/ffi/neo4j/driver/internal/session_factory_impl.rb +0 -28
  312. data/ffi/neo4j/driver/internal/summary/internal_result_summary.rb +0 -67
  313. data/ffi/neo4j/driver/internal/summary/internal_server_info.rb +0 -19
  314. data/ffi/neo4j/driver/internal/summary/internal_summary_counters.rb +0 -23
  315. data/ffi/neo4j/driver/internal/util/metadata_extractor.rb +0 -15
  316. data/ffi/neo4j/driver/internal/value/base_time_value.rb +0 -22
  317. data/ffi/neo4j/driver/internal/value/date_value.rb +0 -25
  318. data/ffi/neo4j/driver/internal/value/duration_value.rb +0 -27
  319. data/ffi/neo4j/driver/internal/value/local_date_time_value.rb +0 -24
  320. data/ffi/neo4j/driver/internal/value/local_time_value.rb +0 -19
  321. data/ffi/neo4j/driver/internal/value/node_value.rb +0 -18
  322. data/ffi/neo4j/driver/internal/value/offset_time_value.rb +0 -25
  323. data/ffi/neo4j/driver/internal/value/path_value.rb +0 -41
  324. data/ffi/neo4j/driver/internal/value/point2_d_value.rb +0 -24
  325. data/ffi/neo4j/driver/internal/value/point3_d_value.rb +0 -24
  326. data/ffi/neo4j/driver/internal/value/relationship_value.rb +0 -18
  327. data/ffi/neo4j/driver/internal/value/structure_value.rb +0 -42
  328. data/ffi/neo4j/driver/internal/value/time_with_zone_id_value.rb +0 -25
  329. data/ffi/neo4j/driver/internal/value/time_with_zone_offset_value.rb +0 -28
  330. data/ffi/neo4j/driver/internal/value/unbound_relationship_value.rb +0 -18
  331. data/ffi/neo4j/driver/internal/value/value_adapter.rb +0 -101
  332. data/ffi/neo4j/driver/net/server_address.rb +0 -13
  333. data/ffi/neo4j/driver/statement.rb +0 -15
  334. data/ffi/neo4j/driver/types/entity.rb +0 -21
  335. data/ffi/neo4j/driver/types/node.rb +0 -16
  336. data/ffi/neo4j/driver/types/path.rb +0 -35
  337. data/ffi/neo4j/driver/types/relationship.rb +0 -19
  338. data/ffi/neo4j/driver.rb +0 -61
  339. data/lib/neo4j/driver/internal/ruby_signature.rb +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4299bc356ee0c406d130ff94440c61122a00061efd90cc66335b710700e7247e
4
- data.tar.gz: 1060ce101c95bac9e471c51ca04f0267efbd720826e5a301f9183bb2cce26194
3
+ metadata.gz: 66dae72d3ada4d96cffcce68f8caa4ca4d0077979b3f8e4062ab4743b127eefd
4
+ data.tar.gz: 03da615177758e34cf55aa8b0ae50ec10a03e6d80ed20dc89ddc1ccac7957085
5
5
  SHA512:
6
- metadata.gz: 9d18e0ef3c134175493f9fa555a30114dde1d4a768fe33fecfd6fc559560b965c600457f509a3ad40182598c66c5b5c93438449209e0fd5a2f7599ac52daa2bd
7
- data.tar.gz: e1ef7028d0c38b7e31e5201bf0fbca8d4d69329fd8eff78e5e6dea3bb6ed6fadfcced4dccbb46895c0f6511800c398f1756ae55e0dc4bcca2bbb6eeff70b2c17
6
+ metadata.gz: c624a88a71ba6c8dc3eee672058609aeadeed4890996d7e92e97682f8fb3ffff6d275720c99abe08be73765bfd266ae56b6fb4f87fcdd562e7db5428445624d9
7
+ data.tar.gz: ca7633a62d8654d82a23e7829e8b3b934fbdfbec13718193fd80a0671569d11e48fb9ebc81bbbe45a574c3a73b23b53e55dea4c4c1051c09a6329d1ec9490075
data/README.md CHANGED
@@ -3,37 +3,11 @@
3
3
  home :: https://github.com/neo4jrb/neo4j-ruby-driver
4
4
 
5
5
  This repository contains 2 implementation of a neo4j driver for ruby:
6
- - `neo4j-java-driver` based on official java implementation. It provides a thin wrapper over java driver (only in jruby).
7
- - `neo4j-ruby-driver` based on [seabolt](https://github.com/neo4j-drivers/seabolt) and [ffi](https://github.com/ffi/ffi). Available on all rubies (including jruby) and all platforms supported by seabolt.
6
+ - based on official java implementation. It provides a thin wrapper over the java driver (only on jruby).
7
+ - pure ruby implmementation. Available on all ruby versions >= 3.1.
8
8
 
9
9
  ## Installation
10
10
 
11
- ### neo4j-java-driver
12
-
13
- Add this line to your application's Gemfile:
14
-
15
- ```ruby
16
- gem 'neo4j-java-driver'
17
- ```
18
-
19
- And then execute:
20
-
21
- $ bundle
22
-
23
- Or install it yourself as:
24
-
25
- $ gem install neo4j-java-driver
26
-
27
- ### neo4j-ruby-driver
28
-
29
- As a prerequisite seabolt must be installed.
30
-
31
- On macOS
32
-
33
- $ brew install michael-simons/homebrew-seabolt/seabolt
34
-
35
- On other systems please follow the instructions to install [seabolt](https://github.com/neo4j-drivers/seabolt) either from package or source. Make sure the libseabolt17 ends up in a system lib path e.g. /usr/local/lib
36
-
37
11
  Add this line to your application's Gemfile:
38
12
 
39
13
  ```ruby
@@ -48,22 +22,20 @@ Or install it yourself as:
48
22
 
49
23
  $ gem install neo4j-ruby-driver
50
24
 
51
- ## Usage
25
+ ## Server Compatibility
52
26
 
53
- Both drivers implement identical API and can be used interchangeably. The API is to highest possible degree consistent with the official java driver.
54
- At this moment [The Neo4j Drivers Manual v1.7](https://neo4j.com/docs/driver-manual/1.7/) along with the ruby version of the [code fragments](https://github.com/neo4jrb/neo4j-ruby-driver/blob/master/docs/dev_manual_examples.rb) and the ruby specs provide the only documentation.
27
+ The compatibility with Neo4j Server versions is documented in the [Neo4j Knowledge Base](https://neo4j.com/developer/kb/neo4j-supported-versions/).
55
28
 
56
- [Neo4j Java Driver 1.7 API](https://neo4j.com/docs/api/java-driver/current/) can be helpful as well..
29
+ ## Usage
57
30
 
58
- ## Development
31
+ The API is to highest possible degree consistent with the official java driver.
32
+ At this moment [The Neo4j Drivers Manual v4.4](https://neo4j.com/docs/java-manual/current/) along with the ruby version of the [code fragments](https://github.com/neo4jrb/neo4j-ruby-driver/blob/master/docs/dev_manual_examples.rb) and the ruby specs provide the only documentation.
59
33
 
60
- This gem includes 2 different implementations: java driver based and another one using seabolt via ffi
34
+ [Neo4j Java Driver 4.3 API](https://neo4j.com/docs/api/java-driver/current/) can be helpful as well..
61
35
 
62
- For java driver based:
36
+ ## Development
63
37
 
64
- $ driver=java bin/setup
65
-
66
- FFI based same as above but with driver variable set:
38
+ This gem includes 2 different implementations: java driver wrapper and pure ruby driver
67
39
 
68
40
  $ bin/setup
69
41
 
@@ -73,10 +45,22 @@ To run the tests the following tools need to be installed:
73
45
 
74
46
  $ brew install python
75
47
  $ pip3 install --user git+https://github.com/klobuczek/boltkit@1.3#egg=boltkit
76
- $ neoctrl-install -e 4.0.2 servers
77
- $ neoctrl-configure servers/neo4j-enterprise-4.0.2 dbms.directories.import= dbms.default_listen_address=::
78
- $ neoctrl-set-initial-password password servers/neo4j-enterprise-4.0.2
79
- $ neoctrl-start servers/neo4j-enterprise-4.0.2
48
+ $ neoctrl-install -e 4.4.5 servers
49
+ $ neoctrl-configure servers/neo4j-enterprise-4.4.5 dbms.directories.import= dbms.default_listen_address=::
50
+ $ neoctrl-set-initial-password pass servers/neo4j-enterprise-4.4.5
51
+ $ neoctrl-start servers/neo4j-enterprise-4.4.5
52
+
53
+ To run the tests:
54
+ ```console
55
+ $ bin/setup
56
+ $ rspec spec
57
+ ```
58
+
59
+ In case of heap space memory error (`org.neo4j.driver.exceptions.DatabaseException: Java heap space`), you should limit the dbms memory, for example:
60
+
61
+ ```console
62
+ $ neoctrl-configure servers/neo4j-enterprise-4.4.5 dbms.memory.pagecache.size=600m dbms.memory.heap.max_size=600m dbms.memory.heap.initial_size=600m dbms.directories.import= dbms.connectors.default_listen_address=::
63
+ ```
80
64
 
81
65
  ## Contributing
82
66
 
data/lib/loader.rb CHANGED
@@ -8,7 +8,8 @@ class Loader
8
8
  loader.tag = 'neo4j-ruby-driver'
9
9
  loader.push_dir(File.expand_path(__dir__))
10
10
  loader.push_dir(File.dirname(File.dirname(caller_locations(1..1).first.path)))
11
- loader.ignore(File.expand_path('neo4j-java-driver_jars.rb', __dir__))
11
+ yield loader if block_given?
12
+ loader.ignore(File.expand_path('neo4j-*-driver_jars.rb', __dir__))
12
13
  loader.ignore(File.expand_path('neo4j_ruby_driver.rb', __dir__))
13
14
  loader.ignore(File.expand_path('org', __dir__))
14
15
  loader.inflector = Zeitwerk::GemInflector.new(File.expand_path('neo4j/driver', __dir__))
@@ -12,8 +12,8 @@ module Neo4j
12
12
  def with_block_definer(methods)
13
13
  Module.new do
14
14
  methods.each do |method|
15
- define_method(method) do |*args, &block|
16
- closable = super(*args)
15
+ define_method(method) do |*args, **kwargs, &block|
16
+ closable = super(*args, **kwargs)
17
17
  if block
18
18
  begin
19
19
  block.arity.zero? ? closable.instance_eval(&block) : block.call(closable)
@@ -3,7 +3,12 @@
3
3
  module Neo4j
4
4
  module Driver
5
5
  module Exceptions
6
- class AuthenticationException < Neo4jException
6
+ # Failed to authenticate the driver to the server due to bad credentials provided.
7
+ # When this error happens, the error could be recovered by closing the current driver and restart a new driver with
8
+ # the correct credentials.
9
+
10
+ # @since 1.1
11
+ class AuthenticationException < SecurityException
7
12
  end
8
13
  end
9
14
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Exceptions
6
+ # The authorization info maintained on the server has expired. The client should reconnect.
7
+ # <p>
8
+ # Error code: Neo.ClientError.Security.AuthorizationExpired
9
+ class AuthorizationExpiredException < SecurityException
10
+ DESCRIPTION = 'Authorization information kept on the server has expired, this connection is no longer valid.'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Neo4j
4
4
  module Driver
5
- module Types
6
- class Bytes < String
5
+ module Exceptions
6
+ class CertificateException
7
7
  end
8
8
  end
9
9
  end
@@ -3,6 +3,9 @@
3
3
  module Neo4j
4
4
  module Driver
5
5
  module Exceptions
6
+ # A <em>ClientException</em> indicates that the client has carried out an operation incorrectly.
7
+ # The error code provided can be used to determine further detail for the problem.
8
+ # @since 1.0
6
9
  class ClientException < Neo4jException
7
10
  class << self
8
11
  def unable_to_convert(object)
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Exceptions
6
+ # Indicates that read timed out due to it taking longer than the server-supplied timeout value via the {@code connection.recv_timeout_seconds} configuration
7
+ # hint. The server might provide this value to clients to let them know when a given connection may be considered broken if client does not get any
8
+ # communication from the server within the specified timeout period. This results in the server being removed from the routing table.
9
+ class ConnectionReadTimeoutException < ServiceUnavailableException
10
+ INSTANCE = new('Connection read timed out due to it taking longer than the server-supplied timeout value via configuration hint.')
11
+ end
12
+ end
13
+ end
14
+ end
@@ -3,6 +3,9 @@
3
3
  module Neo4j
4
4
  module Driver
5
5
  module Exceptions
6
+ # A <em>DatabaseException</em> indicates that there is a problem within the underlying database.
7
+ # The error code provided can be used to determine further detail for the problem.
8
+ # @since 1.0
6
9
  class DatabaseException < Neo4jException
7
10
  end
8
11
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Exceptions
6
+ # An error has happened while getting routing table with a remote server.
7
+ # While this error is not fatal and we might be able to recover if we continue trying on another server.
8
+ # If we fail to get a valid routing table from all routing servers known to this driver,
9
+ # then we will end up with a fatal error {@link ServiceUnavailableException}.
10
+
11
+ # If you see this error in your logs, it is safe to ignore if your cluster is temporarily changing structure during that time.
12
+ class DiscoveryException < Neo4jException
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Exceptions
6
+ # This error indicate a fatal problem to obtain routing tables such as the routing table for a specified database does not exist.
7
+ # This exception should not be retried.
8
+ # @since 4.0
9
+ class FatalDiscoveryException < ClientException
10
+ end
11
+ end
12
+ end
13
+ end
@@ -3,7 +3,14 @@
3
3
  module Neo4j
4
4
  module Driver
5
5
  module Exceptions
6
+ # A signal that the contract for client-server communication has broken down.
7
+ # The user should contact support and cannot resolve this his or herself.
6
8
  class ProtocolException < Neo4jException
9
+ CODE = "Protocol violation: "
10
+
11
+ def initialize(message, e)
12
+ super("#{CODE}message", e)
13
+ end
7
14
  end
8
15
  end
9
16
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Exceptions
6
+ # A user is trying to access resources that are no longer valid due to
7
+ # the resources have already been consumed or
8
+ # the {@link QueryRunner} where the resources are created has already been closed.
9
+ class ResultConsumedException < ClientException
10
+ end
11
+ end
12
+ end
13
+ end
@@ -3,7 +3,11 @@
3
3
  module Neo4j
4
4
  module Driver
5
5
  module Exceptions
6
- class SecurityException < Neo4jException
6
+ # Failed to communicate with the server due to security errors.
7
+ # When this type of error happens, the security cause of the error should be fixed to ensure the safety of your data.
8
+ # Restart of server/driver/cluster might be required to recover from this error.
9
+ # @since 1.1
10
+ class SecurityException < ClientException
7
11
  end
8
12
  end
9
13
  end
@@ -3,6 +3,8 @@
3
3
  module Neo4j
4
4
  module Driver
5
5
  module Exceptions
6
+ # An <em>ServiceUnavailableException</em> indicates that the driver cannot communicate with the cluster.
7
+ # @since 1.1
6
8
  class ServiceUnavailableException < Neo4jException
7
9
  end
8
10
  end
@@ -3,6 +3,10 @@
3
3
  module Neo4j
4
4
  module Driver
5
5
  module Exceptions
6
+ # A <em>SessionExpiredException</em> indicates that the session can no longer satisfy the criteria under which it
7
+ # was acquired, e.g. a server no longer accepts write requests. A new session needs to be acquired from the driver
8
+ # and all actions taken on the expired session must be replayed.
9
+ # @since 1.1
6
10
  class SessionExpiredException < Neo4jException
7
11
  end
8
12
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Exceptions
6
+ # The provided token has expired.
7
+ # <p>
8
+ # The current driver instance is considered invalid. It should not be used anymore. The client must create a new driver instance with a valid token.
9
+ # <p>
10
+ # Error code: Neo.ClientError.Security.TokenExpired
11
+ class TokenExpiredException < SecurityException
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Exceptions
6
+ # This exception indicates a user is nesting new transaction with an on-going transaction (unmanaged and/or auto-commit).
7
+ class TransactionNestingException < ClientException
8
+ end
9
+ end
10
+ end
11
+ end
@@ -3,6 +3,9 @@
3
3
  module Neo4j
4
4
  module Driver
5
5
  module Exceptions
6
+ # A <em>TransientException</em> signals a temporary fault that may be worked around by retrying.
7
+ # The error code provided can be used to determine further detail for the problem.
8
+ # @since 1.0
6
9
  class TransientException < Neo4jException
7
10
  end
8
11
  end
@@ -3,6 +3,7 @@
3
3
  module Neo4j
4
4
  module Driver
5
5
  module Exceptions
6
+ # Thrown if the remote server cannot be verified as Neo4j.
6
7
  class UntrustedServerException < RuntimeError
7
8
  end
8
9
  end
@@ -0,0 +1,15 @@
1
+ module Neo4j
2
+ module Driver
3
+ module Exceptions
4
+ module Value
5
+ # A <em>LossyCoercion</em> exception indicates that the conversion cannot be achieved without losing precision.
6
+ # @since 1.0
7
+ class LossyCoercion < ValueException
8
+ def initialize(source_type_name, destination_type_name)
9
+ super("Cannot coerce #{source_type_name} to #{destination_type_name} without losing precision")
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module Neo4j
2
+ module Driver
3
+ module Exceptions
4
+ module Value
5
+ # A <em>NotMultiValued</em> exception indicates that the value does not consist of multiple values, a.k.a. not a map
6
+ # or array.
7
+ # @since 1.0
8
+ class NotMultiValued < ValueException
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module Neo4j
2
+ module Driver
3
+ module Exceptions
4
+ module Value
5
+ # A <em>Uncoercible</em> exception indicates that the conversion cannot be achieved.
6
+ # @since 1.0
7
+ class Uncoercible < ValueException
8
+ def initialize(source_type_name, destination_type_name)
9
+ super("Cannot coerce #{source_type_name} to #{destination_type_name}")
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module Neo4j
2
+ module Driver
3
+ module Exceptions
4
+ module Value
5
+ # An <em>Unsizable</em> exception indicates that the value does not have a size.
6
+ # @since 1.0
7
+ class Unsizable < ValueException
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Neo4j
2
+ module Driver
3
+ module Exceptions
4
+ module Value
5
+ # A <em>ValueException</em> indicates that the client has carried out an operation on values incorrectly.
6
+ # @since 1.0
7
+ class ValueException < ClientException
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,97 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ # Holds a host and port pair that denotes a Bolt server address.
4
+ class BoltServerAddress
5
+ attr_reader :host, :connection_host, :port
6
+ delegate :hash, to: :attributes
7
+
8
+ DEFAULT_PORT = 7687
9
+
10
+ class << self
11
+ def host_from(uri)
12
+ uri&.host || (raise invalid_address_format(uri))
13
+ end
14
+
15
+ def port_from(uri)
16
+ uri&.port || DEFAULT_PORT
17
+ end
18
+
19
+ def uri_from(address)
20
+ scheme_split = address.split('://')
21
+
22
+ if scheme_split.length == 1
23
+ # URI can't parse addresses without scheme, prepend fake "bolt://" to reuse the parsing facility
24
+ scheme = 'bolt://'
25
+ host_port = host_port_from(scheme_split.first)
26
+ elsif scheme_split.length == 2
27
+ scheme = "#{scheme_split.first}://"
28
+ host_port = host_port_from(scheme_split.second)
29
+ else
30
+ raise invalid_address_format(address)
31
+ end
32
+
33
+ URI(scheme + host_port)
34
+ end
35
+
36
+ def host_port_from(address)
37
+ # expected to be an IPv6 address like [::1] or [::1]:7687
38
+ return address if address.start_with?('[')
39
+
40
+ contains_single_colon = address.index(':') == address.rindex(':')
41
+
42
+ # expected to be an IPv4 address with or without port like 127.0.0.1 or 127.0.0.1:7687
43
+ return address if contains_single_colon
44
+
45
+ # address contains multiple colons and does not start with '['
46
+ # expected to be an IPv6 address without brackets
47
+ "[#{address}]"
48
+ end
49
+
50
+ def invalid_address_format(address)
51
+ ArgumentError.new("Invalid address format #{address}")
52
+ end
53
+
54
+ def require_valid_port(port)
55
+ return port if port >= 0 && port <= 65_535
56
+
57
+ raise ArgumentError, "Illegal port: #{port}"
58
+ end
59
+ end
60
+
61
+ def initialize(uri: nil, host: self.class.host_from(uri), port: self.class.port_from(uri), connection_host: host)
62
+ @host = Validator.require_non_nil!(host)
63
+ @connection_host = Validator.require_non_nil!(connection_host)
64
+ @port = self.class.require_valid_port(port)
65
+ end
66
+
67
+ LOCAL_DEFAULT = new(host: 'localhost', port: DEFAULT_PORT)
68
+
69
+ def self.from(address)
70
+ address.is_a?(BoltServerAddress) ? address : new(address.host, address.port)
71
+ end
72
+
73
+ def eql?(other)
74
+ attributes.eql?(other&.attributes)
75
+ end
76
+
77
+ def to_s
78
+ "#{host}#{"(#{connection_host})" unless host == connection_host}:#{port}"
79
+ end
80
+
81
+ # Create a stream of unicast addresses.
82
+ # <p>
83
+ # While this implementation just returns a stream of itself, the subclasses may provide multiple addresses.
84
+
85
+ # @return stream of unicast addresses.
86
+ def unicast_stream
87
+ [self]
88
+ end
89
+
90
+ private
91
+
92
+ def attributes
93
+ [@host, @connection_host, @port]
94
+ end
95
+ end
96
+ end
97
+ end
@@ -18,7 +18,7 @@ module Neo4j
18
18
  end
19
19
 
20
20
  def milliseconds(duration)
21
- duration.in_milliseconds.round
21
+ duration&.in_milliseconds&.round
22
22
  end
23
23
 
24
24
  private
@@ -14,13 +14,14 @@ module Neo4j
14
14
  raise(ArgumentError, yield) unless obj.nil? || obj.is_a?(Hash)
15
15
  end
16
16
 
17
- def self.require_non_nil!(obj, message)
18
- raise ArgumentError, message if obj.nil?
17
+ def self.require_non_nil!(obj, message = nil)
18
+ raise ArgumentError, [message, "can't be nil"].compact.join(' ') if obj.nil?
19
+ obj
19
20
  end
20
21
 
21
22
  def self.require_non_nil_credentials!(username, password)
22
- require_non_nil! username, "Username can't be nil"
23
- require_non_nil! password, "Password can't be nil"
23
+ require_non_nil! username, "Username"
24
+ require_non_nil! password, "Password"
24
25
  end
25
26
  end
26
27
  end
@@ -1,9 +1,7 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Neo4j
4
2
  module Driver
5
3
  module Summary
6
- module StatementType
4
+ module QueryType
7
5
  READ_ONLY = 'r'
8
6
  READ_WRITE = 'rw'
9
7
  WRITE_ONLY = 'w'
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Synchronizable
6
+ def sync(*methods)
7
+ prepend with_sync_wrapper(methods)
8
+ end
9
+
10
+ private
11
+
12
+ def with_sync_wrapper(methods)
13
+ Module.new do
14
+ methods.each do |method|
15
+ define_method(method) do |*args, **kwargs, &block|
16
+ Sync { super(*args, **kwargs, &block) }
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Neo4j
4
4
  module Driver
5
- VERSION = '1.7.6'
5
+ VERSION = '4.4.0.alpha.1'
6
6
  end
7
7
  end
@@ -1,21 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Workaround for missing zeitwerk support in jruby-9.2.8.0
4
- if RUBY_PLATFORM.match?(/java/)
5
- module Neo4j
6
- module Driver
7
- module Exceptions
8
- end
9
- module Internal
10
- end
11
- end
3
+ module Neo4j
4
+ module Driver
12
5
  end
13
6
  end
14
- # End workaround
15
7
 
16
- require 'active_support'
8
+ require 'active_support/concern'
17
9
  require 'active_support/core_ext/hash/indifferent_access'
10
+ require 'active_support/isolated_execution_state' if Gem::Requirement.create('>= 7').satisfied_by?(Gem.loaded_specs["activesupport"].version) # TODO: this should not be necessary https://github.com/rails/rails/issues/43851
18
11
  require 'active_support/core_ext/numeric/time'
19
12
  require 'active_support/duration'
20
13
  require 'active_support/time'
21
14
  require 'neo4j/driver'
15
+ require 'uri'
@@ -3,8 +3,8 @@
3
3
  module Neo4j
4
4
  module Driver
5
5
  module AccessMode
6
- WRITE = 0
7
- READ = 1
6
+ WRITE = :write
7
+ READ = :read
8
8
  end
9
9
  end
10
10
  end