omg-activerecord 8.0.0.alpha1

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 (412) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +355 -0
  3. data/MIT-LICENSE +22 -0
  4. data/README.rdoc +219 -0
  5. data/examples/performance.rb +185 -0
  6. data/examples/simple.rb +15 -0
  7. data/lib/active_record/aggregations.rb +287 -0
  8. data/lib/active_record/association_relation.rb +50 -0
  9. data/lib/active_record/associations/alias_tracker.rb +90 -0
  10. data/lib/active_record/associations/association.rb +417 -0
  11. data/lib/active_record/associations/association_scope.rb +175 -0
  12. data/lib/active_record/associations/belongs_to_association.rb +163 -0
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +50 -0
  14. data/lib/active_record/associations/builder/association.rb +170 -0
  15. data/lib/active_record/associations/builder/belongs_to.rb +160 -0
  16. data/lib/active_record/associations/builder/collection_association.rb +80 -0
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +107 -0
  18. data/lib/active_record/associations/builder/has_many.rb +23 -0
  19. data/lib/active_record/associations/builder/has_one.rb +61 -0
  20. data/lib/active_record/associations/builder/singular_association.rb +48 -0
  21. data/lib/active_record/associations/collection_association.rb +535 -0
  22. data/lib/active_record/associations/collection_proxy.rb +1163 -0
  23. data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
  24. data/lib/active_record/associations/errors.rb +265 -0
  25. data/lib/active_record/associations/foreign_association.rb +40 -0
  26. data/lib/active_record/associations/has_many_association.rb +167 -0
  27. data/lib/active_record/associations/has_many_through_association.rb +232 -0
  28. data/lib/active_record/associations/has_one_association.rb +142 -0
  29. data/lib/active_record/associations/has_one_through_association.rb +45 -0
  30. data/lib/active_record/associations/join_dependency/join_association.rb +106 -0
  31. data/lib/active_record/associations/join_dependency/join_base.rb +23 -0
  32. data/lib/active_record/associations/join_dependency/join_part.rb +71 -0
  33. data/lib/active_record/associations/join_dependency.rb +301 -0
  34. data/lib/active_record/associations/nested_error.rb +47 -0
  35. data/lib/active_record/associations/preloader/association.rb +316 -0
  36. data/lib/active_record/associations/preloader/batch.rb +48 -0
  37. data/lib/active_record/associations/preloader/branch.rb +153 -0
  38. data/lib/active_record/associations/preloader/through_association.rb +150 -0
  39. data/lib/active_record/associations/preloader.rb +135 -0
  40. data/lib/active_record/associations/singular_association.rb +76 -0
  41. data/lib/active_record/associations/through_association.rb +132 -0
  42. data/lib/active_record/associations.rb +1897 -0
  43. data/lib/active_record/asynchronous_queries_tracker.rb +64 -0
  44. data/lib/active_record/attribute_assignment.rb +82 -0
  45. data/lib/active_record/attribute_methods/before_type_cast.rb +106 -0
  46. data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
  47. data/lib/active_record/attribute_methods/dirty.rb +262 -0
  48. data/lib/active_record/attribute_methods/primary_key.rb +158 -0
  49. data/lib/active_record/attribute_methods/query.rb +50 -0
  50. data/lib/active_record/attribute_methods/read.rb +46 -0
  51. data/lib/active_record/attribute_methods/serialization.rb +232 -0
  52. data/lib/active_record/attribute_methods/time_zone_conversion.rb +94 -0
  53. data/lib/active_record/attribute_methods/write.rb +49 -0
  54. data/lib/active_record/attribute_methods.rb +542 -0
  55. data/lib/active_record/attributes.rb +307 -0
  56. data/lib/active_record/autosave_association.rb +586 -0
  57. data/lib/active_record/base.rb +338 -0
  58. data/lib/active_record/callbacks.rb +452 -0
  59. data/lib/active_record/coders/column_serializer.rb +61 -0
  60. data/lib/active_record/coders/json.rb +15 -0
  61. data/lib/active_record/coders/yaml_column.rb +95 -0
  62. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +290 -0
  63. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +210 -0
  64. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +78 -0
  65. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +923 -0
  66. data/lib/active_record/connection_adapters/abstract/database_limits.rb +31 -0
  67. data/lib/active_record/connection_adapters/abstract/database_statements.rb +747 -0
  68. data/lib/active_record/connection_adapters/abstract/query_cache.rb +319 -0
  69. data/lib/active_record/connection_adapters/abstract/quoting.rb +239 -0
  70. data/lib/active_record/connection_adapters/abstract/savepoints.rb +24 -0
  71. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +190 -0
  72. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +961 -0
  73. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +106 -0
  74. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1883 -0
  75. data/lib/active_record/connection_adapters/abstract/transaction.rb +676 -0
  76. data/lib/active_record/connection_adapters/abstract_adapter.rb +1218 -0
  77. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +1016 -0
  78. data/lib/active_record/connection_adapters/column.rb +122 -0
  79. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  80. data/lib/active_record/connection_adapters/mysql/column.rb +28 -0
  81. data/lib/active_record/connection_adapters/mysql/database_statements.rb +95 -0
  82. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
  83. data/lib/active_record/connection_adapters/mysql/quoting.rb +114 -0
  84. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +106 -0
  85. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +106 -0
  86. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +97 -0
  87. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +300 -0
  88. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +40 -0
  89. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +96 -0
  90. data/lib/active_record/connection_adapters/mysql2_adapter.rb +196 -0
  91. data/lib/active_record/connection_adapters/pool_config.rb +83 -0
  92. data/lib/active_record/connection_adapters/pool_manager.rb +57 -0
  93. data/lib/active_record/connection_adapters/postgresql/column.rb +82 -0
  94. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +231 -0
  95. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +91 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +54 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +31 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +36 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
  104. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +20 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +109 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  108. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
  109. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  110. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  111. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +42 -0
  112. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
  113. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +74 -0
  114. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +124 -0
  115. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
  116. data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
  117. data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
  118. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +125 -0
  119. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +45 -0
  120. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
  121. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
  122. data/lib/active_record/connection_adapters/postgresql/oid.rb +38 -0
  123. data/lib/active_record/connection_adapters/postgresql/quoting.rb +238 -0
  124. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +71 -0
  125. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +169 -0
  126. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +392 -0
  127. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +127 -0
  128. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +1162 -0
  129. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +44 -0
  130. data/lib/active_record/connection_adapters/postgresql/utils.rb +79 -0
  131. data/lib/active_record/connection_adapters/postgresql_adapter.rb +1182 -0
  132. data/lib/active_record/connection_adapters/schema_cache.rb +478 -0
  133. data/lib/active_record/connection_adapters/sql_type_metadata.rb +45 -0
  134. data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
  135. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +145 -0
  136. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  137. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +116 -0
  138. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +37 -0
  139. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +39 -0
  140. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +47 -0
  141. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +221 -0
  142. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +843 -0
  143. data/lib/active_record/connection_adapters/statement_pool.rb +67 -0
  144. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +69 -0
  145. data/lib/active_record/connection_adapters/trilogy_adapter.rb +212 -0
  146. data/lib/active_record/connection_adapters.rb +176 -0
  147. data/lib/active_record/connection_handling.rb +413 -0
  148. data/lib/active_record/core.rb +836 -0
  149. data/lib/active_record/counter_cache.rb +230 -0
  150. data/lib/active_record/database_configurations/connection_url_resolver.rb +105 -0
  151. data/lib/active_record/database_configurations/database_config.rb +104 -0
  152. data/lib/active_record/database_configurations/hash_config.rb +172 -0
  153. data/lib/active_record/database_configurations/url_config.rb +78 -0
  154. data/lib/active_record/database_configurations.rb +309 -0
  155. data/lib/active_record/delegated_type.rb +289 -0
  156. data/lib/active_record/deprecator.rb +7 -0
  157. data/lib/active_record/destroy_association_async_job.rb +38 -0
  158. data/lib/active_record/disable_joins_association_relation.rb +39 -0
  159. data/lib/active_record/dynamic_matchers.rb +121 -0
  160. data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
  161. data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
  162. data/lib/active_record/encryption/cipher.rb +53 -0
  163. data/lib/active_record/encryption/config.rb +70 -0
  164. data/lib/active_record/encryption/configurable.rb +60 -0
  165. data/lib/active_record/encryption/context.rb +42 -0
  166. data/lib/active_record/encryption/contexts.rb +76 -0
  167. data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
  168. data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
  169. data/lib/active_record/encryption/encryptable_record.rb +230 -0
  170. data/lib/active_record/encryption/encrypted_attribute_type.rb +184 -0
  171. data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
  172. data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
  173. data/lib/active_record/encryption/encryptor.rb +177 -0
  174. data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
  175. data/lib/active_record/encryption/errors.rb +15 -0
  176. data/lib/active_record/encryption/extended_deterministic_queries.rb +159 -0
  177. data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
  178. data/lib/active_record/encryption/key.rb +28 -0
  179. data/lib/active_record/encryption/key_generator.rb +53 -0
  180. data/lib/active_record/encryption/key_provider.rb +46 -0
  181. data/lib/active_record/encryption/message.rb +33 -0
  182. data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
  183. data/lib/active_record/encryption/message_serializer.rb +96 -0
  184. data/lib/active_record/encryption/null_encryptor.rb +25 -0
  185. data/lib/active_record/encryption/properties.rb +76 -0
  186. data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
  187. data/lib/active_record/encryption/scheme.rb +107 -0
  188. data/lib/active_record/encryption.rb +58 -0
  189. data/lib/active_record/enum.rb +424 -0
  190. data/lib/active_record/errors.rb +614 -0
  191. data/lib/active_record/explain.rb +63 -0
  192. data/lib/active_record/explain_registry.rb +37 -0
  193. data/lib/active_record/explain_subscriber.rb +34 -0
  194. data/lib/active_record/fixture_set/file.rb +89 -0
  195. data/lib/active_record/fixture_set/model_metadata.rb +42 -0
  196. data/lib/active_record/fixture_set/render_context.rb +19 -0
  197. data/lib/active_record/fixture_set/table_row.rb +208 -0
  198. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  199. data/lib/active_record/fixtures.rb +850 -0
  200. data/lib/active_record/future_result.rb +182 -0
  201. data/lib/active_record/gem_version.rb +17 -0
  202. data/lib/active_record/inheritance.rb +366 -0
  203. data/lib/active_record/insert_all.rb +328 -0
  204. data/lib/active_record/integration.rb +209 -0
  205. data/lib/active_record/internal_metadata.rb +164 -0
  206. data/lib/active_record/legacy_yaml_adapter.rb +15 -0
  207. data/lib/active_record/locale/en.yml +48 -0
  208. data/lib/active_record/locking/optimistic.rb +228 -0
  209. data/lib/active_record/locking/pessimistic.rb +102 -0
  210. data/lib/active_record/log_subscriber.rb +149 -0
  211. data/lib/active_record/marshalling.rb +56 -0
  212. data/lib/active_record/message_pack.rb +124 -0
  213. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  214. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  215. data/lib/active_record/middleware/database_selector.rb +87 -0
  216. data/lib/active_record/middleware/shard_selector.rb +62 -0
  217. data/lib/active_record/migration/command_recorder.rb +406 -0
  218. data/lib/active_record/migration/compatibility.rb +490 -0
  219. data/lib/active_record/migration/default_strategy.rb +22 -0
  220. data/lib/active_record/migration/execution_strategy.rb +19 -0
  221. data/lib/active_record/migration/join_table.rb +16 -0
  222. data/lib/active_record/migration/pending_migration_connection.rb +21 -0
  223. data/lib/active_record/migration.rb +1626 -0
  224. data/lib/active_record/model_schema.rb +635 -0
  225. data/lib/active_record/nested_attributes.rb +633 -0
  226. data/lib/active_record/no_touching.rb +65 -0
  227. data/lib/active_record/normalization.rb +163 -0
  228. data/lib/active_record/persistence.rb +968 -0
  229. data/lib/active_record/promise.rb +84 -0
  230. data/lib/active_record/query_cache.rb +56 -0
  231. data/lib/active_record/query_logs.rb +247 -0
  232. data/lib/active_record/query_logs_formatter.rb +30 -0
  233. data/lib/active_record/querying.rb +122 -0
  234. data/lib/active_record/railtie.rb +440 -0
  235. data/lib/active_record/railties/console_sandbox.rb +5 -0
  236. data/lib/active_record/railties/controller_runtime.rb +65 -0
  237. data/lib/active_record/railties/databases.rake +641 -0
  238. data/lib/active_record/railties/job_runtime.rb +23 -0
  239. data/lib/active_record/readonly_attributes.rb +66 -0
  240. data/lib/active_record/reflection.rb +1287 -0
  241. data/lib/active_record/relation/batches/batch_enumerator.rb +115 -0
  242. data/lib/active_record/relation/batches.rb +491 -0
  243. data/lib/active_record/relation/calculations.rb +679 -0
  244. data/lib/active_record/relation/delegation.rb +154 -0
  245. data/lib/active_record/relation/finder_methods.rb +661 -0
  246. data/lib/active_record/relation/from_clause.rb +30 -0
  247. data/lib/active_record/relation/merger.rb +192 -0
  248. data/lib/active_record/relation/predicate_builder/array_handler.rb +48 -0
  249. data/lib/active_record/relation/predicate_builder/association_query_value.rb +76 -0
  250. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  251. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +60 -0
  252. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  253. data/lib/active_record/relation/predicate_builder/relation_handler.rb +24 -0
  254. data/lib/active_record/relation/predicate_builder.rb +181 -0
  255. data/lib/active_record/relation/query_attribute.rb +68 -0
  256. data/lib/active_record/relation/query_methods.rb +2235 -0
  257. data/lib/active_record/relation/record_fetch_warning.rb +52 -0
  258. data/lib/active_record/relation/spawn_methods.rb +78 -0
  259. data/lib/active_record/relation/where_clause.rb +218 -0
  260. data/lib/active_record/relation.rb +1495 -0
  261. data/lib/active_record/result.rb +249 -0
  262. data/lib/active_record/runtime_registry.rb +82 -0
  263. data/lib/active_record/sanitization.rb +254 -0
  264. data/lib/active_record/schema.rb +77 -0
  265. data/lib/active_record/schema_dumper.rb +364 -0
  266. data/lib/active_record/schema_migration.rb +106 -0
  267. data/lib/active_record/scoping/default.rb +205 -0
  268. data/lib/active_record/scoping/named.rb +202 -0
  269. data/lib/active_record/scoping.rb +136 -0
  270. data/lib/active_record/secure_password.rb +60 -0
  271. data/lib/active_record/secure_token.rb +66 -0
  272. data/lib/active_record/serialization.rb +29 -0
  273. data/lib/active_record/signed_id.rb +137 -0
  274. data/lib/active_record/statement_cache.rb +164 -0
  275. data/lib/active_record/store.rb +299 -0
  276. data/lib/active_record/suppressor.rb +59 -0
  277. data/lib/active_record/table_metadata.rb +85 -0
  278. data/lib/active_record/tasks/database_tasks.rb +681 -0
  279. data/lib/active_record/tasks/mysql_database_tasks.rb +120 -0
  280. data/lib/active_record/tasks/postgresql_database_tasks.rb +147 -0
  281. data/lib/active_record/tasks/sqlite_database_tasks.rb +89 -0
  282. data/lib/active_record/test_databases.rb +24 -0
  283. data/lib/active_record/test_fixtures.rb +321 -0
  284. data/lib/active_record/testing/query_assertions.rb +121 -0
  285. data/lib/active_record/timestamp.rb +177 -0
  286. data/lib/active_record/token_for.rb +123 -0
  287. data/lib/active_record/touch_later.rb +70 -0
  288. data/lib/active_record/transaction.rb +132 -0
  289. data/lib/active_record/transactions.rb +523 -0
  290. data/lib/active_record/translation.rb +22 -0
  291. data/lib/active_record/type/adapter_specific_registry.rb +144 -0
  292. data/lib/active_record/type/date.rb +9 -0
  293. data/lib/active_record/type/date_time.rb +9 -0
  294. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  295. data/lib/active_record/type/hash_lookup_type_map.rb +57 -0
  296. data/lib/active_record/type/internal/timezone.rb +22 -0
  297. data/lib/active_record/type/json.rb +30 -0
  298. data/lib/active_record/type/serialized.rb +76 -0
  299. data/lib/active_record/type/text.rb +11 -0
  300. data/lib/active_record/type/time.rb +35 -0
  301. data/lib/active_record/type/type_map.rb +58 -0
  302. data/lib/active_record/type/unsigned_integer.rb +16 -0
  303. data/lib/active_record/type.rb +83 -0
  304. data/lib/active_record/type_caster/connection.rb +33 -0
  305. data/lib/active_record/type_caster/map.rb +23 -0
  306. data/lib/active_record/type_caster.rb +9 -0
  307. data/lib/active_record/validations/absence.rb +25 -0
  308. data/lib/active_record/validations/associated.rb +65 -0
  309. data/lib/active_record/validations/length.rb +26 -0
  310. data/lib/active_record/validations/numericality.rb +36 -0
  311. data/lib/active_record/validations/presence.rb +45 -0
  312. data/lib/active_record/validations/uniqueness.rb +295 -0
  313. data/lib/active_record/validations.rb +101 -0
  314. data/lib/active_record/version.rb +10 -0
  315. data/lib/active_record.rb +616 -0
  316. data/lib/arel/alias_predication.rb +9 -0
  317. data/lib/arel/attributes/attribute.rb +33 -0
  318. data/lib/arel/collectors/bind.rb +31 -0
  319. data/lib/arel/collectors/composite.rb +46 -0
  320. data/lib/arel/collectors/plain_string.rb +20 -0
  321. data/lib/arel/collectors/sql_string.rb +27 -0
  322. data/lib/arel/collectors/substitute_binds.rb +35 -0
  323. data/lib/arel/crud.rb +48 -0
  324. data/lib/arel/delete_manager.rb +32 -0
  325. data/lib/arel/errors.rb +19 -0
  326. data/lib/arel/expressions.rb +29 -0
  327. data/lib/arel/factory_methods.rb +53 -0
  328. data/lib/arel/filter_predications.rb +9 -0
  329. data/lib/arel/insert_manager.rb +48 -0
  330. data/lib/arel/math.rb +45 -0
  331. data/lib/arel/nodes/ascending.rb +23 -0
  332. data/lib/arel/nodes/binary.rb +125 -0
  333. data/lib/arel/nodes/bind_param.rb +44 -0
  334. data/lib/arel/nodes/bound_sql_literal.rb +65 -0
  335. data/lib/arel/nodes/case.rb +55 -0
  336. data/lib/arel/nodes/casted.rb +62 -0
  337. data/lib/arel/nodes/comment.rb +29 -0
  338. data/lib/arel/nodes/count.rb +12 -0
  339. data/lib/arel/nodes/cte.rb +36 -0
  340. data/lib/arel/nodes/delete_statement.rb +44 -0
  341. data/lib/arel/nodes/descending.rb +23 -0
  342. data/lib/arel/nodes/equality.rb +15 -0
  343. data/lib/arel/nodes/extract.rb +24 -0
  344. data/lib/arel/nodes/false.rb +16 -0
  345. data/lib/arel/nodes/filter.rb +10 -0
  346. data/lib/arel/nodes/fragments.rb +35 -0
  347. data/lib/arel/nodes/full_outer_join.rb +8 -0
  348. data/lib/arel/nodes/function.rb +45 -0
  349. data/lib/arel/nodes/grouping.rb +11 -0
  350. data/lib/arel/nodes/homogeneous_in.rb +68 -0
  351. data/lib/arel/nodes/in.rb +15 -0
  352. data/lib/arel/nodes/infix_operation.rb +92 -0
  353. data/lib/arel/nodes/inner_join.rb +8 -0
  354. data/lib/arel/nodes/insert_statement.rb +37 -0
  355. data/lib/arel/nodes/join_source.rb +20 -0
  356. data/lib/arel/nodes/leading_join.rb +8 -0
  357. data/lib/arel/nodes/matches.rb +18 -0
  358. data/lib/arel/nodes/named_function.rb +23 -0
  359. data/lib/arel/nodes/nary.rb +39 -0
  360. data/lib/arel/nodes/node.rb +161 -0
  361. data/lib/arel/nodes/node_expression.rb +13 -0
  362. data/lib/arel/nodes/ordering.rb +27 -0
  363. data/lib/arel/nodes/outer_join.rb +8 -0
  364. data/lib/arel/nodes/over.rb +15 -0
  365. data/lib/arel/nodes/regexp.rb +16 -0
  366. data/lib/arel/nodes/right_outer_join.rb +8 -0
  367. data/lib/arel/nodes/select_core.rb +67 -0
  368. data/lib/arel/nodes/select_statement.rb +41 -0
  369. data/lib/arel/nodes/sql_literal.rb +32 -0
  370. data/lib/arel/nodes/string_join.rb +11 -0
  371. data/lib/arel/nodes/table_alias.rb +35 -0
  372. data/lib/arel/nodes/terminal.rb +16 -0
  373. data/lib/arel/nodes/true.rb +16 -0
  374. data/lib/arel/nodes/unary.rb +44 -0
  375. data/lib/arel/nodes/unary_operation.rb +20 -0
  376. data/lib/arel/nodes/unqualified_column.rb +22 -0
  377. data/lib/arel/nodes/update_statement.rb +46 -0
  378. data/lib/arel/nodes/values_list.rb +9 -0
  379. data/lib/arel/nodes/window.rb +126 -0
  380. data/lib/arel/nodes/with.rb +11 -0
  381. data/lib/arel/nodes.rb +75 -0
  382. data/lib/arel/order_predications.rb +13 -0
  383. data/lib/arel/predications.rb +260 -0
  384. data/lib/arel/select_manager.rb +276 -0
  385. data/lib/arel/table.rb +121 -0
  386. data/lib/arel/tree_manager.rb +65 -0
  387. data/lib/arel/update_manager.rb +49 -0
  388. data/lib/arel/visitors/dot.rb +299 -0
  389. data/lib/arel/visitors/mysql.rb +111 -0
  390. data/lib/arel/visitors/postgresql.rb +99 -0
  391. data/lib/arel/visitors/sqlite.rb +38 -0
  392. data/lib/arel/visitors/to_sql.rb +1033 -0
  393. data/lib/arel/visitors/visitor.rb +45 -0
  394. data/lib/arel/visitors.rb +13 -0
  395. data/lib/arel/window_predications.rb +9 -0
  396. data/lib/arel.rb +73 -0
  397. data/lib/rails/generators/active_record/application_record/USAGE +8 -0
  398. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  399. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  400. data/lib/rails/generators/active_record/migration/migration_generator.rb +76 -0
  401. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +29 -0
  402. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
  403. data/lib/rails/generators/active_record/migration.rb +54 -0
  404. data/lib/rails/generators/active_record/model/USAGE +113 -0
  405. data/lib/rails/generators/active_record/model/model_generator.rb +94 -0
  406. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  407. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  408. data/lib/rails/generators/active_record/model/templates/module.rb.tt +7 -0
  409. data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
  410. data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
  411. data/lib/rails/generators/active_record.rb +19 -0
  412. metadata +505 -0
@@ -0,0 +1,440 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "rails"
5
+ require "active_support/core_ext/object/try"
6
+ require "active_model/railtie"
7
+
8
+ # For now, action_controller must always be present with
9
+ # Rails, so let's make sure that it gets required before
10
+ # here. This is needed for correctly setting up the middleware.
11
+ # In the future, this might become an optional require.
12
+ require "action_controller/railtie"
13
+
14
+ module ActiveRecord
15
+ # = Active Record Railtie
16
+ class Railtie < Rails::Railtie # :nodoc:
17
+ config.active_record = ActiveSupport::OrderedOptions.new
18
+ config.active_record.encryption = ActiveSupport::OrderedOptions.new
19
+
20
+ config.app_generators.orm :active_record, migration: true,
21
+ timestamps: true
22
+
23
+ config.action_dispatch.rescue_responses.merge!(
24
+ "ActiveRecord::RecordNotFound" => :not_found,
25
+ "ActiveRecord::StaleObjectError" => :conflict,
26
+ "ActiveRecord::RecordInvalid" => :unprocessable_entity,
27
+ "ActiveRecord::RecordNotSaved" => :unprocessable_entity
28
+ )
29
+
30
+ config.active_record.use_schema_cache_dump = true
31
+ config.active_record.check_schema_cache_dump_version = true
32
+ config.active_record.maintain_test_schema = true
33
+ config.active_record.has_many_inversing = false
34
+ config.active_record.query_log_tags_enabled = false
35
+ config.active_record.query_log_tags = [ :application ]
36
+ config.active_record.query_log_tags_format = :legacy
37
+ config.active_record.cache_query_log_tags = false
38
+ config.active_record.raise_on_assign_to_attr_readonly = false
39
+ config.active_record.belongs_to_required_validates_foreign_key = true
40
+ config.active_record.generate_secure_token_on = :create
41
+
42
+ config.active_record.queues = ActiveSupport::InheritableOptions.new
43
+
44
+ config.eager_load_namespaces << ActiveRecord
45
+
46
+ rake_tasks do
47
+ namespace :db do
48
+ task :load_config do
49
+ if defined?(ENGINE_ROOT) && engine = Rails::Engine.find(ENGINE_ROOT)
50
+ if engine.paths["db/migrate"].existent
51
+ ActiveRecord::Tasks::DatabaseTasks.migrations_paths += engine.paths["db/migrate"].to_a
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ load "active_record/railties/databases.rake"
58
+ end
59
+
60
+ # When loading console, force ActiveRecord::Base to be loaded
61
+ # to avoid cross references when loading a constant for the
62
+ # first time. Also, make it output to STDERR.
63
+ console do |app|
64
+ require "active_record/railties/console_sandbox" if app.sandbox?
65
+ require "active_record/base"
66
+ unless ActiveSupport::Logger.logger_outputs_to?(Rails.logger, STDERR, STDOUT)
67
+ console = ActiveSupport::Logger.new(STDERR)
68
+ console.level = Rails.logger.level
69
+ Rails.logger.broadcast_to(console)
70
+ end
71
+ ActiveRecord.verbose_query_logs = false
72
+ ActiveRecord::Base.attributes_for_inspect = :all if Rails.env.production?
73
+ end
74
+
75
+ runner do
76
+ require "active_record/base"
77
+ end
78
+
79
+ initializer "active_record.deprecator", before: :load_environment_config do |app|
80
+ app.deprecators[:active_record] = ActiveRecord.deprecator
81
+ end
82
+
83
+ initializer "active_record.initialize_timezone" do
84
+ ActiveSupport.on_load(:active_record) do
85
+ self.time_zone_aware_attributes = true
86
+ end
87
+ end
88
+
89
+ initializer "active_record.postgresql_time_zone_aware_types" do
90
+ ActiveSupport.on_load(:active_record_postgresqladapter) do
91
+ ActiveSupport.on_load(:active_record) do
92
+ ActiveRecord::Base.time_zone_aware_types << :timestamptz
93
+ end
94
+ end
95
+ end
96
+
97
+ initializer "active_record.logger" do
98
+ ActiveSupport.on_load(:active_record) { self.logger ||= ::Rails.logger }
99
+ end
100
+
101
+ initializer "active_record.backtrace_cleaner" do
102
+ ActiveSupport.on_load(:active_record) { LogSubscriber.backtrace_cleaner = ::Rails.backtrace_cleaner }
103
+ end
104
+
105
+ initializer "active_record.migration_error" do |app|
106
+ if config.active_record.migration_error == :page_load
107
+ config.app_middleware.insert_after ::ActionDispatch::Callbacks,
108
+ ActiveRecord::Migration::CheckPending,
109
+ file_watcher: app.config.file_watcher
110
+ end
111
+ end
112
+
113
+ initializer "active_record.cache_versioning_support" do
114
+ config.after_initialize do |app|
115
+ ActiveSupport.on_load(:active_record) do
116
+ if app.config.active_record.cache_versioning && Rails.cache
117
+ unless Rails.cache.class.try(:supports_cache_versioning?)
118
+ raise <<-end_error
119
+
120
+ You're using a cache store that doesn't support native cache versioning.
121
+ Your best option is to upgrade to a newer version of #{Rails.cache.class}
122
+ that supports cache versioning (#{Rails.cache.class}.supports_cache_versioning? #=> true).
123
+
124
+ Next best, switch to a different cache store that does support cache versioning:
125
+ https://guides.rubyonrails.org/caching_with_rails.html#cache-stores.
126
+
127
+ To keep using the current cache store, you can turn off cache versioning entirely:
128
+
129
+ config.active_record.cache_versioning = false
130
+
131
+ end_error
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+
138
+ initializer "active_record.copy_schema_cache_config" do
139
+ active_record_config = config.active_record
140
+
141
+ ActiveRecord::ConnectionAdapters::SchemaReflection.use_schema_cache_dump = active_record_config.use_schema_cache_dump
142
+ ActiveRecord::ConnectionAdapters::SchemaReflection.check_schema_cache_dump_version = active_record_config.check_schema_cache_dump_version
143
+ end
144
+
145
+ initializer "active_record.define_attribute_methods" do |app|
146
+ # For resiliency, it is critical that a Rails application should be
147
+ # able to boot without depending on the database (or any other service)
148
+ # being responsive.
149
+ #
150
+ # Otherwise a bad deploy adding a lot of load on the database may require to
151
+ # entirely shutdown the application so the database can recover before a fixed
152
+ # version can be deployed again.
153
+ #
154
+ # This is why this initializer tries hard not to query the database, and if it
155
+ # does, it makes sure to rescue any possible database error.
156
+ check_schema_cache_dump_version = config.active_record.check_schema_cache_dump_version
157
+ config.after_initialize do
158
+ ActiveSupport.on_load(:active_record) do
159
+ # In development and test we shouldn't eagerly define attribute methods because
160
+ # db:test:prepare will trigger later and might change the schema.
161
+ #
162
+ # Additionally if `check_schema_cache_dump_version` is enabled (which is the default),
163
+ # loading the schema cache dump trigger a database connection to compare the schema
164
+ # versions.
165
+ # This means the attribute methods will be lazily defined when the model is accessed,
166
+ # likely as part of the first few requests or jobs. This isn't good for performance
167
+ # but we unfortunately have to arbitrate between resiliency and performance, and chose
168
+ # resiliency.
169
+ if !check_schema_cache_dump_version && app.config.eager_load && !Rails.env.local?
170
+ begin
171
+ descendants.each do |model|
172
+ if model.connection_pool.schema_reflection.cached?(model.table_name)
173
+ model.define_attribute_methods
174
+ end
175
+ end
176
+ rescue ActiveRecordError => error
177
+ # Regardless of whether there was already a connection or not, we rescue any database
178
+ # error because it is critical that the application can boot even if the database
179
+ # is unhealthy.
180
+ warn "Failed to define attribute methods because of #{error.class}: #{error.message}"
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
186
+
187
+ initializer "active_record.warn_on_records_fetched_greater_than" do
188
+ if config.active_record.warn_on_records_fetched_greater_than
189
+ ActiveRecord.deprecator.warn <<~MSG.squish
190
+ `config.active_record.warn_on_records_fetched_greater_than` is deprecated and will be
191
+ removed in Rails 8.0.
192
+ Please subscribe to `sql.active_record` notifications and access the row count field to
193
+ detect large result set sizes.
194
+ MSG
195
+ ActiveSupport.on_load(:active_record) do
196
+ require "active_record/relation/record_fetch_warning"
197
+ end
198
+ end
199
+ end
200
+
201
+ initializer "active_record.sqlite3_deprecated_warning" do
202
+ if config.active_record.key?(:sqlite3_production_warning)
203
+ config.active_record.delete(:sqlite3_production_warning)
204
+ ActiveRecord.deprecator.warn <<~MSG.squish
205
+ The `config.active_record.sqlite3_production_warning` configuration no longer has any effect
206
+ and can be safely removed.
207
+ MSG
208
+ end
209
+ end
210
+
211
+ initializer "active_record.sqlite3_adapter_strict_strings_by_default" do
212
+ config.after_initialize do
213
+ if config.active_record.sqlite3_adapter_strict_strings_by_default
214
+ ActiveSupport.on_load(:active_record_sqlite3adapter) do
215
+ self.strict_strings_by_default = true
216
+ end
217
+ end
218
+ end
219
+ end
220
+
221
+ initializer "active_record.postgresql_adapter_decode_dates" do
222
+ config.after_initialize do
223
+ if config.active_record.postgresql_adapter_decode_dates
224
+ ActiveSupport.on_load(:active_record_postgresqladapter) do
225
+ self.decode_dates = true
226
+ end
227
+ end
228
+ end
229
+ end
230
+
231
+ initializer "active_record.set_configs" do |app|
232
+ configs = app.config.active_record
233
+
234
+ config.after_initialize do
235
+ configs.each do |k, v|
236
+ next if k == :encryption
237
+ setter = "#{k}="
238
+ if ActiveRecord.respond_to?(setter)
239
+ ActiveRecord.send(setter, v)
240
+ end
241
+ end
242
+ end
243
+
244
+ ActiveSupport.on_load(:active_record) do
245
+ configs_used_in_other_initializers = configs.except(
246
+ :migration_error,
247
+ :database_selector,
248
+ :database_resolver,
249
+ :database_resolver_context,
250
+ :shard_selector,
251
+ :shard_resolver,
252
+ :query_log_tags_enabled,
253
+ :query_log_tags,
254
+ :query_log_tags_format,
255
+ :cache_query_log_tags,
256
+ :sqlite3_adapter_strict_strings_by_default,
257
+ :check_schema_cache_dump_version,
258
+ :use_schema_cache_dump,
259
+ :postgresql_adapter_decode_dates,
260
+ )
261
+
262
+ configs_used_in_other_initializers.each do |k, v|
263
+ next if k == :encryption
264
+ setter = "#{k}="
265
+ # Some existing initializers might rely on Active Record configuration
266
+ # being copied from the config object to their actual destination when
267
+ # `ActiveRecord::Base` is loaded.
268
+ # So to preserve backward compatibility we copy the config a second time.
269
+ if ActiveRecord.respond_to?(setter)
270
+ ActiveRecord.send(setter, v)
271
+ else
272
+ send(setter, v)
273
+ end
274
+ end
275
+ end
276
+ end
277
+
278
+ # This sets the database configuration from Configuration#database_configuration
279
+ # and then establishes the connection.
280
+ initializer "active_record.initialize_database" do
281
+ ActiveSupport.on_load(:active_record) do
282
+ self.configurations = Rails.application.config.database_configuration
283
+
284
+ establish_connection
285
+ end
286
+ end
287
+
288
+ # Expose database runtime for logging.
289
+ initializer "active_record.log_runtime" do
290
+ require "active_record/railties/controller_runtime"
291
+ ActiveSupport.on_load(:action_controller) do
292
+ include ActiveRecord::Railties::ControllerRuntime
293
+ end
294
+
295
+ require "active_record/railties/job_runtime"
296
+ ActiveSupport.on_load(:active_job) do
297
+ include ActiveRecord::Railties::JobRuntime
298
+ end
299
+ end
300
+
301
+ initializer "active_record.set_reloader_hooks" do
302
+ ActiveSupport.on_load(:active_record) do
303
+ ActiveSupport::Reloader.before_class_unload do
304
+ if ActiveRecord::Base.connected?
305
+ ActiveRecord::Base.clear_cache!
306
+ ActiveRecord::Base.connection_handler.clear_reloadable_connections!(:all)
307
+ end
308
+ end
309
+ end
310
+ end
311
+
312
+ initializer "active_record.set_executor_hooks" do
313
+ ActiveRecord::QueryCache.install_executor_hooks
314
+ ActiveRecord::AsynchronousQueriesTracker.install_executor_hooks
315
+ end
316
+
317
+ initializer "active_record.add_watchable_files" do |app|
318
+ path = app.paths["db"].first
319
+ config.watchable_files.concat ["#{path}/schema.rb", "#{path}/structure.sql"]
320
+ end
321
+
322
+ initializer "active_record.clear_active_connections" do
323
+ config.after_initialize do
324
+ ActiveSupport.on_load(:active_record) do
325
+ # Ideally the application doesn't connect to the database during boot,
326
+ # but sometimes it does. In case it did, we want to empty out the
327
+ # connection pools so that a non-database-using process (e.g. a master
328
+ # process in a forking server model) doesn't retain a needless
329
+ # connection. If it was needed, the incremental cost of reestablishing
330
+ # this connection is trivial: the rest of the pool would need to be
331
+ # populated anyway.
332
+
333
+ connection_handler.clear_active_connections!(:all)
334
+ connection_handler.flush_idle_connections!(:all)
335
+ end
336
+ end
337
+ end
338
+
339
+ initializer "active_record.set_filter_attributes" do
340
+ ActiveSupport.on_load(:active_record) do
341
+ self.filter_attributes += Rails.application.config.filter_parameters
342
+ end
343
+ end
344
+
345
+ initializer "active_record.set_signed_id_verifier_secret" do
346
+ ActiveSupport.on_load(:active_record) do
347
+ self.signed_id_verifier_secret ||= -> { Rails.application.key_generator.generate_key("active_record/signed_id") }
348
+ end
349
+ end
350
+
351
+ initializer "active_record.generated_token_verifier" do
352
+ config.after_initialize do |app|
353
+ ActiveSupport.on_load(:active_record) do
354
+ self.generated_token_verifier ||= app.message_verifier("active_record/token_for")
355
+ end
356
+ end
357
+ end
358
+
359
+ initializer "active_record_encryption.configuration" do |app|
360
+ ActiveSupport.on_load(:active_record_encryption) do
361
+ ActiveRecord::Encryption.configure(
362
+ primary_key: app.credentials.dig(:active_record_encryption, :primary_key),
363
+ deterministic_key: app.credentials.dig(:active_record_encryption, :deterministic_key),
364
+ key_derivation_salt: app.credentials.dig(:active_record_encryption, :key_derivation_salt),
365
+ **app.config.active_record.encryption
366
+ )
367
+
368
+ auto_filtered_parameters = ActiveRecord::Encryption::AutoFilteredParameters.new(app)
369
+ auto_filtered_parameters.enable if ActiveRecord::Encryption.config.add_to_filter_parameters
370
+ end
371
+
372
+ ActiveSupport.on_load(:active_record) do
373
+ # Support extended queries for deterministic attributes and validations
374
+ if ActiveRecord::Encryption.config.extend_queries
375
+ ActiveRecord::Encryption::ExtendedDeterministicQueries.install_support
376
+ ActiveRecord::Encryption::ExtendedDeterministicUniquenessValidator.install_support
377
+ end
378
+ end
379
+
380
+ ActiveSupport.on_load(:active_record_fixture_set) do
381
+ # Encrypt Active Record fixtures
382
+ if ActiveRecord::Encryption.config.encrypt_fixtures
383
+ ActiveRecord::Fixture.prepend ActiveRecord::Encryption::EncryptedFixtures
384
+ end
385
+ end
386
+ end
387
+
388
+ initializer "active_record.query_log_tags_config" do |app|
389
+ config.after_initialize do
390
+ if app.config.active_record.query_log_tags_enabled
391
+ ActiveRecord.query_transformers << ActiveRecord::QueryLogs
392
+ ActiveRecord::QueryLogs.taggings = ActiveRecord::QueryLogs.taggings.merge(
393
+ application: Rails.application.class.name.split("::").first,
394
+ pid: -> { Process.pid.to_s },
395
+ socket: ->(context) { context[:connection].pool.db_config.socket },
396
+ db_host: ->(context) { context[:connection].pool.db_config.host },
397
+ database: ->(context) { context[:connection].pool.db_config.database },
398
+ source_location: -> { QueryLogs.query_source_location }
399
+ )
400
+ ActiveRecord.disable_prepared_statements = true
401
+
402
+ if app.config.active_record.query_log_tags.present?
403
+ ActiveRecord::QueryLogs.tags = app.config.active_record.query_log_tags
404
+ end
405
+
406
+ if app.config.active_record.query_log_tags_format
407
+ ActiveRecord::QueryLogs.tags_formatter = app.config.active_record.query_log_tags_format
408
+ end
409
+
410
+ if app.config.active_record.cache_query_log_tags
411
+ ActiveRecord::QueryLogs.cache_query_log_tags = true
412
+ end
413
+ end
414
+ end
415
+ end
416
+
417
+ initializer "active_record.unregister_current_scopes_on_unload" do |app|
418
+ config.after_initialize do
419
+ if app.config.reloading_enabled?
420
+ Rails.autoloaders.main.on_unload do |_cpath, value, _abspath|
421
+ # Conditions are written this way to be robust against custom
422
+ # implementations of value#is_a? or value#<.
423
+ if Class === value && ActiveRecord::Base > value
424
+ value.current_scope = nil
425
+ end
426
+ end
427
+ end
428
+ end
429
+ end
430
+
431
+ initializer "active_record.message_pack" do
432
+ ActiveSupport.on_load(:message_pack) do
433
+ ActiveSupport.on_load(:active_record) do
434
+ require "active_record/message_pack"
435
+ ActiveRecord::MessagePack::Extensions.install(ActiveSupport::MessagePack::CacheSerializer)
436
+ end
437
+ end
438
+ end
439
+ end
440
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveRecord::ConnectionAdapters::AbstractAdapter.set_callback(:checkout, :after) do
4
+ begin_transaction(joinable: false)
5
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/module/attr_internal"
4
+ require "active_record/runtime_registry"
5
+
6
+ module ActiveRecord
7
+ module Railties # :nodoc:
8
+ module ControllerRuntime # :nodoc:
9
+ extend ActiveSupport::Concern
10
+
11
+ module ClassMethods # :nodoc:
12
+ def log_process_action(payload)
13
+ messages, db_runtime = super, payload[:db_runtime]
14
+
15
+ if db_runtime
16
+ queries_count = payload[:queries_count] || 0
17
+ cached_queries_count = payload[:cached_queries_count] || 0
18
+ messages << ("ActiveRecord: %.1fms (%d %s, %d cached)" % [db_runtime.to_f, queries_count,
19
+ "query".pluralize(queries_count), cached_queries_count])
20
+ end
21
+
22
+ messages
23
+ end
24
+ end
25
+
26
+ def initialize(...) # :nodoc:
27
+ super
28
+ self.db_runtime = nil
29
+ end
30
+
31
+ private
32
+ attr_internal :db_runtime
33
+
34
+ def process_action(action, *args)
35
+ # We also need to reset the runtime before each action
36
+ # because of queries in middleware or in cases we are streaming
37
+ # and it won't be cleaned up by the method below.
38
+ ActiveRecord::RuntimeRegistry.reset
39
+ super
40
+ end
41
+
42
+ def cleanup_view_runtime
43
+ if logger && logger.info?
44
+ db_rt_before_render = ActiveRecord::RuntimeRegistry.reset_runtimes
45
+ self.db_runtime = (db_runtime || 0) + db_rt_before_render
46
+ runtime = super
47
+ queries_rt = ActiveRecord::RuntimeRegistry.sql_runtime - ActiveRecord::RuntimeRegistry.async_sql_runtime
48
+ db_rt_after_render = ActiveRecord::RuntimeRegistry.reset_runtimes
49
+ self.db_runtime += db_rt_after_render
50
+ runtime - queries_rt
51
+ else
52
+ super
53
+ end
54
+ end
55
+
56
+ def append_info_to_payload(payload)
57
+ super
58
+
59
+ payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::RuntimeRegistry.reset_runtimes
60
+ payload[:queries_count] = ActiveRecord::RuntimeRegistry.reset_queries_count
61
+ payload[:cached_queries_count] = ActiveRecord::RuntimeRegistry.reset_cached_queries_count
62
+ end
63
+ end
64
+ end
65
+ end