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
@@ -0,0 +1,82 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V3
5
+ class BoltProtocolV3
6
+ VERSION = BoltProtocolVersion.new(3, 0)
7
+ INSTANCE = new
8
+ METADATA_EXTRACTOR = Util::MetadataExtractor.new(:t_first, :t_last)
9
+
10
+ def create_message_format
11
+ MessageFormatV3.new
12
+ end
13
+
14
+ def initialize_channel(channel, user_agent, auth_token, routing_context)
15
+ message = Request::HelloMessage.new(user_agent, auth_token,
16
+ (routing_context.to_h if routing_context.server_routing_enabled?))
17
+ handler = Handlers::HelloResponseHandler.new(channel, VERSION)
18
+
19
+ channel.message_dispatcher.enqueue(handler)
20
+ channel.write_and_flush(message)
21
+ end
22
+
23
+ def prepare_to_close_channel(channel)
24
+ message_dispatcher = Connection::ChannelAttributes.message_dispatcher(channel)
25
+
26
+ message = Request::GoodbyeMessage::GOODBYE
27
+ message_dispatcher.enqueue(Handlers::NoOpResponseHandler::INSTANCE)
28
+ channel.write_and_flush(message, channel.void_promise)
29
+
30
+ message_dispatcher.prepare_to_close_channel
31
+ end
32
+
33
+ def begin_transaction(connection, bookmark, config)
34
+ verify_database_name_before_transaction(connection.database_name)
35
+ begin_message = Request::BeginMessage.new(bookmark, config, connection.database_name, connection.mode, connection.impersonated_user)
36
+ connection.write_and_flush(begin_message, Handlers::BeginTxResponseHandler.new)
37
+ end
38
+
39
+ def commit_transaction(connection)
40
+ Util::ResultHolder.new.tap do |result_holder|
41
+ connection.write_and_flush(Request::CommitMessage::COMMIT, Handlers::CommitTxResponseHandler.new(result_holder))
42
+ end
43
+ end
44
+
45
+ def rollback_transaction(connection)
46
+ Util::ResultHolder.new.tap do |result_holder|
47
+ connection.write_and_flush(Request::RollbackMessage::ROLLBACK, Handlers::RollbackTxResponseHandler.new(result_holder))
48
+ end
49
+ end
50
+
51
+ def run_in_auto_commit_transaction(connection, query, bookmark_holder, config, fetch_size)
52
+ verify_database_name_before_transaction(connection.database_name)
53
+
54
+ run_message = Request::RunWithMetadataMessage.auto_commit_tx_run_message(query, config, connection.database_name, connection.mode, bookmark_holder.bookmark, connection.impersonated_user)
55
+
56
+ build_result_cursor_factory(connection, query, bookmark_holder, nil, run_message, fetch_size)
57
+ end
58
+
59
+ def run_in_unmanaged_transaction(connection, query, tx, fetch_size)
60
+ run_message = Request::RunWithMetadataMessage.unmanaged_tx_run_message(query)
61
+ build_result_cursor_factory(connection, query, BookmarkHolder::NO_OP, tx, run_message, fetch_size)
62
+ end
63
+
64
+ def build_result_cursor_factory(connection, query, bookmark_holder, tx, run_message, ignored)
65
+ run_handler = Handlers::RunResponseHandler.new(METADATA_EXTRACTOR, connection, tx)
66
+ pull_handler = Handlers::PullHandlers.new_bolt_v3_pull_all_handler(query, run_handler, connection, bookmark_holder, tx)
67
+
68
+ Cursor::AsyncResultCursorOnlyFactory.new(connection, run_message, run_handler, pull_handler)
69
+ end
70
+
71
+ def verify_database_name_before_transaction(database_name)
72
+ Request::MultiDatabaseUtil.assert_empty_database_name(database_name, VERSION)
73
+ end
74
+
75
+ def version
76
+ self.class::VERSION
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,17 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V3
5
+ class MessageFormatV3
6
+ def new_writer(output)
7
+ MessageWriterV3.new(output)
8
+ end
9
+
10
+ def new_reader(input)
11
+ Common::CommonMessageReader.new(input)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,27 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V3
5
+ class MessageWriterV3 < AbstractMessageWriter
6
+ COMMON_ENCODERS = {
7
+ Request::HelloMessage::SIGNATURE => Encode::HelloMessageEncoder,
8
+ Request::GoodbyeMessage::SIGNATURE => Encode::GoodbyeMessageEncoder,
9
+ Request::RunWithMetadataMessage::SIGNATURE => Encode::RunWithMetadataMessageEncoder,
10
+ Request::BeginMessage::SIGNATURE => Encode::BeginMessageEncoder,
11
+ Request::CommitMessage::SIGNATURE => Encode::CommitMessageEncoder,
12
+ Request::RollbackMessage::SIGNATURE => Encode::RollbackMessageEncoder,
13
+ Request::ResetMessage::SIGNATURE => Encode::ResetMessageEncoder,
14
+ }
15
+ private
16
+
17
+ def build_encoders
18
+ COMMON_ENCODERS.merge(
19
+ Request::DiscardAllMessage::SIGNATURE => Encode::DiscardAllMessageEncoder,
20
+ Request::PullAllMessage::SIGNATURE => Encode::PullAllMessageEncoder,
21
+ )
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,29 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V4
5
+ class BoltProtocolV4 < V3::BoltProtocolV3
6
+ VERSION = BoltProtocolVersion.new(4,0)
7
+ INSTANCE = new
8
+
9
+ def create_message_format
10
+ MessageFormatV4.new
11
+ end
12
+
13
+ def build_result_cursor_factory(connection, query, bookmark_holder, tx, run_message, fetch_size)
14
+ run_handler = Handlers::RunResponseHandler.new(V3::BoltProtocolV3::METADATA_EXTRACTOR, connection, tx)
15
+
16
+ pull_all_handler = Handlers::PullHandlers.new_bolt_v4_auto_pull_handler(query, run_handler, connection, bookmark_holder, tx, fetch_size)
17
+ pull_handler = Handlers::PullHandlers.new_bolt_v4_basic_pull_handler(query, run_handler, connection, bookmark_holder, tx)
18
+
19
+ Cursor::ResultCursorFactoryImpl.new(connection, run_message, run_handler, pull_handler, pull_all_handler)
20
+ end
21
+
22
+ def verify_database_name_before_transaction(_database_name)
23
+ # Bolt V4.1 accepts database name
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V4
5
+ class MessageFormatV4
6
+ def new_writer(output)
7
+ MessageWriterV4.new(output)
8
+ end
9
+
10
+ def new_reader(input)
11
+ Common::CommonMessageReader.new(input)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V4
5
+ class MessageWriterV4 < V3::MessageWriterV3
6
+ private
7
+
8
+ def build_encoders
9
+ COMMON_ENCODERS.merge(
10
+ Request::DiscardMessage::SIGNATURE => Encode::DiscardMessageEncoder,
11
+ Request::PullMessage::SIGNATURE => Encode::PullMessageEncoder)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V41
5
+ class BoltProtocolV41 < V4::BoltProtocolV4
6
+ VERSION = BoltProtocolVersion.new(4, 1)
7
+ INSTANCE = new
8
+
9
+ def create_message_format
10
+ V4::MessageFormatV4.new
11
+ end
12
+
13
+ def build_result_cursor_factory(connection, query, bookmark_holder, tx, run_message, fetch_size)
14
+ run_handler = Handlers::RunResponseHandler.new(V3::BoltProtocolV3::METADATA_EXTRACTOR, connection, tx)
15
+
16
+ pull_all_handler = Handlers::PullHandlers.new_bolt_v4_auto_pull_handler(query, run_handler, connection, bookmark_holder, tx, fetch_size)
17
+ pull_handler = Handlers::PullHandlers.new_bolt_v4_basic_pull_handler(query, run_handler, connection, bookmark_holder, tx)
18
+
19
+ Cursor::ResultCursorFactoryImpl.new(connection, run_message, run_handler, pull_handler, pull_all_handler)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V42
5
+ # Bolt V4.2 is identical to V4.1
6
+ class BoltProtocolV42 < V41::BoltProtocolV41
7
+ VERSION = BoltProtocolVersion.new(4,2)
8
+ INSTANCE = new
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V43
5
+ # Definition of the Bolt Protocol 4.3
6
+
7
+ # The version 4.3 use most of the 4.2 behaviours, but it extends it with new messages such as ROUTE
8
+ class BoltProtocolV43 < V42::BoltProtocolV42
9
+ VERSION = BoltProtocolVersion.new(4,3)
10
+ INSTANCE = new
11
+
12
+ def create_message_format
13
+ MessageFormatV43.new
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V43
5
+ # Bolt message format v4.3
6
+ class MessageFormatV43
7
+ def new_writer(output)
8
+ MessageWriterV43.new(output)
9
+ end
10
+
11
+ def new_reader(input)
12
+ Common::CommonMessageReader.new(input)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V43
5
+
6
+ # Bolt message writer v4.3
7
+ # This version is able to encode all the versions existing on v4.2, but it encodes
8
+
9
+ # new messages such as ROUTE
10
+ class MessageWriterV43 < V4::MessageWriterV4
11
+ private
12
+
13
+ def build_encoders
14
+ super.merge(Request::RouteMessage::SIGNATURE => Encode::RouteMessageEncoder)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V44
5
+ # Definition of the Bolt Protocol 4.4
6
+ class BoltProtocolV44 < V43::BoltProtocolV43
7
+ VERSION = BoltProtocolVersion.new(4,4)
8
+ INSTANCE = new
9
+
10
+ def create_message_format
11
+ MessageFormatV44.new
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V44
5
+ # Bolt message format v4.4
6
+ class MessageFormatV44
7
+ def new_writer(output)
8
+ MessageWriterV44.new(output)
9
+ end
10
+
11
+ def new_reader(input)
12
+ CommonMessageReader.new(input)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V44
5
+ class MessageWriterV44 < V4::MessageWriterV4
6
+ private
7
+
8
+ def build_encoders
9
+ super.merge(Request::RouteMessage::SIGNATURE => Encode::RouteV44MessageEncoder)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,34 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Metrics
4
+ module ConnectionPoolMetricsListener
5
+ DEV_NULL_POOL_METRICS_LISTENER =
6
+ Class.new do
7
+ def before_creating(_listener_event) end
8
+
9
+ def after_created(_listener_event) end
10
+
11
+ def after_failed_to_create
12
+ end
13
+
14
+ def after_closed
15
+ end
16
+
17
+ def before_acquiring_or_creating(_acquire_event = nil) end
18
+
19
+ def after_acquiring_or_creating
20
+ end
21
+
22
+ def after_acquired_or_created(_acquire_event) end
23
+
24
+ def after_timed_out_to_acquire_or_create
25
+ end
26
+
27
+ def acquired(_in_use_event) end
28
+
29
+ def released(_in_use_event) end
30
+ end.new
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,46 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Metrics
4
+ class InternalAbstractMetrics
5
+ DEV_NULL_METRICS =
6
+ Class.new do
7
+ def before_creating(_pool_id, _creating_event) end
8
+
9
+ def after_created(_pool_id, _creating_event) end
10
+
11
+ def after_failed_to_create(_pool_id) end
12
+
13
+ def after_closed(_pool_id) end
14
+
15
+ def before_acquiring_or_creating(_pool_id, _acquire_event) end
16
+
17
+ def after_acquiring_or_creating(_pool_id) end
18
+
19
+ def after_acquired_or_created(_pool_id, _acquire_event) end
20
+
21
+ def after_timed_out_to_acquire_or_create(_pool_id) end
22
+
23
+ def after_connection_created(_pool_id, _in_use_event) end
24
+
25
+ def after_connection_released(_pool_id, _in_use_event) end
26
+
27
+ def create_listener_event
28
+ ListenerEvent::DEV_NULL_LISTENER_EVENT
29
+ end
30
+
31
+ def put_pool_metrics(_id, _address, _connection_pool) end
32
+
33
+ def remove_pool_metrics(_pool_id) end
34
+
35
+ def connection_pool_metrics
36
+ Set.new
37
+ end
38
+
39
+ def to_s
40
+ 'Driver metrics not available while driver metrics is not enabled.'
41
+ end
42
+ end.new
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,105 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Metrics
4
+ class InternalConnectionPoolMetrics
5
+ attr_reader :id, :address, :pool
6
+
7
+ def initialize(pool_id, address, pool)
8
+ Internal::Validotor.require_non_nil!(address)
9
+ Internal::Validotor.require_non_nil!(pool)
10
+
11
+ @id = pool_id
12
+ @address = address
13
+ @pool = pool
14
+
15
+ @closed = Concurrent::AtomicFixnum.new
16
+
17
+ # creating = created + failedToCreate
18
+ @creating = Concurrent::AtomicFixnum.new
19
+ @created = Concurrent::AtomicFixnum.new
20
+ @failed_to_create = Concurrent::AtomicFixnum.new
21
+
22
+ # acquiring = acquired + timedOutToAcquire + failedToAcquireDueToOtherFailures (which we do not keep track)
23
+ @acquiring = Concurrent::AtomicFixnum.new
24
+ @acquired = Concurrent::AtomicFixnum.new
25
+ @timed_out_to_acquire = Concurrent::AtomicFixnum.new
26
+
27
+ @total_acquisition_time = Concurrent::AtomicFixnum.new
28
+ @total_connection_time = Concurrent::AtomicFixnum.new
29
+ @total_in_use_time = Concurrent::AtomicFixnum.new
30
+
31
+ @total_in_use_count = Concurrent::AtomicFixnum.new
32
+ end
33
+
34
+ def before_creating(conn_event)
35
+ @creating.increment
36
+ conn_event.start
37
+ end
38
+
39
+ def after_failed_to_create
40
+ @failed_to_create.increment
41
+ @creating.decrement_and_get
42
+ end
43
+
44
+ def after_created(conn_event)
45
+ @created.increment
46
+ @creating.decrement
47
+ elapsed = conn_event.elapsed
48
+
49
+ @total_connection_time.increment(elapsed)
50
+ end
51
+
52
+ def after_closed
53
+ @closed.increment
54
+ end
55
+
56
+ def before_acquiring_or_creating(acquire_event)
57
+ acquire_event.start
58
+ @acquiring.increment
59
+ end
60
+
61
+ def after_acquiring_or_creating
62
+ @acquiring.decrement
63
+ end
64
+
65
+ def after_acquired_or_created(acquire_event)
66
+ @acquired.increment
67
+ elapsed = acquire_event.elapsed
68
+ @total_acquisition_time.increment(elapsed)
69
+ end
70
+
71
+ def after_timed_out_to_acquire_or_create
72
+ @timed_out_to_acquire.increment
73
+ end
74
+
75
+ def acquired(in_use_event)
76
+ in_use_event.start
77
+ end
78
+
79
+ def released(in_use_event)
80
+ @total_in_use_count.increment
81
+ elapsed = in_use_event.elapsed
82
+
83
+ @total_in_use_time.increment(elapsed)
84
+ end
85
+
86
+ def in_use
87
+ @pool.in_use_connections(@address)
88
+ end
89
+
90
+ def idle
91
+ @pool.idle_connections(@address)
92
+ end
93
+
94
+ %i[creating created failed_to_create timed_out_to_acquire total_acquisition_time :total_connection_time
95
+ total_in_use_time total_in_use_count closed acquiring acquired].each do |method|
96
+ define_method(method) { instance_variable_get(method).value }
97
+ end
98
+
99
+ def to_s
100
+ "#{@id}[created=#{@created}, closed=#{@closed}, creating=#{@creating}, failed_to_create=#{@failed_to_create}, acquiring=#{@acquiring}, acquired=#{@acquired}, timed_out_to_acquire=#{@timed_out_to_acquire}, in_use=#{@in_use}, idle=#{@idle}, total_acquisition_time=#{@total_acquisition_time}, total_connection_time=#{@total_connection_time}, total_in_use_time=#{@total_in_use_time}, total_in_use_count=#{@totalInUseCount}]"
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,82 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Metrics
4
+ class InternalMetrics
5
+ def initialize(logger)
6
+ @connection_pool_metrics = Concurrent::Map.new
7
+ @log = logger
8
+ end
9
+
10
+ def put_pool_metrics(pool_id, server_address, pool)
11
+ @connection_pool_metrics[pool_id] = InternalConnectionPoolMetrics.new(pool_id, server_address, pool)
12
+ end
13
+
14
+ def remove_pool_metrics(id)
15
+ @connection_pool_metrics.delete(id)
16
+ end
17
+
18
+ def before_creating(pool_id, creating_event)
19
+ pool_metrics(pool_id).before_creating(creating_event)
20
+ end
21
+
22
+ def after_created(pool_id, creating_event)
23
+ pool_metrics(pool_id).after_created(creating_event)
24
+ end
25
+
26
+ def after_failed_to_create(pool_id)
27
+ pool_metrics(pool_id).after_failed_to_create
28
+ end
29
+
30
+ def after_closed(pool_id)
31
+ pool_metrics(pool_id).after_closed
32
+ end
33
+
34
+ def before_acquiring_or_creating(pool_id, acquire_event)
35
+ pool_metrics(pool_id).before_acquiring_or_creating(acquire_event)
36
+ end
37
+
38
+ def after_acquiring_or_creating(pool_id)
39
+ pool_metrics(pool_id).after_acquiring_or_creating
40
+ end
41
+
42
+ def after_acquired_or_created(pool_id, acquire_event)
43
+ pool_metrics(pool_id).after_acquired_or_created(acquire_event)
44
+ end
45
+
46
+ def after_connection_created(pool_id, in_use_event)
47
+ pool_metrics(pool_id).acquired(in_use_event)
48
+ end
49
+
50
+ def after_connection_released(pool_id, in_use_event)
51
+ pool_metrics(pool_id).released(in_use_event)
52
+ end
53
+
54
+ def after_timed_out_to_acquire_or_create(pool_id)
55
+ pool_metrics(pool_id).after_timed_out_to_acquire_or_create
56
+ end
57
+
58
+ def create_listener_event
59
+ TimeRecorderListenerEvent.new
60
+ end
61
+
62
+ def connection_pool_metrics
63
+ @connection_pool_metrics.values.freeze
64
+ end
65
+
66
+ def to_s
67
+ "PoolMetrics=#{@connection_pool_metrics.each_pair.to_h}"
68
+ end
69
+
70
+ private
71
+
72
+ def pool_metrics(pool_id)
73
+ @connection_pool_metrics[pool_id] ||
74
+ begin
75
+ @log.warn("Failed to find pool metrics with id `#{pool_id}` in #{@connection_pool_metrics.each_pair.to_h}.")
76
+ ConnectionPoolMetricsListener::DEV_NULL_POOL_METRICS_LISTENER
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,18 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Metrics
4
+ class InternalMetricsProvider
5
+ attr_reader :metrics
6
+ alias metrics_listener metrics
7
+
8
+ def initialize(logger)
9
+ @metrics = InternalMetrics.new(logger)
10
+ end
11
+
12
+ def metrics_enabled?
13
+ true
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Metrics
4
+ module ListenerEvent
5
+ DEV_NULL_LISTENER_EVENT =
6
+ Class.new do
7
+ def start
8
+ end
9
+
10
+ def elapsed
11
+ 0
12
+ end
13
+ end.new
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Metrics
4
+ module MetricsProvider
5
+ METRICS_DISABLED_PROVIDER =
6
+ Class.new do
7
+ def metrics
8
+ # To outside users, we forbidden their access to the metrics API
9
+ raise Exceptions::ClientException, "Driver metrics not enabled. To access driver metrics, you need to enabled driver metrics in the driver's configuration."
10
+ end
11
+
12
+ def metrics_listener
13
+ # Internally we can still register callbacks to this empty metrics listener.
14
+ InternalAbstractMetrics::DEV_NULL_METRICS
15
+ end
16
+
17
+ def metrics_enabled?
18
+ false
19
+ end
20
+ end.new
21
+ end
22
+ end
23
+ end
24
+ end