sequel 5.8.0 → 5.38.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.
- checksums.yaml +4 -4
- data/CHANGELOG +409 -1795
- data/MIT-LICENSE +1 -1
- data/README.rdoc +4 -4
- data/bin/sequel +4 -0
- data/doc/advanced_associations.rdoc +136 -18
- data/doc/association_basics.rdoc +10 -5
- data/doc/cheat_sheet.rdoc +1 -0
- data/doc/code_order.rdoc +12 -2
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/mass_assignment.rdoc +3 -3
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +30 -8
- data/doc/postgresql.rdoc +107 -2
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/security.rdoc +10 -0
- data/doc/sharding.rdoc +42 -28
- data/doc/sql.rdoc +12 -0
- data/doc/testing.rdoc +24 -17
- data/doc/transactions.rdoc +78 -0
- data/doc/validations.rdoc +2 -2
- data/lib/sequel/adapters/ado.rb +26 -18
- data/lib/sequel/adapters/ado/access.rb +2 -2
- data/lib/sequel/adapters/ado/mssql.rb +5 -8
- data/lib/sequel/adapters/amalgalite.rb +1 -1
- data/lib/sequel/adapters/jdbc.rb +71 -27
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
- data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
- data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
- data/lib/sequel/adapters/mysql.rb +14 -15
- data/lib/sequel/adapters/mysql2.rb +5 -3
- data/lib/sequel/adapters/odbc.rb +4 -6
- data/lib/sequel/adapters/oracle.rb +7 -7
- data/lib/sequel/adapters/postgres.rb +52 -16
- data/lib/sequel/adapters/shared/access.rb +16 -12
- data/lib/sequel/adapters/shared/db2.rb +5 -0
- data/lib/sequel/adapters/shared/mssql.rb +41 -18
- data/lib/sequel/adapters/shared/mysql.rb +66 -19
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +341 -95
- data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
- data/lib/sequel/adapters/shared/sqlite.rb +174 -21
- data/lib/sequel/adapters/sqlanywhere.rb +33 -17
- data/lib/sequel/adapters/sqlite.rb +78 -68
- data/lib/sequel/adapters/tinytds.rb +14 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
- data/lib/sequel/connection_pool.rb +2 -6
- data/lib/sequel/connection_pool/sharded_single.rb +7 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +26 -11
- data/lib/sequel/core.rb +327 -319
- data/lib/sequel/database/connecting.rb +7 -8
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +68 -34
- data/lib/sequel/database/query.rb +6 -4
- data/lib/sequel/database/schema_generator.rb +31 -11
- data/lib/sequel/database/schema_methods.rb +32 -22
- data/lib/sequel/database/transactions.rb +129 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/dataset/actions.rb +34 -23
- data/lib/sequel/dataset/features.rb +34 -0
- data/lib/sequel/dataset/graph.rb +27 -11
- data/lib/sequel/dataset/misc.rb +17 -3
- data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
- data/lib/sequel/dataset/prepared_statements.rb +96 -26
- data/lib/sequel/dataset/query.rb +43 -8
- data/lib/sequel/dataset/sql.rb +189 -41
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +6 -6
- data/lib/sequel/extensions/connection_validator.rb +7 -6
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +53 -28
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +3 -1
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/integer64.rb +3 -1
- data/lib/sequel/extensions/looser_typecasting.rb +3 -3
- data/lib/sequel/extensions/migration.rb +13 -6
- data/lib/sequel/extensions/named_timezones.rb +84 -23
- data/lib/sequel/extensions/pg_array.rb +87 -79
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +34 -18
- data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +2 -0
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +168 -0
- data/lib/sequel/extensions/pg_range.rb +20 -10
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +3 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +1 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +13 -7
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/model/associations.rb +403 -69
- data/lib/sequel/model/base.rb +170 -90
- data/lib/sequel/model/plugins.rb +105 -0
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +3 -3
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +74 -22
- data/lib/sequel/plugins/association_proxies.rb +6 -2
- data/lib/sequel/plugins/auto_validations.rb +36 -17
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
- data/lib/sequel/plugins/composition.rb +13 -9
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/defaults_setter.rb +2 -2
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/finder.rb +2 -2
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/hook_class_methods.rb +17 -5
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +2 -2
- data/lib/sequel/plugins/json_serializer.rb +21 -14
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +22 -10
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +27 -5
- data/lib/sequel/plugins/pg_array_associations.rb +12 -9
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
- data/lib/sequel/plugins/prepared_statements.rb +6 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +20 -22
- data/lib/sequel/plugins/sharding.rb +13 -7
- data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +36 -17
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/tree.rb +49 -31
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/validation_class_methods.rb +11 -5
- data/lib/sequel/plugins/validation_helpers.rb +2 -2
- data/lib/sequel/sql.rb +120 -30
- data/lib/sequel/timezones.rb +55 -14
- data/lib/sequel/version.rb +6 -1
- metadata +101 -361
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1041
- data/spec/adapters/oracle_spec.rb +0 -327
- data/spec/adapters/postgres_spec.rb +0 -4000
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -600
- data/spec/bin_spec.rb +0 -269
- data/spec/core/connection_pool_spec.rb +0 -1228
- data/spec/core/database_spec.rb +0 -2673
- data/spec/core/dataset_spec.rb +0 -5419
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1344
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -306
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1820
- data/spec/core/spec_helper.rb +0 -23
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -762
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -202
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/class_table_inheritance_spec.rb +0 -568
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -133
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -395
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -141
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -74
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -380
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -275
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -840
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -109
- data/spec/extensions/nested_attributes_spec.rb +0 -703
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
- data/spec/extensions/pg_enum_spec.rb +0 -113
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -487
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -182
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -868
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -61
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -410
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -284
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -58
- data/spec/integration/associations_test.rb +0 -2513
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1880
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2302
- data/spec/integration/prepared_statement_test.rb +0 -398
- data/spec/integration/schema_test.rb +0 -869
- data/spec/integration/spec_helper.rb +0 -64
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -354
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4538
- data/spec/model/base_spec.rb +0 -817
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2262
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -953
- data/spec/model/plugins_spec.rb +0 -318
- data/spec/model/record_spec.rb +0 -2107
- data/spec/model/spec_helper.rb +0 -45
- data/spec/model/validations_spec.rb +0 -193
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
|
@@ -39,7 +39,9 @@
|
|
|
39
39
|
|
|
40
40
|
module Sequel
|
|
41
41
|
module DuplicateColumnsHandler
|
|
42
|
+
# :nocov:
|
|
42
43
|
CALLER_ARGS = (RUBY_VERSION >= '2.0' ? [0,1] : [0]).freeze
|
|
44
|
+
# :nocov:
|
|
43
45
|
|
|
44
46
|
# Customize handling of duplicate columns for this dataset.
|
|
45
47
|
def on_duplicate_columns(handler = (raise Error, "Must provide either an argument or a block to on_duplicate_columns" unless block_given?; nil), &block)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The escaped_like extension adds +escaped_like+ and +escaped_ilike+
|
|
4
|
+
# methods to Sequel::SQL::StringMethods, which allow them to be easily
|
|
5
|
+
# used with most of Sequel's expression objects. Example:
|
|
6
|
+
#
|
|
7
|
+
# DB[:table].where{string_column.escaped_like('?%', user_input)}
|
|
8
|
+
# # user_input is 'foo':
|
|
9
|
+
# # SELECT * FROM table WHERE string_column LIKE 'foo%' ESCAPE '\'
|
|
10
|
+
# # user_input is '%foo':
|
|
11
|
+
# # SELECT * FROM table WHERE string_column LIKE '\%foo%' ESCAPE '\'
|
|
12
|
+
#
|
|
13
|
+
# To load the extension:
|
|
14
|
+
#
|
|
15
|
+
# Sequel.extension :escaped_like
|
|
16
|
+
#
|
|
17
|
+
# Related modules: Sequel::SQL::StringMethods, Sequel::SQL::EscapedLikeExpression
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
module Sequel
|
|
21
|
+
module SQL
|
|
22
|
+
# Represents an pattern match SQL expression, where the pattern can depend
|
|
23
|
+
# upon interpolated values in a database-dependent manner.
|
|
24
|
+
class EscapedLikeExpression < Expression
|
|
25
|
+
include AliasMethods
|
|
26
|
+
include BooleanMethods
|
|
27
|
+
include CastMethods
|
|
28
|
+
include OrderMethods
|
|
29
|
+
|
|
30
|
+
# Initialize the expression. Arguments:
|
|
31
|
+
# expr :: Right hand site of LIKE/ILIKE operator, what you are matching against the pattern
|
|
32
|
+
# case_insensitive :: Whether the match is case sensitive
|
|
33
|
+
# placeholder_pattern :: The pattern to match against, with +?+ for the placeholders
|
|
34
|
+
# placeholder_values :: The string values for each +?+ in the placeholder pattern. Should be an
|
|
35
|
+
# array of strings, though it can be a single string if there is only
|
|
36
|
+
# a single placeholder.
|
|
37
|
+
def initialize(expr, case_sensitive, placeholder_pattern, placeholder_values)
|
|
38
|
+
@expr = expr
|
|
39
|
+
@method = case_sensitive ? :like : :ilike
|
|
40
|
+
@pattern = placeholder_pattern
|
|
41
|
+
unless placeholder_values.is_a?(Array)
|
|
42
|
+
placeholder_values = [placeholder_values].freeze
|
|
43
|
+
end
|
|
44
|
+
@values = placeholder_values
|
|
45
|
+
freeze
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Interpolate the pattern values into the placeholder pattern to get the final pattern,
|
|
49
|
+
# now that we have access to the dataset. Use the expression and final pattern and
|
|
50
|
+
# add an appropriate LIKE/ILIKE expression to the SQL being built.
|
|
51
|
+
def to_s_append(ds, sql)
|
|
52
|
+
i = -1
|
|
53
|
+
match_len = @values.length - 1
|
|
54
|
+
like_pattern = String.new
|
|
55
|
+
pattern = @pattern
|
|
56
|
+
while true
|
|
57
|
+
previous, q, pattern = pattern.partition('?')
|
|
58
|
+
like_pattern << previous
|
|
59
|
+
|
|
60
|
+
unless q.empty?
|
|
61
|
+
if i == match_len
|
|
62
|
+
raise Error, "Mismatched number of placeholders (#{i+1}) and placeholder arguments (#{@values.length}) for escaped like expression: #{@pattern.inspect}"
|
|
63
|
+
end
|
|
64
|
+
like_pattern << ds.escape_like(@values.at(i+=1))
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
if pattern.empty?
|
|
68
|
+
unless i == match_len
|
|
69
|
+
raise Error, "Mismatched number of placeholders (#{i+1}) and placeholder arguments (#{@values.length}) for escaped like expression: #{@pattern.inspect}"
|
|
70
|
+
end
|
|
71
|
+
break
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
ds.literal_append(sql, Sequel.send(@method, @expr, like_pattern))
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
module StringMethods
|
|
79
|
+
# Create a +EscapedLikeExpression+ case insensitive pattern match of the receiver
|
|
80
|
+
# with the patterns, interpolated escaped values for each +?+ placeholder in the
|
|
81
|
+
# pattern.
|
|
82
|
+
#
|
|
83
|
+
# Sequel[:a].escaped_ilike('?%', 'A') # "a" ILIKE 'A%' ESCAPE '\'
|
|
84
|
+
# Sequel[:a].escaped_ilike('?%', '%A') # "a" ILIKE '\%A%' ESCAPE '\'
|
|
85
|
+
def escaped_ilike(placeholder_pattern, placeholder_values)
|
|
86
|
+
EscapedLikeExpression.new(self, false, placeholder_pattern, placeholder_values)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Create a +EscapedLikeExpression+ case sensitive pattern match of the receiver
|
|
90
|
+
# with the patterns, interpolated escaped values for each +?+ placeholder in the
|
|
91
|
+
# pattern.
|
|
92
|
+
#
|
|
93
|
+
# Sequel[:a].escaped_like('?%', 'A') # "a" LIKE 'A%' ESCAPE '\'
|
|
94
|
+
# Sequel[:a].escaped_like('?%', '%A') # "a" LIKE '\%A%' ESCAPE '\'
|
|
95
|
+
def escaped_like(placeholder_pattern, placeholder_values)
|
|
96
|
+
EscapedLikeExpression.new(self, true, placeholder_pattern, placeholder_values)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -26,7 +26,9 @@ module Sequel
|
|
|
26
26
|
# for eval.
|
|
27
27
|
def eval_inspect(obj)
|
|
28
28
|
case obj
|
|
29
|
-
when
|
|
29
|
+
when BigDecimal
|
|
30
|
+
"Kernel::BigDecimal(#{obj.to_s.inspect})"
|
|
31
|
+
when Sequel::SQL::Blob, Sequel::LiteralString
|
|
30
32
|
"#{obj.class}.new(#{obj.to_s.inspect})"
|
|
31
33
|
when Sequel::SQL::ValueList
|
|
32
34
|
"#{obj.class}.new(#{obj.to_a.inspect})"
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The exclude_or_null extension adds Dataset#exclude_or_null and
|
|
4
|
+
# Dataset#exclude_or_null_having. These methods are similar to
|
|
5
|
+
# Dataset#exclude and Dataset#exclude_having, except that they
|
|
6
|
+
# will also exclude rows where the condition IS NULL.
|
|
7
|
+
#
|
|
8
|
+
# DB[:table].exclude_or_null(foo: 1)
|
|
9
|
+
# # SELECT * FROM table WHERE NOT coalesce((foo = 1), false)
|
|
10
|
+
#
|
|
11
|
+
# DB[:table].exclude_or_null{foo(bar) =~ 1}
|
|
12
|
+
# # SELECT * FROM table HAVING NOT coalesce((foo(bar) = 1), false))
|
|
13
|
+
#
|
|
14
|
+
# You can load this extension into specific datasets:
|
|
15
|
+
#
|
|
16
|
+
# ds = DB[:table]
|
|
17
|
+
# ds = ds.extension(:exclude_or_null)
|
|
18
|
+
#
|
|
19
|
+
# Or you can load it into all of a database's datasets, which
|
|
20
|
+
# is probably the desired behavior if you are using this extension:
|
|
21
|
+
#
|
|
22
|
+
# DB.extension(:exclude_or_null)
|
|
23
|
+
#
|
|
24
|
+
# Note, this extension works correctly on PostgreSQL, SQLite, MySQL,
|
|
25
|
+
# H2, and HSQLDB. However, it does not work correctly on Microsoft SQL Server,
|
|
26
|
+
# Oracle, DB2, SQLAnywhere, or Derby.
|
|
27
|
+
#
|
|
28
|
+
# Related module: Sequel::ExcludeOrNull
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
module Sequel
|
|
32
|
+
module ExcludeOrNull
|
|
33
|
+
# Performs the inverse of Dataset#where, but also excludes rows where the given
|
|
34
|
+
# condition IS NULL.
|
|
35
|
+
#
|
|
36
|
+
# DB[:items].exclude_or_null(category: 'software')
|
|
37
|
+
# # SELECT * FROM items WHERE NOT coalesce((category = 'software'), false)
|
|
38
|
+
#
|
|
39
|
+
# DB[:items].exclude_or_null(category: 'software', id: 3)
|
|
40
|
+
# # SELECT * FROM items WHERE NOT coalesce(((category = 'software') AND (id = 3)), false)
|
|
41
|
+
def exclude_or_null(*cond, &block)
|
|
42
|
+
add_filter(:where, cond, :or_null, &block)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# The same as exclude_or_null, but affecting the HAVING clause instead of the
|
|
46
|
+
# WHERE clause.
|
|
47
|
+
#
|
|
48
|
+
# DB[:items].select_group(:name).exclude_or_null_having{count(name) < 2}
|
|
49
|
+
# # SELECT name FROM items GROUP BY name HAVING NOT coalesce((count(name) < 2), true)
|
|
50
|
+
def exclude_or_null_having(*cond, &block)
|
|
51
|
+
add_filter(:having, cond, :or_null, &block)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
# Recognize :or_null value for invert, returning an expression for
|
|
57
|
+
# the invert of the condition or the condition being null.
|
|
58
|
+
def _invert_filter(cond, invert)
|
|
59
|
+
if invert == :or_null
|
|
60
|
+
~SQL::Function.new(:coalesce, cond, SQL::Constants::SQLFALSE)
|
|
61
|
+
else
|
|
62
|
+
super
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
Dataset.register_extension(:exclude_or_null, ExcludeOrNull)
|
|
68
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The fiber_concurrency extension changes the default concurrency
|
|
4
|
+
# primitive in Sequel to be Fiber.current instead of Thread.current.
|
|
5
|
+
# This is the value used in various hash keys to implement safe
|
|
6
|
+
# concurrency (thread-safe concurrency by default, fiber-safe
|
|
7
|
+
# concurrency with this extension. It can be enabled via:
|
|
8
|
+
#
|
|
9
|
+
# Sequel.extension :fiber_concurrency
|
|
10
|
+
#
|
|
11
|
+
# Related module: Sequel::FiberConcurrency
|
|
12
|
+
|
|
13
|
+
require 'fiber'
|
|
14
|
+
|
|
15
|
+
module Sequel
|
|
16
|
+
module FiberConcurrency
|
|
17
|
+
# Make the current concurrency primitive be Fiber.current.
|
|
18
|
+
def current
|
|
19
|
+
Fiber.current
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
extend FiberConcurrency
|
|
24
|
+
end
|
|
@@ -54,13 +54,6 @@ module Sequel
|
|
|
54
54
|
db.instance_variable_set(:@indexes, {})
|
|
55
55
|
end
|
|
56
56
|
|
|
57
|
-
# Remove the index cache for the given schema name
|
|
58
|
-
def remove_cached_schema(table)
|
|
59
|
-
k = quote_schema_table(table)
|
|
60
|
-
Sequel.synchronize{@indexes.delete(k)}
|
|
61
|
-
super
|
|
62
|
-
end
|
|
63
|
-
|
|
64
57
|
# Dump the index cache to the filename given in Marshal format.
|
|
65
58
|
def dump_index_cache(file)
|
|
66
59
|
File.open(file, 'wb'){|f| f.write(Marshal.dump(@indexes))}
|
|
@@ -101,6 +94,15 @@ module Sequel
|
|
|
101
94
|
Sequel.synchronize{@indexes[quoted_name] = result}
|
|
102
95
|
result
|
|
103
96
|
end
|
|
97
|
+
|
|
98
|
+
private
|
|
99
|
+
|
|
100
|
+
# Remove the index cache for the given schema name
|
|
101
|
+
def remove_cached_schema(table)
|
|
102
|
+
k = quote_schema_table(table)
|
|
103
|
+
Sequel.synchronize{@indexes.delete(k)}
|
|
104
|
+
super
|
|
105
|
+
end
|
|
104
106
|
end
|
|
105
107
|
|
|
106
108
|
Database.register_extension(:index_caching, IndexCaching)
|
|
@@ -20,7 +20,9 @@
|
|
|
20
20
|
#
|
|
21
21
|
module Sequel
|
|
22
22
|
module Integer64
|
|
23
|
-
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
# Use same type as used for :Bignum by default for generic integer value.
|
|
24
26
|
def type_literal_generic_integer(column)
|
|
25
27
|
type_literal_generic_bignum_symbol(column)
|
|
26
28
|
end
|
|
@@ -36,14 +36,14 @@ module Sequel
|
|
|
36
36
|
|
|
37
37
|
if RUBY_VERSION >= '2.4'
|
|
38
38
|
def _typecast_value_string_to_decimal(value)
|
|
39
|
-
BigDecimal
|
|
39
|
+
BigDecimal(value)
|
|
40
40
|
rescue
|
|
41
|
-
BigDecimal
|
|
41
|
+
BigDecimal('0.0')
|
|
42
42
|
end
|
|
43
43
|
else
|
|
44
44
|
# :nocov:
|
|
45
45
|
def _typecast_value_string_to_decimal(value)
|
|
46
|
-
BigDecimal
|
|
46
|
+
BigDecimal(value)
|
|
47
47
|
end
|
|
48
48
|
# :nocov:
|
|
49
49
|
end
|
|
@@ -68,6 +68,7 @@ module Sequel
|
|
|
68
68
|
# Allow calling private methods for backwards compatibility
|
|
69
69
|
@db.send(method_sym, *args, &block)
|
|
70
70
|
end
|
|
71
|
+
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
|
71
72
|
|
|
72
73
|
# This object responds to all methods the database responds to.
|
|
73
74
|
def respond_to_missing?(meth, include_private)
|
|
@@ -176,7 +177,7 @@ module Sequel
|
|
|
176
177
|
just_raise = true
|
|
177
178
|
end
|
|
178
179
|
if just_raise
|
|
179
|
-
Proc.new{raise Sequel::Error,
|
|
180
|
+
Proc.new{raise Sequel::Error, "irreversible migration method used in #{block.source_location.first}, you may need to write your own down method"}
|
|
180
181
|
else
|
|
181
182
|
actions = @actions.reverse
|
|
182
183
|
Proc.new do
|
|
@@ -329,7 +330,8 @@ module Sequel
|
|
|
329
330
|
# schema_migrations for timestamped migrations). in the database to keep track
|
|
330
331
|
# of the current migration version. If no migration version is stored in the
|
|
331
332
|
# database, the version is considered to be 0. If no target version is
|
|
332
|
-
# specified, the
|
|
333
|
+
# specified, or the target version specified is greater than the latest
|
|
334
|
+
# version available, the database is migrated to the latest version available in the
|
|
333
335
|
# migration directory.
|
|
334
336
|
#
|
|
335
337
|
# For example, to migrate the database to the latest version:
|
|
@@ -389,7 +391,8 @@ module Sequel
|
|
|
389
391
|
# using the :table and :column options.
|
|
390
392
|
# :relative :: Run the given number of migrations, with a positive number being migrations to migrate
|
|
391
393
|
# up, and a negative number being migrations to migrate down (IntegerMigrator only).
|
|
392
|
-
# :table :: The table containing the schema version (default: :schema_info
|
|
394
|
+
# :table :: The table containing the schema version (default: :schema_info for integer migrations and
|
|
395
|
+
# :schema_migrations for timestamped migrations).
|
|
393
396
|
# :target :: The target version to which to migrate. If not given, migrates to the maximum version.
|
|
394
397
|
#
|
|
395
398
|
# Examples:
|
|
@@ -405,6 +408,7 @@ module Sequel
|
|
|
405
408
|
# if the version number is greater than 20000101, otherwise uses the IntegerMigrator.
|
|
406
409
|
def self.migrator_class(directory)
|
|
407
410
|
if self.equal?(Migrator)
|
|
411
|
+
raise(Error, "Must supply a valid migration path") unless File.directory?(directory)
|
|
408
412
|
Dir.new(directory).each do |file|
|
|
409
413
|
next unless MIGRATION_FILE_PATTERN.match(file)
|
|
410
414
|
return TimestampMigrator if file.split('_', 2).first.to_i > 20000101
|
|
@@ -516,10 +520,8 @@ module Sequel
|
|
|
516
520
|
def initialize(db, directory, opts=OPTS)
|
|
517
521
|
super
|
|
518
522
|
@current = opts[:current] || current_migration_version
|
|
519
|
-
raise(Error, "No current version available") unless current
|
|
520
523
|
|
|
521
524
|
latest_version = latest_migration_version
|
|
522
|
-
|
|
523
525
|
@target = if opts[:target]
|
|
524
526
|
opts[:target]
|
|
525
527
|
elsif opts[:relative]
|
|
@@ -528,7 +530,7 @@ module Sequel
|
|
|
528
530
|
latest_version
|
|
529
531
|
end
|
|
530
532
|
|
|
531
|
-
raise(Error, "No target version available, probably because no migration files found or filenames don't follow the migration filename convention") unless target
|
|
533
|
+
raise(Error, "No target and/or latest version available, probably because no migration files found or filenames don't follow the migration filename convention") unless target && latest_version
|
|
532
534
|
|
|
533
535
|
if @target > latest_version
|
|
534
536
|
@target = latest_version
|
|
@@ -537,6 +539,11 @@ module Sequel
|
|
|
537
539
|
end
|
|
538
540
|
|
|
539
541
|
@direction = current < target ? :up : :down
|
|
542
|
+
|
|
543
|
+
if @direction == :down && @current >= @files.length
|
|
544
|
+
raise Migrator::Error, "Missing migration version(s) needed to migrate down to target version (current: #{current}, target: #{target})"
|
|
545
|
+
end
|
|
546
|
+
|
|
540
547
|
@migrations = get_migrations
|
|
541
548
|
end
|
|
542
549
|
|
|
@@ -2,18 +2,21 @@
|
|
|
2
2
|
#
|
|
3
3
|
# Allows the use of named timezones via TZInfo (requires tzinfo).
|
|
4
4
|
# Forces the use of DateTime as Sequel's datetime_class, since
|
|
5
|
-
#
|
|
6
|
-
# and UTC.
|
|
5
|
+
# historically, Ruby's Time class doesn't support timezones other
|
|
6
|
+
# than local and UTC. To continue using Ruby's Time class when using
|
|
7
|
+
# the named_timezones extension:
|
|
8
|
+
#
|
|
9
|
+
# # Load the extension
|
|
10
|
+
# Sequel.extension :named_timezones
|
|
11
|
+
#
|
|
12
|
+
# # Set Sequel.datetime_class back to Time
|
|
13
|
+
# Sequel.datetime_class = Time
|
|
7
14
|
#
|
|
8
15
|
# This allows you to either pass strings or TZInfo::Timezone
|
|
9
16
|
# instance to Sequel.database_timezone=, application_timezone=, and
|
|
10
17
|
# typecast_timezone=. If a string is passed, it is converted to a
|
|
11
18
|
# TZInfo::Timezone using TZInfo::Timezone.get.
|
|
12
19
|
#
|
|
13
|
-
# To load the extension:
|
|
14
|
-
#
|
|
15
|
-
# Sequel.extension :named_timezones
|
|
16
|
-
#
|
|
17
20
|
# Let's say you have the database server in New York and the
|
|
18
21
|
# application server in Los Angeles. For historical reasons, data
|
|
19
22
|
# is stored in local New York time, but the application server only
|
|
@@ -37,7 +40,8 @@
|
|
|
37
40
|
# Note that typecasting from the database timezone to the application
|
|
38
41
|
# timezone when fetching rows is dependent on the database adapter,
|
|
39
42
|
# and only works on adapters where Sequel itself does the conversion.
|
|
40
|
-
# It should work
|
|
43
|
+
# It should work with the mysql, postgres, sqlite, ibmdb, and jdbc
|
|
44
|
+
# adapters.
|
|
41
45
|
#
|
|
42
46
|
# Related module: Sequel::NamedTimezones
|
|
43
47
|
|
|
@@ -63,24 +67,81 @@ module Sequel
|
|
|
63
67
|
|
|
64
68
|
private
|
|
65
69
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
if RUBY_VERSION >= '2.6'
|
|
71
|
+
# Convert the given input Time (which must be in UTC) to the given input timezone,
|
|
72
|
+
# which should be a TZInfo::Timezone instance.
|
|
73
|
+
def convert_input_time_other(v, input_timezone)
|
|
74
|
+
Time.new(v.year, v.mon, v.day, v.hour, v.min, (v.sec + Rational(v.nsec, 1000000000)), input_timezone)
|
|
75
|
+
rescue TZInfo::AmbiguousTime
|
|
76
|
+
raise unless disamb = tzinfo_disambiguator_for(v)
|
|
77
|
+
period = input_timezone.period_for_local(v, &disamb)
|
|
78
|
+
offset = period.utc_total_offset
|
|
79
|
+
Time.at(v.to_i - offset, :in => input_timezone)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Convert the given input Time to the given output timezone,
|
|
83
|
+
# which should be a TZInfo::Timezone instance.
|
|
84
|
+
def convert_output_time_other(v, output_timezone)
|
|
85
|
+
Time.at(v.to_i, :in => output_timezone)
|
|
86
|
+
end
|
|
87
|
+
else
|
|
88
|
+
# :nodoc:
|
|
89
|
+
# :nocov:
|
|
90
|
+
def convert_input_time_other(v, input_timezone)
|
|
91
|
+
local_offset = input_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset
|
|
92
|
+
Time.new(1970, 1, 1, 0, 0, 0, local_offset) + v.to_i
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
if defined?(TZInfo::VERSION) && TZInfo::VERSION > '2'
|
|
96
|
+
def convert_output_time_other(v, output_timezone)
|
|
97
|
+
v = output_timezone.utc_to_local(v.getutc)
|
|
98
|
+
local_offset = output_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset
|
|
99
|
+
Time.new(1970, 1, 1, 0, 0, 0, local_offset) + v.to_i + local_offset
|
|
100
|
+
end
|
|
101
|
+
else
|
|
102
|
+
def convert_output_time_other(v, output_timezone)
|
|
103
|
+
v = output_timezone.utc_to_local(v.getutc)
|
|
104
|
+
local_offset = output_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset
|
|
105
|
+
Time.new(1970, 1, 1, 0, 0, 0, local_offset) + v.to_i
|
|
106
|
+
end
|
|
107
|
+
end
|
|
73
108
|
end
|
|
74
109
|
|
|
75
|
-
#
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
110
|
+
# Handle both TZInfo 1 and TZInfo 2
|
|
111
|
+
if defined?(TZInfo::VERSION) && TZInfo::VERSION > '2'
|
|
112
|
+
def convert_input_datetime_other(v, input_timezone)
|
|
113
|
+
local_offset = Rational(input_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset, 86400)
|
|
114
|
+
(v - local_offset).new_offset(local_offset)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def convert_output_datetime_other(v, output_timezone)
|
|
118
|
+
v = output_timezone.utc_to_local(v.new_offset(0))
|
|
119
|
+
|
|
120
|
+
# Force DateTime output instead of TZInfo::DateTimeWithOffset
|
|
121
|
+
DateTime.jd(v.jd, v.hour, v.minute, v.second + v.sec_fraction, v.offset, v.start)
|
|
122
|
+
end
|
|
123
|
+
# :nodoc:
|
|
124
|
+
# :nocov:
|
|
125
|
+
else
|
|
126
|
+
# Assume the given DateTime has a correct time but a wrong timezone. It is
|
|
127
|
+
# currently in UTC timezone, but it should be converted to the input_timezone.
|
|
128
|
+
# Keep the time the same but convert the timezone to the input_timezone.
|
|
129
|
+
# Expects the input_timezone to be a TZInfo::Timezone instance.
|
|
130
|
+
def convert_input_datetime_other(v, input_timezone)
|
|
131
|
+
local_offset = input_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset_rational
|
|
132
|
+
(v - local_offset).new_offset(local_offset)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Convert the given DateTime to use the given output_timezone.
|
|
136
|
+
# Expects the output_timezone to be a TZInfo::Timezone instance.
|
|
137
|
+
def convert_output_datetime_other(v, output_timezone)
|
|
138
|
+
# TZInfo 1 converts times, but expects the given DateTime to have an offset
|
|
139
|
+
# of 0 and always leaves the timezone offset as 0
|
|
140
|
+
v = output_timezone.utc_to_local(v.new_offset(0))
|
|
141
|
+
local_offset = output_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset_rational
|
|
142
|
+
# Convert timezone offset from UTC to the offset for the output_timezone
|
|
143
|
+
(v - local_offset).new_offset(local_offset)
|
|
144
|
+
end
|
|
84
145
|
end
|
|
85
146
|
|
|
86
147
|
# Returns TZInfo::Timezone instance if given a String.
|