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
|
@@ -73,6 +73,34 @@
|
|
|
73
73
|
# j.pretty # jsonb_pretty(jsonb_column)
|
|
74
74
|
# j.set(%w'0 a', :h) # jsonb_set(jsonb_column, ARRAY['0','a'], h, true)
|
|
75
75
|
#
|
|
76
|
+
# j.set_lax(%w'0 a', :h, false, 'raise_exception')
|
|
77
|
+
# # jsonb_set_lax(jsonb_column, ARRAY['0','a'], h, false, 'raise_exception')
|
|
78
|
+
#
|
|
79
|
+
# On PostgreSQL 12+ SQL/JSON path functions and operators are supported:
|
|
80
|
+
#
|
|
81
|
+
# j.path_exists('$.foo') # (jsonb_column @? '$.foo')
|
|
82
|
+
# j.path_match('$.foo') # (jsonb_column @@ '$.foo')
|
|
83
|
+
#
|
|
84
|
+
# j.path_exists!('$.foo') # jsonb_path_exists(jsonb_column, '$.foo')
|
|
85
|
+
# j.path_match!('$.foo') # jsonb_path_match(jsonb_column, '$.foo')
|
|
86
|
+
# j.path_query('$.foo') # jsonb_path_query(jsonb_column, '$.foo')
|
|
87
|
+
# j.path_query_array('$.foo') # jsonb_path_query_array(jsonb_column, '$.foo')
|
|
88
|
+
# j.path_query_first('$.foo') # jsonb_path_query_first(jsonb_column, '$.foo')
|
|
89
|
+
#
|
|
90
|
+
# On PostgreSQL 13+ timezone-aware SQL/JSON path functions and operators are supported:
|
|
91
|
+
#
|
|
92
|
+
# j.path_exists_tz!('$.foo') # jsonb_path_exists_tz(jsonb_column, '$.foo')
|
|
93
|
+
# j.path_match_tz!('$.foo') # jsonb_path_match_tz(jsonb_column, '$.foo')
|
|
94
|
+
# j.path_query_tz('$.foo') # jsonb_path_query_tz(jsonb_column, '$.foo')
|
|
95
|
+
# j.path_query_array_tz('$.foo') # jsonb_path_query_array_tz(jsonb_column, '$.foo')
|
|
96
|
+
# j.path_query_first_tz('$.foo') # jsonb_path_query_first_tz(jsonb_column, '$.foo')
|
|
97
|
+
#
|
|
98
|
+
# For the PostgreSQL 12+ SQL/JSON path functions, one argument is required (+path+) and
|
|
99
|
+
# two more arguments are optional (+vars+ and +silent+). +path+ specifies the JSON path.
|
|
100
|
+
# +vars+ specifies a hash or a string in JSON format of named variables to be
|
|
101
|
+
# substituted in +path+. +silent+ specifies whether errors are suppressed. By default,
|
|
102
|
+
# errors are not suppressed.
|
|
103
|
+
#
|
|
76
104
|
# If you are also using the pg_json extension, you should load it before
|
|
77
105
|
# loading this extension. Doing so will allow you to use the #op method on
|
|
78
106
|
# JSONHash, JSONHarray, JSONBHash, and JSONBArray, allowing you to perform json/jsonb operations
|
|
@@ -292,6 +320,8 @@ module Sequel
|
|
|
292
320
|
CONTAINED_BY = ["(".freeze, " <@ ".freeze, ")".freeze].freeze
|
|
293
321
|
DELETE_PATH = ["(".freeze, " #- ".freeze, ")".freeze].freeze
|
|
294
322
|
HAS_KEY = ["(".freeze, " ? ".freeze, ")".freeze].freeze
|
|
323
|
+
PATH_EXISTS = ["(".freeze, " @? ".freeze, ")".freeze].freeze
|
|
324
|
+
PATH_MATCH = ["(".freeze, " @@ ".freeze, ")".freeze].freeze
|
|
295
325
|
|
|
296
326
|
# jsonb expression for deletion of the given argument from the
|
|
297
327
|
# current jsonb.
|
|
@@ -362,6 +392,120 @@ module Sequel
|
|
|
362
392
|
self.class.new(function(:insert, wrap_input_array(path), wrap_input_jsonb(other), insert_after))
|
|
363
393
|
end
|
|
364
394
|
|
|
395
|
+
# Returns whether the JSON path returns any item for the json object.
|
|
396
|
+
#
|
|
397
|
+
# json_op.path_exists("$.foo") # (json @? '$.foo')
|
|
398
|
+
def path_exists(path)
|
|
399
|
+
bool_op(PATH_EXISTS, path)
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
# Returns whether the JSON path returns any item for the json object.
|
|
403
|
+
#
|
|
404
|
+
# json_op.path_exists!("$.foo")
|
|
405
|
+
# # jsonb_path_exists(json, '$.foo')
|
|
406
|
+
#
|
|
407
|
+
# json_op.path_exists!("$.foo ? ($ > $x)", x: 2)
|
|
408
|
+
# # jsonb_path_exists(json, '$.foo ? ($ > $x)', '{"x":2}')
|
|
409
|
+
#
|
|
410
|
+
# json_op.path_exists!("$.foo ? ($ > $x)", {x: 2}, true)
|
|
411
|
+
# # jsonb_path_exists(json, '$.foo ? ($ > $x)', '{"x":2}', true)
|
|
412
|
+
def path_exists!(path, vars=nil, silent=nil)
|
|
413
|
+
Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_exists, path, vars, silent))
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
# The same as #path_exists!, except that timezone-aware conversions are used for date/time values.
|
|
417
|
+
def path_exists_tz!(path, vars=nil, silent=nil)
|
|
418
|
+
Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_exists_tz, path, vars, silent))
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
# Returns the first item of the result of JSON path predicate check for the json object.
|
|
422
|
+
# Returns nil if the first item is not true or false.
|
|
423
|
+
#
|
|
424
|
+
# json_op.path_match("$.foo") # (json @@ '$.foo')
|
|
425
|
+
def path_match(path)
|
|
426
|
+
bool_op(PATH_MATCH, path)
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
# Returns the first item of the result of JSON path predicate check for the json object.
|
|
430
|
+
# Returns nil if the first item is not true or false and silent is true.
|
|
431
|
+
#
|
|
432
|
+
# json_op.path_match!("$.foo")
|
|
433
|
+
# # jsonb_path_match(json, '$.foo')
|
|
434
|
+
#
|
|
435
|
+
# json_op.path_match!("$.foo ? ($ > $x)", x: 2)
|
|
436
|
+
# # jsonb_path_match(json, '$.foo ? ($ > $x)', '{"x":2}')
|
|
437
|
+
#
|
|
438
|
+
# json_op.path_match!("$.foo ? ($ > $x)", {x: 2}, true)
|
|
439
|
+
# # jsonb_path_match(json, '$.foo ? ($ > $x)', '{"x":2}', true)
|
|
440
|
+
def path_match!(path, vars=nil, silent=nil)
|
|
441
|
+
Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_match, path, vars, silent))
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
# The same as #path_match!, except that timezone-aware conversions are used for date/time values.
|
|
445
|
+
def path_match_tz!(path, vars=nil, silent=nil)
|
|
446
|
+
Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_match_tz, path, vars, silent))
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
# Returns a set of all jsonb values specified by the JSON path
|
|
450
|
+
# for the json object.
|
|
451
|
+
#
|
|
452
|
+
# json_op.path_query("$.foo")
|
|
453
|
+
# # jsonb_path_query(json, '$.foo')
|
|
454
|
+
#
|
|
455
|
+
# json_op.path_query("$.foo ? ($ > $x)", x: 2)
|
|
456
|
+
# # jsonb_path_query(json, '$.foo ? ($ > $x)', '{"x":2}')
|
|
457
|
+
#
|
|
458
|
+
# json_op.path_query("$.foo ? ($ > $x)", {x: 2}, true)
|
|
459
|
+
# # jsonb_path_query(json, '$.foo ? ($ > $x)', '{"x":2}', true)
|
|
460
|
+
def path_query(path, vars=nil, silent=nil)
|
|
461
|
+
_path_function(:jsonb_path_query, path, vars, silent)
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
# The same as #path_query, except that timezone-aware conversions are used for date/time values.
|
|
465
|
+
def path_query_tz(path, vars=nil, silent=nil)
|
|
466
|
+
_path_function(:jsonb_path_query_tz, path, vars, silent)
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
# Returns a jsonb array of all values specified by the JSON path
|
|
470
|
+
# for the json object.
|
|
471
|
+
#
|
|
472
|
+
# json_op.path_query_array("$.foo")
|
|
473
|
+
# # jsonb_path_query_array(json, '$.foo')
|
|
474
|
+
#
|
|
475
|
+
# json_op.path_query_array("$.foo ? ($ > $x)", x: 2)
|
|
476
|
+
# # jsonb_path_query_array(json, '$.foo ? ($ > $x)', '{"x":2}')
|
|
477
|
+
#
|
|
478
|
+
# json_op.path_query_array("$.foo ? ($ > $x)", {x: 2}, true)
|
|
479
|
+
# # jsonb_path_query_array(json, '$.foo ? ($ > $x)', '{"x":2}', true)
|
|
480
|
+
def path_query_array(path, vars=nil, silent=nil)
|
|
481
|
+
JSONBOp.new(_path_function(:jsonb_path_query_array, path, vars, silent))
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
# The same as #path_query_array, except that timezone-aware conversions are used for date/time values.
|
|
485
|
+
def path_query_array_tz(path, vars=nil, silent=nil)
|
|
486
|
+
JSONBOp.new(_path_function(:jsonb_path_query_array_tz, path, vars, silent))
|
|
487
|
+
end
|
|
488
|
+
|
|
489
|
+
# Returns the first item of the result specified by the JSON path
|
|
490
|
+
# for the json object.
|
|
491
|
+
#
|
|
492
|
+
# json_op.path_query_first("$.foo")
|
|
493
|
+
# # jsonb_path_query_first(json, '$.foo')
|
|
494
|
+
#
|
|
495
|
+
# json_op.path_query_first("$.foo ? ($ > $x)", x: 2)
|
|
496
|
+
# # jsonb_path_query_first(json, '$.foo ? ($ > $x)', '{"x":2}')
|
|
497
|
+
#
|
|
498
|
+
# json_op.path_query_first("$.foo ? ($ > $x)", {x: 2}, true)
|
|
499
|
+
# # jsonb_path_query_first(json, '$.foo ? ($ > $x)', '{"x":2}', true)
|
|
500
|
+
def path_query_first(path, vars=nil, silent=nil)
|
|
501
|
+
JSONBOp.new(_path_function(:jsonb_path_query_first, path, vars, silent))
|
|
502
|
+
end
|
|
503
|
+
|
|
504
|
+
# The same as #path_query_first, except that timezone-aware conversions are used for date/time values.
|
|
505
|
+
def path_query_first_tz(path, vars=nil, silent=nil)
|
|
506
|
+
JSONBOp.new(_path_function(:jsonb_path_query_first_tz, path, vars, silent))
|
|
507
|
+
end
|
|
508
|
+
|
|
365
509
|
# Return the receiver, since it is already a JSONBOp.
|
|
366
510
|
def pg_jsonb
|
|
367
511
|
self
|
|
@@ -384,8 +528,30 @@ module Sequel
|
|
|
384
528
|
self.class.new(function(:set, wrap_input_array(path), wrap_input_jsonb(other), create_missing))
|
|
385
529
|
end
|
|
386
530
|
|
|
531
|
+
# The same as #set, except if +other+ is +nil+, then behaves according to +null_value_treatment+,
|
|
532
|
+
# which can be one of 'raise_exception', 'use_json_null' (default), 'delete_key', or 'return_target'.
|
|
533
|
+
def set_lax(path, other, create_missing=true, null_value_treatment='use_json_null')
|
|
534
|
+
self.class.new(function(:set_lax, wrap_input_array(path), wrap_input_jsonb(other), create_missing, null_value_treatment))
|
|
535
|
+
end
|
|
536
|
+
|
|
387
537
|
private
|
|
388
538
|
|
|
539
|
+
# Internals of the jsonb SQL/JSON path functions.
|
|
540
|
+
def _path_function(func, path, vars, silent)
|
|
541
|
+
args = []
|
|
542
|
+
if vars
|
|
543
|
+
if vars.is_a?(Hash)
|
|
544
|
+
vars = vars.to_json
|
|
545
|
+
end
|
|
546
|
+
args << vars
|
|
547
|
+
|
|
548
|
+
unless silent.nil?
|
|
549
|
+
args << silent
|
|
550
|
+
end
|
|
551
|
+
end
|
|
552
|
+
SQL::Function.new(func, self, path, *args)
|
|
553
|
+
end
|
|
554
|
+
|
|
389
555
|
# Return a placeholder literal with the given str and args, wrapped
|
|
390
556
|
# in a boolean expression, used by operators that return booleans.
|
|
391
557
|
def bool_op(str, other)
|
|
@@ -430,7 +596,9 @@ module Sequel
|
|
|
430
596
|
end
|
|
431
597
|
end
|
|
432
598
|
|
|
599
|
+
# :nocov:
|
|
433
600
|
if defined?(JSONArray)
|
|
601
|
+
# :nocov:
|
|
434
602
|
class JSONArray
|
|
435
603
|
# Wrap the JSONArray instance in an JSONOp, allowing you to easily use
|
|
436
604
|
# the PostgreSQL json functions and operators with literal jsons.
|
|
@@ -158,7 +158,7 @@ module Sequel
|
|
|
158
158
|
procs = conversion_procs
|
|
159
159
|
add_conversion_proc(3908, Parser.new("tsrange", procs[1114]))
|
|
160
160
|
add_conversion_proc(3910, Parser.new("tstzrange", procs[1184]))
|
|
161
|
-
if defined?(PGArray::Creator)
|
|
161
|
+
if respond_to?(:register_array_type) && defined?(PGArray::Creator)
|
|
162
162
|
add_conversion_proc(3909, PGArray::Creator.new("tsrange", procs[3908]))
|
|
163
163
|
add_conversion_proc(3911, PGArray::Creator.new("tstzrange", procs[3910]))
|
|
164
164
|
end
|
|
@@ -215,12 +215,6 @@ module Sequel
|
|
|
215
215
|
|
|
216
216
|
db_type = db_type.to_s.dup.freeze
|
|
217
217
|
|
|
218
|
-
if converter = opts[:converter]
|
|
219
|
-
raise Error, "can't provide both a block and :converter option to register" if block
|
|
220
|
-
else
|
|
221
|
-
converter = block
|
|
222
|
-
end
|
|
223
|
-
|
|
224
218
|
if soid
|
|
225
219
|
raise Error, "can't provide both a converter and :subtype_oid option to register" if has_converter
|
|
226
220
|
raise Error, "no conversion proc for :subtype_oid=>#{soid.inspect} in conversion_procs" unless converter = conversion_procs[soid]
|
|
@@ -304,6 +298,8 @@ module Sequel
|
|
|
304
298
|
end
|
|
305
299
|
|
|
306
300
|
module DatasetMethods
|
|
301
|
+
private
|
|
302
|
+
|
|
307
303
|
# Handle literalization of ruby Range objects, treating them as
|
|
308
304
|
# PostgreSQL ranges.
|
|
309
305
|
def literal_other_append(sql, v)
|
|
@@ -402,6 +398,15 @@ module Sequel
|
|
|
402
398
|
end
|
|
403
399
|
alias == eql?
|
|
404
400
|
|
|
401
|
+
# Make sure equal ranges have the same hash.
|
|
402
|
+
def hash
|
|
403
|
+
if @empty
|
|
404
|
+
@db_type.hash
|
|
405
|
+
else
|
|
406
|
+
[@begin, @end, @exclude_begin, @exclude_end, @db_type].hash
|
|
407
|
+
end
|
|
408
|
+
end
|
|
409
|
+
|
|
405
410
|
# Allow PGRange values in case statements, where they return true if they
|
|
406
411
|
# are equal to each other using eql?, or if this PGRange can be converted
|
|
407
412
|
# to a Range, delegating to that range.
|
|
@@ -452,13 +457,18 @@ module Sequel
|
|
|
452
457
|
end
|
|
453
458
|
end
|
|
454
459
|
|
|
460
|
+
ENDLESS_RANGE_NOT_SUPPORTED = RUBY_VERSION < '2.6'
|
|
461
|
+
STARTLESS_RANGE_NOT_SUPPORTED = RUBY_VERSION < '2.7'
|
|
462
|
+
|
|
455
463
|
# Return a ruby Range object for this instance, if one can be created.
|
|
456
464
|
def to_range
|
|
457
465
|
return @range if @range
|
|
458
466
|
raise(Error, "cannot create ruby range for an empty PostgreSQL range") if empty?
|
|
459
467
|
raise(Error, "cannot create ruby range when PostgreSQL range excludes beginning element") if exclude_begin?
|
|
460
|
-
|
|
461
|
-
raise(Error, "cannot create ruby range when PostgreSQL range has unbounded
|
|
468
|
+
# :nocov:
|
|
469
|
+
raise(Error, "cannot create ruby range when PostgreSQL range has unbounded beginning") if STARTLESS_RANGE_NOT_SUPPORTED && !self.begin
|
|
470
|
+
raise(Error, "cannot create ruby range when PostgreSQL range has unbounded ending") if ENDLESS_RANGE_NOT_SUPPORTED && !self.end
|
|
471
|
+
# :nocov:
|
|
462
472
|
@range = Range.new(self.begin, self.end, exclude_end?)
|
|
463
473
|
end
|
|
464
474
|
|
|
@@ -466,7 +476,7 @@ module Sequel
|
|
|
466
476
|
# it must have a beginning and an ending (no unbounded ranges), and it cannot exclude
|
|
467
477
|
# the beginning element.
|
|
468
478
|
def valid_ruby_range?
|
|
469
|
-
!(empty? || exclude_begin? || !self.begin || !self.end)
|
|
479
|
+
!(empty? || exclude_begin? || (STARTLESS_RANGE_NOT_SUPPORTED && !self.begin) || (ENDLESS_RANGE_NOT_SUPPORTED && !self.end))
|
|
470
480
|
end
|
|
471
481
|
|
|
472
482
|
# Whether the beginning of the range is unbounded.
|
|
@@ -116,7 +116,9 @@ module Sequel
|
|
|
116
116
|
end
|
|
117
117
|
end
|
|
118
118
|
|
|
119
|
+
# :nocov:
|
|
119
120
|
if defined?(PGRange)
|
|
121
|
+
# :nocov:
|
|
120
122
|
class PGRange
|
|
121
123
|
# Wrap the PGRange instance in an RangeOp, allowing you to easily use
|
|
122
124
|
# the PostgreSQL range functions and operators with literal ranges.
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# that when composite fields are retrieved, they are parsed and returned
|
|
8
8
|
# as instances of Sequel::Postgres::PGRow::(HashRow|ArrayRow), or
|
|
9
9
|
# optionally a custom type. HashRow and ArrayRow are DelegateClasses of
|
|
10
|
-
#
|
|
10
|
+
# Hash and Array, so they mostly act like a hash or array, but not
|
|
11
11
|
# completely (is_a?(Hash) and is_a?(Array) are false). If you want the
|
|
12
12
|
# actual hash for a HashRow, call HashRow#to_hash, and if you want the
|
|
13
13
|
# actual array for an ArrayRow, call ArrayRow#to_a. This is done so
|
|
@@ -222,13 +222,14 @@ module Sequel
|
|
|
222
222
|
# Split the stored string into an array of strings, handling
|
|
223
223
|
# the different types of quoting.
|
|
224
224
|
def parse
|
|
225
|
-
return @result if @result
|
|
226
225
|
values = []
|
|
227
226
|
skip(/\(/)
|
|
228
227
|
if skip(/\)/)
|
|
229
228
|
values << nil
|
|
230
229
|
else
|
|
230
|
+
# :nocov:
|
|
231
231
|
until eos?
|
|
232
|
+
# :nocov:
|
|
232
233
|
if skip(/"/)
|
|
233
234
|
values << scan(/(\\.|""|[^"])*/).gsub(/\\(.)|"(")/, '\1\2')
|
|
234
235
|
skip(/"[,)]/)
|
|
@@ -158,6 +158,30 @@ module Sequel
|
|
|
158
158
|
end
|
|
159
159
|
end
|
|
160
160
|
end
|
|
161
|
+
|
|
162
|
+
# :nocov:
|
|
163
|
+
if defined?(PGRow::ArrayRow)
|
|
164
|
+
# :nocov:
|
|
165
|
+
class PGRow::ArrayRow
|
|
166
|
+
# Wrap the PGRow::ArrayRow instance in an PGRowOp, allowing you to easily use
|
|
167
|
+
# the PostgreSQL row functions and operators with literal rows.
|
|
168
|
+
def op
|
|
169
|
+
Sequel.pg_row_op(self)
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# :nocov:
|
|
175
|
+
if defined?(PGRow::HashRow)
|
|
176
|
+
# :nocov:
|
|
177
|
+
class PGRow::HashRow
|
|
178
|
+
# Wrap the PGRow::ArrayRow instance in an PGRowOp, allowing you to easily use
|
|
179
|
+
# the PostgreSQL row functions and operators with literal rows.
|
|
180
|
+
def op
|
|
181
|
+
Sequel.pg_row_op(self)
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
end
|
|
161
185
|
end
|
|
162
186
|
|
|
163
187
|
module SQL::Builders
|
|
@@ -121,7 +121,7 @@ SQL
|
|
|
121
121
|
|
|
122
122
|
oid_map = {}
|
|
123
123
|
models.each do |model|
|
|
124
|
-
raise Error, "#{model.inspect} does not use the static_cache plugin" unless model.respond_to?(:load_cache
|
|
124
|
+
raise Error, "#{model.inspect} does not use the static_cache plugin" unless model.respond_to?(:load_cache)
|
|
125
125
|
oid_map[get(regclass_oid(model.dataset.first_source_table))] = model
|
|
126
126
|
end
|
|
127
127
|
|
|
@@ -129,7 +129,7 @@ SQL
|
|
|
129
129
|
begin
|
|
130
130
|
listen(opts[:channel_name]||default_static_cache_update_name, {:loop=>true}.merge!(opts)) do |_, _, oid|
|
|
131
131
|
if model = oid_map[oid.to_i]
|
|
132
|
-
model.
|
|
132
|
+
model.load_cache
|
|
133
133
|
end
|
|
134
134
|
end
|
|
135
135
|
ensure
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The run_transaction_hooks extension allows for running after_commit or
|
|
4
|
+
# after_rollback extensions before commit or rollback. It then removes
|
|
5
|
+
# the hook after running it, so it will not be run twice.
|
|
6
|
+
#
|
|
7
|
+
# This extension should only be used in transactional tests where the
|
|
8
|
+
# transaction always rolls back, to test the behavior of the after_commit
|
|
9
|
+
# and after_rollback hooks. Any other usage is probably a bad idea.
|
|
10
|
+
#
|
|
11
|
+
# Example:
|
|
12
|
+
#
|
|
13
|
+
# DB.extension :run_transaction_hooks
|
|
14
|
+
# x = 1
|
|
15
|
+
# DB.transaction(rollback: :always) do
|
|
16
|
+
# DB.after_rollback{x = 3}
|
|
17
|
+
# DB.after_commit{x = 2}
|
|
18
|
+
#
|
|
19
|
+
# x # => 1
|
|
20
|
+
# DB.run_after_rollback_hooks
|
|
21
|
+
# x # => 3
|
|
22
|
+
# DB.run_after_commit_hooks
|
|
23
|
+
# x # => 2
|
|
24
|
+
# end
|
|
25
|
+
# x # => 2
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
class Sequel::Database
|
|
29
|
+
module RunTransactionHooks
|
|
30
|
+
# Run all savepoint and transaction after_commit hooks for the current transaction,
|
|
31
|
+
# and remove the hooks after running them.
|
|
32
|
+
# Options:
|
|
33
|
+
# :server :: The server/shard to use.
|
|
34
|
+
def run_after_commit_hooks(opts=OPTS)
|
|
35
|
+
_run_transaction_hooks(:after_commit, opts)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Run all savepoint and transaction after_rollback hooks for the current transaction,
|
|
39
|
+
# and remove the hooks after running them.
|
|
40
|
+
# Options:
|
|
41
|
+
# :server :: The server/shard to use.
|
|
42
|
+
def run_after_rollback_hooks(opts=OPTS)
|
|
43
|
+
_run_transaction_hooks(:after_rollback, opts)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def _run_transaction_hooks(type, opts)
|
|
49
|
+
synchronize(opts[:server]) do |conn|
|
|
50
|
+
unless h = _trans(conn)
|
|
51
|
+
raise Sequel::Error, "Cannot call run_#{type}_hooks outside of a transaction"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
if hooks = h[type]
|
|
55
|
+
hooks.each(&:call)
|
|
56
|
+
hooks.clear
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
if (savepoints = h[:savepoints])
|
|
60
|
+
savepoints.each do |savepoint|
|
|
61
|
+
if hooks = savepoint[type]
|
|
62
|
+
hooks.each(&:call)
|
|
63
|
+
hooks.clear
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
register_extension(:run_transaction_hooks, RunTransactionHooks)
|
|
72
|
+
end
|