activerecord 4.0.13 → 4.1.0.beta1

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 (135) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +745 -2700
  3. data/README.rdoc +2 -2
  4. data/examples/performance.rb +30 -18
  5. data/examples/simple.rb +4 -4
  6. data/lib/active_record.rb +2 -6
  7. data/lib/active_record/aggregations.rb +2 -1
  8. data/lib/active_record/association_relation.rb +0 -4
  9. data/lib/active_record/associations.rb +87 -43
  10. data/lib/active_record/associations/alias_tracker.rb +1 -3
  11. data/lib/active_record/associations/association.rb +8 -16
  12. data/lib/active_record/associations/association_scope.rb +5 -16
  13. data/lib/active_record/associations/belongs_to_association.rb +34 -25
  14. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -1
  15. data/lib/active_record/associations/builder/association.rb +78 -54
  16. data/lib/active_record/associations/builder/belongs_to.rb +91 -58
  17. data/lib/active_record/associations/builder/collection_association.rb +47 -45
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +107 -25
  19. data/lib/active_record/associations/builder/has_many.rb +2 -2
  20. data/lib/active_record/associations/builder/has_one.rb +5 -7
  21. data/lib/active_record/associations/builder/singular_association.rb +6 -7
  22. data/lib/active_record/associations/collection_association.rb +68 -105
  23. data/lib/active_record/associations/collection_proxy.rb +12 -15
  24. data/lib/active_record/associations/has_many_association.rb +11 -9
  25. data/lib/active_record/associations/has_many_through_association.rb +16 -12
  26. data/lib/active_record/associations/has_one_association.rb +1 -1
  27. data/lib/active_record/associations/join_dependency.rb +204 -165
  28. data/lib/active_record/associations/join_dependency/join_association.rb +43 -101
  29. data/lib/active_record/associations/join_dependency/join_base.rb +6 -8
  30. data/lib/active_record/associations/join_dependency/join_part.rb +18 -37
  31. data/lib/active_record/associations/join_helper.rb +2 -11
  32. data/lib/active_record/associations/preloader.rb +89 -34
  33. data/lib/active_record/associations/preloader/association.rb +43 -25
  34. data/lib/active_record/associations/preloader/collection_association.rb +2 -2
  35. data/lib/active_record/associations/preloader/has_many_through.rb +1 -1
  36. data/lib/active_record/associations/preloader/singular_association.rb +3 -3
  37. data/lib/active_record/associations/preloader/through_association.rb +58 -26
  38. data/lib/active_record/associations/singular_association.rb +6 -5
  39. data/lib/active_record/associations/through_association.rb +2 -2
  40. data/lib/active_record/attribute_assignment.rb +5 -2
  41. data/lib/active_record/attribute_methods.rb +45 -40
  42. data/lib/active_record/attribute_methods/before_type_cast.rb +2 -1
  43. data/lib/active_record/attribute_methods/dirty.rb +8 -22
  44. data/lib/active_record/attribute_methods/primary_key.rb +1 -7
  45. data/lib/active_record/attribute_methods/read.rb +55 -28
  46. data/lib/active_record/attribute_methods/serialization.rb +12 -33
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +1 -13
  48. data/lib/active_record/attribute_methods/write.rb +37 -12
  49. data/lib/active_record/autosave_association.rb +207 -207
  50. data/lib/active_record/base.rb +5 -1
  51. data/lib/active_record/callbacks.rb +2 -2
  52. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +2 -7
  53. data/lib/active_record/connection_adapters/abstract/database_statements.rb +11 -22
  54. data/lib/active_record/connection_adapters/abstract/query_cache.rb +12 -14
  55. data/lib/active_record/connection_adapters/abstract/quoting.rb +1 -5
  56. data/lib/active_record/connection_adapters/abstract/savepoints.rb +21 -0
  57. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +84 -0
  58. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +9 -8
  59. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +52 -83
  60. data/lib/active_record/connection_adapters/abstract/transaction.rb +0 -5
  61. data/lib/active_record/connection_adapters/abstract_adapter.rb +14 -97
  62. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +58 -60
  63. data/lib/active_record/connection_adapters/column.rb +1 -35
  64. data/lib/active_record/connection_adapters/connection_specification.rb +2 -2
  65. data/lib/active_record/connection_adapters/mysql2_adapter.rb +3 -4
  66. data/lib/active_record/connection_adapters/mysql_adapter.rb +16 -15
  67. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +24 -18
  68. data/lib/active_record/connection_adapters/postgresql/cast.rb +20 -16
  69. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +23 -43
  70. data/lib/active_record/connection_adapters/postgresql/oid.rb +19 -12
  71. data/lib/active_record/connection_adapters/postgresql/quoting.rb +28 -23
  72. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +8 -30
  73. data/lib/active_record/connection_adapters/postgresql_adapter.rb +92 -75
  74. data/lib/active_record/connection_adapters/schema_cache.rb +8 -29
  75. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +31 -64
  76. data/lib/active_record/connection_handling.rb +2 -2
  77. data/lib/active_record/core.rb +22 -43
  78. data/lib/active_record/counter_cache.rb +7 -7
  79. data/lib/active_record/enum.rb +100 -0
  80. data/lib/active_record/errors.rb +10 -5
  81. data/lib/active_record/fixture_set/file.rb +2 -1
  82. data/lib/active_record/fixtures.rb +171 -74
  83. data/lib/active_record/inheritance.rb +16 -22
  84. data/lib/active_record/integration.rb +52 -1
  85. data/lib/active_record/locking/optimistic.rb +7 -2
  86. data/lib/active_record/locking/pessimistic.rb +1 -1
  87. data/lib/active_record/log_subscriber.rb +5 -12
  88. data/lib/active_record/migration.rb +62 -46
  89. data/lib/active_record/migration/command_recorder.rb +7 -13
  90. data/lib/active_record/model_schema.rb +7 -14
  91. data/lib/active_record/nested_attributes.rb +10 -8
  92. data/lib/active_record/no_touching.rb +52 -0
  93. data/lib/active_record/null_relation.rb +3 -3
  94. data/lib/active_record/persistence.rb +16 -34
  95. data/lib/active_record/querying.rb +14 -12
  96. data/lib/active_record/railtie.rb +0 -50
  97. data/lib/active_record/railties/databases.rake +12 -15
  98. data/lib/active_record/readonly_attributes.rb +0 -6
  99. data/lib/active_record/reflection.rb +189 -75
  100. data/lib/active_record/relation.rb +69 -94
  101. data/lib/active_record/relation/batches.rb +57 -23
  102. data/lib/active_record/relation/calculations.rb +36 -43
  103. data/lib/active_record/relation/delegation.rb +54 -39
  104. data/lib/active_record/relation/finder_methods.rb +107 -62
  105. data/lib/active_record/relation/merger.rb +7 -20
  106. data/lib/active_record/relation/predicate_builder.rb +57 -38
  107. data/lib/active_record/relation/predicate_builder/array_handler.rb +29 -0
  108. data/lib/active_record/relation/predicate_builder/relation_handler.rb +13 -0
  109. data/lib/active_record/relation/query_methods.rb +110 -98
  110. data/lib/active_record/relation/spawn_methods.rb +1 -2
  111. data/lib/active_record/result.rb +45 -6
  112. data/lib/active_record/runtime_registry.rb +5 -0
  113. data/lib/active_record/sanitization.rb +6 -8
  114. data/lib/active_record/schema_dumper.rb +16 -5
  115. data/lib/active_record/schema_migration.rb +24 -25
  116. data/lib/active_record/scoping/default.rb +5 -18
  117. data/lib/active_record/scoping/named.rb +8 -29
  118. data/lib/active_record/store.rb +56 -28
  119. data/lib/active_record/tasks/database_tasks.rb +8 -4
  120. data/lib/active_record/timestamp.rb +4 -4
  121. data/lib/active_record/transactions.rb +8 -10
  122. data/lib/active_record/validations/presence.rb +1 -1
  123. data/lib/active_record/validations/uniqueness.rb +1 -6
  124. data/lib/active_record/version.rb +1 -1
  125. data/lib/rails/generators/active_record.rb +2 -8
  126. data/lib/rails/generators/active_record/migration.rb +18 -0
  127. data/lib/rails/generators/active_record/migration/migration_generator.rb +4 -0
  128. data/lib/rails/generators/active_record/model/model_generator.rb +4 -0
  129. metadata +32 -45
  130. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +0 -65
  131. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +0 -60
  132. data/lib/active_record/tasks/firebird_database_tasks.rb +0 -56
  133. data/lib/active_record/tasks/oracle_database_tasks.rb +0 -45
  134. data/lib/active_record/tasks/sqlserver_database_tasks.rb +0 -48
  135. data/lib/active_record/test_case.rb +0 -102
@@ -23,10 +23,6 @@ module ActiveRecord
23
23
  @parent = nil
24
24
  end
25
25
 
26
- def finalized?
27
- @state
28
- end
29
-
30
26
  def committed?
31
27
  @state == :committed
32
28
  end
@@ -201,7 +197,6 @@ module ActiveRecord
201
197
  @state.set_state(:committed)
202
198
  @state.parent = parent.state
203
199
  connection.release_savepoint
204
- records.each { |r| parent.add_record(r) }
205
200
  end
206
201
  end
207
202
  end
@@ -4,6 +4,7 @@ require 'bigdecimal/util'
4
4
  require 'active_support/core_ext/benchmark'
5
5
  require 'active_record/connection_adapters/schema_cache'
6
6
  require 'active_record/connection_adapters/abstract/schema_dumper'
7
+ require 'active_record/connection_adapters/abstract/schema_creation'
7
8
  require 'monitor'
8
9
 
9
10
  module ActiveRecord
@@ -16,6 +17,7 @@ module ActiveRecord
16
17
  autoload_at 'active_record/connection_adapters/abstract/schema_definitions' do
17
18
  autoload :IndexDefinition
18
19
  autoload :ColumnDefinition
20
+ autoload :ChangeColumnDefinition
19
21
  autoload :TableDefinition
20
22
  autoload :Table
21
23
  autoload :AlterTable
@@ -33,6 +35,7 @@ module ActiveRecord
33
35
  autoload :Quoting
34
36
  autoload :ConnectionPool
35
37
  autoload :QueryCache
38
+ autoload :Savepoints
36
39
  end
37
40
 
38
41
  autoload_at 'active_record/connection_adapters/abstract/transaction' do
@@ -96,8 +99,6 @@ module ActiveRecord
96
99
  @last_use = false
97
100
  @logger = logger
98
101
  @pool = pool
99
- @query_cache = Hash.new { |h,sql| h[sql] = {} }
100
- @query_cache_enabled = false
101
102
  @schema_cache = SchemaCache.new self
102
103
  @visitor = nil
103
104
  @prepared_statements = false
@@ -107,71 +108,6 @@ module ActiveRecord
107
108
  true
108
109
  end
109
110
 
110
- class SchemaCreation
111
- def initialize(conn)
112
- @conn = conn
113
- @cache = {}
114
- end
115
-
116
- def accept(o)
117
- m = @cache[o.class] ||= "visit_#{o.class.name.split('::').last}"
118
- send m, o
119
- end
120
-
121
- private
122
-
123
- def visit_AlterTable(o)
124
- sql = "ALTER TABLE #{quote_table_name(o.name)} "
125
- sql << o.adds.map { |col| visit_AddColumn col }.join(' ')
126
- end
127
-
128
- def visit_AddColumn(o)
129
- sql_type = type_to_sql(o.type.to_sym, o.limit, o.precision, o.scale)
130
- sql = "ADD #{quote_column_name(o.name)} #{sql_type}"
131
- add_column_options!(sql, column_options(o))
132
- end
133
-
134
- def visit_ColumnDefinition(o)
135
- sql_type = type_to_sql(o.type.to_sym, o.limit, o.precision, o.scale)
136
- column_sql = "#{quote_column_name(o.name)} #{sql_type}"
137
- add_column_options!(column_sql, column_options(o)) unless o.primary_key?
138
- column_sql
139
- end
140
-
141
- def visit_TableDefinition(o)
142
- create_sql = "CREATE#{' TEMPORARY' if o.temporary} TABLE "
143
- create_sql << "#{quote_table_name(o.name)} ("
144
- create_sql << o.columns.map { |c| accept c }.join(', ')
145
- create_sql << ") #{o.options}"
146
- create_sql
147
- end
148
-
149
- def column_options(o)
150
- column_options = {}
151
- column_options[:null] = o.null unless o.null.nil?
152
- column_options[:default] = o.default unless o.default.nil?
153
- column_options[:column] = o
154
- column_options
155
- end
156
-
157
- def quote_column_name(name)
158
- @conn.quote_column_name name
159
- end
160
-
161
- def quote_table_name(name)
162
- @conn.quote_table_name name
163
- end
164
-
165
- def type_to_sql(type, limit, precision, scale)
166
- @conn.type_to_sql type.to_sym, limit, precision, scale
167
- end
168
-
169
- def add_column_options!(column_sql, column_options)
170
- @conn.add_column_options! column_sql, column_options
171
- column_sql
172
- end
173
- end
174
-
175
111
  def schema_creation
176
112
  SchemaCreation.new self
177
113
  end
@@ -305,8 +241,8 @@ module ActiveRecord
305
241
 
306
242
  # QUOTING ==================================================
307
243
 
308
- # Returns a bind substitution value given a +column+ and list of current
309
- # +binds+.
244
+ # Returns a bind substitution value given a bind +index+ and +column+
245
+ # NOTE: The column param is currently being used by the sqlserver-adapter
310
246
  def substitute_at(column, index)
311
247
  Arel::Nodes::BindParam.new '?'
312
248
  end
@@ -326,12 +262,6 @@ module ActiveRecord
326
262
  def active?
327
263
  end
328
264
 
329
- # Adapter should redefine this if it needs a threadsafe way to approximate
330
- # if the connection is active
331
- def active_threadsafe?
332
- active?
333
- end
334
-
335
265
  # Disconnects from the database if already connected, and establishes a
336
266
  # new connection with the database. Implementors should call super if they
337
267
  # override the default implementation.
@@ -391,27 +321,13 @@ module ActiveRecord
391
321
  @transaction.number
392
322
  end
393
323
 
394
- def increment_open_transactions
395
- ActiveSupport::Deprecation.warn "#increment_open_transactions is deprecated and has no effect"
396
- end
397
-
398
- def decrement_open_transactions
399
- ActiveSupport::Deprecation.warn "#decrement_open_transactions is deprecated and has no effect"
400
- end
401
-
402
- def transaction_joinable=(joinable)
403
- message = "#transaction_joinable= is deprecated. Please pass the :joinable option to #begin_transaction instead."
404
- ActiveSupport::Deprecation.warn message
405
- @transaction.joinable = joinable
406
- end
407
-
408
- def create_savepoint
324
+ def create_savepoint(name = nil)
409
325
  end
410
326
 
411
- def rollback_to_savepoint
327
+ def rollback_to_savepoint(name = nil)
412
328
  end
413
329
 
414
- def release_savepoint
330
+ def release_savepoint(name = nil)
415
331
  end
416
332
 
417
333
  def case_sensitive_modifier(node)
@@ -433,13 +349,14 @@ module ActiveRecord
433
349
 
434
350
  protected
435
351
 
436
- def log(sql, name = "SQL", binds = [])
352
+ def log(sql, name = "SQL", binds = [], statement_name = nil)
437
353
  @instrumenter.instrument(
438
354
  "sql.active_record",
439
- :sql => sql,
440
- :name => name,
441
- :connection_id => object_id,
442
- :binds => binds) { yield }
355
+ :sql => sql,
356
+ :name => name,
357
+ :connection_id => object_id,
358
+ :statement_name => statement_name,
359
+ :binds => binds) { yield }
443
360
  rescue => e
444
361
  message = "#{e.class.name}: #{e.message}: #{sql}"
445
362
  @logger.error message if @logger
@@ -3,18 +3,29 @@ require 'arel/visitors/bind_visitor'
3
3
  module ActiveRecord
4
4
  module ConnectionAdapters
5
5
  class AbstractMysqlAdapter < AbstractAdapter
6
+ include Savepoints
7
+
6
8
  class SchemaCreation < AbstractAdapter::SchemaCreation
7
- private
8
9
 
9
10
  def visit_AddColumn(o)
10
- add_column_position!(super, o)
11
+ add_column_position!(super, column_options(o))
11
12
  end
12
13
 
13
- def add_column_position!(sql, column)
14
- if column.first
14
+ private
15
+ def visit_ChangeColumnDefinition(o)
16
+ column = o.column
17
+ options = o.options
18
+ sql_type = type_to_sql(o.type, options[:limit], options[:precision], options[:scale])
19
+ change_column_sql = "CHANGE #{quote_column_name(column.name)} #{quote_column_name(options[:name])} #{sql_type}"
20
+ add_column_options!(change_column_sql, options)
21
+ add_column_position!(change_column_sql, options)
22
+ end
23
+
24
+ def add_column_position!(sql, options)
25
+ if options[:first]
15
26
  sql << " FIRST"
16
- elsif column.after
17
- sql << " AFTER #{quote_column_name(column.after)}"
27
+ elsif options[:after]
28
+ sql << " AFTER #{quote_column_name(options[:after])}"
18
29
  end
19
30
  sql
20
31
  end
@@ -137,7 +148,7 @@ module ActiveRecord
137
148
  QUOTED_TRUE, QUOTED_FALSE = '1', '0'
138
149
 
139
150
  NATIVE_DATABASE_TYPES = {
140
- :primary_key => "int(11) DEFAULT NULL auto_increment PRIMARY KEY",
151
+ :primary_key => "int(11) auto_increment PRIMARY KEY",
141
152
  :string => { :name => "varchar", :limit => 255 },
142
153
  :text => { :name => "text" },
143
154
  :integer => { :name => "int", :limit => 4 },
@@ -185,11 +196,6 @@ module ActiveRecord
185
196
  true
186
197
  end
187
198
 
188
- # Returns true, since this connection adapter supports savepoints.
189
- def supports_savepoints?
190
- true
191
- end
192
-
193
199
  def supports_bulk_alter? #:nodoc:
194
200
  true
195
201
  end
@@ -200,6 +206,17 @@ module ActiveRecord
200
206
  true
201
207
  end
202
208
 
209
+ def type_cast(value, column)
210
+ case value
211
+ when TrueClass
212
+ 1
213
+ when FalseClass
214
+ 0
215
+ else
216
+ super
217
+ end
218
+ end
219
+
203
220
  # MySQL 4 technically support transaction isolation, but it is affected by a bug
204
221
  # where the transaction level gets persisted for the whole session:
205
222
  #
@@ -238,8 +255,8 @@ module ActiveRecord
238
255
  # QUOTING ==================================================
239
256
 
240
257
  def quote(value, column = nil)
241
- if value.kind_of?(String) && column && column.type == :binary && column.class.respond_to?(:string_to_binary)
242
- s = column.class.string_to_binary(value).unpack("H*")[0]
258
+ if value.kind_of?(String) && column && column.type == :binary
259
+ s = value.unpack("H*")[0]
243
260
  "x'#{s}'"
244
261
  elsif value.kind_of?(BigDecimal)
245
262
  value.to_s("F")
@@ -266,7 +283,7 @@ module ActiveRecord
266
283
 
267
284
  # REFERENTIAL INTEGRITY ====================================
268
285
 
269
- def disable_referential_integrity(&block) #:nodoc:
286
+ def disable_referential_integrity #:nodoc:
270
287
  old = select_value("SELECT @@FOREIGN_KEY_CHECKS")
271
288
 
272
289
  begin
@@ -286,12 +303,6 @@ module ActiveRecord
286
303
  else
287
304
  log(sql, name) { @connection.query(sql) }
288
305
  end
289
- rescue ActiveRecord::StatementInvalid => exception
290
- if exception.message.split(":").first =~ /Packets out of order/
291
- raise ActiveRecord::StatementInvalid.new("'Packets out of order' error was received from the database. Please update your mysql bindings (gem install mysql) and read http://dev.mysql.com/doc/mysql/en/password-hashing.html for more information. If you're on Windows, use the Instant Rails installer to get the updated mysql bindings.", exception.original_exception)
292
- else
293
- raise
294
- end
295
306
  end
296
307
 
297
308
  # MysqlAdapter has to free a result after using it, so we use this method to write
@@ -308,39 +319,19 @@ module ActiveRecord
308
319
 
309
320
  def begin_db_transaction
310
321
  execute "BEGIN"
311
- rescue
312
- # Transactions aren't supported
313
322
  end
314
323
 
315
324
  def begin_isolated_db_transaction(isolation)
316
325
  execute "SET TRANSACTION ISOLATION LEVEL #{transaction_isolation_levels.fetch(isolation)}"
317
326
  begin_db_transaction
318
- rescue
319
- # Transactions aren't supported
320
327
  end
321
328
 
322
329
  def commit_db_transaction #:nodoc:
323
330
  execute "COMMIT"
324
- rescue
325
- # Transactions aren't supported
326
331
  end
327
332
 
328
333
  def rollback_db_transaction #:nodoc:
329
334
  execute "ROLLBACK"
330
- rescue
331
- # Transactions aren't supported
332
- end
333
-
334
- def create_savepoint
335
- execute("SAVEPOINT #{current_savepoint_name}")
336
- end
337
-
338
- def rollback_to_savepoint
339
- execute("ROLLBACK TO SAVEPOINT #{current_savepoint_name}")
340
- end
341
-
342
- def release_savepoint
343
- execute("RELEASE SAVEPOINT #{current_savepoint_name}")
344
335
  end
345
336
 
346
337
  # In the simple case, MySQL allows us to place JOINs directly into the UPDATE
@@ -495,6 +486,18 @@ module ActiveRecord
495
486
  rename_table_indexes(table_name, new_name)
496
487
  end
497
488
 
489
+ def drop_table(table_name, options = {})
490
+ execute "DROP#{' TEMPORARY' if options[:temporary]} TABLE #{quote_table_name(table_name)}"
491
+ end
492
+
493
+ def rename_index(table_name, old_name, new_name)
494
+ if (version[0] == 5 && version[1] >= 7) || version[0] >= 6
495
+ execute "ALTER TABLE #{quote_table_name(table_name)} RENAME INDEX #{quote_table_name(old_name)} TO #{quote_table_name(new_name)}"
496
+ else
497
+ super
498
+ end
499
+ end
500
+
498
501
  def change_column_default(table_name, column_name, default)
499
502
  column = column_for(table_name, column_name)
500
503
  change_column table_name, column_name, column.sql_type, :default => default
@@ -663,10 +666,9 @@ module ActiveRecord
663
666
  end
664
667
 
665
668
  def add_column_sql(table_name, column_name, type, options = {})
666
- add_column_sql = "ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
667
- add_column_options!(add_column_sql, options)
668
- add_column_position!(add_column_sql, options)
669
- add_column_sql
669
+ td = create_table_definition table_name, options[:temporary], options[:options]
670
+ cd = td.new_column_definition(column_name, type, options)
671
+ schema_creation.visit_AddColumn cd
670
672
  end
671
673
 
672
674
  def change_column_sql(table_name, column_name, type, options = {})
@@ -680,14 +682,12 @@ module ActiveRecord
680
682
  options[:null] = column.null
681
683
  end
682
684
 
683
- change_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
684
- add_column_options!(change_column_sql, options)
685
- add_column_position!(change_column_sql, options)
686
- change_column_sql
685
+ options[:name] = column.name
686
+ schema_creation.accept ChangeColumnDefinition.new column, type, options
687
687
  end
688
688
 
689
689
  def rename_column_sql(table_name, column_name, new_column_name)
690
- options = {}
690
+ options = { name: new_column_name }
691
691
 
692
692
  if column = columns(table_name).find { |c| c.name == column_name.to_s }
693
693
  options[:default] = column.default
@@ -698,9 +698,7 @@ module ActiveRecord
698
698
  end
699
699
 
700
700
  current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'", 'SCHEMA')["Type"]
701
- rename_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}"
702
- add_column_options!(rename_column_sql, options)
703
- rename_column_sql
701
+ schema_creation.accept ChangeColumnDefinition.new column, current_type, options
704
702
  end
705
703
 
706
704
  def remove_column_sql(table_name, column_name, type = nil, options = {})
@@ -721,8 +719,8 @@ module ActiveRecord
721
719
  "DROP INDEX #{index_name}"
722
720
  end
723
721
 
724
- def add_timestamps_sql(table_name, options = {})
725
- [add_column_sql(table_name, :created_at, :datetime, options), add_column_sql(table_name, :updated_at, :datetime, options)]
722
+ def add_timestamps_sql(table_name)
723
+ [add_column_sql(table_name, :created_at, :datetime), add_column_sql(table_name, :updated_at, :datetime)]
726
724
  end
727
725
 
728
726
  def remove_timestamps_sql(table_name)
@@ -743,22 +741,22 @@ module ActiveRecord
743
741
  end
744
742
 
745
743
  def configure_connection
746
- variables = @config.fetch(:variables, {}).stringify_keys
744
+ variables = @config[:variables] || {}
747
745
 
748
746
  # By default, MySQL 'where id is null' selects the last inserted id.
749
747
  # Turn this off. http://dev.rubyonrails.org/ticket/6778
750
- variables['sql_auto_is_null'] = 0
748
+ variables[:sql_auto_is_null] = 0
751
749
 
752
750
  # Increase timeout so the server doesn't disconnect us.
753
751
  wait_timeout = @config[:wait_timeout]
754
752
  wait_timeout = 2147483 unless wait_timeout.is_a?(Fixnum)
755
- variables['wait_timeout'] = self.class.type_cast_config_to_integer(wait_timeout)
753
+ variables[:wait_timeout] = self.class.type_cast_config_to_integer(wait_timeout)
756
754
 
757
755
  # Make MySQL reject illegal values rather than truncating or blanking them, see
758
756
  # http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html#sqlmode_strict_all_tables
759
757
  # If the user has provided another value for sql_mode, don't replace it.
760
- unless variables.has_key?('sql_mode')
761
- variables['sql_mode'] = strict_mode? ? 'STRICT_ALL_TABLES' : ''
758
+ if strict_mode? && !variables.has_key?(:sql_mode)
759
+ variables[:sql_mode] = 'STRICT_ALL_TABLES'
762
760
  end
763
761
 
764
762
  # NAMES does not have an equals sign, see
@@ -108,30 +108,6 @@ module ActiveRecord
108
108
  end
109
109
  end
110
110
 
111
- def type_cast_code(var_name)
112
- message = "Column#type_cast_code is deprecated in favor of using Column#type_cast only, " \
113
- "and it is going to be removed in future Rails versions."
114
- ActiveSupport::Deprecation.warn message
115
-
116
- klass = self.class.name
117
-
118
- case type
119
- when :string, :text then var_name
120
- when :integer then "#{klass}.value_to_integer(#{var_name})"
121
- when :float then "#{var_name}.to_f"
122
- when :decimal then "#{klass}.value_to_decimal(#{var_name})"
123
- when :datetime, :timestamp then "#{klass}.string_to_time(#{var_name})"
124
- when :time then "#{klass}.string_to_dummy_time(#{var_name})"
125
- when :date then "#{klass}.value_to_date(#{var_name})"
126
- when :binary then "#{klass}.binary_to_string(#{var_name})"
127
- when :boolean then "#{klass}.value_to_boolean(#{var_name})"
128
- when :hstore then "#{klass}.string_to_hstore(#{var_name})"
129
- when :inet, :cidr then "#{klass}.string_to_cidr(#{var_name})"
130
- when :json then "#{klass}.string_to_json(#{var_name})"
131
- else var_name
132
- end
133
- end
134
-
135
111
  # Returns the human name of the column name.
136
112
  #
137
113
  # ===== Examples
@@ -144,17 +120,7 @@ module ActiveRecord
144
120
  type_cast(default)
145
121
  end
146
122
 
147
- # Used to convert from Strings to BLOBs
148
- def string_to_binary(value)
149
- self.class.string_to_binary(value)
150
- end
151
-
152
123
  class << self
153
- # Used to convert from Strings to BLOBs
154
- def string_to_binary(value)
155
- value
156
- end
157
-
158
124
  # Used to convert from BLOBs to Strings
159
125
  def binary_to_string(value)
160
126
  value
@@ -315,7 +281,7 @@ module ActiveRecord
315
281
  :text
316
282
  when /blob/i, /binary/i
317
283
  :binary
318
- when /char/i, /string/i
284
+ when /char/i
319
285
  :string
320
286
  when /boolean/i
321
287
  :boolean