activerecord 4.2.0 → 6.0.5.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (373) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +852 -801
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +14 -13
  5. data/examples/performance.rb +33 -32
  6. data/examples/simple.rb +5 -4
  7. data/lib/active_record/advisory_lock_base.rb +18 -0
  8. data/lib/active_record/aggregations.rb +267 -249
  9. data/lib/active_record/association_relation.rb +26 -6
  10. data/lib/active_record/associations/alias_tracker.rb +29 -36
  11. data/lib/active_record/associations/association.rb +137 -55
  12. data/lib/active_record/associations/association_scope.rb +110 -132
  13. data/lib/active_record/associations/belongs_to_association.rb +67 -54
  14. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  15. data/lib/active_record/associations/builder/association.rb +27 -40
  16. data/lib/active_record/associations/builder/belongs_to.rb +69 -55
  17. data/lib/active_record/associations/builder/collection_association.rb +10 -29
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +58 -70
  19. data/lib/active_record/associations/builder/has_many.rb +8 -4
  20. data/lib/active_record/associations/builder/has_one.rb +46 -5
  21. data/lib/active_record/associations/builder/singular_association.rb +16 -10
  22. data/lib/active_record/associations/collection_association.rb +150 -275
  23. data/lib/active_record/associations/collection_proxy.rb +253 -152
  24. data/lib/active_record/associations/foreign_association.rb +20 -0
  25. data/lib/active_record/associations/has_many_association.rb +35 -84
  26. data/lib/active_record/associations/has_many_through_association.rb +62 -80
  27. data/lib/active_record/associations/has_one_association.rb +62 -49
  28. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  29. data/lib/active_record/associations/join_dependency/join_association.rb +43 -78
  30. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  31. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  32. data/lib/active_record/associations/join_dependency.rb +159 -162
  33. data/lib/active_record/associations/preloader/association.rb +102 -113
  34. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  35. data/lib/active_record/associations/preloader.rb +96 -95
  36. data/lib/active_record/associations/singular_association.rb +18 -45
  37. data/lib/active_record/associations/through_association.rb +49 -24
  38. data/lib/active_record/associations.rb +1737 -1596
  39. data/lib/active_record/attribute_assignment.rb +57 -185
  40. data/lib/active_record/attribute_decorators.rb +39 -17
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +14 -5
  42. data/lib/active_record/attribute_methods/dirty.rb +174 -134
  43. data/lib/active_record/attribute_methods/primary_key.rb +90 -84
  44. data/lib/active_record/attribute_methods/query.rb +6 -5
  45. data/lib/active_record/attribute_methods/read.rb +20 -77
  46. data/lib/active_record/attribute_methods/serialization.rb +40 -21
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +61 -37
  48. data/lib/active_record/attribute_methods/write.rb +33 -56
  49. data/lib/active_record/attribute_methods.rb +124 -143
  50. data/lib/active_record/attributes.rb +213 -74
  51. data/lib/active_record/autosave_association.rb +125 -54
  52. data/lib/active_record/base.rb +60 -49
  53. data/lib/active_record/callbacks.rb +101 -76
  54. data/lib/active_record/coders/json.rb +3 -1
  55. data/lib/active_record/coders/yaml_column.rb +36 -13
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +810 -291
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +253 -108
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +83 -24
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +171 -53
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +6 -4
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -47
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +383 -239
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +736 -235
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +190 -87
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +487 -192
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +536 -600
  69. data/lib/active_record/connection_adapters/column.rb +56 -43
  70. data/lib/active_record/connection_adapters/connection_specification.rb +174 -153
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +196 -0
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +71 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +59 -196
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +71 -115
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +49 -57
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +5 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +17 -13
  92. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +6 -3
  94. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -20
  95. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  97. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
  99. data/lib/active_record/connection_adapters/postgresql/oid/{infinity.rb → oid.rb} +5 -3
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +32 -11
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +70 -34
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +67 -51
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +9 -5
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +23 -25
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +144 -47
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +49 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +465 -291
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +565 -363
  117. data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  119. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +102 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  126. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +299 -364
  127. data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
  128. data/lib/active_record/connection_handling.rb +167 -41
  129. data/lib/active_record/core.rb +277 -233
  130. data/lib/active_record/counter_cache.rb +71 -50
  131. data/lib/active_record/database_configurations/database_config.rb +37 -0
  132. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  133. data/lib/active_record/database_configurations/url_config.rb +78 -0
  134. data/lib/active_record/database_configurations.rb +233 -0
  135. data/lib/active_record/define_callbacks.rb +22 -0
  136. data/lib/active_record/dynamic_matchers.rb +87 -106
  137. data/lib/active_record/enum.rb +172 -89
  138. data/lib/active_record/errors.rb +189 -53
  139. data/lib/active_record/explain.rb +22 -11
  140. data/lib/active_record/explain_registry.rb +4 -2
  141. data/lib/active_record/explain_subscriber.rb +11 -6
  142. data/lib/active_record/fixture_set/file.rb +35 -9
  143. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  144. data/lib/active_record/fixture_set/render_context.rb +17 -0
  145. data/lib/active_record/fixture_set/table_row.rb +152 -0
  146. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  147. data/lib/active_record/fixtures.rb +225 -497
  148. data/lib/active_record/gem_version.rb +6 -4
  149. data/lib/active_record/inheritance.rb +158 -115
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +123 -29
  152. data/lib/active_record/internal_metadata.rb +53 -0
  153. data/lib/active_record/legacy_yaml_adapter.rb +48 -0
  154. data/lib/active_record/locale/en.yml +3 -2
  155. data/lib/active_record/locking/optimistic.rb +99 -98
  156. data/lib/active_record/locking/pessimistic.rb +18 -6
  157. data/lib/active_record/log_subscriber.rb +76 -33
  158. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  159. data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
  160. data/lib/active_record/middleware/database_selector.rb +74 -0
  161. data/lib/active_record/migration/command_recorder.rb +166 -91
  162. data/lib/active_record/migration/compatibility.rb +244 -0
  163. data/lib/active_record/migration/join_table.rb +8 -7
  164. data/lib/active_record/migration.rb +636 -290
  165. data/lib/active_record/model_schema.rb +344 -112
  166. data/lib/active_record/nested_attributes.rb +265 -215
  167. data/lib/active_record/no_touching.rb +15 -2
  168. data/lib/active_record/null_relation.rb +24 -38
  169. data/lib/active_record/persistence.rb +559 -125
  170. data/lib/active_record/query_cache.rb +19 -23
  171. data/lib/active_record/querying.rb +44 -30
  172. data/lib/active_record/railtie.rb +166 -47
  173. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  174. data/lib/active_record/railties/console_sandbox.rb +2 -0
  175. data/lib/active_record/railties/controller_runtime.rb +34 -33
  176. data/lib/active_record/railties/databases.rake +341 -202
  177. data/lib/active_record/readonly_attributes.rb +5 -4
  178. data/lib/active_record/reflection.rb +461 -302
  179. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  180. data/lib/active_record/relation/batches.rb +206 -55
  181. data/lib/active_record/relation/calculations.rb +270 -249
  182. data/lib/active_record/relation/delegation.rb +76 -84
  183. data/lib/active_record/relation/finder_methods.rb +287 -255
  184. data/lib/active_record/relation/from_clause.rb +30 -0
  185. data/lib/active_record/relation/merger.rb +86 -68
  186. data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -25
  187. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  188. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  189. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  190. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  191. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  192. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  193. data/lib/active_record/relation/predicate_builder.rb +112 -92
  194. data/lib/active_record/relation/query_attribute.rb +50 -0
  195. data/lib/active_record/relation/query_methods.rb +612 -392
  196. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  197. data/lib/active_record/relation/spawn_methods.rb +18 -17
  198. data/lib/active_record/relation/where_clause.rb +189 -0
  199. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  200. data/lib/active_record/relation.rb +533 -340
  201. data/lib/active_record/result.rb +79 -43
  202. data/lib/active_record/runtime_registry.rb +6 -4
  203. data/lib/active_record/sanitization.rb +144 -121
  204. data/lib/active_record/schema.rb +21 -24
  205. data/lib/active_record/schema_dumper.rb +112 -93
  206. data/lib/active_record/schema_migration.rb +24 -20
  207. data/lib/active_record/scoping/default.rb +98 -82
  208. data/lib/active_record/scoping/named.rb +91 -33
  209. data/lib/active_record/scoping.rb +45 -27
  210. data/lib/active_record/secure_token.rb +40 -0
  211. data/lib/active_record/serialization.rb +5 -5
  212. data/lib/active_record/statement_cache.rb +73 -36
  213. data/lib/active_record/store.rb +127 -42
  214. data/lib/active_record/suppressor.rb +61 -0
  215. data/lib/active_record/table_metadata.rb +90 -0
  216. data/lib/active_record/tasks/database_tasks.rb +309 -99
  217. data/lib/active_record/tasks/mysql_database_tasks.rb +58 -89
  218. data/lib/active_record/tasks/postgresql_database_tasks.rb +81 -31
  219. data/lib/active_record/tasks/sqlite_database_tasks.rb +37 -16
  220. data/lib/active_record/test_databases.rb +23 -0
  221. data/lib/active_record/test_fixtures.rb +243 -0
  222. data/lib/active_record/timestamp.rb +86 -41
  223. data/lib/active_record/touch_later.rb +65 -0
  224. data/lib/active_record/transactions.rb +222 -146
  225. data/lib/active_record/translation.rb +3 -1
  226. data/lib/active_record/type/adapter_specific_registry.rb +126 -0
  227. data/lib/active_record/type/date.rb +4 -41
  228. data/lib/active_record/type/date_time.rb +4 -38
  229. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  230. data/lib/active_record/type/hash_lookup_type_map.rb +12 -5
  231. data/lib/active_record/type/internal/timezone.rb +17 -0
  232. data/lib/active_record/type/json.rb +30 -0
  233. data/lib/active_record/type/serialized.rb +29 -15
  234. data/lib/active_record/type/text.rb +2 -2
  235. data/lib/active_record/type/time.rb +21 -16
  236. data/lib/active_record/type/type_map.rb +16 -19
  237. data/lib/active_record/type/unsigned_integer.rb +9 -8
  238. data/lib/active_record/type.rb +77 -23
  239. data/lib/active_record/type_caster/connection.rb +34 -0
  240. data/lib/active_record/type_caster/map.rb +20 -0
  241. data/lib/active_record/type_caster.rb +9 -0
  242. data/lib/active_record/validations/absence.rb +25 -0
  243. data/lib/active_record/validations/associated.rb +12 -4
  244. data/lib/active_record/validations/length.rb +26 -0
  245. data/lib/active_record/validations/presence.rb +14 -13
  246. data/lib/active_record/validations/uniqueness.rb +43 -46
  247. data/lib/active_record/validations.rb +38 -35
  248. data/lib/active_record/version.rb +3 -1
  249. data/lib/active_record.rb +44 -21
  250. data/lib/arel/alias_predication.rb +9 -0
  251. data/lib/arel/attributes/attribute.rb +37 -0
  252. data/lib/arel/attributes.rb +22 -0
  253. data/lib/arel/collectors/bind.rb +24 -0
  254. data/lib/arel/collectors/composite.rb +31 -0
  255. data/lib/arel/collectors/plain_string.rb +20 -0
  256. data/lib/arel/collectors/sql_string.rb +20 -0
  257. data/lib/arel/collectors/substitute_binds.rb +28 -0
  258. data/lib/arel/crud.rb +42 -0
  259. data/lib/arel/delete_manager.rb +18 -0
  260. data/lib/arel/errors.rb +9 -0
  261. data/lib/arel/expressions.rb +29 -0
  262. data/lib/arel/factory_methods.rb +49 -0
  263. data/lib/arel/insert_manager.rb +49 -0
  264. data/lib/arel/math.rb +45 -0
  265. data/lib/arel/nodes/and.rb +32 -0
  266. data/lib/arel/nodes/ascending.rb +23 -0
  267. data/lib/arel/nodes/binary.rb +52 -0
  268. data/lib/arel/nodes/bind_param.rb +36 -0
  269. data/lib/arel/nodes/case.rb +55 -0
  270. data/lib/arel/nodes/casted.rb +50 -0
  271. data/lib/arel/nodes/comment.rb +29 -0
  272. data/lib/arel/nodes/count.rb +12 -0
  273. data/lib/arel/nodes/delete_statement.rb +45 -0
  274. data/lib/arel/nodes/descending.rb +23 -0
  275. data/lib/arel/nodes/equality.rb +18 -0
  276. data/lib/arel/nodes/extract.rb +24 -0
  277. data/lib/arel/nodes/false.rb +16 -0
  278. data/lib/arel/nodes/full_outer_join.rb +8 -0
  279. data/lib/arel/nodes/function.rb +44 -0
  280. data/lib/arel/nodes/grouping.rb +8 -0
  281. data/lib/arel/nodes/in.rb +8 -0
  282. data/lib/arel/nodes/infix_operation.rb +80 -0
  283. data/lib/arel/nodes/inner_join.rb +8 -0
  284. data/lib/arel/nodes/insert_statement.rb +37 -0
  285. data/lib/arel/nodes/join_source.rb +20 -0
  286. data/lib/arel/nodes/matches.rb +18 -0
  287. data/lib/arel/nodes/named_function.rb +23 -0
  288. data/lib/arel/nodes/node.rb +50 -0
  289. data/lib/arel/nodes/node_expression.rb +13 -0
  290. data/lib/arel/nodes/outer_join.rb +8 -0
  291. data/lib/arel/nodes/over.rb +15 -0
  292. data/lib/arel/nodes/regexp.rb +16 -0
  293. data/lib/arel/nodes/right_outer_join.rb +8 -0
  294. data/lib/arel/nodes/select_core.rb +67 -0
  295. data/lib/arel/nodes/select_statement.rb +41 -0
  296. data/lib/arel/nodes/sql_literal.rb +16 -0
  297. data/lib/arel/nodes/string_join.rb +11 -0
  298. data/lib/arel/nodes/table_alias.rb +27 -0
  299. data/lib/arel/nodes/terminal.rb +16 -0
  300. data/lib/arel/nodes/true.rb +16 -0
  301. data/lib/arel/nodes/unary.rb +45 -0
  302. data/lib/arel/nodes/unary_operation.rb +20 -0
  303. data/lib/arel/nodes/unqualified_column.rb +22 -0
  304. data/lib/arel/nodes/update_statement.rb +41 -0
  305. data/lib/arel/nodes/values_list.rb +9 -0
  306. data/lib/arel/nodes/window.rb +126 -0
  307. data/lib/arel/nodes/with.rb +11 -0
  308. data/lib/arel/nodes.rb +68 -0
  309. data/lib/arel/order_predications.rb +13 -0
  310. data/lib/arel/predications.rb +256 -0
  311. data/lib/arel/select_manager.rb +271 -0
  312. data/lib/arel/table.rb +110 -0
  313. data/lib/arel/tree_manager.rb +72 -0
  314. data/lib/arel/update_manager.rb +34 -0
  315. data/lib/arel/visitors/depth_first.rb +203 -0
  316. data/lib/arel/visitors/dot.rb +296 -0
  317. data/lib/arel/visitors/ibm_db.rb +34 -0
  318. data/lib/arel/visitors/informix.rb +62 -0
  319. data/lib/arel/visitors/mssql.rb +156 -0
  320. data/lib/arel/visitors/mysql.rb +83 -0
  321. data/lib/arel/visitors/oracle.rb +158 -0
  322. data/lib/arel/visitors/oracle12.rb +65 -0
  323. data/lib/arel/visitors/postgresql.rb +109 -0
  324. data/lib/arel/visitors/sqlite.rb +38 -0
  325. data/lib/arel/visitors/to_sql.rb +888 -0
  326. data/lib/arel/visitors/visitor.rb +45 -0
  327. data/lib/arel/visitors/where_sql.rb +22 -0
  328. data/lib/arel/visitors.rb +20 -0
  329. data/lib/arel/window_predications.rb +9 -0
  330. data/lib/arel.rb +62 -0
  331. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  332. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  333. data/lib/rails/generators/active_record/migration/migration_generator.rb +42 -37
  334. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  335. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +11 -8
  336. data/lib/rails/generators/active_record/migration.rb +30 -1
  337. data/lib/rails/generators/active_record/model/model_generator.rb +18 -22
  338. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  339. data/lib/rails/generators/active_record.rb +7 -5
  340. metadata +174 -63
  341. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  342. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  343. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  344. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  345. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  346. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  347. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  348. data/lib/active_record/attribute.rb +0 -149
  349. data/lib/active_record/attribute_set/builder.rb +0 -86
  350. data/lib/active_record/attribute_set.rb +0 -77
  351. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
  352. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  353. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  354. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
  355. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  356. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  357. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  358. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  359. data/lib/active_record/type/big_integer.rb +0 -13
  360. data/lib/active_record/type/binary.rb +0 -50
  361. data/lib/active_record/type/boolean.rb +0 -30
  362. data/lib/active_record/type/decimal.rb +0 -40
  363. data/lib/active_record/type/decorator.rb +0 -14
  364. data/lib/active_record/type/float.rb +0 -19
  365. data/lib/active_record/type/integer.rb +0 -55
  366. data/lib/active_record/type/mutable.rb +0 -16
  367. data/lib/active_record/type/numeric.rb +0 -36
  368. data/lib/active_record/type/string.rb +0 -36
  369. data/lib/active_record/type/time_value.rb +0 -38
  370. data/lib/active_record/type/value.rb +0 -101
  371. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -22
  372. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
  373. /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,26 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/deprecation"
4
+
1
5
  module ActiveRecord
2
6
  module ConnectionAdapters # :nodoc:
3
7
  module DatabaseLimits
8
+ def max_identifier_length # :nodoc:
9
+ 64
10
+ end
4
11
 
5
12
  # Returns the maximum length of a table alias.
6
13
  def table_alias_length
7
- 255
14
+ max_identifier_length
8
15
  end
9
16
 
10
17
  # Returns the maximum length of a column name.
11
18
  def column_name_length
12
- 64
19
+ max_identifier_length
13
20
  end
21
+ deprecate :column_name_length
14
22
 
15
23
  # Returns the maximum length of a table name.
16
24
  def table_name_length
17
- 64
25
+ max_identifier_length
18
26
  end
27
+ deprecate :table_name_length
19
28
 
20
29
  # Returns the maximum allowed length for an index name. This
21
- # limit is enforced by rails and Is less than or equal to
22
- # <tt>index_name_length</tt>. The gap between
23
- # <tt>index_name_length</tt> is to allow internal rails
30
+ # limit is enforced by \Rails and is less than or equal to
31
+ # #index_name_length. The gap between
32
+ # #index_name_length is to allow internal \Rails
24
33
  # operations to use prefixes in temporary operations.
25
34
  def allowed_index_name_length
26
35
  index_name_length
@@ -28,26 +37,29 @@ module ActiveRecord
28
37
 
29
38
  # Returns the maximum length of an index name.
30
39
  def index_name_length
31
- 64
40
+ max_identifier_length
32
41
  end
33
42
 
34
43
  # Returns the maximum number of columns per table.
35
44
  def columns_per_table
36
45
  1024
37
46
  end
47
+ deprecate :columns_per_table
38
48
 
39
49
  # Returns the maximum number of indexes per table.
40
50
  def indexes_per_table
41
51
  16
42
52
  end
53
+ deprecate :indexes_per_table
43
54
 
44
55
  # Returns the maximum number of columns in a multicolumn index.
45
56
  def columns_per_multicolumn_index
46
57
  16
47
58
  end
59
+ deprecate :columns_per_multicolumn_index
48
60
 
49
61
  # Returns the maximum number of elements in an IN (x,y,z) clause.
50
- # nil means no limit.
62
+ # +nil+ means no limit.
51
63
  def in_clause_length
52
64
  nil
53
65
  end
@@ -56,12 +68,18 @@ module ActiveRecord
56
68
  def sql_query_length
57
69
  1048575
58
70
  end
71
+ deprecate :sql_query_length
59
72
 
60
73
  # Returns maximum number of joins in a single query.
61
74
  def joins_per_query
62
75
  256
63
76
  end
77
+ deprecate :joins_per_query
64
78
 
79
+ private
80
+ def bind_params_length
81
+ 65535
82
+ end
65
83
  end
66
84
  end
67
85
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters # :nodoc:
3
5
  module DatabaseStatements
@@ -7,29 +9,66 @@ module ActiveRecord
7
9
  end
8
10
 
9
11
  # Converts an arel AST to SQL
10
- def to_sql(arel, binds = [])
11
- if arel.respond_to?(:ast)
12
- collected = visitor.accept(arel.ast, collector)
13
- collected.compile(binds.dup, self)
12
+ def to_sql(arel_or_sql_string, binds = [])
13
+ sql, _ = to_sql_and_binds(arel_or_sql_string, binds)
14
+ sql
15
+ end
16
+
17
+ def to_sql_and_binds(arel_or_sql_string, binds = []) # :nodoc:
18
+ if arel_or_sql_string.respond_to?(:ast)
19
+ unless binds.empty?
20
+ raise "Passing bind parameters with an arel AST is forbidden. " \
21
+ "The values must be stored on the AST directly"
22
+ end
23
+
24
+ if prepared_statements
25
+ sql, binds = visitor.compile(arel_or_sql_string.ast, collector)
26
+
27
+ if binds.length > bind_params_length
28
+ unprepared_statement do
29
+ sql, binds = to_sql_and_binds(arel_or_sql_string)
30
+ visitor.preparable = false
31
+ end
32
+ end
33
+ else
34
+ sql = visitor.compile(arel_or_sql_string.ast, collector)
35
+ end
36
+ [sql.freeze, binds]
14
37
  else
15
- arel
38
+ visitor.preparable = false if prepared_statements
39
+ [arel_or_sql_string.dup.freeze, binds]
16
40
  end
17
41
  end
42
+ private :to_sql_and_binds
18
43
 
19
44
  # This is used in the StatementCache object. It returns an object that
20
45
  # can be used to query the database repeatedly.
21
- def cacheable_query(arel) # :nodoc:
46
+ def cacheable_query(klass, arel) # :nodoc:
22
47
  if prepared_statements
23
- ActiveRecord::StatementCache.query visitor, arel.ast
48
+ sql, binds = visitor.compile(arel.ast, collector)
49
+ query = klass.query(sql)
24
50
  else
25
- ActiveRecord::StatementCache.partial_query visitor, arel.ast, collector
51
+ collector = klass.partial_query_collector
52
+ parts, binds = visitor.compile(arel.ast, collector)
53
+ query = klass.partial_query(parts)
26
54
  end
55
+ [query, binds]
27
56
  end
28
57
 
29
58
  # Returns an ActiveRecord::Result instance.
30
- def select_all(arel, name = nil, binds = [])
31
- arel, binds = binds_from_relation arel, binds
32
- select(to_sql(arel, binds), name, binds)
59
+ def select_all(arel, name = nil, binds = [], preparable: nil)
60
+ arel = arel_from_relation(arel)
61
+ sql, binds = to_sql_and_binds(arel, binds)
62
+
63
+ if preparable.nil?
64
+ preparable = prepared_statements ? visitor.preparable : false
65
+ end
66
+
67
+ if prepared_statements && preparable
68
+ select_prepared(sql, name, binds)
69
+ else
70
+ select(sql, name, binds)
71
+ end
33
72
  end
34
73
 
35
74
  # Returns a record hash with the column names as keys and column values
@@ -40,89 +79,121 @@ module ActiveRecord
40
79
 
41
80
  # Returns a single value from a record
42
81
  def select_value(arel, name = nil, binds = [])
43
- if result = select_one(arel, name, binds)
44
- result.values.first
45
- end
82
+ single_value_from_rows(select_rows(arel, name, binds))
46
83
  end
47
84
 
48
85
  # Returns an array of the values of the first column in a select:
49
86
  # select_values("SELECT id FROM companies LIMIT 3") => [1,2,3]
50
- def select_values(arel, name = nil)
51
- arel, binds = binds_from_relation arel, []
52
- select_rows(to_sql(arel, binds), name, binds).map(&:first)
87
+ def select_values(arel, name = nil, binds = [])
88
+ select_rows(arel, name, binds).map(&:first)
53
89
  end
54
90
 
55
91
  # Returns an array of arrays containing the field values.
56
92
  # Order is the same as that returned by +columns+.
57
- def select_rows(sql, name = nil, binds = [])
93
+ def select_rows(arel, name = nil, binds = [])
94
+ select_all(arel, name, binds).rows
95
+ end
96
+
97
+ def query_value(sql, name = nil) # :nodoc:
98
+ single_value_from_rows(query(sql, name))
99
+ end
100
+
101
+ def query_values(sql, name = nil) # :nodoc:
102
+ query(sql, name).map(&:first)
103
+ end
104
+
105
+ def query(sql, name = nil) # :nodoc:
106
+ exec_query(sql, name).rows
58
107
  end
59
- undef_method :select_rows
60
108
 
61
- # Executes the SQL statement in the context of this connection.
109
+ # Determines whether the SQL statement is a write query.
110
+ def write_query?(sql)
111
+ raise NotImplementedError
112
+ end
113
+
114
+ # Executes the SQL statement in the context of this connection and returns
115
+ # the raw result from the connection adapter.
116
+ # Note: depending on your database connector, the result returned by this
117
+ # method may be manually memory managed. Consider using the exec_query
118
+ # wrapper instead.
62
119
  def execute(sql, name = nil)
120
+ raise NotImplementedError
63
121
  end
64
- undef_method :execute
65
122
 
66
123
  # Executes +sql+ statement in the context of this connection using
67
124
  # +binds+ as the bind substitutes. +name+ is logged along with
68
125
  # the executed +sql+ statement.
69
- def exec_query(sql, name = 'SQL', binds = [])
126
+ def exec_query(sql, name = "SQL", binds = [], prepare: false)
127
+ raise NotImplementedError
70
128
  end
71
129
 
72
130
  # Executes insert +sql+ statement in the context of this connection using
73
131
  # +binds+ as the bind substitutes. +name+ is logged along with
74
132
  # the executed +sql+ statement.
75
- def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
133
+ def exec_insert(sql, name = nil, binds = [], pk = nil, sequence_name = nil)
134
+ sql, binds = sql_for_insert(sql, pk, binds)
76
135
  exec_query(sql, name, binds)
77
136
  end
78
137
 
79
138
  # Executes delete +sql+ statement in the context of this connection using
80
139
  # +binds+ as the bind substitutes. +name+ is logged along with
81
140
  # the executed +sql+ statement.
82
- def exec_delete(sql, name, binds)
141
+ def exec_delete(sql, name = nil, binds = [])
83
142
  exec_query(sql, name, binds)
84
143
  end
85
144
 
86
- # Executes the truncate statement.
87
- def truncate(table_name, name = nil)
88
- raise NotImplementedError
89
- end
90
-
91
145
  # Executes update +sql+ statement in the context of this connection using
92
146
  # +binds+ as the bind substitutes. +name+ is logged along with
93
147
  # the executed +sql+ statement.
94
- def exec_update(sql, name, binds)
148
+ def exec_update(sql, name = nil, binds = [])
95
149
  exec_query(sql, name, binds)
96
150
  end
97
151
 
98
- # Returns the last auto-generated ID from the affected table.
152
+ def exec_insert_all(sql, name) # :nodoc:
153
+ exec_query(sql, name)
154
+ end
155
+
156
+ # Executes an INSERT query and returns the new record's ID
99
157
  #
100
- # +id_value+ will be returned unless the value is nil, in
158
+ # +id_value+ will be returned unless the value is +nil+, in
101
159
  # which case the database will attempt to calculate the last inserted
102
160
  # id and return that value.
103
161
  #
104
162
  # If the next id was calculated in advance (as in Oracle), it should be
105
163
  # passed in as +id_value+.
106
164
  def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
107
- sql, binds = sql_for_insert(to_sql(arel, binds), pk, id_value, sequence_name, binds)
108
- value = exec_insert(sql, name, binds, pk, sequence_name)
165
+ sql, binds = to_sql_and_binds(arel, binds)
166
+ value = exec_insert(sql, name, binds, pk, sequence_name)
109
167
  id_value || last_inserted_id(value)
110
168
  end
169
+ alias create insert
111
170
 
112
171
  # Executes the update statement and returns the number of rows affected.
113
172
  def update(arel, name = nil, binds = [])
114
- exec_update(to_sql(arel, binds), name, binds)
173
+ sql, binds = to_sql_and_binds(arel, binds)
174
+ exec_update(sql, name, binds)
115
175
  end
116
176
 
117
177
  # Executes the delete statement and returns the number of rows affected.
118
178
  def delete(arel, name = nil, binds = [])
119
- exec_delete(to_sql(arel, binds), name, binds)
179
+ sql, binds = to_sql_and_binds(arel, binds)
180
+ exec_delete(sql, name, binds)
120
181
  end
121
182
 
122
- # Returns +true+ when the connection adapter supports prepared statement
123
- # caching, otherwise returns +false+
124
- def supports_statement_cache?
125
- false
183
+ # Executes the truncate statement.
184
+ def truncate(table_name, name = nil)
185
+ execute(build_truncate_statement(table_name), name)
186
+ end
187
+
188
+ def truncate_tables(*table_names) # :nodoc:
189
+ return if table_names.empty?
190
+
191
+ with_multi_statements do
192
+ disable_referential_integrity do
193
+ statements = build_truncate_statements(table_names)
194
+ execute_batch(statements, "Truncate Tables")
195
+ end
196
+ end
126
197
  end
127
198
 
128
199
  # Runs the given block in a database transaction, and returns the result
@@ -136,7 +207,7 @@ module ActiveRecord
136
207
  #
137
208
  # In order to get around this problem, #transaction will emulate the effect
138
209
  # of nested transactions, by using savepoints:
139
- # http://dev.mysql.com/doc/refman/5.0/en/savepoint.html
210
+ # https://dev.mysql.com/doc/refman/5.7/en/savepoint.html
140
211
  # Savepoints are supported by MySQL and PostgreSQL. SQLite3 version >= '3.6.8'
141
212
  # supports savepoints.
142
213
  #
@@ -188,29 +259,25 @@ module ActiveRecord
188
259
  # You should consult the documentation for your database to understand the
189
260
  # semantics of these different levels:
190
261
  #
191
- # * http://www.postgresql.org/docs/9.1/static/transaction-iso.html
192
- # * https://dev.mysql.com/doc/refman/5.0/en/set-transaction.html
262
+ # * https://www.postgresql.org/docs/current/static/transaction-iso.html
263
+ # * https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html
193
264
  #
194
- # An <tt>ActiveRecord::TransactionIsolationError</tt> will be raised if:
265
+ # An ActiveRecord::TransactionIsolationError will be raised if:
195
266
  #
196
267
  # * The adapter does not support setting the isolation level
197
268
  # * You are joining an existing open transaction
198
269
  # * You are creating a nested (savepoint) transaction
199
270
  #
200
- # The mysql, mysql2 and postgresql adapters support setting the transaction
201
- # isolation level. However, support is disabled for MySQL versions below 5,
202
- # because they are affected by a bug[http://bugs.mysql.com/bug.php?id=39170]
203
- # which means the isolation level gets persisted outside the transaction.
204
- def transaction(options = {})
205
- options.assert_valid_keys :requires_new, :joinable, :isolation
206
-
207
- if !options[:requires_new] && current_transaction.joinable?
208
- if options[:isolation]
271
+ # The mysql2 and postgresql adapters support setting the transaction
272
+ # isolation level.
273
+ def transaction(requires_new: nil, isolation: nil, joinable: true)
274
+ if !requires_new && current_transaction.joinable?
275
+ if isolation
209
276
  raise ActiveRecord::TransactionIsolationError, "cannot set isolation when joining a transaction"
210
277
  end
211
278
  yield
212
279
  else
213
- transaction_manager.within_new_transaction(options) { yield }
280
+ transaction_manager.within_new_transaction(isolation: isolation, joinable: joinable) { yield }
214
281
  end
215
282
  rescue ActiveRecord::Rollback
216
283
  # rollbacks are silently swallowed
@@ -218,14 +285,16 @@ module ActiveRecord
218
285
 
219
286
  attr_reader :transaction_manager #:nodoc:
220
287
 
221
- delegate :within_new_transaction, :open_transactions, :current_transaction, :begin_transaction, :commit_transaction, :rollback_transaction, to: :transaction_manager
288
+ delegate :within_new_transaction, :open_transactions, :current_transaction, :begin_transaction,
289
+ :commit_transaction, :rollback_transaction, :materialize_transactions,
290
+ :disable_lazy_transactions!, :enable_lazy_transactions!, to: :transaction_manager
222
291
 
223
292
  def transaction_open?
224
293
  current_transaction.open?
225
294
  end
226
295
 
227
296
  def reset_transaction #:nodoc:
228
- @transaction_manager = TransactionManager.new(self)
297
+ @transaction_manager = ConnectionAdapters::TransactionManager.new(self)
229
298
  end
230
299
 
231
300
  # Register a record with the current transaction so that its after_commit and after_rollback callbacks
@@ -234,6 +303,10 @@ module ActiveRecord
234
303
  current_transaction.add_record(record)
235
304
  end
236
305
 
306
+ def transaction_state
307
+ current_transaction.state
308
+ end
309
+
237
310
  # Begins the transaction (and turns off auto-committing).
238
311
  def begin_db_transaction() end
239
312
 
@@ -258,7 +331,15 @@ module ActiveRecord
258
331
 
259
332
  # Rolls back the transaction (and turns on auto-committing). Must be
260
333
  # done if the transaction block raises an exception or returns false.
261
- def rollback_db_transaction() end
334
+ def rollback_db_transaction
335
+ exec_rollback_db_transaction
336
+ end
337
+
338
+ def exec_rollback_db_transaction() end #:nodoc:
339
+
340
+ def rollback_to_savepoint(name = nil)
341
+ exec_rollback_to_savepoint(name)
342
+ end
262
343
 
263
344
  def default_sequence_name(table, column)
264
345
  nil
@@ -271,102 +352,166 @@ module ActiveRecord
271
352
 
272
353
  # Inserts the given fixture into the table. Overridden in adapters that require
273
354
  # something beyond a simple insert (eg. Oracle).
355
+ # Most of adapters should implement `insert_fixtures_set` that leverages bulk SQL insert.
356
+ # We keep this method to provide fallback
357
+ # for databases like sqlite that do not support bulk inserts.
274
358
  def insert_fixture(fixture, table_name)
275
- columns = schema_cache.columns_hash(table_name)
359
+ execute(build_fixture_sql(Array.wrap(fixture), table_name), "Fixture Insert")
360
+ end
276
361
 
277
- key_list = []
278
- value_list = fixture.map do |name, value|
279
- key_list << quote_column_name(name)
280
- quote(value, columns[name])
281
- end
362
+ def insert_fixtures_set(fixture_set, tables_to_delete = [])
363
+ fixture_inserts = build_fixture_statements(fixture_set)
364
+ table_deletes = tables_to_delete.map { |table| "DELETE FROM #{quote_table_name(table)}" }
365
+ statements = table_deletes + fixture_inserts
282
366
 
283
- execute "INSERT INTO #{quote_table_name(table_name)} (#{key_list.join(', ')}) VALUES (#{value_list.join(', ')})", 'Fixture Insert'
367
+ with_multi_statements do
368
+ disable_referential_integrity do
369
+ transaction(requires_new: true) do
370
+ execute_batch(statements, "Fixtures Load")
371
+ end
372
+ end
373
+ end
284
374
  end
285
375
 
286
- def empty_insert_statement_value
376
+ def empty_insert_statement_value(primary_key = nil)
287
377
  "DEFAULT VALUES"
288
378
  end
289
379
 
290
380
  # Sanitizes the given LIMIT parameter in order to prevent SQL injection.
291
381
  #
292
382
  # The +limit+ may be anything that can evaluate to a string via #to_s. It
293
- # should look like an integer, or a comma-delimited list of integers, or
294
- # an Arel SQL literal.
383
+ # should look like an integer, or an Arel SQL literal.
295
384
  #
296
385
  # Returns Integer and Arel::Nodes::SqlLiteral limits as is.
297
- # Returns the sanitized limit parameter, either as an integer, or as a
298
- # string which contains a comma-delimited list of integers.
299
386
  def sanitize_limit(limit)
300
387
  if limit.is_a?(Integer) || limit.is_a?(Arel::Nodes::SqlLiteral)
301
388
  limit
302
- elsif limit.to_s.include?(',')
303
- Arel.sql limit.to_s.split(',').map{ |i| Integer(i) }.join(',')
304
389
  else
305
390
  Integer(limit)
306
391
  end
307
392
  end
308
393
 
309
- # The default strategy for an UPDATE with joins is to use a subquery. This doesn't work
310
- # on MySQL (even when aliasing the tables), but MySQL allows using JOIN directly in
311
- # an UPDATE statement, so in the MySQL adapters we redefine this to do that.
312
- def join_to_update(update, select) #:nodoc:
313
- key = update.key
314
- subselect = subquery_for(key, select)
315
-
316
- update.where key.in(subselect)
394
+ # Fixture value is quoted by Arel, however scalar values
395
+ # are not quotable. In this case we want to convert
396
+ # the column value to YAML.
397
+ def with_yaml_fallback(value) # :nodoc:
398
+ if value.is_a?(Hash) || value.is_a?(Array)
399
+ YAML.dump(value)
400
+ else
401
+ value
402
+ end
317
403
  end
318
404
 
319
- def join_to_delete(delete, select, key) #:nodoc:
320
- subselect = subquery_for(key, select)
405
+ private
406
+ def execute_batch(statements, name = nil)
407
+ statements.each do |statement|
408
+ execute(statement, name)
409
+ end
410
+ end
321
411
 
322
- delete.where key.in(subselect)
323
- end
412
+ DEFAULT_INSERT_VALUE = Arel.sql("DEFAULT").freeze
413
+ private_constant :DEFAULT_INSERT_VALUE
324
414
 
325
- protected
415
+ def default_insert_value(column)
416
+ DEFAULT_INSERT_VALUE
417
+ end
326
418
 
327
- # Returns a subquery for the given key using the join information.
328
- def subquery_for(key, select)
329
- subselect = select.clone
330
- subselect.projections = [key]
331
- subselect
419
+ def build_fixture_sql(fixtures, table_name)
420
+ columns = schema_cache.columns_hash(table_name)
421
+
422
+ values_list = fixtures.map do |fixture|
423
+ fixture = fixture.stringify_keys
424
+
425
+ unknown_columns = fixture.keys - columns.keys
426
+ if unknown_columns.any?
427
+ raise Fixture::FixtureError, %(table "#{table_name}" has no columns named #{unknown_columns.map(&:inspect).join(', ')}.)
428
+ end
429
+
430
+ columns.map do |name, column|
431
+ if fixture.key?(name)
432
+ type = lookup_cast_type_from_column(column)
433
+ with_yaml_fallback(type.serialize(fixture[name]))
434
+ else
435
+ default_insert_value(column)
436
+ end
437
+ end
438
+ end
439
+
440
+ table = Arel::Table.new(table_name)
441
+ manager = Arel::InsertManager.new
442
+ manager.into(table)
443
+
444
+ if values_list.size == 1
445
+ values = values_list.shift
446
+ new_values = []
447
+ columns.each_key.with_index { |column, i|
448
+ unless values[i].equal?(DEFAULT_INSERT_VALUE)
449
+ new_values << values[i]
450
+ manager.columns << table[column]
451
+ end
452
+ }
453
+ values_list << new_values
454
+ else
455
+ columns.each_key { |column| manager.columns << table[column] }
456
+ end
457
+
458
+ manager.values = manager.create_values_list(values_list)
459
+ visitor.compile(manager.ast)
332
460
  end
333
461
 
334
- # Returns an ActiveRecord::Result instance.
335
- def select(sql, name = nil, binds = [])
336
- exec_query(sql, name, binds)
462
+ def build_fixture_statements(fixture_set)
463
+ fixture_set.map do |table_name, fixtures|
464
+ next if fixtures.empty?
465
+ build_fixture_sql(fixtures, table_name)
466
+ end.compact
337
467
  end
338
468
 
469
+ def build_truncate_statement(table_name)
470
+ "TRUNCATE TABLE #{quote_table_name(table_name)}"
471
+ end
339
472
 
340
- # Returns the last auto-generated ID from the affected table.
341
- def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)
342
- execute(sql, name)
343
- id_value
473
+ def build_truncate_statements(table_names)
474
+ table_names.map do |table_name|
475
+ build_truncate_statement(table_name)
476
+ end
344
477
  end
345
478
 
346
- # Executes the update statement and returns the number of rows affected.
347
- def update_sql(sql, name = nil)
348
- execute(sql, name)
479
+ def with_multi_statements
480
+ yield
349
481
  end
350
482
 
351
- # Executes the delete statement and returns the number of rows affected.
352
- def delete_sql(sql, name = nil)
353
- update_sql(sql, name)
483
+ def combine_multi_statements(total_sql)
484
+ total_sql.join(";\n")
354
485
  end
355
486
 
356
- def sql_for_insert(sql, pk, id_value, sequence_name, binds)
487
+ # Returns an ActiveRecord::Result instance.
488
+ def select(sql, name = nil, binds = [])
489
+ exec_query(sql, name, binds, prepare: false)
490
+ end
491
+
492
+ def select_prepared(sql, name = nil, binds = [])
493
+ exec_query(sql, name, binds, prepare: true)
494
+ end
495
+
496
+ def sql_for_insert(sql, pk, binds)
357
497
  [sql, binds]
358
498
  end
359
499
 
360
500
  def last_inserted_id(result)
361
- row = result.rows.first
501
+ single_value_from_rows(result.rows)
502
+ end
503
+
504
+ def single_value_from_rows(rows)
505
+ row = rows.first
362
506
  row && row.first
363
507
  end
364
508
 
365
- def binds_from_relation(relation, binds)
366
- if relation.is_a?(Relation) && binds.empty?
367
- relation, binds = relation.arel, relation.bind_values
509
+ def arel_from_relation(relation)
510
+ if relation.is_a?(Relation)
511
+ relation.arel
512
+ else
513
+ relation
368
514
  end
369
- [relation, binds]
370
515
  end
371
516
  end
372
517
  end