sequel 3.21.0 → 3.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +1061 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +103 -63
- data/Rakefile +59 -27
- data/bin/sequel +50 -26
- data/doc/active_record.rdoc +67 -51
- data/doc/advanced_associations.rdoc +189 -75
- data/doc/association_basics.rdoc +327 -79
- data/doc/cheat_sheet.rdoc +21 -21
- data/doc/core_extensions.rdoc +374 -0
- data/doc/dataset_basics.rdoc +10 -10
- data/doc/dataset_filtering.rdoc +54 -42
- data/doc/mass_assignment.rdoc +56 -0
- data/doc/migration.rdoc +89 -557
- data/doc/model_hooks.rdoc +80 -29
- data/doc/object_model.rdoc +547 -0
- data/doc/opening_databases.rdoc +114 -53
- data/doc/prepared_statements.rdoc +41 -15
- data/doc/querying.rdoc +137 -56
- data/doc/reflection.rdoc +36 -10
- data/doc/release_notes/3.22.0.txt +39 -0
- data/doc/release_notes/3.23.0.txt +172 -0
- data/doc/release_notes/3.24.0.txt +420 -0
- data/doc/release_notes/3.25.0.txt +88 -0
- data/doc/release_notes/3.26.0.txt +88 -0
- data/doc/release_notes/3.27.0.txt +82 -0
- data/doc/release_notes/3.28.0.txt +304 -0
- data/doc/release_notes/3.29.0.txt +459 -0
- data/doc/release_notes/3.30.0.txt +135 -0
- data/doc/release_notes/3.31.0.txt +146 -0
- data/doc/release_notes/3.32.0.txt +202 -0
- data/doc/release_notes/3.33.0.txt +157 -0
- data/doc/release_notes/3.34.0.txt +671 -0
- data/doc/release_notes/3.35.0.txt +144 -0
- data/doc/release_notes/3.36.0.txt +245 -0
- data/doc/release_notes/3.37.0.txt +338 -0
- data/doc/release_notes/3.38.0.txt +234 -0
- data/doc/release_notes/3.39.0.txt +237 -0
- data/doc/schema_modification.rdoc +585 -0
- data/doc/sharding.rdoc +99 -8
- data/doc/sql.rdoc +154 -112
- data/doc/testing.rdoc +169 -0
- data/doc/thread_safety.rdoc +17 -0
- data/doc/transactions.rdoc +137 -0
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +78 -43
- data/lib/sequel/adapters/ado/mssql.rb +18 -6
- data/lib/sequel/adapters/ado.rb +40 -18
- data/lib/sequel/adapters/amalgalite.rb +17 -9
- data/lib/sequel/adapters/db2.rb +175 -86
- data/lib/sequel/adapters/dbi.rb +15 -15
- data/lib/sequel/adapters/do/mysql.rb +17 -11
- data/lib/sequel/adapters/do/postgres.rb +2 -61
- data/lib/sequel/adapters/do/sqlite.rb +0 -10
- data/lib/sequel/adapters/do.rb +18 -36
- data/lib/sequel/adapters/firebird.rb +27 -208
- data/lib/sequel/adapters/ibmdb.rb +453 -0
- data/lib/sequel/adapters/informix.rb +6 -23
- data/lib/sequel/adapters/jdbc/as400.rb +16 -34
- data/lib/sequel/adapters/jdbc/db2.rb +56 -0
- data/lib/sequel/adapters/jdbc/derby.rb +325 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
- data/lib/sequel/adapters/jdbc/h2.rb +73 -31
- data/lib/sequel/adapters/jdbc/hsqldb.rb +184 -0
- data/lib/sequel/adapters/jdbc/informix.rb +21 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
- data/lib/sequel/adapters/jdbc/mysql.rb +7 -24
- data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
- data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
- data/lib/sequel/adapters/jdbc/progress.rb +21 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
- data/lib/sequel/adapters/jdbc/sqlserver.rb +66 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
- data/lib/sequel/adapters/jdbc.rb +279 -97
- data/lib/sequel/adapters/mock.rb +372 -0
- data/lib/sequel/adapters/mysql.rb +125 -222
- data/lib/sequel/adapters/mysql2.rb +65 -56
- data/lib/sequel/adapters/odbc/mssql.rb +17 -9
- data/lib/sequel/adapters/odbc.rb +28 -9
- data/lib/sequel/adapters/openbase.rb +3 -5
- data/lib/sequel/adapters/oracle.rb +349 -53
- data/lib/sequel/adapters/postgres.rb +368 -138
- data/lib/sequel/adapters/shared/access.rb +32 -9
- data/lib/sequel/adapters/shared/db2.rb +343 -0
- data/lib/sequel/adapters/shared/firebird.rb +221 -0
- data/lib/sequel/adapters/shared/informix.rb +53 -0
- data/lib/sequel/adapters/shared/mssql.rb +401 -116
- data/lib/sequel/adapters/shared/mysql.rb +424 -89
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
- data/lib/sequel/adapters/shared/oracle.rb +257 -45
- data/lib/sequel/adapters/shared/postgres.rb +675 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +285 -96
- data/lib/sequel/adapters/sqlite.rb +101 -39
- data/lib/sequel/adapters/swift/mysql.rb +10 -12
- data/lib/sequel/adapters/swift/postgres.rb +13 -79
- data/lib/sequel/adapters/swift/sqlite.rb +9 -6
- data/lib/sequel/adapters/swift.rb +28 -19
- data/lib/sequel/adapters/tinytds.rb +174 -22
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
- data/lib/sequel/adapters/utils/pg_types.rb +81 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
- data/lib/sequel/ast_transformer.rb +194 -0
- data/lib/sequel/connection_pool/sharded_single.rb +11 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +33 -2
- data/lib/sequel/connection_pool/single.rb +5 -0
- data/lib/sequel/connection_pool/threaded.rb +43 -14
- data/lib/sequel/connection_pool.rb +10 -2
- data/lib/sequel/core.rb +143 -11
- data/lib/sequel/database/connecting.rb +38 -28
- data/lib/sequel/database/dataset.rb +4 -4
- data/lib/sequel/database/dataset_defaults.rb +63 -2
- data/lib/sequel/database/logging.rb +7 -2
- data/lib/sequel/database/misc.rb +190 -46
- data/lib/sequel/database/query.rb +272 -110
- data/lib/sequel/database/schema_generator.rb +103 -36
- data/lib/sequel/database/schema_methods.rb +300 -67
- data/lib/sequel/dataset/actions.rb +344 -90
- data/lib/sequel/dataset/features.rb +101 -8
- data/lib/sequel/dataset/graph.rb +42 -15
- data/lib/sequel/dataset/misc.rb +52 -25
- data/lib/sequel/dataset/mutation.rb +12 -7
- data/lib/sequel/dataset/prepared_statements.rb +68 -30
- data/lib/sequel/dataset/query.rb +305 -54
- data/lib/sequel/dataset/sql.rb +720 -292
- data/lib/sequel/dataset.rb +8 -0
- data/lib/sequel/exceptions.rb +4 -0
- data/lib/sequel/extensions/_pretty_table.rb +83 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
- data/lib/sequel/extensions/blank.rb +4 -0
- data/lib/sequel/extensions/columns_introspection.rb +72 -0
- data/lib/sequel/extensions/constraint_validations.rb +451 -0
- data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
- data/lib/sequel/extensions/eval_inspect.rb +173 -0
- data/lib/sequel/extensions/inflector.rb +4 -0
- data/lib/sequel/extensions/looser_typecasting.rb +5 -4
- data/lib/sequel/extensions/migration.rb +100 -11
- data/lib/sequel/extensions/named_timezones.rb +9 -0
- data/lib/sequel/extensions/null_dataset.rb +94 -0
- data/lib/sequel/extensions/pagination.rb +4 -0
- data/lib/sequel/extensions/pg_array.rb +537 -0
- data/lib/sequel/extensions/pg_array_ops.rb +263 -0
- data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
- data/lib/sequel/extensions/pg_hstore.rb +313 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
- data/lib/sequel/extensions/pg_inet.rb +113 -0
- data/lib/sequel/extensions/pg_interval.rb +191 -0
- data/lib/sequel/extensions/pg_json.rb +208 -0
- data/lib/sequel/extensions/pg_range.rb +512 -0
- data/lib/sequel/extensions/pg_range_ops.rb +150 -0
- data/lib/sequel/extensions/pg_row.rb +572 -0
- data/lib/sequel/extensions/pg_row_ops.rb +182 -0
- data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
- data/lib/sequel/extensions/pretty_table.rb +17 -72
- data/lib/sequel/extensions/query.rb +8 -4
- data/lib/sequel/extensions/query_literals.rb +79 -0
- data/lib/sequel/extensions/schema_caching.rb +76 -0
- data/lib/sequel/extensions/schema_dumper.rb +282 -76
- data/lib/sequel/extensions/select_remove.rb +39 -0
- data/lib/sequel/extensions/server_block.rb +140 -0
- data/lib/sequel/extensions/split_array_nil.rb +65 -0
- data/lib/sequel/extensions/sql_expr.rb +8 -110
- data/lib/sequel/extensions/string_date_time.rb +4 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
- data/lib/sequel/extensions/to_dot.rb +99 -83
- data/lib/sequel/model/associations.rb +1263 -409
- data/lib/sequel/model/base.rb +624 -171
- data/lib/sequel/model/errors.rb +1 -1
- data/lib/sequel/model/exceptions.rb +24 -2
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model.rb +30 -11
- data/lib/sequel/no_core_ext.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +13 -1
- data/lib/sequel/plugins/association_pks.rb +22 -4
- data/lib/sequel/plugins/caching.rb +25 -18
- data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
- data/lib/sequel/plugins/composition.rb +44 -12
- data/lib/sequel/plugins/constraint_validations.rb +198 -0
- data/lib/sequel/plugins/dataset_associations.rb +100 -0
- data/lib/sequel/plugins/defaults_setter.rb +72 -0
- data/lib/sequel/plugins/dirty.rb +214 -0
- data/lib/sequel/plugins/eager_each.rb +59 -0
- data/lib/sequel/plugins/force_encoding.rb +6 -6
- data/lib/sequel/plugins/hook_class_methods.rb +1 -1
- data/lib/sequel/plugins/identity_map.rb +134 -15
- data/lib/sequel/plugins/instance_filters.rb +10 -0
- data/lib/sequel/plugins/instance_hooks.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +58 -6
- data/lib/sequel/plugins/list.rb +13 -2
- data/lib/sequel/plugins/many_through_many.rb +103 -51
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
- data/lib/sequel/plugins/nested_attributes.rb +150 -66
- data/lib/sequel/plugins/optimistic_locking.rb +8 -0
- data/lib/sequel/plugins/pg_row.rb +121 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
- data/lib/sequel/plugins/prepared_statements.rb +167 -0
- data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
- data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
- data/lib/sequel/plugins/rcte_tree.rb +31 -17
- data/lib/sequel/plugins/schema.rb +8 -3
- data/lib/sequel/plugins/serialization.rb +98 -49
- data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
- data/lib/sequel/plugins/sharding.rb +21 -54
- data/lib/sequel/plugins/single_table_inheritance.rb +5 -3
- data/lib/sequel/plugins/static_cache.rb +99 -0
- data/lib/sequel/plugins/subclasses.rb +29 -3
- data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +9 -12
- data/lib/sequel/plugins/update_primary_key.rb +2 -2
- data/lib/sequel/plugins/validation_class_methods.rb +1 -1
- data/lib/sequel/plugins/validation_helpers.rb +55 -4
- data/lib/sequel/plugins/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +649 -122
- data/lib/sequel/timezones.rb +67 -40
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +146 -0
- data/spec/adapters/firebird_spec.rb +1 -1
- data/spec/adapters/mssql_spec.rb +194 -66
- data/spec/adapters/mysql_spec.rb +475 -306
- data/spec/adapters/oracle_spec.rb +92 -117
- data/spec/adapters/postgres_spec.rb +1982 -325
- data/spec/adapters/spec_helper.rb +9 -6
- data/spec/adapters/sqlite_spec.rb +203 -75
- data/spec/core/connection_pool_spec.rb +218 -93
- data/spec/core/database_spec.rb +956 -522
- data/spec/core/dataset_spec.rb +1631 -1242
- data/spec/core/expression_filters_spec.rb +690 -334
- data/spec/core/mock_adapter_spec.rb +453 -0
- data/spec/core/object_graph_spec.rb +88 -129
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +556 -53
- data/spec/core/spec_helper.rb +7 -48
- data/spec/core_extensions_spec.rb +626 -0
- data/spec/extensions/active_model_spec.rb +13 -0
- data/spec/extensions/arbitrary_servers_spec.rb +110 -0
- data/spec/extensions/association_autoreloading_spec.rb +18 -10
- data/spec/extensions/association_dependencies_spec.rb +15 -25
- data/spec/extensions/association_pks_spec.rb +66 -32
- data/spec/extensions/association_proxies_spec.rb +4 -4
- data/spec/extensions/boolean_readers_spec.rb +25 -25
- data/spec/extensions/caching_spec.rb +47 -51
- data/spec/extensions/class_table_inheritance_spec.rb +31 -83
- data/spec/extensions/columns_introspection_spec.rb +91 -0
- data/spec/extensions/composition_spec.rb +18 -13
- data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
- data/spec/extensions/constraint_validations_spec.rb +316 -0
- data/spec/extensions/dataset_associations_spec.rb +199 -0
- data/spec/extensions/defaults_setter_spec.rb +88 -0
- data/spec/extensions/dirty_spec.rb +155 -0
- data/spec/extensions/eager_each_spec.rb +34 -0
- data/spec/extensions/eval_inspect_spec.rb +67 -0
- data/spec/extensions/force_encoding_spec.rb +4 -2
- data/spec/extensions/hook_class_methods_spec.rb +97 -128
- data/spec/extensions/identity_map_spec.rb +142 -24
- data/spec/extensions/inflector_spec.rb +0 -4
- data/spec/extensions/instance_filters_spec.rb +11 -21
- data/spec/extensions/instance_hooks_spec.rb +72 -0
- data/spec/extensions/json_serializer_spec.rb +49 -12
- data/spec/extensions/lazy_attributes_spec.rb +16 -20
- data/spec/extensions/list_spec.rb +49 -40
- data/spec/extensions/looser_typecasting_spec.rb +7 -7
- data/spec/extensions/many_through_many_spec.rb +368 -254
- data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
- data/spec/extensions/migration_spec.rb +140 -35
- data/spec/extensions/named_timezones_spec.rb +29 -11
- data/spec/extensions/nested_attributes_spec.rb +268 -89
- data/spec/extensions/null_dataset_spec.rb +85 -0
- data/spec/extensions/optimistic_locking_spec.rb +24 -21
- data/spec/extensions/pg_array_ops_spec.rb +112 -0
- data/spec/extensions/pg_array_spec.rb +320 -0
- data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
- data/spec/extensions/pg_hstore_spec.rb +194 -0
- data/spec/extensions/pg_inet_spec.rb +47 -0
- data/spec/extensions/pg_interval_spec.rb +72 -0
- data/spec/extensions/pg_json_spec.rb +99 -0
- data/spec/extensions/pg_range_ops_spec.rb +56 -0
- data/spec/extensions/pg_range_spec.rb +395 -0
- data/spec/extensions/pg_row_ops_spec.rb +58 -0
- data/spec/extensions/pg_row_plugin_spec.rb +49 -0
- data/spec/extensions/pg_row_spec.rb +323 -0
- data/spec/extensions/pg_statement_cache_spec.rb +208 -0
- data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
- data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
- data/spec/extensions/prepared_statements_spec.rb +87 -0
- data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
- data/spec/extensions/pretty_table_spec.rb +7 -6
- data/spec/extensions/query_literals_spec.rb +167 -0
- data/spec/extensions/query_spec.rb +9 -3
- data/spec/extensions/rcte_tree_spec.rb +50 -43
- data/spec/extensions/schema_caching_spec.rb +41 -0
- data/spec/extensions/schema_dumper_spec.rb +434 -49
- data/spec/extensions/schema_spec.rb +30 -49
- data/spec/extensions/select_remove_spec.rb +38 -0
- data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
- data/spec/extensions/serialization_spec.rb +86 -48
- data/spec/extensions/server_block_spec.rb +90 -0
- data/spec/extensions/sharding_spec.rb +69 -143
- data/spec/extensions/single_table_inheritance_spec.rb +23 -29
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +34 -67
- data/spec/extensions/split_array_nil_spec.rb +24 -0
- data/spec/extensions/sql_expr_spec.rb +29 -60
- data/spec/extensions/static_cache_spec.rb +145 -0
- data/spec/extensions/subclasses_spec.rb +14 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
- data/spec/extensions/thread_local_timezones_spec.rb +22 -2
- data/spec/extensions/timestamps_spec.rb +6 -6
- data/spec/extensions/to_dot_spec.rb +8 -11
- data/spec/extensions/touch_spec.rb +13 -14
- data/spec/extensions/tree_spec.rb +11 -26
- data/spec/extensions/typecast_on_load_spec.rb +9 -6
- data/spec/extensions/update_primary_key_spec.rb +30 -24
- data/spec/extensions/validation_class_methods_spec.rb +58 -67
- data/spec/extensions/validation_helpers_spec.rb +31 -37
- data/spec/extensions/xml_serializer_spec.rb +29 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
- data/spec/integration/associations_test.rb +659 -21
- data/spec/integration/database_test.rb +11 -5
- data/spec/integration/dataset_test.rb +717 -129
- data/spec/integration/eager_loader_test.rb +38 -54
- data/spec/integration/migrator_test.rb +2 -3
- data/spec/integration/model_test.rb +81 -2
- data/spec/integration/plugin_test.rb +604 -147
- data/spec/integration/prepared_statement_test.rb +272 -128
- data/spec/integration/schema_test.rb +367 -57
- data/spec/integration/spec_helper.rb +42 -32
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +31 -8
- data/spec/model/association_reflection_spec.rb +207 -8
- data/spec/model/associations_spec.rb +1206 -693
- data/spec/model/base_spec.rb +334 -100
- data/spec/model/dataset_methods_spec.rb +45 -27
- data/spec/model/eager_loading_spec.rb +828 -692
- data/spec/model/hooks_spec.rb +355 -67
- data/spec/model/model_spec.rb +251 -179
- data/spec/model/plugins_spec.rb +24 -13
- data/spec/model/record_spec.rb +506 -232
- data/spec/model/spec_helper.rb +16 -77
- data/spec/model/validations_spec.rb +38 -2
- data/spec/rcov.opts +2 -0
- metadata +209 -80
- data/spec/core/core_sql_spec.rb +0 -451
|
@@ -1,35 +1,59 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
|
2
2
|
|
|
3
|
-
if INTEGRATION_DB.respond_to?(:schema_parse_table, true)
|
|
4
3
|
describe "Database schema parser" do
|
|
5
4
|
before do
|
|
6
5
|
@iom = INTEGRATION_DB.identifier_output_method
|
|
7
6
|
@iim = INTEGRATION_DB.identifier_input_method
|
|
8
7
|
@defsch = INTEGRATION_DB.default_schema
|
|
9
|
-
|
|
8
|
+
@qi = INTEGRATION_DB.quote_identifiers?
|
|
10
9
|
end
|
|
11
10
|
after do
|
|
12
11
|
INTEGRATION_DB.identifier_output_method = @iom
|
|
13
12
|
INTEGRATION_DB.identifier_input_method = @iim
|
|
14
13
|
INTEGRATION_DB.default_schema = @defsch
|
|
15
|
-
INTEGRATION_DB.
|
|
14
|
+
INTEGRATION_DB.quote_identifiers = @qi
|
|
15
|
+
INTEGRATION_DB.drop_table?(:items)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
specify "should handle a database with a
|
|
18
|
+
specify "should handle a database with a identifier methods" do
|
|
19
19
|
INTEGRATION_DB.identifier_output_method = :reverse
|
|
20
20
|
INTEGRATION_DB.identifier_input_method = :reverse
|
|
21
|
+
INTEGRATION_DB.quote_identifiers = true
|
|
21
22
|
INTEGRATION_DB.default_schema = nil if INTEGRATION_DB.default_schema
|
|
22
23
|
INTEGRATION_DB.create_table!(:items){Integer :number}
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
begin
|
|
25
|
+
INTEGRATION_DB.schema(:items, :reload=>true).should be_a_kind_of(Array)
|
|
26
|
+
INTEGRATION_DB.schema(:items, :reload=>true).first.first.should == :number
|
|
27
|
+
ensure
|
|
28
|
+
INTEGRATION_DB.drop_table(:items)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
specify "should handle a dataset with identifier methods different than the database's" do
|
|
33
|
+
INTEGRATION_DB.identifier_output_method = :reverse
|
|
34
|
+
INTEGRATION_DB.identifier_input_method = :reverse
|
|
35
|
+
INTEGRATION_DB.quote_identifiers = true
|
|
36
|
+
INTEGRATION_DB.default_schema = nil if INTEGRATION_DB.default_schema
|
|
37
|
+
INTEGRATION_DB.create_table!(:items){Integer :number}
|
|
38
|
+
INTEGRATION_DB.identifier_output_method = @iom
|
|
39
|
+
INTEGRATION_DB.identifier_input_method = @iim
|
|
40
|
+
ds = INTEGRATION_DB[:items]
|
|
41
|
+
ds.identifier_output_method = :reverse
|
|
42
|
+
ds.identifier_input_method = :reverse
|
|
43
|
+
begin
|
|
44
|
+
INTEGRATION_DB.schema(ds, :reload=>true).should be_a_kind_of(Array)
|
|
45
|
+
INTEGRATION_DB.schema(ds, :reload=>true).first.first.should == :number
|
|
46
|
+
ensure
|
|
47
|
+
INTEGRATION_DB.identifier_output_method = :reverse
|
|
48
|
+
INTEGRATION_DB.identifier_input_method = :reverse
|
|
49
|
+
INTEGRATION_DB.drop_table(:items)
|
|
50
|
+
end
|
|
25
51
|
end
|
|
26
52
|
|
|
27
53
|
specify "should not issue an sql query if the schema has been loaded unless :reload is true" do
|
|
28
54
|
INTEGRATION_DB.create_table!(:items){Integer :number}
|
|
29
55
|
INTEGRATION_DB.schema(:items, :reload=>true)
|
|
30
|
-
clear_sqls
|
|
31
56
|
INTEGRATION_DB.schema(:items)
|
|
32
|
-
clear_sqls
|
|
33
57
|
INTEGRATION_DB.schema(:items, :reload=>true)
|
|
34
58
|
end
|
|
35
59
|
|
|
@@ -56,11 +80,10 @@ describe "Database schema parser" do
|
|
|
56
80
|
col_info = col.last
|
|
57
81
|
col_info.should be_a_kind_of(Hash)
|
|
58
82
|
col_info[:type].should == :integer
|
|
59
|
-
clear_sqls
|
|
60
83
|
INTEGRATION_DB.schema(:items)
|
|
61
84
|
end
|
|
62
85
|
|
|
63
|
-
|
|
86
|
+
specify "should parse primary keys from the schema properly" do
|
|
64
87
|
INTEGRATION_DB.create_table!(:items){Integer :number}
|
|
65
88
|
INTEGRATION_DB.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.should == []
|
|
66
89
|
INTEGRATION_DB.create_table!(:items){primary_key :number}
|
|
@@ -85,7 +108,17 @@ describe "Database schema parser" do
|
|
|
85
108
|
INTEGRATION_DB.schema(:items).first.last[:ruby_default].should == 'blah'
|
|
86
109
|
end
|
|
87
110
|
|
|
88
|
-
specify "should parse
|
|
111
|
+
specify "should parse current timestamp defaults from the schema properly" do
|
|
112
|
+
INTEGRATION_DB.create_table!(:items){Time :a, :default=>Sequel::CURRENT_TIMESTAMP}
|
|
113
|
+
INTEGRATION_DB.schema(:items).first.last[:ruby_default].should == Sequel::CURRENT_TIMESTAMP
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
cspecify "should parse current date defaults from the schema properly", :mysql, :oracle do
|
|
117
|
+
INTEGRATION_DB.create_table!(:items){Date :a, :default=>Sequel::CURRENT_DATE}
|
|
118
|
+
INTEGRATION_DB.schema(:items).first.last[:ruby_default].should == Sequel::CURRENT_DATE
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
cspecify "should parse types from the schema properly", [:jdbc, :db2], :oracle do
|
|
89
122
|
INTEGRATION_DB.create_table!(:items){Integer :number}
|
|
90
123
|
INTEGRATION_DB.schema(:items).first.last[:type].should == :integer
|
|
91
124
|
INTEGRATION_DB.create_table!(:items){Fixnum :number}
|
|
@@ -113,17 +146,20 @@ describe "Database schema parser" do
|
|
|
113
146
|
INTEGRATION_DB.create_table!(:items){FalseClass :number}
|
|
114
147
|
INTEGRATION_DB.schema(:items).first.last[:type].should == :boolean
|
|
115
148
|
end
|
|
116
|
-
end
|
|
117
|
-
end
|
|
149
|
+
end if INTEGRATION_DB.respond_to?(:schema_parse_table, true)
|
|
118
150
|
|
|
119
|
-
begin
|
|
120
|
-
INTEGRATION_DB.drop_table(:blah)
|
|
151
|
+
test_indexes = begin
|
|
152
|
+
INTEGRATION_DB.drop_table?(:blah)
|
|
121
153
|
INTEGRATION_DB.indexes(:blah)
|
|
154
|
+
true
|
|
122
155
|
rescue Sequel::NotImplemented
|
|
156
|
+
false
|
|
123
157
|
rescue
|
|
158
|
+
true
|
|
159
|
+
end
|
|
124
160
|
describe "Database index parsing" do
|
|
125
161
|
after do
|
|
126
|
-
INTEGRATION_DB.drop_table(:items)
|
|
162
|
+
INTEGRATION_DB.drop_table?(:items)
|
|
127
163
|
end
|
|
128
164
|
|
|
129
165
|
specify "should parse indexes into a hash" do
|
|
@@ -149,17 +185,73 @@ describe "Database index parsing" do
|
|
|
149
185
|
INTEGRATION_DB.create_table!(:items){Integer :n; Integer :a; primary_key [:n, :a]}
|
|
150
186
|
INTEGRATION_DB.indexes(:items).should == {}
|
|
151
187
|
end
|
|
188
|
+
end if test_indexes
|
|
189
|
+
|
|
190
|
+
test_foreign_key_list = begin
|
|
191
|
+
INTEGRATION_DB.drop_table?(:blah)
|
|
192
|
+
INTEGRATION_DB.foreign_key_list(:blah)
|
|
193
|
+
true
|
|
194
|
+
rescue Sequel::NotImplemented
|
|
195
|
+
false
|
|
196
|
+
rescue
|
|
197
|
+
true
|
|
152
198
|
end
|
|
153
|
-
|
|
199
|
+
describe "Database foreign key parsing" do
|
|
200
|
+
before do
|
|
201
|
+
@db = INTEGRATION_DB
|
|
202
|
+
@pr = lambda do |table, *expected|
|
|
203
|
+
actual = @db.foreign_key_list(table).sort_by{|c| c[:columns].map{|s| s.to_s}.join << (c[:key]||[]).map{|s| s.to_s}.join}.map{|v| v.values_at(:columns, :table, :key)}
|
|
204
|
+
actual.zip(expected).each do |a, e|
|
|
205
|
+
if e.last.first == :pk
|
|
206
|
+
if a.last == nil
|
|
207
|
+
a.pop
|
|
208
|
+
e.pop
|
|
209
|
+
else
|
|
210
|
+
e.last.shift
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
a.should == e
|
|
214
|
+
end
|
|
215
|
+
actual.length.should == expected.length
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
after do
|
|
219
|
+
@db.drop_table?(:b, :a)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
specify "should parse foreign key information into an array of hashes" do
|
|
223
|
+
@db.create_table!(:a, :engine=>:InnoDB){primary_key :c; Integer :d; index :d, :unique=>true}
|
|
224
|
+
@db.create_table!(:b, :engine=>:InnoDB){foreign_key :e, :a}
|
|
225
|
+
@pr[:a]
|
|
226
|
+
@pr[:b, [[:e], :a, [:pk, :c]]]
|
|
227
|
+
|
|
228
|
+
@db.alter_table(:b){add_foreign_key :f, :a, :key=>[:d]}
|
|
229
|
+
@pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:d]]]
|
|
230
|
+
|
|
231
|
+
@db.alter_table(:b){add_foreign_key [:f], :a, :key=>[:c]}
|
|
232
|
+
@pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]]]
|
|
233
|
+
|
|
234
|
+
@db.alter_table(:a){add_index [:d, :c], :unique=>true}
|
|
235
|
+
@db.alter_table(:b){add_foreign_key [:f, :e], :a, :key=>[:d, :c]}
|
|
236
|
+
@pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]], [[:f, :e], :a, [:d, :c]]]
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
specify "should handle composite foreign and primary keys" do
|
|
240
|
+
@db.create_table!(:a, :engine=>:InnoDB){Integer :b; Integer :c; primary_key [:b, :c]; index [:c, :b], :unique=>true}
|
|
241
|
+
@db.create_table!(:b, :engine=>:InnoDB){Integer :e; Integer :f; foreign_key [:e, :f], :a; foreign_key [:f, :e], :a, :key=>[:c, :b]}
|
|
242
|
+
@pr[:b, [[:e, :f], :a, [:pk, :b, :c]], [[:f, :e], :a, [:c, :b]]]
|
|
243
|
+
end
|
|
244
|
+
end if test_foreign_key_list
|
|
154
245
|
|
|
155
246
|
describe "Database schema modifiers" do
|
|
156
247
|
before do
|
|
157
248
|
@db = INTEGRATION_DB
|
|
158
249
|
@ds = @db[:items]
|
|
159
|
-
clear_sqls
|
|
160
250
|
end
|
|
161
251
|
after do
|
|
162
|
-
|
|
252
|
+
# Use instead of drop_table? to work around issues on jdbc/db2
|
|
253
|
+
@db.drop_table(:items) rescue nil
|
|
254
|
+
@db.drop_table(:items2) rescue nil
|
|
163
255
|
end
|
|
164
256
|
|
|
165
257
|
specify "should create tables correctly" do
|
|
@@ -170,12 +262,60 @@ describe "Database schema modifiers" do
|
|
|
170
262
|
@ds.columns!.should == [:number]
|
|
171
263
|
end
|
|
172
264
|
|
|
265
|
+
specify "should create tables from select statements correctly" do
|
|
266
|
+
@db.create_table!(:items){Integer :number}
|
|
267
|
+
@ds.insert([10])
|
|
268
|
+
@db.create_table(:items2, :as=>@db[:items])
|
|
269
|
+
@db.schema(:items2, :reload=>true).map{|x| x.first}.should == [:number]
|
|
270
|
+
@db[:items2].columns.should == [:number]
|
|
271
|
+
@db[:items2].all.should == [{:number=>10}]
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
specify "should handle create table in a rolled back transaction" do
|
|
275
|
+
@db.drop_table?(:items)
|
|
276
|
+
@db.transaction(:rollback=>:always){@db.create_table(:items){Integer :number}}
|
|
277
|
+
@db.table_exists?(:items).should be_false
|
|
278
|
+
end if INTEGRATION_DB.supports_transactional_ddl?
|
|
279
|
+
|
|
280
|
+
describe "join tables" do
|
|
281
|
+
after do
|
|
282
|
+
@db.drop_join_table(:cat_id=>:cats, :dog_id=>:dogs) if @db.table_exists?(:cats_dogs)
|
|
283
|
+
@db.drop_table(:cats, :dogs)
|
|
284
|
+
@db.table_exists?(:cats_dogs).should == false
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
specify "should create join tables correctly" do
|
|
288
|
+
@db.create_table!(:cats){primary_key :id}
|
|
289
|
+
@db.create_table!(:dogs){primary_key :id}
|
|
290
|
+
@db.create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
|
|
291
|
+
@db.table_exists?(:cats_dogs).should == true
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
|
|
173
295
|
specify "should create temporary tables without raising an exception" do
|
|
174
296
|
@db.create_table!(:items, :temp=>true){Integer :number}
|
|
175
297
|
end
|
|
176
298
|
|
|
299
|
+
specify "should have create_table? only create the table if it doesn't already exist" do
|
|
300
|
+
@db.create_table!(:items){String :a}
|
|
301
|
+
@db.create_table?(:items){String :b}
|
|
302
|
+
@db[:items].columns.should == [:a]
|
|
303
|
+
@db.drop_table?(:items)
|
|
304
|
+
@db.create_table?(:items){String :b}
|
|
305
|
+
@db[:items].columns.should == [:b]
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
specify "should have create_table? work correctly with indexes" do
|
|
309
|
+
@db.create_table!(:items){String :a, :index=>true}
|
|
310
|
+
@db.create_table?(:items){String :b, :index=>true}
|
|
311
|
+
@db[:items].columns.should == [:a]
|
|
312
|
+
@db.drop_table?(:items)
|
|
313
|
+
@db.create_table?(:items){String :b, :index=>true}
|
|
314
|
+
@db[:items].columns.should == [:b]
|
|
315
|
+
end
|
|
316
|
+
|
|
177
317
|
specify "should rename tables correctly" do
|
|
178
|
-
@db.drop_table(:items)
|
|
318
|
+
@db.drop_table?(:items)
|
|
179
319
|
@db.create_table!(:items2){Integer :number}
|
|
180
320
|
@db.rename_table(:items2, :items)
|
|
181
321
|
@db.table_exists?(:items).should == true
|
|
@@ -215,24 +355,34 @@ describe "Database schema modifiers" do
|
|
|
215
355
|
specify "should add columns to tables correctly" do
|
|
216
356
|
@db.create_table!(:items){Integer :number}
|
|
217
357
|
@ds.insert(:number=>10)
|
|
218
|
-
@db.alter_table(:items){add_column :name,
|
|
358
|
+
@db.alter_table(:items){add_column :name, String}
|
|
219
359
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:number, :name]
|
|
220
360
|
@ds.columns!.should == [:number, :name]
|
|
221
361
|
@ds.all.should == [{:number=>10, :name=>nil}]
|
|
222
362
|
end
|
|
223
363
|
|
|
224
|
-
cspecify "should add primary key columns to tables correctly", :h2 do
|
|
364
|
+
cspecify "should add primary key columns to tables correctly", :h2, :derby do
|
|
225
365
|
@db.create_table!(:items){Integer :number}
|
|
226
366
|
@ds.insert(:number=>10)
|
|
227
367
|
@db.alter_table(:items){add_primary_key :id}
|
|
228
368
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:number, :id]
|
|
229
369
|
@ds.columns!.should == [:number, :id]
|
|
230
370
|
@ds.map(:number).should == [10]
|
|
371
|
+
proc{@ds.insert(:id=>@ds.map(:id).first)}.should raise_error
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
specify "should drop primary key constraints from tables correctly" do
|
|
375
|
+
@db.create_table!(:items){Integer :number; primary_key [:number], :name=>:items_pk}
|
|
376
|
+
@ds.insert(:number=>10)
|
|
377
|
+
@db.alter_table(:items){drop_constraint :items_pk, :type=>:primary_key}
|
|
378
|
+
@ds.map(:number).should == [10]
|
|
379
|
+
proc{@ds.insert(10)}.should_not raise_error
|
|
231
380
|
end
|
|
232
381
|
|
|
233
382
|
specify "should add foreign key columns to tables correctly" do
|
|
234
383
|
@db.create_table!(:items){primary_key :id}
|
|
235
|
-
|
|
384
|
+
@ds.insert
|
|
385
|
+
i = @ds.get(:id)
|
|
236
386
|
@db.alter_table(:items){add_foreign_key :item_id, :items}
|
|
237
387
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
|
|
238
388
|
@ds.columns!.should == [:id, :item_id]
|
|
@@ -269,7 +419,22 @@ describe "Database schema modifiers" do
|
|
|
269
419
|
proc{@ds.insert(:n=>nil)}.should raise_error(Sequel::DatabaseError)
|
|
270
420
|
end
|
|
271
421
|
|
|
272
|
-
specify "should
|
|
422
|
+
specify "should rename columns when the table is referenced by a foreign key" do
|
|
423
|
+
begin
|
|
424
|
+
@db.create_table!(:itemsfk){primary_key :id; Integer :a}
|
|
425
|
+
@db.create_table!(:items){foreign_key :id, :itemsfk}
|
|
426
|
+
@db[:itemsfk].insert(:a=>10)
|
|
427
|
+
@ds.insert(:id=>1)
|
|
428
|
+
@db.alter_table(:itemsfk){rename_column :a, :b}
|
|
429
|
+
@db[:itemsfk].insert(:b=>20)
|
|
430
|
+
@ds.insert(:id=>2)
|
|
431
|
+
@db[:itemsfk].select_order_map([:id, :b]).should == [[1, 10], [2, 20]]
|
|
432
|
+
ensure
|
|
433
|
+
@db.drop_table(:items, :itemsfk)
|
|
434
|
+
end
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
cspecify "should set column NULL/NOT NULL correctly", [:jdbc, :db2], [:db2] do
|
|
273
438
|
@db.create_table!(:items, :engine=>:InnoDB){Integer :id}
|
|
274
439
|
@ds.insert(:id=>10)
|
|
275
440
|
@db.alter_table(:items){set_column_allow_null :id, false}
|
|
@@ -277,7 +442,7 @@ describe "Database schema modifiers" do
|
|
|
277
442
|
@ds.columns!.should == [:id]
|
|
278
443
|
proc{@ds.insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
|
|
279
444
|
@db.alter_table(:items){set_column_allow_null :id, true}
|
|
280
|
-
@ds.insert
|
|
445
|
+
@ds.insert(:id=>nil)
|
|
281
446
|
@ds.all.should == [{:id=>10}, {:id=>nil}]
|
|
282
447
|
end
|
|
283
448
|
|
|
@@ -291,45 +456,119 @@ describe "Database schema modifiers" do
|
|
|
291
456
|
@ds.all.should == [{:id=>10}, {:id=>20}]
|
|
292
457
|
end
|
|
293
458
|
|
|
294
|
-
|
|
459
|
+
cspecify "should set column types correctly", [:jdbc, :db2], [:db2], :oracle do
|
|
295
460
|
@db.create_table!(:items){Integer :id}
|
|
296
461
|
@ds.insert(:id=>10)
|
|
297
462
|
@db.alter_table(:items){set_column_type :id, String}
|
|
298
463
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id]
|
|
299
464
|
@ds.columns!.should == [:id]
|
|
300
|
-
@ds.insert(:id=>20)
|
|
465
|
+
@ds.insert(:id=>'20')
|
|
301
466
|
@ds.all.should == [{:id=>"10"}, {:id=>"20"}]
|
|
302
467
|
end
|
|
303
468
|
|
|
304
|
-
cspecify "should
|
|
305
|
-
@db.create_table!(:items){Integer :id
|
|
469
|
+
cspecify "should set column types without modifying NULL/NOT NULL", [:jdbc, :db2], [:db2], :oracle, :derby do
|
|
470
|
+
@db.create_table!(:items){Integer :id, :null=>false, :default=>2}
|
|
471
|
+
proc{@ds.insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
|
|
472
|
+
@db.alter_table(:items){set_column_type :id, String}
|
|
473
|
+
proc{@ds.insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
|
|
474
|
+
|
|
475
|
+
@db.create_table!(:items){Integer :id}
|
|
476
|
+
@ds.insert(:id=>nil)
|
|
477
|
+
@db.alter_table(:items){set_column_type :id, String}
|
|
478
|
+
@ds.insert(:id=>nil)
|
|
479
|
+
@ds.map(:id).should == [nil, nil]
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
cspecify "should set column types without modifying defaults", [:jdbc, :db2], [:db2], :oracle, :derby do
|
|
483
|
+
@db.create_table!(:items){Integer :id, :default=>0}
|
|
484
|
+
@ds.insert
|
|
485
|
+
@ds.map(:id).should == [0]
|
|
486
|
+
@db.alter_table(:items){set_column_type :id, String}
|
|
487
|
+
@ds.insert
|
|
488
|
+
@ds.map(:id).should == ['0', '0']
|
|
489
|
+
|
|
490
|
+
@db.create_table!(:items){String :id, :default=>'a'}
|
|
491
|
+
@ds.insert
|
|
492
|
+
@ds.map(:id).should == %w'a'
|
|
493
|
+
@db.alter_table(:items){set_column_type :id, String, :size=>1}
|
|
494
|
+
@ds.insert
|
|
495
|
+
@ds.map(:id).should == %w'a a'
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
specify "should add unnamed unique constraints and foreign key table constraints correctly" do
|
|
499
|
+
@db.create_table!(:items, :engine=>:InnoDB){Integer :id; Integer :item_id}
|
|
306
500
|
@db.alter_table(:items) do
|
|
307
501
|
add_unique_constraint [:item_id, :id]
|
|
308
502
|
add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id]
|
|
309
503
|
end
|
|
310
504
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
|
|
311
505
|
@ds.columns!.should == [:id, :item_id]
|
|
506
|
+
proc{@ds.insert(1, 1)}.should_not raise_error
|
|
507
|
+
proc{@ds.insert(1, 1)}.should raise_error
|
|
508
|
+
proc{@ds.insert(1, 2)}.should raise_error
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
specify "should add named unique constraints and foreign key table constraints correctly" do
|
|
512
|
+
@db.create_table!(:items, :engine=>:InnoDB){Integer :id, :null=>false; Integer :item_id, :null=>false}
|
|
513
|
+
@db.alter_table(:items) do
|
|
514
|
+
add_unique_constraint [:item_id, :id], :name=>:unique_iii
|
|
515
|
+
add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:fk_iii
|
|
516
|
+
end
|
|
517
|
+
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
|
|
518
|
+
@ds.columns!.should == [:id, :item_id]
|
|
519
|
+
proc{@ds.insert(1, 1)}.should_not raise_error
|
|
520
|
+
proc{@ds.insert(1, 1)}.should raise_error
|
|
521
|
+
proc{@ds.insert(1, 2)}.should raise_error
|
|
312
522
|
end
|
|
313
523
|
|
|
314
|
-
|
|
524
|
+
specify "should drop unique constraints and foreign key table constraints correctly" do
|
|
315
525
|
@db.create_table!(:items) do
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
foreign_key :item_id, :items
|
|
526
|
+
Integer :id
|
|
527
|
+
Integer :item_id
|
|
528
|
+
unique [:item_id, :id], :name=>:items_uk
|
|
529
|
+
foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:items_fk
|
|
530
|
+
end
|
|
531
|
+
@db.alter_table(:items) do
|
|
532
|
+
drop_constraint(:items_fk, :type=>:foreign_key)
|
|
533
|
+
drop_constraint(:items_uk, :type=>:unique)
|
|
320
534
|
end
|
|
321
|
-
@ds.insert(:number=>10)
|
|
322
|
-
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :name, :number, :item_id]
|
|
323
|
-
@ds.columns!.should == [:id, :name, :number, :item_id]
|
|
324
|
-
@db.drop_column(:items, :number)
|
|
325
|
-
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :name, :item_id]
|
|
326
|
-
@ds.columns!.should == [:id, :name, :item_id]
|
|
327
|
-
@db.drop_column(:items, :name)
|
|
328
535
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
|
|
329
536
|
@ds.columns!.should == [:id, :item_id]
|
|
330
|
-
@
|
|
537
|
+
proc{@ds.insert(1, 2)}.should_not raise_error
|
|
538
|
+
proc{@ds.insert(1, 2)}.should_not raise_error
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
specify "should remove columns from tables correctly" do
|
|
542
|
+
@db.create_table!(:items) do
|
|
543
|
+
primary_key :id
|
|
544
|
+
Integer :i
|
|
545
|
+
end
|
|
546
|
+
@ds.insert(:i=>10)
|
|
547
|
+
@db.drop_column(:items, :i)
|
|
548
|
+
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id]
|
|
549
|
+
end
|
|
550
|
+
|
|
551
|
+
specify "should remove columns with defaults from tables correctly" do
|
|
552
|
+
@db.create_table!(:items) do
|
|
553
|
+
primary_key :id
|
|
554
|
+
Integer :i, :default=>20
|
|
555
|
+
end
|
|
556
|
+
@ds.insert(:i=>10)
|
|
557
|
+
@db.drop_column(:items, :i)
|
|
331
558
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id]
|
|
332
|
-
|
|
559
|
+
end
|
|
560
|
+
|
|
561
|
+
cspecify "should remove foreign key columns from tables correctly", :h2, :mssql, :hsqldb do
|
|
562
|
+
# MySQL with InnoDB cannot drop foreign key columns unless you know the
|
|
563
|
+
# name of the constraint, see Bug #14347
|
|
564
|
+
@db.create_table!(:items, :engine=>:MyISAM) do
|
|
565
|
+
primary_key :id
|
|
566
|
+
Integer :i
|
|
567
|
+
foreign_key :item_id, :items
|
|
568
|
+
end
|
|
569
|
+
@ds.insert(:i=>10)
|
|
570
|
+
@db.drop_column(:items, :item_id)
|
|
571
|
+
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :i]
|
|
333
572
|
end
|
|
334
573
|
|
|
335
574
|
specify "should remove multiple columns in a single alter_table block" do
|
|
@@ -340,20 +579,44 @@ describe "Database schema modifiers" do
|
|
|
340
579
|
end
|
|
341
580
|
@ds.insert(:number=>10)
|
|
342
581
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :name, :number]
|
|
343
|
-
@ds.columns!.should == [:id, :name, :number]
|
|
344
582
|
@db.alter_table(:items) do
|
|
345
583
|
drop_column :name
|
|
346
584
|
drop_column :number
|
|
347
585
|
end
|
|
348
586
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id]
|
|
349
|
-
|
|
587
|
+
end
|
|
588
|
+
|
|
589
|
+
cspecify "should work correctly with many operations in a single alter_table call", [:jdbc, :db2], [:db2] do
|
|
590
|
+
@db.create_table!(:items) do
|
|
591
|
+
primary_key :id
|
|
592
|
+
String :name2
|
|
593
|
+
String :number2
|
|
594
|
+
constraint :bar, Sequel.~(:id=>nil)
|
|
595
|
+
end
|
|
596
|
+
@ds.insert(:name2=>'A12')
|
|
597
|
+
@db.alter_table(:items) do
|
|
598
|
+
add_column :number, Integer
|
|
599
|
+
drop_column :number2
|
|
600
|
+
rename_column :name2, :name
|
|
601
|
+
drop_constraint :bar
|
|
602
|
+
set_column_not_null :name
|
|
603
|
+
set_column_default :name, 'A13'
|
|
604
|
+
add_constraint :foo, Sequel.like(:name, 'A%')
|
|
605
|
+
end
|
|
606
|
+
@db[:items].first.should == {:id=>1, :name=>'A12', :number=>nil}
|
|
607
|
+
@db[:items].delete
|
|
608
|
+
proc{@db[:items].insert(:name=>nil)}.should raise_error(Sequel::DatabaseError)
|
|
609
|
+
@db[:items].insert(:number=>1)
|
|
610
|
+
@db[:items].get(:name).should == 'A13'
|
|
350
611
|
end
|
|
351
612
|
end
|
|
352
613
|
|
|
353
|
-
begin
|
|
614
|
+
test_tables = begin
|
|
354
615
|
INTEGRATION_DB.tables
|
|
616
|
+
true
|
|
355
617
|
rescue Sequel::NotImplemented
|
|
356
|
-
|
|
618
|
+
false
|
|
619
|
+
end
|
|
357
620
|
describe "Database#tables" do
|
|
358
621
|
before do
|
|
359
622
|
class ::String
|
|
@@ -362,25 +625,72 @@ describe "Database#tables" do
|
|
|
362
625
|
"xxxxx#{@@xxxxx += 1}"
|
|
363
626
|
end
|
|
364
627
|
end
|
|
365
|
-
@
|
|
366
|
-
@
|
|
367
|
-
|
|
628
|
+
@db = INTEGRATION_DB
|
|
629
|
+
@db.create_table(:sequel_test_table){Integer :a}
|
|
630
|
+
@db.create_view :sequel_test_view, @db[:sequel_test_table]
|
|
631
|
+
@iom = @db.identifier_output_method
|
|
632
|
+
@iim = @db.identifier_input_method
|
|
368
633
|
end
|
|
369
634
|
after do
|
|
370
|
-
|
|
371
|
-
|
|
635
|
+
@db.identifier_output_method = @iom
|
|
636
|
+
@db.identifier_input_method = @iim
|
|
637
|
+
@db.drop_view :sequel_test_view
|
|
638
|
+
@db.drop_table :sequel_test_table
|
|
372
639
|
end
|
|
373
640
|
|
|
374
641
|
specify "should return an array of symbols" do
|
|
375
|
-
ts =
|
|
642
|
+
ts = @db.tables
|
|
376
643
|
ts.should be_a_kind_of(Array)
|
|
377
644
|
ts.each{|t| t.should be_a_kind_of(Symbol)}
|
|
645
|
+
ts.should include(:sequel_test_table)
|
|
646
|
+
ts.should_not include(:sequel_test_view)
|
|
378
647
|
end
|
|
379
648
|
|
|
380
649
|
specify "should respect the database's identifier_output_method" do
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
650
|
+
@db.identifier_output_method = :xxxxx
|
|
651
|
+
@db.identifier_input_method = :xxxxx
|
|
652
|
+
@db.tables.each{|t| t.to_s.should =~ /\Ax{5}\d+\z/}
|
|
384
653
|
end
|
|
654
|
+
end if test_tables
|
|
655
|
+
|
|
656
|
+
test_views = begin
|
|
657
|
+
INTEGRATION_DB.views
|
|
658
|
+
true
|
|
659
|
+
rescue Sequel::NotImplemented
|
|
660
|
+
false
|
|
385
661
|
end
|
|
386
|
-
|
|
662
|
+
describe "Database#views" do
|
|
663
|
+
before do
|
|
664
|
+
class ::String
|
|
665
|
+
@@xxxxx = 0
|
|
666
|
+
def xxxxx
|
|
667
|
+
"xxxxx#{@@xxxxx += 1}"
|
|
668
|
+
end
|
|
669
|
+
end
|
|
670
|
+
@db = INTEGRATION_DB
|
|
671
|
+
@db.create_table(:sequel_test_table){Integer :a}
|
|
672
|
+
@db.create_view :sequel_test_view, @db[:sequel_test_table]
|
|
673
|
+
@iom = @db.identifier_output_method
|
|
674
|
+
@iim = @db.identifier_input_method
|
|
675
|
+
end
|
|
676
|
+
after do
|
|
677
|
+
@db.identifier_output_method = @iom
|
|
678
|
+
@db.identifier_input_method = @iim
|
|
679
|
+
@db.drop_view :sequel_test_view
|
|
680
|
+
@db.drop_table :sequel_test_table
|
|
681
|
+
end
|
|
682
|
+
|
|
683
|
+
specify "should return an array of symbols" do
|
|
684
|
+
ts = @db.views
|
|
685
|
+
ts.should be_a_kind_of(Array)
|
|
686
|
+
ts.each{|t| t.should be_a_kind_of(Symbol)}
|
|
687
|
+
ts.should_not include(:sequel_test_table)
|
|
688
|
+
ts.should include(:sequel_test_view)
|
|
689
|
+
end
|
|
690
|
+
|
|
691
|
+
specify "should respect the database's identifier_output_method" do
|
|
692
|
+
@db.identifier_output_method = :xxxxx
|
|
693
|
+
@db.identifier_input_method = :xxxxx
|
|
694
|
+
@db.views.each{|t| t.to_s.should =~ /\Ax{5}\d+\z/}
|
|
695
|
+
end
|
|
696
|
+
end if test_views
|