activerecord 2.3.18 → 3.0.0.beta

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 (378) hide show
  1. data/CHANGELOG +105 -34
  2. data/examples/performance.rb +3 -39
  3. data/examples/simple.rb +14 -0
  4. data/lib/active_record.rb +81 -47
  5. data/lib/active_record/aggregations.rb +1 -3
  6. data/lib/active_record/association_preload.rb +39 -54
  7. data/lib/active_record/associations.rb +262 -419
  8. data/lib/active_record/associations/association_collection.rb +85 -100
  9. data/lib/active_record/associations/association_proxy.rb +20 -18
  10. data/lib/active_record/associations/belongs_to_association.rb +8 -8
  11. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +13 -35
  12. data/lib/active_record/associations/has_many_association.rb +11 -19
  13. data/lib/active_record/associations/has_many_through_association.rb +30 -183
  14. data/lib/active_record/associations/has_one_association.rb +10 -10
  15. data/lib/active_record/associations/has_one_through_association.rb +13 -11
  16. data/lib/active_record/associations/through_association_scope.rb +153 -0
  17. data/lib/active_record/attribute_methods.rb +17 -370
  18. data/lib/active_record/attribute_methods/before_type_cast.rb +33 -0
  19. data/lib/active_record/attribute_methods/dirty.rb +87 -0
  20. data/lib/active_record/attribute_methods/primary_key.rb +44 -0
  21. data/lib/active_record/attribute_methods/query.rb +37 -0
  22. data/lib/active_record/attribute_methods/read.rb +116 -0
  23. data/lib/active_record/attribute_methods/time_zone_conversion.rb +60 -0
  24. data/lib/active_record/attribute_methods/write.rb +37 -0
  25. data/lib/active_record/autosave_association.rb +20 -41
  26. data/lib/active_record/base.rb +357 -1180
  27. data/lib/active_record/batches.rb +10 -16
  28. data/lib/active_record/callbacks.rb +66 -126
  29. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +17 -13
  30. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +5 -25
  31. data/lib/active_record/connection_adapters/abstract/database_statements.rb +4 -43
  32. data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -2
  33. data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -4
  34. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +1 -1
  35. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +18 -72
  36. data/lib/active_record/connection_adapters/abstract_adapter.rb +16 -49
  37. data/lib/active_record/connection_adapters/mysql_adapter.rb +15 -27
  38. data/lib/active_record/connection_adapters/postgresql_adapter.rb +84 -46
  39. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +9 -3
  40. data/lib/active_record/connection_adapters/sqlite_adapter.rb +34 -65
  41. data/lib/active_record/fixtures.rb +21 -25
  42. data/lib/active_record/locale/en.yml +9 -27
  43. data/lib/active_record/locking/optimistic.rb +16 -48
  44. data/lib/active_record/migration.rb +59 -46
  45. data/lib/active_record/named_scope.rb +85 -92
  46. data/lib/active_record/nested_attributes.rb +18 -24
  47. data/lib/active_record/observer.rb +18 -94
  48. data/lib/active_record/railtie.rb +83 -0
  49. data/lib/active_record/railties/controller_runtime.rb +38 -0
  50. data/lib/active_record/railties/databases.rake +477 -0
  51. data/lib/active_record/railties/subscriber.rb +27 -0
  52. data/lib/active_record/reflection.rb +2 -15
  53. data/lib/active_record/relation.rb +339 -0
  54. data/lib/active_record/relation/calculations.rb +259 -0
  55. data/lib/active_record/relation/finder_methods.rb +315 -0
  56. data/lib/active_record/relation/predicate_builder.rb +46 -0
  57. data/lib/active_record/relation/query_methods.rb +218 -0
  58. data/lib/active_record/relation/spawn_methods.rb +102 -0
  59. data/lib/active_record/schema_dumper.rb +10 -6
  60. data/lib/active_record/serialization.rb +31 -74
  61. data/lib/active_record/serializers/xml_serializer.rb +33 -121
  62. data/lib/active_record/session_store.rb +1 -9
  63. data/lib/active_record/test_case.rb +1 -3
  64. data/lib/active_record/timestamp.rb +7 -5
  65. data/lib/active_record/transactions.rb +9 -9
  66. data/lib/active_record/validations.rb +51 -1100
  67. data/lib/active_record/validations/associated.rb +47 -0
  68. data/lib/active_record/validations/uniqueness.rb +181 -0
  69. data/lib/active_record/version.rb +3 -3
  70. data/lib/generators/active_record.rb +30 -0
  71. data/lib/generators/active_record/migration/migration_generator.rb +25 -0
  72. data/lib/generators/active_record/migration/templates/migration.rb +11 -0
  73. data/lib/generators/active_record/model/model_generator.rb +33 -0
  74. data/lib/generators/active_record/model/templates/migration.rb +16 -0
  75. data/lib/generators/active_record/model/templates/model.rb +5 -0
  76. data/lib/generators/active_record/observer/observer_generator.rb +15 -0
  77. data/lib/generators/active_record/observer/templates/observer.rb +2 -0
  78. data/lib/generators/active_record/session_migration/session_migration_generator.rb +24 -0
  79. data/lib/generators/active_record/session_migration/templates/migration.rb +16 -0
  80. metadata +67 -325
  81. data/RUNNING_UNIT_TESTS +0 -36
  82. data/Rakefile +0 -268
  83. data/install.rb +0 -30
  84. data/lib/active_record/calculations.rb +0 -321
  85. data/lib/active_record/connection_adapters/abstract/database_limits.rb +0 -57
  86. data/lib/active_record/dirty.rb +0 -183
  87. data/lib/active_record/serializers/json_serializer.rb +0 -91
  88. data/lib/activerecord.rb +0 -2
  89. data/test/assets/example.log +0 -1
  90. data/test/assets/flowers.jpg +0 -0
  91. data/test/cases/aaa_create_tables_test.rb +0 -24
  92. data/test/cases/active_schema_test_mysql.rb +0 -122
  93. data/test/cases/active_schema_test_postgresql.rb +0 -24
  94. data/test/cases/adapter_test.rb +0 -144
  95. data/test/cases/aggregations_test.rb +0 -167
  96. data/test/cases/ar_schema_test.rb +0 -32
  97. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  98. data/test/cases/associations/callbacks_test.rb +0 -161
  99. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  100. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  101. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  102. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  103. data/test/cases/associations/eager_singularization_test.rb +0 -145
  104. data/test/cases/associations/eager_test.rb +0 -852
  105. data/test/cases/associations/extension_test.rb +0 -62
  106. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  107. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  108. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  109. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  110. data/test/cases/associations/has_one_associations_test.rb +0 -330
  111. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  112. data/test/cases/associations/inner_join_association_test.rb +0 -93
  113. data/test/cases/associations/inverse_associations_test.rb +0 -566
  114. data/test/cases/associations/join_model_test.rb +0 -712
  115. data/test/cases/associations_test.rb +0 -282
  116. data/test/cases/attribute_methods_test.rb +0 -305
  117. data/test/cases/autosave_association_test.rb +0 -1218
  118. data/test/cases/base_test.rb +0 -2166
  119. data/test/cases/batches_test.rb +0 -81
  120. data/test/cases/binary_test.rb +0 -30
  121. data/test/cases/calculations_test.rb +0 -360
  122. data/test/cases/callbacks_observers_test.rb +0 -38
  123. data/test/cases/callbacks_test.rb +0 -438
  124. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  125. data/test/cases/column_alias_test.rb +0 -17
  126. data/test/cases/column_definition_test.rb +0 -70
  127. data/test/cases/connection_pool_test.rb +0 -25
  128. data/test/cases/connection_test_firebird.rb +0 -8
  129. data/test/cases/connection_test_mysql.rb +0 -65
  130. data/test/cases/copy_table_test_sqlite.rb +0 -80
  131. data/test/cases/counter_cache_test.rb +0 -84
  132. data/test/cases/database_statements_test.rb +0 -12
  133. data/test/cases/datatype_test_postgresql.rb +0 -204
  134. data/test/cases/date_time_test.rb +0 -37
  135. data/test/cases/default_test_firebird.rb +0 -16
  136. data/test/cases/defaults_test.rb +0 -111
  137. data/test/cases/deprecated_finder_test.rb +0 -30
  138. data/test/cases/dirty_test.rb +0 -316
  139. data/test/cases/finder_respond_to_test.rb +0 -76
  140. data/test/cases/finder_test.rb +0 -1098
  141. data/test/cases/fixtures_test.rb +0 -661
  142. data/test/cases/helper.rb +0 -68
  143. data/test/cases/i18n_test.rb +0 -46
  144. data/test/cases/inheritance_test.rb +0 -262
  145. data/test/cases/invalid_date_test.rb +0 -24
  146. data/test/cases/json_serialization_test.rb +0 -219
  147. data/test/cases/lifecycle_test.rb +0 -193
  148. data/test/cases/locking_test.rb +0 -350
  149. data/test/cases/method_scoping_test.rb +0 -704
  150. data/test/cases/migration_test.rb +0 -1649
  151. data/test/cases/migration_test_firebird.rb +0 -124
  152. data/test/cases/mixin_test.rb +0 -96
  153. data/test/cases/modules_test.rb +0 -109
  154. data/test/cases/multiple_db_test.rb +0 -85
  155. data/test/cases/named_scope_test.rb +0 -372
  156. data/test/cases/nested_attributes_test.rb +0 -840
  157. data/test/cases/pk_test.rb +0 -119
  158. data/test/cases/pooled_connections_test.rb +0 -103
  159. data/test/cases/query_cache_test.rb +0 -129
  160. data/test/cases/readonly_test.rb +0 -107
  161. data/test/cases/reflection_test.rb +0 -234
  162. data/test/cases/reload_models_test.rb +0 -22
  163. data/test/cases/repair_helper.rb +0 -50
  164. data/test/cases/reserved_word_test_mysql.rb +0 -176
  165. data/test/cases/sanitize_test.rb +0 -25
  166. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  167. data/test/cases/schema_dumper_test.rb +0 -211
  168. data/test/cases/schema_test_postgresql.rb +0 -178
  169. data/test/cases/serialization_test.rb +0 -47
  170. data/test/cases/sp_test_mysql.rb +0 -16
  171. data/test/cases/synonym_test_oracle.rb +0 -17
  172. data/test/cases/timestamp_test.rb +0 -75
  173. data/test/cases/transactions_test.rb +0 -543
  174. data/test/cases/unconnected_test.rb +0 -32
  175. data/test/cases/validations_i18n_test.rb +0 -925
  176. data/test/cases/validations_test.rb +0 -1684
  177. data/test/cases/xml_serialization_test.rb +0 -240
  178. data/test/cases/yaml_serialization_test.rb +0 -11
  179. data/test/config.rb +0 -5
  180. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  181. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  182. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  183. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  184. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  185. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  186. data/test/connections/native_db2/connection.rb +0 -25
  187. data/test/connections/native_firebird/connection.rb +0 -26
  188. data/test/connections/native_frontbase/connection.rb +0 -27
  189. data/test/connections/native_mysql/connection.rb +0 -25
  190. data/test/connections/native_openbase/connection.rb +0 -21
  191. data/test/connections/native_oracle/connection.rb +0 -27
  192. data/test/connections/native_postgresql/connection.rb +0 -21
  193. data/test/connections/native_sqlite/connection.rb +0 -25
  194. data/test/connections/native_sqlite3/connection.rb +0 -25
  195. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  196. data/test/connections/native_sybase/connection.rb +0 -23
  197. data/test/fixtures/accounts.yml +0 -29
  198. data/test/fixtures/all/developers.yml +0 -0
  199. data/test/fixtures/all/people.csv +0 -0
  200. data/test/fixtures/all/tasks.yml +0 -0
  201. data/test/fixtures/author_addresses.yml +0 -5
  202. data/test/fixtures/author_favorites.yml +0 -4
  203. data/test/fixtures/authors.yml +0 -9
  204. data/test/fixtures/binaries.yml +0 -132
  205. data/test/fixtures/books.yml +0 -7
  206. data/test/fixtures/categories.yml +0 -14
  207. data/test/fixtures/categories/special_categories.yml +0 -9
  208. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  209. data/test/fixtures/categories_ordered.yml +0 -7
  210. data/test/fixtures/categories_posts.yml +0 -23
  211. data/test/fixtures/categorizations.yml +0 -17
  212. data/test/fixtures/clubs.yml +0 -6
  213. data/test/fixtures/comments.yml +0 -59
  214. data/test/fixtures/companies.yml +0 -56
  215. data/test/fixtures/computers.yml +0 -4
  216. data/test/fixtures/courses.yml +0 -7
  217. data/test/fixtures/customers.yml +0 -26
  218. data/test/fixtures/developers.yml +0 -21
  219. data/test/fixtures/developers_projects.yml +0 -17
  220. data/test/fixtures/edges.yml +0 -6
  221. data/test/fixtures/entrants.yml +0 -14
  222. data/test/fixtures/faces.yml +0 -11
  223. data/test/fixtures/fk_test_has_fk.yml +0 -3
  224. data/test/fixtures/fk_test_has_pk.yml +0 -2
  225. data/test/fixtures/funny_jokes.yml +0 -10
  226. data/test/fixtures/interests.yml +0 -33
  227. data/test/fixtures/items.yml +0 -4
  228. data/test/fixtures/jobs.yml +0 -7
  229. data/test/fixtures/legacy_things.yml +0 -3
  230. data/test/fixtures/mateys.yml +0 -4
  231. data/test/fixtures/member_types.yml +0 -6
  232. data/test/fixtures/members.yml +0 -6
  233. data/test/fixtures/memberships.yml +0 -20
  234. data/test/fixtures/men.yml +0 -5
  235. data/test/fixtures/minimalistics.yml +0 -2
  236. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  237. data/test/fixtures/mixins.yml +0 -29
  238. data/test/fixtures/movies.yml +0 -7
  239. data/test/fixtures/naked/csv/accounts.csv +0 -1
  240. data/test/fixtures/naked/yml/accounts.yml +0 -1
  241. data/test/fixtures/naked/yml/companies.yml +0 -1
  242. data/test/fixtures/naked/yml/courses.yml +0 -1
  243. data/test/fixtures/organizations.yml +0 -5
  244. data/test/fixtures/owners.yml +0 -7
  245. data/test/fixtures/parrots.yml +0 -27
  246. data/test/fixtures/parrots_pirates.yml +0 -7
  247. data/test/fixtures/people.yml +0 -15
  248. data/test/fixtures/pets.yml +0 -14
  249. data/test/fixtures/pirates.yml +0 -9
  250. data/test/fixtures/polymorphic_designs.yml +0 -19
  251. data/test/fixtures/polymorphic_prices.yml +0 -19
  252. data/test/fixtures/posts.yml +0 -52
  253. data/test/fixtures/price_estimates.yml +0 -7
  254. data/test/fixtures/projects.yml +0 -7
  255. data/test/fixtures/readers.yml +0 -9
  256. data/test/fixtures/references.yml +0 -17
  257. data/test/fixtures/reserved_words/distinct.yml +0 -5
  258. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  259. data/test/fixtures/reserved_words/group.yml +0 -14
  260. data/test/fixtures/reserved_words/select.yml +0 -8
  261. data/test/fixtures/reserved_words/values.yml +0 -7
  262. data/test/fixtures/ships.yml +0 -5
  263. data/test/fixtures/sponsors.yml +0 -9
  264. data/test/fixtures/subscribers.yml +0 -7
  265. data/test/fixtures/subscriptions.yml +0 -12
  266. data/test/fixtures/taggings.yml +0 -28
  267. data/test/fixtures/tags.yml +0 -7
  268. data/test/fixtures/tasks.yml +0 -7
  269. data/test/fixtures/tees.yml +0 -4
  270. data/test/fixtures/ties.yml +0 -4
  271. data/test/fixtures/topics.yml +0 -42
  272. data/test/fixtures/toys.yml +0 -4
  273. data/test/fixtures/treasures.yml +0 -10
  274. data/test/fixtures/vertices.yml +0 -4
  275. data/test/fixtures/warehouse-things.yml +0 -3
  276. data/test/fixtures/zines.yml +0 -5
  277. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  278. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  279. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  280. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  281. data/test/migrations/duplicate/3_foo.rb +0 -7
  282. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  283. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  284. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  285. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  286. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  287. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  288. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  289. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  290. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  291. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  292. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  293. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  294. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  295. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  296. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  297. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  298. data/test/models/author.rb +0 -151
  299. data/test/models/auto_id.rb +0 -4
  300. data/test/models/binary.rb +0 -2
  301. data/test/models/bird.rb +0 -9
  302. data/test/models/book.rb +0 -4
  303. data/test/models/categorization.rb +0 -5
  304. data/test/models/category.rb +0 -34
  305. data/test/models/citation.rb +0 -6
  306. data/test/models/club.rb +0 -13
  307. data/test/models/column_name.rb +0 -3
  308. data/test/models/comment.rb +0 -29
  309. data/test/models/company.rb +0 -173
  310. data/test/models/company_in_module.rb +0 -78
  311. data/test/models/computer.rb +0 -3
  312. data/test/models/contact.rb +0 -16
  313. data/test/models/contract.rb +0 -5
  314. data/test/models/course.rb +0 -3
  315. data/test/models/customer.rb +0 -73
  316. data/test/models/default.rb +0 -2
  317. data/test/models/developer.rb +0 -101
  318. data/test/models/edge.rb +0 -5
  319. data/test/models/entrant.rb +0 -3
  320. data/test/models/essay.rb +0 -3
  321. data/test/models/event.rb +0 -3
  322. data/test/models/event_author.rb +0 -8
  323. data/test/models/face.rb +0 -7
  324. data/test/models/guid.rb +0 -2
  325. data/test/models/interest.rb +0 -5
  326. data/test/models/invoice.rb +0 -4
  327. data/test/models/item.rb +0 -7
  328. data/test/models/job.rb +0 -5
  329. data/test/models/joke.rb +0 -3
  330. data/test/models/keyboard.rb +0 -3
  331. data/test/models/legacy_thing.rb +0 -3
  332. data/test/models/line_item.rb +0 -3
  333. data/test/models/man.rb +0 -9
  334. data/test/models/matey.rb +0 -4
  335. data/test/models/member.rb +0 -12
  336. data/test/models/member_detail.rb +0 -5
  337. data/test/models/member_type.rb +0 -3
  338. data/test/models/membership.rb +0 -9
  339. data/test/models/minimalistic.rb +0 -2
  340. data/test/models/mixed_case_monkey.rb +0 -3
  341. data/test/models/movie.rb +0 -5
  342. data/test/models/order.rb +0 -4
  343. data/test/models/organization.rb +0 -6
  344. data/test/models/owner.rb +0 -5
  345. data/test/models/parrot.rb +0 -22
  346. data/test/models/person.rb +0 -16
  347. data/test/models/pet.rb +0 -5
  348. data/test/models/pirate.rb +0 -80
  349. data/test/models/polymorphic_design.rb +0 -3
  350. data/test/models/polymorphic_price.rb +0 -3
  351. data/test/models/post.rb +0 -102
  352. data/test/models/price_estimate.rb +0 -3
  353. data/test/models/project.rb +0 -30
  354. data/test/models/reader.rb +0 -4
  355. data/test/models/reference.rb +0 -4
  356. data/test/models/reply.rb +0 -46
  357. data/test/models/ship.rb +0 -19
  358. data/test/models/ship_part.rb +0 -7
  359. data/test/models/sponsor.rb +0 -4
  360. data/test/models/subject.rb +0 -4
  361. data/test/models/subscriber.rb +0 -8
  362. data/test/models/subscription.rb +0 -4
  363. data/test/models/tag.rb +0 -7
  364. data/test/models/tagging.rb +0 -10
  365. data/test/models/task.rb +0 -3
  366. data/test/models/tee.rb +0 -4
  367. data/test/models/tie.rb +0 -4
  368. data/test/models/topic.rb +0 -80
  369. data/test/models/toy.rb +0 -6
  370. data/test/models/treasure.rb +0 -8
  371. data/test/models/vertex.rb +0 -9
  372. data/test/models/warehouse_thing.rb +0 -5
  373. data/test/models/zine.rb +0 -3
  374. data/test/schema/mysql_specific_schema.rb +0 -31
  375. data/test/schema/postgresql_specific_schema.rb +0 -114
  376. data/test/schema/schema.rb +0 -550
  377. data/test/schema/schema2.rb +0 -6
  378. data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -0,0 +1,83 @@
1
+ require "active_record"
2
+ require "rails"
3
+ require "active_model/railtie"
4
+
5
+ # For now, action_controller must always be present with
6
+ # rails, so let's make sure that it gets required before
7
+ # here. This is needed for correctly setting up the middleware.
8
+ # In the future, this might become an optional require.
9
+ require "action_controller/railtie"
10
+
11
+ module ActiveRecord
12
+ class Railtie < Rails::Railtie
13
+ railtie_name :active_record
14
+
15
+ config.generators.orm :active_record, :migration => true,
16
+ :timestamps => true
17
+
18
+ rake_tasks do
19
+ load "active_record/railties/databases.rake"
20
+ end
21
+
22
+ # TODO If we require the wrong file, the error never comes up.
23
+ require "active_record/railties/subscriber"
24
+ subscriber ActiveRecord::Railties::Subscriber.new
25
+
26
+ initializer "active_record.initialize_timezone" do
27
+ ActiveRecord::Base.time_zone_aware_attributes = true
28
+ ActiveRecord::Base.default_timezone = :utc
29
+ end
30
+
31
+ initializer "active_record.logger" do
32
+ ActiveRecord::Base.logger ||= ::Rails.logger
33
+ end
34
+
35
+ initializer "active_record.set_configs" do |app|
36
+ app.config.active_record.each do |k,v|
37
+ ActiveRecord::Base.send "#{k}=", v
38
+ end
39
+ end
40
+
41
+ # This sets the database configuration from Configuration#database_configuration
42
+ # and then establishes the connection.
43
+ initializer "active_record.initialize_database" do |app|
44
+ ActiveRecord::Base.configurations = app.config.database_configuration
45
+ ActiveRecord::Base.establish_connection
46
+ end
47
+
48
+ # Expose database runtime to controller for logging.
49
+ initializer "active_record.log_runtime" do |app|
50
+ require "active_record/railties/controller_runtime"
51
+ ActionController::Base.send :include, ActiveRecord::Railties::ControllerRuntime
52
+ end
53
+
54
+ # Setup database middleware after initializers have run
55
+ initializer "active_record.initialize_database_middleware", :after => "action_controller.set_configs" do |app|
56
+ middleware = app.config.middleware
57
+ if middleware.include?("ActiveRecord::SessionStore")
58
+ middleware.insert_before "ActiveRecord::SessionStore", ActiveRecord::ConnectionAdapters::ConnectionManagement
59
+ middleware.insert_before "ActiveRecord::SessionStore", ActiveRecord::QueryCache
60
+ else
61
+ middleware.use ActiveRecord::ConnectionAdapters::ConnectionManagement
62
+ middleware.use ActiveRecord::QueryCache
63
+ end
64
+ end
65
+
66
+ initializer "active_record.load_observers" do
67
+ ActiveRecord::Base.instantiate_observers
68
+
69
+ ActionDispatch::Callbacks.to_prepare(:activerecord_instantiate_observers) do
70
+ ActiveRecord::Base.instantiate_observers
71
+ end
72
+ end
73
+
74
+ initializer "active_record.set_dispatch_hooks", :before => :set_clear_dependencies_hook do |app|
75
+ unless app.config.cache_classes
76
+ ActionDispatch::Callbacks.after do
77
+ ActiveRecord::Base.reset_subclasses
78
+ ActiveRecord::Base.clear_reloadable_connections!
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,38 @@
1
+ require 'active_support/core_ext/module/attr_internal'
2
+
3
+ module ActiveRecord
4
+ module Railties
5
+ module ControllerRuntime
6
+ extend ActiveSupport::Concern
7
+
8
+ protected
9
+
10
+ attr_internal :db_runtime
11
+
12
+ def cleanup_view_runtime
13
+ if ActiveRecord::Base.connected?
14
+ db_rt_before_render = ActiveRecord::Base.connection.reset_runtime
15
+ runtime = super
16
+ db_rt_after_render = ActiveRecord::Base.connection.reset_runtime
17
+ self.db_runtime = db_rt_before_render + db_rt_after_render
18
+ runtime - db_rt_after_render
19
+ else
20
+ super
21
+ end
22
+ end
23
+
24
+ def append_info_to_payload(payload)
25
+ super
26
+ payload[:db_runtime] = db_runtime
27
+ end
28
+
29
+ module ClassMethods
30
+ def log_process_action(payload)
31
+ messages, db_runtime = super, payload[:db_runtime]
32
+ messages << ("ActiveRecord: %.1fms" % db_runtime.to_f) if db_runtime
33
+ messages
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,477 @@
1
+ namespace :db do
2
+ task :load_config => :rails_env do
3
+ require 'active_record'
4
+ ActiveRecord::Base.configurations = Rails::Application.config.database_configuration
5
+ end
6
+
7
+ namespace :create do
8
+ desc 'Create all the local databases defined in config/database.yml'
9
+ task :all => :load_config do
10
+ ActiveRecord::Base.configurations.each_value do |config|
11
+ # Skip entries that don't have a database key, such as the first entry here:
12
+ #
13
+ # defaults: &defaults
14
+ # adapter: mysql
15
+ # username: root
16
+ # password:
17
+ # host: localhost
18
+ #
19
+ # development:
20
+ # database: blog_development
21
+ # <<: *defaults
22
+ next unless config['database']
23
+ # Only connect to local databases
24
+ local_database?(config) { create_database(config) }
25
+ end
26
+ end
27
+ end
28
+
29
+ desc 'Create the database defined in config/database.yml for the current Rails.env - also makes test database if in development mode'
30
+ task :create => :load_config do
31
+ # Make the test database at the same time as the development one, if it exists
32
+ if Rails.env.development? && ActiveRecord::Base.configurations['test']
33
+ create_database(ActiveRecord::Base.configurations['test'])
34
+ end
35
+ create_database(ActiveRecord::Base.configurations[Rails.env])
36
+ end
37
+
38
+ def create_database(config)
39
+ begin
40
+ if config['adapter'] =~ /sqlite/
41
+ if File.exist?(config['database'])
42
+ $stderr.puts "#{config['database']} already exists"
43
+ else
44
+ begin
45
+ # Create the SQLite database
46
+ ActiveRecord::Base.establish_connection(config)
47
+ ActiveRecord::Base.connection
48
+ rescue
49
+ $stderr.puts $!, *($!.backtrace)
50
+ $stderr.puts "Couldn't create database for #{config.inspect}"
51
+ end
52
+ end
53
+ return # Skip the else clause of begin/rescue
54
+ else
55
+ ActiveRecord::Base.establish_connection(config)
56
+ ActiveRecord::Base.connection
57
+ end
58
+ rescue
59
+ case config['adapter']
60
+ when 'mysql'
61
+ @charset = ENV['CHARSET'] || 'utf8'
62
+ @collation = ENV['COLLATION'] || 'utf8_unicode_ci'
63
+ creation_options = {:charset => (config['charset'] || @charset), :collation => (config['collation'] || @collation)}
64
+ begin
65
+ ActiveRecord::Base.establish_connection(config.merge('database' => nil))
66
+ ActiveRecord::Base.connection.create_database(config['database'], creation_options)
67
+ ActiveRecord::Base.establish_connection(config)
68
+ rescue Mysql::Error => sqlerr
69
+ if sqlerr.errno == Mysql::Error::ER_ACCESS_DENIED_ERROR
70
+ print "#{sqlerr.error}. \nPlease provide the root password for your mysql installation\n>"
71
+ root_password = $stdin.gets.strip
72
+ grant_statement = "GRANT ALL PRIVILEGES ON #{config['database']}.* " \
73
+ "TO '#{config['username']}'@'localhost' " \
74
+ "IDENTIFIED BY '#{config['password']}' WITH GRANT OPTION;"
75
+ ActiveRecord::Base.establish_connection(config.merge(
76
+ 'database' => nil, 'username' => 'root', 'password' => root_password))
77
+ ActiveRecord::Base.connection.create_database(config['database'], creation_options)
78
+ ActiveRecord::Base.connection.execute grant_statement
79
+ ActiveRecord::Base.establish_connection(config)
80
+ else
81
+ $stderr.puts sqlerr.error
82
+ $stderr.puts "Couldn't create database for #{config.inspect}, charset: #{config['charset'] || @charset}, collation: #{config['collation'] || @collation}"
83
+ $stderr.puts "(if you set the charset manually, make sure you have a matching collation)" if config['charset']
84
+ end
85
+ end
86
+ when 'postgresql'
87
+ @encoding = config[:encoding] || ENV['CHARSET'] || 'utf8'
88
+ begin
89
+ ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
90
+ ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => @encoding))
91
+ ActiveRecord::Base.establish_connection(config)
92
+ rescue
93
+ $stderr.puts $!, *($!.backtrace)
94
+ $stderr.puts "Couldn't create database for #{config.inspect}"
95
+ end
96
+ end
97
+ else
98
+ $stderr.puts "#{config['database']} already exists"
99
+ end
100
+ end
101
+
102
+ namespace :drop do
103
+ desc 'Drops all the local databases defined in config/database.yml'
104
+ task :all => :load_config do
105
+ ActiveRecord::Base.configurations.each_value do |config|
106
+ # Skip entries that don't have a database key
107
+ next unless config['database']
108
+ begin
109
+ # Only connect to local databases
110
+ local_database?(config) { drop_database(config) }
111
+ rescue Exception => e
112
+ puts "Couldn't drop #{config['database']} : #{e.inspect}"
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ desc 'Drops the database for the current Rails.env'
119
+ task :drop => :load_config do
120
+ config = ActiveRecord::Base.configurations[Rails.env || 'development']
121
+ begin
122
+ drop_database(config)
123
+ rescue Exception => e
124
+ puts "Couldn't drop #{config['database']} : #{e.inspect}"
125
+ end
126
+ end
127
+
128
+ def local_database?(config, &block)
129
+ if %w( 127.0.0.1 localhost ).include?(config['host']) || config['host'].blank?
130
+ yield
131
+ else
132
+ puts "This task only modifies local databases. #{config['database']} is on a remote host."
133
+ end
134
+ end
135
+
136
+
137
+ desc "Migrate the database through scripts in db/migrate and update db/schema.rb by invoking db:schema:dump. Target specific version with VERSION=x. Turn off output with VERBOSE=false."
138
+ task :migrate => :environment do
139
+ ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
140
+ ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
141
+ Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
142
+ end
143
+
144
+ namespace :migrate do
145
+ desc 'Rollbacks the database one migration and re migrate up. If you want to rollback more than one step, define STEP=x. Target specific version with VERSION=x.'
146
+ task :redo => :environment do
147
+ if ENV["VERSION"]
148
+ Rake::Task["db:migrate:down"].invoke
149
+ Rake::Task["db:migrate:up"].invoke
150
+ else
151
+ Rake::Task["db:rollback"].invoke
152
+ Rake::Task["db:migrate"].invoke
153
+ end
154
+ end
155
+
156
+ desc 'Resets your database using your migrations for the current environment'
157
+ task :reset => ["db:drop", "db:create", "db:migrate"]
158
+
159
+ desc 'Runs the "up" for a given migration VERSION.'
160
+ task :up => :environment do
161
+ version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
162
+ raise "VERSION is required" unless version
163
+ ActiveRecord::Migrator.run(:up, "db/migrate/", version)
164
+ Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
165
+ end
166
+
167
+ desc 'Runs the "down" for a given migration VERSION.'
168
+ task :down => :environment do
169
+ version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
170
+ raise "VERSION is required" unless version
171
+ ActiveRecord::Migrator.run(:down, "db/migrate/", version)
172
+ Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
173
+ end
174
+ end
175
+
176
+ desc 'Rolls the schema back to the previous version. Specify the number of steps with STEP=n'
177
+ task :rollback => :environment do
178
+ step = ENV['STEP'] ? ENV['STEP'].to_i : 1
179
+ ActiveRecord::Migrator.rollback('db/migrate/', step)
180
+ Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
181
+ end
182
+
183
+ desc 'Pushes the schema to the next version. Specify the number of steps with STEP=n'
184
+ task :forward => :environment do
185
+ step = ENV['STEP'] ? ENV['STEP'].to_i : 1
186
+ ActiveRecord::Migrator.forward('db/migrate/', step)
187
+ Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
188
+ end
189
+
190
+ desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
191
+ task :reset => [ 'db:drop', 'db:setup' ]
192
+
193
+ desc "Retrieves the charset for the current environment's database"
194
+ task :charset => :environment do
195
+ config = ActiveRecord::Base.configurations[Rails.env || 'development']
196
+ case config['adapter']
197
+ when 'mysql'
198
+ ActiveRecord::Base.establish_connection(config)
199
+ puts ActiveRecord::Base.connection.charset
200
+ when 'postgresql'
201
+ ActiveRecord::Base.establish_connection(config)
202
+ puts ActiveRecord::Base.connection.encoding
203
+ when 'sqlite3'
204
+ ActiveRecord::Base.establish_connection(config)
205
+ puts ActiveRecord::Base.connection.encoding
206
+ else
207
+ puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
208
+ end
209
+ end
210
+
211
+ desc "Retrieves the collation for the current environment's database"
212
+ task :collation => :environment do
213
+ config = ActiveRecord::Base.configurations[Rails.env || 'development']
214
+ case config['adapter']
215
+ when 'mysql'
216
+ ActiveRecord::Base.establish_connection(config)
217
+ puts ActiveRecord::Base.connection.collation
218
+ else
219
+ puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
220
+ end
221
+ end
222
+
223
+ desc "Retrieves the current schema version number"
224
+ task :version => :environment do
225
+ puts "Current version: #{ActiveRecord::Migrator.current_version}"
226
+ end
227
+
228
+ desc "Raises an error if there are pending migrations"
229
+ task :abort_if_pending_migrations => :environment do
230
+ if defined? ActiveRecord
231
+ pending_migrations = ActiveRecord::Migrator.new(:up, 'db/migrate').pending_migrations
232
+
233
+ if pending_migrations.any?
234
+ puts "You have #{pending_migrations.size} pending migrations:"
235
+ pending_migrations.each do |pending_migration|
236
+ puts ' %4d %s' % [pending_migration.version, pending_migration.name]
237
+ end
238
+ abort %{Run "rake db:migrate" to update your database then try again.}
239
+ end
240
+ end
241
+ end
242
+
243
+ desc 'Create the database, load the schema, and initialize with the seed data'
244
+ task :setup => [ 'db:create', 'db:schema:load', 'db:seed' ]
245
+
246
+ desc 'Load the seed data from db/seeds.rb'
247
+ task :seed => :environment do
248
+ seed_file = File.join(Rails.root, 'db', 'seeds.rb')
249
+ load(seed_file) if File.exist?(seed_file)
250
+ end
251
+
252
+ namespace :fixtures do
253
+ desc "Load fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y. Load from subdirectory in test/fixtures using FIXTURES_DIR=z. Specify an alternative path (eg. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
254
+ task :load => :environment do
255
+ require 'active_record/fixtures'
256
+
257
+ ActiveRecord::Base.establish_connection(Rails.env)
258
+ base_dir = ENV['FIXTURES_PATH'] ? File.join(Rails.root, ENV['FIXTURES_PATH']) : File.join(Rails.root, 'test', 'fixtures')
259
+ fixtures_dir = ENV['FIXTURES_DIR'] ? File.join(base_dir, ENV['FIXTURES_DIR']) : base_dir
260
+
261
+ (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/).map {|f| File.join(fixtures_dir, f) } : Dir.glob(File.join(fixtures_dir, '*.{yml,csv}'))).each do |fixture_file|
262
+ Fixtures.create_fixtures(File.dirname(fixture_file), File.basename(fixture_file, '.*'))
263
+ end
264
+ end
265
+
266
+ desc "Search for a fixture given a LABEL or ID. Specify an alternative path (eg. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
267
+ task :identify => :environment do
268
+ require 'active_record/fixtures'
269
+
270
+ label, id = ENV["LABEL"], ENV["ID"]
271
+ raise "LABEL or ID required" if label.blank? && id.blank?
272
+
273
+ puts %Q(The fixture ID for "#{label}" is #{Fixtures.identify(label)}.) if label
274
+
275
+ base_dir = ENV['FIXTURES_PATH'] ? File.join(Rails.root, ENV['FIXTURES_PATH']) : File.join(Rails.root, 'test', 'fixtures')
276
+ Dir["#{base_dir}/**/*.yml"].each do |file|
277
+ if data = YAML::load(ERB.new(IO.read(file)).result)
278
+ data.keys.each do |key|
279
+ key_id = Fixtures.identify(key)
280
+
281
+ if key == label || key_id == id.to_i
282
+ puts "#{file}: #{key} (#{key_id})"
283
+ end
284
+ end
285
+ end
286
+ end
287
+ end
288
+ end
289
+
290
+ namespace :schema do
291
+ desc "Create a db/schema.rb file that can be portably used against any DB supported by AR"
292
+ task :dump => :environment do
293
+ require 'active_record/schema_dumper'
294
+ File.open(ENV['SCHEMA'] || "#{Rails.root}/db/schema.rb", "w") do |file|
295
+ ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
296
+ end
297
+ Rake::Task["db:schema:dump"].reenable
298
+ end
299
+
300
+ desc "Load a schema.rb file into the database"
301
+ task :load => :environment do
302
+ file = ENV['SCHEMA'] || "#{Rails.root}/db/schema.rb"
303
+ if File.exists?(file)
304
+ load(file)
305
+ else
306
+ 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/boot.rb to limit the frameworks that will be loaded}
307
+ end
308
+ end
309
+ end
310
+
311
+ namespace :structure do
312
+ desc "Dump the database structure to a SQL file"
313
+ task :dump => :environment do
314
+ abcs = ActiveRecord::Base.configurations
315
+ case abcs[Rails.env]["adapter"]
316
+ when "mysql", "oci", "oracle"
317
+ ActiveRecord::Base.establish_connection(abcs[Rails.env])
318
+ File.open("#{Rails.root}/db/#{Rails.env}_structure.sql", "w+") { |f| f << ActiveRecord::Base.connection.structure_dump }
319
+ when "postgresql"
320
+ ENV['PGHOST'] = abcs[Rails.env]["host"] if abcs[Rails.env]["host"]
321
+ ENV['PGPORT'] = abcs[Rails.env]["port"].to_s if abcs[Rails.env]["port"]
322
+ ENV['PGPASSWORD'] = abcs[Rails.env]["password"].to_s if abcs[Rails.env]["password"]
323
+ search_path = abcs[Rails.env]["schema_search_path"]
324
+ unless search_path.blank?
325
+ search_path = search_path.split(",").map{|search_path| "--schema=#{search_path.strip}" }.join(" ")
326
+ end
327
+ `pg_dump -i -U "#{abcs[Rails.env]["username"]}" -s -x -O -f db/#{Rails.env}_structure.sql #{search_path} #{abcs[Rails.env]["database"]}`
328
+ raise "Error dumping database" if $?.exitstatus == 1
329
+ when "sqlite", "sqlite3"
330
+ dbfile = abcs[Rails.env]["database"] || abcs[Rails.env]["dbfile"]
331
+ `#{abcs[Rails.env]["adapter"]} #{dbfile} .schema > db/#{Rails.env}_structure.sql`
332
+ when "sqlserver"
333
+ `scptxfr /s #{abcs[Rails.env]["host"]} /d #{abcs[Rails.env]["database"]} /I /f db\\#{Rails.env}_structure.sql /q /A /r`
334
+ `scptxfr /s #{abcs[Rails.env]["host"]} /d #{abcs[Rails.env]["database"]} /I /F db\ /q /A /r`
335
+ when "firebird"
336
+ set_firebird_env(abcs[Rails.env])
337
+ db_string = firebird_db_string(abcs[Rails.env])
338
+ sh "isql -a #{db_string} > #{Rails.root}/db/#{Rails.env}_structure.sql"
339
+ else
340
+ raise "Task not supported by '#{abcs["test"]["adapter"]}'"
341
+ end
342
+
343
+ if ActiveRecord::Base.connection.supports_migrations?
344
+ File.open("#{Rails.root}/db/#{Rails.env}_structure.sql", "a") { |f| f << ActiveRecord::Base.connection.dump_schema_information }
345
+ end
346
+ end
347
+ end
348
+
349
+ namespace :test do
350
+ desc "Recreate the test database from the current schema.rb"
351
+ task :load => 'db:test:purge' do
352
+ ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
353
+ ActiveRecord::Schema.verbose = false
354
+ Rake::Task["db:schema:load"].invoke
355
+ end
356
+
357
+ desc "Recreate the test database from the current environment's database schema"
358
+ task :clone => %w(db:schema:dump db:test:load)
359
+
360
+ desc "Recreate the test databases from the development structure"
361
+ task :clone_structure => [ "db:structure:dump", "db:test:purge" ] do
362
+ abcs = ActiveRecord::Base.configurations
363
+ case abcs["test"]["adapter"]
364
+ when "mysql"
365
+ ActiveRecord::Base.establish_connection(:test)
366
+ ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
367
+ IO.readlines("#{Rails.root}/db/#{Rails.env}_structure.sql").join.split("\n\n").each do |table|
368
+ ActiveRecord::Base.connection.execute(table)
369
+ end
370
+ when "postgresql"
371
+ ENV['PGHOST'] = abcs["test"]["host"] if abcs["test"]["host"]
372
+ ENV['PGPORT'] = abcs["test"]["port"].to_s if abcs["test"]["port"]
373
+ ENV['PGPASSWORD'] = abcs["test"]["password"].to_s if abcs["test"]["password"]
374
+ `psql -U "#{abcs["test"]["username"]}" -f #{Rails.root}/db/#{Rails.env}_structure.sql #{abcs["test"]["database"]}`
375
+ when "sqlite", "sqlite3"
376
+ dbfile = abcs["test"]["database"] || abcs["test"]["dbfile"]
377
+ `#{abcs["test"]["adapter"]} #{dbfile} < #{Rails.root}/db/#{Rails.env}_structure.sql`
378
+ when "sqlserver"
379
+ `osql -E -S #{abcs["test"]["host"]} -d #{abcs["test"]["database"]} -i db\\#{Rails.env}_structure.sql`
380
+ when "oci", "oracle"
381
+ ActiveRecord::Base.establish_connection(:test)
382
+ IO.readlines("#{Rails.root}/db/#{Rails.env}_structure.sql").join.split(";\n\n").each do |ddl|
383
+ ActiveRecord::Base.connection.execute(ddl)
384
+ end
385
+ when "firebird"
386
+ set_firebird_env(abcs["test"])
387
+ db_string = firebird_db_string(abcs["test"])
388
+ sh "isql -i #{Rails.root}/db/#{Rails.env}_structure.sql #{db_string}"
389
+ else
390
+ raise "Task not supported by '#{abcs["test"]["adapter"]}'"
391
+ end
392
+ end
393
+
394
+ desc "Empty the test database"
395
+ task :purge => :environment do
396
+ abcs = ActiveRecord::Base.configurations
397
+ case abcs["test"]["adapter"]
398
+ when "mysql"
399
+ ActiveRecord::Base.establish_connection(:test)
400
+ ActiveRecord::Base.connection.recreate_database(abcs["test"]["database"], abcs["test"])
401
+ when "postgresql"
402
+ ActiveRecord::Base.clear_active_connections!
403
+ drop_database(abcs['test'])
404
+ create_database(abcs['test'])
405
+ when "sqlite","sqlite3"
406
+ dbfile = abcs["test"]["database"] || abcs["test"]["dbfile"]
407
+ File.delete(dbfile) if File.exist?(dbfile)
408
+ when "sqlserver"
409
+ dropfkscript = "#{abcs["test"]["host"]}.#{abcs["test"]["database"]}.DP1".gsub(/\\/,'-')
410
+ `osql -E -S #{abcs["test"]["host"]} -d #{abcs["test"]["database"]} -i db\\#{dropfkscript}`
411
+ `osql -E -S #{abcs["test"]["host"]} -d #{abcs["test"]["database"]} -i db\\#{Rails.env}_structure.sql`
412
+ when "oci", "oracle"
413
+ ActiveRecord::Base.establish_connection(:test)
414
+ ActiveRecord::Base.connection.structure_drop.split(";\n\n").each do |ddl|
415
+ ActiveRecord::Base.connection.execute(ddl)
416
+ end
417
+ when "firebird"
418
+ ActiveRecord::Base.establish_connection(:test)
419
+ ActiveRecord::Base.connection.recreate_database!
420
+ else
421
+ raise "Task not supported by '#{abcs["test"]["adapter"]}'"
422
+ end
423
+ end
424
+
425
+ desc 'Check for pending migrations and load the test schema'
426
+ task :prepare => 'db:abort_if_pending_migrations' do
427
+ if defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank?
428
+ Rake::Task[{ :sql => "db:test:clone_structure", :ruby => "db:test:load" }[ActiveRecord::Base.schema_format]].invoke
429
+ end
430
+ end
431
+ end
432
+
433
+ namespace :sessions do
434
+ desc "Creates a sessions migration for use with ActiveRecord::SessionStore"
435
+ task :create => :environment do
436
+ raise "Task unavailable to this database (no migration support)" unless ActiveRecord::Base.connection.supports_migrations?
437
+ require 'rails/generators'
438
+ require 'generators/rails/session_migration/session_migration_generator'
439
+ Rails::Generators::SessionMigrationGenerator.start [ ENV["MIGRATION"] || "add_sessions_table" ]
440
+ end
441
+
442
+ desc "Clear the sessions table"
443
+ task :clear => :environment do
444
+ ActiveRecord::Base.connection.execute "DELETE FROM #{session_table_name}"
445
+ end
446
+ end
447
+ end
448
+
449
+ def drop_database(config)
450
+ case config['adapter']
451
+ when 'mysql'
452
+ ActiveRecord::Base.establish_connection(config)
453
+ ActiveRecord::Base.connection.drop_database config['database']
454
+ when /^sqlite/
455
+ require 'pathname'
456
+ path = Pathname.new(config['database'])
457
+ file = path.absolute? ? path.to_s : File.join(Rails.root, path)
458
+
459
+ FileUtils.rm(file)
460
+ when 'postgresql'
461
+ ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
462
+ ActiveRecord::Base.connection.drop_database config['database']
463
+ end
464
+ end
465
+
466
+ def session_table_name
467
+ ActiveRecord::SessionStore::Session.table_name
468
+ end
469
+
470
+ def set_firebird_env(config)
471
+ ENV["ISC_USER"] = config["username"].to_s if config["username"]
472
+ ENV["ISC_PASSWORD"] = config["password"].to_s if config["password"]
473
+ end
474
+
475
+ def firebird_db_string(config)
476
+ FireRuby::Database.db_string_for(config.symbolize_keys)
477
+ end