sequel 3.21.0 → 3.41.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 +1131 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +106 -65
- data/Rakefile +59 -27
- data/bin/sequel +50 -26
- data/doc/active_record.rdoc +68 -52
- data/doc/advanced_associations.rdoc +201 -75
- data/doc/association_basics.rdoc +327 -79
- data/doc/bin_sequel.rdoc +144 -0
- 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 +576 -0
- data/doc/opening_databases.rdoc +121 -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/release_notes/3.40.0.txt +73 -0
- data/doc/release_notes/3.41.0.txt +155 -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/access.rb +334 -0
- data/lib/sequel/adapters/ado/mssql.rb +18 -12
- data/lib/sequel/adapters/ado.rb +69 -21
- data/lib/sequel/adapters/amalgalite.rb +17 -14
- data/lib/sequel/adapters/cubrid.rb +143 -0
- data/lib/sequel/adapters/db2.rb +178 -85
- data/lib/sequel/adapters/dbi.rb +19 -21
- 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 +20 -39
- data/lib/sequel/adapters/firebird.rb +33 -210
- data/lib/sequel/adapters/ibmdb.rb +452 -0
- data/lib/sequel/adapters/informix.rb +6 -29
- data/lib/sequel/adapters/jdbc/as400.rb +16 -34
- data/lib/sequel/adapters/jdbc/cubrid.rb +52 -0
- data/lib/sequel/adapters/jdbc/db2.rb +78 -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 +68 -31
- data/lib/sequel/adapters/jdbc/hsqldb.rb +189 -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 +16 -28
- 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 +72 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
- data/lib/sequel/adapters/jdbc.rb +308 -114
- data/lib/sequel/adapters/mock.rb +372 -0
- data/lib/sequel/adapters/mysql.rb +130 -230
- data/lib/sequel/adapters/mysql2.rb +64 -63
- data/lib/sequel/adapters/odbc/mssql.rb +17 -9
- data/lib/sequel/adapters/odbc.rb +29 -10
- data/lib/sequel/adapters/openbase.rb +7 -11
- data/lib/sequel/adapters/oracle.rb +364 -57
- data/lib/sequel/adapters/postgres.rb +379 -145
- data/lib/sequel/adapters/shared/access.rb +236 -11
- data/lib/sequel/adapters/shared/cubrid.rb +216 -0
- data/lib/sequel/adapters/shared/db2.rb +353 -0
- data/lib/sequel/adapters/shared/firebird.rb +231 -0
- data/lib/sequel/adapters/shared/informix.rb +53 -0
- data/lib/sequel/adapters/shared/mssql.rb +412 -116
- data/lib/sequel/adapters/shared/mysql.rb +396 -89
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +166 -0
- data/lib/sequel/adapters/shared/oracle.rb +262 -45
- data/lib/sequel/adapters/shared/postgres.rb +688 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +317 -96
- data/lib/sequel/adapters/sqlite.rb +109 -46
- 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 +31 -27
- data/lib/sequel/adapters/tinytds.rb +177 -25
- 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/split_alter_table.rb +36 -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 +23 -13
- data/lib/sequel/connection_pool/sharded_threaded.rb +64 -13
- data/lib/sequel/connection_pool/single.rb +11 -3
- data/lib/sequel/connection_pool/threaded.rb +69 -20
- data/lib/sequel/connection_pool.rb +20 -18
- data/lib/sequel/core.rb +143 -11
- data/lib/sequel/database/connecting.rb +66 -29
- 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 +192 -51
- data/lib/sequel/database/query.rb +299 -114
- data/lib/sequel/database/schema_generator.rb +103 -36
- data/lib/sequel/database/schema_methods.rb +310 -69
- 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 +322 -68
- data/lib/sequel/dataset/sql.rb +716 -293
- 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/connection_validator.rb +109 -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 +539 -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 +334 -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 +212 -0
- data/lib/sequel/extensions/pg_range.rb +513 -0
- data/lib/sequel/extensions/pg_range_ops.rb +150 -0
- data/lib/sequel/extensions/pg_row.rb +576 -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 +137 -16
- 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 +77 -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 +168 -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 +57 -12
- 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/touch.rb +18 -6
- 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 +2 -1
- data/lib/sequel/plugins/validation_helpers.rb +57 -4
- data/lib/sequel/plugins/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +721 -141
- 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 +53 -39
- data/spec/adapters/mssql_spec.rb +261 -66
- data/spec/adapters/mysql_spec.rb +597 -352
- data/spec/adapters/oracle_spec.rb +92 -117
- data/spec/adapters/postgres_spec.rb +2103 -341
- data/spec/adapters/spec_helper.rb +16 -6
- data/spec/adapters/sqlite_spec.rb +237 -76
- data/spec/core/connection_pool_spec.rb +270 -141
- data/spec/core/database_spec.rb +980 -524
- data/spec/core/dataset_spec.rb +1658 -1243
- data/spec/core/expression_filters_spec.rb +741 -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 +227 -33
- 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/connection_validator_spec.rb +118 -0
- 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 +324 -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 +200 -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 +340 -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 +65 -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 +53 -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 +77 -68
- data/spec/extensions/validation_helpers_spec.rb +48 -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 +25 -5
- data/spec/integration/dataset_test.rb +729 -141
- 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 +871 -160
- data/spec/integration/prepared_statement_test.rb +272 -128
- data/spec/integration/schema_test.rb +377 -57
- data/spec/integration/spec_helper.rb +49 -32
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +40 -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 +223 -81
- data/spec/core/core_sql_spec.rb +0 -451
data/lib/sequel/timezones.rb
CHANGED
|
@@ -39,6 +39,48 @@ module Sequel
|
|
|
39
39
|
convert_output_timestamp(v, Sequel.database_timezone)
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
+
# Converts the object to the given +output_timezone+.
|
|
43
|
+
def convert_output_timestamp(v, output_timezone)
|
|
44
|
+
if output_timezone
|
|
45
|
+
if v.is_a?(DateTime)
|
|
46
|
+
case output_timezone
|
|
47
|
+
when :utc
|
|
48
|
+
v.new_offset(0)
|
|
49
|
+
when :local
|
|
50
|
+
v.new_offset(local_offset_for_datetime(v))
|
|
51
|
+
else
|
|
52
|
+
convert_output_datetime_other(v, output_timezone)
|
|
53
|
+
end
|
|
54
|
+
else
|
|
55
|
+
v.send(output_timezone == :utc ? :getutc : :getlocal)
|
|
56
|
+
end
|
|
57
|
+
else
|
|
58
|
+
v
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Converts the given object from the given input timezone to the
|
|
63
|
+
# +application_timezone+ using +convert_input_timestamp+ and
|
|
64
|
+
# +convert_output_timestamp+.
|
|
65
|
+
def convert_timestamp(v, input_timezone)
|
|
66
|
+
begin
|
|
67
|
+
if v.is_a?(Date) && !v.is_a?(DateTime)
|
|
68
|
+
# Dates handled specially as they are assumed to already be in the application_timezone
|
|
69
|
+
if datetime_class == DateTime
|
|
70
|
+
DateTime.civil(v.year, v.month, v.day, 0, 0, 0, application_timezone == :local ? (defined?(Rational) ? Rational(Time.local(v.year, v.month, v.day).utc_offset, 86400) : Time.local(v.year, v.month, v.day).utc_offset/86400.0) : 0)
|
|
71
|
+
else
|
|
72
|
+
Time.send(application_timezone == :utc ? :utc : :local, v.year, v.month, v.day)
|
|
73
|
+
end
|
|
74
|
+
else
|
|
75
|
+
convert_output_timestamp(convert_input_timestamp(v, input_timezone), application_timezone)
|
|
76
|
+
end
|
|
77
|
+
rescue InvalidValue
|
|
78
|
+
raise
|
|
79
|
+
rescue => e
|
|
80
|
+
raise convert_exception_class(e, InvalidValue)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
42
84
|
# Convert the given object into an object of <tt>Sequel.datetime_class</tt> in the
|
|
43
85
|
# +application_timezone+. Used when coverting datetime/timestamp columns
|
|
44
86
|
# returned by the database.
|
|
@@ -103,26 +145,44 @@ module Sequel
|
|
|
103
145
|
v2
|
|
104
146
|
end
|
|
105
147
|
when Array
|
|
106
|
-
y, mo, d, h, mi, s = v
|
|
148
|
+
y, mo, d, h, mi, s, ns, off = v
|
|
107
149
|
if datetime_class == DateTime
|
|
108
|
-
|
|
150
|
+
s += (defined?(Rational) ? Rational(ns, 1000000000) : ns/1000000000.0) if ns
|
|
151
|
+
if off
|
|
152
|
+
DateTime.civil(y, mo, d, h, mi, s, off)
|
|
153
|
+
else
|
|
154
|
+
convert_input_datetime_no_offset(DateTime.civil(y, mo, d, h, mi, s), input_timezone)
|
|
155
|
+
end
|
|
109
156
|
else
|
|
110
|
-
Time.send(input_timezone == :utc ? :utc : :local, y, mo, d, h, mi, s)
|
|
157
|
+
Time.send(input_timezone == :utc ? :utc : :local, y, mo, d, h, mi, s, (ns ? ns / 1000.0 : 0))
|
|
158
|
+
end
|
|
159
|
+
when Hash
|
|
160
|
+
ary = [:year, :month, :day, :hour, :minute, :second, :nanos].map{|x| (v[x] || v[x.to_s]).to_i}
|
|
161
|
+
if (offset = (v[:offset] || v['offset']))
|
|
162
|
+
ary << offset
|
|
111
163
|
end
|
|
164
|
+
convert_input_timestamp(ary, input_timezone)
|
|
165
|
+
convert_input_timestamp(ary, input_timezone)
|
|
112
166
|
when Time
|
|
113
167
|
if datetime_class == DateTime
|
|
114
|
-
v.respond_to?(:to_datetime)
|
|
168
|
+
if v.respond_to?(:to_datetime)
|
|
169
|
+
v.to_datetime
|
|
170
|
+
else
|
|
171
|
+
# Ruby 1.8 code, %N not available and %z broken on Windows
|
|
172
|
+
offset_hours, offset_minutes = (v.utc_offset/60).divmod(60)
|
|
173
|
+
string_to_datetime(v.strftime("%Y-%m-%dT%H:%M:%S") << sprintf(".%06i%+03i%02i", v.usec, offset_hours, offset_minutes))
|
|
174
|
+
end
|
|
115
175
|
else
|
|
116
176
|
v
|
|
117
177
|
end
|
|
118
178
|
when DateTime
|
|
119
179
|
if datetime_class == DateTime
|
|
120
180
|
v
|
|
181
|
+
elsif v.respond_to?(:to_time)
|
|
182
|
+
v.to_time
|
|
121
183
|
else
|
|
122
|
-
|
|
184
|
+
string_to_datetime(v.strftime("%FT%T.%N%z"))
|
|
123
185
|
end
|
|
124
|
-
when Date
|
|
125
|
-
convert_input_timestamp(v.to_s, input_timezone)
|
|
126
186
|
else
|
|
127
187
|
raise InvalidValue, "Invalid convert_input_timestamp type: #{v.inspect}"
|
|
128
188
|
end
|
|
@@ -135,39 +195,6 @@ module Sequel
|
|
|
135
195
|
raise InvalidValue, "Invalid output_timezone: #{output_timezone.inspect}"
|
|
136
196
|
end
|
|
137
197
|
|
|
138
|
-
# Converts the object to the given +output_timezone+.
|
|
139
|
-
def convert_output_timestamp(v, output_timezone)
|
|
140
|
-
if output_timezone
|
|
141
|
-
if v.is_a?(DateTime)
|
|
142
|
-
case output_timezone
|
|
143
|
-
when :utc
|
|
144
|
-
v.new_offset(0)
|
|
145
|
-
when :local
|
|
146
|
-
v.new_offset(local_offset_for_datetime(v))
|
|
147
|
-
else
|
|
148
|
-
convert_output_datetime_other(v, output_timezone)
|
|
149
|
-
end
|
|
150
|
-
else
|
|
151
|
-
v.send(output_timezone == :utc ? :getutc : :getlocal)
|
|
152
|
-
end
|
|
153
|
-
else
|
|
154
|
-
v
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
# Converts the given object from the given input timezone to the
|
|
159
|
-
# +application_timezone+ using +convert_input_timestamp+ and
|
|
160
|
-
# +convert_output_timestamp+.
|
|
161
|
-
def convert_timestamp(v, input_timezone)
|
|
162
|
-
begin
|
|
163
|
-
convert_output_timestamp(convert_input_timestamp(v, input_timezone), Sequel.application_timezone)
|
|
164
|
-
rescue InvalidValue
|
|
165
|
-
raise
|
|
166
|
-
rescue => e
|
|
167
|
-
raise convert_exception_class(e, InvalidValue)
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
|
|
171
198
|
# Convert the timezone setter argument. Returns argument given by default,
|
|
172
199
|
# exists for easier overriding in extensions.
|
|
173
200
|
def convert_timezone_setter_arg(tz)
|
data/lib/sequel/version.rb
CHANGED
|
@@ -3,7 +3,7 @@ module Sequel
|
|
|
3
3
|
MAJOR = 3
|
|
4
4
|
# The minor version of Sequel. Bumped for every non-patch level
|
|
5
5
|
# release, generally around once a month.
|
|
6
|
-
MINOR =
|
|
6
|
+
MINOR = 41
|
|
7
7
|
# The tiny version of Sequel. Usually 0, only bumped for bugfix
|
|
8
8
|
# releases that fix regressions from previous versions.
|
|
9
9
|
TINY = 0
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# coding: utf-8
|
|
3
|
+
#Author: Roy L Zuo (roylzuo at gmail dot com)
|
|
4
|
+
#Description:
|
|
5
|
+
|
|
6
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
|
7
|
+
|
|
8
|
+
require ENV['SEQUEL_DB2_SPEC_REQUIRE'] if ENV['SEQUEL_DB2_SPEC_REQUIRE']
|
|
9
|
+
|
|
10
|
+
unless defined?(DB2_DB)
|
|
11
|
+
DB2_DB = Sequel.connect(ENV['SEQUEL_DB2_SPEC_DB']||DB2_URL)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
if DB2_DB.table_exists?(:test)
|
|
15
|
+
DB2_DB.drop_table :test
|
|
16
|
+
end
|
|
17
|
+
INTEGRATION_DB = DB2_DB unless defined?(INTEGRATION_DB)
|
|
18
|
+
|
|
19
|
+
describe Sequel::Database do
|
|
20
|
+
before do
|
|
21
|
+
@db = DB2_DB
|
|
22
|
+
@db.create_table(:test){String :a}
|
|
23
|
+
@ds = @db[:test]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
after do
|
|
27
|
+
@db.drop_table(:test)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
specify "should provide disconnect functionality after preparing a connection" do
|
|
31
|
+
@ds.prepare(:first, :a).call
|
|
32
|
+
@db.disconnect
|
|
33
|
+
@db.pool.size.should == 0
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
specify "should return version correctly" do
|
|
37
|
+
@db.db2_version.should match(/DB2 v/i)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
describe "Simple Dataset operations" do
|
|
42
|
+
before do
|
|
43
|
+
DB2_DB.create_table!(:items) do
|
|
44
|
+
Integer :id, :primary_key => true
|
|
45
|
+
Integer :number
|
|
46
|
+
end
|
|
47
|
+
@ds = DB2_DB[:items]
|
|
48
|
+
@ds.insert(:number=>10, :id => 1 )
|
|
49
|
+
end
|
|
50
|
+
after do
|
|
51
|
+
DB2_DB.drop_table(:items)
|
|
52
|
+
end
|
|
53
|
+
cspecify "should insert with a primary key specified", :mssql do
|
|
54
|
+
@ds.insert(:id=>100, :number=>20)
|
|
55
|
+
@ds.count.should == 2
|
|
56
|
+
@ds.order(:id).all.should == [{:id=>1, :number=>10}, {:id=>100, :number=>20}]
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
describe Sequel::Database do
|
|
61
|
+
before do
|
|
62
|
+
@db = DB2_DB
|
|
63
|
+
end
|
|
64
|
+
after do
|
|
65
|
+
@db.drop_table(:items)
|
|
66
|
+
end
|
|
67
|
+
specify "should parse primary keys from the schema properly" do
|
|
68
|
+
@db.create_table!(:items){Integer :number}
|
|
69
|
+
@db.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.should == []
|
|
70
|
+
@db.create_table!(:items){primary_key :number}
|
|
71
|
+
@db.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.should == [:number]
|
|
72
|
+
@db.create_table!(:items){Integer :number1, :null => false; Integer :number2, :null => false; primary_key [:number1, :number2]}
|
|
73
|
+
@db.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.should == [:number1, :number2]
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
describe "Sequel::IBMDB.convert_smallint_to_bool" do
|
|
78
|
+
before do
|
|
79
|
+
@db = DB2_DB
|
|
80
|
+
@db.create_table!(:booltest){column :b, 'smallint'; column :i, 'integer'}
|
|
81
|
+
@ds = @db[:booltest]
|
|
82
|
+
end
|
|
83
|
+
after do
|
|
84
|
+
Sequel::IBMDB.convert_smallint_to_bool = true
|
|
85
|
+
@db.drop_table(:booltest)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
specify "should consider smallint datatypes as boolean if set, but not larger smallints" do
|
|
89
|
+
@db.schema(:booltest, :reload=>true).first.last[:type].should == :boolean
|
|
90
|
+
@db.schema(:booltest, :reload=>true).first.last[:db_type].should match /smallint/i
|
|
91
|
+
Sequel::IBMDB.convert_smallint_to_bool = false
|
|
92
|
+
@db.schema(:booltest, :reload=>true).first.last[:type].should == :integer
|
|
93
|
+
@db.schema(:booltest, :reload=>true).first.last[:db_type].should match /smallint/i
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
specify "should return smallints as bools and integers as integers when set" do
|
|
97
|
+
Sequel::IBMDB.convert_smallint_to_bool = true
|
|
98
|
+
@ds.delete
|
|
99
|
+
@ds << {:b=>true, :i=>10}
|
|
100
|
+
@ds.all.should == [{:b=>true, :i=>10}]
|
|
101
|
+
@ds.delete
|
|
102
|
+
@ds << {:b=>false, :i=>0}
|
|
103
|
+
@ds.all.should == [{:b=>false, :i=>0}]
|
|
104
|
+
@ds.delete
|
|
105
|
+
@ds << {:b=>true, :i=>1}
|
|
106
|
+
@ds.all.should == [{:b=>true, :i=>1}]
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
specify "should return all smallints as integers when unset" do
|
|
110
|
+
Sequel::IBMDB.convert_smallint_to_bool = false
|
|
111
|
+
@ds.delete
|
|
112
|
+
@ds << {:b=>true, :i=>10}
|
|
113
|
+
@ds.all.should == [{:b=>1, :i=>10}]
|
|
114
|
+
@ds.delete
|
|
115
|
+
@ds << {:b=>false, :i=>0}
|
|
116
|
+
@ds.all.should == [{:b=>0, :i=>0}]
|
|
117
|
+
|
|
118
|
+
@ds.delete
|
|
119
|
+
@ds << {:b=>1, :i=>10}
|
|
120
|
+
@ds.all.should == [{:b=>1, :i=>10}]
|
|
121
|
+
@ds.delete
|
|
122
|
+
@ds << {:b=>0, :i=>0}
|
|
123
|
+
@ds.all.should == [{:b=>0, :i=>0}]
|
|
124
|
+
end
|
|
125
|
+
end if DB2_DB.adapter_scheme == :ibmdb
|
|
126
|
+
|
|
127
|
+
describe "Simple Dataset operations in transactions" do
|
|
128
|
+
before do
|
|
129
|
+
DB2_DB.create_table!(:items_insert_in_transaction) do
|
|
130
|
+
Integer :id, :primary_key => true
|
|
131
|
+
integer :number
|
|
132
|
+
end
|
|
133
|
+
@ds = DB2_DB[:items_insert_in_transaction]
|
|
134
|
+
end
|
|
135
|
+
after do
|
|
136
|
+
DB2_DB.drop_table(:items_insert_in_transaction)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
specify "should insert correctly with a primary key specified inside a transaction" do
|
|
140
|
+
DB2_DB.transaction do
|
|
141
|
+
@ds.insert(:id=>100, :number=>20)
|
|
142
|
+
@ds.count.should == 1
|
|
143
|
+
@ds.order(:id).all.should == [{:id=>100, :number=>20}]
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
@@ -247,74 +247,88 @@ end
|
|
|
247
247
|
describe "A Firebird database" do
|
|
248
248
|
before do
|
|
249
249
|
@db = FIREBIRD_DB
|
|
250
|
-
@db.drop_table(:posts)
|
|
250
|
+
@db.drop_table?(:posts)
|
|
251
251
|
@db.sqls.clear
|
|
252
252
|
end
|
|
253
253
|
|
|
254
254
|
specify "should allow us to name the sequences" do
|
|
255
255
|
@db.create_table(:posts){primary_key :id, :sequence_name => "seq_test"}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
256
|
+
check_sqls do
|
|
257
|
+
@db.sqls.should == [
|
|
258
|
+
"DROP SEQUENCE SEQ_TEST",
|
|
259
|
+
"CREATE TABLE POSTS (ID integer PRIMARY KEY )",
|
|
260
|
+
"CREATE SEQUENCE SEQ_TEST",
|
|
261
|
+
" CREATE TRIGGER BI_POSTS_ID for POSTS\n ACTIVE BEFORE INSERT position 0\n as begin\n if ((new.ID is null) or (new.ID = 0)) then\n begin\n new.ID = next value for seq_test;\n end\n end\n\n"
|
|
262
|
+
]
|
|
263
|
+
end
|
|
262
264
|
end
|
|
263
265
|
|
|
264
266
|
specify "should allow us to set the starting position for the sequences" do
|
|
265
267
|
@db.create_table(:posts){primary_key :id, :sequence_start_position => 999}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
268
|
+
check_sqls do
|
|
269
|
+
@db.sqls.should == [
|
|
270
|
+
"DROP SEQUENCE SEQ_POSTS_ID",
|
|
271
|
+
"CREATE TABLE POSTS (ID integer PRIMARY KEY )",
|
|
272
|
+
"CREATE SEQUENCE SEQ_POSTS_ID",
|
|
273
|
+
"ALTER SEQUENCE SEQ_POSTS_ID RESTART WITH 999",
|
|
274
|
+
" CREATE TRIGGER BI_POSTS_ID for POSTS\n ACTIVE BEFORE INSERT position 0\n as begin\n if ((new.ID is null) or (new.ID = 0)) then\n begin\n new.ID = next value for seq_posts_id;\n end\n end\n\n"
|
|
275
|
+
]
|
|
276
|
+
end
|
|
273
277
|
end
|
|
274
278
|
|
|
275
279
|
specify "should allow us to name and set the starting position for the sequences" do
|
|
276
280
|
@db.create_table(:posts){primary_key :id, :sequence_name => "seq_test", :sequence_start_position => 999}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
281
|
+
check_sqls do
|
|
282
|
+
@db.sqls.should == [
|
|
283
|
+
"DROP SEQUENCE SEQ_TEST",
|
|
284
|
+
"CREATE TABLE POSTS (ID integer PRIMARY KEY )",
|
|
285
|
+
"CREATE SEQUENCE SEQ_TEST",
|
|
286
|
+
"ALTER SEQUENCE SEQ_TEST RESTART WITH 999",
|
|
287
|
+
" CREATE TRIGGER BI_POSTS_ID for POSTS\n ACTIVE BEFORE INSERT position 0\n as begin\n if ((new.ID is null) or (new.ID = 0)) then\n begin\n new.ID = next value for seq_test;\n end\n end\n\n"
|
|
288
|
+
]
|
|
289
|
+
end
|
|
284
290
|
end
|
|
285
291
|
|
|
286
292
|
specify "should allow us to name the triggers" do
|
|
287
293
|
@db.create_table(:posts){primary_key :id, :trigger_name => "trig_test"}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
+
check_sqls do
|
|
295
|
+
@db.sqls.should == [
|
|
296
|
+
"DROP SEQUENCE SEQ_POSTS_ID",
|
|
297
|
+
"CREATE TABLE POSTS (ID integer PRIMARY KEY )",
|
|
298
|
+
"CREATE SEQUENCE SEQ_POSTS_ID",
|
|
299
|
+
" CREATE TRIGGER TRIG_TEST for POSTS\n ACTIVE BEFORE INSERT position 0\n as begin\n if ((new.ID is null) or (new.ID = 0)) then\n begin\n new.ID = next value for seq_posts_id;\n end\n end\n\n"
|
|
300
|
+
]
|
|
301
|
+
end
|
|
294
302
|
end
|
|
295
303
|
|
|
296
304
|
specify "should allow us to not create the sequence" do
|
|
297
305
|
@db.create_table(:posts){primary_key :id, :create_sequence => false}
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
306
|
+
check_sqls do
|
|
307
|
+
@db.sqls.should == [
|
|
308
|
+
"CREATE TABLE POSTS (ID integer PRIMARY KEY )",
|
|
309
|
+
" CREATE TRIGGER BI_POSTS_ID for POSTS\n ACTIVE BEFORE INSERT position 0\n as begin\n if ((new.ID is null) or (new.ID = 0)) then\n begin\n new.ID = next value for seq_posts_id;\n end\n end\n\n"
|
|
310
|
+
]
|
|
311
|
+
end
|
|
302
312
|
end
|
|
303
313
|
|
|
304
314
|
specify "should allow us to not create the trigger" do
|
|
305
315
|
@db.create_table(:posts){primary_key :id, :create_trigger => false}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
316
|
+
check_sqls do
|
|
317
|
+
@db.sqls.should == [
|
|
318
|
+
"DROP SEQUENCE SEQ_POSTS_ID",
|
|
319
|
+
"CREATE TABLE POSTS (ID integer PRIMARY KEY )",
|
|
320
|
+
"CREATE SEQUENCE SEQ_POSTS_ID",
|
|
321
|
+
]
|
|
322
|
+
end
|
|
311
323
|
end
|
|
312
324
|
|
|
313
325
|
specify "should allow us to not create either the sequence nor the trigger" do
|
|
314
326
|
@db.create_table(:posts){primary_key :id, :create_sequence => false, :create_trigger => false}
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
327
|
+
check_sqls do
|
|
328
|
+
@db.sqls.should == [
|
|
329
|
+
"CREATE TABLE POSTS (ID integer PRIMARY KEY )"
|
|
330
|
+
]
|
|
331
|
+
end
|
|
318
332
|
end
|
|
319
333
|
|
|
320
334
|
specify "should support column operations" do
|