activerecord 2.3.18 → 3.2.22

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 (454) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1014 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +222 -0
  5. data/examples/performance.rb +100 -126
  6. data/examples/simple.rb +14 -0
  7. data/lib/active_record/aggregations.rb +93 -99
  8. data/lib/active_record/associations/alias_tracker.rb +76 -0
  9. data/lib/active_record/associations/association.rb +247 -0
  10. data/lib/active_record/associations/association_scope.rb +134 -0
  11. data/lib/active_record/associations/belongs_to_association.rb +54 -61
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +17 -59
  13. data/lib/active_record/associations/builder/association.rb +55 -0
  14. data/lib/active_record/associations/builder/belongs_to.rb +88 -0
  15. data/lib/active_record/associations/builder/collection_association.rb +75 -0
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +57 -0
  17. data/lib/active_record/associations/builder/has_many.rb +71 -0
  18. data/lib/active_record/associations/builder/has_one.rb +62 -0
  19. data/lib/active_record/associations/builder/singular_association.rb +32 -0
  20. data/lib/active_record/associations/collection_association.rb +580 -0
  21. data/lib/active_record/associations/collection_proxy.rb +133 -0
  22. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +39 -119
  23. data/lib/active_record/associations/has_many_association.rb +60 -79
  24. data/lib/active_record/associations/has_many_through_association.rb +127 -206
  25. data/lib/active_record/associations/has_one_association.rb +55 -114
  26. data/lib/active_record/associations/has_one_through_association.rb +25 -26
  27. data/lib/active_record/associations/join_dependency/join_association.rb +159 -0
  28. data/lib/active_record/associations/join_dependency/join_base.rb +24 -0
  29. data/lib/active_record/associations/join_dependency/join_part.rb +78 -0
  30. data/lib/active_record/associations/join_dependency.rb +214 -0
  31. data/lib/active_record/associations/join_helper.rb +55 -0
  32. data/lib/active_record/associations/preloader/association.rb +125 -0
  33. data/lib/active_record/associations/preloader/belongs_to.rb +17 -0
  34. data/lib/active_record/associations/preloader/collection_association.rb +24 -0
  35. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +60 -0
  36. data/lib/active_record/associations/preloader/has_many.rb +17 -0
  37. data/lib/active_record/associations/preloader/has_many_through.rb +15 -0
  38. data/lib/active_record/associations/preloader/has_one.rb +23 -0
  39. data/lib/active_record/associations/preloader/has_one_through.rb +9 -0
  40. data/lib/active_record/associations/preloader/singular_association.rb +21 -0
  41. data/lib/active_record/associations/preloader/through_association.rb +67 -0
  42. data/lib/active_record/associations/preloader.rb +181 -0
  43. data/lib/active_record/associations/singular_association.rb +64 -0
  44. data/lib/active_record/associations/through_association.rb +87 -0
  45. data/lib/active_record/associations.rb +693 -1337
  46. data/lib/active_record/attribute_assignment.rb +221 -0
  47. data/lib/active_record/attribute_methods/before_type_cast.rb +31 -0
  48. data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +32 -0
  49. data/lib/active_record/attribute_methods/dirty.rb +111 -0
  50. data/lib/active_record/attribute_methods/primary_key.rb +114 -0
  51. data/lib/active_record/attribute_methods/query.rb +39 -0
  52. data/lib/active_record/attribute_methods/read.rb +136 -0
  53. data/lib/active_record/attribute_methods/serialization.rb +120 -0
  54. data/lib/active_record/attribute_methods/time_zone_conversion.rb +65 -0
  55. data/lib/active_record/attribute_methods/write.rb +70 -0
  56. data/lib/active_record/attribute_methods.rb +211 -339
  57. data/lib/active_record/autosave_association.rb +179 -149
  58. data/lib/active_record/base.rb +401 -2907
  59. data/lib/active_record/callbacks.rb +91 -176
  60. data/lib/active_record/coders/yaml_column.rb +41 -0
  61. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +236 -119
  62. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +110 -58
  63. data/lib/active_record/connection_adapters/abstract/database_limits.rb +12 -11
  64. data/lib/active_record/connection_adapters/abstract/database_statements.rb +175 -74
  65. data/lib/active_record/connection_adapters/abstract/query_cache.rb +31 -35
  66. data/lib/active_record/connection_adapters/abstract/quoting.rb +71 -21
  67. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +81 -311
  68. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +194 -78
  69. data/lib/active_record/connection_adapters/abstract_adapter.rb +130 -83
  70. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +676 -0
  71. data/lib/active_record/connection_adapters/column.rb +296 -0
  72. data/lib/active_record/connection_adapters/mysql2_adapter.rb +280 -0
  73. data/lib/active_record/connection_adapters/mysql_adapter.rb +272 -493
  74. data/lib/active_record/connection_adapters/postgresql_adapter.rb +650 -405
  75. data/lib/active_record/connection_adapters/schema_cache.rb +69 -0
  76. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +30 -9
  77. data/lib/active_record/connection_adapters/sqlite_adapter.rb +276 -147
  78. data/lib/active_record/connection_adapters/statement_pool.rb +40 -0
  79. data/lib/active_record/counter_cache.rb +123 -0
  80. data/lib/active_record/dynamic_finder_match.rb +41 -14
  81. data/lib/active_record/dynamic_matchers.rb +84 -0
  82. data/lib/active_record/dynamic_scope_match.rb +13 -15
  83. data/lib/active_record/errors.rb +195 -0
  84. data/lib/active_record/explain.rb +86 -0
  85. data/lib/active_record/explain_subscriber.rb +25 -0
  86. data/lib/active_record/fixtures/file.rb +65 -0
  87. data/lib/active_record/fixtures.rb +695 -770
  88. data/lib/active_record/identity_map.rb +162 -0
  89. data/lib/active_record/inheritance.rb +174 -0
  90. data/lib/active_record/integration.rb +60 -0
  91. data/lib/active_record/locale/en.yml +9 -27
  92. data/lib/active_record/locking/optimistic.rb +76 -73
  93. data/lib/active_record/locking/pessimistic.rb +32 -10
  94. data/lib/active_record/log_subscriber.rb +72 -0
  95. data/lib/active_record/migration/command_recorder.rb +105 -0
  96. data/lib/active_record/migration.rb +415 -205
  97. data/lib/active_record/model_schema.rb +368 -0
  98. data/lib/active_record/nested_attributes.rb +153 -63
  99. data/lib/active_record/observer.rb +27 -103
  100. data/lib/active_record/persistence.rb +376 -0
  101. data/lib/active_record/query_cache.rb +49 -8
  102. data/lib/active_record/querying.rb +58 -0
  103. data/lib/active_record/railtie.rb +131 -0
  104. data/lib/active_record/railties/console_sandbox.rb +6 -0
  105. data/lib/active_record/railties/controller_runtime.rb +49 -0
  106. data/lib/active_record/railties/databases.rake +659 -0
  107. data/lib/active_record/railties/jdbcmysql_error.rb +16 -0
  108. data/lib/active_record/readonly_attributes.rb +26 -0
  109. data/lib/active_record/reflection.rb +269 -120
  110. data/lib/active_record/relation/batches.rb +90 -0
  111. data/lib/active_record/relation/calculations.rb +372 -0
  112. data/lib/active_record/relation/delegation.rb +49 -0
  113. data/lib/active_record/relation/finder_methods.rb +402 -0
  114. data/lib/active_record/relation/predicate_builder.rb +63 -0
  115. data/lib/active_record/relation/query_methods.rb +417 -0
  116. data/lib/active_record/relation/spawn_methods.rb +180 -0
  117. data/lib/active_record/relation.rb +537 -0
  118. data/lib/active_record/result.rb +40 -0
  119. data/lib/active_record/sanitization.rb +194 -0
  120. data/lib/active_record/schema.rb +9 -6
  121. data/lib/active_record/schema_dumper.rb +55 -32
  122. data/lib/active_record/scoping/default.rb +142 -0
  123. data/lib/active_record/scoping/named.rb +200 -0
  124. data/lib/active_record/scoping.rb +152 -0
  125. data/lib/active_record/serialization.rb +8 -91
  126. data/lib/active_record/serializers/xml_serializer.rb +43 -197
  127. data/lib/active_record/session_store.rb +129 -103
  128. data/lib/active_record/store.rb +52 -0
  129. data/lib/active_record/test_case.rb +30 -23
  130. data/lib/active_record/timestamp.rb +95 -52
  131. data/lib/active_record/transactions.rb +212 -66
  132. data/lib/active_record/translation.rb +22 -0
  133. data/lib/active_record/validations/associated.rb +43 -0
  134. data/lib/active_record/validations/uniqueness.rb +180 -0
  135. data/lib/active_record/validations.rb +43 -1106
  136. data/lib/active_record/version.rb +5 -4
  137. data/lib/active_record.rb +121 -48
  138. data/lib/rails/generators/active_record/migration/migration_generator.rb +25 -0
  139. data/lib/rails/generators/active_record/migration/templates/migration.rb +34 -0
  140. data/lib/rails/generators/active_record/migration.rb +15 -0
  141. data/lib/rails/generators/active_record/model/model_generator.rb +47 -0
  142. data/lib/rails/generators/active_record/model/templates/migration.rb +15 -0
  143. data/lib/rails/generators/active_record/model/templates/model.rb +12 -0
  144. data/lib/rails/generators/active_record/model/templates/module.rb +7 -0
  145. data/lib/rails/generators/active_record/observer/observer_generator.rb +15 -0
  146. data/lib/rails/generators/active_record/observer/templates/observer.rb +4 -0
  147. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +25 -0
  148. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +12 -0
  149. data/lib/rails/generators/active_record.rb +25 -0
  150. metadata +187 -363
  151. data/CHANGELOG +0 -5904
  152. data/README +0 -351
  153. data/RUNNING_UNIT_TESTS +0 -36
  154. data/Rakefile +0 -268
  155. data/install.rb +0 -30
  156. data/lib/active_record/association_preload.rb +0 -406
  157. data/lib/active_record/associations/association_collection.rb +0 -533
  158. data/lib/active_record/associations/association_proxy.rb +0 -288
  159. data/lib/active_record/batches.rb +0 -85
  160. data/lib/active_record/calculations.rb +0 -321
  161. data/lib/active_record/dirty.rb +0 -183
  162. data/lib/active_record/named_scope.rb +0 -197
  163. data/lib/active_record/serializers/json_serializer.rb +0 -91
  164. data/lib/activerecord.rb +0 -2
  165. data/test/assets/example.log +0 -1
  166. data/test/assets/flowers.jpg +0 -0
  167. data/test/cases/aaa_create_tables_test.rb +0 -24
  168. data/test/cases/active_schema_test_mysql.rb +0 -122
  169. data/test/cases/active_schema_test_postgresql.rb +0 -24
  170. data/test/cases/adapter_test.rb +0 -144
  171. data/test/cases/aggregations_test.rb +0 -167
  172. data/test/cases/ar_schema_test.rb +0 -32
  173. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  174. data/test/cases/associations/callbacks_test.rb +0 -161
  175. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  176. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  177. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  178. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  179. data/test/cases/associations/eager_singularization_test.rb +0 -145
  180. data/test/cases/associations/eager_test.rb +0 -852
  181. data/test/cases/associations/extension_test.rb +0 -62
  182. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  183. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  184. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  185. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  186. data/test/cases/associations/has_one_associations_test.rb +0 -330
  187. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  188. data/test/cases/associations/inner_join_association_test.rb +0 -93
  189. data/test/cases/associations/inverse_associations_test.rb +0 -566
  190. data/test/cases/associations/join_model_test.rb +0 -712
  191. data/test/cases/associations_test.rb +0 -282
  192. data/test/cases/attribute_methods_test.rb +0 -305
  193. data/test/cases/autosave_association_test.rb +0 -1218
  194. data/test/cases/base_test.rb +0 -2166
  195. data/test/cases/batches_test.rb +0 -81
  196. data/test/cases/binary_test.rb +0 -30
  197. data/test/cases/calculations_test.rb +0 -360
  198. data/test/cases/callbacks_observers_test.rb +0 -38
  199. data/test/cases/callbacks_test.rb +0 -438
  200. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  201. data/test/cases/column_alias_test.rb +0 -17
  202. data/test/cases/column_definition_test.rb +0 -70
  203. data/test/cases/connection_pool_test.rb +0 -25
  204. data/test/cases/connection_test_firebird.rb +0 -8
  205. data/test/cases/connection_test_mysql.rb +0 -65
  206. data/test/cases/copy_table_test_sqlite.rb +0 -80
  207. data/test/cases/counter_cache_test.rb +0 -84
  208. data/test/cases/database_statements_test.rb +0 -12
  209. data/test/cases/datatype_test_postgresql.rb +0 -204
  210. data/test/cases/date_time_test.rb +0 -37
  211. data/test/cases/default_test_firebird.rb +0 -16
  212. data/test/cases/defaults_test.rb +0 -111
  213. data/test/cases/deprecated_finder_test.rb +0 -30
  214. data/test/cases/dirty_test.rb +0 -316
  215. data/test/cases/finder_respond_to_test.rb +0 -76
  216. data/test/cases/finder_test.rb +0 -1098
  217. data/test/cases/fixtures_test.rb +0 -661
  218. data/test/cases/helper.rb +0 -68
  219. data/test/cases/i18n_test.rb +0 -46
  220. data/test/cases/inheritance_test.rb +0 -262
  221. data/test/cases/invalid_date_test.rb +0 -24
  222. data/test/cases/json_serialization_test.rb +0 -219
  223. data/test/cases/lifecycle_test.rb +0 -193
  224. data/test/cases/locking_test.rb +0 -350
  225. data/test/cases/method_scoping_test.rb +0 -704
  226. data/test/cases/migration_test.rb +0 -1649
  227. data/test/cases/migration_test_firebird.rb +0 -124
  228. data/test/cases/mixin_test.rb +0 -96
  229. data/test/cases/modules_test.rb +0 -109
  230. data/test/cases/multiple_db_test.rb +0 -85
  231. data/test/cases/named_scope_test.rb +0 -372
  232. data/test/cases/nested_attributes_test.rb +0 -840
  233. data/test/cases/pk_test.rb +0 -119
  234. data/test/cases/pooled_connections_test.rb +0 -103
  235. data/test/cases/query_cache_test.rb +0 -129
  236. data/test/cases/readonly_test.rb +0 -107
  237. data/test/cases/reflection_test.rb +0 -234
  238. data/test/cases/reload_models_test.rb +0 -22
  239. data/test/cases/repair_helper.rb +0 -50
  240. data/test/cases/reserved_word_test_mysql.rb +0 -176
  241. data/test/cases/sanitize_test.rb +0 -25
  242. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  243. data/test/cases/schema_dumper_test.rb +0 -211
  244. data/test/cases/schema_test_postgresql.rb +0 -178
  245. data/test/cases/serialization_test.rb +0 -47
  246. data/test/cases/sp_test_mysql.rb +0 -16
  247. data/test/cases/synonym_test_oracle.rb +0 -17
  248. data/test/cases/timestamp_test.rb +0 -75
  249. data/test/cases/transactions_test.rb +0 -543
  250. data/test/cases/unconnected_test.rb +0 -32
  251. data/test/cases/validations_i18n_test.rb +0 -925
  252. data/test/cases/validations_test.rb +0 -1684
  253. data/test/cases/xml_serialization_test.rb +0 -240
  254. data/test/cases/yaml_serialization_test.rb +0 -11
  255. data/test/config.rb +0 -5
  256. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  257. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  258. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  259. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  260. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  261. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  262. data/test/connections/native_db2/connection.rb +0 -25
  263. data/test/connections/native_firebird/connection.rb +0 -26
  264. data/test/connections/native_frontbase/connection.rb +0 -27
  265. data/test/connections/native_mysql/connection.rb +0 -25
  266. data/test/connections/native_openbase/connection.rb +0 -21
  267. data/test/connections/native_oracle/connection.rb +0 -27
  268. data/test/connections/native_postgresql/connection.rb +0 -21
  269. data/test/connections/native_sqlite/connection.rb +0 -25
  270. data/test/connections/native_sqlite3/connection.rb +0 -25
  271. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  272. data/test/connections/native_sybase/connection.rb +0 -23
  273. data/test/fixtures/accounts.yml +0 -29
  274. data/test/fixtures/all/developers.yml +0 -0
  275. data/test/fixtures/all/people.csv +0 -0
  276. data/test/fixtures/all/tasks.yml +0 -0
  277. data/test/fixtures/author_addresses.yml +0 -5
  278. data/test/fixtures/author_favorites.yml +0 -4
  279. data/test/fixtures/authors.yml +0 -9
  280. data/test/fixtures/binaries.yml +0 -132
  281. data/test/fixtures/books.yml +0 -7
  282. data/test/fixtures/categories/special_categories.yml +0 -9
  283. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  284. data/test/fixtures/categories.yml +0 -14
  285. data/test/fixtures/categories_ordered.yml +0 -7
  286. data/test/fixtures/categories_posts.yml +0 -23
  287. data/test/fixtures/categorizations.yml +0 -17
  288. data/test/fixtures/clubs.yml +0 -6
  289. data/test/fixtures/comments.yml +0 -59
  290. data/test/fixtures/companies.yml +0 -56
  291. data/test/fixtures/computers.yml +0 -4
  292. data/test/fixtures/courses.yml +0 -7
  293. data/test/fixtures/customers.yml +0 -26
  294. data/test/fixtures/developers.yml +0 -21
  295. data/test/fixtures/developers_projects.yml +0 -17
  296. data/test/fixtures/edges.yml +0 -6
  297. data/test/fixtures/entrants.yml +0 -14
  298. data/test/fixtures/faces.yml +0 -11
  299. data/test/fixtures/fk_test_has_fk.yml +0 -3
  300. data/test/fixtures/fk_test_has_pk.yml +0 -2
  301. data/test/fixtures/funny_jokes.yml +0 -10
  302. data/test/fixtures/interests.yml +0 -33
  303. data/test/fixtures/items.yml +0 -4
  304. data/test/fixtures/jobs.yml +0 -7
  305. data/test/fixtures/legacy_things.yml +0 -3
  306. data/test/fixtures/mateys.yml +0 -4
  307. data/test/fixtures/member_types.yml +0 -6
  308. data/test/fixtures/members.yml +0 -6
  309. data/test/fixtures/memberships.yml +0 -20
  310. data/test/fixtures/men.yml +0 -5
  311. data/test/fixtures/minimalistics.yml +0 -2
  312. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  313. data/test/fixtures/mixins.yml +0 -29
  314. data/test/fixtures/movies.yml +0 -7
  315. data/test/fixtures/naked/csv/accounts.csv +0 -1
  316. data/test/fixtures/naked/yml/accounts.yml +0 -1
  317. data/test/fixtures/naked/yml/companies.yml +0 -1
  318. data/test/fixtures/naked/yml/courses.yml +0 -1
  319. data/test/fixtures/organizations.yml +0 -5
  320. data/test/fixtures/owners.yml +0 -7
  321. data/test/fixtures/parrots.yml +0 -27
  322. data/test/fixtures/parrots_pirates.yml +0 -7
  323. data/test/fixtures/people.yml +0 -15
  324. data/test/fixtures/pets.yml +0 -14
  325. data/test/fixtures/pirates.yml +0 -9
  326. data/test/fixtures/polymorphic_designs.yml +0 -19
  327. data/test/fixtures/polymorphic_prices.yml +0 -19
  328. data/test/fixtures/posts.yml +0 -52
  329. data/test/fixtures/price_estimates.yml +0 -7
  330. data/test/fixtures/projects.yml +0 -7
  331. data/test/fixtures/readers.yml +0 -9
  332. data/test/fixtures/references.yml +0 -17
  333. data/test/fixtures/reserved_words/distinct.yml +0 -5
  334. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  335. data/test/fixtures/reserved_words/group.yml +0 -14
  336. data/test/fixtures/reserved_words/select.yml +0 -8
  337. data/test/fixtures/reserved_words/values.yml +0 -7
  338. data/test/fixtures/ships.yml +0 -5
  339. data/test/fixtures/sponsors.yml +0 -9
  340. data/test/fixtures/subscribers.yml +0 -7
  341. data/test/fixtures/subscriptions.yml +0 -12
  342. data/test/fixtures/taggings.yml +0 -28
  343. data/test/fixtures/tags.yml +0 -7
  344. data/test/fixtures/tasks.yml +0 -7
  345. data/test/fixtures/tees.yml +0 -4
  346. data/test/fixtures/ties.yml +0 -4
  347. data/test/fixtures/topics.yml +0 -42
  348. data/test/fixtures/toys.yml +0 -4
  349. data/test/fixtures/treasures.yml +0 -10
  350. data/test/fixtures/vertices.yml +0 -4
  351. data/test/fixtures/warehouse-things.yml +0 -3
  352. data/test/fixtures/zines.yml +0 -5
  353. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  354. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  355. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  356. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  357. data/test/migrations/duplicate/3_foo.rb +0 -7
  358. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  359. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  360. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  361. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  362. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  363. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  364. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  365. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  366. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  367. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  368. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  369. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  370. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  371. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  372. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  373. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  374. data/test/models/author.rb +0 -151
  375. data/test/models/auto_id.rb +0 -4
  376. data/test/models/binary.rb +0 -2
  377. data/test/models/bird.rb +0 -9
  378. data/test/models/book.rb +0 -4
  379. data/test/models/categorization.rb +0 -5
  380. data/test/models/category.rb +0 -34
  381. data/test/models/citation.rb +0 -6
  382. data/test/models/club.rb +0 -13
  383. data/test/models/column_name.rb +0 -3
  384. data/test/models/comment.rb +0 -29
  385. data/test/models/company.rb +0 -173
  386. data/test/models/company_in_module.rb +0 -78
  387. data/test/models/computer.rb +0 -3
  388. data/test/models/contact.rb +0 -16
  389. data/test/models/contract.rb +0 -5
  390. data/test/models/course.rb +0 -3
  391. data/test/models/customer.rb +0 -73
  392. data/test/models/default.rb +0 -2
  393. data/test/models/developer.rb +0 -101
  394. data/test/models/edge.rb +0 -5
  395. data/test/models/entrant.rb +0 -3
  396. data/test/models/essay.rb +0 -3
  397. data/test/models/event.rb +0 -3
  398. data/test/models/event_author.rb +0 -8
  399. data/test/models/face.rb +0 -7
  400. data/test/models/guid.rb +0 -2
  401. data/test/models/interest.rb +0 -5
  402. data/test/models/invoice.rb +0 -4
  403. data/test/models/item.rb +0 -7
  404. data/test/models/job.rb +0 -5
  405. data/test/models/joke.rb +0 -3
  406. data/test/models/keyboard.rb +0 -3
  407. data/test/models/legacy_thing.rb +0 -3
  408. data/test/models/line_item.rb +0 -3
  409. data/test/models/man.rb +0 -9
  410. data/test/models/matey.rb +0 -4
  411. data/test/models/member.rb +0 -12
  412. data/test/models/member_detail.rb +0 -5
  413. data/test/models/member_type.rb +0 -3
  414. data/test/models/membership.rb +0 -9
  415. data/test/models/minimalistic.rb +0 -2
  416. data/test/models/mixed_case_monkey.rb +0 -3
  417. data/test/models/movie.rb +0 -5
  418. data/test/models/order.rb +0 -4
  419. data/test/models/organization.rb +0 -6
  420. data/test/models/owner.rb +0 -5
  421. data/test/models/parrot.rb +0 -22
  422. data/test/models/person.rb +0 -16
  423. data/test/models/pet.rb +0 -5
  424. data/test/models/pirate.rb +0 -80
  425. data/test/models/polymorphic_design.rb +0 -3
  426. data/test/models/polymorphic_price.rb +0 -3
  427. data/test/models/post.rb +0 -102
  428. data/test/models/price_estimate.rb +0 -3
  429. data/test/models/project.rb +0 -30
  430. data/test/models/reader.rb +0 -4
  431. data/test/models/reference.rb +0 -4
  432. data/test/models/reply.rb +0 -46
  433. data/test/models/ship.rb +0 -19
  434. data/test/models/ship_part.rb +0 -7
  435. data/test/models/sponsor.rb +0 -4
  436. data/test/models/subject.rb +0 -4
  437. data/test/models/subscriber.rb +0 -8
  438. data/test/models/subscription.rb +0 -4
  439. data/test/models/tag.rb +0 -7
  440. data/test/models/tagging.rb +0 -10
  441. data/test/models/task.rb +0 -3
  442. data/test/models/tee.rb +0 -4
  443. data/test/models/tie.rb +0 -4
  444. data/test/models/topic.rb +0 -80
  445. data/test/models/toy.rb +0 -6
  446. data/test/models/treasure.rb +0 -8
  447. data/test/models/vertex.rb +0 -9
  448. data/test/models/warehouse_thing.rb +0 -5
  449. data/test/models/zine.rb +0 -3
  450. data/test/schema/mysql_specific_schema.rb +0 -31
  451. data/test/schema/postgresql_specific_schema.rb +0 -114
  452. data/test/schema/schema.rb +0 -550
  453. data/test/schema/schema2.rb +0 -6
  454. data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -0,0 +1,659 @@
1
+ require 'active_support/core_ext/object/inclusion'
2
+ require 'active_record'
3
+
4
+ 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
+ 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
33
+ end
34
+
35
+ namespace :create do
36
+ # desc 'Create all the local databases defined in config/database.yml'
37
+ 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
54
+ end
55
+ end
56
+
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
65
+ end
66
+
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
81
+ end
82
+ end
83
+
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
155
+ end
156
+
157
+ namespace :drop do
158
+ # desc 'Drops all the local databases defined in config/database.yml'
159
+ 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
170
+ end
171
+ end
172
+
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
180
+ end
181
+
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)."
191
+ 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
196
+ db_namespace['_dump'].invoke
197
+ end
198
+
199
+ 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}"
205
+ end
206
+ # Allow this task to be called as many times as required. An example is the
207
+ # migrate:redo task, which calls other two internally that depend on this one.
208
+ db_namespace['_dump'].reenable
209
+ end
210
+
211
+ namespace :migrate do
212
+ # desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
213
+ task :redo => [:environment, :load_config] do
214
+ if ENV['VERSION']
215
+ db_namespace['migrate:down'].invoke
216
+ db_namespace['migrate:up'].invoke
217
+ else
218
+ db_namespace['rollback'].invoke
219
+ db_namespace['migrate'].invoke
220
+ end
221
+ end
222
+
223
+ # desc 'Resets your database using your migrations for the current environment'
224
+ task :reset => ['db:drop', 'db:create', 'db:migrate']
225
+
226
+ # desc 'Runs the "up" for a given migration VERSION.'
227
+ task :up => [:environment, :load_config] do
228
+ version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
229
+ raise 'VERSION is required' unless version
230
+ ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, version)
231
+ db_namespace['_dump'].invoke
232
+ end
233
+
234
+ # desc 'Runs the "down" for a given migration VERSION.'
235
+ task :down => [:environment, :load_config] do
236
+ version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
237
+ raise 'VERSION is required' unless version
238
+ ActiveRecord::Migrator.run(:down, ActiveRecord::Migrator.migrations_paths, version)
239
+ db_namespace['_dump'].invoke
240
+ end
241
+
242
+ desc 'Display status of migrations'
243
+ 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 **********']
261
+ end
262
+ # output
263
+ puts "\ndatabase: #{ActiveRecord::Base.connection_config[:database]}\n\n"
264
+ puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
265
+ 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]}"
268
+ end
269
+ puts
270
+ end
271
+ end
272
+
273
+ desc 'Rolls the schema back to the previous version (specify steps w/ STEP=n).'
274
+ task :rollback => [:environment, :load_config] do
275
+ step = ENV['STEP'] ? ENV['STEP'].to_i : 1
276
+ ActiveRecord::Migrator.rollback(ActiveRecord::Migrator.migrations_paths, step)
277
+ db_namespace['_dump'].invoke
278
+ end
279
+
280
+ # desc 'Pushes the schema to the next version (specify steps w/ STEP=n).'
281
+ task :forward => [:environment, :load_config] do
282
+ step = ENV['STEP'] ? ENV['STEP'].to_i : 1
283
+ ActiveRecord::Migrator.forward(ActiveRecord::Migrator.migrations_paths, step)
284
+ db_namespace['_dump'].invoke
285
+ end
286
+
287
+ # desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
288
+ task :reset => [:environment, :load_config] do
289
+ db_namespace["drop"].invoke
290
+ db_namespace["setup"].invoke
291
+ end
292
+
293
+ # desc "Retrieves the charset for the current environment's database"
294
+ 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
309
+ end
310
+
311
+ # desc "Retrieves the collation for the current environment's database"
312
+ 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'
320
+ end
321
+ end
322
+
323
+ desc 'Retrieves the current schema version number'
324
+ task :version => [:environment, :load_config] do
325
+ puts "Current version: #{ActiveRecord::Migrator.current_version}"
326
+ end
327
+
328
+ # 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
331
+
332
+ if pending_migrations.any?
333
+ puts "You have #{pending_migrations.size} pending migrations:"
334
+ pending_migrations.each do |pending_migration|
335
+ puts ' %4d %s' % [pending_migration.version, pending_migration.name]
336
+ end
337
+ abort %{Run `rake db:migrate` to update your database then try again.}
338
+ end
339
+ end
340
+
341
+ desc 'Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the db first)'
342
+ task :setup => ['db:schema:load_if_ruby', 'db:structure:load_if_sql', :seed]
343
+
344
+ desc 'Load the seed data from db/seeds.rb'
345
+ task :seed do
346
+ db_namespace['abort_if_pending_migrations'].invoke
347
+ Rails.application.load_seed
348
+ end
349
+
350
+ namespace :fixtures do
351
+ 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."
352
+ task :load => [:environment, :load_config] do
353
+ require 'active_record/fixtures'
354
+
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
357
+
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
361
+ end
362
+
363
+ # desc "Search for a fixture given a LABEL or ID. Specify an alternative path (eg. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
364
+ task :identify => [:environment, :load_config] do
365
+ require 'active_record/fixtures'
366
+
367
+ label, id = ENV['LABEL'], ENV['ID']
368
+ raise 'LABEL or ID required' if label.blank? && id.blank?
369
+
370
+ puts %Q(The fixture ID for "#{label}" is #{ActiveRecord::Fixtures.identify(label)}.) if label
371
+
372
+ base_dir = ENV['FIXTURES_PATH'] ? File.join(Rails.root, ENV['FIXTURES_PATH']) : File.join(Rails.root, 'test', 'fixtures')
373
+ Dir["#{base_dir}/**/*.yml"].each do |file|
374
+ if data = YAML::load(ERB.new(IO.read(file)).result)
375
+ data.keys.each do |key|
376
+ key_id = ActiveRecord::Fixtures.identify(key)
377
+
378
+ if key == label || key_id == id.to_i
379
+ puts "#{file}: #{key} (#{key_id})"
380
+ end
381
+ end
382
+ end
383
+ end
384
+ end
385
+ end
386
+
387
+ namespace :schema do
388
+ desc 'Create a db/schema.rb file that can be portably used against any DB supported by AR'
389
+ task :dump => [:environment, :load_config] do
390
+ require 'active_record/schema_dumper'
391
+ filename = ENV['SCHEMA'] || "#{Rails.root}/db/schema.rb"
392
+ File.open(filename, "w:utf-8") do |file|
393
+ ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
394
+ end
395
+ db_namespace['schema:dump'].reenable
396
+ end
397
+
398
+ desc 'Load a schema.rb file into the database'
399
+ 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
406
+ end
407
+
408
+ task :load_if_ruby => ['db:create', :environment] do
409
+ db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :ruby
410
+ end
411
+ end
412
+
413
+ namespace :structure do
414
+ desc 'Dump the database structure to db/structure.sql. Specify another file with DB_STRUCTURE=db/my_structure.sql'
415
+ 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(" ")
427
+ 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
+ end
447
+ db_namespace['structure:dump'].reenable
448
+ end
449
+
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
481
+ end
482
+
483
+ task :load_if_sql => ['db:create', :environment] do
484
+ db_namespace["structure:load"].invoke if ActiveRecord::Base.schema_format == :sql
485
+ end
486
+ end
487
+
488
+ namespace :test do
489
+
490
+ # desc "Recreate the test database from the current schema"
491
+ task :load => 'db:test:purge' do
492
+ case ActiveRecord::Base.schema_format
493
+ when :ruby
494
+ db_namespace["test:load_schema"].invoke
495
+ when :sql
496
+ db_namespace["test:load_structure"].invoke
497
+ end
498
+ end
499
+
500
+ # desc "Recreate the test database from an existent structure.sql file"
501
+ task :load_structure => 'db:test:purge' do
502
+ begin
503
+ current_config(:config => ActiveRecord::Base.configurations['test'])
504
+ db_namespace["structure:load"].invoke
505
+ ensure
506
+ current_config(:config => nil)
507
+ end
508
+ end
509
+
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
515
+ end
516
+
517
+ # desc "Recreate the test database from a fresh schema.rb file"
518
+ task :clone => %w(db:schema:dump db:test:load_schema)
519
+
520
+ # desc "Recreate the test database from a fresh structure.sql file"
521
+ task :clone_structure => [ "db:structure:dump", "db:test:load_structure" ]
522
+
523
+ # 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
554
+ end
555
+
556
+ # desc 'Check for pending migrations and load the test schema'
557
+ task :prepare => 'db:abort_if_pending_migrations' do
558
+ unless ActiveRecord::Base.configurations.blank?
559
+ db_namespace[{ :sql => 'test:clone_structure', :ruby => 'test:load' }[ActiveRecord::Base.schema_format]].invoke
560
+ end
561
+ end
562
+ 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
+ end
579
+
580
+ namespace :railties do
581
+ namespace :install do
582
+ # desc "Copies missing migrations from Railties (e.g. plugins, engines). You can specify Railties to use with FROM=railtie1,railtie2"
583
+ task :migrations => :'db:load_config' do
584
+ 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|
587
+ next unless to_load == :all || to_load.include?(railtie.railtie_name)
588
+
589
+ if railtie.respond_to?(:paths) && (path = railtie.paths['db/migrate'].first)
590
+ railties[railtie.railtie_name] = path
591
+ end
592
+ end
593
+
594
+ on_skip = Proc.new do |name, migration|
595
+ puts "NOTE: Migration #{migration.basename} from #{name} has been skipped. Migration with the same name already exists."
596
+ end
597
+
598
+ on_copy = Proc.new do |name, migration, old_path|
599
+ puts "Copied migration #{migration.basename} from #{name}"
600
+ end
601
+
602
+ ActiveRecord::Migration.copy(ActiveRecord::Migrator.migrations_paths.first, railties,
603
+ :on_skip => on_skip, :on_copy => on_copy)
604
+ end
605
+ end
606
+ 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
@@ -0,0 +1,16 @@
1
+ #FIXME Remove if ArJdbcMysql will give.
2
+ module ArJdbcMySQL #:nodoc:
3
+ class Error < StandardError
4
+ attr_accessor :error_number, :sql_state
5
+
6
+ def initialize msg
7
+ super
8
+ @error_number = nil
9
+ @sql_state = nil
10
+ end
11
+
12
+ # Mysql gem compatibility
13
+ alias_method :errno, :error_number
14
+ alias_method :error, :message
15
+ end
16
+ end