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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +745 -2700
- data/README.rdoc +2 -2
- data/examples/performance.rb +30 -18
- data/examples/simple.rb +4 -4
- data/lib/active_record.rb +2 -6
- data/lib/active_record/aggregations.rb +2 -1
- data/lib/active_record/association_relation.rb +0 -4
- data/lib/active_record/associations.rb +87 -43
- data/lib/active_record/associations/alias_tracker.rb +1 -3
- data/lib/active_record/associations/association.rb +8 -16
- data/lib/active_record/associations/association_scope.rb +5 -16
- data/lib/active_record/associations/belongs_to_association.rb +34 -25
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -1
- data/lib/active_record/associations/builder/association.rb +78 -54
- data/lib/active_record/associations/builder/belongs_to.rb +91 -58
- data/lib/active_record/associations/builder/collection_association.rb +47 -45
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +107 -25
- data/lib/active_record/associations/builder/has_many.rb +2 -2
- data/lib/active_record/associations/builder/has_one.rb +5 -7
- data/lib/active_record/associations/builder/singular_association.rb +6 -7
- data/lib/active_record/associations/collection_association.rb +68 -105
- data/lib/active_record/associations/collection_proxy.rb +12 -15
- data/lib/active_record/associations/has_many_association.rb +11 -9
- data/lib/active_record/associations/has_many_through_association.rb +16 -12
- data/lib/active_record/associations/has_one_association.rb +1 -1
- data/lib/active_record/associations/join_dependency.rb +204 -165
- data/lib/active_record/associations/join_dependency/join_association.rb +43 -101
- data/lib/active_record/associations/join_dependency/join_base.rb +6 -8
- data/lib/active_record/associations/join_dependency/join_part.rb +18 -37
- data/lib/active_record/associations/join_helper.rb +2 -11
- data/lib/active_record/associations/preloader.rb +89 -34
- data/lib/active_record/associations/preloader/association.rb +43 -25
- data/lib/active_record/associations/preloader/collection_association.rb +2 -2
- data/lib/active_record/associations/preloader/has_many_through.rb +1 -1
- data/lib/active_record/associations/preloader/singular_association.rb +3 -3
- data/lib/active_record/associations/preloader/through_association.rb +58 -26
- data/lib/active_record/associations/singular_association.rb +6 -5
- data/lib/active_record/associations/through_association.rb +2 -2
- data/lib/active_record/attribute_assignment.rb +5 -2
- data/lib/active_record/attribute_methods.rb +45 -40
- data/lib/active_record/attribute_methods/before_type_cast.rb +2 -1
- data/lib/active_record/attribute_methods/dirty.rb +8 -22
- data/lib/active_record/attribute_methods/primary_key.rb +1 -7
- data/lib/active_record/attribute_methods/read.rb +55 -28
- data/lib/active_record/attribute_methods/serialization.rb +12 -33
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +1 -13
- data/lib/active_record/attribute_methods/write.rb +37 -12
- data/lib/active_record/autosave_association.rb +207 -207
- data/lib/active_record/base.rb +5 -1
- data/lib/active_record/callbacks.rb +2 -2
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +2 -7
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +11 -22
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +12 -14
- data/lib/active_record/connection_adapters/abstract/quoting.rb +1 -5
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +21 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +84 -0
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +9 -8
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +52 -83
- data/lib/active_record/connection_adapters/abstract/transaction.rb +0 -5
- data/lib/active_record/connection_adapters/abstract_adapter.rb +14 -97
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +58 -60
- data/lib/active_record/connection_adapters/column.rb +1 -35
- data/lib/active_record/connection_adapters/connection_specification.rb +2 -2
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +3 -4
- data/lib/active_record/connection_adapters/mysql_adapter.rb +16 -15
- data/lib/active_record/connection_adapters/postgresql/array_parser.rb +24 -18
- data/lib/active_record/connection_adapters/postgresql/cast.rb +20 -16
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +23 -43
- data/lib/active_record/connection_adapters/postgresql/oid.rb +19 -12
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +28 -23
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +8 -30
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +92 -75
- data/lib/active_record/connection_adapters/schema_cache.rb +8 -29
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +31 -64
- data/lib/active_record/connection_handling.rb +2 -2
- data/lib/active_record/core.rb +22 -43
- data/lib/active_record/counter_cache.rb +7 -7
- data/lib/active_record/enum.rb +100 -0
- data/lib/active_record/errors.rb +10 -5
- data/lib/active_record/fixture_set/file.rb +2 -1
- data/lib/active_record/fixtures.rb +171 -74
- data/lib/active_record/inheritance.rb +16 -22
- data/lib/active_record/integration.rb +52 -1
- data/lib/active_record/locking/optimistic.rb +7 -2
- data/lib/active_record/locking/pessimistic.rb +1 -1
- data/lib/active_record/log_subscriber.rb +5 -12
- data/lib/active_record/migration.rb +62 -46
- data/lib/active_record/migration/command_recorder.rb +7 -13
- data/lib/active_record/model_schema.rb +7 -14
- data/lib/active_record/nested_attributes.rb +10 -8
- data/lib/active_record/no_touching.rb +52 -0
- data/lib/active_record/null_relation.rb +3 -3
- data/lib/active_record/persistence.rb +16 -34
- data/lib/active_record/querying.rb +14 -12
- data/lib/active_record/railtie.rb +0 -50
- data/lib/active_record/railties/databases.rake +12 -15
- data/lib/active_record/readonly_attributes.rb +0 -6
- data/lib/active_record/reflection.rb +189 -75
- data/lib/active_record/relation.rb +69 -94
- data/lib/active_record/relation/batches.rb +57 -23
- data/lib/active_record/relation/calculations.rb +36 -43
- data/lib/active_record/relation/delegation.rb +54 -39
- data/lib/active_record/relation/finder_methods.rb +107 -62
- data/lib/active_record/relation/merger.rb +7 -20
- data/lib/active_record/relation/predicate_builder.rb +57 -38
- data/lib/active_record/relation/predicate_builder/array_handler.rb +29 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +13 -0
- data/lib/active_record/relation/query_methods.rb +110 -98
- data/lib/active_record/relation/spawn_methods.rb +1 -2
- data/lib/active_record/result.rb +45 -6
- data/lib/active_record/runtime_registry.rb +5 -0
- data/lib/active_record/sanitization.rb +6 -8
- data/lib/active_record/schema_dumper.rb +16 -5
- data/lib/active_record/schema_migration.rb +24 -25
- data/lib/active_record/scoping/default.rb +5 -18
- data/lib/active_record/scoping/named.rb +8 -29
- data/lib/active_record/store.rb +56 -28
- data/lib/active_record/tasks/database_tasks.rb +8 -4
- data/lib/active_record/timestamp.rb +4 -4
- data/lib/active_record/transactions.rb +8 -10
- data/lib/active_record/validations/presence.rb +1 -1
- data/lib/active_record/validations/uniqueness.rb +1 -6
- data/lib/active_record/version.rb +1 -1
- data/lib/rails/generators/active_record.rb +2 -8
- data/lib/rails/generators/active_record/migration.rb +18 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +4 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +4 -0
- metadata +32 -45
- data/lib/active_record/associations/has_and_belongs_to_many_association.rb +0 -65
- data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +0 -60
- data/lib/active_record/tasks/firebird_database_tasks.rb +0 -56
- data/lib/active_record/tasks/oracle_database_tasks.rb +0 -45
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +0 -48
- 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 +
|
309
|
-
#
|
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
|
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
|
440
|
-
:name
|
441
|
-
:connection_id
|
442
|
-
:
|
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
|
-
|
14
|
-
|
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
|
17
|
-
sql << " AFTER #{quote_column_name(
|
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)
|
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
|
242
|
-
s =
|
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
|
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
|
-
|
667
|
-
|
668
|
-
|
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
|
-
|
684
|
-
|
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
|
-
|
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
|
725
|
-
[add_column_sql(table_name, :created_at, :datetime
|
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
|
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[
|
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[
|
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
|
-
|
761
|
-
variables[
|
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
|
284
|
+
when /char/i
|
319
285
|
:string
|
320
286
|
when /boolean/i
|
321
287
|
:boolean
|