sequel 4.49.0 → 5.3.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 +130 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +6 -9
- data/doc/advanced_associations.rdoc +91 -168
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/schema_modification.rdoc +78 -64
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +4 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +6 -26
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/jdbc.rb +18 -74
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/oracle.rb +8 -13
- data/lib/sequel/adapters/postgres.rb +28 -150
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +61 -227
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +58 -264
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +22 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/connection_pool.rb +38 -28
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +36 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +93 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/dataset/actions.rb +57 -107
- data/lib/sequel/dataset/dataset_module.rb +4 -16
- data/lib/sequel/dataset/features.rb +35 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +91 -161
- data/lib/sequel/dataset/sql.rb +33 -225
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +27 -43
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +3 -16
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/model/associations.rb +129 -131
- data/lib/sequel/model/base.rb +133 -731
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -23
- data/lib/sequel/version.rb +2 -2
- data/lib/sequel.rb +1 -1
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +111 -478
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +459 -664
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +96 -244
- data/spec/core/dataset_spec.rb +99 -414
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +241 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +88 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +30 -92
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +8 -30
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +5 -6
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +25 -33
- data/spec/extensions/migration_spec.rb +12 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +2 -2
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +22 -26
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +22 -31
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +40 -9
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +23 -34
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +43 -32
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +5 -17
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/synchronize_sql_spec.rb +124 -0
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +5 -7
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +12 -16
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -13
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +8 -13
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +12 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +7 -23
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +10 -10
- data/spec/integration/spec_helper.rb +17 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +43 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +48 -17
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +29 -339
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +33 -129
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +19 -65
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
#
|
|
6
6
|
# This extension integrates with Sequel's native postgres and jdbc/postgresql
|
|
7
7
|
# adapters, so that when inet/cidr fields are retrieved, they are returned as
|
|
8
|
-
# IPAddr instances
|
|
8
|
+
# IPAddr instances.
|
|
9
9
|
#
|
|
10
10
|
# To use this extension, load it into your database:
|
|
11
11
|
#
|
|
@@ -29,7 +29,6 @@
|
|
|
29
29
|
# Related module: Sequel::Postgres::InetDatabaseMethods
|
|
30
30
|
|
|
31
31
|
require 'ipaddr'
|
|
32
|
-
Sequel.require 'adapters/shared/postgres'
|
|
33
32
|
|
|
34
33
|
module Sequel
|
|
35
34
|
module Postgres
|
|
@@ -39,7 +38,7 @@ module Sequel
|
|
|
39
38
|
# it will pick up the inet/cidr converter. Also, extend the datasets
|
|
40
39
|
# with support for literalizing the IPAddr types.
|
|
41
40
|
def self.extended(db)
|
|
42
|
-
db.
|
|
41
|
+
db.instance_exec do
|
|
43
42
|
extend_datasets(InetDatasetMethods)
|
|
44
43
|
meth = IPAddr.method(:new)
|
|
45
44
|
add_conversion_proc(869, meth)
|
|
@@ -47,7 +46,7 @@ module Sequel
|
|
|
47
46
|
if respond_to?(:register_array_type)
|
|
48
47
|
register_array_type('inet', :oid=>1041, :scalar_oid=>869)
|
|
49
48
|
register_array_type('cidr', :oid=>651, :scalar_oid=>650)
|
|
50
|
-
register_array_type('macaddr', :oid=>1040)
|
|
49
|
+
register_array_type('macaddr', :oid=>1040, :scalar_oid=>829)
|
|
51
50
|
end
|
|
52
51
|
@schema_type_classes[:ipaddr] = IPAddr
|
|
53
52
|
end
|
|
@@ -112,18 +111,6 @@ module Sequel
|
|
|
112
111
|
end
|
|
113
112
|
end
|
|
114
113
|
end
|
|
115
|
-
|
|
116
|
-
# SEQUEL5: Remove
|
|
117
|
-
meth = IPAddr.method(:new)
|
|
118
|
-
PG__TYPES[869] = PG__TYPES[650] = lambda do |s|
|
|
119
|
-
Sequel::Deprecation.deprecate("Conversion proc for inet/cidr added globally by pg_inet extension", "Load the pg_inet extension into the Database instance")
|
|
120
|
-
IPAddr.new(s)
|
|
121
|
-
end
|
|
122
|
-
if defined?(PGArray) && PGArray.respond_to?(:register)
|
|
123
|
-
PGArray.register('inet', :oid=>1041, :scalar_oid=>869, :skip_deprecation_warning=>true)
|
|
124
|
-
PGArray.register('cidr', :oid=>651, :scalar_oid=>650, :skip_deprecation_warning=>true)
|
|
125
|
-
PGArray.register('macaddr', :oid=>1040, :skip_deprecation_warning=>true)
|
|
126
|
-
end
|
|
127
114
|
end
|
|
128
115
|
|
|
129
116
|
Database.register_extension(:pg_inet, Postgres::InetDatabaseMethods)
|
|
@@ -33,13 +33,10 @@
|
|
|
33
33
|
# Related module: Sequel::Postgres::IntervalDatabaseMethods
|
|
34
34
|
|
|
35
35
|
require 'active_support/duration'
|
|
36
|
-
Sequel.require 'adapters/shared/postgres'
|
|
37
36
|
|
|
38
37
|
module Sequel
|
|
39
38
|
module Postgres
|
|
40
39
|
module IntervalDatabaseMethods
|
|
41
|
-
EMPTY_INTERVAL = '0'.freeze
|
|
42
|
-
Sequel::Deprecation.deprecate_constant(self, :EMPTY_INTERVAL)
|
|
43
40
|
DURATION_UNITS = [:years, :months, :weeks, :days, :hours, :minutes, :seconds].freeze
|
|
44
41
|
|
|
45
42
|
# Return an unquoted string version of the duration object suitable for
|
|
@@ -64,10 +61,6 @@ module Sequel
|
|
|
64
61
|
|
|
65
62
|
# Creates callable objects that convert strings into ActiveSupport::Duration instances.
|
|
66
63
|
class Parser
|
|
67
|
-
# Regexp that parses the full range of PostgreSQL interval type output.
|
|
68
|
-
PARSER = /\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/
|
|
69
|
-
Sequel::Deprecation.deprecate_constant(self, :PARSER)
|
|
70
|
-
|
|
71
64
|
# Parse the interval input string into an ActiveSupport::Duration instance.
|
|
72
65
|
def call(string)
|
|
73
66
|
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)
|
|
@@ -121,7 +114,7 @@ module Sequel
|
|
|
121
114
|
# Reset the conversion procs if using the native postgres adapter,
|
|
122
115
|
# and extend the datasets to correctly literalize ActiveSupport::Duration values.
|
|
123
116
|
def self.extended(db)
|
|
124
|
-
db.
|
|
117
|
+
db.instance_exec do
|
|
125
118
|
extend_datasets(IntervalDatasetMethods)
|
|
126
119
|
add_conversion_proc(1186, Postgres::IntervalDatabaseMethods::PARSER)
|
|
127
120
|
if respond_to?(:register_array_type)
|
|
@@ -175,9 +168,6 @@ module Sequel
|
|
|
175
168
|
end
|
|
176
169
|
|
|
177
170
|
module IntervalDatasetMethods
|
|
178
|
-
CAST_INTERVAL = '::interval'.freeze
|
|
179
|
-
Sequel::Deprecation.deprecate_constant(self, :CAST_INTERVAL)
|
|
180
|
-
|
|
181
171
|
# Handle literalization of ActiveSupport::Duration objects, treating them as
|
|
182
172
|
# PostgreSQL intervals.
|
|
183
173
|
def literal_other_append(sql, v)
|
|
@@ -190,15 +180,6 @@ module Sequel
|
|
|
190
180
|
end
|
|
191
181
|
end
|
|
192
182
|
end
|
|
193
|
-
|
|
194
|
-
# SEQUEL5: Remove
|
|
195
|
-
PG__TYPES[1186] = lambda do |s|
|
|
196
|
-
Sequel::Deprecation.deprecate("Conversion proc for interval added globally by pg_interval extension", "Load the pg_interval extension into the Database instance")
|
|
197
|
-
Postgres::IntervalDatabaseMethods::PARSER.call(s)
|
|
198
|
-
end
|
|
199
|
-
if defined?(PGArray) && PGArray.respond_to?(:register)
|
|
200
|
-
PGArray.register('interval', :oid=>1187, :scalar_oid=>1186, :skip_deprecation_warning=>true)
|
|
201
|
-
end
|
|
202
183
|
end
|
|
203
184
|
|
|
204
185
|
Database.register_extension(:pg_interval, Postgres::IntervalDatabaseMethods)
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# PostgreSQL json values that are not arrays or objects, but support
|
|
9
9
|
# is fairly limited and the values do not roundtrip.
|
|
10
10
|
#
|
|
11
|
-
# This extension integrates with Sequel's native postgres
|
|
11
|
+
# This extension integrates with Sequel's native postgres and jdbc/postgresql adapters, so
|
|
12
12
|
# that when json fields are retrieved, they are parsed and returned
|
|
13
13
|
# as instances of Sequel::Postgres::JSONArray or
|
|
14
14
|
# Sequel::Postgres::JSONHash (or JSONBArray or JSONBHash for jsonb
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
#
|
|
36
36
|
# So if you want to insert an array or hash into an json database column:
|
|
37
37
|
#
|
|
38
|
-
# DB[:table].insert(:
|
|
39
|
-
# DB[:table].insert(:
|
|
38
|
+
# DB[:table].insert(column: Sequel.pg_json([1, 2, 3]))
|
|
39
|
+
# DB[:table].insert(column: Sequel.pg_json({'a'=>1, 'b'=>2}))
|
|
40
40
|
#
|
|
41
41
|
# To use this extension, please load it into the Database instance:
|
|
42
42
|
#
|
|
@@ -62,15 +62,9 @@
|
|
|
62
62
|
|
|
63
63
|
require 'delegate'
|
|
64
64
|
require 'json'
|
|
65
|
-
Sequel.require 'adapters/shared/postgres'
|
|
66
65
|
|
|
67
66
|
module Sequel
|
|
68
67
|
module Postgres
|
|
69
|
-
CAST_JSON = '::json'.freeze
|
|
70
|
-
Sequel::Deprecation.deprecate_constant(self, :CAST_JSON)
|
|
71
|
-
CAST_JSONB = '::jsonb'.freeze
|
|
72
|
-
Sequel::Deprecation.deprecate_constant(self, :CAST_JSONB)
|
|
73
|
-
|
|
74
68
|
# Class representing PostgreSQL JSON/JSONB column array values.
|
|
75
69
|
class JSONArrayBase < DelegateClass(Array)
|
|
76
70
|
include Sequel::SQL::AliasMethods
|
|
@@ -133,7 +127,7 @@ module Sequel
|
|
|
133
127
|
# Methods enabling Database object integration with the json type.
|
|
134
128
|
module JSONDatabaseMethods
|
|
135
129
|
def self.extended(db)
|
|
136
|
-
db.
|
|
130
|
+
db.instance_exec do
|
|
137
131
|
add_conversion_proc(114, JSONDatabaseMethods.method(:db_parse_json))
|
|
138
132
|
add_conversion_proc(3802, JSONDatabaseMethods.method(:db_parse_jsonb))
|
|
139
133
|
if respond_to?(:register_array_type)
|
|
@@ -186,7 +180,7 @@ module Sequel
|
|
|
186
180
|
end
|
|
187
181
|
end
|
|
188
182
|
|
|
189
|
-
# Handle
|
|
183
|
+
# Handle json and jsonb types in bound variables
|
|
190
184
|
def bound_variable_arg(arg, conn)
|
|
191
185
|
case arg
|
|
192
186
|
when JSONArrayBase, JSONHashBase
|
|
@@ -198,7 +192,7 @@ module Sequel
|
|
|
198
192
|
|
|
199
193
|
private
|
|
200
194
|
|
|
201
|
-
# Handle json[] types in bound variables.
|
|
195
|
+
# Handle json[] and jsonb[] types in bound variables.
|
|
202
196
|
def bound_variable_array(a)
|
|
203
197
|
case a
|
|
204
198
|
when JSONHashBase, JSONArrayBase
|
|
@@ -208,7 +202,7 @@ module Sequel
|
|
|
208
202
|
end
|
|
209
203
|
end
|
|
210
204
|
|
|
211
|
-
# Make the column type detection recognize the json
|
|
205
|
+
# Make the column type detection recognize the json types.
|
|
212
206
|
def schema_column_type(db_type)
|
|
213
207
|
case db_type
|
|
214
208
|
when 'json'
|
|
@@ -260,20 +254,6 @@ module Sequel
|
|
|
260
254
|
end
|
|
261
255
|
end
|
|
262
256
|
end
|
|
263
|
-
|
|
264
|
-
# SEQUEL5: Remove
|
|
265
|
-
PG__TYPES[114] = lambda do |s|
|
|
266
|
-
Sequel::Deprecation.deprecate("Conversion proc for json added globally by pg_json extension", "Load the pg_json extension into the Database instance")
|
|
267
|
-
JSONDatabaseMethods.db_parse_json(s)
|
|
268
|
-
end
|
|
269
|
-
PG__TYPES[3802] = lambda do |s|
|
|
270
|
-
Sequel::Deprecation.deprecate("Conversion proc for jsonb added globally by pg_json extension", "Load the pg_json extension into the Database instance")
|
|
271
|
-
JSONDatabaseMethods.db_parse_jsonb(s)
|
|
272
|
-
end
|
|
273
|
-
if defined?(PGArray) && PGArray.respond_to?(:register)
|
|
274
|
-
PGArray.register('json', :oid=>199, :scalar_oid=>114, :skip_deprecation_warning=>true)
|
|
275
|
-
PGArray.register('jsonb', :oid=>3807, :scalar_oid=>3802, :skip_deprecation_warning=>true)
|
|
276
|
-
end
|
|
277
257
|
end
|
|
278
258
|
|
|
279
259
|
module SQL::Builders
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
#
|
|
9
9
|
# It can also support schema qualified tables:
|
|
10
10
|
#
|
|
11
|
-
# DB.loose_count(:
|
|
11
|
+
# DB.loose_count(Sequel[:schema][:table]) # => 123456
|
|
12
12
|
#
|
|
13
13
|
# How accurate this count is depends on the number of rows
|
|
14
14
|
# added/deleted from the table since the last time it was
|
|
@@ -70,97 +70,13 @@
|
|
|
70
70
|
#
|
|
71
71
|
# Related module: Sequel::Postgres::PGRange
|
|
72
72
|
|
|
73
|
-
Sequel.require 'adapters/shared/postgres'
|
|
74
|
-
|
|
75
73
|
module Sequel
|
|
76
74
|
module Postgres
|
|
77
75
|
class PGRange
|
|
78
76
|
include Sequel::SQL::AliasMethods
|
|
79
77
|
|
|
80
|
-
# SEQUEL5: Remove
|
|
81
|
-
RANGE_TYPES = {}
|
|
82
|
-
|
|
83
|
-
EMPTY = 'empty'.freeze
|
|
84
|
-
Sequel::Deprecation.deprecate_constant(self, :EMPTY)
|
|
85
|
-
EMPTY_STRING = ''.freeze
|
|
86
|
-
Sequel::Deprecation.deprecate_constant(self, :EMPTY_STRING)
|
|
87
|
-
COMMA = ','.freeze
|
|
88
|
-
Sequel::Deprecation.deprecate_constant(self, :COMMA)
|
|
89
|
-
QUOTED_EMPTY_STRING = '""'.freeze
|
|
90
|
-
Sequel::Deprecation.deprecate_constant(self, :QUOTED_EMPTY_STRING)
|
|
91
|
-
OPEN_PAREN = "(".freeze
|
|
92
|
-
Sequel::Deprecation.deprecate_constant(self, :OPEN_PAREN)
|
|
93
|
-
CLOSE_PAREN = ")".freeze
|
|
94
|
-
Sequel::Deprecation.deprecate_constant(self, :CLOSE_PAREN)
|
|
95
|
-
OPEN_BRACKET = "[".freeze
|
|
96
|
-
Sequel::Deprecation.deprecate_constant(self, :OPEN_BRACKET)
|
|
97
|
-
CLOSE_BRACKET = "]".freeze
|
|
98
|
-
Sequel::Deprecation.deprecate_constant(self, :CLOSE_BRACKET)
|
|
99
|
-
ESCAPE_RE = /("|,|\\|\[|\]|\(|\))/.freeze
|
|
100
|
-
Sequel::Deprecation.deprecate_constant(self, :ESCAPE_RE)
|
|
101
|
-
ESCAPE_REPLACE = '\\\\\1'.freeze
|
|
102
|
-
Sequel::Deprecation.deprecate_constant(self, :ESCAPE_REPLACE)
|
|
103
|
-
CAST = '::'.freeze
|
|
104
|
-
Sequel::Deprecation.deprecate_constant(self, :CAST)
|
|
105
|
-
|
|
106
|
-
# SEQUEL5: Remove
|
|
107
|
-
def self.register(db_type, opts=OPTS, &block)
|
|
108
|
-
Sequel::Deprecation.deprecate("Sequel::Postgres::PGRange.register", "Use Database#register_range_type on a Database instance using the pg_range extension") unless opts[:skip_deprecation_warning]
|
|
109
|
-
db_type = db_type.to_s.dup.freeze
|
|
110
|
-
|
|
111
|
-
type_procs = opts[:type_procs] || PG__TYPES
|
|
112
|
-
mod = opts[:typecast_methods_module] || DatabaseMethods
|
|
113
|
-
typecast_method_map = opts[:typecast_method_map] || RANGE_TYPES
|
|
114
|
-
|
|
115
|
-
if converter = opts[:converter]
|
|
116
|
-
raise Error, "can't provide both a block and :converter option to register" if block
|
|
117
|
-
else
|
|
118
|
-
converter = block
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
if soid = opts[:subtype_oid]
|
|
122
|
-
raise Error, "can't provide both a converter and :subtype_oid option to register" if converter
|
|
123
|
-
raise Error, "no conversion proc for :subtype_oid=>#{soid.inspect} in PG_TYPES" unless converter = type_procs[soid]
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
parser = Parser.new(db_type, converter)
|
|
127
|
-
|
|
128
|
-
typecast_method_map[db_type] = db_type.to_sym
|
|
129
|
-
|
|
130
|
-
define_range_typecast_method(mod, db_type, parser)
|
|
131
|
-
|
|
132
|
-
if oid = opts[:oid]
|
|
133
|
-
if opts[:skip_deprecation_warning]
|
|
134
|
-
def parser.call(s)
|
|
135
|
-
Sequel::Deprecation.deprecate("Conversion proc for #{db_type} added globally by pg_range extension", "Load the pg_range extension into the Database instance")
|
|
136
|
-
super
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
type_procs[oid] = parser
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
nil
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# SEQUEL5: Remove
|
|
146
|
-
def self.define_range_typecast_method(mod, type, parser)
|
|
147
|
-
mod.class_eval do
|
|
148
|
-
meth = :"typecast_value_#{type}"
|
|
149
|
-
define_method(meth){|v| typecast_value_pg_range(v, parser)}
|
|
150
|
-
private meth
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
private_class_method :define_range_typecast_method
|
|
154
|
-
|
|
155
78
|
# Creates callable objects that convert strings into PGRange instances.
|
|
156
79
|
class Parser
|
|
157
|
-
PARSER = /\A(\[|\()("((?:\\"|[^"])*)"|[^"]*),("((?:\\"|[^"])*)"|[^"]*)(\]|\))\z/
|
|
158
|
-
Sequel::Deprecation.deprecate_constant(self, :PARSER)
|
|
159
|
-
REPLACE_RE = /\\(.)/.freeze
|
|
160
|
-
Sequel::Deprecation.deprecate_constant(self, :REPLACE_RE)
|
|
161
|
-
REPLACE_WITH = '\1'.freeze
|
|
162
|
-
Sequel::Deprecation.deprecate_constant(self, :REPLACE_WITH)
|
|
163
|
-
|
|
164
80
|
# The database range type for this parser (e.g. 'int4range'),
|
|
165
81
|
# automatically setting the db_type for the returned PGRange instances.
|
|
166
82
|
attr_reader :db_type
|
|
@@ -215,10 +131,10 @@ module Sequel
|
|
|
215
131
|
end
|
|
216
132
|
|
|
217
133
|
module DatabaseMethods
|
|
218
|
-
#
|
|
134
|
+
# Add the conversion procs to the database
|
|
219
135
|
# and extend the datasets to correctly literalize ruby Range values.
|
|
220
136
|
def self.extended(db)
|
|
221
|
-
db.
|
|
137
|
+
db.instance_exec do
|
|
222
138
|
@pg_range_schema_types ||= {}
|
|
223
139
|
extend_datasets(DatasetMethods)
|
|
224
140
|
register_range_type('int4range', :oid=>3904, :subtype_oid=>23)
|
|
@@ -315,14 +231,13 @@ module Sequel
|
|
|
315
231
|
|
|
316
232
|
@pg_range_schema_types[db_type] = db_type.to_sym
|
|
317
233
|
|
|
318
|
-
|
|
234
|
+
singleton_class.class_eval do
|
|
319
235
|
meth = :"typecast_value_#{db_type}"
|
|
320
236
|
define_method(meth){|v| typecast_value_pg_range(v, parser)}
|
|
321
237
|
private meth
|
|
322
238
|
end
|
|
323
239
|
|
|
324
240
|
@schema_type_classes[:"#{opts[:type_symbol] || db_type}"] = PGRange
|
|
325
|
-
conversion_procs_updated # SEQUEL5: Remove
|
|
326
241
|
nil
|
|
327
242
|
end
|
|
328
243
|
|
|
@@ -338,23 +253,9 @@ module Sequel
|
|
|
338
253
|
end
|
|
339
254
|
end
|
|
340
255
|
|
|
341
|
-
# SEQUEL5: Remove
|
|
342
|
-
def get_conversion_procs
|
|
343
|
-
procs = super
|
|
344
|
-
|
|
345
|
-
procs[3908] = Parser.new("tsrange", procs[1114])
|
|
346
|
-
procs[3910] = Parser.new("tstzrange", procs[1184])
|
|
347
|
-
if defined?(PGArray::Creator)
|
|
348
|
-
procs[3909] = PGArray::Creator.new("tsrange", procs[3908])
|
|
349
|
-
procs[3911] = PGArray::Creator.new("tstzrange", procs[3910])
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
procs
|
|
353
|
-
end
|
|
354
|
-
|
|
355
256
|
# Recognize the registered database range types.
|
|
356
257
|
def schema_column_type(db_type)
|
|
357
|
-
if type = @pg_range_schema_types[db_type]
|
|
258
|
+
if type = @pg_range_schema_types[db_type]
|
|
358
259
|
type
|
|
359
260
|
else
|
|
360
261
|
super
|
|
@@ -451,9 +352,9 @@ module Sequel
|
|
|
451
352
|
def cover?(value)
|
|
452
353
|
return false if empty?
|
|
453
354
|
b = self.begin
|
|
454
|
-
return false if b && b.
|
|
355
|
+
return false if b && b.public_send(exclude_begin? ? :>= : :>, value)
|
|
455
356
|
e = self.end
|
|
456
|
-
return false if e && e.
|
|
357
|
+
return false if e && e.public_send(exclude_end? ? :<= : :<, value)
|
|
457
358
|
true
|
|
458
359
|
end
|
|
459
360
|
|
|
@@ -601,22 +502,6 @@ module Sequel
|
|
|
601
502
|
end
|
|
602
503
|
end
|
|
603
504
|
end
|
|
604
|
-
|
|
605
|
-
# SEQUEL5: Remove
|
|
606
|
-
PGRange.register('int4range', :oid=>3904, :subtype_oid=>23, :skip_deprecation_warning=>true)
|
|
607
|
-
PGRange.register('numrange', :oid=>3906, :subtype_oid=>1700, :skip_deprecation_warning=>true)
|
|
608
|
-
PGRange.register('tsrange', :oid=>3908, :subtype_oid=>1114, :skip_deprecation_warning=>true)
|
|
609
|
-
PGRange.register('tstzrange', :oid=>3910, :subtype_oid=>1184, :skip_deprecation_warning=>true)
|
|
610
|
-
PGRange.register('daterange', :oid=>3912, :subtype_oid=>1082, :skip_deprecation_warning=>true)
|
|
611
|
-
PGRange.register('int8range', :oid=>3926, :subtype_oid=>20, :skip_deprecation_warning=>true)
|
|
612
|
-
if defined?(PGArray) && PGArray.respond_to?(:register)
|
|
613
|
-
PGArray.register('int4range', :oid=>3905, :scalar_oid=>3904, :scalar_typecast=>:int4range, :skip_deprecation_warning=>true)
|
|
614
|
-
PGArray.register('numrange', :oid=>3907, :scalar_oid=>3906, :scalar_typecast=>:numrange, :skip_deprecation_warning=>true)
|
|
615
|
-
PGArray.register('tsrange', :oid=>3909, :scalar_oid=>3908, :scalar_typecast=>:tsrange, :skip_deprecation_warning=>true)
|
|
616
|
-
PGArray.register('tstzrange', :oid=>3911, :scalar_oid=>3910, :scalar_typecast=>:tstzrange, :skip_deprecation_warning=>true)
|
|
617
|
-
PGArray.register('daterange', :oid=>3913, :scalar_oid=>3912, :scalar_typecast=>:daterange, :skip_deprecation_warning=>true)
|
|
618
|
-
PGArray.register('int8range', :oid=>3927, :scalar_oid=>3926, :scalar_typecast=>:int8range, :skip_deprecation_warning=>true)
|
|
619
|
-
end
|
|
620
505
|
end
|
|
621
506
|
|
|
622
507
|
module SQL::Builders
|
|
@@ -75,9 +75,7 @@ module Sequel
|
|
|
75
75
|
:starts_after => ["(".freeze, " &> ".freeze, ")".freeze].freeze,
|
|
76
76
|
:adjacent_to => ["(".freeze, " -|- ".freeze, ")".freeze].freeze,
|
|
77
77
|
:overlaps => ["(".freeze, " && ".freeze, ")".freeze].freeze,
|
|
78
|
-
}
|
|
79
|
-
FUNCTIONS = %w'lower upper isempty lower_inc upper_inc lower_inf upper_inf'
|
|
80
|
-
Sequel::Deprecation.deprecate_constant(self, :FUNCTIONS)
|
|
78
|
+
}.freeze
|
|
81
79
|
|
|
82
80
|
%w'lower upper isempty lower_inc upper_inc lower_inf upper_inf'.each do |f|
|
|
83
81
|
class_eval("def #{f}; function(:#{f}) end", __FILE__, __LINE__)
|
|
@@ -64,12 +64,12 @@
|
|
|
64
64
|
#
|
|
65
65
|
# You can also use a hash:
|
|
66
66
|
#
|
|
67
|
-
# DB.row_type(:address, :
|
|
67
|
+
# DB.row_type(:address, street: '123 Sesame St.', city: 'Some City', zip: '12345')
|
|
68
68
|
#
|
|
69
69
|
# So if you have a person table that has an address column, here's how you
|
|
70
70
|
# could insert into the column:
|
|
71
71
|
#
|
|
72
|
-
# DB[:table].insert(:
|
|
72
|
+
# DB[:table].insert(address: DB.row_type(:address, street: '123 Sesame St.', city: 'Some City', zip: '12345'))
|
|
73
73
|
#
|
|
74
74
|
# Note that registering row types without providing an explicit :converter option
|
|
75
75
|
# creates anonymous classes. This results in ruby being unable to Marshal such
|
|
@@ -88,16 +88,10 @@
|
|
|
88
88
|
|
|
89
89
|
require 'delegate'
|
|
90
90
|
require 'strscan'
|
|
91
|
-
Sequel.require 'adapters/shared/postgres'
|
|
92
91
|
|
|
93
92
|
module Sequel
|
|
94
93
|
module Postgres
|
|
95
94
|
module PGRow
|
|
96
|
-
ROW = 'ROW'.freeze
|
|
97
|
-
Sequel::Deprecation.deprecate_constant(self, :ROW)
|
|
98
|
-
CAST = '::'.freeze
|
|
99
|
-
Sequel::Deprecation.deprecate_constant(self, :CAST)
|
|
100
|
-
|
|
101
95
|
# Class for row-valued/composite types that are treated as arrays. By default,
|
|
102
96
|
# this is only used for generic PostgreSQL record types, as registered
|
|
103
97
|
# types use HashRow by default.
|
|
@@ -216,7 +210,7 @@ module Sequel
|
|
|
216
210
|
end
|
|
217
211
|
end
|
|
218
212
|
|
|
219
|
-
ROW_TYPE_CLASSES = [HashRow, ArrayRow]
|
|
213
|
+
ROW_TYPE_CLASSES = [HashRow, ArrayRow].freeze
|
|
220
214
|
|
|
221
215
|
# This parser-like class splits the PostgreSQL
|
|
222
216
|
# row-valued/composite type output string format
|
|
@@ -225,25 +219,6 @@ module Sequel
|
|
|
225
219
|
# will accept, it only handles the output format that
|
|
226
220
|
# PostgreSQL uses.
|
|
227
221
|
class Splitter < StringScanner
|
|
228
|
-
OPEN_PAREN = /\(/.freeze
|
|
229
|
-
Sequel::Deprecation.deprecate_constant(self, :OPEN_PAREN)
|
|
230
|
-
CLOSE_PAREN = /\)/.freeze
|
|
231
|
-
Sequel::Deprecation.deprecate_constant(self, :CLOSE_PAREN)
|
|
232
|
-
UNQUOTED_RE = /[^,)]*/.freeze
|
|
233
|
-
Sequel::Deprecation.deprecate_constant(self, :UNQUOTED_RE)
|
|
234
|
-
SEP_RE = /[,)]/.freeze
|
|
235
|
-
Sequel::Deprecation.deprecate_constant(self, :SEP_RE)
|
|
236
|
-
QUOTE_RE = /"/.freeze
|
|
237
|
-
Sequel::Deprecation.deprecate_constant(self, :QUOTE_RE)
|
|
238
|
-
QUOTE_SEP_RE = /"[,)]/.freeze
|
|
239
|
-
Sequel::Deprecation.deprecate_constant(self, :QUOTE_SEP_RE)
|
|
240
|
-
QUOTED_RE = /(\\.|""|[^"])*/.freeze
|
|
241
|
-
Sequel::Deprecation.deprecate_constant(self, :QUOTED_RE)
|
|
242
|
-
REPLACE_RE = /\\(.)|"(")/.freeze
|
|
243
|
-
Sequel::Deprecation.deprecate_constant(self, :REPLACE_RE)
|
|
244
|
-
REPLACE_WITH = '\1\2'.freeze
|
|
245
|
-
Sequel::Deprecation.deprecate_constant(self, :REPLACE_WITH)
|
|
246
|
-
|
|
247
222
|
# Split the stored string into an array of strings, handling
|
|
248
223
|
# the different types of quoting.
|
|
249
224
|
def parse
|
|
@@ -387,13 +362,6 @@ module Sequel
|
|
|
387
362
|
end
|
|
388
363
|
|
|
389
364
|
module DatabaseMethods
|
|
390
|
-
ESCAPE_RE = /("|\\)/.freeze
|
|
391
|
-
Sequel::Deprecation.deprecate_constant(self, :ESCAPE_RE)
|
|
392
|
-
ESCAPE_REPLACEMENT = '\\\\\1'.freeze
|
|
393
|
-
Sequel::Deprecation.deprecate_constant(self, :ESCAPE_REPLACEMENT)
|
|
394
|
-
COMMA = ','.freeze
|
|
395
|
-
Sequel::Deprecation.deprecate_constant(self, :COMMA)
|
|
396
|
-
|
|
397
365
|
# A hash mapping row type keys (usually symbols), to option
|
|
398
366
|
# hashes. At the least, the values will contain the :parser
|
|
399
367
|
# option for the Parser instance that the type will use.
|
|
@@ -401,7 +369,7 @@ module Sequel
|
|
|
401
369
|
|
|
402
370
|
# Do some setup for the data structures the module uses.
|
|
403
371
|
def self.extended(db)
|
|
404
|
-
db.
|
|
372
|
+
db.instance_exec do
|
|
405
373
|
@row_types = {}
|
|
406
374
|
@row_schema_types = {}
|
|
407
375
|
extend(@row_type_method_module = Module.new)
|
|
@@ -433,8 +401,6 @@ module Sequel
|
|
|
433
401
|
super
|
|
434
402
|
end
|
|
435
403
|
|
|
436
|
-
STRING_TYPES = [18, 19, 25, 1042, 1043].freeze
|
|
437
|
-
|
|
438
404
|
# Register a new row type for the Database instance. db_type should be the type
|
|
439
405
|
# symbol. This parses the PostgreSQL system tables to get information the
|
|
440
406
|
# composite type, and by default has the type return instances of a subclass
|
|
@@ -487,23 +453,7 @@ module Sequel
|
|
|
487
453
|
|
|
488
454
|
# Using the conversion_procs, lookup converters for each member of the composite type
|
|
489
455
|
parser_opts[:column_converters] = parser_opts[:column_oids].map do |oid|
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
# SEQUEL5: Remove
|
|
493
|
-
if pr = procs[oid]
|
|
494
|
-
pr
|
|
495
|
-
elsif !STRING_TYPES.include?(oid)
|
|
496
|
-
# It's not a string type, and it's possible a conversion proc for this
|
|
497
|
-
# oid will be added later, so do a runtime check for it.
|
|
498
|
-
lambda do |s|
|
|
499
|
-
if (pr = procs[oid])
|
|
500
|
-
Sequel::Deprecation.deprecate("Calling conversion proc for subtype (oid: #{oid}) of composite type (oid: #{parser_opts[:oid]}) not added until after composite type registration", "Register subtype conversion procs before registering composite type")
|
|
501
|
-
pr.call(s)
|
|
502
|
-
else
|
|
503
|
-
s
|
|
504
|
-
end
|
|
505
|
-
end
|
|
506
|
-
end
|
|
456
|
+
procs[oid]
|
|
507
457
|
end
|
|
508
458
|
|
|
509
459
|
# Setup the converter and typecaster
|
|
@@ -533,21 +483,9 @@ module Sequel
|
|
|
533
483
|
private meth
|
|
534
484
|
end
|
|
535
485
|
|
|
536
|
-
conversion_procs_updated # SEQUEL5: Remove
|
|
537
486
|
nil
|
|
538
487
|
end
|
|
539
488
|
|
|
540
|
-
# SEQUEL5: Remove
|
|
541
|
-
def reset_conversion_procs
|
|
542
|
-
procs = super
|
|
543
|
-
|
|
544
|
-
row_types.values.each do |opts|
|
|
545
|
-
register_row_type(opts[:type], opts)
|
|
546
|
-
end
|
|
547
|
-
|
|
548
|
-
procs
|
|
549
|
-
end
|
|
550
|
-
|
|
551
489
|
# Handle typecasting of the given object to the given database type.
|
|
552
490
|
# In general, the given database type should already be registered,
|
|
553
491
|
# but if obj is an array, this will handled unregistered types.
|
|
@@ -602,16 +540,6 @@ module Sequel
|
|
|
602
540
|
end
|
|
603
541
|
end
|
|
604
542
|
end
|
|
605
|
-
|
|
606
|
-
# SEQUEL5: Remove
|
|
607
|
-
parser = PGRow::Parser.new(:converter=>PGRow::ArrayRow)
|
|
608
|
-
PG__TYPES[2249] = lambda do |s|
|
|
609
|
-
Sequel::Deprecation.deprecate("Conversion proc for record added globally by pg_row extension", "Load the pg_row extension into the Database instance")
|
|
610
|
-
parser.call(s)
|
|
611
|
-
end
|
|
612
|
-
if defined?(PGArray) && PGArray.respond_to?(:register)
|
|
613
|
-
PGArray.register('record', :oid=>2287, :scalar_oid=>2249, :skip_deprecation_warning=>true)
|
|
614
|
-
end
|
|
615
543
|
end
|
|
616
544
|
|
|
617
545
|
module SQL::Builders
|
|
@@ -76,8 +76,8 @@
|
|
|
76
76
|
#
|
|
77
77
|
# This feature is mostly useful for a different way to graph tables:
|
|
78
78
|
#
|
|
79
|
-
# DB[:a].join(:b, :
|
|
80
|
-
#
|
|
79
|
+
# DB[:a].join(:b, id: :b_id).select(Sequel.pg_row_op(:a).splat(:a),
|
|
80
|
+
# Sequel.pg_row_op(:b).splat(:b))
|
|
81
81
|
# # SELECT (a.*)::a, (b.*)::b FROM a INNER JOIN b ON (b.id = a.b_id)
|
|
82
82
|
# # => {:a=>{:id=>1, :b_id=>2}, :b=>{:id=>2}}
|
|
83
83
|
#
|
|
@@ -88,17 +88,6 @@ module Sequel
|
|
|
88
88
|
module Postgres
|
|
89
89
|
# This class represents a composite type expression reference.
|
|
90
90
|
class PGRowOp < SQL::PlaceholderLiteralString
|
|
91
|
-
OPEN = '('.freeze
|
|
92
|
-
Sequel::Deprecation.deprecate_constant(self, :OPEN)
|
|
93
|
-
CLOSE_DOT = ').'.freeze
|
|
94
|
-
Sequel::Deprecation.deprecate_constant(self, :CLOSE_DOT)
|
|
95
|
-
CLOSE_STAR = '.*)'.freeze
|
|
96
|
-
Sequel::Deprecation.deprecate_constant(self, :CLOSE_STAR)
|
|
97
|
-
CLOSE_STAR_CAST = '.*)::'.freeze
|
|
98
|
-
Sequel::Deprecation.deprecate_constant(self, :CLOSE_STAR_CAST)
|
|
99
|
-
EMPTY = "".freeze
|
|
100
|
-
Sequel::Deprecation.deprecate_constant(self, :EMPTY)
|
|
101
|
-
|
|
102
91
|
ROW = ['(', '.*)'].freeze.each(&:freeze)
|
|
103
92
|
ROW_CAST = ['(', '.*)::'].freeze.each(&:freeze)
|
|
104
93
|
QUALIFY = ['(', ').'].freeze.each(&:freeze)
|
|
@@ -37,11 +37,9 @@ module Sequel
|
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
module DatasetQuery
|
|
40
|
-
Dataset.def_mutation_method(:query, :module=>self)
|
|
41
|
-
|
|
42
40
|
# Translates a query block into a dataset. Query blocks are an
|
|
43
41
|
# alternative to Sequel's usual method chaining, by using
|
|
44
|
-
#
|
|
42
|
+
# instance_exec with a proxy object:
|
|
45
43
|
#
|
|
46
44
|
# dataset = DB[:items].query do
|
|
47
45
|
# select :x, :y, :z
|
|
@@ -54,7 +52,7 @@ module Sequel
|
|
|
54
52
|
# dataset = DB[:items].select(:x, :y, :z).where{(x > 1) & (y > 2)}.reverse(:z)
|
|
55
53
|
def query(&block)
|
|
56
54
|
query = Dataset::Query.new(self)
|
|
57
|
-
query.
|
|
55
|
+
query.instance_exec(&block)
|
|
58
56
|
query.dataset
|
|
59
57
|
end
|
|
60
58
|
end
|
|
@@ -71,6 +69,7 @@ module Sequel
|
|
|
71
69
|
|
|
72
70
|
# Replace the query's dataset with dataset returned by the method call.
|
|
73
71
|
def method_missing(method, *args, &block)
|
|
72
|
+
# Allow calling private methods, so things like raise works
|
|
74
73
|
@dataset = @dataset.send(method, *args, &block)
|
|
75
74
|
raise(Sequel::Error, "method #{method.inspect} did not return a dataset") unless @dataset.is_a?(Dataset)
|
|
76
75
|
self
|
|
@@ -25,12 +25,6 @@
|
|
|
25
25
|
#
|
|
26
26
|
# Related module: Sequel::Dataset::RoundTimestamps
|
|
27
27
|
|
|
28
|
-
unless RUBY_VERSION >= '1.9'
|
|
29
|
-
# :nocov:
|
|
30
|
-
raise LoadError, 'the round_timestamps extension only works on ruby 1.9+'
|
|
31
|
-
# :nocov:
|
|
32
|
-
end
|
|
33
|
-
|
|
34
28
|
module Sequel
|
|
35
29
|
class Dataset
|
|
36
30
|
module RoundTimestamps
|