sequel 5.20.0 → 5.49.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 +398 -1922
- data/MIT-LICENSE +1 -1
- data/README.rdoc +7 -7
- data/doc/advanced_associations.rdoc +4 -4
- data/doc/association_basics.rdoc +80 -16
- data/doc/cheat_sheet.rdoc +6 -5
- data/doc/code_order.rdoc +10 -12
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/fork_safety.rdoc +84 -0
- data/doc/migration.rdoc +11 -5
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +10 -2
- data/doc/postgresql.rdoc +82 -3
- data/doc/querying.rdoc +4 -4
- 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.39.0.txt +19 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/sharding.rdoc +2 -0
- data/doc/sql.rdoc +13 -1
- data/doc/testing.rdoc +20 -7
- data/doc/transactions.rdoc +0 -8
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +1 -1
- data/lib/sequel/adapters/ado/access.rb +1 -1
- data/lib/sequel/adapters/ado.rb +43 -35
- data/lib/sequel/adapters/ibmdb.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
- data/lib/sequel/adapters/jdbc.rb +24 -6
- data/lib/sequel/adapters/mysql.rb +1 -1
- data/lib/sequel/adapters/mysql2.rb +2 -3
- data/lib/sequel/adapters/odbc.rb +8 -6
- data/lib/sequel/adapters/oracle.rb +5 -4
- data/lib/sequel/adapters/postgres.rb +15 -9
- data/lib/sequel/adapters/shared/access.rb +6 -6
- data/lib/sequel/adapters/shared/mssql.rb +66 -21
- data/lib/sequel/adapters/shared/mysql.rb +27 -10
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +271 -32
- data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
- data/lib/sequel/adapters/shared/sqlite.rb +161 -19
- data/lib/sequel/adapters/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +15 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
- data/lib/sequel/ast_transformer.rb +6 -0
- data/lib/sequel/connection_pool/sharded_single.rb +4 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +2 -2
- data/lib/sequel/core.rb +333 -319
- data/lib/sequel/database/connecting.rb +3 -4
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +31 -12
- data/lib/sequel/database/query.rb +3 -1
- data/lib/sequel/database/schema_generator.rb +53 -51
- data/lib/sequel/database/schema_methods.rb +38 -23
- data/lib/sequel/database/transactions.rb +17 -18
- data/lib/sequel/dataset/actions.rb +14 -9
- data/lib/sequel/dataset/features.rb +16 -0
- data/lib/sequel/dataset/misc.rb +2 -2
- data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
- data/lib/sequel/dataset/prepared_statements.rb +2 -0
- data/lib/sequel/dataset/query.rb +26 -9
- data/lib/sequel/dataset/sql.rb +76 -25
- data/lib/sequel/dataset.rb +4 -2
- 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/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +2 -2
- data/lib/sequel/extensions/connection_validator.rb +2 -2
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/date_arithmetic.rb +36 -24
- data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
- data/lib/sequel/extensions/eval_inspect.rb +2 -0
- 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/inflector.rb +9 -1
- data/lib/sequel/extensions/integer64.rb +2 -0
- data/lib/sequel/extensions/migration.rb +11 -3
- data/lib/sequel/extensions/named_timezones.rb +56 -8
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +5 -0
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +11 -3
- data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +36 -8
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +238 -0
- data/lib/sequel/extensions/pg_loose_count.rb +3 -1
- data/lib/sequel/extensions/pg_range.rb +17 -9
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +4 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +3 -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 +24 -7
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +1 -1
- 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/associations.rb +356 -117
- data/lib/sequel/model/base.rb +107 -68
- data/lib/sequel/model/errors.rb +10 -1
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model/plugins.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- 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 +60 -18
- data/lib/sequel/plugins/association_proxies.rb +8 -2
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_validations.rb +39 -5
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- 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 +33 -28
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/composition.rb +7 -2
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +2 -1
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/dataset_associations.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/json_serializer.rb +57 -35
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +108 -9
- data/lib/sequel/plugins/nested_attributes.rb +15 -3
- data/lib/sequel/plugins/pg_array_associations.rb +58 -41
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
- data/lib/sequel/plugins/prepared_statements.rb +15 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +43 -35
- data/lib/sequel/plugins/serialization.rb +8 -3
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +11 -5
- data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +9 -4
- 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/throw_failures.rb +1 -1
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/tree.rb +9 -4
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +1 -1
- data/lib/sequel/plugins/validation_class_methods.rb +5 -1
- data/lib/sequel/plugins/validation_helpers.rb +18 -11
- data/lib/sequel/plugins/xml_serializer.rb +1 -1
- data/lib/sequel/sql.rb +20 -5
- data/lib/sequel/timezones.rb +63 -17
- data/lib/sequel/version.rb +1 -1
- metadata +113 -381
- 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 -1065
- data/spec/adapters/oracle_spec.rb +0 -371
- data/spec/adapters/postgres_spec.rb +0 -4125
- data/spec/adapters/spec_helper.rb +0 -44
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -652
- data/spec/bin_spec.rb +0 -278
- data/spec/core/connection_pool_spec.rb +0 -1250
- data/spec/core/database_spec.rb +0 -2865
- data/spec/core/dataset_spec.rb +0 -5515
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1455
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -336
- 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 -1826
- data/spec/core/spec_helper.rb +0 -24
- data/spec/core/version_spec.rb +0 -14
- data/spec/core_extensions_spec.rb +0 -763
- 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 -28
- 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 -229
- 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/caller_logging_spec.rb +0 -52
- data/spec/extensions/class_table_inheritance_spec.rb +0 -750
- 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 -151
- data/spec/extensions/connection_validator_spec.rb +0 -144
- data/spec/extensions/constant_sql_override_spec.rb +0 -24
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -439
- 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 -150
- 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/eager_graph_eager_spec.rb +0 -100
- 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/escaped_like_spec.rb +0 -40
- data/spec/extensions/eval_inspect_spec.rb +0 -81
- 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 -402
- 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 -291
- 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 -864
- 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 -111
- data/spec/extensions/nested_attributes_spec.rb +0 -767
- 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 -172
- data/spec/extensions/pg_enum_spec.rb +0 -118
- 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 -519
- 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 -177
- 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 -870
- 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 -63
- 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 -471
- 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 -402
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/throw_failures_spec.rb +0 -74
- 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 -334
- 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 -59
- data/spec/integration/associations_test.rb +0 -2597
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1981
- 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 -2396
- data/spec/integration/prepared_statement_test.rb +0 -405
- data/spec/integration/schema_test.rb +0 -889
- data/spec/integration/spec_helper.rb +0 -65
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -603
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4738
- data/spec/model/base_spec.rb +0 -875
- 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 -2377
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -956
- data/spec/model/plugins_spec.rb +0 -429
- data/spec/model/record_spec.rb +0 -2118
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -220
- 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
|
@@ -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)
|
|
@@ -102,9 +102,17 @@ class String
|
|
|
102
102
|
# Yield the Inflections module if a block is given, and return
|
|
103
103
|
# the Inflections module.
|
|
104
104
|
def self.inflections
|
|
105
|
-
yield Inflections if
|
|
105
|
+
yield Inflections if defined?(yield)
|
|
106
106
|
Inflections
|
|
107
107
|
end
|
|
108
|
+
|
|
109
|
+
%w'classify constantize dasherize demodulize foreign_key humanize pluralize singularize tableize underscore'.each do |m|
|
|
110
|
+
# :nocov:
|
|
111
|
+
if method_defined?(m)
|
|
112
|
+
alias_method(m, m)
|
|
113
|
+
end
|
|
114
|
+
# :nocov:
|
|
115
|
+
end
|
|
108
116
|
|
|
109
117
|
# By default, camelize converts the string to UpperCamelCase. If the argument to camelize
|
|
110
118
|
# is set to :lower then camelize produces lowerCamelCase.
|
|
@@ -68,6 +68,9 @@ module Sequel
|
|
|
68
68
|
# Allow calling private methods for backwards compatibility
|
|
69
69
|
@db.send(method_sym, *args, &block)
|
|
70
70
|
end
|
|
71
|
+
# :nocov:
|
|
72
|
+
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
|
73
|
+
# :nocov:
|
|
71
74
|
|
|
72
75
|
# This object responds to all methods the database responds to.
|
|
73
76
|
def respond_to_missing?(meth, include_private)
|
|
@@ -176,7 +179,7 @@ module Sequel
|
|
|
176
179
|
just_raise = true
|
|
177
180
|
end
|
|
178
181
|
if just_raise
|
|
179
|
-
Proc.new{raise Sequel::Error,
|
|
182
|
+
Proc.new{raise Sequel::Error, "irreversible migration method used in #{block.source_location.first}, you may need to write your own down method"}
|
|
180
183
|
else
|
|
181
184
|
actions = @actions.reverse
|
|
182
185
|
Proc.new do
|
|
@@ -329,7 +332,8 @@ module Sequel
|
|
|
329
332
|
# schema_migrations for timestamped migrations). in the database to keep track
|
|
330
333
|
# of the current migration version. If no migration version is stored in the
|
|
331
334
|
# database, the version is considered to be 0. If no target version is
|
|
332
|
-
# specified, the
|
|
335
|
+
# specified, or the target version specified is greater than the latest
|
|
336
|
+
# version available, the database is migrated to the latest version available in the
|
|
333
337
|
# migration directory.
|
|
334
338
|
#
|
|
335
339
|
# For example, to migrate the database to the latest version:
|
|
@@ -518,7 +522,6 @@ module Sequel
|
|
|
518
522
|
def initialize(db, directory, opts=OPTS)
|
|
519
523
|
super
|
|
520
524
|
@current = opts[:current] || current_migration_version
|
|
521
|
-
raise(Error, "No current version available") unless current
|
|
522
525
|
|
|
523
526
|
latest_version = latest_migration_version
|
|
524
527
|
@target = if opts[:target]
|
|
@@ -538,6 +541,11 @@ module Sequel
|
|
|
538
541
|
end
|
|
539
542
|
|
|
540
543
|
@direction = current < target ? :up : :down
|
|
544
|
+
|
|
545
|
+
if @direction == :down && @current >= @files.length
|
|
546
|
+
raise Migrator::Error, "Missing migration version(s) needed to migrate down to target version (current: #{current}, target: #{target})"
|
|
547
|
+
end
|
|
548
|
+
|
|
541
549
|
@migrations = get_migrations
|
|
542
550
|
end
|
|
543
551
|
|
|
@@ -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,9 +67,50 @@ module Sequel
|
|
|
63
67
|
|
|
64
68
|
private
|
|
65
69
|
|
|
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
|
+
# :nodoc:
|
|
88
|
+
# :nocov:
|
|
89
|
+
else
|
|
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
|
|
108
|
+
# :nodoc:
|
|
109
|
+
# :nocov:
|
|
110
|
+
end
|
|
111
|
+
|
|
66
112
|
# Handle both TZInfo 1 and TZInfo 2
|
|
67
113
|
if defined?(TZInfo::VERSION) && TZInfo::VERSION > '2'
|
|
68
|
-
# :nodoc:
|
|
69
114
|
def convert_input_datetime_other(v, input_timezone)
|
|
70
115
|
local_offset = Rational(input_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset, 86400)
|
|
71
116
|
(v - local_offset).new_offset(local_offset)
|
|
@@ -78,6 +123,7 @@ module Sequel
|
|
|
78
123
|
DateTime.jd(v.jd, v.hour, v.minute, v.second + v.sec_fraction, v.offset, v.start)
|
|
79
124
|
end
|
|
80
125
|
# :nodoc:
|
|
126
|
+
# :nocov:
|
|
81
127
|
else
|
|
82
128
|
# Assume the given DateTime has a correct time but a wrong timezone. It is
|
|
83
129
|
# currently in UTC timezone, but it should be converted to the input_timezone.
|
|
@@ -98,6 +144,8 @@ module Sequel
|
|
|
98
144
|
# Convert timezone offset from UTC to the offset for the output_timezone
|
|
99
145
|
(v - local_offset).new_offset(local_offset)
|
|
100
146
|
end
|
|
147
|
+
# :nodoc:
|
|
148
|
+
# :nocov:
|
|
101
149
|
end
|
|
102
150
|
|
|
103
151
|
# Returns TZInfo::Timezone instance if given a String.
|
|
@@ -54,7 +54,7 @@ module Sequel
|
|
|
54
54
|
# an enumerator if no block is given.
|
|
55
55
|
def each_page(page_size)
|
|
56
56
|
raise(Error, "You cannot paginate a dataset that already has a limit") if @opts[:limit]
|
|
57
|
-
return to_enum(:each_page, page_size) unless
|
|
57
|
+
return to_enum(:each_page, page_size) unless defined?(yield)
|
|
58
58
|
record_count = count
|
|
59
59
|
total_pages = (record_count / page_size.to_f).ceil
|
|
60
60
|
(1..total_pages).each{|page_no| yield paginate(page_no, page_size, record_count)}
|
|
@@ -213,6 +213,7 @@ module Sequel
|
|
|
213
213
|
scalar_typecast_method = :"typecast_value_#{opts.fetch(:scalar_typecast, type)}"
|
|
214
214
|
define_method(meth){|v| typecast_value_pg_array(v, creator, scalar_typecast_method)}
|
|
215
215
|
private meth
|
|
216
|
+
alias_method(meth, meth)
|
|
216
217
|
end
|
|
217
218
|
|
|
218
219
|
@schema_type_classes[:"#{type}_array"] = PGArray
|
|
@@ -340,14 +341,18 @@ module Sequel
|
|
|
340
341
|
raise Sequel::Error, "invalid array, empty string" if eos?
|
|
341
342
|
raise Sequel::Error, "invalid array, doesn't start with {" unless scan(/((\[\d+:\d+\])+=)?\{/)
|
|
342
343
|
|
|
344
|
+
# :nocov:
|
|
343
345
|
while !eos?
|
|
346
|
+
# :nocov:
|
|
344
347
|
char = scan(/[{}",]|[^{}",]+/)
|
|
345
348
|
if char == ','
|
|
346
349
|
# Comma outside quoted string indicates end of current entry
|
|
347
350
|
new_entry
|
|
348
351
|
elsif char == '"'
|
|
349
352
|
raise Sequel::Error, "invalid array, opening quote with existing recorded data" unless @recorded.empty?
|
|
353
|
+
# :nocov:
|
|
350
354
|
while true
|
|
355
|
+
# :nocov:
|
|
351
356
|
char = scan(/["\\]|[^"\\]+/)
|
|
352
357
|
if char == '\\'
|
|
353
358
|
@recorded << getch
|
|
@@ -51,8 +51,8 @@
|
|
|
51
51
|
# ia.length(2) # array_length(int_array_column, 2)
|
|
52
52
|
# ia.lower # array_lower(int_array_column, 1)
|
|
53
53
|
# ia.lower(2) # array_lower(int_array_column, 2)
|
|
54
|
-
# ia.join # array_to_string(int_array_column, ''
|
|
55
|
-
# ia.join(':') # array_to_string(int_array_column, ':'
|
|
54
|
+
# ia.join # array_to_string(int_array_column, '')
|
|
55
|
+
# ia.join(':') # array_to_string(int_array_column, ':')
|
|
56
56
|
# ia.join(':', ' ') # array_to_string(int_array_column, ':', ' ')
|
|
57
57
|
# ia.unnest # unnest(int_array_column)
|
|
58
58
|
# ia.unnest(:b) # unnest(int_array_column, b)
|
|
@@ -157,7 +157,9 @@ module Sequel
|
|
|
157
157
|
else
|
|
158
158
|
Sequel.function(:hstore, self, wrap_array(arg))
|
|
159
159
|
end
|
|
160
|
+
# :nocov:
|
|
160
161
|
if Sequel.respond_to?(:hstore_op)
|
|
162
|
+
# :nocov:
|
|
161
163
|
v = Sequel.hstore_op(v)
|
|
162
164
|
end
|
|
163
165
|
v
|
|
@@ -217,12 +219,16 @@ module Sequel
|
|
|
217
219
|
|
|
218
220
|
# Call the array_to_string method:
|
|
219
221
|
#
|
|
220
|
-
# array_op.join # array_to_string(array, ''
|
|
221
|
-
# array_op.to_string # array_to_string(array, ''
|
|
222
|
-
# array_op.join(":") # array_to_string(array, ':'
|
|
222
|
+
# array_op.join # array_to_string(array, '')
|
|
223
|
+
# array_op.to_string # array_to_string(array, '')
|
|
224
|
+
# array_op.join(":") # array_to_string(array, ':')
|
|
223
225
|
# array_op.join(":", "*") # array_to_string(array, ':', '*')
|
|
224
226
|
def to_string(joiner="", null=nil)
|
|
225
|
-
|
|
227
|
+
if null.nil?
|
|
228
|
+
function(:array_to_string, joiner)
|
|
229
|
+
else
|
|
230
|
+
function(:array_to_string, joiner, null)
|
|
231
|
+
end
|
|
226
232
|
end
|
|
227
233
|
alias join to_string
|
|
228
234
|
|
|
@@ -279,7 +285,9 @@ module Sequel
|
|
|
279
285
|
end
|
|
280
286
|
end
|
|
281
287
|
|
|
288
|
+
# :nocov:
|
|
282
289
|
if defined?(PGArray)
|
|
290
|
+
# :nocov:
|
|
283
291
|
class PGArray
|
|
284
292
|
# Wrap the PGArray instance in an ArrayOp, allowing you to easily use
|
|
285
293
|
# the PostgreSQL array functions and operators with literal arrays.
|
|
@@ -40,8 +40,11 @@
|
|
|
40
40
|
# DB.schema(:table_name)
|
|
41
41
|
# [[:column_name, {:type=>:enum, :enum_values=>['value1', 'value2']}]]
|
|
42
42
|
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
43
|
+
# This extension integrates with the pg_array extension. If you plan
|
|
44
|
+
# to use arrays of enum types, load the pg_array extension before the
|
|
45
|
+
# pg_enum extension:
|
|
46
|
+
#
|
|
47
|
+
# DB.extension :pg_array, :pg_enum
|
|
45
48
|
#
|
|
46
49
|
# DB.create_table(:table_name) do
|
|
47
50
|
# column :column_name, 'enum_type_name[]'
|
|
@@ -133,8 +136,11 @@ module Sequel
|
|
|
133
136
|
# the pg_type table to get names and array oids for
|
|
134
137
|
# enums.
|
|
135
138
|
def parse_enum_labels
|
|
139
|
+
order = [:enumtypid]
|
|
140
|
+
order << :enumsortorder if server_version >= 90100
|
|
141
|
+
|
|
136
142
|
enum_labels = metadata_dataset.from(:pg_enum).
|
|
137
|
-
order(
|
|
143
|
+
order(*order).
|
|
138
144
|
select_hash_groups(Sequel.cast(:enumtypid, Integer).as(:v), :enumlabel).freeze
|
|
139
145
|
enum_labels.each_value(&:freeze)
|
|
140
146
|
|
|
@@ -175,7 +181,9 @@ module Sequel
|
|
|
175
181
|
end
|
|
176
182
|
|
|
177
183
|
# support reversible create_enum statements if the migration extension is loaded
|
|
184
|
+
# :nocov:
|
|
178
185
|
if defined?(MigrationReverser)
|
|
186
|
+
# :nocov:
|
|
179
187
|
class MigrationReverser
|
|
180
188
|
private
|
|
181
189
|
def create_enum(name, _)
|
|
@@ -83,7 +83,7 @@ module Sequel
|
|
|
83
83
|
# If convert_infinite_timestamps is true and the value is infinite, return an appropriate
|
|
84
84
|
# value based on the convert_infinite_timestamps setting.
|
|
85
85
|
def to_application_timestamp(value)
|
|
86
|
-
if value.is_a?(String) && (m =
|
|
86
|
+
if value.is_a?(String) && (m = /((?:[-+]\d\d:\d\d)(:\d\d)?)?( BC)?\z/.match(value)) && (m[2] || m[3])
|
|
87
87
|
if m[3]
|
|
88
88
|
value = value.sub(' BC', '').sub(' ', ' BC ')
|
|
89
89
|
conv = defined?(JRUBY_VERSION) && JRUBY_VERSION == '9.2.0.0'
|
|
@@ -189,7 +189,7 @@ module Sequel
|
|
|
189
189
|
if date < DATETIME_YEAR_1
|
|
190
190
|
date <<= ((date.year) * 24 - 12)
|
|
191
191
|
date = db.from_application_timestamp(date)
|
|
192
|
-
minutes = (date.
|
|
192
|
+
minutes = (date.offset * 1440).to_i
|
|
193
193
|
date.strftime("'%Y-%m-%d %H:%M:%S.%N#{format_timestamp_offset(*minutes.divmod(60))} BC'")
|
|
194
194
|
else
|
|
195
195
|
super
|
|
@@ -74,6 +74,12 @@
|
|
|
74
74
|
#
|
|
75
75
|
# DB.extension :pg_hstore
|
|
76
76
|
#
|
|
77
|
+
# This extension integrates with the pg_array extension. If you plan
|
|
78
|
+
# to use arrays of hstore types, load the pg_array extension before the
|
|
79
|
+
# pg_interval extension:
|
|
80
|
+
#
|
|
81
|
+
# DB.extension :pg_array, :pg_hstore
|
|
82
|
+
#
|
|
77
83
|
# See the {schema modification guide}[rdoc-ref:doc/schema_modification.rdoc]
|
|
78
84
|
# for details on using hstore columns in CREATE/ALTER TABLE statements.
|
|
79
85
|
#
|
|
@@ -62,6 +62,19 @@
|
|
|
62
62
|
# # Delete a key
|
|
63
63
|
# DB[:tab].update(h: Sequel.hstore_op(:h).delete('k1'))
|
|
64
64
|
#
|
|
65
|
+
# On PostgreSQL 14+, The hstore <tt>[]</tt> method will use subscripts instead of being
|
|
66
|
+
# the same as +get+, if the value being wrapped is an identifer:
|
|
67
|
+
#
|
|
68
|
+
# Sequel.hstore_op(:hstore_column)['a'] # hstore_column['a']
|
|
69
|
+
# Sequel.hstore_op(Sequel[:h][:s])['a'] # h.s['a']
|
|
70
|
+
#
|
|
71
|
+
# This support allows you to use hstore subscripts in UPDATE statements to update only
|
|
72
|
+
# part of a column:
|
|
73
|
+
#
|
|
74
|
+
# h = Sequel.hstore_op(:h)
|
|
75
|
+
# DB[:t].update(h['key1'] => 'val1', h['key2'] => 'val2')
|
|
76
|
+
# # UPDATE "t" SET "h"['key1'] = 'val1', "h"['key2'] = 'val2'
|
|
77
|
+
#
|
|
65
78
|
# See the PostgreSQL hstore function and operator documentation for more
|
|
66
79
|
# details on what these functions and operators do.
|
|
67
80
|
#
|
|
@@ -114,10 +127,15 @@ module Sequel
|
|
|
114
127
|
#
|
|
115
128
|
# hstore_op['a'] # (hstore -> 'a')
|
|
116
129
|
def [](key)
|
|
117
|
-
v = Sequel::SQL::PlaceholderLiteralString.new(LOOKUP, [value, wrap_input_array(key)])
|
|
118
130
|
if key.is_a?(Array) || (defined?(Sequel::Postgres::PGArray) && key.is_a?(Sequel::Postgres::PGArray)) || (defined?(Sequel::Postgres::ArrayOp) && key.is_a?(Sequel::Postgres::ArrayOp))
|
|
119
|
-
wrap_output_array(
|
|
131
|
+
wrap_output_array(Sequel::SQL::PlaceholderLiteralString.new(LOOKUP, [value, wrap_input_array(key)]))
|
|
120
132
|
else
|
|
133
|
+
v = case @value
|
|
134
|
+
when Symbol, SQL::Identifier, SQL::QualifiedIdentifier
|
|
135
|
+
HStoreSubscriptOp.new(self, key)
|
|
136
|
+
else
|
|
137
|
+
Sequel::SQL::PlaceholderLiteralString.new(LOOKUP, [value, key])
|
|
138
|
+
end
|
|
121
139
|
Sequel::SQL::StringExpression.new(:NOOP, v)
|
|
122
140
|
end
|
|
123
141
|
end
|
|
@@ -304,6 +322,38 @@ module Sequel
|
|
|
304
322
|
end
|
|
305
323
|
end
|
|
306
324
|
|
|
325
|
+
# Represents hstore subscripts. This is abstracted because the
|
|
326
|
+
# subscript support depends on the database version.
|
|
327
|
+
class HStoreSubscriptOp < SQL::Expression
|
|
328
|
+
SUBSCRIPT = ["".freeze, "[".freeze, "]".freeze].freeze
|
|
329
|
+
|
|
330
|
+
# The expression being subscripted
|
|
331
|
+
attr_reader :expression
|
|
332
|
+
|
|
333
|
+
# The subscript to use
|
|
334
|
+
attr_reader :sub
|
|
335
|
+
|
|
336
|
+
# Set the expression and subscript to the given arguments
|
|
337
|
+
def initialize(expression, sub)
|
|
338
|
+
@expression = expression
|
|
339
|
+
@sub = sub
|
|
340
|
+
freeze
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
# Use subscripts instead of -> operator on PostgreSQL 14+
|
|
344
|
+
def to_s_append(ds, sql)
|
|
345
|
+
server_version = ds.db.server_version
|
|
346
|
+
frag = server_version && server_version >= 140000 ? SUBSCRIPT : HStoreOp::LOOKUP
|
|
347
|
+
ds.literal_append(sql, Sequel::SQL::PlaceholderLiteralString.new(frag, [@expression, @sub]))
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
# Support transforming of hstore subscripts
|
|
351
|
+
def sequel_ast_transform(transformer)
|
|
352
|
+
self.class.new(transformer.call(@expression), transformer.call(@sub))
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
|
|
307
357
|
module HStoreOpMethods
|
|
308
358
|
# Wrap the receiver in an HStoreOp so you can easily use the PostgreSQL
|
|
309
359
|
# hstore functions and operators with it.
|
|
@@ -312,7 +362,9 @@ module Sequel
|
|
|
312
362
|
end
|
|
313
363
|
end
|
|
314
364
|
|
|
365
|
+
# :nocov:
|
|
315
366
|
if defined?(HStore)
|
|
367
|
+
# :nocov:
|
|
316
368
|
class HStore
|
|
317
369
|
# Wrap the receiver in an HStoreOp so you can easily use the PostgreSQL
|
|
318
370
|
# hstore functions and operators with it.
|
|
@@ -40,12 +40,22 @@ module Sequel
|
|
|
40
40
|
def self.extended(db)
|
|
41
41
|
db.instance_exec do
|
|
42
42
|
extend_datasets(InetDatasetMethods)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
|
|
44
|
+
# :nocov:
|
|
45
|
+
if !defined?(SEQUEL_PG_VERSION_INTEGER) || SEQUEL_PG_VERSION_INTEGER >= 11300
|
|
46
|
+
# :nocov:
|
|
47
|
+
# sequel_pg 1.13.0+ will use inet/cidr conversion procs, but doing so is
|
|
48
|
+
# slower, so don't add the conversion procs if using sequel_pg 1.13.0+.
|
|
49
|
+
meth = IPAddr.method(:new)
|
|
50
|
+
add_conversion_proc(869, meth)
|
|
51
|
+
add_conversion_proc(650, meth)
|
|
52
|
+
if respond_to?(:register_array_type)
|
|
53
|
+
register_array_type('inet', :oid=>1041, :scalar_oid=>869)
|
|
54
|
+
register_array_type('cidr', :oid=>651, :scalar_oid=>650)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
46
58
|
if respond_to?(:register_array_type)
|
|
47
|
-
register_array_type('inet', :oid=>1041, :scalar_oid=>869)
|
|
48
|
-
register_array_type('cidr', :oid=>651, :scalar_oid=>650)
|
|
49
59
|
register_array_type('macaddr', :oid=>1040, :scalar_oid=>829)
|
|
50
60
|
end
|
|
51
61
|
@schema_type_classes[:ipaddr] = IPAddr
|
|
@@ -34,6 +34,13 @@
|
|
|
34
34
|
|
|
35
35
|
require 'active_support/duration'
|
|
36
36
|
|
|
37
|
+
# :nocov:
|
|
38
|
+
begin
|
|
39
|
+
require 'active_support/version'
|
|
40
|
+
rescue LoadError
|
|
41
|
+
end
|
|
42
|
+
# :nocov:
|
|
43
|
+
|
|
37
44
|
module Sequel
|
|
38
45
|
module Postgres
|
|
39
46
|
module IntervalDatabaseMethods
|
|
@@ -61,34 +68,47 @@ module Sequel
|
|
|
61
68
|
|
|
62
69
|
# Creates callable objects that convert strings into ActiveSupport::Duration instances.
|
|
63
70
|
class Parser
|
|
71
|
+
# Whether ActiveSupport::Duration.new takes parts as array instead of hash
|
|
72
|
+
USE_PARTS_ARRAY = !defined?(ActiveSupport::VERSION::STRING) || ActiveSupport::VERSION::STRING < '5.1'
|
|
73
|
+
|
|
74
|
+
if defined?(ActiveSupport::Duration::SECONDS_PER_MONTH)
|
|
75
|
+
SECONDS_PER_MONTH = ActiveSupport::Duration::SECONDS_PER_MONTH
|
|
76
|
+
SECONDS_PER_YEAR = ActiveSupport::Duration::SECONDS_PER_YEAR
|
|
77
|
+
# :nocov:
|
|
78
|
+
else
|
|
79
|
+
SECONDS_PER_MONTH = 2592000
|
|
80
|
+
SECONDS_PER_YEAR = 31557600
|
|
81
|
+
# :nocov:
|
|
82
|
+
end
|
|
83
|
+
|
|
64
84
|
# Parse the interval input string into an ActiveSupport::Duration instance.
|
|
65
85
|
def call(string)
|
|
66
86
|
raise(InvalidValue, "invalid or unhandled interval format: #{string.inspect}") unless matches = /\A([+-]?\d+ years?\s?)?([+-]?\d+ mons?\s?)?([+-]?\d+ days?\s?)?(?:(?:([+-])?(\d{2,10}):(\d\d):(\d\d(\.\d+)?))|([+-]?\d+ hours?\s?)?([+-]?\d+ mins?\s?)?([+-]?\d+(\.\d+)? secs?\s?)?)?\z/.match(string)
|
|
67
87
|
|
|
68
88
|
value = 0
|
|
69
|
-
parts =
|
|
89
|
+
parts = {}
|
|
70
90
|
|
|
71
91
|
if v = matches[1]
|
|
72
92
|
v = v.to_i
|
|
73
|
-
value +=
|
|
74
|
-
parts
|
|
93
|
+
value += SECONDS_PER_YEAR * v
|
|
94
|
+
parts[:years] = v
|
|
75
95
|
end
|
|
76
96
|
if v = matches[2]
|
|
77
97
|
v = v.to_i
|
|
78
|
-
value +=
|
|
79
|
-
parts
|
|
98
|
+
value += SECONDS_PER_MONTH * v
|
|
99
|
+
parts[:months] = v
|
|
80
100
|
end
|
|
81
101
|
if v = matches[3]
|
|
82
102
|
v = v.to_i
|
|
83
103
|
value += 86400 * v
|
|
84
|
-
parts
|
|
104
|
+
parts[:days] = v
|
|
85
105
|
end
|
|
86
106
|
if matches[5]
|
|
87
107
|
seconds = matches[5].to_i * 3600 + matches[6].to_i * 60
|
|
88
108
|
seconds += matches[8] ? matches[7].to_f : matches[7].to_i
|
|
89
109
|
seconds *= -1 if matches[4] == '-'
|
|
90
110
|
value += seconds
|
|
91
|
-
parts
|
|
111
|
+
parts[:seconds] = seconds
|
|
92
112
|
elsif matches[9] || matches[10] || matches[11]
|
|
93
113
|
seconds = 0
|
|
94
114
|
if v = matches[9]
|
|
@@ -101,8 +121,14 @@ module Sequel
|
|
|
101
121
|
seconds += matches[12] ? v.to_f : v.to_i
|
|
102
122
|
end
|
|
103
123
|
value += seconds
|
|
104
|
-
parts
|
|
124
|
+
parts[:seconds] = seconds
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# :nocov:
|
|
128
|
+
if USE_PARTS_ARRAY
|
|
129
|
+
parts = parts.to_a
|
|
105
130
|
end
|
|
131
|
+
# :nocov:
|
|
106
132
|
|
|
107
133
|
ActiveSupport::Duration.new(value, parts)
|
|
108
134
|
end
|
|
@@ -178,6 +204,8 @@ module Sequel
|
|
|
178
204
|
end
|
|
179
205
|
|
|
180
206
|
module IntervalDatasetMethods
|
|
207
|
+
private
|
|
208
|
+
|
|
181
209
|
# Handle literalization of ActiveSupport::Duration objects, treating them as
|
|
182
210
|
# PostgreSQL intervals.
|
|
183
211
|
def literal_other_append(sql, v)
|