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,65 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Util
4
+
5
+ # A tool used to save, load certs, etc.
6
+ class CertificateTool
7
+ BEGIN_CERT = "-----BEGIN CERTIFICATE-----"
8
+ END_CERT = "-----END CERTIFICATE-----"
9
+
10
+ # Save a certificate to a file in base 64 binary format with BEGIN and END strings
11
+ # @param certStr
12
+ # @param certFile
13
+ # @throws IOException
14
+ class << self
15
+ def save_x509_cert(cert_str, cert_file)
16
+ writer = java.io.BufferedWriter.new(java.io.FileWriter.new(cert_file))
17
+
18
+ writer.write(BEGIN_CERT)
19
+ writer.new_line
20
+
21
+ writer.write(cert_str)
22
+ writer.new_line
23
+
24
+ writer.write(END_CERT)
25
+ writer.new_line
26
+ end
27
+
28
+ # Save a certificate to a file. Remove all the content in the file if there is any before.
29
+
30
+ # @param cert
31
+ # @param certFile
32
+ # @throws GeneralSecurityException
33
+ # @throws IOException
34
+
35
+ # Load the certificates written in X.509 format in a file to a key store.
36
+
37
+ # @param certFile
38
+ # @param keyStore
39
+ # @throws GeneralSecurityException
40
+ # @throws IOException
41
+ def load_x509_cert(cert_file, key_store)
42
+ input_stream = java.io.BufferedInputStream.new(java.io.FileInputStream.new(cert_file))
43
+
44
+ cert_factory = java.security.cert.CertificateFactory.get_instance('X.509')
45
+ cert_count = 0 #The file might contain multiple certs
46
+
47
+ while input_stream.available > 0
48
+ begin
49
+ cert = cert_factory.generate_certificate(input_stream)
50
+ cert_count = cert_count + 1
51
+ # load_x509_cert(cert, 'neo4j.javadriver.trustedcert.', cert_count, key_store)
52
+ rescue java.security.cert.CertificateException => e
53
+
54
+ # This happens if there is whitespace at the end of the certificate - we load one cert, and then try and load a
55
+ # second cert, at which point we fail
56
+ return if !e.get_cause.nil? && e.get_cause.get_message == 'Empty input'
57
+ raise java.io.IOException.new("Failed to load certificate from `#{cert_file.get_absolute_path}`: #{cert_count} : #{e.get_message}", e)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,29 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Util
4
+ module Clock
5
+ module System
6
+ class << self
7
+ def millis()
8
+ gettime(:millisecond)
9
+ end
10
+
11
+ def time()
12
+ gettime(:float_second).seconds
13
+ end
14
+
15
+ def sleep(duration)
16
+ super(duration.in_seconds)
17
+ end
18
+
19
+ private
20
+
21
+ def gettime(unit)
22
+ Process.clock_gettime(Process::CLOCK_MONOTONIC, unit)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j::Driver::Internal::Util
4
+ class ErrorUtil
5
+ DEFAULT_CONN_TERMINATED_REASON = 'Please ensure that your database is listening on the correct host and port and '\
6
+ 'that you have compatible encryption settings both on Neo4j server and driver. '\
7
+ 'Note that the default encryption setting has changed in Neo4j 4.0.'.freeze
8
+
9
+ SEC_EXCEPTION_CODE_MAPPING = {
10
+ 'Neo.ClientError.Security.Unauthorized' => Neo4j::Driver::Exceptions::AuthenticationException,
11
+ 'Neo.ClientError.Security.AuthorizationExpired' => Neo4j::Driver::Exceptions::AuthorizationExpiredException,
12
+ 'Neo.ClientError.Security.TokenExpired' => Neo4j::Driver::Exceptions::TokenExpiredException
13
+ }.freeze
14
+
15
+ class << self
16
+ def new_connection_terminated_error(reason)
17
+ reason ||= DEFAULT_CONN_TERMINATED_REASON
18
+ Neo4j::Driver::Exceptions::ServiceUnavailableException.new("Connection to the database terminated. #{reason}")
19
+ end
20
+
21
+ def new_result_consumed_error
22
+ Neo4j::Driver::Exceptions::ResultConsumedException.new(
23
+ 'Cannot access records on this result any more as the result has already been consumed '\
24
+ 'or the query runner where the result is created has already been closed.'
25
+ )
26
+ end
27
+
28
+ def new_neo4j_error(code, message)
29
+ case extract_error_class(code)
30
+ when 'ClientError'
31
+ if extract_error_sub_class(code) == 'Security'
32
+ SEC_EXCEPTION_CODE_MAPPING[code] || Neo4j::Driver::Exceptions::SecurityException
33
+ else
34
+ code == 'Neo.ClientError.Database.DatabaseNotFound' ? Neo4j::Driver::Exceptions::FatalDiscoveryException : Neo4j::Driver::Exceptions::ClientException
35
+ end
36
+ when 'TransientError'
37
+ Neo4j::Driver::Exceptions::TransientException
38
+ else
39
+ Neo4j::Driver::Exceptions::DatabaseException
40
+ end.new(code, message)
41
+ end
42
+
43
+ def fatal?(error)
44
+ !error.is_a?(Neo4j::Driver::Exceptions::Neo4jException) ||
45
+ protocol_violation_error?(error.code) ||
46
+ !client_or_transient_error?(error.code)
47
+ end
48
+
49
+ def rethrow_async_exception(exception)
50
+ error = exception.cause
51
+ internal_cause = InternalExceptionCause.new(nil, error.backtrace)
52
+ error.add_suppressed(internal_cause)
53
+
54
+ # do not include Thread.current and this method in the stacktrace
55
+ current_stack_trace = Thread.current.backtrace.drop(2)
56
+ error.set_backtrace(current_stack_trace)
57
+
58
+ org.neo4j.driver.internal.shaded.io.netty.util.internal.PlatformDependent.throw_exception(error)
59
+ end
60
+
61
+ def add_suppressed(main_error, error)
62
+ main_error.add_suppressed(error) if main_error.is_a?(Neo4j::Driver::Exceptions::Neo4jException) && main_error != error
63
+ end
64
+
65
+ def get_root_cause(error)
66
+ java.util.Objects.require_non_null(error)
67
+
68
+ error.cause ? get_root_cause(error.cause) : error
69
+ end
70
+
71
+ # Exception which is merely a holder of an async stacktrace, which is not the primary stacktrace users are interested in.
72
+ # Used for blocking API calls that block on async API calls.
73
+ class InternalExceptionCause < RuntimeError
74
+ def initialize(message, backtrace)
75
+ super(message)
76
+ set_backtrace(backtrace)
77
+ end
78
+ end
79
+
80
+ private
81
+
82
+ def extract_error_class(code)
83
+ extract_class_from_code(code, 2)
84
+ end
85
+
86
+ def extract_error_sub_class(code)
87
+ extract_class_from_code(code, 3)
88
+ end
89
+
90
+ def extract_class_from_code(code, parts_counts)
91
+ parts = code.split('.')
92
+ parts.length < parts_counts ? '' : parts[parts_counts - 1]
93
+ end
94
+
95
+ def protocol_violation_error?(error_code)
96
+ error_code&.start_with?('Neo.ClientError.Request')
97
+ end
98
+
99
+ def client_or_transient_error?(error_code)
100
+ error_code && %w[ClientError TransientError].any?(&error_code.method(:include?))
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,123 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Util
4
+ # Utility class for extracting data.
5
+ class Extract
6
+ def initialize
7
+ raise java.lang.UnsupportedOperationException
8
+ end
9
+
10
+ class << self
11
+ def list(data, map_function)
12
+ size = data.length
13
+
14
+ case size
15
+ when 0
16
+ java.util.Collections.empty_list
17
+ when 1
18
+ java.util.Collections.singleton_list(map_function.apply(data.first))
19
+ else
20
+ result = []
21
+ data.each do |value|
22
+ result << map_function.apply(value)
23
+ end
24
+
25
+ result.freeze
26
+ end
27
+ end
28
+
29
+ def map(record, map_function)
30
+ size = record.length
31
+
32
+ case size
33
+ when 0
34
+ java.util.Collections.empty_map
35
+ when 1
36
+ java.util.Collections.singleton_map[record.keys.first] = map_function.apply(record.first)
37
+ else
38
+ map = {}
39
+ keys = record.keys
40
+ size.times do |i|
41
+ map[keys[i]] = map_function.apply(record[i])
42
+ end
43
+
44
+ map.freeze
45
+ end
46
+ end
47
+
48
+ def properties(map, map_function)
49
+ size = map.length
50
+
51
+ case size
52
+ when 0
53
+ java.util.Collections.empty_list
54
+ when 1
55
+ key = map.keys.first
56
+ value = map[key]
57
+ java.util.Collections.singleton_list(InternalPair.of(key, map_function.apply(value)))
58
+ else
59
+ list = []
60
+ keys = record.keys
61
+ map.keys.each do |map_key|
62
+ map_value = map[map_key]
63
+ list << InternalPair.of(map_key, map_function.apply(map_value))
64
+ end
65
+
66
+ list.freeze
67
+ end
68
+ end
69
+
70
+ def fields(map, map_function)
71
+ size = map.keys.length
72
+
73
+ case size
74
+ when 0
75
+ java.util.Collections.empty_list
76
+ when 1
77
+ key = map.keys.first
78
+ value = map[key]
79
+ java.util.Collections.singleton_list(InternalPair.of(key, map_function.apply(value)))
80
+ else
81
+ list = []
82
+ keys = record.keys
83
+ size.times do |i|
84
+ key = keys[i]
85
+ value = map[key]
86
+ list << InternalPair.of(key, map_function.apply(value))
87
+ end
88
+
89
+ list.freeze
90
+ end
91
+ end
92
+
93
+ def map_of_values(map)
94
+ return java.util.Collections.empty_map if map.nil? || map.empty?
95
+
96
+ result = {}
97
+
98
+ map.entry_set.each do |key, value|
99
+ assert_parameter(value)
100
+ result[key] = value
101
+ end
102
+
103
+ result
104
+ end
105
+
106
+ def assert_parameter(value)
107
+ if value.is_a? Types::Node
108
+ raise Exceptions::ClientException, "Nodes can't be used as parameters."
109
+ end
110
+
111
+ if value.is_a? Types::Relationship
112
+ raise Exceptions::ClientException, "Relationships can't be used as parameters."
113
+ end
114
+
115
+ if value.is_a? Types::Path
116
+ raise Exceptions::ClientException, "Paths can't be used as parameters."
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,39 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Util
4
+ class Format
5
+ def initialize
6
+ raise java.lang.UnsupportedOperationException
7
+ end
8
+
9
+ # formats map using ':' as key-value separator instead of default '='
10
+ class << self
11
+ def format_pairs(entries)
12
+ case entries.size
13
+ when 0
14
+ '{}'
15
+ when 1
16
+ "#{key_value_string(entries.first)}"
17
+ else
18
+ builder = ""
19
+ builder << "{"
20
+ builder << key_value_string(entries.first)
21
+
22
+ entries.each do |entry|
23
+ builder << ","
24
+ builder << " "
25
+ builder << key_value_string(entry)
26
+ end
27
+
28
+ builder << "}"
29
+ end
30
+ end
31
+
32
+ private def key_value_string(entry)
33
+ "#{entry.keys.first}:#{entry.values.first}"
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j::Driver
4
+ module Internal
5
+ module Util
6
+ class Futures
7
+ # TO DO: complete this class, this was partially migrated
8
+
9
+ private
10
+
11
+ COMPLETED_WITH_NULL = Concurrent::Promises.fulfilled_future(nil)
12
+
13
+ public
14
+
15
+ class << self
16
+ def completed_with_null
17
+ COMPLETED_WITH_NULL
18
+ end
19
+
20
+ def completed_with_null_if_no_error(future, error)
21
+ error ? future.reject(error) : future.fulfill(nil)
22
+ end
23
+
24
+ def failed_future(error)
25
+ Concurrent::Promises.rejected_future(error)
26
+ end
27
+
28
+ def blocking_get(stage)
29
+ Async::Connection::EventLoopGroupFactory.assert_not_in_event_loop_thread
30
+
31
+ interrupted = false
32
+ begin
33
+ loop do
34
+ break stage.value!
35
+ rescue Interrupt => e
36
+ # this thread was interrupted while waiting
37
+ # computation denoted by the future might still be running
38
+ interrupted = true
39
+
40
+ # run the interrupt handler and ignore if it throws
41
+ # need to wait for IO thread to actually finish, can't simply re-rethrow
42
+ yield rescue nil
43
+ # rescue java.util.concurrent.ExecutionException => e
44
+ # ErrorUtil.rethrow_async_exception(e)
45
+ end
46
+ ensure
47
+ Thread.current.interrupt if interrupted
48
+ end
49
+ end
50
+
51
+ def get_now(stage)
52
+ stage.resolved? ? stage.value! : nil
53
+ end
54
+
55
+ def join_now_or_else_throw(future)
56
+ if future.resolved?
57
+ future.value!
58
+ else
59
+ raise yield
60
+ end
61
+ end
62
+
63
+ def combine_errors(error1, error2)
64
+ ErrorUtil.add_suppressed(error1, error2) if error1 && error2
65
+ error1 || error2
66
+ end
67
+
68
+ def on_error_continue(future, error_recorder)
69
+ Validator.require_non_nil!(future)
70
+
71
+ future
72
+ .then { |value| CompletionResult.new(value, nil) }
73
+ .rescue do |error|
74
+ Futures.combine_errors(error_recorder, error)
75
+ CompletionResult.new(nil, error)
76
+ end.then_flat do |result|
77
+ if result.value.nil?
78
+ yield result.error
79
+ else
80
+ Concurrent::Promises.fulfilled_future(result.value)
81
+ end
82
+ end
83
+ end
84
+
85
+ def future_completing_consumer(future, fulfilled, value, throwable)
86
+ fulfilled ? future.fulfill(value) : future.reject(throwable)
87
+ end
88
+
89
+ private
90
+
91
+ CompletionResult = Struct.new(:value, :error)
92
+
93
+ def no_op_interrupt_handler
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,35 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Util
4
+ class Iterables
5
+ EMPTY_QUEUE = Queue.new
6
+
7
+ class << self
8
+ def single(it)
9
+ if it.empty?
10
+ raise ArgumentError, 'Given iterable is empty'
11
+ end
12
+
13
+ result = it.first
14
+
15
+ if it.size > 1
16
+ raise ArgumentError, "Given iterable contains more than one element: #{it}"
17
+ end
18
+
19
+ result
20
+ end
21
+
22
+ def map(alternating_key_value)
23
+ out = {}
24
+
25
+ (0...alternating_key_value.length).step(2) do |i|
26
+ out[i] = out[i+1]
27
+ end
28
+
29
+ out
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,23 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Util
4
+ class LockUtil
5
+ class << self
6
+ def execute_with_lock(lock)
7
+ lock.lock
8
+ begin
9
+ yield
10
+ ensure
11
+ lock.unlock
12
+ end
13
+ end
14
+
15
+ def execute_with_lock_async(lock)
16
+ lock.lock
17
+ Concurrent::Promises.fulfilled_future(lock).then_flat { yield }.on_fulfillment! { lock.unlock }
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,107 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Util
4
+ class MetadataExtractor
5
+ def initialize(result_available_after_metadata_key, result_consumed_after_metadata_key)
6
+ @result_available_after_metadata_key = result_available_after_metadata_key
7
+ @result_consumed_after_metadata_key = result_consumed_after_metadata_key
8
+ end
9
+
10
+ def extract_query_keys(metadata)
11
+ metadata[:fields]&.map(&:to_sym) || []
12
+ end
13
+
14
+ def extract_query_id(metadata)
15
+ metadata[:qid]
16
+ end
17
+
18
+ def extract_result_available_after(metadata)
19
+ metadata[@result_available_after_metadata_key]
20
+ end
21
+
22
+ def extract_summary(query, connection, result_available_after, metadata)
23
+ server_info = Summary::InternalServerInfo.new(connection.server_agent, connection.server_address, connection.server_version, connection.protocol.version)
24
+ db_info = self.class.extract_database_info(metadata)
25
+ Summary::InternalResultSummary.new(
26
+ query, server_info, db_info, self.class.extract_query_type(metadata), self.class.extract_counters(metadata),
27
+ self.class.extract_plan(metadata), self.class.extract_profiled_plan(metadata),
28
+ self.class.extract_notifications(metadata), result_available_after,
29
+ self.class.extract_result_consumed_after(metadata, @result_consumed_after_metadata_key))
30
+ end
31
+
32
+ class << self
33
+ def extract_database_info(metadata)
34
+ metadata[:db]&.then(&Summary::InternalDatabaseInfo.method(:new)) ||
35
+ Summary::InternalDatabaseInfo::DEFAULT_DATABASE_INFO
36
+ end
37
+
38
+ def extract_bookmarks(metadata)
39
+ bookmark_value = metadata[:bookmark]
40
+
41
+ return InternalBookmark.parse(bookmark_value) if bookmark_value&.is_a? String
42
+
43
+ InternalBookmark.empty
44
+ end
45
+
46
+ def extract_neo4j_server_version(metadata)
47
+ server_value = extract_server(metadata)
48
+ server = Util::ServerVersion.version(server_value)
49
+ return server if Util::ServerVersion::NEO4J_PRODUCT.casecmp?(server.product)
50
+ raise Neo4j::Driver::Exceptions::UntrustedServerException, "Server does not identify as a genuine Neo4j instance: #{server.product}"
51
+ end
52
+
53
+ def extract_server(metadata)
54
+ metadata[:server].tap do |version_value|
55
+ unless version_value
56
+ raise Neo4j::Driver::Exceptions::UntrustedServerException, 'Server provides no product identifier'
57
+ end
58
+ end
59
+ end
60
+
61
+ def extract_query_type(metadata)
62
+ metadata[:type]
63
+ end
64
+
65
+ def extract_counters(metadata)
66
+ counters_value = metadata[:stats]
67
+ counters_value &&
68
+ Summary::InternalSummaryCounters.new(
69
+ *%i[
70
+ nodes-created
71
+ nodes-deleted
72
+ relationships-created
73
+ relationships-deleted
74
+ properties-set
75
+ labels-added
76
+ labels-removed
77
+ indexes-added
78
+ indexes-removed
79
+ constraints-added
80
+ constraints-removed
81
+ system-updates
82
+ ].map { |key| counters_value[key].to_i }
83
+ )
84
+ end
85
+
86
+ def extract_plan(metadata)
87
+ metadata[:plan]&.then(&Summary::InternalPlan::EXPLAIN_PLAN_FROM_VALUE)
88
+ end
89
+
90
+ def extract_profiled_plan(metadata)
91
+ metadata[:profile]&.then(&Summary::InternalProfiledPlan::PROFILED_PLAN_FROM_VALUE)
92
+ end
93
+
94
+ def extract_notifications(metadata)
95
+ metadata[:notifications]&.then do |notifications|
96
+ notifications.map(&Summary::InternalNotification::VALUE_TO_NOTIFICATION)
97
+ end
98
+ end
99
+
100
+ def extract_result_consumed_after(metadata, key)
101
+ metadata[key]&.to_i
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,9 @@
1
+ module Neo4j::Driver::Internal
2
+ module Util
3
+ class Mutex < Mutex
4
+ def synchronize
5
+ owned? ? yield : super
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Util
4
+ class Preconditions
5
+ # Assert that given expression is true.
6
+
7
+ # @param expression the value to check.
8
+ # @param message the message.
9
+ # @throws IllegalArgumentException if given value is {@code false}.
10
+ def self.check_argument(expression, message)
11
+ raise ArgumentError, message unless expression
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end