activerecord 3.2.22.5 → 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 (236) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1632 -609
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +37 -41
  5. data/examples/performance.rb +31 -19
  6. data/examples/simple.rb +4 -4
  7. data/lib/active_record/aggregations.rb +56 -42
  8. data/lib/active_record/association_relation.rb +35 -0
  9. data/lib/active_record/associations/alias_tracker.rb +47 -36
  10. data/lib/active_record/associations/association.rb +73 -55
  11. data/lib/active_record/associations/association_scope.rb +143 -82
  12. data/lib/active_record/associations/belongs_to_association.rb +65 -25
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +7 -2
  14. data/lib/active_record/associations/builder/association.rb +125 -31
  15. data/lib/active_record/associations/builder/belongs_to.rb +89 -61
  16. data/lib/active_record/associations/builder/collection_association.rb +69 -49
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +113 -42
  18. data/lib/active_record/associations/builder/has_many.rb +8 -64
  19. data/lib/active_record/associations/builder/has_one.rb +12 -51
  20. data/lib/active_record/associations/builder/singular_association.rb +23 -17
  21. data/lib/active_record/associations/collection_association.rb +251 -177
  22. data/lib/active_record/associations/collection_proxy.rb +963 -63
  23. data/lib/active_record/associations/foreign_association.rb +11 -0
  24. data/lib/active_record/associations/has_many_association.rb +113 -22
  25. data/lib/active_record/associations/has_many_through_association.rb +99 -39
  26. data/lib/active_record/associations/has_one_association.rb +43 -20
  27. data/lib/active_record/associations/has_one_through_association.rb +1 -1
  28. data/lib/active_record/associations/join_dependency/join_association.rb +76 -107
  29. data/lib/active_record/associations/join_dependency/join_base.rb +7 -9
  30. data/lib/active_record/associations/join_dependency/join_part.rb +30 -37
  31. data/lib/active_record/associations/join_dependency.rb +230 -156
  32. data/lib/active_record/associations/preloader/association.rb +96 -55
  33. data/lib/active_record/associations/preloader/collection_association.rb +3 -3
  34. data/lib/active_record/associations/preloader/has_many_through.rb +7 -3
  35. data/lib/active_record/associations/preloader/has_one.rb +1 -1
  36. data/lib/active_record/associations/preloader/singular_association.rb +3 -3
  37. data/lib/active_record/associations/preloader/through_association.rb +62 -33
  38. data/lib/active_record/associations/preloader.rb +101 -79
  39. data/lib/active_record/associations/singular_association.rb +29 -13
  40. data/lib/active_record/associations/through_association.rb +30 -16
  41. data/lib/active_record/associations.rb +463 -345
  42. data/lib/active_record/attribute.rb +163 -0
  43. data/lib/active_record/attribute_assignment.rb +142 -151
  44. data/lib/active_record/attribute_decorators.rb +66 -0
  45. data/lib/active_record/attribute_methods/before_type_cast.rb +52 -7
  46. data/lib/active_record/attribute_methods/dirty.rb +137 -57
  47. data/lib/active_record/attribute_methods/primary_key.rb +50 -36
  48. data/lib/active_record/attribute_methods/query.rb +5 -4
  49. data/lib/active_record/attribute_methods/read.rb +73 -106
  50. data/lib/active_record/attribute_methods/serialization.rb +44 -94
  51. data/lib/active_record/attribute_methods/time_zone_conversion.rb +49 -45
  52. data/lib/active_record/attribute_methods/write.rb +57 -44
  53. data/lib/active_record/attribute_methods.rb +301 -141
  54. data/lib/active_record/attribute_set/builder.rb +106 -0
  55. data/lib/active_record/attribute_set.rb +81 -0
  56. data/lib/active_record/attributes.rb +147 -0
  57. data/lib/active_record/autosave_association.rb +246 -217
  58. data/lib/active_record/base.rb +70 -474
  59. data/lib/active_record/callbacks.rb +66 -28
  60. data/lib/active_record/coders/json.rb +13 -0
  61. data/lib/active_record/coders/yaml_column.rb +18 -21
  62. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +396 -219
  63. data/lib/active_record/connection_adapters/abstract/database_limits.rb +9 -0
  64. data/lib/active_record/connection_adapters/abstract/database_statements.rb +167 -164
  65. data/lib/active_record/connection_adapters/abstract/query_cache.rb +29 -24
  66. data/lib/active_record/connection_adapters/abstract/quoting.rb +74 -55
  67. data/lib/active_record/connection_adapters/abstract/savepoints.rb +21 -0
  68. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +125 -0
  69. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +261 -169
  70. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +50 -0
  71. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +707 -259
  72. data/lib/active_record/connection_adapters/abstract/transaction.rb +215 -0
  73. data/lib/active_record/connection_adapters/abstract_adapter.rb +298 -89
  74. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +466 -196
  75. data/lib/active_record/connection_adapters/column.rb +31 -245
  76. data/lib/active_record/connection_adapters/connection_specification.rb +275 -0
  77. data/lib/active_record/connection_adapters/mysql2_adapter.rb +45 -57
  78. data/lib/active_record/connection_adapters/mysql_adapter.rb +180 -123
  79. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +93 -0
  80. data/lib/active_record/connection_adapters/postgresql/column.rb +20 -0
  81. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +232 -0
  82. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +100 -0
  83. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +52 -0
  84. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +13 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +15 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +46 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +11 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +36 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +13 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +19 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +21 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +59 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +13 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +13 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +11 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +35 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +23 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +43 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +43 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +79 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +19 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +11 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +109 -0
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +21 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +26 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +28 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +36 -0
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +108 -0
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +30 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +152 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +596 -0
  112. data/lib/active_record/connection_adapters/postgresql/utils.rb +77 -0
  113. data/lib/active_record/connection_adapters/postgresql_adapter.rb +430 -999
  114. data/lib/active_record/connection_adapters/schema_cache.rb +52 -27
  115. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +579 -22
  116. data/lib/active_record/connection_handling.rb +132 -0
  117. data/lib/active_record/core.rb +579 -0
  118. data/lib/active_record/counter_cache.rb +157 -105
  119. data/lib/active_record/dynamic_matchers.rb +119 -63
  120. data/lib/active_record/enum.rb +197 -0
  121. data/lib/active_record/errors.rb +94 -36
  122. data/lib/active_record/explain.rb +15 -63
  123. data/lib/active_record/explain_registry.rb +30 -0
  124. data/lib/active_record/explain_subscriber.rb +9 -5
  125. data/lib/active_record/fixture_set/file.rb +56 -0
  126. data/lib/active_record/fixtures.rb +302 -215
  127. data/lib/active_record/gem_version.rb +15 -0
  128. data/lib/active_record/inheritance.rb +143 -70
  129. data/lib/active_record/integration.rb +65 -12
  130. data/lib/active_record/legacy_yaml_adapter.rb +30 -0
  131. data/lib/active_record/locale/en.yml +8 -1
  132. data/lib/active_record/locking/optimistic.rb +73 -52
  133. data/lib/active_record/locking/pessimistic.rb +5 -5
  134. data/lib/active_record/log_subscriber.rb +24 -21
  135. data/lib/active_record/migration/command_recorder.rb +124 -32
  136. data/lib/active_record/migration/join_table.rb +15 -0
  137. data/lib/active_record/migration.rb +511 -213
  138. data/lib/active_record/model_schema.rb +91 -117
  139. data/lib/active_record/nested_attributes.rb +184 -130
  140. data/lib/active_record/no_touching.rb +52 -0
  141. data/lib/active_record/null_relation.rb +81 -0
  142. data/lib/active_record/persistence.rb +276 -117
  143. data/lib/active_record/query_cache.rb +19 -37
  144. data/lib/active_record/querying.rb +28 -18
  145. data/lib/active_record/railtie.rb +73 -40
  146. data/lib/active_record/railties/console_sandbox.rb +3 -4
  147. data/lib/active_record/railties/controller_runtime.rb +4 -3
  148. data/lib/active_record/railties/databases.rake +141 -416
  149. data/lib/active_record/railties/jdbcmysql_error.rb +1 -1
  150. data/lib/active_record/readonly_attributes.rb +1 -4
  151. data/lib/active_record/reflection.rb +513 -154
  152. data/lib/active_record/relation/batches.rb +91 -43
  153. data/lib/active_record/relation/calculations.rb +199 -161
  154. data/lib/active_record/relation/delegation.rb +116 -25
  155. data/lib/active_record/relation/finder_methods.rb +362 -248
  156. data/lib/active_record/relation/merger.rb +193 -0
  157. data/lib/active_record/relation/predicate_builder/array_handler.rb +48 -0
  158. data/lib/active_record/relation/predicate_builder/relation_handler.rb +13 -0
  159. data/lib/active_record/relation/predicate_builder.rb +135 -43
  160. data/lib/active_record/relation/query_methods.rb +928 -167
  161. data/lib/active_record/relation/spawn_methods.rb +48 -149
  162. data/lib/active_record/relation.rb +352 -207
  163. data/lib/active_record/result.rb +101 -10
  164. data/lib/active_record/runtime_registry.rb +22 -0
  165. data/lib/active_record/sanitization.rb +56 -59
  166. data/lib/active_record/schema.rb +19 -13
  167. data/lib/active_record/schema_dumper.rb +106 -63
  168. data/lib/active_record/schema_migration.rb +53 -0
  169. data/lib/active_record/scoping/default.rb +50 -57
  170. data/lib/active_record/scoping/named.rb +73 -109
  171. data/lib/active_record/scoping.rb +58 -123
  172. data/lib/active_record/serialization.rb +6 -2
  173. data/lib/active_record/serializers/xml_serializer.rb +12 -22
  174. data/lib/active_record/statement_cache.rb +111 -0
  175. data/lib/active_record/store.rb +168 -15
  176. data/lib/active_record/tasks/database_tasks.rb +299 -0
  177. data/lib/active_record/tasks/mysql_database_tasks.rb +159 -0
  178. data/lib/active_record/tasks/postgresql_database_tasks.rb +101 -0
  179. data/lib/active_record/tasks/sqlite_database_tasks.rb +55 -0
  180. data/lib/active_record/timestamp.rb +23 -16
  181. data/lib/active_record/transactions.rb +125 -79
  182. data/lib/active_record/type/big_integer.rb +13 -0
  183. data/lib/active_record/type/binary.rb +50 -0
  184. data/lib/active_record/type/boolean.rb +31 -0
  185. data/lib/active_record/type/date.rb +50 -0
  186. data/lib/active_record/type/date_time.rb +54 -0
  187. data/lib/active_record/type/decimal.rb +64 -0
  188. data/lib/active_record/type/decimal_without_scale.rb +11 -0
  189. data/lib/active_record/type/decorator.rb +14 -0
  190. data/lib/active_record/type/float.rb +19 -0
  191. data/lib/active_record/type/hash_lookup_type_map.rb +23 -0
  192. data/lib/active_record/type/integer.rb +59 -0
  193. data/lib/active_record/type/mutable.rb +16 -0
  194. data/lib/active_record/type/numeric.rb +36 -0
  195. data/lib/active_record/type/serialized.rb +62 -0
  196. data/lib/active_record/type/string.rb +40 -0
  197. data/lib/active_record/type/text.rb +11 -0
  198. data/lib/active_record/type/time.rb +26 -0
  199. data/lib/active_record/type/time_value.rb +38 -0
  200. data/lib/active_record/type/type_map.rb +64 -0
  201. data/lib/active_record/type/unsigned_integer.rb +15 -0
  202. data/lib/active_record/type/value.rb +110 -0
  203. data/lib/active_record/type.rb +23 -0
  204. data/lib/active_record/validations/associated.rb +24 -16
  205. data/lib/active_record/validations/presence.rb +67 -0
  206. data/lib/active_record/validations/uniqueness.rb +123 -64
  207. data/lib/active_record/validations.rb +36 -29
  208. data/lib/active_record/version.rb +5 -7
  209. data/lib/active_record.rb +66 -46
  210. data/lib/rails/generators/active_record/migration/migration_generator.rb +53 -8
  211. data/lib/rails/generators/active_record/{model/templates/migration.rb → migration/templates/create_table_migration.rb} +5 -1
  212. data/lib/rails/generators/active_record/migration/templates/migration.rb +20 -15
  213. data/lib/rails/generators/active_record/migration.rb +11 -8
  214. data/lib/rails/generators/active_record/model/model_generator.rb +9 -4
  215. data/lib/rails/generators/active_record/model/templates/model.rb +4 -6
  216. data/lib/rails/generators/active_record/model/templates/module.rb +1 -1
  217. data/lib/rails/generators/active_record.rb +3 -11
  218. metadata +101 -45
  219. data/examples/associations.png +0 -0
  220. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +0 -63
  221. data/lib/active_record/associations/join_helper.rb +0 -55
  222. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +0 -60
  223. data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +0 -32
  224. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +0 -191
  225. data/lib/active_record/connection_adapters/sqlite_adapter.rb +0 -583
  226. data/lib/active_record/dynamic_finder_match.rb +0 -68
  227. data/lib/active_record/dynamic_scope_match.rb +0 -23
  228. data/lib/active_record/fixtures/file.rb +0 -65
  229. data/lib/active_record/identity_map.rb +0 -162
  230. data/lib/active_record/observer.rb +0 -121
  231. data/lib/active_record/session_store.rb +0 -360
  232. data/lib/active_record/test_case.rb +0 -73
  233. data/lib/rails/generators/active_record/observer/observer_generator.rb +0 -15
  234. data/lib/rails/generators/active_record/observer/templates/observer.rb +0 -4
  235. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +0 -25
  236. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +0 -12
@@ -1,207 +1,59 @@
1
- require 'active_support/core_ext/object/inclusion'
2
1
  require 'active_record'
3
2
 
4
3
  db_namespace = namespace :db do
5
- def database_url_config
6
- @database_url_config ||=
7
- ActiveRecord::Base::ConnectionSpecification::Resolver.new(ENV["DATABASE_URL"], {}).spec.config.stringify_keys
8
- end
9
-
10
- def current_config(options = {})
11
- options = { :env => Rails.env }.merge! options
12
-
13
- if options[:config]
14
- @current_config = options[:config]
15
- else
16
- @current_config ||= if ENV['DATABASE_URL']
17
- database_url_config
18
- else
19
- ActiveRecord::Base.configurations[options[:env]]
20
- end
21
- end
22
- end
23
-
24
4
  task :load_config do
25
- ActiveRecord::Base.configurations = Rails.application.config.database_configuration
26
- ActiveRecord::Migrator.migrations_paths = Rails.application.paths['db/migrate'].to_a
27
-
28
- if defined?(ENGINE_PATH) && engine = Rails::Engine.find(ENGINE_PATH)
29
- if engine.paths['db/migrate'].existent
30
- ActiveRecord::Migrator.migrations_paths += engine.paths['db/migrate'].to_a
31
- end
32
- end
5
+ ActiveRecord::Base.configurations = ActiveRecord::Tasks::DatabaseTasks.database_configuration || {}
6
+ ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
33
7
  end
34
8
 
35
9
  namespace :create do
36
- # desc 'Create all the local databases defined in config/database.yml'
37
10
  task :all => :load_config do
38
- ActiveRecord::Base.configurations.each_value do |config|
39
- # Skip entries that don't have a database key, such as the first entry here:
40
- #
41
- # defaults: &defaults
42
- # adapter: mysql
43
- # username: root
44
- # password:
45
- # host: localhost
46
- #
47
- # development:
48
- # database: blog_development
49
- # *defaults
50
- next unless config['database']
51
- # Only connect to local databases
52
- local_database?(config) { create_database(config) }
53
- end
11
+ ActiveRecord::Tasks::DatabaseTasks.create_all
54
12
  end
55
13
  end
56
14
 
57
- desc 'Create the database from DATABASE_URL or config/database.yml for the current Rails.env (use db:create:all to create all dbs in the config)'
58
- task :create => [:load_config, :rails_env] do
59
- if ENV['DATABASE_URL']
60
- create_database(database_url_config)
61
- else
62
- configs_for_environment.each { |config| create_database(config) }
63
- ActiveRecord::Base.establish_connection(configs_for_environment.first)
64
- end
15
+ desc 'Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to create all databases in the config). Without RAILS_ENV it defaults to creating the development and test databases.'
16
+ task :create => [:load_config] do
17
+ ActiveRecord::Tasks::DatabaseTasks.create_current
65
18
  end
66
19
 
67
- # If neither encoding nor collation is specified, use the utf-8 defaults.
68
- def mysql_creation_options(config)
69
- default_charset = ENV['CHARSET'] || 'utf8'
70
- default_collation = ENV['COLLATION'] || 'utf8_unicode_ci'
71
-
72
- Hash.new.tap do |options|
73
- options[:charset] = config['encoding'] if config.include? 'encoding'
74
- options[:collation] = config['collation'] if config.include? 'collation'
75
-
76
- # Set default charset only when collation isn't set.
77
- options[:charset] ||= default_charset unless options[:collation]
78
-
79
- # Set default collation only when charset is also default.
80
- options[:collation] ||= default_collation if options[:charset] == default_charset
20
+ namespace :drop do
21
+ task :all => :load_config do
22
+ ActiveRecord::Tasks::DatabaseTasks.drop_all
81
23
  end
82
24
  end
83
25
 
84
- def create_database(config)
85
- begin
86
- if config['adapter'] =~ /sqlite/
87
- if File.exist?(config['database'])
88
- $stderr.puts "#{config['database']} already exists"
89
- else
90
- begin
91
- # Create the SQLite database
92
- ActiveRecord::Base.establish_connection(config)
93
- ActiveRecord::Base.connection
94
- rescue Exception => e
95
- $stderr.puts e, *(e.backtrace)
96
- $stderr.puts "Couldn't create database for #{config.inspect}"
97
- end
98
- end
99
- return # Skip the else clause of begin/rescue
100
- else
101
- ActiveRecord::Base.establish_connection(config)
102
- ActiveRecord::Base.connection
103
- end
104
- rescue
105
- case config['adapter']
106
- when /mysql/
107
- if config['adapter'] =~ /jdbc/
108
- #FIXME After Jdbcmysql gives this class
109
- require 'active_record/railties/jdbcmysql_error'
110
- error_class = ArJdbcMySQL::Error
111
- else
112
- error_class = config['adapter'] =~ /mysql2/ ? Mysql2::Error : Mysql::Error
113
- end
114
- access_denied_error = 1045
115
-
116
- create_options = mysql_creation_options(config)
117
-
118
- begin
119
- ActiveRecord::Base.establish_connection(config.merge('database' => nil))
120
- ActiveRecord::Base.connection.create_database(config['database'], create_options)
121
- ActiveRecord::Base.establish_connection(config)
122
- rescue error_class => sqlerr
123
- if sqlerr.errno == access_denied_error
124
- print "#{sqlerr.error}. \nPlease provide the root password for your mysql installation\n>"
125
- root_password = $stdin.gets.strip
126
- grant_statement = "GRANT ALL PRIVILEGES ON #{config['database']}.* " \
127
- "TO '#{config['username']}'@'localhost' " \
128
- "IDENTIFIED BY '#{config['password']}' WITH GRANT OPTION;"
129
- ActiveRecord::Base.establish_connection(config.merge(
130
- 'database' => nil, 'username' => 'root', 'password' => root_password))
131
- ActiveRecord::Base.connection.create_database(config['database'], mysql_creation_options(config))
132
- ActiveRecord::Base.connection.execute grant_statement
133
- ActiveRecord::Base.establish_connection(config)
134
- else
135
- $stderr.puts sqlerr.error
136
- $stderr.puts "Couldn't create database for #{config.inspect}, charset: #{create_options[:charset]}, collation: #{create_options[:collation]}"
137
- $stderr.puts "(if you set the charset manually, make sure you have a matching collation)" if config['encoding']
138
- end
139
- end
140
- when /postgresql/
141
- @encoding = config['encoding'] || ENV['CHARSET'] || 'utf8'
142
- begin
143
- ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
144
- ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => @encoding))
145
- ActiveRecord::Base.establish_connection(config)
146
- rescue Exception => e
147
- $stderr.puts e, *(e.backtrace)
148
- $stderr.puts "Couldn't create database for #{config.inspect}"
149
- end
150
- end
151
- else
152
- # Bug with 1.9.2 Calling return within begin still executes else
153
- $stderr.puts "#{config['database']} already exists" unless config['adapter'] =~ /sqlite/
154
- end
26
+ desc 'Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to dropping the development and test databases.'
27
+ task :drop => [:load_config] do
28
+ ActiveRecord::Tasks::DatabaseTasks.drop_current
155
29
  end
156
30
 
157
- namespace :drop do
158
- # desc 'Drops all the local databases defined in config/database.yml'
31
+ namespace :purge do
159
32
  task :all => :load_config do
160
- ActiveRecord::Base.configurations.each_value do |config|
161
- # Skip entries that don't have a database key
162
- next unless config['database']
163
- begin
164
- # Only connect to local databases
165
- local_database?(config) { drop_database(config) }
166
- rescue Exception => e
167
- $stderr.puts "Couldn't drop #{config['database']} : #{e.inspect}"
168
- end
169
- end
33
+ ActiveRecord::Tasks::DatabaseTasks.purge_all
170
34
  end
171
35
  end
172
36
 
173
- desc 'Drops the database using DATABASE_URL or the current Rails.env (use db:drop:all to drop all databases)'
174
- task :drop => [:load_config, :rails_env] do
175
- if ENV['DATABASE_URL']
176
- drop_database_and_rescue(database_url_config)
177
- else
178
- configs_for_environment.each { |config| drop_database_and_rescue(config) }
179
- end
37
+ # desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
38
+ task :purge => [:load_config] do
39
+ ActiveRecord::Tasks::DatabaseTasks.purge_current
180
40
  end
181
41
 
182
- def local_database?(config, &block)
183
- if config['host'].in?(['127.0.0.1', 'localhost']) || config['host'].blank?
184
- yield
185
- else
186
- $stderr.puts "This task only modifies local databases. #{config['database']} is on a remote host."
187
- end
188
- end
189
-
190
- desc "Migrate the database (options: VERSION=x, VERBOSE=false)."
42
+ desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)."
191
43
  task :migrate => [:environment, :load_config] do
192
- ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
193
- ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths, ENV["VERSION"] ? ENV["VERSION"].to_i : nil) do |migration|
194
- ENV["SCOPE"].blank? || (ENV["SCOPE"] == migration.scope)
195
- end
44
+ ActiveRecord::Tasks::DatabaseTasks.migrate
196
45
  db_namespace['_dump'].invoke
197
46
  end
198
47
 
48
+ # IMPORTANT: This task won't dump the schema if ActiveRecord::Base.dump_schema_after_migration is set to false
199
49
  task :_dump do
200
- case ActiveRecord::Base.schema_format
201
- when :ruby then db_namespace["schema:dump"].invoke
202
- when :sql then db_namespace["structure:dump"].invoke
203
- else
204
- raise "unknown schema format #{ActiveRecord::Base.schema_format}"
50
+ if ActiveRecord::Base.dump_schema_after_migration
51
+ case ActiveRecord::Base.schema_format
52
+ when :ruby then db_namespace["schema:dump"].invoke
53
+ when :sql then db_namespace["structure:dump"].invoke
54
+ else
55
+ raise "unknown schema format #{ActiveRecord::Base.schema_format}"
56
+ end
205
57
  end
206
58
  # Allow this task to be called as many times as required. An example is the
207
59
  # migrate:redo task, which calls other two internally that depend on this one.
@@ -211,6 +63,8 @@ db_namespace = namespace :db do
211
63
  namespace :migrate do
212
64
  # desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
213
65
  task :redo => [:environment, :load_config] do
66
+ raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
67
+
214
68
  if ENV['VERSION']
215
69
  db_namespace['migrate:down'].invoke
216
70
  db_namespace['migrate:up'].invoke
@@ -225,46 +79,34 @@ db_namespace = namespace :db do
225
79
 
226
80
  # desc 'Runs the "up" for a given migration VERSION.'
227
81
  task :up => [:environment, :load_config] do
82
+ raise "VERSION is required" if ENV["VERSION"] && ENV["VERSION"].empty?
83
+
228
84
  version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
229
- raise 'VERSION is required' unless version
230
85
  ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, version)
231
86
  db_namespace['_dump'].invoke
232
87
  end
233
88
 
234
89
  # desc 'Runs the "down" for a given migration VERSION.'
235
90
  task :down => [:environment, :load_config] do
91
+ raise "VERSION is required - To go down one migration, use db:rollback" if ENV["VERSION"] && ENV["VERSION"].empty?
236
92
  version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
237
- raise 'VERSION is required' unless version
238
93
  ActiveRecord::Migrator.run(:down, ActiveRecord::Migrator.migrations_paths, version)
239
94
  db_namespace['_dump'].invoke
240
95
  end
241
96
 
242
97
  desc 'Display status of migrations'
243
98
  task :status => [:environment, :load_config] do
244
- unless ActiveRecord::Base.connection.table_exists?(ActiveRecord::Migrator.schema_migrations_table_name)
245
- puts 'Schema migrations table does not exist yet.'
246
- next # means "return" for rake task
247
- end
248
- db_list = ActiveRecord::Base.connection.select_values("SELECT version FROM #{ActiveRecord::Migrator.schema_migrations_table_name}")
249
- file_list = []
250
- ActiveRecord::Migrator.migrations_paths.each do |path|
251
- Dir.foreach(path) do |file|
252
- # only files matching "20091231235959_some_name.rb" pattern
253
- if match_data = /^(\d{14})_(.+)\.rb$/.match(file)
254
- status = db_list.delete(match_data[1]) ? 'up' : 'down'
255
- file_list << [status, match_data[1], match_data[2].humanize]
256
- end
257
- end
258
- end
259
- db_list.map! do |version|
260
- ['up', version, '********** NO FILE **********']
99
+ unless ActiveRecord::SchemaMigration.table_exists?
100
+ abort 'Schema migrations table does not exist yet.'
261
101
  end
102
+
262
103
  # output
263
104
  puts "\ndatabase: #{ActiveRecord::Base.connection_config[:database]}\n\n"
264
105
  puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
265
106
  puts "-" * 50
266
- (db_list + file_list).sort_by {|migration| migration[1]}.each do |migration|
267
- puts "#{migration[0].center(8)} #{migration[1].ljust(14)} #{migration[2]}"
107
+ paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
108
+ ActiveRecord::Migrator.migrations_status(paths).each do |status, version, name|
109
+ puts "#{status.center(8)} #{version.ljust(14)} #{name}"
268
110
  end
269
111
  puts
270
112
  end
@@ -292,31 +134,15 @@ db_namespace = namespace :db do
292
134
 
293
135
  # desc "Retrieves the charset for the current environment's database"
294
136
  task :charset => [:environment, :load_config] do
295
- config = ActiveRecord::Base.configurations[Rails.env]
296
- case config['adapter']
297
- when /mysql/
298
- ActiveRecord::Base.establish_connection(config)
299
- puts ActiveRecord::Base.connection.charset
300
- when /postgresql/
301
- ActiveRecord::Base.establish_connection(config)
302
- puts ActiveRecord::Base.connection.encoding
303
- when /sqlite/
304
- ActiveRecord::Base.establish_connection(config)
305
- puts ActiveRecord::Base.connection.encoding
306
- else
307
- $stderr.puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
308
- end
137
+ puts ActiveRecord::Tasks::DatabaseTasks.charset_current
309
138
  end
310
139
 
311
140
  # desc "Retrieves the collation for the current environment's database"
312
141
  task :collation => [:environment, :load_config] do
313
- config = ActiveRecord::Base.configurations[Rails.env]
314
- case config['adapter']
315
- when /mysql/
316
- ActiveRecord::Base.establish_connection(config)
317
- puts ActiveRecord::Base.connection.collation
318
- else
319
- $stderr.puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
142
+ begin
143
+ puts ActiveRecord::Tasks::DatabaseTasks.collation_current
144
+ rescue NoMethodError
145
+ $stderr.puts 'Sorry, your database adapter is not supported yet. Feel free to submit a patch.'
320
146
  end
321
147
  end
322
148
 
@@ -326,11 +152,11 @@ db_namespace = namespace :db do
326
152
  end
327
153
 
328
154
  # desc "Raises an error if there are pending migrations"
329
- task :abort_if_pending_migrations => [:environment, :load_config] do
330
- pending_migrations = ActiveRecord::Migrator.new(:up, ActiveRecord::Migrator.migrations_paths).pending_migrations
155
+ task :abort_if_pending_migrations => :environment do
156
+ pending_migrations = ActiveRecord::Migrator.open(ActiveRecord::Migrator.migrations_paths).pending_migrations
331
157
 
332
158
  if pending_migrations.any?
333
- puts "You have #{pending_migrations.size} pending migrations:"
159
+ puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
334
160
  pending_migrations.each do |pending_migration|
335
161
  puts ' %4d %s' % [pending_migration.version, pending_migration.name]
336
162
  end
@@ -338,13 +164,13 @@ db_namespace = namespace :db do
338
164
  end
339
165
  end
340
166
 
341
- desc 'Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the db first)'
167
+ desc 'Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the database first)'
342
168
  task :setup => ['db:schema:load_if_ruby', 'db:structure:load_if_sql', :seed]
343
169
 
344
170
  desc 'Load the seed data from db/seeds.rb'
345
171
  task :seed do
346
172
  db_namespace['abort_if_pending_migrations'].invoke
347
- Rails.application.load_seed
173
+ ActiveRecord::Tasks::DatabaseTasks.load_seed
348
174
  end
349
175
 
350
176
  namespace :fixtures do
@@ -352,12 +178,22 @@ db_namespace = namespace :db do
352
178
  task :load => [:environment, :load_config] do
353
179
  require 'active_record/fixtures'
354
180
 
355
- base_dir = File.join [Rails.root, ENV['FIXTURES_PATH'] || %w{test fixtures}].flatten
356
- fixtures_dir = File.join [base_dir, ENV['FIXTURES_DIR']].compact
181
+ base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
357
182
 
358
- (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir["#{fixtures_dir}/**/*.yml"].map {|f| f[(fixtures_dir.size + 1)..-5] }).each do |fixture_file|
359
- ActiveRecord::Fixtures.create_fixtures(fixtures_dir, fixture_file)
360
- end
183
+ fixtures_dir = if ENV['FIXTURES_DIR']
184
+ File.join base_dir, ENV['FIXTURES_DIR']
185
+ else
186
+ base_dir
187
+ end
188
+
189
+ fixture_files = if ENV['FIXTURES']
190
+ ENV['FIXTURES'].split(',')
191
+ else
192
+ # The use of String#[] here is to support namespaced fixtures
193
+ Dir["#{fixtures_dir}/**/*.yml"].map {|f| f[(fixtures_dir.size + 1)..-5] }
194
+ end
195
+
196
+ ActiveRecord::FixtureSet.create_fixtures(fixtures_dir, fixture_files)
361
197
  end
362
198
 
363
199
  # desc "Search for a fixture given a LABEL or ID. Specify an alternative path (eg. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
@@ -367,13 +203,14 @@ db_namespace = namespace :db do
367
203
  label, id = ENV['LABEL'], ENV['ID']
368
204
  raise 'LABEL or ID required' if label.blank? && id.blank?
369
205
 
370
- puts %Q(The fixture ID for "#{label}" is #{ActiveRecord::Fixtures.identify(label)}.) if label
206
+ puts %Q(The fixture ID for "#{label}" is #{ActiveRecord::FixtureSet.identify(label)}.) if label
207
+
208
+ base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
371
209
 
372
- base_dir = ENV['FIXTURES_PATH'] ? File.join(Rails.root, ENV['FIXTURES_PATH']) : File.join(Rails.root, 'test', 'fixtures')
373
210
  Dir["#{base_dir}/**/*.yml"].each do |file|
374
211
  if data = YAML::load(ERB.new(IO.read(file)).result)
375
- data.keys.each do |key|
376
- key_id = ActiveRecord::Fixtures.identify(key)
212
+ data.each_key do |key|
213
+ key_id = ActiveRecord::FixtureSet.identify(key)
377
214
 
378
215
  if key == label || key_id == id.to_i
379
216
  puts "#{file}: #{key} (#{key_id})"
@@ -385,10 +222,10 @@ db_namespace = namespace :db do
385
222
  end
386
223
 
387
224
  namespace :schema do
388
- desc 'Create a db/schema.rb file that can be portably used against any DB supported by AR'
225
+ desc 'Create a db/schema.rb file that is portable against any DB supported by AR'
389
226
  task :dump => [:environment, :load_config] do
390
227
  require 'active_record/schema_dumper'
391
- filename = ENV['SCHEMA'] || "#{Rails.root}/db/schema.rb"
228
+ filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
392
229
  File.open(filename, "w:utf-8") do |file|
393
230
  ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
394
231
  end
@@ -397,87 +234,53 @@ db_namespace = namespace :db do
397
234
 
398
235
  desc 'Load a schema.rb file into the database'
399
236
  task :load => [:environment, :load_config] do
400
- file = ENV['SCHEMA'] || "#{Rails.root}/db/schema.rb"
401
- if File.exists?(file)
402
- load(file)
403
- else
404
- abort %{#{file} doesn't exist yet. Run `rake db:migrate` to create it then try again. If you do not intend to use a database, you should instead alter #{Rails.root}/config/application.rb to limit the frameworks that will be loaded}
405
- end
237
+ ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
406
238
  end
407
239
 
408
240
  task :load_if_ruby => ['db:create', :environment] do
409
241
  db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :ruby
410
242
  end
243
+
244
+ namespace :cache do
245
+ desc 'Create a db/schema_cache.dump file.'
246
+ task :dump => [:environment, :load_config] do
247
+ con = ActiveRecord::Base.connection
248
+ filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
249
+
250
+ con.schema_cache.clear!
251
+ con.tables.each { |table| con.schema_cache.add(table) }
252
+ open(filename, 'wb') { |f| f.write(Marshal.dump(con.schema_cache)) }
253
+ end
254
+
255
+ desc 'Clear a db/schema_cache.dump file.'
256
+ task :clear => [:environment, :load_config] do
257
+ filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
258
+ FileUtils.rm(filename) if File.exist?(filename)
259
+ end
260
+ end
261
+
411
262
  end
412
263
 
413
264
  namespace :structure do
414
265
  desc 'Dump the database structure to db/structure.sql. Specify another file with DB_STRUCTURE=db/my_structure.sql'
415
266
  task :dump => [:environment, :load_config] do
416
- config = current_config
417
- filename = ENV['DB_STRUCTURE'] || File.join(Rails.root, "db", "structure.sql")
418
- case config['adapter']
419
- when /mysql/, 'oci', 'oracle'
420
- ActiveRecord::Base.establish_connection(config)
421
- File.open(filename, "w:utf-8") { |f| f << ActiveRecord::Base.connection.structure_dump }
422
- when /postgresql/
423
- set_psql_env(config)
424
- search_path = config['schema_search_path']
425
- unless search_path.blank?
426
- search_path = search_path.split(",").map{|search_path_part| "--schema=#{Shellwords.escape(search_path_part.strip)}" }.join(" ")
267
+ filename = ENV['DB_STRUCTURE'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "structure.sql")
268
+ current_config = ActiveRecord::Tasks::DatabaseTasks.current_config
269
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(current_config, filename)
270
+
271
+ if ActiveRecord::Base.connection.supports_migrations? &&
272
+ ActiveRecord::SchemaMigration.table_exists?
273
+ File.open(filename, "a") do |f|
274
+ f.puts ActiveRecord::Base.connection.dump_schema_information
275
+ f.print "\n"
427
276
  end
428
- `pg_dump -i -s -x -O -f #{Shellwords.escape(filename)} #{search_path} #{Shellwords.escape(config['database'])}`
429
- raise 'Error dumping database' if $?.exitstatus == 1
430
- File.open(filename, "a") { |f| f << "SET search_path TO #{ActiveRecord::Base.connection.schema_search_path};\n\n" }
431
- when /sqlite/
432
- dbfile = config['database']
433
- `sqlite3 #{dbfile} .schema > #{filename}`
434
- when 'sqlserver'
435
- `smoscript -s #{config['host']} -d #{config['database']} -u #{config['username']} -p #{config['password']} -f #{filename} -A -U`
436
- when "firebird"
437
- set_firebird_env(config)
438
- db_string = firebird_db_string(config)
439
- sh "isql -a #{db_string} > #{filename}"
440
- else
441
- raise "Task not supported by '#{config['adapter']}'"
442
- end
443
-
444
- if ActiveRecord::Base.connection.supports_migrations?
445
- File.open(filename, "a") { |f| f << ActiveRecord::Base.connection.dump_schema_information }
446
277
  end
447
278
  db_namespace['structure:dump'].reenable
448
279
  end
449
280
 
450
- # desc "Recreate the databases from the structure.sql file"
451
- task :load => [:environment, :load_config] do
452
- config = current_config
453
- filename = ENV['DB_STRUCTURE'] || File.join(Rails.root, "db", "structure.sql")
454
- case config['adapter']
455
- when /mysql/
456
- ActiveRecord::Base.establish_connection(config)
457
- ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
458
- IO.read(filename).split("\n\n").each do |table|
459
- ActiveRecord::Base.connection.execute(table)
460
- end
461
- when /postgresql/
462
- set_psql_env(config)
463
- `psql -f "#{filename}" #{config['database']}`
464
- when /sqlite/
465
- dbfile = config['database']
466
- `sqlite3 #{dbfile} < "#{filename}"`
467
- when 'sqlserver'
468
- `sqlcmd -S #{config['host']} -d #{config['database']} -U #{config['username']} -P #{config['password']} -i #{filename}`
469
- when 'oci', 'oracle'
470
- ActiveRecord::Base.establish_connection(config)
471
- IO.read(filename).split(";\n\n").each do |ddl|
472
- ActiveRecord::Base.connection.execute(ddl)
473
- end
474
- when 'firebird'
475
- set_firebird_env(config)
476
- db_string = firebird_db_string(config)
477
- sh "isql -i #{filename} #{db_string}"
478
- else
479
- raise "Task not supported by '#{config['adapter']}'"
480
- end
281
+ desc "Recreate the databases from the structure.sql file"
282
+ task :load => [:load_config] do
283
+ ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, ENV['DB_STRUCTURE'])
481
284
  end
482
285
 
483
286
  task :load_if_sql => ['db:create', :environment] do
@@ -487,8 +290,15 @@ db_namespace = namespace :db do
487
290
 
488
291
  namespace :test do
489
292
 
293
+ task :deprecated do
294
+ Rake.application.top_level_tasks.grep(/^db:test:/).each do |task|
295
+ $stderr.puts "WARNING: #{task} is deprecated. The Rails test helper now maintains " \
296
+ "your test schema automatically, see the release notes for details."
297
+ end
298
+ end
299
+
490
300
  # desc "Recreate the test database from the current schema"
491
- task :load => 'db:test:purge' do
301
+ task :load => %w(db:test:purge) do
492
302
  case ActiveRecord::Base.schema_format
493
303
  when :ruby
494
304
  db_namespace["test:load_schema"].invoke
@@ -497,93 +307,61 @@ db_namespace = namespace :db do
497
307
  end
498
308
  end
499
309
 
500
- # desc "Recreate the test database from an existent structure.sql file"
501
- task :load_structure => 'db:test:purge' do
310
+ # desc "Recreate the test database from an existent schema.rb file"
311
+ task :load_schema => %w(db:test:purge) do
502
312
  begin
503
- current_config(:config => ActiveRecord::Base.configurations['test'])
504
- db_namespace["structure:load"].invoke
313
+ should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
314
+ ActiveRecord::Schema.verbose = false
315
+ ActiveRecord::Tasks::DatabaseTasks.load_schema_for ActiveRecord::Base.configurations['test'], :ruby, ENV['SCHEMA']
505
316
  ensure
506
- current_config(:config => nil)
317
+ if should_reconnect
318
+ ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[ActiveRecord::Tasks::DatabaseTasks.env])
319
+ end
507
320
  end
508
321
  end
509
322
 
510
- # desc "Recreate the test database from an existent schema.rb file"
511
- task :load_schema => 'db:test:purge' do
512
- ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
513
- ActiveRecord::Schema.verbose = false
514
- db_namespace["schema:load"].invoke
323
+ # desc "Recreate the test database from an existent structure.sql file"
324
+ task :load_structure => %w(db:test:purge) do
325
+ ActiveRecord::Tasks::DatabaseTasks.load_schema_for ActiveRecord::Base.configurations['test'], :sql, ENV['SCHEMA']
326
+ end
327
+
328
+ # desc "Recreate the test database from a fresh schema"
329
+ task :clone => %w(db:test:deprecated environment) do
330
+ case ActiveRecord::Base.schema_format
331
+ when :ruby
332
+ db_namespace["test:clone_schema"].invoke
333
+ when :sql
334
+ db_namespace["test:clone_structure"].invoke
335
+ end
515
336
  end
516
337
 
517
338
  # desc "Recreate the test database from a fresh schema.rb file"
518
- task :clone => %w(db:schema:dump db:test:load_schema)
339
+ task :clone_schema => %w(db:test:deprecated db:schema:dump db:test:load_schema)
519
340
 
520
341
  # desc "Recreate the test database from a fresh structure.sql file"
521
- task :clone_structure => [ "db:structure:dump", "db:test:load_structure" ]
342
+ task :clone_structure => %w(db:test:deprecated db:structure:dump db:test:load_structure)
522
343
 
523
344
  # desc "Empty the test database"
524
- task :purge => [:environment, :load_config] do
525
- abcs = ActiveRecord::Base.configurations
526
- case abcs['test']['adapter']
527
- when /mysql/
528
- ActiveRecord::Base.establish_connection(:test)
529
- ActiveRecord::Base.connection.recreate_database(abcs['test']['database'], mysql_creation_options(abcs['test']))
530
- when /postgresql/
531
- ActiveRecord::Base.clear_active_connections!
532
- drop_database(abcs['test'])
533
- create_database(abcs['test'])
534
- when /sqlite/
535
- dbfile = abcs['test']['database']
536
- File.delete(dbfile) if File.exist?(dbfile)
537
- when 'sqlserver'
538
- test = abcs.deep_dup['test']
539
- test_database = test['database']
540
- test['database'] = 'master'
541
- ActiveRecord::Base.establish_connection(test)
542
- ActiveRecord::Base.connection.recreate_database!(test_database)
543
- when "oci", "oracle"
544
- ActiveRecord::Base.establish_connection(:test)
545
- ActiveRecord::Base.connection.structure_drop.split(";\n\n").each do |ddl|
546
- ActiveRecord::Base.connection.execute(ddl)
547
- end
548
- when 'firebird'
549
- ActiveRecord::Base.establish_connection(:test)
550
- ActiveRecord::Base.connection.recreate_database!
551
- else
552
- raise "Task not supported by '#{abcs['test']['adapter']}'"
553
- end
345
+ task :purge => %w(environment load_config) do
346
+ ActiveRecord::Tasks::DatabaseTasks.purge ActiveRecord::Base.configurations['test']
554
347
  end
555
348
 
556
349
  # desc 'Check for pending migrations and load the test schema'
557
- task :prepare => 'db:abort_if_pending_migrations' do
350
+ task :prepare => %w(environment load_config) do
558
351
  unless ActiveRecord::Base.configurations.blank?
559
- db_namespace[{ :sql => 'test:clone_structure', :ruby => 'test:load' }[ActiveRecord::Base.schema_format]].invoke
352
+ db_namespace['test:load'].invoke
560
353
  end
561
354
  end
562
355
  end
563
-
564
- namespace :sessions do
565
- # desc "Creates a sessions migration for use with ActiveRecord::SessionStore"
566
- task :create => [:environment, :load_config] do
567
- raise 'Task unavailable to this database (no migration support)' unless ActiveRecord::Base.connection.supports_migrations?
568
- Rails.application.load_generators
569
- require 'rails/generators/rails/session_migration/session_migration_generator'
570
- Rails::Generators::SessionMigrationGenerator.start [ ENV['MIGRATION'] || 'add_sessions_table' ]
571
- end
572
-
573
- # desc "Clear the sessions table"
574
- task :clear => [:environment, :load_config] do
575
- ActiveRecord::Base.connection.execute "DELETE FROM #{session_table_name}"
576
- end
577
- end
578
356
  end
579
357
 
580
358
  namespace :railties do
581
359
  namespace :install do
582
- # desc "Copies missing migrations from Railties (e.g. plugins, engines). You can specify Railties to use with FROM=railtie1,railtie2"
360
+ # desc "Copies missing migrations from Railties (e.g. engines). You can specify Railties to use with FROM=railtie1,railtie2"
583
361
  task :migrations => :'db:load_config' do
584
362
  to_load = ENV['FROM'].blank? ? :all : ENV['FROM'].split(",").map {|n| n.strip }
585
- railties = ActiveSupport::OrderedHash.new
586
- Rails.application.railties.all do |railtie|
363
+ railties = {}
364
+ Rails.application.migration_railties.each do |railtie|
587
365
  next unless to_load == :all || to_load.include?(railtie.railtie_name)
588
366
 
589
367
  if railtie.respond_to?(:paths) && (path = railtie.paths['db/migrate'].first)
@@ -595,7 +373,7 @@ namespace :railties do
595
373
  puts "NOTE: Migration #{migration.basename} from #{name} has been skipped. Migration with the same name already exists."
596
374
  end
597
375
 
598
- on_copy = Proc.new do |name, migration, old_path|
376
+ on_copy = Proc.new do |name, migration|
599
377
  puts "Copied migration #{migration.basename} from #{name}"
600
378
  end
601
379
 
@@ -604,56 +382,3 @@ namespace :railties do
604
382
  end
605
383
  end
606
384
  end
607
-
608
- task 'test:prepare' => 'db:test:prepare'
609
-
610
- def drop_database(config)
611
- case config['adapter']
612
- when /mysql/
613
- ActiveRecord::Base.establish_connection(config)
614
- ActiveRecord::Base.connection.drop_database config['database']
615
- when /sqlite/
616
- require 'pathname'
617
- path = Pathname.new(config['database'])
618
- file = path.absolute? ? path.to_s : File.join(Rails.root, path)
619
-
620
- FileUtils.rm(file)
621
- when /postgresql/
622
- ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
623
- ActiveRecord::Base.connection.drop_database config['database']
624
- end
625
- end
626
-
627
- def drop_database_and_rescue(config)
628
- begin
629
- drop_database(config)
630
- rescue Exception => e
631
- $stderr.puts "Couldn't drop #{config['database']} : #{e.inspect}"
632
- end
633
- end
634
-
635
- def configs_for_environment
636
- environments = [Rails.env]
637
- environments << 'test' if Rails.env.development?
638
- ActiveRecord::Base.configurations.values_at(*environments).compact.reject { |config| config['database'].blank? }
639
- end
640
-
641
- def session_table_name
642
- ActiveRecord::SessionStore::Session.table_name
643
- end
644
-
645
- def set_firebird_env(config)
646
- ENV['ISC_USER'] = config['username'].to_s if config['username']
647
- ENV['ISC_PASSWORD'] = config['password'].to_s if config['password']
648
- end
649
-
650
- def firebird_db_string(config)
651
- FireRuby::Database.db_string_for(config.symbolize_keys)
652
- end
653
-
654
- def set_psql_env(config)
655
- ENV['PGHOST'] = config['host'] if config['host']
656
- ENV['PGPORT'] = config['port'].to_s if config['port']
657
- ENV['PGPASSWORD'] = config['password'].to_s if config['password']
658
- ENV['PGUSER'] = config['username'].to_s if config['username']
659
- end