activerecord 4.2.11.3 → 5.0.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 (229) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1029 -1349
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +6 -7
  5. data/examples/performance.rb +2 -2
  6. data/lib/active_record.rb +7 -3
  7. data/lib/active_record/aggregations.rb +35 -25
  8. data/lib/active_record/association_relation.rb +2 -2
  9. data/lib/active_record/associations.rb +305 -204
  10. data/lib/active_record/associations/alias_tracker.rb +19 -16
  11. data/lib/active_record/associations/association.rb +10 -8
  12. data/lib/active_record/associations/association_scope.rb +73 -102
  13. data/lib/active_record/associations/belongs_to_association.rb +20 -32
  14. data/lib/active_record/associations/builder/association.rb +28 -34
  15. data/lib/active_record/associations/builder/belongs_to.rb +41 -18
  16. data/lib/active_record/associations/builder/collection_association.rb +8 -24
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +11 -11
  18. data/lib/active_record/associations/builder/has_many.rb +4 -4
  19. data/lib/active_record/associations/builder/has_one.rb +10 -5
  20. data/lib/active_record/associations/builder/singular_association.rb +2 -9
  21. data/lib/active_record/associations/collection_association.rb +40 -43
  22. data/lib/active_record/associations/collection_proxy.rb +55 -29
  23. data/lib/active_record/associations/foreign_association.rb +1 -1
  24. data/lib/active_record/associations/has_many_association.rb +20 -71
  25. data/lib/active_record/associations/has_many_through_association.rb +8 -52
  26. data/lib/active_record/associations/has_one_association.rb +12 -5
  27. data/lib/active_record/associations/join_dependency.rb +28 -18
  28. data/lib/active_record/associations/join_dependency/join_association.rb +13 -12
  29. data/lib/active_record/associations/preloader.rb +13 -4
  30. data/lib/active_record/associations/preloader/association.rb +45 -51
  31. data/lib/active_record/associations/preloader/collection_association.rb +0 -6
  32. data/lib/active_record/associations/preloader/has_many_through.rb +1 -1
  33. data/lib/active_record/associations/preloader/has_one.rb +0 -8
  34. data/lib/active_record/associations/preloader/through_association.rb +5 -4
  35. data/lib/active_record/associations/singular_association.rb +6 -0
  36. data/lib/active_record/associations/through_association.rb +11 -3
  37. data/lib/active_record/attribute.rb +61 -17
  38. data/lib/active_record/attribute/user_provided_default.rb +23 -0
  39. data/lib/active_record/attribute_assignment.rb +27 -140
  40. data/lib/active_record/attribute_decorators.rb +6 -5
  41. data/lib/active_record/attribute_methods.rb +79 -26
  42. data/lib/active_record/attribute_methods/before_type_cast.rb +1 -1
  43. data/lib/active_record/attribute_methods/dirty.rb +46 -86
  44. data/lib/active_record/attribute_methods/primary_key.rb +2 -2
  45. data/lib/active_record/attribute_methods/query.rb +2 -2
  46. data/lib/active_record/attribute_methods/read.rb +26 -42
  47. data/lib/active_record/attribute_methods/serialization.rb +13 -16
  48. data/lib/active_record/attribute_methods/time_zone_conversion.rb +42 -9
  49. data/lib/active_record/attribute_methods/write.rb +13 -24
  50. data/lib/active_record/attribute_mutation_tracker.rb +70 -0
  51. data/lib/active_record/attribute_set.rb +30 -3
  52. data/lib/active_record/attribute_set/builder.rb +6 -4
  53. data/lib/active_record/attributes.rb +194 -81
  54. data/lib/active_record/autosave_association.rb +33 -15
  55. data/lib/active_record/base.rb +30 -18
  56. data/lib/active_record/callbacks.rb +36 -40
  57. data/lib/active_record/coders/yaml_column.rb +20 -8
  58. data/lib/active_record/collection_cache_key.rb +31 -0
  59. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +431 -122
  60. data/lib/active_record/connection_adapters/abstract/database_limits.rb +3 -3
  61. data/lib/active_record/connection_adapters/abstract/database_statements.rb +40 -22
  62. data/lib/active_record/connection_adapters/abstract/quoting.rb +62 -8
  63. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +46 -38
  64. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +229 -185
  65. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +52 -13
  66. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +275 -115
  67. data/lib/active_record/connection_adapters/abstract/transaction.rb +32 -33
  68. data/lib/active_record/connection_adapters/abstract_adapter.rb +83 -32
  69. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +384 -221
  70. data/lib/active_record/connection_adapters/column.rb +27 -41
  71. data/lib/active_record/connection_adapters/connection_specification.rb +2 -21
  72. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +22 -0
  73. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +57 -0
  74. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +69 -0
  75. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +59 -0
  76. data/lib/active_record/connection_adapters/mysql2_adapter.rb +22 -101
  77. data/lib/active_record/connection_adapters/postgresql/column.rb +6 -10
  78. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +3 -3
  79. data/lib/active_record/connection_adapters/postgresql/oid.rb +1 -6
  80. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +23 -57
  81. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -2
  82. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +1 -1
  83. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +1 -1
  84. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +7 -22
  85. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +3 -3
  86. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +1 -26
  87. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +2 -2
  88. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +0 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +4 -4
  90. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +50 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +23 -16
  92. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +0 -4
  93. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +2 -2
  94. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +1 -1
  95. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +1 -1
  96. data/lib/active_record/connection_adapters/postgresql/quoting.rb +18 -11
  97. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +29 -10
  98. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -79
  99. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +54 -0
  100. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +174 -128
  101. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +35 -0
  102. data/lib/active_record/connection_adapters/postgresql_adapter.rb +184 -112
  103. data/lib/active_record/connection_adapters/schema_cache.rb +36 -23
  104. data/lib/active_record/connection_adapters/sql_type_metadata.rb +32 -0
  105. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +15 -0
  106. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +134 -110
  107. data/lib/active_record/connection_adapters/statement_pool.rb +28 -11
  108. data/lib/active_record/connection_handling.rb +5 -5
  109. data/lib/active_record/core.rb +72 -104
  110. data/lib/active_record/counter_cache.rb +9 -20
  111. data/lib/active_record/dynamic_matchers.rb +1 -20
  112. data/lib/active_record/enum.rb +110 -76
  113. data/lib/active_record/errors.rb +72 -47
  114. data/lib/active_record/explain_registry.rb +1 -1
  115. data/lib/active_record/explain_subscriber.rb +1 -1
  116. data/lib/active_record/fixture_set/file.rb +19 -4
  117. data/lib/active_record/fixtures.rb +76 -40
  118. data/lib/active_record/gem_version.rb +4 -4
  119. data/lib/active_record/inheritance.rb +27 -40
  120. data/lib/active_record/integration.rb +4 -4
  121. data/lib/active_record/legacy_yaml_adapter.rb +18 -2
  122. data/lib/active_record/locale/en.yml +3 -2
  123. data/lib/active_record/locking/optimistic.rb +10 -14
  124. data/lib/active_record/locking/pessimistic.rb +1 -1
  125. data/lib/active_record/log_subscriber.rb +40 -22
  126. data/lib/active_record/migration.rb +304 -133
  127. data/lib/active_record/migration/command_recorder.rb +59 -18
  128. data/lib/active_record/migration/compatibility.rb +90 -0
  129. data/lib/active_record/model_schema.rb +92 -40
  130. data/lib/active_record/nested_attributes.rb +45 -34
  131. data/lib/active_record/null_relation.rb +15 -7
  132. data/lib/active_record/persistence.rb +112 -72
  133. data/lib/active_record/querying.rb +6 -5
  134. data/lib/active_record/railtie.rb +20 -13
  135. data/lib/active_record/railties/controller_runtime.rb +1 -1
  136. data/lib/active_record/railties/databases.rake +47 -38
  137. data/lib/active_record/readonly_attributes.rb +1 -1
  138. data/lib/active_record/reflection.rb +182 -57
  139. data/lib/active_record/relation.rb +152 -100
  140. data/lib/active_record/relation/batches.rb +133 -33
  141. data/lib/active_record/relation/batches/batch_enumerator.rb +67 -0
  142. data/lib/active_record/relation/calculations.rb +80 -101
  143. data/lib/active_record/relation/delegation.rb +6 -19
  144. data/lib/active_record/relation/finder_methods.rb +58 -46
  145. data/lib/active_record/relation/from_clause.rb +32 -0
  146. data/lib/active_record/relation/merger.rb +13 -42
  147. data/lib/active_record/relation/predicate_builder.rb +99 -105
  148. data/lib/active_record/relation/predicate_builder/array_handler.rb +11 -16
  149. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +78 -0
  150. data/lib/active_record/relation/predicate_builder/base_handler.rb +17 -0
  151. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +17 -0
  152. data/lib/active_record/relation/predicate_builder/class_handler.rb +27 -0
  153. data/lib/active_record/relation/predicate_builder/range_handler.rb +17 -0
  154. data/lib/active_record/relation/query_attribute.rb +19 -0
  155. data/lib/active_record/relation/query_methods.rb +274 -238
  156. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  157. data/lib/active_record/relation/spawn_methods.rb +3 -6
  158. data/lib/active_record/relation/where_clause.rb +173 -0
  159. data/lib/active_record/relation/where_clause_factory.rb +37 -0
  160. data/lib/active_record/result.rb +4 -3
  161. data/lib/active_record/runtime_registry.rb +1 -1
  162. data/lib/active_record/sanitization.rb +94 -65
  163. data/lib/active_record/schema.rb +23 -22
  164. data/lib/active_record/schema_dumper.rb +33 -22
  165. data/lib/active_record/schema_migration.rb +10 -4
  166. data/lib/active_record/scoping.rb +17 -6
  167. data/lib/active_record/scoping/default.rb +19 -6
  168. data/lib/active_record/scoping/named.rb +39 -28
  169. data/lib/active_record/secure_token.rb +38 -0
  170. data/lib/active_record/serialization.rb +2 -4
  171. data/lib/active_record/statement_cache.rb +15 -13
  172. data/lib/active_record/store.rb +8 -3
  173. data/lib/active_record/suppressor.rb +54 -0
  174. data/lib/active_record/table_metadata.rb +64 -0
  175. data/lib/active_record/tasks/database_tasks.rb +30 -40
  176. data/lib/active_record/tasks/mysql_database_tasks.rb +7 -15
  177. data/lib/active_record/tasks/postgresql_database_tasks.rb +11 -2
  178. data/lib/active_record/tasks/sqlite_database_tasks.rb +5 -1
  179. data/lib/active_record/timestamp.rb +16 -9
  180. data/lib/active_record/touch_later.rb +58 -0
  181. data/lib/active_record/transactions.rb +138 -56
  182. data/lib/active_record/type.rb +66 -17
  183. data/lib/active_record/type/adapter_specific_registry.rb +130 -0
  184. data/lib/active_record/type/date.rb +2 -45
  185. data/lib/active_record/type/date_time.rb +2 -49
  186. data/lib/active_record/type/internal/abstract_json.rb +33 -0
  187. data/lib/active_record/type/internal/timezone.rb +15 -0
  188. data/lib/active_record/type/serialized.rb +9 -14
  189. data/lib/active_record/type/time.rb +3 -21
  190. data/lib/active_record/type/type_map.rb +4 -4
  191. data/lib/active_record/type_caster.rb +7 -0
  192. data/lib/active_record/type_caster/connection.rb +29 -0
  193. data/lib/active_record/type_caster/map.rb +19 -0
  194. data/lib/active_record/validations.rb +33 -32
  195. data/lib/active_record/validations/absence.rb +24 -0
  196. data/lib/active_record/validations/associated.rb +10 -3
  197. data/lib/active_record/validations/length.rb +36 -0
  198. data/lib/active_record/validations/presence.rb +12 -12
  199. data/lib/active_record/validations/uniqueness.rb +24 -21
  200. data/lib/rails/generators/active_record/migration.rb +7 -0
  201. data/lib/rails/generators/active_record/migration/migration_generator.rb +7 -4
  202. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +8 -3
  203. data/lib/rails/generators/active_record/migration/templates/migration.rb +4 -1
  204. data/lib/rails/generators/active_record/model/model_generator.rb +21 -15
  205. data/lib/rails/generators/active_record/model/templates/model.rb +3 -0
  206. metadata +50 -35
  207. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -498
  208. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  209. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +0 -11
  210. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  211. data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +0 -13
  212. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
  213. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  214. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  215. data/lib/active_record/type/big_integer.rb +0 -13
  216. data/lib/active_record/type/binary.rb +0 -50
  217. data/lib/active_record/type/boolean.rb +0 -31
  218. data/lib/active_record/type/decimal.rb +0 -64
  219. data/lib/active_record/type/decimal_without_scale.rb +0 -11
  220. data/lib/active_record/type/decorator.rb +0 -14
  221. data/lib/active_record/type/float.rb +0 -19
  222. data/lib/active_record/type/integer.rb +0 -59
  223. data/lib/active_record/type/mutable.rb +0 -16
  224. data/lib/active_record/type/numeric.rb +0 -36
  225. data/lib/active_record/type/string.rb +0 -40
  226. data/lib/active_record/type/text.rb +0 -11
  227. data/lib/active_record/type/time_value.rb +0 -38
  228. data/lib/active_record/type/unsigned_integer.rb +0 -15
  229. data/lib/active_record/type/value.rb +0 -110
@@ -5,6 +5,8 @@ module ActiveRecord
5
5
  class MigrationGenerator < Base # :nodoc:
6
6
  argument :attributes, :type => :array, :default => [], :banner => "field[:type][:index] field[:type][:index]"
7
7
 
8
+ class_option :primary_key_type, type: :string, desc: "The type for primary key"
9
+
8
10
  def create_migration_file
9
11
  set_local_assigns!
10
12
  validate_file_name!
@@ -14,10 +16,9 @@ module ActiveRecord
14
16
  protected
15
17
  attr_reader :migration_action, :join_tables
16
18
 
17
- # sets the default migration template that is being used for the generation of the migration
18
- # depending on the arguments which would be sent out in the command line, the migration template
19
- # and the table name instance variables are setup.
20
-
19
+ # Sets the default migration template that is being used for the generation of the migration.
20
+ # Depending on command line arguments, the migration template and the table name instance
21
+ # variables are set up.
21
22
  def set_local_assigns!
22
23
  @migration_template = "migration.rb"
23
24
  case file_name
@@ -56,6 +57,8 @@ module ActiveRecord
56
57
  attributes.select { |a| !a.reference? && a.has_index? }
57
58
  end
58
59
 
60
+ # A migration file name can only contain underscores (_), lowercase characters,
61
+ # and numbers 0-9. Any other file name will raise an IllegalMigrationNameError.
59
62
  def validate_file_name!
60
63
  unless file_name =~ /^[_a-z0-9]+$/
61
64
  raise IllegalMigrationNameError.new(file_name)
@@ -1,17 +1,22 @@
1
- class <%= migration_class_name %> < ActiveRecord::Migration
1
+ class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
2
2
  def change
3
- create_table :<%= table_name %> do |t|
3
+ create_table :<%= table_name %><%= primary_key_type %> do |t|
4
4
  <% attributes.each do |attribute| -%>
5
5
  <% if attribute.password_digest? -%>
6
6
  t.string :password_digest<%= attribute.inject_options %>
7
+ <% elsif attribute.token? -%>
8
+ t.string :<%= attribute.name %><%= attribute.inject_options %>
7
9
  <% else -%>
8
10
  t.<%= attribute.type %> :<%= attribute.name %><%= attribute.inject_options %>
9
11
  <% end -%>
10
12
  <% end -%>
11
13
  <% if options[:timestamps] %>
12
- t.timestamps null: false
14
+ t.timestamps
13
15
  <% end -%>
14
16
  end
17
+ <% attributes.select(&:token?).each do |attribute| -%>
18
+ add_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>, unique: true
19
+ <% end -%>
15
20
  <% attributes_with_index.each do |attribute| -%>
16
21
  add_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>
17
22
  <% end -%>
@@ -1,9 +1,12 @@
1
- class <%= migration_class_name %> < ActiveRecord::Migration
1
+ class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
2
2
  <%- if migration_action == 'add' -%>
3
3
  def change
4
4
  <% attributes.each do |attribute| -%>
5
5
  <%- if attribute.reference? -%>
6
6
  add_reference :<%= table_name %>, :<%= attribute.name %><%= attribute.inject_options %>
7
+ <%- elsif attribute.token? -%>
8
+ add_column :<%= table_name %>, :<%= attribute.name %>, :string<%= attribute.inject_options %>
9
+ add_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>, unique: true
7
10
  <%- else -%>
8
11
  add_column :<%= table_name %>, :<%= attribute.name %>, :<%= attribute.type %><%= attribute.inject_options %>
9
12
  <%- if attribute.has_index? -%>
@@ -7,14 +7,13 @@ module ActiveRecord
7
7
 
8
8
  check_class_collision
9
9
 
10
- class_option :migration, :type => :boolean
11
- class_option :timestamps, :type => :boolean
12
- class_option :parent, :type => :string, :desc => "The parent class for the generated model"
13
- class_option :indexes, :type => :boolean, :default => true, :desc => "Add indexes for references and belongs_to columns"
10
+ class_option :migration, type: :boolean
11
+ class_option :timestamps, type: :boolean
12
+ class_option :parent, type: :string, desc: "The parent class for the generated model"
13
+ class_option :indexes, type: :boolean, default: true, desc: "Add indexes for references and belongs_to columns"
14
+ class_option :primary_key_type, type: :string, desc: "The type for primary key"
14
15
 
15
-
16
16
  # creates the migration file for the model.
17
-
18
17
  def create_migration_file
19
18
  return unless options[:migration] && options[:parent].nil?
20
19
  attributes.each { |a| a.attr_options.delete(:index) if a.reference? && !a.has_index? } if options[:indexes] == false
@@ -30,23 +29,30 @@ module ActiveRecord
30
29
  template 'module.rb', File.join('app/models', "#{class_path.join('/')}.rb") if behavior == :invoke
31
30
  end
32
31
 
33
- def attributes_with_index
34
- attributes.select { |a| !a.reference? && a.has_index? }
35
- end
36
-
37
- def accessible_attributes
38
- attributes.reject(&:reference?)
39
- end
40
-
41
32
  hook_for :test_framework
42
33
 
43
34
  protected
44
35
 
36
+ def attributes_with_index
37
+ attributes.select { |a| !a.reference? && a.has_index? }
38
+ end
39
+
45
40
  # Used by the migration template to determine the parent name of the model
46
41
  def parent_class_name
47
- options[:parent] || "ActiveRecord::Base"
42
+ options[:parent] || determine_default_parent_class
48
43
  end
49
44
 
45
+ def determine_default_parent_class
46
+ application_record = nil
47
+
48
+ in_root { application_record = File.exist?('app/models/application_record.rb') }
49
+
50
+ if application_record
51
+ "ApplicationRecord"
52
+ else
53
+ "ActiveRecord::Base"
54
+ end
55
+ end
50
56
  end
51
57
  end
52
58
  end
@@ -3,6 +3,9 @@ class <%= class_name %> < <%= parent_class_name.classify %>
3
3
  <% attributes.select(&:reference?).each do |attribute| -%>
4
4
  belongs_to :<%= attribute.name %><%= ', polymorphic: true' if attribute.polymorphic? %><%= ', required: true' if attribute.required? %>
5
5
  <% end -%>
6
+ <% attributes.select(&:token?).each do |attribute| -%>
7
+ has_secure_token<% if attribute.name != "token" %> :<%= attribute.name %><% end %>
8
+ <% end -%>
6
9
  <% if attributes.any?(&:password_digest?) -%>
7
10
  has_secure_password
8
11
  <% end -%>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.11.3
4
+ version: 5.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-15 00:00:00.000000000 Z
11
+ date: 2015-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 4.2.11.3
19
+ version: 5.0.0.beta1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 4.2.11.3
26
+ version: 5.0.0.beta1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activemodel
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 4.2.11.3
33
+ version: 5.0.0.beta1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 4.2.11.3
40
+ version: 5.0.0.beta1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: arel
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '6.0'
47
+ version: '7.0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '6.0'
54
+ version: '7.0'
55
55
  description: Databases on Rails. Build a persistent domain model by mapping database
56
56
  tables to Ruby classes. Strong conventions for associations, validations, aggregations,
57
57
  migrations, and testing come baked-in.
@@ -106,6 +106,7 @@ files:
106
106
  - lib/active_record/associations/singular_association.rb
107
107
  - lib/active_record/associations/through_association.rb
108
108
  - lib/active_record/attribute.rb
109
+ - lib/active_record/attribute/user_provided_default.rb
109
110
  - lib/active_record/attribute_assignment.rb
110
111
  - lib/active_record/attribute_decorators.rb
111
112
  - lib/active_record/attribute_methods.rb
@@ -117,6 +118,7 @@ files:
117
118
  - lib/active_record/attribute_methods/serialization.rb
118
119
  - lib/active_record/attribute_methods/time_zone_conversion.rb
119
120
  - lib/active_record/attribute_methods/write.rb
121
+ - lib/active_record/attribute_mutation_tracker.rb
120
122
  - lib/active_record/attribute_set.rb
121
123
  - lib/active_record/attribute_set/builder.rb
122
124
  - lib/active_record/attributes.rb
@@ -125,6 +127,7 @@ files:
125
127
  - lib/active_record/callbacks.rb
126
128
  - lib/active_record/coders/json.rb
127
129
  - lib/active_record/coders/yaml_column.rb
130
+ - lib/active_record/collection_cache_key.rb
128
131
  - lib/active_record/connection_adapters/abstract/connection_pool.rb
129
132
  - lib/active_record/connection_adapters/abstract/database_limits.rb
130
133
  - lib/active_record/connection_adapters/abstract/database_statements.rb
@@ -140,9 +143,11 @@ files:
140
143
  - lib/active_record/connection_adapters/abstract_mysql_adapter.rb
141
144
  - lib/active_record/connection_adapters/column.rb
142
145
  - lib/active_record/connection_adapters/connection_specification.rb
146
+ - lib/active_record/connection_adapters/determine_if_preparable_visitor.rb
147
+ - lib/active_record/connection_adapters/mysql/schema_creation.rb
148
+ - lib/active_record/connection_adapters/mysql/schema_definitions.rb
149
+ - lib/active_record/connection_adapters/mysql/schema_dumper.rb
143
150
  - lib/active_record/connection_adapters/mysql2_adapter.rb
144
- - lib/active_record/connection_adapters/mysql_adapter.rb
145
- - lib/active_record/connection_adapters/postgresql/array_parser.rb
146
151
  - lib/active_record/connection_adapters/postgresql/column.rb
147
152
  - lib/active_record/connection_adapters/postgresql/database_statements.rb
148
153
  - lib/active_record/connection_adapters/postgresql/oid.rb
@@ -151,22 +156,18 @@ files:
151
156
  - lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb
152
157
  - lib/active_record/connection_adapters/postgresql/oid/bytea.rb
153
158
  - lib/active_record/connection_adapters/postgresql/oid/cidr.rb
154
- - lib/active_record/connection_adapters/postgresql/oid/date.rb
155
159
  - lib/active_record/connection_adapters/postgresql/oid/date_time.rb
156
160
  - lib/active_record/connection_adapters/postgresql/oid/decimal.rb
157
161
  - lib/active_record/connection_adapters/postgresql/oid/enum.rb
158
- - lib/active_record/connection_adapters/postgresql/oid/float.rb
159
162
  - lib/active_record/connection_adapters/postgresql/oid/hstore.rb
160
163
  - lib/active_record/connection_adapters/postgresql/oid/inet.rb
161
- - lib/active_record/connection_adapters/postgresql/oid/infinity.rb
162
- - lib/active_record/connection_adapters/postgresql/oid/integer.rb
163
164
  - lib/active_record/connection_adapters/postgresql/oid/json.rb
164
165
  - lib/active_record/connection_adapters/postgresql/oid/jsonb.rb
165
166
  - lib/active_record/connection_adapters/postgresql/oid/money.rb
166
167
  - lib/active_record/connection_adapters/postgresql/oid/point.rb
168
+ - lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb
167
169
  - lib/active_record/connection_adapters/postgresql/oid/range.rb
168
170
  - lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb
169
- - lib/active_record/connection_adapters/postgresql/oid/time.rb
170
171
  - lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb
171
172
  - lib/active_record/connection_adapters/postgresql/oid/uuid.rb
172
173
  - lib/active_record/connection_adapters/postgresql/oid/vector.rb
@@ -174,10 +175,14 @@ files:
174
175
  - lib/active_record/connection_adapters/postgresql/quoting.rb
175
176
  - lib/active_record/connection_adapters/postgresql/referential_integrity.rb
176
177
  - lib/active_record/connection_adapters/postgresql/schema_definitions.rb
178
+ - lib/active_record/connection_adapters/postgresql/schema_dumper.rb
177
179
  - lib/active_record/connection_adapters/postgresql/schema_statements.rb
180
+ - lib/active_record/connection_adapters/postgresql/type_metadata.rb
178
181
  - lib/active_record/connection_adapters/postgresql/utils.rb
179
182
  - lib/active_record/connection_adapters/postgresql_adapter.rb
180
183
  - lib/active_record/connection_adapters/schema_cache.rb
184
+ - lib/active_record/connection_adapters/sql_type_metadata.rb
185
+ - lib/active_record/connection_adapters/sqlite3/schema_creation.rb
181
186
  - lib/active_record/connection_adapters/sqlite3_adapter.rb
182
187
  - lib/active_record/connection_adapters/statement_pool.rb
183
188
  - lib/active_record/connection_handling.rb
@@ -201,6 +206,7 @@ files:
201
206
  - lib/active_record/log_subscriber.rb
202
207
  - lib/active_record/migration.rb
203
208
  - lib/active_record/migration/command_recorder.rb
209
+ - lib/active_record/migration/compatibility.rb
204
210
  - lib/active_record/migration/join_table.rb
205
211
  - lib/active_record/model_schema.rb
206
212
  - lib/active_record/nested_attributes.rb
@@ -218,15 +224,26 @@ files:
218
224
  - lib/active_record/reflection.rb
219
225
  - lib/active_record/relation.rb
220
226
  - lib/active_record/relation/batches.rb
227
+ - lib/active_record/relation/batches/batch_enumerator.rb
221
228
  - lib/active_record/relation/calculations.rb
222
229
  - lib/active_record/relation/delegation.rb
223
230
  - lib/active_record/relation/finder_methods.rb
231
+ - lib/active_record/relation/from_clause.rb
224
232
  - lib/active_record/relation/merger.rb
225
233
  - lib/active_record/relation/predicate_builder.rb
226
234
  - lib/active_record/relation/predicate_builder/array_handler.rb
235
+ - lib/active_record/relation/predicate_builder/association_query_handler.rb
236
+ - lib/active_record/relation/predicate_builder/base_handler.rb
237
+ - lib/active_record/relation/predicate_builder/basic_object_handler.rb
238
+ - lib/active_record/relation/predicate_builder/class_handler.rb
239
+ - lib/active_record/relation/predicate_builder/range_handler.rb
227
240
  - lib/active_record/relation/predicate_builder/relation_handler.rb
241
+ - lib/active_record/relation/query_attribute.rb
228
242
  - lib/active_record/relation/query_methods.rb
243
+ - lib/active_record/relation/record_fetch_warning.rb
229
244
  - lib/active_record/relation/spawn_methods.rb
245
+ - lib/active_record/relation/where_clause.rb
246
+ - lib/active_record/relation/where_clause_factory.rb
230
247
  - lib/active_record/result.rb
231
248
  - lib/active_record/runtime_registry.rb
232
249
  - lib/active_record/sanitization.rb
@@ -236,41 +253,37 @@ files:
236
253
  - lib/active_record/scoping.rb
237
254
  - lib/active_record/scoping/default.rb
238
255
  - lib/active_record/scoping/named.rb
256
+ - lib/active_record/secure_token.rb
239
257
  - lib/active_record/serialization.rb
240
- - lib/active_record/serializers/xml_serializer.rb
241
258
  - lib/active_record/statement_cache.rb
242
259
  - lib/active_record/store.rb
260
+ - lib/active_record/suppressor.rb
261
+ - lib/active_record/table_metadata.rb
243
262
  - lib/active_record/tasks/database_tasks.rb
244
263
  - lib/active_record/tasks/mysql_database_tasks.rb
245
264
  - lib/active_record/tasks/postgresql_database_tasks.rb
246
265
  - lib/active_record/tasks/sqlite_database_tasks.rb
247
266
  - lib/active_record/timestamp.rb
267
+ - lib/active_record/touch_later.rb
248
268
  - lib/active_record/transactions.rb
249
269
  - lib/active_record/translation.rb
250
270
  - lib/active_record/type.rb
251
- - lib/active_record/type/big_integer.rb
252
- - lib/active_record/type/binary.rb
253
- - lib/active_record/type/boolean.rb
271
+ - lib/active_record/type/adapter_specific_registry.rb
254
272
  - lib/active_record/type/date.rb
255
273
  - lib/active_record/type/date_time.rb
256
- - lib/active_record/type/decimal.rb
257
- - lib/active_record/type/decimal_without_scale.rb
258
- - lib/active_record/type/decorator.rb
259
- - lib/active_record/type/float.rb
260
274
  - lib/active_record/type/hash_lookup_type_map.rb
261
- - lib/active_record/type/integer.rb
262
- - lib/active_record/type/mutable.rb
263
- - lib/active_record/type/numeric.rb
275
+ - lib/active_record/type/internal/abstract_json.rb
276
+ - lib/active_record/type/internal/timezone.rb
264
277
  - lib/active_record/type/serialized.rb
265
- - lib/active_record/type/string.rb
266
- - lib/active_record/type/text.rb
267
278
  - lib/active_record/type/time.rb
268
- - lib/active_record/type/time_value.rb
269
279
  - lib/active_record/type/type_map.rb
270
- - lib/active_record/type/unsigned_integer.rb
271
- - lib/active_record/type/value.rb
280
+ - lib/active_record/type_caster.rb
281
+ - lib/active_record/type_caster/connection.rb
282
+ - lib/active_record/type_caster/map.rb
272
283
  - lib/active_record/validations.rb
284
+ - lib/active_record/validations/absence.rb
273
285
  - lib/active_record/validations/associated.rb
286
+ - lib/active_record/validations/length.rb
274
287
  - lib/active_record/validations/presence.rb
275
288
  - lib/active_record/validations/uniqueness.rb
276
289
  - lib/active_record/version.rb
@@ -296,15 +309,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
296
309
  requirements:
297
310
  - - ">="
298
311
  - !ruby/object:Gem::Version
299
- version: 1.9.3
312
+ version: 2.2.2
300
313
  required_rubygems_version: !ruby/object:Gem::Requirement
301
314
  requirements:
302
- - - ">="
315
+ - - ">"
303
316
  - !ruby/object:Gem::Version
304
- version: '0'
317
+ version: 1.3.1
305
318
  requirements: []
306
- rubygems_version: 3.0.3
319
+ rubyforge_project:
320
+ rubygems_version: 2.5.1
307
321
  signing_key:
308
322
  specification_version: 4
309
323
  summary: Object-relational mapper framework (part of Rails).
310
324
  test_files: []
325
+ has_rdoc:
@@ -1,498 +0,0 @@
1
- require 'active_record/connection_adapters/abstract_mysql_adapter'
2
- require 'active_record/connection_adapters/statement_pool'
3
- require 'active_support/core_ext/hash/keys'
4
-
5
- gem 'mysql', '~> 2.9'
6
- require 'mysql'
7
-
8
- class Mysql
9
- class Time
10
- def to_date
11
- Date.new(year, month, day)
12
- end
13
- end
14
- class Stmt; include Enumerable end
15
- class Result; include Enumerable end
16
- end
17
-
18
- module ActiveRecord
19
- module ConnectionHandling # :nodoc:
20
- # Establishes a connection to the database that's used by all Active Record objects.
21
- def mysql_connection(config)
22
- config = config.symbolize_keys
23
- host = config[:host]
24
- port = config[:port]
25
- socket = config[:socket]
26
- username = config[:username] ? config[:username].to_s : 'root'
27
- password = config[:password].to_s
28
- database = config[:database]
29
-
30
- mysql = Mysql.init
31
- mysql.ssl_set(config[:sslkey], config[:sslcert], config[:sslca], config[:sslcapath], config[:sslcipher]) if config[:sslca] || config[:sslkey]
32
-
33
- default_flags = Mysql.const_defined?(:CLIENT_MULTI_RESULTS) ? Mysql::CLIENT_MULTI_RESULTS : 0
34
- default_flags |= Mysql::CLIENT_FOUND_ROWS if Mysql.const_defined?(:CLIENT_FOUND_ROWS)
35
- options = [host, username, password, database, port, socket, default_flags]
36
- ConnectionAdapters::MysqlAdapter.new(mysql, logger, options, config)
37
- rescue Mysql::Error => error
38
- if error.message.include?("Unknown database")
39
- raise ActiveRecord::NoDatabaseError.new(error.message, error)
40
- else
41
- raise
42
- end
43
- end
44
- end
45
-
46
- module ConnectionAdapters
47
- # The MySQL adapter will work with both Ruby/MySQL, which is a Ruby-based MySQL adapter that comes bundled with Active Record, and with
48
- # the faster C-based MySQL/Ruby adapter (available both as a gem and from http://www.tmtm.org/en/mysql/ruby/).
49
- #
50
- # Options:
51
- #
52
- # * <tt>:host</tt> - Defaults to "localhost".
53
- # * <tt>:port</tt> - Defaults to 3306.
54
- # * <tt>:socket</tt> - Defaults to "/tmp/mysql.sock".
55
- # * <tt>:username</tt> - Defaults to "root"
56
- # * <tt>:password</tt> - Defaults to nothing.
57
- # * <tt>:database</tt> - The name of the database. No default, must be provided.
58
- # * <tt>:encoding</tt> - (Optional) Sets the client encoding by executing "SET NAMES <encoding>" after connection.
59
- # * <tt>:reconnect</tt> - Defaults to false (See MySQL documentation: http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html).
60
- # * <tt>:strict</tt> - Defaults to true. Enable STRICT_ALL_TABLES. (See MySQL documentation: http://dev.mysql.com/doc/refman/5.0/en/sql-mode.html)
61
- # * <tt>:variables</tt> - (Optional) A hash session variables to send as <tt>SET @@SESSION.key = value</tt> on each database connection. Use the value +:default+ to set a variable to its DEFAULT value. (See MySQL documentation: http://dev.mysql.com/doc/refman/5.0/en/set-statement.html).
62
- # * <tt>:sslca</tt> - Necessary to use MySQL with an SSL connection.
63
- # * <tt>:sslkey</tt> - Necessary to use MySQL with an SSL connection.
64
- # * <tt>:sslcert</tt> - Necessary to use MySQL with an SSL connection.
65
- # * <tt>:sslcapath</tt> - Necessary to use MySQL with an SSL connection.
66
- # * <tt>:sslcipher</tt> - Necessary to use MySQL with an SSL connection.
67
- #
68
- class MysqlAdapter < AbstractMysqlAdapter
69
- ADAPTER_NAME = 'MySQL'.freeze
70
-
71
- class StatementPool < ConnectionAdapters::StatementPool
72
- def initialize(connection, max = 1000)
73
- super
74
- @cache = Hash.new { |h,pid| h[pid] = {} }
75
- end
76
-
77
- def each(&block); cache.each(&block); end
78
- def key?(key); cache.key?(key); end
79
- def [](key); cache[key]; end
80
- def length; cache.length; end
81
- def delete(key); cache.delete(key); end
82
-
83
- def []=(sql, key)
84
- while @max <= cache.size
85
- cache.shift.last[:stmt].close
86
- end
87
- cache[sql] = key
88
- end
89
-
90
- def clear
91
- cache.each_value do |hash|
92
- hash[:stmt].close
93
- end
94
- cache.clear
95
- end
96
-
97
- private
98
- def cache
99
- @cache[Process.pid]
100
- end
101
- end
102
-
103
- def initialize(connection, logger, connection_options, config)
104
- super
105
- @statements = StatementPool.new(@connection,
106
- self.class.type_cast_config_to_integer(config.fetch(:statement_limit) { 1000 }))
107
- @client_encoding = nil
108
- connect
109
- end
110
-
111
- # Returns true, since this connection adapter supports prepared statement
112
- # caching.
113
- def supports_statement_cache?
114
- true
115
- end
116
-
117
- # HELPER METHODS ===========================================
118
-
119
- def each_hash(result) # :nodoc:
120
- if block_given?
121
- result.each_hash do |row|
122
- row.symbolize_keys!
123
- yield row
124
- end
125
- else
126
- to_enum(:each_hash, result)
127
- end
128
- end
129
-
130
- def error_number(exception) # :nodoc:
131
- exception.errno if exception.respond_to?(:errno)
132
- end
133
-
134
- # QUOTING ==================================================
135
-
136
- def quote_string(string) #:nodoc:
137
- @connection.quote(string)
138
- end
139
-
140
- #--
141
- # CONNECTION MANAGEMENT ====================================
142
- #++
143
-
144
- def active?
145
- if @connection.respond_to?(:stat)
146
- @connection.stat
147
- else
148
- @connection.query 'select 1'
149
- end
150
-
151
- # mysql-ruby doesn't raise an exception when stat fails.
152
- if @connection.respond_to?(:errno)
153
- @connection.errno.zero?
154
- else
155
- true
156
- end
157
- rescue Mysql::Error
158
- false
159
- end
160
-
161
- def reconnect!
162
- super
163
- disconnect!
164
- connect
165
- end
166
-
167
- # Disconnects from the database if already connected. Otherwise, this
168
- # method does nothing.
169
- def disconnect!
170
- super
171
- @connection.close rescue nil
172
- end
173
-
174
- def reset!
175
- if @connection.respond_to?(:change_user)
176
- # See http://bugs.mysql.com/bug.php?id=33540 -- the workaround way to
177
- # reset the connection is to change the user to the same user.
178
- @connection.change_user(@config[:username], @config[:password], @config[:database])
179
- configure_connection
180
- end
181
- end
182
-
183
- #--
184
- # DATABASE STATEMENTS ======================================
185
- #++
186
-
187
- def select_rows(sql, name = nil, binds = [])
188
- @connection.query_with_result = true
189
- rows = exec_query(sql, name, binds).rows
190
- @connection.more_results && @connection.next_result # invoking stored procedures with CLIENT_MULTI_RESULTS requires this to tidy up else connection will be dropped
191
- rows
192
- end
193
-
194
- # Clears the prepared statements cache.
195
- def clear_cache!
196
- super
197
- @statements.clear
198
- end
199
-
200
- # Taken from here:
201
- # https://github.com/tmtm/ruby-mysql/blob/master/lib/mysql/charset.rb
202
- # Author: TOMITA Masahiro <tommy@tmtm.org>
203
- ENCODINGS = {
204
- "armscii8" => nil,
205
- "ascii" => Encoding::US_ASCII,
206
- "big5" => Encoding::Big5,
207
- "binary" => Encoding::ASCII_8BIT,
208
- "cp1250" => Encoding::Windows_1250,
209
- "cp1251" => Encoding::Windows_1251,
210
- "cp1256" => Encoding::Windows_1256,
211
- "cp1257" => Encoding::Windows_1257,
212
- "cp850" => Encoding::CP850,
213
- "cp852" => Encoding::CP852,
214
- "cp866" => Encoding::IBM866,
215
- "cp932" => Encoding::Windows_31J,
216
- "dec8" => nil,
217
- "eucjpms" => Encoding::EucJP_ms,
218
- "euckr" => Encoding::EUC_KR,
219
- "gb2312" => Encoding::EUC_CN,
220
- "gbk" => Encoding::GBK,
221
- "geostd8" => nil,
222
- "greek" => Encoding::ISO_8859_7,
223
- "hebrew" => Encoding::ISO_8859_8,
224
- "hp8" => nil,
225
- "keybcs2" => nil,
226
- "koi8r" => Encoding::KOI8_R,
227
- "koi8u" => Encoding::KOI8_U,
228
- "latin1" => Encoding::ISO_8859_1,
229
- "latin2" => Encoding::ISO_8859_2,
230
- "latin5" => Encoding::ISO_8859_9,
231
- "latin7" => Encoding::ISO_8859_13,
232
- "macce" => Encoding::MacCentEuro,
233
- "macroman" => Encoding::MacRoman,
234
- "sjis" => Encoding::SHIFT_JIS,
235
- "swe7" => nil,
236
- "tis620" => Encoding::TIS_620,
237
- "ucs2" => Encoding::UTF_16BE,
238
- "ujis" => Encoding::EucJP_ms,
239
- "utf8" => Encoding::UTF_8,
240
- "utf8mb4" => Encoding::UTF_8,
241
- }
242
-
243
- # Get the client encoding for this database
244
- def client_encoding
245
- return @client_encoding if @client_encoding
246
-
247
- result = exec_query(
248
- "select @@character_set_client",
249
- 'SCHEMA')
250
- @client_encoding = ENCODINGS[result.rows.last.last]
251
- end
252
-
253
- def exec_query(sql, name = 'SQL', binds = [])
254
- if without_prepared_statement?(binds)
255
- result_set, affected_rows = exec_without_stmt(sql, name)
256
- else
257
- result_set, affected_rows = exec_stmt(sql, name, binds)
258
- end
259
-
260
- yield affected_rows if block_given?
261
-
262
- result_set
263
- end
264
-
265
- def last_inserted_id(result)
266
- @connection.insert_id
267
- end
268
-
269
- module Fields # :nodoc:
270
- class DateTime < Type::DateTime # :nodoc:
271
- def cast_value(value)
272
- if Mysql::Time === value
273
- new_time(
274
- value.year,
275
- value.month,
276
- value.day,
277
- value.hour,
278
- value.minute,
279
- value.second,
280
- value.second_part)
281
- else
282
- super
283
- end
284
- end
285
-
286
- def has_precision?
287
- precision || 0
288
- end
289
- end
290
-
291
- class Time < Type::Time # :nodoc:
292
- def cast_value(value)
293
- if Mysql::Time === value
294
- new_time(
295
- 2000,
296
- 01,
297
- 01,
298
- value.hour,
299
- value.minute,
300
- value.second,
301
- value.second_part)
302
- else
303
- super
304
- end
305
- end
306
- end
307
-
308
- class << self
309
- TYPES = Type::HashLookupTypeMap.new # :nodoc:
310
-
311
- delegate :register_type, :alias_type, to: :TYPES
312
-
313
- def find_type(field)
314
- if field.type == Mysql::Field::TYPE_TINY && field.length > 1
315
- TYPES.lookup(Mysql::Field::TYPE_LONG)
316
- else
317
- TYPES.lookup(field.type)
318
- end
319
- end
320
- end
321
-
322
- register_type Mysql::Field::TYPE_TINY, Type::Boolean.new
323
- register_type Mysql::Field::TYPE_LONG, Type::Integer.new
324
- alias_type Mysql::Field::TYPE_LONGLONG, Mysql::Field::TYPE_LONG
325
- alias_type Mysql::Field::TYPE_NEWDECIMAL, Mysql::Field::TYPE_LONG
326
-
327
- register_type Mysql::Field::TYPE_DATE, Type::Date.new
328
- register_type Mysql::Field::TYPE_DATETIME, Fields::DateTime.new
329
- register_type Mysql::Field::TYPE_TIME, Fields::Time.new
330
- register_type Mysql::Field::TYPE_FLOAT, Type::Float.new
331
- end
332
-
333
- def initialize_type_map(m) # :nodoc:
334
- super
335
- m.register_type %r(time)i, Fields::Time.new
336
- m.register_type(%r(datetime)i) do |sql_type|
337
- precision = extract_precision(sql_type)
338
- Fields::DateTime.new(precision: precision)
339
- end
340
- end
341
-
342
- def exec_without_stmt(sql, name = 'SQL') # :nodoc:
343
- # Some queries, like SHOW CREATE TABLE don't work through the prepared
344
- # statement API. For those queries, we need to use this method. :'(
345
- log(sql, name) do
346
- result = @connection.query(sql)
347
- affected_rows = @connection.affected_rows
348
-
349
- if result
350
- types = {}
351
- fields = []
352
- result.fetch_fields.each { |field|
353
- field_name = field.name
354
- fields << field_name
355
-
356
- if field.decimals > 0
357
- types[field_name] = Type::Decimal.new
358
- else
359
- types[field_name] = Fields.find_type field
360
- end
361
- }
362
-
363
- result_set = ActiveRecord::Result.new(fields, result.to_a, types)
364
- result.free
365
- else
366
- result_set = ActiveRecord::Result.new([], [])
367
- end
368
-
369
- [result_set, affected_rows]
370
- end
371
- end
372
-
373
- def execute_and_free(sql, name = nil) # :nodoc:
374
- result = execute(sql, name)
375
- ret = yield result
376
- result.free
377
- ret
378
- end
379
-
380
- def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc:
381
- super sql, name
382
- id_value || @connection.insert_id
383
- end
384
- alias :create :insert_sql
385
-
386
- def exec_delete(sql, name, binds) # :nodoc:
387
- affected_rows = 0
388
-
389
- exec_query(sql, name, binds) do |n|
390
- affected_rows = n
391
- end
392
-
393
- affected_rows
394
- end
395
- alias :exec_update :exec_delete
396
-
397
- def begin_db_transaction #:nodoc:
398
- exec_query "BEGIN"
399
- end
400
-
401
- private
402
-
403
- def exec_stmt(sql, name, binds)
404
- cache = {}
405
- type_casted_binds = binds.map { |col, val|
406
- [col, type_cast(val, col)]
407
- }
408
-
409
- log(sql, name, type_casted_binds) do
410
- if binds.empty?
411
- stmt = @connection.prepare(sql)
412
- else
413
- cache = @statements[sql] ||= {
414
- :stmt => @connection.prepare(sql)
415
- }
416
- stmt = cache[:stmt]
417
- end
418
-
419
- begin
420
- stmt.execute(*type_casted_binds.map { |_, val| val })
421
- rescue Mysql::Error => e
422
- # Older versions of MySQL leave the prepared statement in a bad
423
- # place when an error occurs. To support older MySQL versions, we
424
- # need to close the statement and delete the statement from the
425
- # cache.
426
- stmt.close
427
- @statements.delete sql
428
- raise e
429
- end
430
-
431
- cols = nil
432
- if metadata = stmt.result_metadata
433
- cols = cache[:cols] ||= metadata.fetch_fields.map { |field|
434
- field.name
435
- }
436
- metadata.free
437
- end
438
-
439
- result_set = ActiveRecord::Result.new(cols, stmt.to_a) if cols
440
- affected_rows = stmt.affected_rows
441
-
442
- stmt.free_result
443
- stmt.close if binds.empty?
444
-
445
- [result_set, affected_rows]
446
- end
447
- end
448
-
449
- def connect
450
- encoding = @config[:encoding]
451
- if encoding
452
- @connection.options(Mysql::SET_CHARSET_NAME, encoding) rescue nil
453
- end
454
-
455
- if @config[:sslca] || @config[:sslkey]
456
- @connection.ssl_set(@config[:sslkey], @config[:sslcert], @config[:sslca], @config[:sslcapath], @config[:sslcipher])
457
- end
458
-
459
- @connection.options(Mysql::OPT_CONNECT_TIMEOUT, @config[:connect_timeout]) if @config[:connect_timeout]
460
- @connection.options(Mysql::OPT_READ_TIMEOUT, @config[:read_timeout]) if @config[:read_timeout]
461
- @connection.options(Mysql::OPT_WRITE_TIMEOUT, @config[:write_timeout]) if @config[:write_timeout]
462
-
463
- @connection.real_connect(*@connection_options)
464
-
465
- # reconnect must be set after real_connect is called, because real_connect sets it to false internally
466
- @connection.reconnect = !!@config[:reconnect] if @connection.respond_to?(:reconnect=)
467
-
468
- configure_connection
469
- end
470
-
471
- # Many Rails applications monkey-patch a replacement of the configure_connection method
472
- # and don't call 'super', so leave this here even though it looks superfluous.
473
- def configure_connection
474
- super
475
- end
476
-
477
- def select(sql, name = nil, binds = [])
478
- @connection.query_with_result = true
479
- rows = super
480
- @connection.more_results && @connection.next_result # invoking stored procedures with CLIENT_MULTI_RESULTS requires this to tidy up else connection will be dropped
481
- rows
482
- end
483
-
484
- # Returns the full version of the connected MySQL server.
485
- def full_version
486
- @full_version ||= @connection.server_info
487
- end
488
-
489
- def set_field_encoding field_name
490
- field_name.force_encoding(client_encoding)
491
- if internal_enc = Encoding.default_internal
492
- field_name = field_name.encode!(internal_enc)
493
- end
494
- field_name
495
- end
496
- end
497
- end
498
- end