sequel 3.21.0 → 3.36.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 +855 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +23 -7
- data/Rakefile +42 -24
- data/bin/sequel +26 -8
- data/doc/active_record.rdoc +1 -0
- data/doc/advanced_associations.rdoc +171 -11
- data/doc/association_basics.rdoc +293 -43
- data/doc/dataset_basics.rdoc +5 -5
- data/doc/dataset_filtering.rdoc +8 -0
- data/doc/mass_assignment.rdoc +56 -0
- data/doc/migration.rdoc +85 -552
- data/doc/model_hooks.rdoc +78 -27
- data/doc/object_model.rdoc +541 -0
- data/doc/opening_databases.rdoc +97 -50
- data/doc/prepared_statements.rdoc +40 -14
- data/doc/querying.rdoc +28 -4
- data/doc/reflection.rdoc +30 -4
- 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/schema_modification.rdoc +572 -0
- data/doc/sharding.rdoc +95 -3
- data/doc/testing.rdoc +129 -0
- data/doc/thread_safety.rdoc +17 -0
- data/doc/transactions.rdoc +137 -0
- data/doc/virtual_rows.rdoc +51 -2
- 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 +1 -57
- 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 +47 -0
- data/lib/sequel/adapters/jdbc/derby.rb +287 -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 +29 -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 +58 -48
- 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 +265 -94
- data/lib/sequel/adapters/mock.rb +361 -0
- data/lib/sequel/adapters/mysql.rb +118 -222
- data/lib/sequel/adapters/mysql2.rb +58 -57
- data/lib/sequel/adapters/odbc/mssql.rb +15 -7
- 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 +356 -107
- data/lib/sequel/adapters/shared/access.rb +32 -9
- data/lib/sequel/adapters/shared/db2.rb +342 -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 +335 -118
- data/lib/sequel/adapters/shared/mysql.rb +340 -76
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
- data/lib/sequel/adapters/shared/oracle.rb +243 -45
- data/lib/sequel/adapters/shared/postgres.rb +524 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +265 -89
- data/lib/sequel/adapters/sqlite.rb +101 -39
- data/lib/sequel/adapters/swift/mysql.rb +9 -12
- data/lib/sequel/adapters/swift/postgres.rb +9 -74
- data/lib/sequel/adapters/swift/sqlite.rb +8 -6
- data/lib/sequel/adapters/swift.rb +8 -7
- data/lib/sequel/adapters/tinytds.rb +161 -21
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +66 -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 +28 -2
- data/lib/sequel/connection_pool/single.rb +5 -0
- data/lib/sequel/connection_pool/threaded.rb +38 -14
- data/lib/sequel/connection_pool.rb +10 -2
- data/lib/sequel/core.rb +118 -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 +150 -46
- data/lib/sequel/database/query.rb +215 -65
- data/lib/sequel/database/schema_generator.rb +64 -20
- data/lib/sequel/database/schema_methods.rb +212 -54
- data/lib/sequel/dataset/actions.rb +322 -85
- data/lib/sequel/dataset/features.rb +96 -8
- data/lib/sequel/dataset/graph.rb +38 -11
- data/lib/sequel/dataset/misc.rb +50 -23
- data/lib/sequel/dataset/mutation.rb +12 -7
- data/lib/sequel/dataset/prepared_statements.rb +68 -30
- data/lib/sequel/dataset/query.rb +237 -44
- data/lib/sequel/dataset/sql.rb +698 -278
- data/lib/sequel/dataset.rb +8 -0
- data/lib/sequel/exceptions.rb +4 -0
- data/lib/sequel/extensions/_pretty_table.rb +79 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +108 -0
- data/lib/sequel/extensions/columns_introspection.rb +61 -0
- data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +16 -34
- data/lib/sequel/extensions/migration.rb +97 -11
- data/lib/sequel/extensions/named_timezones.rb +5 -0
- data/lib/sequel/extensions/null_dataset.rb +90 -0
- data/lib/sequel/extensions/pg_array.rb +460 -0
- data/lib/sequel/extensions/pg_array_ops.rb +220 -0
- data/lib/sequel/extensions/pg_auto_parameterize.rb +169 -0
- data/lib/sequel/extensions/pg_hstore.rb +296 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +259 -0
- data/lib/sequel/extensions/pg_inet.rb +89 -0
- data/lib/sequel/extensions/pg_json.rb +178 -0
- data/lib/sequel/extensions/pg_statement_cache.rb +316 -0
- data/lib/sequel/extensions/pretty_table.rb +5 -71
- data/lib/sequel/extensions/query.rb +1 -1
- 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 +251 -37
- data/lib/sequel/extensions/select_remove.rb +35 -0
- data/lib/sequel/extensions/server_block.rb +139 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -110
- data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
- data/lib/sequel/extensions/to_dot.rb +95 -83
- data/lib/sequel/model/associations.rb +1187 -393
- data/lib/sequel/model/base.rb +578 -170
- data/lib/sequel/model/errors.rb +1 -1
- data/lib/sequel/model/exceptions.rb +5 -1
- 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/dataset_associations.rb +100 -0
- data/lib/sequel/plugins/defaults_setter.rb +58 -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 +123 -8
- 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 +12 -2
- data/lib/sequel/plugins/many_through_many.rb +79 -28
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
- data/lib/sequel/plugins/nested_attributes.rb +139 -63
- data/lib/sequel/plugins/optimistic_locking.rb +8 -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 +29 -15
- data/lib/sequel/plugins/schema.rb +7 -2
- 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 +10 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
- data/lib/sequel/plugins/timestamps.rb +1 -1
- 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/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +526 -59
- data/lib/sequel/timezones.rb +57 -38
- 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 +142 -40
- data/spec/adapters/mysql_spec.rb +380 -234
- data/spec/adapters/oracle_spec.rb +67 -77
- data/spec/adapters/postgres_spec.rb +1050 -212
- data/spec/adapters/spec_helper.rb +8 -5
- data/spec/adapters/sqlite_spec.rb +139 -27
- data/spec/core/connection_pool_spec.rb +196 -93
- data/spec/core/database_spec.rb +879 -510
- data/spec/core/dataset_spec.rb +1415 -1086
- data/spec/core/expression_filters_spec.rb +554 -109
- data/spec/core/mock_adapter_spec.rb +449 -0
- data/spec/core/object_graph_spec.rb +86 -114
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +482 -38
- data/spec/core/spec_helper.rb +6 -48
- 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/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/{core/core_sql_spec.rb → extensions/core_extensions_spec.rb} +119 -139
- data/spec/extensions/dataset_associations_spec.rb +199 -0
- data/spec/extensions/defaults_setter_spec.rb +64 -0
- data/spec/extensions/dirty_spec.rb +155 -0
- data/spec/extensions/eager_each_spec.rb +34 -0
- data/spec/extensions/force_encoding_spec.rb +4 -2
- data/spec/extensions/hook_class_methods_spec.rb +69 -92
- data/spec/extensions/identity_map_spec.rb +131 -22
- 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 -6
- data/spec/extensions/lazy_attributes_spec.rb +16 -20
- data/spec/extensions/list_spec.rb +48 -39
- data/spec/extensions/many_through_many_spec.rb +283 -250
- 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 +251 -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 +105 -0
- data/spec/extensions/pg_array_spec.rb +196 -0
- data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +136 -0
- data/spec/extensions/pg_hstore_spec.rb +195 -0
- data/spec/extensions/pg_inet_spec.rb +44 -0
- data/spec/extensions/pg_json_spec.rb +101 -0
- data/spec/extensions/pg_statement_cache_spec.rb +209 -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 +168 -0
- data/spec/extensions/query_spec.rb +6 -0
- 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 +429 -22
- data/spec/extensions/schema_spec.rb +25 -21
- 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 +85 -43
- 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 +22 -61
- data/spec/extensions/sql_expr_spec.rb +29 -60
- data/spec/extensions/static_cache_spec.rb +145 -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 +4 -7
- 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 +30 -51
- data/spec/extensions/validation_helpers_spec.rb +16 -35
- 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 +9 -3
- data/spec/integration/dataset_test.rb +605 -91
- data/spec/integration/eager_loader_test.rb +19 -21
- data/spec/integration/migrator_test.rb +2 -3
- data/spec/integration/model_test.rb +81 -2
- data/spec/integration/plugin_test.rb +454 -143
- data/spec/integration/prepared_statement_test.rb +263 -128
- data/spec/integration/schema_test.rb +309 -43
- data/spec/integration/spec_helper.rb +40 -30
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +18 -4
- data/spec/model/association_reflection_spec.rb +201 -7
- data/spec/model/associations_spec.rb +1067 -661
- data/spec/model/base_spec.rb +329 -95
- data/spec/model/dataset_methods_spec.rb +7 -27
- data/spec/model/eager_loading_spec.rb +677 -676
- data/spec/model/hooks_spec.rb +349 -67
- data/spec/model/model_spec.rb +240 -168
- data/spec/model/plugins_spec.rb +24 -13
- data/spec/model/record_spec.rb +490 -232
- data/spec/model/spec_helper.rb +14 -71
- data/spec/model/validations_spec.rb +11 -0
- data/spec/rcov.opts +2 -0
- metadata +178 -80
|
@@ -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,7 @@ describe "Database schema parser" do
|
|
|
85
108
|
INTEGRATION_DB.schema(:items).first.last[:ruby_default].should == 'blah'
|
|
86
109
|
end
|
|
87
110
|
|
|
88
|
-
|
|
111
|
+
cspecify "should parse types from the schema properly", [:jdbc, :db2], :oracle do
|
|
89
112
|
INTEGRATION_DB.create_table!(:items){Integer :number}
|
|
90
113
|
INTEGRATION_DB.schema(:items).first.last[:type].should == :integer
|
|
91
114
|
INTEGRATION_DB.create_table!(:items){Fixnum :number}
|
|
@@ -113,17 +136,20 @@ describe "Database schema parser" do
|
|
|
113
136
|
INTEGRATION_DB.create_table!(:items){FalseClass :number}
|
|
114
137
|
INTEGRATION_DB.schema(:items).first.last[:type].should == :boolean
|
|
115
138
|
end
|
|
116
|
-
end
|
|
117
|
-
end
|
|
139
|
+
end if INTEGRATION_DB.respond_to?(:schema_parse_table, true)
|
|
118
140
|
|
|
119
|
-
begin
|
|
120
|
-
INTEGRATION_DB.drop_table(:blah)
|
|
141
|
+
test_indexes = begin
|
|
142
|
+
INTEGRATION_DB.drop_table?(:blah)
|
|
121
143
|
INTEGRATION_DB.indexes(:blah)
|
|
144
|
+
true
|
|
122
145
|
rescue Sequel::NotImplemented
|
|
146
|
+
false
|
|
123
147
|
rescue
|
|
148
|
+
true
|
|
149
|
+
end
|
|
124
150
|
describe "Database index parsing" do
|
|
125
151
|
after do
|
|
126
|
-
INTEGRATION_DB.drop_table(:items)
|
|
152
|
+
INTEGRATION_DB.drop_table?(:items)
|
|
127
153
|
end
|
|
128
154
|
|
|
129
155
|
specify "should parse indexes into a hash" do
|
|
@@ -149,17 +175,71 @@ describe "Database index parsing" do
|
|
|
149
175
|
INTEGRATION_DB.create_table!(:items){Integer :n; Integer :a; primary_key [:n, :a]}
|
|
150
176
|
INTEGRATION_DB.indexes(:items).should == {}
|
|
151
177
|
end
|
|
178
|
+
end if test_indexes
|
|
179
|
+
|
|
180
|
+
test_foreign_key_list = begin
|
|
181
|
+
INTEGRATION_DB.drop_table?(:blah)
|
|
182
|
+
INTEGRATION_DB.foreign_key_list(:blah)
|
|
183
|
+
true
|
|
184
|
+
rescue Sequel::NotImplemented
|
|
185
|
+
false
|
|
186
|
+
rescue
|
|
187
|
+
true
|
|
152
188
|
end
|
|
153
|
-
|
|
189
|
+
describe "Database foreign key parsing" do
|
|
190
|
+
before do
|
|
191
|
+
@db = INTEGRATION_DB
|
|
192
|
+
@pr = lambda do |table, *expected|
|
|
193
|
+
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)}
|
|
194
|
+
actual.zip(expected).each do |a, e|
|
|
195
|
+
if e.last.first == :pk
|
|
196
|
+
if a.last == nil
|
|
197
|
+
a.pop
|
|
198
|
+
e.pop
|
|
199
|
+
else
|
|
200
|
+
e.last.shift
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
a.should == e
|
|
204
|
+
end
|
|
205
|
+
actual.length.should == expected.length
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
after do
|
|
209
|
+
@db.drop_table?(:b, :a)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
specify "should parse foreign key information into an array of hashes" do
|
|
213
|
+
@db.create_table!(:a, :engine=>:InnoDB){primary_key :c; Integer :d; index :d, :unique=>true}
|
|
214
|
+
@db.create_table!(:b, :engine=>:InnoDB){foreign_key :e, :a}
|
|
215
|
+
@pr[:a]
|
|
216
|
+
@pr[:b, [[:e], :a, [:pk, :c]]]
|
|
217
|
+
|
|
218
|
+
@db.alter_table(:b){add_foreign_key :f, :a, :key=>[:d]}
|
|
219
|
+
@pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:d]]]
|
|
220
|
+
|
|
221
|
+
@db.alter_table(:b){add_foreign_key [:f], :a, :key=>[:c]}
|
|
222
|
+
@pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]]]
|
|
223
|
+
|
|
224
|
+
@db.alter_table(:a){add_index [:d, :c], :unique=>true}
|
|
225
|
+
@db.alter_table(:b){add_foreign_key [:f, :e], :a, :key=>[:d, :c]}
|
|
226
|
+
@pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]], [[:f, :e], :a, [:d, :c]]]
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
specify "should handle composite foreign and primary keys" do
|
|
230
|
+
@db.create_table!(:a, :engine=>:InnoDB){Integer :b; Integer :c; primary_key [:b, :c]; index [:c, :b], :unique=>true}
|
|
231
|
+
@db.create_table!(:b, :engine=>:InnoDB){Integer :e; Integer :f; foreign_key [:e, :f], :a; foreign_key [:f, :e], :a, :key=>[:c, :b]}
|
|
232
|
+
@pr[:b, [[:e, :f], :a, [:pk, :b, :c]], [[:f, :e], :a, [:c, :b]]]
|
|
233
|
+
end
|
|
234
|
+
end if test_foreign_key_list
|
|
154
235
|
|
|
155
236
|
describe "Database schema modifiers" do
|
|
156
237
|
before do
|
|
157
238
|
@db = INTEGRATION_DB
|
|
158
239
|
@ds = @db[:items]
|
|
159
|
-
clear_sqls
|
|
160
240
|
end
|
|
161
241
|
after do
|
|
162
|
-
@db.drop_table(:items
|
|
242
|
+
@db.drop_table?(:items, :items2)
|
|
163
243
|
end
|
|
164
244
|
|
|
165
245
|
specify "should create tables correctly" do
|
|
@@ -170,12 +250,60 @@ describe "Database schema modifiers" do
|
|
|
170
250
|
@ds.columns!.should == [:number]
|
|
171
251
|
end
|
|
172
252
|
|
|
253
|
+
specify "should create tables from select statements correctly" do
|
|
254
|
+
@db.create_table!(:items){Integer :number}
|
|
255
|
+
@ds.insert([10])
|
|
256
|
+
@db.create_table(:items2, :as=>@db[:items])
|
|
257
|
+
@db.schema(:items2, :reload=>true).map{|x| x.first}.should == [:number]
|
|
258
|
+
@db[:items2].columns.should == [:number]
|
|
259
|
+
@db[:items2].all.should == [{:number=>10}]
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
specify "should handle create table in a rolled back transaction" do
|
|
263
|
+
@db.drop_table?(:items)
|
|
264
|
+
@db.transaction(:rollback=>:always){@db.create_table(:items){Integer :number}}
|
|
265
|
+
@db.table_exists?(:items).should be_false
|
|
266
|
+
end if INTEGRATION_DB.supports_transactional_ddl?
|
|
267
|
+
|
|
268
|
+
describe "join tables" do
|
|
269
|
+
after do
|
|
270
|
+
@db.drop_join_table(:cat_id=>:cats, :dog_id=>:dogs) if @db.table_exists?(:cats_dogs)
|
|
271
|
+
@db.drop_table(:cats, :dogs)
|
|
272
|
+
@db.table_exists?(:cats_dogs).should == false
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
specify "should create join tables correctly" do
|
|
276
|
+
@db.create_table!(:cats){primary_key :id}
|
|
277
|
+
@db.create_table!(:dogs){primary_key :id}
|
|
278
|
+
@db.create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
|
|
279
|
+
@db.table_exists?(:cats_dogs).should == true
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
|
|
173
283
|
specify "should create temporary tables without raising an exception" do
|
|
174
284
|
@db.create_table!(:items, :temp=>true){Integer :number}
|
|
175
285
|
end
|
|
176
286
|
|
|
287
|
+
specify "should have create_table? only create the table if it doesn't already exist" do
|
|
288
|
+
@db.create_table!(:items){String :a}
|
|
289
|
+
@db.create_table?(:items){String :b}
|
|
290
|
+
@db[:items].columns.should == [:a]
|
|
291
|
+
@db.drop_table?(:items)
|
|
292
|
+
@db.create_table?(:items){String :b}
|
|
293
|
+
@db[:items].columns.should == [:b]
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
specify "should have create_table? work correctly with indexes" do
|
|
297
|
+
@db.create_table!(:items){String :a, :index=>true}
|
|
298
|
+
@db.create_table?(:items){String :b, :index=>true}
|
|
299
|
+
@db[:items].columns.should == [:a]
|
|
300
|
+
@db.drop_table?(:items)
|
|
301
|
+
@db.create_table?(:items){String :b, :index=>true}
|
|
302
|
+
@db[:items].columns.should == [:b]
|
|
303
|
+
end
|
|
304
|
+
|
|
177
305
|
specify "should rename tables correctly" do
|
|
178
|
-
@db.drop_table(:items)
|
|
306
|
+
@db.drop_table?(:items)
|
|
179
307
|
@db.create_table!(:items2){Integer :number}
|
|
180
308
|
@db.rename_table(:items2, :items)
|
|
181
309
|
@db.table_exists?(:items).should == true
|
|
@@ -215,24 +343,34 @@ describe "Database schema modifiers" do
|
|
|
215
343
|
specify "should add columns to tables correctly" do
|
|
216
344
|
@db.create_table!(:items){Integer :number}
|
|
217
345
|
@ds.insert(:number=>10)
|
|
218
|
-
@db.alter_table(:items){add_column :name,
|
|
346
|
+
@db.alter_table(:items){add_column :name, String}
|
|
219
347
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:number, :name]
|
|
220
348
|
@ds.columns!.should == [:number, :name]
|
|
221
349
|
@ds.all.should == [{:number=>10, :name=>nil}]
|
|
222
350
|
end
|
|
223
351
|
|
|
224
|
-
cspecify "should add primary key columns to tables correctly", :h2 do
|
|
352
|
+
cspecify "should add primary key columns to tables correctly", :h2, :derby do
|
|
225
353
|
@db.create_table!(:items){Integer :number}
|
|
226
354
|
@ds.insert(:number=>10)
|
|
227
355
|
@db.alter_table(:items){add_primary_key :id}
|
|
228
356
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:number, :id]
|
|
229
357
|
@ds.columns!.should == [:number, :id]
|
|
230
358
|
@ds.map(:number).should == [10]
|
|
359
|
+
proc{@ds.insert(:id=>@ds.map(:id).first)}.should raise_error
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
specify "should drop primary key constraints from tables correctly" do
|
|
363
|
+
@db.create_table!(:items){Integer :number; primary_key [:number], :name=>:items_pk}
|
|
364
|
+
@ds.insert(:number=>10)
|
|
365
|
+
@db.alter_table(:items){drop_constraint :items_pk, :type=>:primary_key}
|
|
366
|
+
@ds.map(:number).should == [10]
|
|
367
|
+
proc{@ds.insert(10)}.should_not raise_error
|
|
231
368
|
end
|
|
232
369
|
|
|
233
370
|
specify "should add foreign key columns to tables correctly" do
|
|
234
371
|
@db.create_table!(:items){primary_key :id}
|
|
235
|
-
|
|
372
|
+
@ds.insert
|
|
373
|
+
i = @ds.get(:id)
|
|
236
374
|
@db.alter_table(:items){add_foreign_key :item_id, :items}
|
|
237
375
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
|
|
238
376
|
@ds.columns!.should == [:id, :item_id]
|
|
@@ -269,7 +407,22 @@ describe "Database schema modifiers" do
|
|
|
269
407
|
proc{@ds.insert(:n=>nil)}.should raise_error(Sequel::DatabaseError)
|
|
270
408
|
end
|
|
271
409
|
|
|
272
|
-
specify "should
|
|
410
|
+
specify "should rename columns when the table is referenced by a foreign key" do
|
|
411
|
+
begin
|
|
412
|
+
@db.create_table!(:itemsfk){primary_key :id; Integer :a}
|
|
413
|
+
@db.create_table!(:items){foreign_key :id, :itemsfk}
|
|
414
|
+
@db[:itemsfk].insert(:a=>10)
|
|
415
|
+
@ds.insert(:id=>1)
|
|
416
|
+
@db.alter_table(:itemsfk){rename_column :a, :b}
|
|
417
|
+
@db[:itemsfk].insert(:b=>20)
|
|
418
|
+
@ds.insert(:id=>2)
|
|
419
|
+
@db[:itemsfk].select_order_map([:id, :b]).should == [[1, 10], [2, 20]]
|
|
420
|
+
ensure
|
|
421
|
+
@db.drop_table(:items, :itemsfk)
|
|
422
|
+
end
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
cspecify "should set column NULL/NOT NULL correctly", [:jdbc, :db2], [:db2] do
|
|
273
426
|
@db.create_table!(:items, :engine=>:InnoDB){Integer :id}
|
|
274
427
|
@ds.insert(:id=>10)
|
|
275
428
|
@db.alter_table(:items){set_column_allow_null :id, false}
|
|
@@ -277,7 +430,7 @@ describe "Database schema modifiers" do
|
|
|
277
430
|
@ds.columns!.should == [:id]
|
|
278
431
|
proc{@ds.insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
|
|
279
432
|
@db.alter_table(:items){set_column_allow_null :id, true}
|
|
280
|
-
@ds.insert
|
|
433
|
+
@ds.insert(:id=>nil)
|
|
281
434
|
@ds.all.should == [{:id=>10}, {:id=>nil}]
|
|
282
435
|
end
|
|
283
436
|
|
|
@@ -291,28 +444,92 @@ describe "Database schema modifiers" do
|
|
|
291
444
|
@ds.all.should == [{:id=>10}, {:id=>20}]
|
|
292
445
|
end
|
|
293
446
|
|
|
294
|
-
|
|
447
|
+
cspecify "should set column types correctly", [:jdbc, :db2], [:db2], :oracle do
|
|
295
448
|
@db.create_table!(:items){Integer :id}
|
|
296
449
|
@ds.insert(:id=>10)
|
|
297
450
|
@db.alter_table(:items){set_column_type :id, String}
|
|
298
451
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id]
|
|
299
452
|
@ds.columns!.should == [:id]
|
|
300
|
-
@ds.insert(:id=>20)
|
|
453
|
+
@ds.insert(:id=>'20')
|
|
301
454
|
@ds.all.should == [{:id=>"10"}, {:id=>"20"}]
|
|
302
455
|
end
|
|
303
456
|
|
|
304
|
-
cspecify "should
|
|
305
|
-
@db.create_table!(:items){Integer :id
|
|
457
|
+
cspecify "should set column types without modifying NULL/NOT NULL", [:jdbc, :db2], [:db2], :oracle, :derby do
|
|
458
|
+
@db.create_table!(:items){Integer :id, :null=>false, :default=>2}
|
|
459
|
+
proc{@ds.insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
|
|
460
|
+
@db.alter_table(:items){set_column_type :id, String}
|
|
461
|
+
proc{@ds.insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
|
|
462
|
+
|
|
463
|
+
@db.create_table!(:items){Integer :id}
|
|
464
|
+
@ds.insert(:id=>nil)
|
|
465
|
+
@db.alter_table(:items){set_column_type :id, String}
|
|
466
|
+
@ds.insert(:id=>nil)
|
|
467
|
+
@ds.map(:id).should == [nil, nil]
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
cspecify "should set column types without modifying defaults", [:jdbc, :db2], [:db2], :oracle, :derby do
|
|
471
|
+
@db.create_table!(:items){Integer :id, :default=>0}
|
|
472
|
+
@ds.insert
|
|
473
|
+
@ds.map(:id).should == [0]
|
|
474
|
+
@db.alter_table(:items){set_column_type :id, String}
|
|
475
|
+
@ds.insert
|
|
476
|
+
@ds.map(:id).should == ['0', '0']
|
|
477
|
+
|
|
478
|
+
@db.create_table!(:items){String :id, :default=>'a'}
|
|
479
|
+
@ds.insert
|
|
480
|
+
@ds.map(:id).should == %w'a'
|
|
481
|
+
@db.alter_table(:items){set_column_type :id, String, :size=>1}
|
|
482
|
+
@ds.insert
|
|
483
|
+
@ds.map(:id).should == %w'a a'
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
specify "should add unnamed unique constraints and foreign key table constraints correctly" do
|
|
487
|
+
@db.create_table!(:items, :engine=>:InnoDB){Integer :id; Integer :item_id}
|
|
306
488
|
@db.alter_table(:items) do
|
|
307
489
|
add_unique_constraint [:item_id, :id]
|
|
308
490
|
add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id]
|
|
309
491
|
end
|
|
310
492
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
|
|
311
493
|
@ds.columns!.should == [:id, :item_id]
|
|
494
|
+
proc{@ds.insert(1, 1)}.should_not raise_error
|
|
495
|
+
proc{@ds.insert(1, 1)}.should raise_error
|
|
496
|
+
proc{@ds.insert(1, 2)}.should raise_error
|
|
312
497
|
end
|
|
313
498
|
|
|
314
|
-
|
|
499
|
+
specify "should add named unique constraints and foreign key table constraints correctly" do
|
|
500
|
+
@db.create_table!(:items, :engine=>:InnoDB){Integer :id, :null=>false; Integer :item_id, :null=>false}
|
|
501
|
+
@db.alter_table(:items) do
|
|
502
|
+
add_unique_constraint [:item_id, :id], :name=>:unique_iii
|
|
503
|
+
add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:fk_iii
|
|
504
|
+
end
|
|
505
|
+
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
|
|
506
|
+
@ds.columns!.should == [:id, :item_id]
|
|
507
|
+
proc{@ds.insert(1, 1)}.should_not raise_error
|
|
508
|
+
proc{@ds.insert(1, 1)}.should raise_error
|
|
509
|
+
proc{@ds.insert(1, 2)}.should raise_error
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
specify "should drop unique constraints and foreign key table constraints correctly" do
|
|
315
513
|
@db.create_table!(:items) do
|
|
514
|
+
Integer :id
|
|
515
|
+
Integer :item_id
|
|
516
|
+
unique [:item_id, :id], :name=>:items_uk
|
|
517
|
+
foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:items_fk
|
|
518
|
+
end
|
|
519
|
+
@db.alter_table(:items) do
|
|
520
|
+
drop_constraint(:items_fk, :type=>:foreign_key)
|
|
521
|
+
drop_constraint(:items_uk, :type=>:unique)
|
|
522
|
+
end
|
|
523
|
+
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
|
|
524
|
+
@ds.columns!.should == [:id, :item_id]
|
|
525
|
+
proc{@ds.insert(1, 2)}.should_not raise_error
|
|
526
|
+
proc{@ds.insert(1, 2)}.should_not raise_error
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
cspecify "should remove columns from tables correctly", :h2, :mssql, [:jdbc, :db2], :hsqldb do
|
|
530
|
+
# MySQL with InnoDB cannot drop foreign key columns unless you know the
|
|
531
|
+
# name of the constraint, see Bug #14347
|
|
532
|
+
@db.create_table!(:items, :engine=>:MyISAM) do
|
|
316
533
|
primary_key :id
|
|
317
534
|
String :name
|
|
318
535
|
Integer :number
|
|
@@ -332,7 +549,7 @@ describe "Database schema modifiers" do
|
|
|
332
549
|
@ds.columns!.should == [:id]
|
|
333
550
|
end
|
|
334
551
|
|
|
335
|
-
|
|
552
|
+
cspecify "should remove multiple columns in a single alter_table block", [:jdbc, :db2] do
|
|
336
553
|
@db.create_table!(:items) do
|
|
337
554
|
primary_key :id
|
|
338
555
|
String :name
|
|
@@ -350,10 +567,12 @@ describe "Database schema modifiers" do
|
|
|
350
567
|
end
|
|
351
568
|
end
|
|
352
569
|
|
|
353
|
-
begin
|
|
570
|
+
test_tables = begin
|
|
354
571
|
INTEGRATION_DB.tables
|
|
572
|
+
true
|
|
355
573
|
rescue Sequel::NotImplemented
|
|
356
|
-
|
|
574
|
+
false
|
|
575
|
+
end
|
|
357
576
|
describe "Database#tables" do
|
|
358
577
|
before do
|
|
359
578
|
class ::String
|
|
@@ -362,25 +581,72 @@ describe "Database#tables" do
|
|
|
362
581
|
"xxxxx#{@@xxxxx += 1}"
|
|
363
582
|
end
|
|
364
583
|
end
|
|
365
|
-
@
|
|
366
|
-
@
|
|
367
|
-
|
|
584
|
+
@db = INTEGRATION_DB
|
|
585
|
+
@db.create_table(:sequel_test_table){Integer :a}
|
|
586
|
+
@db.create_view :sequel_test_view, @db[:sequel_test_table]
|
|
587
|
+
@iom = @db.identifier_output_method
|
|
588
|
+
@iim = @db.identifier_input_method
|
|
368
589
|
end
|
|
369
590
|
after do
|
|
370
|
-
|
|
371
|
-
|
|
591
|
+
@db.identifier_output_method = @iom
|
|
592
|
+
@db.identifier_input_method = @iim
|
|
593
|
+
@db.drop_view :sequel_test_view
|
|
594
|
+
@db.drop_table :sequel_test_table
|
|
372
595
|
end
|
|
373
596
|
|
|
374
597
|
specify "should return an array of symbols" do
|
|
375
|
-
ts =
|
|
598
|
+
ts = @db.tables
|
|
376
599
|
ts.should be_a_kind_of(Array)
|
|
377
600
|
ts.each{|t| t.should be_a_kind_of(Symbol)}
|
|
601
|
+
ts.should include(:sequel_test_table)
|
|
602
|
+
ts.should_not include(:sequel_test_view)
|
|
378
603
|
end
|
|
379
604
|
|
|
380
605
|
specify "should respect the database's identifier_output_method" do
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
606
|
+
@db.identifier_output_method = :xxxxx
|
|
607
|
+
@db.identifier_input_method = :xxxxx
|
|
608
|
+
@db.tables.each{|t| t.to_s.should =~ /\Ax{5}\d+\z/}
|
|
384
609
|
end
|
|
610
|
+
end if test_tables
|
|
611
|
+
|
|
612
|
+
test_views = begin
|
|
613
|
+
INTEGRATION_DB.views
|
|
614
|
+
true
|
|
615
|
+
rescue Sequel::NotImplemented
|
|
616
|
+
false
|
|
385
617
|
end
|
|
386
|
-
|
|
618
|
+
describe "Database#views" do
|
|
619
|
+
before do
|
|
620
|
+
class ::String
|
|
621
|
+
@@xxxxx = 0
|
|
622
|
+
def xxxxx
|
|
623
|
+
"xxxxx#{@@xxxxx += 1}"
|
|
624
|
+
end
|
|
625
|
+
end
|
|
626
|
+
@db = INTEGRATION_DB
|
|
627
|
+
@db.create_table(:sequel_test_table){Integer :a}
|
|
628
|
+
@db.create_view :sequel_test_view, @db[:sequel_test_table]
|
|
629
|
+
@iom = @db.identifier_output_method
|
|
630
|
+
@iim = @db.identifier_input_method
|
|
631
|
+
end
|
|
632
|
+
after do
|
|
633
|
+
@db.identifier_output_method = @iom
|
|
634
|
+
@db.identifier_input_method = @iim
|
|
635
|
+
@db.drop_view :sequel_test_view
|
|
636
|
+
@db.drop_table :sequel_test_table
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
specify "should return an array of symbols" do
|
|
640
|
+
ts = @db.views
|
|
641
|
+
ts.should be_a_kind_of(Array)
|
|
642
|
+
ts.each{|t| t.should be_a_kind_of(Symbol)}
|
|
643
|
+
ts.should_not include(:sequel_test_table)
|
|
644
|
+
ts.should include(:sequel_test_view)
|
|
645
|
+
end
|
|
646
|
+
|
|
647
|
+
specify "should respect the database's identifier_output_method" do
|
|
648
|
+
@db.identifier_output_method = :xxxxx
|
|
649
|
+
@db.identifier_input_method = :xxxxx
|
|
650
|
+
@db.views.each{|t| t.to_s.should =~ /\Ax{5}\d+\z/}
|
|
651
|
+
end
|
|
652
|
+
end if test_views
|
|
@@ -9,12 +9,13 @@ begin
|
|
|
9
9
|
rescue LoadError
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
if ENV['SEQUEL_COLUMNS_INTROSPECTION']
|
|
13
|
+
Sequel.extension :columns_introspection
|
|
14
|
+
Sequel::Dataset.introspect_all_columns
|
|
15
|
+
end
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
$sqls.clear
|
|
17
|
-
end
|
|
17
|
+
Sequel::Model.use_transactions = false
|
|
18
|
+
Sequel::Model.cache_anonymous_models = false
|
|
18
19
|
|
|
19
20
|
unless defined?(RSpec)
|
|
20
21
|
module Spec::Matchers
|
|
@@ -29,45 +30,45 @@ unless defined?(RSpec)
|
|
|
29
30
|
end
|
|
30
31
|
end
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
begin
|
|
35
|
-
INTEGRATION_DB.loggers << Logger.new(STDOUT)
|
|
36
|
-
yield
|
|
37
|
-
ensure
|
|
38
|
-
INTEGRATION_DB.loggers.pop
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def self.log_specify(message, &block)
|
|
43
|
-
specify(message){log{instance_eval(&block)}}
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def self.cspecify(message, *checked, &block)
|
|
47
|
-
pending = false
|
|
33
|
+
def Sequel.guarded?(*checked)
|
|
34
|
+
unless ENV['SEQUEL_NO_PENDING']
|
|
48
35
|
checked.each do |c|
|
|
49
36
|
case c
|
|
50
37
|
when INTEGRATION_DB.database_type
|
|
51
|
-
|
|
38
|
+
return c
|
|
52
39
|
when Array
|
|
53
40
|
case c.length
|
|
54
41
|
when 1
|
|
55
|
-
|
|
42
|
+
return c if c.first == INTEGRATION_DB.adapter_scheme
|
|
56
43
|
when 2
|
|
57
44
|
if c.first.is_a?(Proc)
|
|
58
|
-
|
|
45
|
+
return c if c.first.call(INTEGRATION_DB) && c.last == INTEGRATION_DB.database_type
|
|
59
46
|
elsif c.last.is_a?(Proc)
|
|
60
|
-
|
|
47
|
+
return c if c.first == INTEGRATION_DB.adapter_scheme && c.last.call(INTEGRATION_DB)
|
|
61
48
|
else
|
|
62
|
-
|
|
49
|
+
return c if c.first == INTEGRATION_DB.adapter_scheme && c.last == INTEGRATION_DB.database_type
|
|
63
50
|
end
|
|
64
51
|
when 3
|
|
65
|
-
|
|
52
|
+
return c if c[0] == INTEGRATION_DB.adapter_scheme && c[1] == INTEGRATION_DB.database_type && c[2].call(INTEGRATION_DB)
|
|
66
53
|
end
|
|
67
54
|
end
|
|
68
|
-
break if pending
|
|
69
55
|
end
|
|
70
|
-
|
|
56
|
+
end
|
|
57
|
+
false
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
(defined?(RSpec) ? RSpec::Core::ExampleGroup : Spec::Example::ExampleGroup).class_eval do
|
|
61
|
+
def log
|
|
62
|
+
begin
|
|
63
|
+
INTEGRATION_DB.loggers << Logger.new(STDOUT)
|
|
64
|
+
yield
|
|
65
|
+
ensure
|
|
66
|
+
INTEGRATION_DB.loggers.pop
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def self.cspecify(message, *checked, &block)
|
|
71
|
+
if pending = Sequel.guarded?(*checked)
|
|
71
72
|
specify(message){pending("Not yet working on #{Array(pending).join(', ')}", &block)}
|
|
72
73
|
else
|
|
73
74
|
specify(message, &block)
|
|
@@ -82,5 +83,14 @@ if defined?(INTEGRATION_DB) || defined?(INTEGRATION_URL) || ENV['SEQUEL_INTEGRAT
|
|
|
82
83
|
#INTEGRATION_DB.instance_variable_set(:@server_version, 80100)
|
|
83
84
|
end
|
|
84
85
|
else
|
|
85
|
-
INTEGRATION_DB = Sequel.sqlite
|
|
86
|
+
INTEGRATION_DB = Sequel.sqlite
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
if INTEGRATION_DB.adapter_scheme == :ibmdb
|
|
90
|
+
def INTEGRATION_DB.drop_table(*tables)
|
|
91
|
+
super
|
|
92
|
+
rescue Sequel::DatabaseError
|
|
93
|
+
disconnect
|
|
94
|
+
super
|
|
95
|
+
end
|
|
86
96
|
end
|