activerecord 4.1.8 → 4.2.11.3

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 (186) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1165 -1591
  3. data/README.rdoc +15 -10
  4. data/lib/active_record/aggregations.rb +15 -8
  5. data/lib/active_record/association_relation.rb +13 -0
  6. data/lib/active_record/associations/alias_tracker.rb +3 -12
  7. data/lib/active_record/associations/association.rb +16 -4
  8. data/lib/active_record/associations/association_scope.rb +84 -43
  9. data/lib/active_record/associations/belongs_to_association.rb +28 -10
  10. data/lib/active_record/associations/builder/association.rb +16 -5
  11. data/lib/active_record/associations/builder/belongs_to.rb +7 -29
  12. data/lib/active_record/associations/builder/collection_association.rb +5 -1
  13. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +9 -14
  14. data/lib/active_record/associations/builder/has_many.rb +1 -1
  15. data/lib/active_record/associations/builder/has_one.rb +2 -2
  16. data/lib/active_record/associations/builder/singular_association.rb +8 -1
  17. data/lib/active_record/associations/collection_association.rb +87 -30
  18. data/lib/active_record/associations/collection_proxy.rb +33 -35
  19. data/lib/active_record/associations/foreign_association.rb +11 -0
  20. data/lib/active_record/associations/has_many_association.rb +83 -22
  21. data/lib/active_record/associations/has_many_through_association.rb +49 -26
  22. data/lib/active_record/associations/has_one_association.rb +1 -1
  23. data/lib/active_record/associations/join_dependency/join_association.rb +25 -15
  24. data/lib/active_record/associations/join_dependency/join_part.rb +0 -1
  25. data/lib/active_record/associations/join_dependency.rb +26 -12
  26. data/lib/active_record/associations/preloader/association.rb +14 -10
  27. data/lib/active_record/associations/preloader/through_association.rb +4 -3
  28. data/lib/active_record/associations/preloader.rb +37 -26
  29. data/lib/active_record/associations/singular_association.rb +17 -2
  30. data/lib/active_record/associations/through_association.rb +16 -12
  31. data/lib/active_record/associations.rb +158 -49
  32. data/lib/active_record/attribute.rb +163 -0
  33. data/lib/active_record/attribute_assignment.rb +20 -12
  34. data/lib/active_record/attribute_decorators.rb +66 -0
  35. data/lib/active_record/attribute_methods/before_type_cast.rb +7 -2
  36. data/lib/active_record/attribute_methods/dirty.rb +107 -43
  37. data/lib/active_record/attribute_methods/primary_key.rb +7 -8
  38. data/lib/active_record/attribute_methods/query.rb +1 -1
  39. data/lib/active_record/attribute_methods/read.rb +22 -59
  40. data/lib/active_record/attribute_methods/serialization.rb +16 -150
  41. data/lib/active_record/attribute_methods/time_zone_conversion.rb +38 -28
  42. data/lib/active_record/attribute_methods/write.rb +9 -24
  43. data/lib/active_record/attribute_methods.rb +57 -95
  44. data/lib/active_record/attribute_set/builder.rb +106 -0
  45. data/lib/active_record/attribute_set.rb +81 -0
  46. data/lib/active_record/attributes.rb +147 -0
  47. data/lib/active_record/autosave_association.rb +30 -12
  48. data/lib/active_record/base.rb +13 -24
  49. data/lib/active_record/callbacks.rb +6 -6
  50. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +85 -53
  51. data/lib/active_record/connection_adapters/abstract/database_statements.rb +52 -50
  52. data/lib/active_record/connection_adapters/abstract/query_cache.rb +1 -1
  53. data/lib/active_record/connection_adapters/abstract/quoting.rb +60 -60
  54. data/lib/active_record/connection_adapters/abstract/savepoints.rb +1 -1
  55. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +39 -4
  56. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +139 -57
  57. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +14 -34
  58. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +271 -74
  59. data/lib/active_record/connection_adapters/abstract/transaction.rb +125 -118
  60. data/lib/active_record/connection_adapters/abstract_adapter.rb +177 -60
  61. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +295 -141
  62. data/lib/active_record/connection_adapters/column.rb +29 -240
  63. data/lib/active_record/connection_adapters/connection_specification.rb +15 -24
  64. data/lib/active_record/connection_adapters/mysql2_adapter.rb +17 -33
  65. data/lib/active_record/connection_adapters/mysql_adapter.rb +68 -145
  66. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +15 -27
  67. data/lib/active_record/connection_adapters/postgresql/column.rb +20 -0
  68. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +40 -25
  69. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +100 -0
  70. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +52 -0
  71. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +13 -0
  72. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +15 -0
  73. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +46 -0
  74. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +11 -0
  75. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +36 -0
  76. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +13 -0
  77. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +19 -0
  78. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +21 -0
  79. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +59 -0
  80. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +13 -0
  81. data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +13 -0
  82. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +11 -0
  83. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +35 -0
  84. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +23 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +43 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +43 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +79 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +19 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +11 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +109 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +21 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +26 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +28 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid.rb +29 -385
  95. data/lib/active_record/connection_adapters/postgresql/quoting.rb +46 -136
  96. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +4 -4
  97. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +152 -0
  98. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +134 -43
  99. data/lib/active_record/connection_adapters/postgresql/utils.rb +77 -0
  100. data/lib/active_record/connection_adapters/postgresql_adapter.rb +224 -477
  101. data/lib/active_record/connection_adapters/schema_cache.rb +14 -28
  102. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +61 -75
  103. data/lib/active_record/connection_handling.rb +1 -1
  104. data/lib/active_record/core.rb +163 -40
  105. data/lib/active_record/counter_cache.rb +60 -6
  106. data/lib/active_record/enum.rb +10 -12
  107. data/lib/active_record/errors.rb +53 -30
  108. data/lib/active_record/explain.rb +1 -1
  109. data/lib/active_record/explain_subscriber.rb +1 -1
  110. data/lib/active_record/fixtures.rb +62 -74
  111. data/lib/active_record/gem_version.rb +4 -4
  112. data/lib/active_record/inheritance.rb +35 -10
  113. data/lib/active_record/integration.rb +4 -4
  114. data/lib/active_record/legacy_yaml_adapter.rb +30 -0
  115. data/lib/active_record/locking/optimistic.rb +46 -26
  116. data/lib/active_record/migration/command_recorder.rb +19 -2
  117. data/lib/active_record/migration/join_table.rb +1 -1
  118. data/lib/active_record/migration.rb +79 -47
  119. data/lib/active_record/model_schema.rb +52 -58
  120. data/lib/active_record/nested_attributes.rb +18 -8
  121. data/lib/active_record/no_touching.rb +1 -1
  122. data/lib/active_record/persistence.rb +48 -27
  123. data/lib/active_record/query_cache.rb +3 -3
  124. data/lib/active_record/querying.rb +10 -7
  125. data/lib/active_record/railtie.rb +19 -14
  126. data/lib/active_record/railties/databases.rake +55 -56
  127. data/lib/active_record/readonly_attributes.rb +0 -1
  128. data/lib/active_record/reflection.rb +281 -117
  129. data/lib/active_record/relation/batches.rb +0 -1
  130. data/lib/active_record/relation/calculations.rb +41 -37
  131. data/lib/active_record/relation/delegation.rb +1 -1
  132. data/lib/active_record/relation/finder_methods.rb +71 -48
  133. data/lib/active_record/relation/merger.rb +39 -29
  134. data/lib/active_record/relation/predicate_builder/array_handler.rb +32 -13
  135. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  136. data/lib/active_record/relation/predicate_builder.rb +42 -12
  137. data/lib/active_record/relation/query_methods.rb +130 -73
  138. data/lib/active_record/relation/spawn_methods.rb +10 -3
  139. data/lib/active_record/relation.rb +57 -25
  140. data/lib/active_record/result.rb +18 -7
  141. data/lib/active_record/sanitization.rb +12 -2
  142. data/lib/active_record/schema.rb +0 -1
  143. data/lib/active_record/schema_dumper.rb +59 -28
  144. data/lib/active_record/schema_migration.rb +5 -4
  145. data/lib/active_record/scoping/default.rb +6 -4
  146. data/lib/active_record/scoping/named.rb +4 -0
  147. data/lib/active_record/serializers/xml_serializer.rb +3 -7
  148. data/lib/active_record/statement_cache.rb +95 -10
  149. data/lib/active_record/store.rb +5 -5
  150. data/lib/active_record/tasks/database_tasks.rb +61 -8
  151. data/lib/active_record/tasks/mysql_database_tasks.rb +32 -17
  152. data/lib/active_record/tasks/postgresql_database_tasks.rb +20 -9
  153. data/lib/active_record/timestamp.rb +9 -7
  154. data/lib/active_record/transactions.rb +54 -28
  155. data/lib/active_record/type/big_integer.rb +13 -0
  156. data/lib/active_record/type/binary.rb +50 -0
  157. data/lib/active_record/type/boolean.rb +31 -0
  158. data/lib/active_record/type/date.rb +50 -0
  159. data/lib/active_record/type/date_time.rb +54 -0
  160. data/lib/active_record/type/decimal.rb +64 -0
  161. data/lib/active_record/type/decimal_without_scale.rb +11 -0
  162. data/lib/active_record/type/decorator.rb +14 -0
  163. data/lib/active_record/type/float.rb +19 -0
  164. data/lib/active_record/type/hash_lookup_type_map.rb +23 -0
  165. data/lib/active_record/type/integer.rb +59 -0
  166. data/lib/active_record/type/mutable.rb +16 -0
  167. data/lib/active_record/type/numeric.rb +36 -0
  168. data/lib/active_record/type/serialized.rb +62 -0
  169. data/lib/active_record/type/string.rb +40 -0
  170. data/lib/active_record/type/text.rb +11 -0
  171. data/lib/active_record/type/time.rb +26 -0
  172. data/lib/active_record/type/time_value.rb +38 -0
  173. data/lib/active_record/type/type_map.rb +64 -0
  174. data/lib/active_record/type/unsigned_integer.rb +15 -0
  175. data/lib/active_record/type/value.rb +110 -0
  176. data/lib/active_record/type.rb +23 -0
  177. data/lib/active_record/validations/associated.rb +5 -3
  178. data/lib/active_record/validations/presence.rb +5 -3
  179. data/lib/active_record/validations/uniqueness.rb +24 -20
  180. data/lib/active_record/validations.rb +25 -19
  181. data/lib/active_record.rb +5 -0
  182. data/lib/rails/generators/active_record/migration/migration_generator.rb +8 -4
  183. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +1 -1
  184. data/lib/rails/generators/active_record/model/templates/model.rb +1 -1
  185. metadata +66 -11
  186. data/lib/active_record/connection_adapters/postgresql/cast.rb +0 -168
@@ -1,4 +1,3 @@
1
-
2
1
  module ActiveRecord
3
2
  module ConnectionAdapters
4
3
  class SchemaCache
@@ -12,15 +11,15 @@ module ActiveRecord
12
11
  @columns_hash = {}
13
12
  @primary_keys = {}
14
13
  @tables = {}
15
- prepare_default_proc
16
14
  end
17
15
 
18
16
  def primary_keys(table_name)
19
- @primary_keys[table_name]
17
+ @primary_keys[table_name] ||= table_exists?(table_name) ? connection.primary_key(table_name) : nil
20
18
  end
21
19
 
22
20
  # A cached lookup for table existence.
23
21
  def table_exists?(name)
22
+ prepare_tables if @tables.empty?
24
23
  return @tables[name] if @tables.key? name
25
24
 
26
25
  @tables[name] = connection.table_exists?(name)
@@ -29,9 +28,9 @@ module ActiveRecord
29
28
  # Add internal cache for table with +table_name+.
30
29
  def add(table_name)
31
30
  if table_exists?(table_name)
32
- @primary_keys[table_name]
33
- @columns[table_name]
34
- @columns_hash[table_name]
31
+ primary_keys(table_name)
32
+ columns(table_name)
33
+ columns_hash(table_name)
35
34
  end
36
35
  end
37
36
 
@@ -40,14 +39,16 @@ module ActiveRecord
40
39
  end
41
40
 
42
41
  # Get the columns for a table
43
- def columns(table)
44
- @columns[table]
42
+ def columns(table_name)
43
+ @columns[table_name] ||= connection.columns(table_name)
45
44
  end
46
45
 
47
46
  # Get the columns for a table as a hash, key is the column name
48
47
  # value is the column object.
49
- def columns_hash(table)
50
- @columns_hash[table]
48
+ def columns_hash(table_name)
49
+ @columns_hash[table_name] ||= Hash[columns(table_name).map { |col|
50
+ [col.name, col]
51
+ }]
51
52
  end
52
53
 
53
54
  # Clears out internal caches
@@ -76,33 +77,18 @@ module ActiveRecord
76
77
  def marshal_dump
77
78
  # if we get current version during initialization, it happens stack over flow.
78
79
  @version = ActiveRecord::Migrator.current_version
79
- [@version] + [@columns, @columns_hash, @primary_keys, @tables].map { |val|
80
- Hash[val]
81
- }
80
+ [@version, @columns, @columns_hash, @primary_keys, @tables]
82
81
  end
83
82
 
84
83
  def marshal_load(array)
85
84
  @version, @columns, @columns_hash, @primary_keys, @tables = array
86
- prepare_default_proc
87
85
  end
88
86
 
89
87
  private
90
88
 
91
- def prepare_default_proc
92
- @columns.default_proc = Proc.new do |h, table_name|
93
- h[table_name] = connection.columns(table_name)
94
- end
95
-
96
- @columns_hash.default_proc = Proc.new do |h, table_name|
97
- h[table_name] = Hash[columns(table_name).map { |col|
98
- [col.name, col]
99
- }]
89
+ def prepare_tables
90
+ connection.tables.each { |table| @tables[table] = true }
100
91
  end
101
-
102
- @primary_keys.default_proc = Proc.new do |h, table_name|
103
- h[table_name] = table_exists?(table_name) ? connection.primary_key(table_name) : nil
104
- end
105
- end
106
92
  end
107
93
  end
108
94
  end
@@ -14,9 +14,9 @@ module ActiveRecord
14
14
  raise ArgumentError, "No database file specified. Missing argument: database"
15
15
  end
16
16
 
17
- # Allow database path relative to Rails.root, but only if
18
- # the database path is not the special path that tells
19
- # Sqlite to build a database only in memory.
17
+ # Allow database path relative to Rails.root, but only if the database
18
+ # path is not the special path that tells sqlite to build a database only
19
+ # in memory.
20
20
  if ':memory:' != config[:database]
21
21
  config[:database] = File.expand_path(config[:database], Rails.root) if defined?(Rails.root)
22
22
  dirname = File.dirname(config[:database])
@@ -30,25 +30,23 @@ module ActiveRecord
30
30
 
31
31
  db.busy_timeout(ConnectionAdapters::SQLite3Adapter.type_cast_config_to_integer(config[:timeout])) if config[:timeout]
32
32
 
33
- ConnectionAdapters::SQLite3Adapter.new(db, logger, config)
33
+ ConnectionAdapters::SQLite3Adapter.new(db, logger, nil, config)
34
34
  rescue Errno::ENOENT => error
35
35
  if error.message.include?("No such file or directory")
36
- raise ActiveRecord::NoDatabaseError.new(error.message)
36
+ raise ActiveRecord::NoDatabaseError.new(error.message, error)
37
37
  else
38
- raise error
38
+ raise
39
39
  end
40
40
  end
41
41
  end
42
42
 
43
43
  module ConnectionAdapters #:nodoc:
44
- class SQLite3Column < Column #:nodoc:
45
- class << self
46
- def binary_to_string(value)
47
- if value.encoding != Encoding::ASCII_8BIT
48
- value = value.force_encoding(Encoding::ASCII_8BIT)
49
- end
50
- value
44
+ class SQLite3Binary < Type::Binary # :nodoc:
45
+ def cast_value(value)
46
+ if value.encoding != Encoding::ASCII_8BIT
47
+ value = value.force_encoding(Encoding::ASCII_8BIT)
51
48
  end
49
+ value
52
50
  end
53
51
  end
54
52
 
@@ -59,35 +57,23 @@ module ActiveRecord
59
57
  #
60
58
  # * <tt>:database</tt> - Path to the database file.
61
59
  class SQLite3Adapter < AbstractAdapter
60
+ ADAPTER_NAME = 'SQLite'.freeze
62
61
  include Savepoints
63
62
 
64
63
  NATIVE_DATABASE_TYPES = {
65
64
  primary_key: 'INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL',
66
- string: { name: "varchar", limit: 255 },
65
+ string: { name: "varchar" },
67
66
  text: { name: "text" },
68
67
  integer: { name: "integer" },
69
68
  float: { name: "float" },
70
69
  decimal: { name: "decimal" },
71
70
  datetime: { name: "datetime" },
72
- timestamp: { name: "datetime" },
73
71
  time: { name: "time" },
74
72
  date: { name: "date" },
75
73
  binary: { name: "blob" },
76
74
  boolean: { name: "boolean" }
77
75
  }
78
76
 
79
- class Version
80
- include Comparable
81
-
82
- def initialize(version_string)
83
- @version = version_string.split('.').map { |v| v.to_i }
84
- end
85
-
86
- def <=>(version_string)
87
- @version <=> version_string.split('.').map { |v| v.to_i }
88
- end
89
- end
90
-
91
77
  class StatementPool < ConnectionAdapters::StatementPool
92
78
  def initialize(connection, max)
93
79
  super
@@ -107,7 +93,7 @@ module ActiveRecord
107
93
  end
108
94
 
109
95
  def clear
110
- cache.values.each do |hash|
96
+ cache.each_value do |hash|
111
97
  dealloc hash[:stmt]
112
98
  end
113
99
  cache.clear
@@ -123,11 +109,7 @@ module ActiveRecord
123
109
  end
124
110
  end
125
111
 
126
- class BindSubstitution < Arel::Visitors::SQLite # :nodoc:
127
- include Arel::Visitors::BindVisitor
128
- end
129
-
130
- def initialize(connection, logger, config)
112
+ def initialize(connection, logger, connection_options, config)
131
113
  super(connection, logger)
132
114
 
133
115
  @active = nil
@@ -135,18 +117,15 @@ module ActiveRecord
135
117
  self.class.type_cast_config_to_integer(config.fetch(:statement_limit) { 1000 }))
136
118
  @config = config
137
119
 
120
+ @visitor = Arel::Visitors::SQLite.new self
121
+
138
122
  if self.class.type_cast_config_to_boolean(config.fetch(:prepared_statements) { true })
139
123
  @prepared_statements = true
140
- @visitor = Arel::Visitors::SQLite.new self
141
124
  else
142
- @visitor = unprepared_visitor
125
+ @prepared_statements = false
143
126
  end
144
127
  end
145
128
 
146
- def adapter_name #:nodoc:
147
- 'SQLite'
148
- end
149
-
150
129
  def supports_ddl_transactions?
151
130
  true
152
131
  end
@@ -178,7 +157,7 @@ module ActiveRecord
178
157
  true
179
158
  end
180
159
 
181
- def supports_add_column?
160
+ def supports_views?
182
161
  true
183
162
  end
184
163
 
@@ -225,10 +204,25 @@ module ActiveRecord
225
204
 
226
205
  # QUOTING ==================================================
227
206
 
228
- def quote(value, column = nil)
229
- if value.kind_of?(String) && column && column.type == :binary
230
- s = value.unpack("H*")[0]
231
- "x'#{s}'"
207
+ def _quote(value) # :nodoc:
208
+ case value
209
+ when Type::Binary::Data
210
+ "x'#{value.hex}'"
211
+ else
212
+ super
213
+ end
214
+ end
215
+
216
+ def _type_cast(value) # :nodoc:
217
+ case value
218
+ when BigDecimal
219
+ value.to_f
220
+ when String
221
+ if value.encoding == Encoding::ASCII_8BIT
222
+ super(value.encode(Encoding::UTF_8))
223
+ else
224
+ super
225
+ end
232
226
  else
233
227
  super
234
228
  end
@@ -256,24 +250,13 @@ module ActiveRecord
256
250
  end
257
251
  end
258
252
 
259
- def type_cast(value, column) # :nodoc:
260
- return value.to_f if BigDecimal === value
261
- return super unless String === value
262
- return super unless column && value
263
-
264
- value = super
265
- if column.type == :string && value.encoding == Encoding::ASCII_8BIT
266
- logger.error "Binary data inserted for `string` type on column `#{column.name}`" if logger
267
- value = value.encode Encoding::UTF_8
268
- end
269
- value
270
- end
271
-
253
+ #--
272
254
  # DATABASE STATEMENTS ======================================
255
+ #++
273
256
 
274
257
  def explain(arel, binds = [])
275
258
  sql = "EXPLAIN QUERY PLAN #{to_sql(arel, binds)}"
276
- ExplainPrettyPrinter.new.pp(exec_query(sql, 'EXPLAIN', binds))
259
+ ExplainPrettyPrinter.new.pp(exec_query(sql, 'EXPLAIN', []))
277
260
  end
278
261
 
279
262
  class ExplainPrettyPrinter
@@ -362,7 +345,7 @@ module ActiveRecord
362
345
  log('commit transaction',nil) { @connection.commit }
363
346
  end
364
347
 
365
- def rollback_db_transaction #:nodoc:
348
+ def exec_rollback_db_transaction #:nodoc:
366
349
  log('rollback transaction',nil) { @connection.rollback }
367
350
  end
368
351
 
@@ -372,7 +355,7 @@ module ActiveRecord
372
355
  sql = <<-SQL
373
356
  SELECT name
374
357
  FROM sqlite_master
375
- WHERE type = 'table' AND NOT name = 'sqlite_sequence'
358
+ WHERE (type = 'table' OR type = 'view') AND NOT name = 'sqlite_sequence'
376
359
  SQL
377
360
  sql << " AND name = #{quote_table_name(table_name)}" if table_name
378
361
 
@@ -380,12 +363,14 @@ module ActiveRecord
380
363
  row['name']
381
364
  end
382
365
  end
366
+ alias data_sources tables
383
367
 
384
368
  def table_exists?(table_name)
385
369
  table_name && tables(nil, table_name).any?
386
370
  end
371
+ alias data_source_exists? table_exists?
387
372
 
388
- # Returns an array of +SQLite3Column+ objects for the table specified by +table_name+.
373
+ # Returns an array of +Column+ objects for the table specified by +table_name+.
389
374
  def columns(table_name) #:nodoc:
390
375
  table_structure(table_name).map do |field|
391
376
  case field["dflt_value"]
@@ -397,7 +382,9 @@ module ActiveRecord
397
382
  field["dflt_value"] = $1.gsub('""', '"')
398
383
  end
399
384
 
400
- SQLite3Column.new(field['name'], field['dflt_value'], field['type'], field['notnull'].to_i == 0)
385
+ sql_type = field['type']
386
+ cast_type = lookup_cast_type(sql_type)
387
+ new_column(field['name'], field['dflt_value'], cast_type, sql_type, field['notnull'].to_i == 0)
401
388
  end
402
389
  end
403
390
 
@@ -427,10 +414,9 @@ module ActiveRecord
427
414
  end
428
415
 
429
416
  def primary_key(table_name) #:nodoc:
430
- column = table_structure(table_name).find { |field|
431
- field['pk'] == 1
432
- }
433
- column && column['name']
417
+ pks = table_structure(table_name).select { |f| f['pk'] > 0 }
418
+ return nil unless pks.count == 1
419
+ pks[0]['name']
434
420
  end
435
421
 
436
422
  def remove_index!(table_name, index_name) #:nodoc:
@@ -448,12 +434,12 @@ module ActiveRecord
448
434
 
449
435
  # See: http://www.sqlite.org/lang_altertable.html
450
436
  # SQLite has an additional restriction on the ALTER TABLE statement
451
- def valid_alter_table_options( type, options)
437
+ def valid_alter_table_type?(type)
452
438
  type.to_sym != :primary_key
453
439
  end
454
440
 
455
441
  def add_column(table_name, column_name, type, options = {}) #:nodoc:
456
- if supports_add_column? && valid_alter_table_options( type, options )
442
+ if valid_alter_table_type?(type)
457
443
  super(table_name, column_name, type, options)
458
444
  else
459
445
  alter_table(table_name) do |definition|
@@ -498,16 +484,16 @@ module ActiveRecord
498
484
  end
499
485
 
500
486
  def rename_column(table_name, column_name, new_column_name) #:nodoc:
501
- unless columns(table_name).detect{|c| c.name == column_name.to_s }
502
- raise ActiveRecord::ActiveRecordError, "Missing column #{table_name}.#{column_name}"
503
- end
504
- alter_table(table_name, :rename => {column_name.to_s => new_column_name.to_s})
505
- rename_column_indexes(table_name, column_name, new_column_name)
487
+ column = column_for(table_name, column_name)
488
+ alter_table(table_name, rename: {column.name => new_column_name.to_s})
489
+ rename_column_indexes(table_name, column.name, new_column_name)
506
490
  end
507
491
 
508
492
  protected
509
- def select(sql, name = nil, binds = []) #:nodoc:
510
- exec_query(sql, name, binds)
493
+
494
+ def initialize_type_map(m)
495
+ super
496
+ m.register_type(/binary/i, SQLite3Binary.new)
511
497
  end
512
498
 
513
499
  def table_structure(table_name)
@@ -1,6 +1,6 @@
1
1
  module ActiveRecord
2
2
  module ConnectionHandling
3
- RAILS_ENV = -> { (Rails.env if defined?(Rails)) || ENV["RAILS_ENV"] || ENV["RACK_ENV"] }
3
+ RAILS_ENV = -> { (Rails.env if defined?(Rails.env)) || ENV["RAILS_ENV"] || ENV["RACK_ENV"] }
4
4
  DEFAULT_ENV = -> { RAILS_ENV.call || "default_env" }
5
5
 
6
6
  # Establishes the connection to the database. Accepts a hash as input where