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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +1014 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +222 -0
- data/examples/performance.rb +100 -126
- data/examples/simple.rb +14 -0
- data/lib/active_record/aggregations.rb +93 -99
- data/lib/active_record/associations/alias_tracker.rb +76 -0
- data/lib/active_record/associations/association.rb +247 -0
- data/lib/active_record/associations/association_scope.rb +134 -0
- data/lib/active_record/associations/belongs_to_association.rb +54 -61
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +17 -59
- data/lib/active_record/associations/builder/association.rb +55 -0
- data/lib/active_record/associations/builder/belongs_to.rb +88 -0
- data/lib/active_record/associations/builder/collection_association.rb +75 -0
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +57 -0
- data/lib/active_record/associations/builder/has_many.rb +71 -0
- data/lib/active_record/associations/builder/has_one.rb +62 -0
- data/lib/active_record/associations/builder/singular_association.rb +32 -0
- data/lib/active_record/associations/collection_association.rb +580 -0
- data/lib/active_record/associations/collection_proxy.rb +133 -0
- data/lib/active_record/associations/has_and_belongs_to_many_association.rb +39 -119
- data/lib/active_record/associations/has_many_association.rb +60 -79
- data/lib/active_record/associations/has_many_through_association.rb +127 -206
- data/lib/active_record/associations/has_one_association.rb +55 -114
- data/lib/active_record/associations/has_one_through_association.rb +25 -26
- data/lib/active_record/associations/join_dependency/join_association.rb +159 -0
- data/lib/active_record/associations/join_dependency/join_base.rb +24 -0
- data/lib/active_record/associations/join_dependency/join_part.rb +78 -0
- data/lib/active_record/associations/join_dependency.rb +214 -0
- data/lib/active_record/associations/join_helper.rb +55 -0
- data/lib/active_record/associations/preloader/association.rb +125 -0
- data/lib/active_record/associations/preloader/belongs_to.rb +17 -0
- data/lib/active_record/associations/preloader/collection_association.rb +24 -0
- data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +60 -0
- data/lib/active_record/associations/preloader/has_many.rb +17 -0
- data/lib/active_record/associations/preloader/has_many_through.rb +15 -0
- data/lib/active_record/associations/preloader/has_one.rb +23 -0
- data/lib/active_record/associations/preloader/has_one_through.rb +9 -0
- data/lib/active_record/associations/preloader/singular_association.rb +21 -0
- data/lib/active_record/associations/preloader/through_association.rb +67 -0
- data/lib/active_record/associations/preloader.rb +181 -0
- data/lib/active_record/associations/singular_association.rb +64 -0
- data/lib/active_record/associations/through_association.rb +87 -0
- data/lib/active_record/associations.rb +693 -1337
- data/lib/active_record/attribute_assignment.rb +221 -0
- data/lib/active_record/attribute_methods/before_type_cast.rb +31 -0
- data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +32 -0
- data/lib/active_record/attribute_methods/dirty.rb +111 -0
- data/lib/active_record/attribute_methods/primary_key.rb +114 -0
- data/lib/active_record/attribute_methods/query.rb +39 -0
- data/lib/active_record/attribute_methods/read.rb +136 -0
- data/lib/active_record/attribute_methods/serialization.rb +120 -0
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +65 -0
- data/lib/active_record/attribute_methods/write.rb +70 -0
- data/lib/active_record/attribute_methods.rb +211 -339
- data/lib/active_record/autosave_association.rb +179 -149
- data/lib/active_record/base.rb +401 -2907
- data/lib/active_record/callbacks.rb +91 -176
- data/lib/active_record/coders/yaml_column.rb +41 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +236 -119
- data/lib/active_record/connection_adapters/abstract/connection_specification.rb +110 -58
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +12 -11
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +175 -74
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +31 -35
- data/lib/active_record/connection_adapters/abstract/quoting.rb +71 -21
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +81 -311
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +194 -78
- data/lib/active_record/connection_adapters/abstract_adapter.rb +130 -83
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +676 -0
- data/lib/active_record/connection_adapters/column.rb +296 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +280 -0
- data/lib/active_record/connection_adapters/mysql_adapter.rb +272 -493
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +650 -405
- data/lib/active_record/connection_adapters/schema_cache.rb +69 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +30 -9
- data/lib/active_record/connection_adapters/sqlite_adapter.rb +276 -147
- data/lib/active_record/connection_adapters/statement_pool.rb +40 -0
- data/lib/active_record/counter_cache.rb +123 -0
- data/lib/active_record/dynamic_finder_match.rb +41 -14
- data/lib/active_record/dynamic_matchers.rb +84 -0
- data/lib/active_record/dynamic_scope_match.rb +13 -15
- data/lib/active_record/errors.rb +195 -0
- data/lib/active_record/explain.rb +86 -0
- data/lib/active_record/explain_subscriber.rb +25 -0
- data/lib/active_record/fixtures/file.rb +65 -0
- data/lib/active_record/fixtures.rb +695 -770
- data/lib/active_record/identity_map.rb +162 -0
- data/lib/active_record/inheritance.rb +174 -0
- data/lib/active_record/integration.rb +60 -0
- data/lib/active_record/locale/en.yml +9 -27
- data/lib/active_record/locking/optimistic.rb +76 -73
- data/lib/active_record/locking/pessimistic.rb +32 -10
- data/lib/active_record/log_subscriber.rb +72 -0
- data/lib/active_record/migration/command_recorder.rb +105 -0
- data/lib/active_record/migration.rb +415 -205
- data/lib/active_record/model_schema.rb +368 -0
- data/lib/active_record/nested_attributes.rb +153 -63
- data/lib/active_record/observer.rb +27 -103
- data/lib/active_record/persistence.rb +376 -0
- data/lib/active_record/query_cache.rb +49 -8
- data/lib/active_record/querying.rb +58 -0
- data/lib/active_record/railtie.rb +131 -0
- data/lib/active_record/railties/console_sandbox.rb +6 -0
- data/lib/active_record/railties/controller_runtime.rb +49 -0
- data/lib/active_record/railties/databases.rake +659 -0
- data/lib/active_record/railties/jdbcmysql_error.rb +16 -0
- data/lib/active_record/readonly_attributes.rb +26 -0
- data/lib/active_record/reflection.rb +269 -120
- data/lib/active_record/relation/batches.rb +90 -0
- data/lib/active_record/relation/calculations.rb +372 -0
- data/lib/active_record/relation/delegation.rb +49 -0
- data/lib/active_record/relation/finder_methods.rb +402 -0
- data/lib/active_record/relation/predicate_builder.rb +63 -0
- data/lib/active_record/relation/query_methods.rb +417 -0
- data/lib/active_record/relation/spawn_methods.rb +180 -0
- data/lib/active_record/relation.rb +537 -0
- data/lib/active_record/result.rb +40 -0
- data/lib/active_record/sanitization.rb +194 -0
- data/lib/active_record/schema.rb +9 -6
- data/lib/active_record/schema_dumper.rb +55 -32
- data/lib/active_record/scoping/default.rb +142 -0
- data/lib/active_record/scoping/named.rb +200 -0
- data/lib/active_record/scoping.rb +152 -0
- data/lib/active_record/serialization.rb +8 -91
- data/lib/active_record/serializers/xml_serializer.rb +43 -197
- data/lib/active_record/session_store.rb +129 -103
- data/lib/active_record/store.rb +52 -0
- data/lib/active_record/test_case.rb +30 -23
- data/lib/active_record/timestamp.rb +95 -52
- data/lib/active_record/transactions.rb +212 -66
- data/lib/active_record/translation.rb +22 -0
- data/lib/active_record/validations/associated.rb +43 -0
- data/lib/active_record/validations/uniqueness.rb +180 -0
- data/lib/active_record/validations.rb +43 -1106
- data/lib/active_record/version.rb +5 -4
- data/lib/active_record.rb +121 -48
- data/lib/rails/generators/active_record/migration/migration_generator.rb +25 -0
- data/lib/rails/generators/active_record/migration/templates/migration.rb +34 -0
- data/lib/rails/generators/active_record/migration.rb +15 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +47 -0
- data/lib/rails/generators/active_record/model/templates/migration.rb +15 -0
- data/lib/rails/generators/active_record/model/templates/model.rb +12 -0
- data/lib/rails/generators/active_record/model/templates/module.rb +7 -0
- data/lib/rails/generators/active_record/observer/observer_generator.rb +15 -0
- data/lib/rails/generators/active_record/observer/templates/observer.rb +4 -0
- data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +25 -0
- data/lib/rails/generators/active_record/session_migration/templates/migration.rb +12 -0
- data/lib/rails/generators/active_record.rb +25 -0
- metadata +187 -363
- data/CHANGELOG +0 -5904
- data/README +0 -351
- data/RUNNING_UNIT_TESTS +0 -36
- data/Rakefile +0 -268
- data/install.rb +0 -30
- data/lib/active_record/association_preload.rb +0 -406
- data/lib/active_record/associations/association_collection.rb +0 -533
- data/lib/active_record/associations/association_proxy.rb +0 -288
- data/lib/active_record/batches.rb +0 -85
- data/lib/active_record/calculations.rb +0 -321
- data/lib/active_record/dirty.rb +0 -183
- data/lib/active_record/named_scope.rb +0 -197
- data/lib/active_record/serializers/json_serializer.rb +0 -91
- data/lib/activerecord.rb +0 -2
- data/test/assets/example.log +0 -1
- data/test/assets/flowers.jpg +0 -0
- data/test/cases/aaa_create_tables_test.rb +0 -24
- data/test/cases/active_schema_test_mysql.rb +0 -122
- data/test/cases/active_schema_test_postgresql.rb +0 -24
- data/test/cases/adapter_test.rb +0 -144
- data/test/cases/aggregations_test.rb +0 -167
- data/test/cases/ar_schema_test.rb +0 -32
- data/test/cases/associations/belongs_to_associations_test.rb +0 -438
- data/test/cases/associations/callbacks_test.rb +0 -161
- data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
- data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
- data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
- data/test/cases/associations/eager_singularization_test.rb +0 -145
- data/test/cases/associations/eager_test.rb +0 -852
- data/test/cases/associations/extension_test.rb +0 -62
- data/test/cases/associations/habtm_join_table_test.rb +0 -56
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
- data/test/cases/associations/has_many_associations_test.rb +0 -1273
- data/test/cases/associations/has_many_through_associations_test.rb +0 -360
- data/test/cases/associations/has_one_associations_test.rb +0 -330
- data/test/cases/associations/has_one_through_associations_test.rb +0 -209
- data/test/cases/associations/inner_join_association_test.rb +0 -93
- data/test/cases/associations/inverse_associations_test.rb +0 -566
- data/test/cases/associations/join_model_test.rb +0 -712
- data/test/cases/associations_test.rb +0 -282
- data/test/cases/attribute_methods_test.rb +0 -305
- data/test/cases/autosave_association_test.rb +0 -1218
- data/test/cases/base_test.rb +0 -2166
- data/test/cases/batches_test.rb +0 -81
- data/test/cases/binary_test.rb +0 -30
- data/test/cases/calculations_test.rb +0 -360
- data/test/cases/callbacks_observers_test.rb +0 -38
- data/test/cases/callbacks_test.rb +0 -438
- data/test/cases/class_inheritable_attributes_test.rb +0 -32
- data/test/cases/column_alias_test.rb +0 -17
- data/test/cases/column_definition_test.rb +0 -70
- data/test/cases/connection_pool_test.rb +0 -25
- data/test/cases/connection_test_firebird.rb +0 -8
- data/test/cases/connection_test_mysql.rb +0 -65
- data/test/cases/copy_table_test_sqlite.rb +0 -80
- data/test/cases/counter_cache_test.rb +0 -84
- data/test/cases/database_statements_test.rb +0 -12
- data/test/cases/datatype_test_postgresql.rb +0 -204
- data/test/cases/date_time_test.rb +0 -37
- data/test/cases/default_test_firebird.rb +0 -16
- data/test/cases/defaults_test.rb +0 -111
- data/test/cases/deprecated_finder_test.rb +0 -30
- data/test/cases/dirty_test.rb +0 -316
- data/test/cases/finder_respond_to_test.rb +0 -76
- data/test/cases/finder_test.rb +0 -1098
- data/test/cases/fixtures_test.rb +0 -661
- data/test/cases/helper.rb +0 -68
- data/test/cases/i18n_test.rb +0 -46
- data/test/cases/inheritance_test.rb +0 -262
- data/test/cases/invalid_date_test.rb +0 -24
- data/test/cases/json_serialization_test.rb +0 -219
- data/test/cases/lifecycle_test.rb +0 -193
- data/test/cases/locking_test.rb +0 -350
- data/test/cases/method_scoping_test.rb +0 -704
- data/test/cases/migration_test.rb +0 -1649
- data/test/cases/migration_test_firebird.rb +0 -124
- data/test/cases/mixin_test.rb +0 -96
- data/test/cases/modules_test.rb +0 -109
- data/test/cases/multiple_db_test.rb +0 -85
- data/test/cases/named_scope_test.rb +0 -372
- data/test/cases/nested_attributes_test.rb +0 -840
- data/test/cases/pk_test.rb +0 -119
- data/test/cases/pooled_connections_test.rb +0 -103
- data/test/cases/query_cache_test.rb +0 -129
- data/test/cases/readonly_test.rb +0 -107
- data/test/cases/reflection_test.rb +0 -234
- data/test/cases/reload_models_test.rb +0 -22
- data/test/cases/repair_helper.rb +0 -50
- data/test/cases/reserved_word_test_mysql.rb +0 -176
- data/test/cases/sanitize_test.rb +0 -25
- data/test/cases/schema_authorization_test_postgresql.rb +0 -75
- data/test/cases/schema_dumper_test.rb +0 -211
- data/test/cases/schema_test_postgresql.rb +0 -178
- data/test/cases/serialization_test.rb +0 -47
- data/test/cases/sp_test_mysql.rb +0 -16
- data/test/cases/synonym_test_oracle.rb +0 -17
- data/test/cases/timestamp_test.rb +0 -75
- data/test/cases/transactions_test.rb +0 -543
- data/test/cases/unconnected_test.rb +0 -32
- data/test/cases/validations_i18n_test.rb +0 -925
- data/test/cases/validations_test.rb +0 -1684
- data/test/cases/xml_serialization_test.rb +0 -240
- data/test/cases/yaml_serialization_test.rb +0 -11
- data/test/config.rb +0 -5
- data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
- data/test/connections/jdbc_jdbch2/connection.rb +0 -18
- data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
- data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
- data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
- data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
- data/test/connections/native_db2/connection.rb +0 -25
- data/test/connections/native_firebird/connection.rb +0 -26
- data/test/connections/native_frontbase/connection.rb +0 -27
- data/test/connections/native_mysql/connection.rb +0 -25
- data/test/connections/native_openbase/connection.rb +0 -21
- data/test/connections/native_oracle/connection.rb +0 -27
- data/test/connections/native_postgresql/connection.rb +0 -21
- data/test/connections/native_sqlite/connection.rb +0 -25
- data/test/connections/native_sqlite3/connection.rb +0 -25
- data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
- data/test/connections/native_sybase/connection.rb +0 -23
- data/test/fixtures/accounts.yml +0 -29
- data/test/fixtures/all/developers.yml +0 -0
- data/test/fixtures/all/people.csv +0 -0
- data/test/fixtures/all/tasks.yml +0 -0
- data/test/fixtures/author_addresses.yml +0 -5
- data/test/fixtures/author_favorites.yml +0 -4
- data/test/fixtures/authors.yml +0 -9
- data/test/fixtures/binaries.yml +0 -132
- data/test/fixtures/books.yml +0 -7
- data/test/fixtures/categories/special_categories.yml +0 -9
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
- data/test/fixtures/categories.yml +0 -14
- data/test/fixtures/categories_ordered.yml +0 -7
- data/test/fixtures/categories_posts.yml +0 -23
- data/test/fixtures/categorizations.yml +0 -17
- data/test/fixtures/clubs.yml +0 -6
- data/test/fixtures/comments.yml +0 -59
- data/test/fixtures/companies.yml +0 -56
- data/test/fixtures/computers.yml +0 -4
- data/test/fixtures/courses.yml +0 -7
- data/test/fixtures/customers.yml +0 -26
- data/test/fixtures/developers.yml +0 -21
- data/test/fixtures/developers_projects.yml +0 -17
- data/test/fixtures/edges.yml +0 -6
- data/test/fixtures/entrants.yml +0 -14
- data/test/fixtures/faces.yml +0 -11
- data/test/fixtures/fk_test_has_fk.yml +0 -3
- data/test/fixtures/fk_test_has_pk.yml +0 -2
- data/test/fixtures/funny_jokes.yml +0 -10
- data/test/fixtures/interests.yml +0 -33
- data/test/fixtures/items.yml +0 -4
- data/test/fixtures/jobs.yml +0 -7
- data/test/fixtures/legacy_things.yml +0 -3
- data/test/fixtures/mateys.yml +0 -4
- data/test/fixtures/member_types.yml +0 -6
- data/test/fixtures/members.yml +0 -6
- data/test/fixtures/memberships.yml +0 -20
- data/test/fixtures/men.yml +0 -5
- data/test/fixtures/minimalistics.yml +0 -2
- data/test/fixtures/mixed_case_monkeys.yml +0 -6
- data/test/fixtures/mixins.yml +0 -29
- data/test/fixtures/movies.yml +0 -7
- data/test/fixtures/naked/csv/accounts.csv +0 -1
- data/test/fixtures/naked/yml/accounts.yml +0 -1
- data/test/fixtures/naked/yml/companies.yml +0 -1
- data/test/fixtures/naked/yml/courses.yml +0 -1
- data/test/fixtures/organizations.yml +0 -5
- data/test/fixtures/owners.yml +0 -7
- data/test/fixtures/parrots.yml +0 -27
- data/test/fixtures/parrots_pirates.yml +0 -7
- data/test/fixtures/people.yml +0 -15
- data/test/fixtures/pets.yml +0 -14
- data/test/fixtures/pirates.yml +0 -9
- data/test/fixtures/polymorphic_designs.yml +0 -19
- data/test/fixtures/polymorphic_prices.yml +0 -19
- data/test/fixtures/posts.yml +0 -52
- data/test/fixtures/price_estimates.yml +0 -7
- data/test/fixtures/projects.yml +0 -7
- data/test/fixtures/readers.yml +0 -9
- data/test/fixtures/references.yml +0 -17
- data/test/fixtures/reserved_words/distinct.yml +0 -5
- data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
- data/test/fixtures/reserved_words/group.yml +0 -14
- data/test/fixtures/reserved_words/select.yml +0 -8
- data/test/fixtures/reserved_words/values.yml +0 -7
- data/test/fixtures/ships.yml +0 -5
- data/test/fixtures/sponsors.yml +0 -9
- data/test/fixtures/subscribers.yml +0 -7
- data/test/fixtures/subscriptions.yml +0 -12
- data/test/fixtures/taggings.yml +0 -28
- data/test/fixtures/tags.yml +0 -7
- data/test/fixtures/tasks.yml +0 -7
- data/test/fixtures/tees.yml +0 -4
- data/test/fixtures/ties.yml +0 -4
- data/test/fixtures/topics.yml +0 -42
- data/test/fixtures/toys.yml +0 -4
- data/test/fixtures/treasures.yml +0 -10
- data/test/fixtures/vertices.yml +0 -4
- data/test/fixtures/warehouse-things.yml +0 -3
- data/test/fixtures/zines.yml +0 -5
- data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
- data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
- data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
- data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
- data/test/migrations/duplicate/3_foo.rb +0 -7
- data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
- data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
- data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
- data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
- data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
- data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
- data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
- data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
- data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
- data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
- data/test/migrations/missing/1_people_have_last_names.rb +0 -9
- data/test/migrations/missing/3_we_need_reminders.rb +0 -12
- data/test/migrations/missing/4_innocent_jointable.rb +0 -12
- data/test/migrations/valid/1_people_have_last_names.rb +0 -9
- data/test/migrations/valid/2_we_need_reminders.rb +0 -12
- data/test/migrations/valid/3_innocent_jointable.rb +0 -12
- data/test/models/author.rb +0 -151
- data/test/models/auto_id.rb +0 -4
- data/test/models/binary.rb +0 -2
- data/test/models/bird.rb +0 -9
- data/test/models/book.rb +0 -4
- data/test/models/categorization.rb +0 -5
- data/test/models/category.rb +0 -34
- data/test/models/citation.rb +0 -6
- data/test/models/club.rb +0 -13
- data/test/models/column_name.rb +0 -3
- data/test/models/comment.rb +0 -29
- data/test/models/company.rb +0 -173
- data/test/models/company_in_module.rb +0 -78
- data/test/models/computer.rb +0 -3
- data/test/models/contact.rb +0 -16
- data/test/models/contract.rb +0 -5
- data/test/models/course.rb +0 -3
- data/test/models/customer.rb +0 -73
- data/test/models/default.rb +0 -2
- data/test/models/developer.rb +0 -101
- data/test/models/edge.rb +0 -5
- data/test/models/entrant.rb +0 -3
- data/test/models/essay.rb +0 -3
- data/test/models/event.rb +0 -3
- data/test/models/event_author.rb +0 -8
- data/test/models/face.rb +0 -7
- data/test/models/guid.rb +0 -2
- data/test/models/interest.rb +0 -5
- data/test/models/invoice.rb +0 -4
- data/test/models/item.rb +0 -7
- data/test/models/job.rb +0 -5
- data/test/models/joke.rb +0 -3
- data/test/models/keyboard.rb +0 -3
- data/test/models/legacy_thing.rb +0 -3
- data/test/models/line_item.rb +0 -3
- data/test/models/man.rb +0 -9
- data/test/models/matey.rb +0 -4
- data/test/models/member.rb +0 -12
- data/test/models/member_detail.rb +0 -5
- data/test/models/member_type.rb +0 -3
- data/test/models/membership.rb +0 -9
- data/test/models/minimalistic.rb +0 -2
- data/test/models/mixed_case_monkey.rb +0 -3
- data/test/models/movie.rb +0 -5
- data/test/models/order.rb +0 -4
- data/test/models/organization.rb +0 -6
- data/test/models/owner.rb +0 -5
- data/test/models/parrot.rb +0 -22
- data/test/models/person.rb +0 -16
- data/test/models/pet.rb +0 -5
- data/test/models/pirate.rb +0 -80
- data/test/models/polymorphic_design.rb +0 -3
- data/test/models/polymorphic_price.rb +0 -3
- data/test/models/post.rb +0 -102
- data/test/models/price_estimate.rb +0 -3
- data/test/models/project.rb +0 -30
- data/test/models/reader.rb +0 -4
- data/test/models/reference.rb +0 -4
- data/test/models/reply.rb +0 -46
- data/test/models/ship.rb +0 -19
- data/test/models/ship_part.rb +0 -7
- data/test/models/sponsor.rb +0 -4
- data/test/models/subject.rb +0 -4
- data/test/models/subscriber.rb +0 -8
- data/test/models/subscription.rb +0 -4
- data/test/models/tag.rb +0 -7
- data/test/models/tagging.rb +0 -10
- data/test/models/task.rb +0 -3
- data/test/models/tee.rb +0 -4
- data/test/models/tie.rb +0 -4
- data/test/models/topic.rb +0 -80
- data/test/models/toy.rb +0 -6
- data/test/models/treasure.rb +0 -8
- data/test/models/vertex.rb +0 -9
- data/test/models/warehouse_thing.rb +0 -5
- data/test/models/zine.rb +0 -3
- data/test/schema/mysql_specific_schema.rb +0 -31
- data/test/schema/postgresql_specific_schema.rb +0 -114
- data/test/schema/schema.rb +0 -550
- data/test/schema/schema2.rb +0 -6
- 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
|