neo4j-ruby-driver 1.7.4 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +37 -42
  3. data/lib/loader.rb +5 -3
  4. data/lib/neo4j/driver/auto_closable.rb +2 -2
  5. data/lib/neo4j/driver/exceptions/authentication_exception.rb +6 -1
  6. data/lib/neo4j/driver/exceptions/authorization_expired_exception.rb +14 -0
  7. data/lib/neo4j/driver/{types/bytes.rb → exceptions/certificate_exception.rb} +2 -2
  8. data/lib/neo4j/driver/exceptions/client_exception.rb +3 -0
  9. data/lib/neo4j/driver/exceptions/connection_read_timeout_exception.rb +14 -0
  10. data/lib/neo4j/driver/exceptions/database_exception.rb +3 -0
  11. data/lib/neo4j/driver/exceptions/discovery_exception.rb +16 -0
  12. data/lib/neo4j/driver/exceptions/fatal_discovery_exception.rb +13 -0
  13. data/lib/neo4j/driver/exceptions/protocol_exception.rb +7 -0
  14. data/lib/neo4j/driver/exceptions/result_consumed_exception.rb +13 -0
  15. data/lib/neo4j/driver/exceptions/security_exception.rb +5 -1
  16. data/lib/neo4j/driver/exceptions/service_unavailable_exception.rb +2 -0
  17. data/lib/neo4j/driver/exceptions/session_expired_exception.rb +4 -0
  18. data/lib/neo4j/driver/exceptions/token_expired_exception.rb +15 -0
  19. data/lib/neo4j/driver/exceptions/transaction_nesting_exception.rb +11 -0
  20. data/lib/neo4j/driver/exceptions/transient_exception.rb +3 -0
  21. data/lib/neo4j/driver/exceptions/untrusted_server_exception.rb +1 -0
  22. data/lib/neo4j/driver/exceptions/value/lossy_coercion.rb +15 -0
  23. data/lib/neo4j/driver/exceptions/value/not_multi_valued.rb +13 -0
  24. data/lib/neo4j/driver/exceptions/value/uncoercible.rb +15 -0
  25. data/lib/neo4j/driver/exceptions/value/unsizable.rb +12 -0
  26. data/lib/neo4j/driver/exceptions/value/value_exception.rb +12 -0
  27. data/lib/neo4j/driver/internal/bolt_server_address.rb +97 -0
  28. data/lib/neo4j/driver/internal/duration_normalizer.rb +1 -1
  29. data/lib/neo4j/driver/internal/validator.rb +5 -4
  30. data/{ffi/neo4j/driver/summary/statement_type.rb → lib/neo4j/driver/summary/query_type.rb} +1 -3
  31. data/lib/neo4j/driver/synchronizable.rb +23 -0
  32. data/lib/neo4j/driver/types/time.rb +4 -2
  33. data/lib/neo4j_ruby_driver.rb +5 -10
  34. data/{ffi → ruby}/neo4j/driver/access_mode.rb +2 -2
  35. data/ruby/neo4j/driver/auth_tokens.rb +34 -0
  36. data/ruby/neo4j/driver/bookmark.rb +21 -0
  37. data/ruby/neo4j/driver/config.rb +89 -0
  38. data/ruby/neo4j/driver/graph_database.rb +80 -0
  39. data/ruby/neo4j/driver/internal/async/connection/bolt_protocol_util.rb +51 -0
  40. data/ruby/neo4j/driver/internal/async/connection/bootstrap_factory.rb +22 -0
  41. data/ruby/neo4j/driver/internal/async/connection/channel_attributes.rb +31 -0
  42. data/ruby/neo4j/driver/internal/async/connection/channel_connected_listener.rb +32 -0
  43. data/ruby/neo4j/driver/internal/async/connection/channel_connector_impl.rb +83 -0
  44. data/ruby/neo4j/driver/internal/async/connection/channel_pipeline_builder_impl.rb +22 -0
  45. data/ruby/neo4j/driver/internal/async/connection/direct_connection.rb +30 -0
  46. data/ruby/neo4j/driver/internal/async/connection/event_loop_group_factory.rb +83 -0
  47. data/ruby/neo4j/driver/internal/async/connection/handshake_completed_listener.rb +27 -0
  48. data/ruby/neo4j/driver/internal/async/connection/handshake_handler.rb +113 -0
  49. data/ruby/neo4j/driver/internal/async/connection/netty_channel_initializer.rb +57 -0
  50. data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver.rb +26 -0
  51. data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver_group.rb +19 -0
  52. data/ruby/neo4j/driver/internal/async/connection/routing_connection.rb +36 -0
  53. data/ruby/neo4j/driver/internal/async/connection/stream.rb +12 -0
  54. data/ruby/neo4j/driver/internal/async/connection/stream_reader.rb +16 -0
  55. data/ruby/neo4j/driver/internal/async/connection_context.rb +10 -0
  56. data/ruby/neo4j/driver/internal/async/immutable_connection_context.rb +24 -0
  57. data/ruby/neo4j/driver/internal/async/inbound/byte_buf_input.rb +30 -0
  58. data/ruby/neo4j/driver/internal/async/inbound/channel_error_handler.rb +77 -0
  59. data/ruby/neo4j/driver/internal/async/inbound/chunk_decoder.rb +41 -0
  60. data/ruby/neo4j/driver/internal/async/inbound/connect_timeout_handler.rb +32 -0
  61. data/ruby/neo4j/driver/internal/async/inbound/connection_read_timeout_handler.rb +17 -0
  62. data/ruby/neo4j/driver/internal/async/inbound/inbound_message_dispatcher.rb +171 -0
  63. data/ruby/neo4j/driver/internal/async/inbound/inbound_message_handler.rb +42 -0
  64. data/ruby/neo4j/driver/internal/async/inbound/message_decoder.rb +51 -0
  65. data/ruby/neo4j/driver/internal/async/internal_async_session.rb +98 -0
  66. data/ruby/neo4j/driver/internal/async/internal_async_transaction.rb +13 -0
  67. data/ruby/neo4j/driver/internal/async/leak_logging_network_session.rb +34 -0
  68. data/ruby/neo4j/driver/internal/async/network_connection.rb +194 -0
  69. data/ruby/neo4j/driver/internal/async/network_session.rb +150 -0
  70. data/ruby/neo4j/driver/internal/async/outbound/chunk_aware_byte_buf_output.rb +110 -0
  71. data/ruby/neo4j/driver/internal/async/outbound/outbound_message_handler.rb +39 -0
  72. data/ruby/neo4j/driver/internal/async/pool/channel.rb +62 -0
  73. data/ruby/neo4j/driver/internal/async/pool/channel_pool.rb +31 -0
  74. data/ruby/neo4j/driver/internal/async/pool/channel_tracker.rb +135 -0
  75. data/ruby/neo4j/driver/internal/async/pool/connection_pool_impl.rb +156 -0
  76. data/ruby/neo4j/driver/internal/async/pool/netty_channel_health_checker.rb +87 -0
  77. data/ruby/neo4j/driver/internal/async/pool/netty_channel_pool.rb +52 -0
  78. data/ruby/neo4j/driver/internal/async/pool/network_connection_factory.rb +21 -0
  79. data/ruby/neo4j/driver/internal/async/pool/pool_settings.rb +34 -0
  80. data/ruby/neo4j/driver/internal/async/pool/timed_stack.rb +15 -0
  81. data/ruby/neo4j/driver/internal/async/result_cursors_holder.rb +17 -0
  82. data/ruby/neo4j/driver/internal/async/unmanaged_transaction.rb +212 -0
  83. data/ruby/neo4j/driver/internal/bookmark_holder.rb +9 -0
  84. data/ruby/neo4j/driver/internal/cluster/cluster_composition.rb +48 -0
  85. data/ruby/neo4j/driver/internal/cluster/cluster_composition_lookup_result.rb +14 -0
  86. data/ruby/neo4j/driver/internal/cluster/cluster_routing_table.rb +122 -0
  87. data/ruby/neo4j/driver/internal/cluster/identity_resolver.rb +10 -0
  88. data/ruby/neo4j/driver/internal/cluster/loadbalancing/least_connected_load_balancing_strategy.rb +68 -0
  89. data/ruby/neo4j/driver/internal/cluster/loadbalancing/load_balancer.rb +125 -0
  90. data/ruby/neo4j/driver/internal/cluster/loadbalancing/round_robin_array_index.rb +13 -0
  91. data/ruby/neo4j/driver/internal/cluster/multi_databases_routing_procedure_runner.rb +31 -0
  92. data/ruby/neo4j/driver/internal/cluster/rediscovery_impl.rb +147 -0
  93. data/ruby/neo4j/driver/internal/cluster/route_message_routing_procedure_runner.rb +43 -0
  94. data/ruby/neo4j/driver/internal/cluster/routing_context.rb +77 -0
  95. data/ruby/neo4j/driver/internal/cluster/routing_procedure_cluster_composition_provider.rb +60 -0
  96. data/ruby/neo4j/driver/internal/cluster/routing_procedure_response.rb +35 -0
  97. data/ruby/neo4j/driver/internal/cluster/routing_settings.rb +24 -0
  98. data/ruby/neo4j/driver/internal/cluster/routing_table_handler_impl.rb +95 -0
  99. data/ruby/neo4j/driver/internal/cluster/routing_table_registry_impl.rb +121 -0
  100. data/ruby/neo4j/driver/internal/cluster/single_database_routing_procedure_runner.rb +73 -0
  101. data/ruby/neo4j/driver/internal/connection_settings.rb +16 -0
  102. data/ruby/neo4j/driver/internal/cursor/async_result_cursor_impl.rb +55 -0
  103. data/ruby/neo4j/driver/internal/cursor/async_result_cursor_only_factory.rb +24 -0
  104. data/ruby/neo4j/driver/internal/cursor/disposable_async_result_cursor.rb +61 -0
  105. data/ruby/neo4j/driver/internal/cursor/result_cursor_factory_impl.rb +24 -0
  106. data/ruby/neo4j/driver/internal/cursor/rx_result_cursor_impl.rb +110 -0
  107. data/ruby/neo4j/driver/internal/database_name_util.rb +37 -0
  108. data/ruby/neo4j/driver/internal/default_bookmark_holder.rb +9 -0
  109. data/ruby/neo4j/driver/internal/default_domain_name_resolver.rb +11 -0
  110. data/ruby/neo4j/driver/internal/direct_connection_provider.rb +40 -0
  111. data/ruby/neo4j/driver/internal/driver_factory.rb +126 -0
  112. data/ruby/neo4j/driver/internal/handlers/begin_tx_response_handler.rb +20 -0
  113. data/ruby/neo4j/driver/internal/handlers/channel_releasing_reset_response_handler.rb +30 -0
  114. data/ruby/neo4j/driver/internal/handlers/commit_tx_response_handler.rb +25 -0
  115. data/ruby/neo4j/driver/internal/handlers/hello_response_handler.rb +65 -0
  116. data/ruby/neo4j/driver/internal/handlers/init_response_handler.rb +34 -0
  117. data/ruby/neo4j/driver/internal/handlers/legacy_pull_all_response_handler.rb +199 -0
  118. data/ruby/neo4j/driver/internal/handlers/no_op_response_handler.rb +16 -0
  119. data/ruby/neo4j/driver/internal/handlers/ping_response_handler.rb +29 -0
  120. data/ruby/neo4j/driver/internal/handlers/pull_handlers.rb +32 -0
  121. data/ruby/neo4j/driver/internal/handlers/pulln/auto_pull_response_handler.rb +168 -0
  122. data/ruby/neo4j/driver/internal/handlers/pulln/basic_pull_response_handler.rb +298 -0
  123. data/ruby/neo4j/driver/internal/handlers/pulln/fetch_size_util.rb +20 -0
  124. data/ruby/neo4j/driver/internal/handlers/reset_response_handler.rb +34 -0
  125. data/ruby/neo4j/driver/internal/handlers/rollback_tx_response_handler.rb +25 -0
  126. data/ruby/neo4j/driver/internal/handlers/route_message_response_handler.rb +21 -0
  127. data/ruby/neo4j/driver/internal/handlers/routing_response_handler.rb +70 -0
  128. data/ruby/neo4j/driver/internal/handlers/run_response_handler.rb +38 -0
  129. data/ruby/neo4j/driver/internal/handlers/session_pull_response_completion_listener.rb +34 -0
  130. data/ruby/neo4j/driver/internal/handlers/transaction_pull_response_completion_listener.rb +20 -0
  131. data/ruby/neo4j/driver/internal/impersonation_util.rb +22 -0
  132. data/ruby/neo4j/driver/internal/internal_bookmark.rb +36 -0
  133. data/ruby/neo4j/driver/internal/internal_database_name.rb +9 -0
  134. data/ruby/neo4j/driver/internal/internal_driver.rb +74 -0
  135. data/ruby/neo4j/driver/internal/internal_entity.rb +20 -0
  136. data/ruby/neo4j/driver/internal/internal_node.rb +21 -0
  137. data/ruby/neo4j/driver/internal/internal_pair.rb +9 -0
  138. data/ruby/neo4j/driver/internal/internal_path.rb +35 -0
  139. data/ruby/neo4j/driver/internal/internal_point2_d.rb +9 -0
  140. data/ruby/neo4j/driver/internal/internal_point3_d.rb +6 -0
  141. data/{ffi → ruby}/neo4j/driver/internal/internal_record.rb +2 -1
  142. data/ruby/neo4j/driver/internal/internal_relationship.rb +26 -0
  143. data/ruby/neo4j/driver/internal/internal_result.rb +49 -0
  144. data/ruby/neo4j/driver/internal/internal_session.rb +81 -0
  145. data/ruby/neo4j/driver/internal/internal_transaction.rb +48 -0
  146. data/ruby/neo4j/driver/internal/logging/channel_activity_logger.rb +29 -0
  147. data/ruby/neo4j/driver/internal/logging/channel_error_logger.rb +17 -0
  148. data/ruby/neo4j/driver/internal/logging/prefixed_logger.rb +19 -0
  149. data/ruby/neo4j/driver/internal/logging/reformatted_logger.rb +17 -0
  150. data/ruby/neo4j/driver/internal/messaging/abstract_message_writer.rb +23 -0
  151. data/ruby/neo4j/driver/internal/messaging/bolt_protocol.rb +30 -0
  152. data/ruby/neo4j/driver/internal/messaging/bolt_protocol_version.rb +48 -0
  153. data/ruby/neo4j/driver/internal/messaging/common/common_message_reader.rb +51 -0
  154. data/ruby/neo4j/driver/internal/messaging/common/common_value.rb +31 -0
  155. data/ruby/neo4j/driver/internal/messaging/common/common_value_packer.rb +101 -0
  156. data/ruby/neo4j/driver/internal/messaging/common/common_value_unpacker.rb +234 -0
  157. data/ruby/neo4j/driver/internal/messaging/encode/begin_message_encoder.rb +15 -0
  158. data/ruby/neo4j/driver/internal/messaging/encode/commit_message_encoder.rb +14 -0
  159. data/ruby/neo4j/driver/internal/messaging/encode/discard_all_message_encoder.rb +14 -0
  160. data/ruby/neo4j/driver/internal/messaging/encode/discard_message_encoder.rb +15 -0
  161. data/ruby/neo4j/driver/internal/messaging/encode/goodbye_message_encoder.rb +14 -0
  162. data/ruby/neo4j/driver/internal/messaging/encode/hello_message_encoder.rb +15 -0
  163. data/ruby/neo4j/driver/internal/messaging/encode/init_message_encoder.rb +16 -0
  164. data/ruby/neo4j/driver/internal/messaging/encode/pull_all_message_encoder.rb +14 -0
  165. data/ruby/neo4j/driver/internal/messaging/encode/pull_message_encoder.rb +15 -0
  166. data/ruby/neo4j/driver/internal/messaging/encode/reset_message_encoder.rb +14 -0
  167. data/ruby/neo4j/driver/internal/messaging/encode/rollback_message_encoder.rb +14 -0
  168. data/ruby/neo4j/driver/internal/messaging/encode/route_message_encoder.rb +24 -0
  169. data/ruby/neo4j/driver/internal/messaging/encode/route_v44_message_encoder.rb +22 -0
  170. data/ruby/neo4j/driver/internal/messaging/encode/run_message_encoder.rb +16 -0
  171. data/ruby/neo4j/driver/internal/messaging/encode/run_with_metadata_message_encoder.rb +17 -0
  172. data/ruby/neo4j/driver/internal/messaging/request/abstract_streaming_message.rb +25 -0
  173. data/ruby/neo4j/driver/internal/messaging/request/begin_message.rb +25 -0
  174. data/ruby/neo4j/driver/internal/messaging/request/commit_message.rb +20 -0
  175. data/ruby/neo4j/driver/internal/messaging/request/discard_all_message.rb +20 -0
  176. data/ruby/neo4j/driver/internal/messaging/request/discard_message.rb +23 -0
  177. data/ruby/neo4j/driver/internal/messaging/request/goodbye_message.rb +20 -0
  178. data/ruby/neo4j/driver/internal/messaging/request/hello_message.rb +31 -0
  179. data/ruby/neo4j/driver/internal/messaging/request/init_message.rb +19 -0
  180. data/ruby/neo4j/driver/internal/messaging/request/message_with_metadata.rb +10 -0
  181. data/ruby/neo4j/driver/internal/messaging/request/multi_database_util.rb +26 -0
  182. data/ruby/neo4j/driver/internal/messaging/request/pull_all_message.rb +23 -0
  183. data/ruby/neo4j/driver/internal/messaging/request/pull_message.rb +22 -0
  184. data/ruby/neo4j/driver/internal/messaging/request/reset_message.rb +32 -0
  185. data/ruby/neo4j/driver/internal/messaging/request/rollback_message.rb +20 -0
  186. data/ruby/neo4j/driver/internal/messaging/request/route_message.rb +28 -0
  187. data/ruby/neo4j/driver/internal/messaging/request/run_message.rb +23 -0
  188. data/ruby/neo4j/driver/internal/messaging/request/run_with_metadata_message.rb +49 -0
  189. data/ruby/neo4j/driver/internal/messaging/request/transaction_metadata_builder.rb +24 -0
  190. data/ruby/neo4j/driver/internal/messaging/response/failure_message.rb +40 -0
  191. data/ruby/neo4j/driver/internal/messaging/response/ignored_message.rb +29 -0
  192. data/ruby/neo4j/driver/internal/messaging/response/record_message.rb +33 -0
  193. data/ruby/neo4j/driver/internal/messaging/response/success_message.rb +34 -0
  194. data/ruby/neo4j/driver/internal/messaging/v3/bolt_protocol_v3.rb +82 -0
  195. data/ruby/neo4j/driver/internal/messaging/v3/message_format_v3.rb +17 -0
  196. data/ruby/neo4j/driver/internal/messaging/v3/message_writer_v3.rb +27 -0
  197. data/ruby/neo4j/driver/internal/messaging/v4/bolt_protocol_v4.rb +29 -0
  198. data/ruby/neo4j/driver/internal/messaging/v4/message_format_v4.rb +17 -0
  199. data/ruby/neo4j/driver/internal/messaging/v4/message_writer_v4.rb +17 -0
  200. data/ruby/neo4j/driver/internal/messaging/v41/bolt_protocol_v41.rb +25 -0
  201. data/ruby/neo4j/driver/internal/messaging/v42/bolt_protocol_v42.rb +13 -0
  202. data/ruby/neo4j/driver/internal/messaging/v43/bolt_protocol_v43.rb +19 -0
  203. data/ruby/neo4j/driver/internal/messaging/v43/message_format_v43.rb +18 -0
  204. data/ruby/neo4j/driver/internal/messaging/v43/message_writer_v43.rb +20 -0
  205. data/ruby/neo4j/driver/internal/messaging/v44/bolt_protocol_v44.rb +17 -0
  206. data/ruby/neo4j/driver/internal/messaging/v44/message_format_v44.rb +18 -0
  207. data/ruby/neo4j/driver/internal/messaging/v44/message_writer_v44.rb +15 -0
  208. data/ruby/neo4j/driver/internal/metrics/connection_pool_metrics_listener.rb +34 -0
  209. data/ruby/neo4j/driver/internal/metrics/internal_abstract_metrics.rb +46 -0
  210. data/ruby/neo4j/driver/internal/metrics/internal_connection_pool_metrics.rb +105 -0
  211. data/ruby/neo4j/driver/internal/metrics/internal_metrics.rb +82 -0
  212. data/ruby/neo4j/driver/internal/metrics/internal_metrics_provider.rb +18 -0
  213. data/ruby/neo4j/driver/internal/metrics/listener_event.rb +17 -0
  214. data/ruby/neo4j/driver/internal/metrics/metrics_provider.rb +24 -0
  215. data/ruby/neo4j/driver/internal/metrics/time_recorder_listener_event.rb +15 -0
  216. data/ruby/neo4j/driver/internal/packstream/byte_array_incompatible_packer.rb +12 -0
  217. data/ruby/neo4j/driver/internal/packstream/pack_input.rb +47 -0
  218. data/ruby/neo4j/driver/internal/packstream/pack_output.rb +39 -0
  219. data/ruby/neo4j/driver/internal/packstream/pack_stream.rb +326 -0
  220. data/ruby/neo4j/driver/internal/packstream/pack_type.rb +17 -0
  221. data/ruby/neo4j/driver/internal/read_only_bookmark_holder.rb +13 -0
  222. data/ruby/neo4j/driver/internal/resolved_bolt_server_address.rb +35 -0
  223. data/ruby/neo4j/driver/internal/retry/exponential_backoff_retry_logic.rb +151 -0
  224. data/ruby/neo4j/driver/internal/revocation_strategy.rb +19 -0
  225. data/ruby/neo4j/driver/internal/scheme.rb +32 -0
  226. data/ruby/neo4j/driver/internal/security/internal_auth_token.rb +15 -0
  227. data/ruby/neo4j/driver/internal/security/security_plan_impl.rb +48 -0
  228. data/ruby/neo4j/driver/internal/security_setting.rb +66 -0
  229. data/ruby/neo4j/driver/internal/session_factory_impl.rb +32 -0
  230. data/ruby/neo4j/driver/internal/spi/connection.rb +19 -0
  231. data/ruby/neo4j/driver/internal/spi/connection_pool.rb +9 -0
  232. data/ruby/neo4j/driver/internal/spi/response_handler.rb +23 -0
  233. data/ruby/neo4j/driver/internal/summary/internal_database_info.rb +7 -0
  234. data/ruby/neo4j/driver/internal/summary/internal_input_position.rb +11 -0
  235. data/ruby/neo4j/driver/internal/summary/internal_notification.rb +16 -0
  236. data/ruby/neo4j/driver/internal/summary/internal_plan.rb +41 -0
  237. data/ruby/neo4j/driver/internal/summary/internal_profiled_plan.rb +32 -0
  238. data/ruby/neo4j/driver/internal/summary/internal_result_summary.rb +33 -0
  239. data/ruby/neo4j/driver/internal/summary/internal_server_info.rb +6 -0
  240. data/ruby/neo4j/driver/internal/summary/internal_summary_counters.rb +18 -0
  241. data/ruby/neo4j/driver/internal/svm/netty_substitutions.rb +196 -0
  242. data/ruby/neo4j/driver/internal/svm/z_lib_substitutions.rb +21 -0
  243. data/ruby/neo4j/driver/internal/util/certificate_tool.rb +65 -0
  244. data/ruby/neo4j/driver/internal/util/clock.rb +29 -0
  245. data/ruby/neo4j/driver/internal/util/error_util.rb +104 -0
  246. data/ruby/neo4j/driver/internal/util/extract.rb +123 -0
  247. data/ruby/neo4j/driver/internal/util/format.rb +39 -0
  248. data/ruby/neo4j/driver/internal/util/futures.rb +99 -0
  249. data/ruby/neo4j/driver/internal/util/iterables.rb +35 -0
  250. data/ruby/neo4j/driver/internal/util/lock_util.rb +23 -0
  251. data/ruby/neo4j/driver/internal/util/metadata_extractor.rb +107 -0
  252. data/ruby/neo4j/driver/internal/util/mutex.rb +9 -0
  253. data/ruby/neo4j/driver/internal/util/preconditions.rb +16 -0
  254. data/ruby/neo4j/driver/internal/util/result_holder.rb +72 -0
  255. data/ruby/neo4j/driver/internal/util/server_version.rb +60 -0
  256. data/ruby/neo4j/driver/logging1.rb +51 -0
  257. data/ruby/neo4j/driver/net/server_address.rb +9 -0
  258. data/ruby/neo4j/driver/query.rb +48 -0
  259. data/ruby/neo4j/driver/records.rb +13 -0
  260. data/ruby/neo4j/driver/transaction_config.rb +50 -0
  261. data/ruby/neo4j/driver/values.rb +26 -0
  262. data/{lib → ruby}/neo4j/driver/version.rb +1 -1
  263. data/ruby/neo4j/driver.rb +29 -0
  264. metadata +264 -101
  265. data/ffi/bolt/address.rb +0 -11
  266. data/ffi/bolt/address_resolver.rb +0 -12
  267. data/ffi/bolt/address_set.rb +0 -9
  268. data/ffi/bolt/auth.rb +0 -10
  269. data/ffi/bolt/auto_releasable.rb +0 -22
  270. data/ffi/bolt/boolean.rb +0 -9
  271. data/ffi/bolt/bytes.rb +0 -10
  272. data/ffi/bolt/config.rb +0 -45
  273. data/ffi/bolt/connection.rb +0 -44
  274. data/ffi/bolt/connector.rb +0 -17
  275. data/ffi/bolt/dictionary.rb +0 -15
  276. data/ffi/bolt/error.rb +0 -74
  277. data/ffi/bolt/float.rb +0 -9
  278. data/ffi/bolt/integer.rb +0 -9
  279. data/ffi/bolt/library.rb +0 -12
  280. data/ffi/bolt/lifecycle.rb +0 -9
  281. data/ffi/bolt/list.rb +0 -10
  282. data/ffi/bolt/log.rb +0 -16
  283. data/ffi/bolt/socket_options.rb +0 -14
  284. data/ffi/bolt/status.rb +0 -25
  285. data/ffi/bolt/string.rb +0 -9
  286. data/ffi/bolt/structure.rb +0 -10
  287. data/ffi/bolt/value.rb +0 -35
  288. data/ffi/neo4j/driver/auth_tokens.rb +0 -18
  289. data/ffi/neo4j/driver/config.rb +0 -40
  290. data/ffi/neo4j/driver/graph_database.rb +0 -52
  291. data/ffi/neo4j/driver/internal/async/access_mode_connection.rb +0 -19
  292. data/ffi/neo4j/driver/internal/async/direct_connection.rb +0 -106
  293. data/ffi/neo4j/driver/internal/bolt_server_address.rb +0 -18
  294. data/ffi/neo4j/driver/internal/bookmarks_holder.rb +0 -30
  295. data/ffi/neo4j/driver/internal/direct_connection_provider.rb +0 -28
  296. data/ffi/neo4j/driver/internal/driver_factory.rb +0 -125
  297. data/ffi/neo4j/driver/internal/error_handling.rb +0 -112
  298. data/ffi/neo4j/driver/internal/explicit_transaction.rb +0 -146
  299. data/ffi/neo4j/driver/internal/handlers/pull_all_response_handler.rb +0 -104
  300. data/ffi/neo4j/driver/internal/handlers/response_handler.rb +0 -49
  301. data/ffi/neo4j/driver/internal/handlers/run_response_handler.rb +0 -32
  302. data/ffi/neo4j/driver/internal/handlers/session_pull_all_response_handler.rb +0 -32
  303. data/ffi/neo4j/driver/internal/handlers/transaction_pull_all_response_handler.rb +0 -23
  304. data/ffi/neo4j/driver/internal/internal_driver.rb +0 -45
  305. data/ffi/neo4j/driver/internal/internal_logger.rb +0 -32
  306. data/ffi/neo4j/driver/internal/internal_resolver.rb +0 -31
  307. data/ffi/neo4j/driver/internal/internal_statement_result.rb +0 -52
  308. data/ffi/neo4j/driver/internal/messaging/bolt_protocol.rb +0 -24
  309. data/ffi/neo4j/driver/internal/messaging/v1/bolt_protocol_v1.rb +0 -59
  310. data/ffi/neo4j/driver/internal/messaging/v2/bolt_protocol_v2.rb +0 -16
  311. data/ffi/neo4j/driver/internal/messaging/v3/bolt_protocol_v3.rb +0 -63
  312. data/ffi/neo4j/driver/internal/network_session.rb +0 -129
  313. data/ffi/neo4j/driver/internal/retry/exponential_backoff_retry_logic.rb +0 -80
  314. data/ffi/neo4j/driver/internal/session_factory_impl.rb +0 -28
  315. data/ffi/neo4j/driver/internal/summary/internal_result_summary.rb +0 -67
  316. data/ffi/neo4j/driver/internal/summary/internal_server_info.rb +0 -19
  317. data/ffi/neo4j/driver/internal/summary/internal_summary_counters.rb +0 -23
  318. data/ffi/neo4j/driver/internal/util/metadata_extractor.rb +0 -15
  319. data/ffi/neo4j/driver/internal/value/base_time_value.rb +0 -22
  320. data/ffi/neo4j/driver/internal/value/date_value.rb +0 -25
  321. data/ffi/neo4j/driver/internal/value/duration_value.rb +0 -27
  322. data/ffi/neo4j/driver/internal/value/local_date_time_value.rb +0 -24
  323. data/ffi/neo4j/driver/internal/value/local_time_value.rb +0 -19
  324. data/ffi/neo4j/driver/internal/value/node_value.rb +0 -18
  325. data/ffi/neo4j/driver/internal/value/offset_time_value.rb +0 -25
  326. data/ffi/neo4j/driver/internal/value/path_value.rb +0 -41
  327. data/ffi/neo4j/driver/internal/value/point2_d_value.rb +0 -24
  328. data/ffi/neo4j/driver/internal/value/point3_d_value.rb +0 -24
  329. data/ffi/neo4j/driver/internal/value/relationship_value.rb +0 -18
  330. data/ffi/neo4j/driver/internal/value/structure_value.rb +0 -42
  331. data/ffi/neo4j/driver/internal/value/time_with_zone_id_value.rb +0 -25
  332. data/ffi/neo4j/driver/internal/value/time_with_zone_offset_value.rb +0 -28
  333. data/ffi/neo4j/driver/internal/value/unbound_relationship_value.rb +0 -18
  334. data/ffi/neo4j/driver/internal/value/value_adapter.rb +0 -101
  335. data/ffi/neo4j/driver/net/server_address.rb +0 -13
  336. data/ffi/neo4j/driver/statement.rb +0 -15
  337. data/ffi/neo4j/driver/types/entity.rb +0 -21
  338. data/ffi/neo4j/driver/types/node.rb +0 -16
  339. data/ffi/neo4j/driver/types/path.rb +0 -35
  340. data/ffi/neo4j/driver/types/relationship.rb +0 -19
  341. data/ffi/neo4j/driver.rb +0 -61
  342. data/lib/neo4j/driver/internal/ruby_signature.rb +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 10b401fcd6765f428d7b377cb9ed6e6dc021d7e6c1fa41bc95839a991d3a8d11
4
- data.tar.gz: 29bd664e4481f3e42bd5cd369603887d1c349c3caa472747179b4bffe7c96e0d
3
+ metadata.gz: aad2e30fa3fa23dc95e7db9f27847b1c5382c23600c019d93a7625fc5a66d085
4
+ data.tar.gz: 534c14f354f92df7a85b153e1451951ded71863fbbb10c61a50a280a8bf3bea7
5
5
  SHA512:
6
- metadata.gz: 006d20096a8a7643f9ae842a0b3340bb2517d46cc1781dd3e7f95cd7aa262eb4c4a524687ec87324910e3e8e25c8fcaa077773b226a8173d8383e42ec86380b9
7
- data.tar.gz: ad244e09f318ca75a63d7b8fb1d345cb04e0567ea0e6e6ffdc0b86b73817b5adf2e1c673201e1afb4ac5a0adcfe661353d1e854897baf03007030a1704656d84
6
+ metadata.gz: 909be9c6542e378161b3e9b9c62ad9e45ef08c54f7410b4ea5a2ba3f15267fd445995757f74210aadcaa10f94475f839cddeb2294c23d44a9925e044e23cc162
7
+ data.tar.gz: 4d22446e5a24c6f7f99072202bfc4dbab1e222b535c64b1c716a31f4993f9fe0da07c8d5dfbd3f68d793fc1b11f6782f4a6062e3171f41b7b26a8c7260b0966a
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,33 @@ 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
+ Known errors:
60
+
61
+ 1. In case of heap space memory error (`org.neo4j.driver.exceptions.DatabaseException: Java heap space`), you should limit the dbms memory, for example:
62
+
63
+ ```console
64
+ $ 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=::
65
+ ```
66
+
67
+ 2. When using command `pip3 install --user git+https://github.com/klobuczek/boltkit@1.3#egg=boltkit`, if you have m1 mac chip, you may get error when pip3 tries to install `cryptography`. Steps to take in that case (reference https://stackoverflow.com/a/70074869/2559490)
68
+
69
+ ```console
70
+ $ pip uninstall cffi
71
+ $ python -m pip install --upgrade pip
72
+ $ pip install cffi
73
+ $ pip install cryptography
74
+ ```
80
75
 
81
76
  ## Contributing
82
77
 
data/lib/loader.rb CHANGED
@@ -7,11 +7,13 @@ class Loader
7
7
  loader = Zeitwerk::Loader.new
8
8
  loader.tag = 'neo4j-ruby-driver'
9
9
  loader.push_dir(File.expand_path(__dir__))
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__))
10
+ driver_specific_dir = File.dirname(File.dirname(caller_locations(1..1).first.path))
11
+ loader.push_dir(driver_specific_dir)
12
+ yield loader if block_given?
13
+ loader.ignore(File.expand_path('neo4j-*-driver_jars.rb', __dir__))
12
14
  loader.ignore(File.expand_path('neo4j_ruby_driver.rb', __dir__))
13
15
  loader.ignore(File.expand_path('org', __dir__))
14
- loader.inflector = Zeitwerk::GemInflector.new(File.expand_path('neo4j/driver', __dir__))
16
+ loader.inflector = Zeitwerk::GemInflector.new(File.expand_path('neo4j/driver', driver_specific_dir))
15
17
  loader.setup
16
18
  loader.eager_load
17
19
  end
@@ -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 = nil)
12
+ super(nil, "#{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(host: address.host, port: address.port)
71
+ end
72
+
73
+ def ==(other)
74
+ attributes == other&.attributes
75
+ end
76
+
77
+ alias eql? ==
78
+
79
+ def to_s
80
+ "#{host}#{"(#{connection_host})" unless host == connection_host}:#{port}"
81
+ end
82
+
83
+ # Create a stream of unicast addresses.
84
+ # <p>
85
+ # While this implementation just returns a stream of itself, the subclasses may provide multiple addresses.
86
+
87
+ # @return stream of unicast addresses.
88
+ def unicast_stream
89
+ Set[self]
90
+ end
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
@@ -30,10 +30,12 @@ module Neo4j
30
30
  end
31
31
  end
32
32
 
33
- def eql?(other)
34
- other.is_a?(self.class) && self.class.significant_fields.all? { |elem| send(elem).eql?(other.send(elem)) }
33
+ def ==(other)
34
+ other.is_a?(self.class) && self.class.significant_fields.all? { |elem| send(elem) == other.send(elem) }
35
35
  end
36
36
 
37
+ alias eql? ==
38
+
37
39
  def +(numeric)
38
40
  self.class.new(@time + numeric)
39
41
  end