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
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
+
|
|
3
|
+
describe "Sequel::Plugins::ManyToOnePkLookup" do
|
|
4
|
+
before do
|
|
5
|
+
class ::LookupModel < ::Sequel::Model
|
|
6
|
+
plugin :many_to_one_pk_lookup
|
|
7
|
+
columns :id, :caching_model_id, :caching_model_id2
|
|
8
|
+
many_to_one :caching_model
|
|
9
|
+
many_to_one :caching_model2, :key=>[:caching_model_id, :caching_model_id2], :class=>:CachingModel
|
|
10
|
+
end
|
|
11
|
+
@c = LookupModel
|
|
12
|
+
|
|
13
|
+
class ::CachingModel < Sequel::Model
|
|
14
|
+
columns :id, :id2
|
|
15
|
+
end
|
|
16
|
+
@cc = CachingModel
|
|
17
|
+
|
|
18
|
+
@db = MODEL_DB
|
|
19
|
+
end
|
|
20
|
+
after do
|
|
21
|
+
Object.send(:remove_const, :CachingModel)
|
|
22
|
+
Object.send(:remove_const, :LookupModel)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
shared_examples_for "many_to_one_pk_lookup with composite keys" do
|
|
26
|
+
it "should use a simple primary key lookup when retrieving many_to_one associated records" do
|
|
27
|
+
@db.sqls.should == []
|
|
28
|
+
@c.load(:id=>3, :caching_model_id=>1, :caching_model_id2=>2).caching_model2.should equal(@cm12)
|
|
29
|
+
@c.load(:id=>3, :caching_model_id=>2, :caching_model_id2=>1).caching_model2.should equal(@cm21)
|
|
30
|
+
@db.sqls.should == []
|
|
31
|
+
@c.load(:id=>4, :caching_model_id=>2, :caching_model_id2=>2).caching_model2
|
|
32
|
+
@db.sqls.should_not == []
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
shared_examples_for "many_to_one_pk_lookup" do
|
|
37
|
+
it "should use a simple primary key lookup when retrieving many_to_one associated records via a composite key" do
|
|
38
|
+
@cc.set_primary_key([:id, :id2])
|
|
39
|
+
@db.sqls.should == []
|
|
40
|
+
@c.load(:id=>3, :caching_model_id=>1).caching_model.should equal(@cm1)
|
|
41
|
+
@c.load(:id=>4, :caching_model_id=>2).caching_model.should equal(@cm2)
|
|
42
|
+
@db.sqls.should == []
|
|
43
|
+
@c.load(:id=>4, :caching_model_id=>3).caching_model
|
|
44
|
+
@db.sqls.should_not == []
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "should not use a simple primary key lookup if the assocation has a nil :key option" do
|
|
48
|
+
@c.many_to_one :caching_model, :key=>nil, :dataset=>proc{CachingModel.filter(:caching_model_id=>caching_model_id)}
|
|
49
|
+
@c.load(:id=>3, :caching_model_id=>1).caching_model
|
|
50
|
+
@db.sqls.should_not == []
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "should not use a simple primary key lookup if the assocation has a nil :key option" do
|
|
54
|
+
@c.many_to_one :caching_model, :many_to_one_pk_lookup=>false
|
|
55
|
+
@c.load(:id=>3, :caching_model_id=>1).caching_model
|
|
56
|
+
@db.sqls.should_not == []
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "should not use a simple primary key lookup if the assocation's :primary_key option doesn't match the primary key of the associated class" do
|
|
60
|
+
@c.many_to_one :caching_model, :primary_key=>:id2
|
|
61
|
+
@c.load(:id=>3, :caching_model_id=>1).caching_model
|
|
62
|
+
@db.sqls.should_not == []
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should not use a simple primary key lookup if the prepared_statements_associations method is being used" do
|
|
66
|
+
c2 = Class.new(Sequel::Model(:not_caching_model))
|
|
67
|
+
c2.dataset._fetch = {:id=>1}
|
|
68
|
+
c = Class.new(Sequel::Model(:lookup_model))
|
|
69
|
+
c.class_eval do
|
|
70
|
+
plugin :prepared_statements_associations
|
|
71
|
+
plugin :many_to_one_pk_lookup
|
|
72
|
+
columns :id, :caching_model_id
|
|
73
|
+
many_to_one :caching_model, :class=>c2
|
|
74
|
+
end
|
|
75
|
+
c.load(:id=>3, :caching_model_id=>1).caching_model.should == c2.load(:id=>1)
|
|
76
|
+
@db.sqls.should_not == []
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should use a simple primary key lookup if the prepared_statements_associations method is being used but associated model also uses caching" do
|
|
80
|
+
c = Class.new(Sequel::Model(:lookup_model))
|
|
81
|
+
c.class_eval do
|
|
82
|
+
plugin :prepared_statements_associations
|
|
83
|
+
plugin :many_to_one_pk_lookup
|
|
84
|
+
columns :id, :caching_model_id
|
|
85
|
+
many_to_one :caching_model
|
|
86
|
+
end
|
|
87
|
+
c.load(:id=>3, :caching_model_id=>1).caching_model.should equal(@cm1)
|
|
88
|
+
@db.sqls.should == []
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
describe "With caching plugin" do
|
|
93
|
+
before do
|
|
94
|
+
@cache_class = Class.new(Hash) do
|
|
95
|
+
attr_accessor :ttl
|
|
96
|
+
def set(k, v, ttl); self[k] = v; @ttl = ttl; end
|
|
97
|
+
def get(k); self[k]; end
|
|
98
|
+
end
|
|
99
|
+
cache = @cache_class.new
|
|
100
|
+
@cache = cache
|
|
101
|
+
|
|
102
|
+
@cc.plugin :caching, @cache
|
|
103
|
+
@cc.dataset._fetch = {:id=>1}
|
|
104
|
+
@cm1 = @cc[1]
|
|
105
|
+
@cm2 = @cc[2]
|
|
106
|
+
@cm12 = @cc[1, 2]
|
|
107
|
+
@cm21 = @cc[2, 1]
|
|
108
|
+
|
|
109
|
+
@db.reset
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it_should_behave_like "many_to_one_pk_lookup"
|
|
113
|
+
it_should_behave_like "many_to_one_pk_lookup with composite keys"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
describe "With static_cache plugin with single key" do
|
|
117
|
+
before do
|
|
118
|
+
@cc.dataset._fetch = [{:id=>1}, {:id=>2}]
|
|
119
|
+
@cc.plugin :static_cache
|
|
120
|
+
@cm1 = @cc[1]
|
|
121
|
+
@cm2 = @cc[2]
|
|
122
|
+
@db.reset
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it_should_behave_like "many_to_one_pk_lookup"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
describe "With static_cache plugin with composite key" do
|
|
129
|
+
before do
|
|
130
|
+
@cc.set_primary_key([:id, :id2])
|
|
131
|
+
@cc.dataset._fetch = [{:id=>1, :id2=>2}, {:id=>2, :id2=>1}]
|
|
132
|
+
@cc.plugin :static_cache
|
|
133
|
+
@cm12 = @cc[[1, 2]]
|
|
134
|
+
@cm21 = @cc[[2, 1]]
|
|
135
|
+
@db.reset
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it_should_behave_like "many_to_one_pk_lookup with composite keys"
|
|
139
|
+
end
|
|
140
|
+
end
|
|
@@ -129,6 +129,7 @@ describe "Reversible Migrations with Sequel.migration{change{}}" do
|
|
|
129
129
|
rename_column :e, :g
|
|
130
130
|
end
|
|
131
131
|
create_view(:c, 'SELECT * FROM b')
|
|
132
|
+
create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
|
|
132
133
|
end
|
|
133
134
|
end
|
|
134
135
|
|
|
@@ -150,13 +151,16 @@ describe "Reversible Migrations with Sequel.migration{change{}}" do
|
|
|
150
151
|
[:add_spatial_index, :e, {:name=>"e_s"}],
|
|
151
152
|
[:rename_column, :e, :g]]
|
|
152
153
|
],
|
|
153
|
-
[:create_view, :c, "SELECT * FROM b"]
|
|
154
|
+
[:create_view, :c, "SELECT * FROM b"],
|
|
155
|
+
[:create_join_table, {:cat_id=>:cats, :dog_id=>:dogs}]]
|
|
154
156
|
end
|
|
155
157
|
|
|
156
158
|
specify "should execute down with reversing actions in reverse order" do
|
|
157
159
|
p = @p
|
|
158
160
|
Sequel.migration{change(&p)}.apply(@db, :down)
|
|
159
|
-
@db.actions.should == [
|
|
161
|
+
@db.actions.should == [
|
|
162
|
+
[:drop_join_table, {:cat_id=>:cats, :dog_id=>:dogs}],
|
|
163
|
+
[:drop_view, :c],
|
|
160
164
|
[:alter_table, [
|
|
161
165
|
[:rename_column, :g, :e],
|
|
162
166
|
[:drop_index, :e, {:name=>"e_s"}],
|
|
@@ -195,14 +199,14 @@ end
|
|
|
195
199
|
|
|
196
200
|
describe "Sequel::IntegerMigrator" do
|
|
197
201
|
before do
|
|
198
|
-
dbc = Class.new(
|
|
202
|
+
dbc = Class.new(Sequel::Mock::Database) do
|
|
199
203
|
attr_reader :drops, :tables_created, :columns_created, :versions
|
|
200
204
|
def initialize(*args)
|
|
201
205
|
super
|
|
202
206
|
@drops = []
|
|
203
207
|
@tables_created = []
|
|
204
208
|
@columns_created = []
|
|
205
|
-
@versions = {}
|
|
209
|
+
@versions = Hash.new{|h,k| h[k.to_sym]}
|
|
206
210
|
end
|
|
207
211
|
|
|
208
212
|
def version; versions.values.first || 0; end
|
|
@@ -211,8 +215,8 @@ describe "Sequel::IntegerMigrator" do
|
|
|
211
215
|
|
|
212
216
|
def create_table(name, opts={}, &block)
|
|
213
217
|
super
|
|
214
|
-
@columns_created << / \(?(\w+) integer.*\)?\z/.match(sqls.last)[1].to_sym
|
|
215
|
-
@tables_created << name
|
|
218
|
+
@columns_created << / \(?(\w+) integer.*\)?\z/.match(@sqls.last)[1].to_sym
|
|
219
|
+
@tables_created << name.to_sym
|
|
216
220
|
end
|
|
217
221
|
|
|
218
222
|
def dataset(opts={})
|
|
@@ -220,15 +224,15 @@ describe "Sequel::IntegerMigrator" do
|
|
|
220
224
|
ds.extend(Module.new do
|
|
221
225
|
def count; 1; end
|
|
222
226
|
def columns; db.columns_created end
|
|
223
|
-
def insert(h); db.versions.merge!(h); db.
|
|
224
|
-
def update(h); db.versions.merge!(h); db.
|
|
227
|
+
def insert(h); db.versions.merge!(h); db.run insert_sql(h) end
|
|
228
|
+
def update(h); db.versions.merge!(h); db.run update_sql(h) end
|
|
225
229
|
def fetch_rows(sql); db.execute(sql); yield(db.versions) unless db.versions.empty? end
|
|
226
230
|
end)
|
|
227
231
|
ds
|
|
228
232
|
end
|
|
229
233
|
|
|
230
234
|
def table_exists?(name)
|
|
231
|
-
@tables_created.include?(name)
|
|
235
|
+
@tables_created.include?(name.to_sym)
|
|
232
236
|
end
|
|
233
237
|
end
|
|
234
238
|
@db = dbc.new
|
|
@@ -250,7 +254,7 @@ describe "Sequel::IntegerMigrator" do
|
|
|
250
254
|
|
|
251
255
|
specify "should add a column name if it doesn't already exist in the schema_info table" do
|
|
252
256
|
@db.create_table(:schema_info){Integer :v}
|
|
253
|
-
@db.should_receive(:alter_table).with(
|
|
257
|
+
@db.should_receive(:alter_table).with('schema_info')
|
|
254
258
|
Sequel::Migrator.apply(@db, @dirname)
|
|
255
259
|
end
|
|
256
260
|
|
|
@@ -273,8 +277,20 @@ describe "Sequel::IntegerMigrator" do
|
|
|
273
277
|
@db.creates.should == [1111, 2222, 3333]
|
|
274
278
|
@db.version.should == 3
|
|
275
279
|
@db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.should == [1, 2, 3]
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
specify "should be able to tell whether there are outstanding migrations" do
|
|
283
|
+
Sequel::Migrator.is_current?(@db, @dirname).should be_false
|
|
284
|
+
Sequel::Migrator.apply(@db, @dirname)
|
|
285
|
+
Sequel::Migrator.is_current?(@db, @dirname).should be_true
|
|
276
286
|
end
|
|
277
287
|
|
|
288
|
+
specify "should have #check_current raise an exception if the migrator is not current" do
|
|
289
|
+
proc{Sequel::Migrator.check_current(@db, @dirname)}.should raise_error(Sequel::Migrator::NotCurrentError)
|
|
290
|
+
Sequel::Migrator.apply(@db, @dirname)
|
|
291
|
+
proc{Sequel::Migrator.check_current(@db, @dirname)}.should_not raise_error
|
|
292
|
+
end
|
|
293
|
+
|
|
278
294
|
specify "should apply migrations correctly in the up direction with target" do
|
|
279
295
|
Sequel::Migrator.apply(@db, @dirname, 2)
|
|
280
296
|
@db.creates.should == [1111, 2222]
|
|
@@ -311,64 +327,106 @@ describe "Sequel::IntegerMigrator" do
|
|
|
311
327
|
Sequel::Migrator.apply(@db, @dirname, 0).should == 0
|
|
312
328
|
Sequel::Migrator.apply(@db, @dirname).should == 3
|
|
313
329
|
end
|
|
330
|
+
|
|
331
|
+
specify "should use IntegerMigrator if IntegerMigrator.apply called, even for timestamped migration directory" do
|
|
332
|
+
proc{Sequel::IntegerMigrator.apply(@db, "spec/files/timestamped_migrations")}.should raise_error(Sequel::Migrator::Error)
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
specify "should not use transactions by default" do
|
|
336
|
+
Sequel::Migrator.apply(@db, "spec/files/transaction_unspecified_migrations")
|
|
337
|
+
@db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2"]
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
specify "should use transactions by default if the database supports transactional ddl" do
|
|
341
|
+
@db.meta_def(:supports_transactional_ddl?){true}
|
|
342
|
+
Sequel::Migrator.apply(@db, "spec/files/transaction_unspecified_migrations")
|
|
343
|
+
@db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2", "COMMIT"]
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
specify "should respect transaction use on a per migration basis" do
|
|
347
|
+
@db.meta_def(:supports_transactional_ddl?){true}
|
|
348
|
+
Sequel::Migrator.apply(@db, "spec/files/transaction_specified_migrations")
|
|
349
|
+
@db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "COMMIT", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2"]
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
specify "should force transactions if enabled in the migrator" do
|
|
353
|
+
Sequel::Migrator.run(@db, "spec/files/transaction_specified_migrations", :use_transactions=>true)
|
|
354
|
+
@db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2", "COMMIT"]
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
specify "should not use transactions if disabled in the migrator" do
|
|
358
|
+
Sequel::Migrator.run(@db, "spec/files/transaction_unspecified_migrations", :use_transactions=>false)
|
|
359
|
+
@db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2"]
|
|
360
|
+
end
|
|
314
361
|
end
|
|
315
362
|
|
|
316
363
|
describe "Sequel::TimestampMigrator" do
|
|
317
364
|
before do
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
365
|
+
sequel_migration_version = 0
|
|
366
|
+
@dsc = dsc = Class.new(Sequel::Mock::Dataset) do
|
|
367
|
+
self::FILES =[]
|
|
368
|
+
define_method(:sequel_migration_version){sequel_migration_version}
|
|
369
|
+
define_method(:sequel_migration_version=){|v| sequel_migration_version = v}
|
|
370
|
+
|
|
321
371
|
def columns
|
|
372
|
+
super
|
|
322
373
|
case opts[:from].first
|
|
323
|
-
when :schema_info
|
|
374
|
+
when :schema_info, 'schema_info'
|
|
324
375
|
[:version]
|
|
325
|
-
when :schema_migrations
|
|
376
|
+
when :schema_migrations, 'schema_migrations'
|
|
326
377
|
[:filename]
|
|
327
|
-
when :sm
|
|
378
|
+
when :sm, 'sm'
|
|
328
379
|
[:fn]
|
|
329
380
|
end
|
|
330
381
|
end
|
|
331
382
|
|
|
332
383
|
def fetch_rows(sql)
|
|
384
|
+
super
|
|
333
385
|
case opts[:from].first
|
|
334
|
-
when :schema_info
|
|
335
|
-
yield({:version
|
|
336
|
-
when :schema_migrations
|
|
337
|
-
|
|
338
|
-
when :sm
|
|
339
|
-
|
|
386
|
+
when :schema_info, 'schema_info'
|
|
387
|
+
yield({:version=>sequel_migration_version})
|
|
388
|
+
when :schema_migrations, 'schema_migrations'
|
|
389
|
+
self.class::FILES.sort.each{|f| yield(:filename=>f)}
|
|
390
|
+
when :sm, 'sm'
|
|
391
|
+
self.class::FILES.sort.each{|f| yield(:fn=>f)}
|
|
340
392
|
end
|
|
341
393
|
end
|
|
342
394
|
|
|
343
395
|
def insert(h={})
|
|
396
|
+
super
|
|
344
397
|
case opts[:from].first
|
|
345
|
-
when :schema_info
|
|
346
|
-
|
|
347
|
-
when :schema_migrations, :sm
|
|
348
|
-
|
|
398
|
+
when :schema_info, 'schema_info'
|
|
399
|
+
self.sequel_migration_version = h.values.first
|
|
400
|
+
when :schema_migrations, :sm, 'schema_migrations', 'sm'
|
|
401
|
+
self.class::FILES << h.values.first
|
|
349
402
|
end
|
|
350
403
|
end
|
|
351
404
|
|
|
352
405
|
def update(h={})
|
|
406
|
+
super
|
|
353
407
|
case opts[:from].first
|
|
354
|
-
when :schema_info
|
|
355
|
-
|
|
408
|
+
when :schema_info, 'schema_info'
|
|
409
|
+
self.sequel_migration_version = h.values.first
|
|
356
410
|
end
|
|
357
411
|
end
|
|
358
412
|
|
|
359
413
|
def delete
|
|
414
|
+
super
|
|
360
415
|
case opts[:from].first
|
|
361
|
-
when :schema_migrations, :sm
|
|
362
|
-
|
|
416
|
+
when :schema_migrations, :sm, 'schema_migrations', 'sm'
|
|
417
|
+
self.class::FILES.delete(opts[:where].args.last)
|
|
363
418
|
end
|
|
364
419
|
end
|
|
365
420
|
end
|
|
366
|
-
dbc = Class.new(
|
|
367
|
-
|
|
421
|
+
dbc = Class.new(Sequel::Mock::Database) do
|
|
422
|
+
self::Tables = tables= {}
|
|
368
423
|
define_method(:dataset){|*a| dsc.new(self, *a)}
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
424
|
+
def create_table(name, *args, &block)
|
|
425
|
+
super
|
|
426
|
+
self.class::Tables[name.to_sym] = true
|
|
427
|
+
end
|
|
428
|
+
define_method(:drop_table){|*names| super(*names); names.each{|n| tables.delete(n.to_sym)}}
|
|
429
|
+
define_method(:table_exists?){|name| super(name); tables.has_key?(name.to_sym)}
|
|
372
430
|
end
|
|
373
431
|
@db = dbc.new
|
|
374
432
|
@m = Sequel::Migrator
|
|
@@ -402,6 +460,22 @@ describe "Sequel::TimestampMigrator" do
|
|
|
402
460
|
@db[:schema_migrations].select_order_map(:filename).should == %w'1273253849_create_sessions.rb'
|
|
403
461
|
end
|
|
404
462
|
|
|
463
|
+
specify "should not be current when there are migrations to apply" do
|
|
464
|
+
@dir = 'spec/files/timestamped_migrations'
|
|
465
|
+
@m.apply(@db, @dir)
|
|
466
|
+
@m.is_current?(@db, @dir).should be_true
|
|
467
|
+
@dir = 'spec/files/interleaved_timestamped_migrations'
|
|
468
|
+
@m.is_current?(@db, @dir).should be_false
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
specify "should raise an exception if the migrator is not current" do
|
|
472
|
+
@dir = 'spec/files/timestamped_migrations'
|
|
473
|
+
@m.apply(@db, @dir)
|
|
474
|
+
proc{@m.check_current(@db, @dir)}.should_not raise_error
|
|
475
|
+
@dir = 'spec/files/interleaved_timestamped_migrations'
|
|
476
|
+
proc{@m.check_current(@db, @dir)}.should raise_error(Sequel::Migrator::NotCurrentError)
|
|
477
|
+
end
|
|
478
|
+
|
|
405
479
|
specify "should apply all missing files when migrating up" do
|
|
406
480
|
@dir = 'spec/files/timestamped_migrations'
|
|
407
481
|
@m.apply(@db, @dir)
|
|
@@ -556,4 +630,35 @@ describe "Sequel::TimestampMigrator" do
|
|
|
556
630
|
@m.apply(@db, @dir, 0).should == nil
|
|
557
631
|
@m.apply(@db, @dir).should == nil
|
|
558
632
|
end
|
|
633
|
+
|
|
634
|
+
specify "should use TimestampMigrator if TimestampMigrator.apply is called even for integer migrations directory" do
|
|
635
|
+
Sequel::TimestampMigrator.apply(@db, "spec/files/integer_migrations")
|
|
636
|
+
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm1111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_sessions.rb')", "CREATE TABLE sm2222 (smc2 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_nodes.rb')", "CREATE TABLE sm3333 (smc3 integer)", "INSERT INTO schema_migrations (filename) VALUES ('003_3_create_users.rb')"]
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
specify "should not use transactions by default" do
|
|
640
|
+
Sequel::TimestampMigrator.apply(@db, "spec/files/transaction_unspecified_migrations")
|
|
641
|
+
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
|
|
642
|
+
end
|
|
643
|
+
|
|
644
|
+
specify "should use transactions by default if database supports transactional ddl" do
|
|
645
|
+
@db.meta_def(:supports_transactional_ddl?){true}
|
|
646
|
+
Sequel::TimestampMigrator.apply(@db, "spec/files/transaction_unspecified_migrations")
|
|
647
|
+
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')", "COMMIT"]
|
|
648
|
+
end
|
|
649
|
+
|
|
650
|
+
specify "should support transaction use on a per migration basis" do
|
|
651
|
+
Sequel::TimestampMigrator.apply(@db, "spec/files/transaction_specified_migrations")
|
|
652
|
+
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "COMMIT", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
|
|
653
|
+
end
|
|
654
|
+
|
|
655
|
+
specify "should force transactions if enabled by the migrator" do
|
|
656
|
+
Sequel::TimestampMigrator.run(@db, "spec/files/transaction_specified_migrations", :use_transactions=>true)
|
|
657
|
+
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')", "COMMIT"]
|
|
658
|
+
end
|
|
659
|
+
|
|
660
|
+
specify "should not use transactions if disabled in the migrator" do
|
|
661
|
+
Sequel::TimestampMigrator.run(@db, "spec/files/transaction_unspecified_migrations", :use_transactions=>false)
|
|
662
|
+
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
|
|
663
|
+
end
|
|
559
664
|
end
|
|
@@ -12,7 +12,7 @@ describe "Sequel named_timezones extension" do
|
|
|
12
12
|
before do
|
|
13
13
|
@tz_in = TZInfo::Timezone.get('America/Los_Angeles')
|
|
14
14
|
@tz_out = TZInfo::Timezone.get('America/New_York')
|
|
15
|
-
@db =
|
|
15
|
+
@db = Sequel.mock
|
|
16
16
|
@dt = DateTime.civil(2009,6,1,10,20,30,0)
|
|
17
17
|
Sequel.application_timezone = 'America/Los_Angeles'
|
|
18
18
|
Sequel.database_timezone = 'America/New_York'
|
|
@@ -35,14 +35,12 @@ describe "Sequel named_timezones extension" do
|
|
|
35
35
|
Sequel.database_timezone.should == @tz_out
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
@db.sqls.should == ["INSERT INTO a VALUES ('2009-06-01 06:20:30-0400', '2009-06-01 06:20:30-0400', '2009-06-01 06:20:30-0400')"]
|
|
45
|
-
end
|
|
38
|
+
it "should convert datetimes going into the database to named database_timezone" do
|
|
39
|
+
ds = @db[:a]
|
|
40
|
+
def ds.supports_timestamp_timezones?; true; end
|
|
41
|
+
def ds.supports_timestamp_usecs?; false; end
|
|
42
|
+
ds.insert([@dt, DateTime.civil(2009,6,1,3,20,30,-7/24.0), DateTime.civil(2009,6,1,6,20,30,-1/6.0)])
|
|
43
|
+
@db.sqls.should == ["INSERT INTO a VALUES ('2009-06-01 06:20:30-0400', '2009-06-01 06:20:30-0400', '2009-06-01 06:20:30-0400')"]
|
|
46
44
|
end
|
|
47
45
|
|
|
48
46
|
it "should convert datetimes coming out of the database from database_timezone to application_timezone" do
|
|
@@ -66,8 +64,28 @@ describe "Sequel named_timezones extension" do
|
|
|
66
64
|
end
|
|
67
65
|
|
|
68
66
|
it "should work with the thread_local_timezones extension" do
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
q, q1, q2 = Queue.new, Queue.new, Queue.new
|
|
68
|
+
tz1, tz2 = nil, nil
|
|
69
|
+
t1 = Thread.new do
|
|
70
|
+
Sequel.thread_application_timezone = 'America/New_York'
|
|
71
|
+
q2.push nil
|
|
72
|
+
q.pop
|
|
73
|
+
tz1 = Sequel.application_timezone
|
|
74
|
+
end
|
|
75
|
+
t2 = Thread.new do
|
|
76
|
+
Sequel.thread_application_timezone = 'America/Los_Angeles'
|
|
77
|
+
q2.push nil
|
|
78
|
+
q1.pop
|
|
79
|
+
tz2 = Sequel.application_timezone
|
|
80
|
+
end
|
|
81
|
+
q2.pop
|
|
82
|
+
q2.pop
|
|
83
|
+
q.push nil
|
|
84
|
+
q1.push nil
|
|
85
|
+
t1.join
|
|
86
|
+
t2.join
|
|
87
|
+
tz1.should == @tz_out
|
|
88
|
+
tz2.should == @tz_in
|
|
71
89
|
end
|
|
72
90
|
end
|
|
73
91
|
end
|