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
data/lib/sequel/deprecated.rb
CHANGED
|
@@ -39,7 +39,7 @@ module Sequel
|
|
|
39
39
|
# Print the message and possibly backtrace to the output.
|
|
40
40
|
def self.deprecate(method, instead=nil)
|
|
41
41
|
return unless output
|
|
42
|
-
message = instead ? "#{method} is deprecated and will be removed in Sequel
|
|
42
|
+
message = instead ? "#{method} is deprecated and will be removed in Sequel 6. #{instead}." : method
|
|
43
43
|
message = "#{prefix}#{message}" if prefix
|
|
44
44
|
output.puts(message)
|
|
45
45
|
case b = backtrace_filter
|
|
@@ -60,7 +60,9 @@ module Sequel
|
|
|
60
60
|
# If using ruby 2.3+, use Module#deprecate_constant to deprecate the constant,
|
|
61
61
|
# otherwise do nothing as the ruby implementation does not support constant deprecation.
|
|
62
62
|
def self.deprecate_constant(mod, constant)
|
|
63
|
+
# :nocov:
|
|
63
64
|
if RUBY_VERSION > '2.3'
|
|
65
|
+
# :nocov:
|
|
64
66
|
mod.deprecate_constant(constant)
|
|
65
67
|
end
|
|
66
68
|
end
|
data/lib/sequel/exceptions.rb
CHANGED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The any_not_empty extension changes the behavior of Dataset#any?
|
|
4
|
+
# if called without a block. By default, this method uses the
|
|
5
|
+
# standard Enumerable behavior of enumerating results and seeing
|
|
6
|
+
# if any result is not false or nil. With this extension, it
|
|
7
|
+
# just checks whether the dataset is empty. This approach can
|
|
8
|
+
# be much faster if the dataset is currently large.
|
|
9
|
+
#
|
|
10
|
+
# DB[:table].any?
|
|
11
|
+
# # SELECT * FROM table
|
|
12
|
+
#
|
|
13
|
+
# DB[:table].extension(:any_not_empty).any?
|
|
14
|
+
# # SELECT 1 as one FROM table LIMIT 1
|
|
15
|
+
#
|
|
16
|
+
# You can load this extension into specific datasets:
|
|
17
|
+
#
|
|
18
|
+
# ds = DB[:table]
|
|
19
|
+
# ds = ds.extension(:any_not_empty)
|
|
20
|
+
#
|
|
21
|
+
# Or you can load it into all of a database's datasets, which
|
|
22
|
+
# is probably the desired behavior if you are using this extension:
|
|
23
|
+
#
|
|
24
|
+
# DB.extension(:any_not_empty)
|
|
25
|
+
#
|
|
26
|
+
# Note that this can result in any? returning a different result if
|
|
27
|
+
# the dataset has a row_proc that can return false or nil.
|
|
28
|
+
#
|
|
29
|
+
# Related module: Sequel::AnyNotEmpty
|
|
30
|
+
|
|
31
|
+
#
|
|
32
|
+
module Sequel
|
|
33
|
+
module AnyNotEmpty
|
|
34
|
+
# If a block is not given, return whether the dataset is not empty.
|
|
35
|
+
def any?
|
|
36
|
+
if block_given?
|
|
37
|
+
super
|
|
38
|
+
else
|
|
39
|
+
!empty?
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
Dataset.register_extension(:any_not_empty, AnyNotEmpty)
|
|
45
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The caller_logging extension includes caller information before
|
|
4
|
+
# query logging, showing which code caused the query. It skips
|
|
5
|
+
# internal Sequel code, showing the first non-Sequel caller line.
|
|
6
|
+
#
|
|
7
|
+
# DB.extension :caller_logging
|
|
8
|
+
# DB[:table].first
|
|
9
|
+
# # Logger:
|
|
10
|
+
# # (0.000041s) (source: /path/to/app/foo/t.rb:12 in `get_first`) SELECT * FROM table LIMIT 1
|
|
11
|
+
#
|
|
12
|
+
# You can further filter the caller lines by setting
|
|
13
|
+
# <tt>Database#caller_logging_ignore</tt> to a regexp of additional
|
|
14
|
+
# caller lines to ignore. This is useful if you have specific
|
|
15
|
+
# methods or internal extensions/plugins that you would also
|
|
16
|
+
# like to ignore as they obscure the code actually making the
|
|
17
|
+
# request.
|
|
18
|
+
#
|
|
19
|
+
# DB.caller_logging_ignore = %r{/path/to/app/lib/plugins}
|
|
20
|
+
#
|
|
21
|
+
# You can also format the caller before it is placed in the logger,
|
|
22
|
+
# using +caller_logging_formatter+:
|
|
23
|
+
#
|
|
24
|
+
# DB.caller_logging_formatter = lambda do |caller|
|
|
25
|
+
# "(#{caller.sub(/\A\/path\/to\/app\//, '')})"
|
|
26
|
+
# end
|
|
27
|
+
# DB[:table].first
|
|
28
|
+
# # Logger:
|
|
29
|
+
# # (0.000041s) (foo/t.rb:12 in `get_first`) SELECT * FROM table LIMIT 1
|
|
30
|
+
#
|
|
31
|
+
# Related module: Sequel::CallerLogging
|
|
32
|
+
|
|
33
|
+
require 'rbconfig'
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
module Sequel
|
|
37
|
+
module CallerLogging
|
|
38
|
+
SEQUEL_LIB_PATH = (File.expand_path('../../..', __FILE__) + '/').freeze
|
|
39
|
+
|
|
40
|
+
# A regexp of caller lines to ignore, in addition to internal Sequel and Ruby code.
|
|
41
|
+
attr_accessor :caller_logging_ignore
|
|
42
|
+
|
|
43
|
+
# A callable to format the external caller
|
|
44
|
+
attr_accessor :caller_logging_formatter
|
|
45
|
+
|
|
46
|
+
# Include caller information when logging query.
|
|
47
|
+
def log_connection_yield(sql, conn, args=nil)
|
|
48
|
+
if !@loggers.empty? && (external_caller = external_caller_for_log)
|
|
49
|
+
sql = "#{external_caller} #{sql}"
|
|
50
|
+
end
|
|
51
|
+
super
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
# The caller to log, ignoring internal Sequel and Ruby code, and user specified
|
|
57
|
+
# lines to ignore.
|
|
58
|
+
def external_caller_for_log
|
|
59
|
+
ignore = caller_logging_ignore
|
|
60
|
+
c = caller.find do |line|
|
|
61
|
+
!(line.start_with?(SEQUEL_LIB_PATH) ||
|
|
62
|
+
line.start_with?(RbConfig::CONFIG["rubylibdir"]) ||
|
|
63
|
+
(ignore && line =~ ignore))
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
if c
|
|
67
|
+
c = if formatter = caller_logging_formatter
|
|
68
|
+
formatter.call(c)
|
|
69
|
+
else
|
|
70
|
+
"(source: #{c})"
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
c
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
Database.register_extension(:caller_logging, CallerLogging)
|
|
79
|
+
end
|
|
@@ -75,8 +75,7 @@ module Sequel
|
|
|
75
75
|
when SQL::Identifier
|
|
76
76
|
c.value.to_sym
|
|
77
77
|
when SQL::QualifiedIdentifier
|
|
78
|
-
|
|
79
|
-
col.is_a?(SQL::Identifier) ? col.value.to_sym : col.to_sym
|
|
78
|
+
c.column.to_sym
|
|
80
79
|
when SQL::AliasedExpression
|
|
81
80
|
a = c.alias
|
|
82
81
|
a.is_a?(SQL::Identifier) ? a.value.to_sym : a.to_sym
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
module Sequel
|
|
33
33
|
module ConnectionExpiration
|
|
34
34
|
class Retry < Error; end
|
|
35
|
+
Sequel::Deprecation.deprecate_constant(self, :Retry)
|
|
35
36
|
|
|
36
37
|
# The number of seconds that need to pass since
|
|
37
38
|
# connection creation before expiring a connection.
|
|
@@ -72,22 +73,21 @@ module Sequel
|
|
|
72
73
|
# If it is expired, disconnect the connection, and retry with a new
|
|
73
74
|
# connection.
|
|
74
75
|
def acquire(*a)
|
|
75
|
-
|
|
76
|
+
conn = nil
|
|
77
|
+
1.times do
|
|
76
78
|
if (conn = super) &&
|
|
77
79
|
(cet = sync{@connection_expiration_timestamps[conn]}) &&
|
|
78
80
|
Sequel.elapsed_seconds_since(cet[0]) > cet[1]
|
|
79
81
|
|
|
80
82
|
if pool_type == :sharded_threaded
|
|
81
|
-
sync{allocated(a.last).delete(
|
|
83
|
+
sync{allocated(a.last).delete(Sequel.current)}
|
|
82
84
|
else
|
|
83
|
-
sync{@allocated.delete(
|
|
85
|
+
sync{@allocated.delete(Sequel.current)}
|
|
84
86
|
end
|
|
85
87
|
|
|
86
88
|
disconnect_connection(conn)
|
|
87
|
-
|
|
89
|
+
redo
|
|
88
90
|
end
|
|
89
|
-
rescue Retry
|
|
90
|
-
retry
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
conn
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
module Sequel
|
|
52
52
|
module ConnectionValidator
|
|
53
53
|
class Retry < Error; end
|
|
54
|
+
Sequel::Deprecation.deprecate_constant(self, :Retry)
|
|
54
55
|
|
|
55
56
|
# The number of seconds that need to pass since
|
|
56
57
|
# connection checkin before attempting to validate
|
|
@@ -94,23 +95,23 @@ module Sequel
|
|
|
94
95
|
# test the connection for validity. If it is not valid,
|
|
95
96
|
# disconnect the connection, and retry with a new connection.
|
|
96
97
|
def acquire(*a)
|
|
97
|
-
|
|
98
|
+
conn = nil
|
|
99
|
+
|
|
100
|
+
1.times do
|
|
98
101
|
if (conn = super) &&
|
|
99
102
|
(timer = sync{@connection_timestamps.delete(conn)}) &&
|
|
100
103
|
Sequel.elapsed_seconds_since(timer) > @connection_validation_timeout &&
|
|
101
104
|
!db.valid_connection?(conn)
|
|
102
105
|
|
|
103
106
|
if pool_type == :sharded_threaded
|
|
104
|
-
sync{allocated(a.last).delete(
|
|
107
|
+
sync{allocated(a.last).delete(Sequel.current)}
|
|
105
108
|
else
|
|
106
|
-
sync{@allocated.delete(
|
|
109
|
+
sync{@allocated.delete(Sequel.current)}
|
|
107
110
|
end
|
|
108
111
|
|
|
109
112
|
disconnect_connection(conn)
|
|
110
|
-
|
|
113
|
+
redo
|
|
111
114
|
end
|
|
112
|
-
rescue Retry
|
|
113
|
-
retry
|
|
114
115
|
end
|
|
115
116
|
|
|
116
117
|
conn
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The constant_sql_override extension allows you to change the SQL
|
|
4
|
+
# generated for Sequel constants.
|
|
5
|
+
#
|
|
6
|
+
# One possible use-case for this is to have Sequel::CURRENT_TIMESTAMP use UTC time when
|
|
7
|
+
# you have Sequel.database_timezone = :utc, but the database uses localtime when
|
|
8
|
+
# generating CURRENT_TIMESTAMP.
|
|
9
|
+
#
|
|
10
|
+
# You can set SQL overrides with Database#set_constant_sql:
|
|
11
|
+
#
|
|
12
|
+
# DB.set_constant_sql(Sequel::CURRENT_TIMESTAMP, "CURRENT_TIMESTAMP AT TIME ZONE 'UTC'")
|
|
13
|
+
#
|
|
14
|
+
# Now, using Sequel::CURRENT_TIMESTAMP will use your override instead:
|
|
15
|
+
#
|
|
16
|
+
# Album.where(released_at: Sequel::CURRENT_TIMESTAMP).sql
|
|
17
|
+
# # => SELECT "albums.*" FROM "albums" WHERE ("released_at" = CURRENT_TIMESTAMP AT TIME ZONE 'UTC')
|
|
18
|
+
#
|
|
19
|
+
# To use this extension, first load it into your Sequel::Database instance:
|
|
20
|
+
#
|
|
21
|
+
# DB.extension :constant_sql_override
|
|
22
|
+
#
|
|
23
|
+
# Related module: Sequel::ConstantSqlOverride
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
module Sequel
|
|
27
|
+
module ConstantSqlOverride
|
|
28
|
+
module DatabaseMethods
|
|
29
|
+
# Create the initial empty hash of constant sql overrides.
|
|
30
|
+
def self.extended(db)
|
|
31
|
+
db.instance_exec do
|
|
32
|
+
@constant_sqls ||= {}
|
|
33
|
+
extend_datasets(DatasetMethods)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Hash mapping constant symbols to SQL. For internal use only.
|
|
38
|
+
attr_reader :constant_sqls # :nodoc:
|
|
39
|
+
|
|
40
|
+
# Set the SQL to use for the given Sequel::SQL::Constant
|
|
41
|
+
def set_constant_sql(constant, override)
|
|
42
|
+
@constant_sqls[constant.constant] = override
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Freeze the constant_sqls hash to prevent adding new overrides.
|
|
46
|
+
def freeze
|
|
47
|
+
@constant_sqls.freeze
|
|
48
|
+
super
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
module DatasetMethods
|
|
53
|
+
# Use overridden constant SQL
|
|
54
|
+
def constant_sql_append(sql, constant)
|
|
55
|
+
if constant_sql = db.constant_sqls[constant]
|
|
56
|
+
sql << constant_sql
|
|
57
|
+
else
|
|
58
|
+
super
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
Database.register_extension(:constant_sql_override, ConstantSqlOverride::DatabaseMethods)
|
|
65
|
+
end
|
|
@@ -130,6 +130,10 @@
|
|
|
130
130
|
# readd all constraints you want to use inside the alter table block,
|
|
131
131
|
# making no other changes inside the alter_table block.
|
|
132
132
|
#
|
|
133
|
+
# Dropping a table will automatically delete all constraint validations for
|
|
134
|
+
# that table. However, altering a table (e.g. to drop a column) will not
|
|
135
|
+
# currently make any changes to the constraint validations metadata.
|
|
136
|
+
#
|
|
133
137
|
# Related module: Sequel::ConstraintValidations
|
|
134
138
|
|
|
135
139
|
#
|
|
@@ -264,6 +268,16 @@ module Sequel
|
|
|
264
268
|
end
|
|
265
269
|
end
|
|
266
270
|
|
|
271
|
+
# Drop all constraint validations for a table if dropping the table.
|
|
272
|
+
def drop_table(*names)
|
|
273
|
+
names.each do |name|
|
|
274
|
+
if !name.is_a?(Hash) && table_exists?(constraint_validations_table)
|
|
275
|
+
drop_constraint_validations_for(:table=>name)
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
super
|
|
279
|
+
end
|
|
280
|
+
|
|
267
281
|
# Drop the constraint validations table.
|
|
268
282
|
def drop_constraint_validations_table
|
|
269
283
|
drop_table(constraint_validations_table)
|
|
@@ -355,6 +369,18 @@ module Sequel
|
|
|
355
369
|
super
|
|
356
370
|
end
|
|
357
371
|
|
|
372
|
+
def constraint_validation_expression(cols, allow_nil)
|
|
373
|
+
exprs = cols.map do |c|
|
|
374
|
+
expr = yield c
|
|
375
|
+
if allow_nil
|
|
376
|
+
Sequel.|({c=>nil}, expr)
|
|
377
|
+
else
|
|
378
|
+
Sequel.&(Sequel.~(c=>nil), expr)
|
|
379
|
+
end
|
|
380
|
+
end
|
|
381
|
+
Sequel.&(*exprs)
|
|
382
|
+
end
|
|
383
|
+
|
|
358
384
|
# For the given table, generator, and validations, add constraints
|
|
359
385
|
# to the generator for each of the validations, as well as adding
|
|
360
386
|
# validation metadata to the constraint validations table.
|
|
@@ -365,28 +391,44 @@ module Sequel
|
|
|
365
391
|
|
|
366
392
|
case validation_type
|
|
367
393
|
when :presence
|
|
368
|
-
|
|
369
|
-
|
|
394
|
+
strings, non_strings = columns.partition{|c| generator_string_column?(generator, table, c)}
|
|
395
|
+
if !non_strings.empty? && !allow_nil
|
|
396
|
+
non_strings_expr = Sequel.&(*non_strings.map{|c| Sequel.~(c=>nil)})
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
unless strings.empty?
|
|
400
|
+
strings_expr = constraint_validation_expression(strings, allow_nil){|c| Sequel.~(Sequel.trim(c) => blank_string_value)}
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
expr = if non_strings_expr && strings_expr
|
|
404
|
+
Sequel.&(strings_expr, non_strings_expr)
|
|
405
|
+
else
|
|
406
|
+
strings_expr || non_strings_expr
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
if expr
|
|
410
|
+
generator.constraint(constraint, expr)
|
|
411
|
+
end
|
|
370
412
|
when :exact_length
|
|
371
|
-
|
|
413
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| {Sequel.char_length(c) => arg}})
|
|
372
414
|
when :min_length
|
|
373
|
-
|
|
415
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| Sequel.char_length(c) >= arg})
|
|
374
416
|
when :max_length
|
|
375
|
-
|
|
417
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| Sequel.char_length(c) <= arg})
|
|
376
418
|
when *REVERSE_OPERATOR_MAP.keys
|
|
377
|
-
|
|
419
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| Sequel.identifier(c).public_send(REVERSE_OPERATOR_MAP[validation_type], arg)})
|
|
378
420
|
when :length_range
|
|
379
421
|
op = arg.exclude_end? ? :< : :<=
|
|
380
|
-
|
|
422
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| (Sequel.char_length(c) >= arg.begin) & Sequel.char_length(c).public_send(op, arg.end)})
|
|
381
423
|
arg = "#{arg.begin}..#{'.' if arg.exclude_end?}#{arg.end}"
|
|
382
424
|
when :format
|
|
383
|
-
|
|
425
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| {c => arg}})
|
|
384
426
|
if arg.casefold?
|
|
385
427
|
validation_type = :iformat
|
|
386
428
|
end
|
|
387
429
|
arg = arg.source
|
|
388
430
|
when :includes
|
|
389
|
-
|
|
431
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| {c => arg}})
|
|
390
432
|
if arg.is_a?(Range)
|
|
391
433
|
if arg.begin.is_a?(Integer) && arg.end.is_a?(Integer)
|
|
392
434
|
validation_type = :includes_int_range
|
|
@@ -407,7 +449,7 @@ module Sequel
|
|
|
407
449
|
raise Error, "validates includes only supports arrays and ranges currently, cannot handle: #{arg.inspect}"
|
|
408
450
|
end
|
|
409
451
|
when :like, :ilike
|
|
410
|
-
|
|
452
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| Sequel.public_send(validation_type, c, arg)})
|
|
411
453
|
when :unique
|
|
412
454
|
generator.unique(columns, :name=>constraint)
|
|
413
455
|
columns = [columns.join(',')]
|
|
@@ -431,30 +473,13 @@ module Sequel
|
|
|
431
473
|
end
|
|
432
474
|
end
|
|
433
475
|
|
|
434
|
-
ds = from(
|
|
476
|
+
ds = from(constraint_validations_table)
|
|
435
477
|
unless drop_rows.empty?
|
|
436
478
|
ds.where([:table, :constraint_name]=>drop_rows).delete
|
|
437
479
|
end
|
|
438
480
|
ds.multi_insert(rows.flatten)
|
|
439
481
|
end
|
|
440
482
|
|
|
441
|
-
# Add the constraint to the generator, including a NOT NULL constraint
|
|
442
|
-
# for all columns unless the :allow_nil option is given.
|
|
443
|
-
def generator_add_constraint_from_validation(generator, val, cons)
|
|
444
|
-
if val[:allow_nil]
|
|
445
|
-
nil_cons = Sequel[val[:columns].map{|c| [c, nil]}]
|
|
446
|
-
cons = Sequel.|(nil_cons, cons) if cons
|
|
447
|
-
else
|
|
448
|
-
nil_cons = Sequel.negate(val[:columns].map{|c| [c, nil]})
|
|
449
|
-
cons = cons ? Sequel.&(nil_cons, cons) : nil_cons
|
|
450
|
-
end
|
|
451
|
-
|
|
452
|
-
if cons
|
|
453
|
-
generator.constraint(val[:name], cons)
|
|
454
|
-
end
|
|
455
|
-
end
|
|
456
|
-
|
|
457
|
-
|
|
458
483
|
# Introspect the generator to determine if column
|
|
459
484
|
# created is a string or not.
|
|
460
485
|
def generator_string_column?(generator, table, c)
|