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
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
#
|
|
33
33
|
# So if you want to insert an array into an integer[] database column:
|
|
34
34
|
#
|
|
35
|
-
# DB[:table].insert(:
|
|
35
|
+
# DB[:table].insert(column: Sequel.pg_array([1, 2, 3]))
|
|
36
36
|
#
|
|
37
37
|
# To use this extension, first load it into your Sequel::Database instance:
|
|
38
38
|
#
|
|
@@ -71,7 +71,6 @@
|
|
|
71
71
|
|
|
72
72
|
require 'delegate'
|
|
73
73
|
require 'strscan'
|
|
74
|
-
Sequel.require 'adapters/shared/postgres'
|
|
75
74
|
|
|
76
75
|
module Sequel
|
|
77
76
|
module Postgres
|
|
@@ -79,108 +78,16 @@ module Sequel
|
|
|
79
78
|
class PGArray < DelegateClass(Array)
|
|
80
79
|
include Sequel::SQL::AliasMethods
|
|
81
80
|
|
|
82
|
-
ARRAY = "ARRAY".freeze
|
|
83
|
-
Sequel::Deprecation.deprecate_constant(self, :ARRAY)
|
|
84
|
-
DOUBLE_COLON = '::'.freeze
|
|
85
|
-
Sequel::Deprecation.deprecate_constant(self, :DOUBLE_COLON)
|
|
86
|
-
EMPTY_ARRAY = "'{}'".freeze
|
|
87
|
-
Sequel::Deprecation.deprecate_constant(self, :EMPTY_ARRAY)
|
|
88
|
-
EMPTY_BRACKET = '[]'.freeze
|
|
89
|
-
Sequel::Deprecation.deprecate_constant(self, :EMPTY_BRACKET)
|
|
90
|
-
OPEN_BRACKET = '['.freeze
|
|
91
|
-
Sequel::Deprecation.deprecate_constant(self, :OPEN_BRACKET)
|
|
92
|
-
CLOSE_BRACKET = ']'.freeze
|
|
93
|
-
Sequel::Deprecation.deprecate_constant(self, :CLOSE_BRACKET)
|
|
94
|
-
COMMA = ','.freeze
|
|
95
|
-
Sequel::Deprecation.deprecate_constant(self, :COMMA)
|
|
96
|
-
BACKSLASH = '\\'.freeze
|
|
97
|
-
Sequel::Deprecation.deprecate_constant(self, :BACKSLASH)
|
|
98
|
-
EMPTY_STRING = ''.freeze
|
|
99
|
-
Sequel::Deprecation.deprecate_constant(self, :EMPTY_STRING)
|
|
100
|
-
OPEN_BRACE = '{'.freeze
|
|
101
|
-
Sequel::Deprecation.deprecate_constant(self, :OPEN_BRACE)
|
|
102
|
-
CLOSE_BRACE = '}'.freeze
|
|
103
|
-
Sequel::Deprecation.deprecate_constant(self, :CLOSE_BRACE)
|
|
104
|
-
NULL = 'NULL'.freeze
|
|
105
|
-
Sequel::Deprecation.deprecate_constant(self, :NULL)
|
|
106
|
-
QUOTE = '"'.freeze
|
|
107
|
-
Sequel::Deprecation.deprecate_constant(self, :QUOTE)
|
|
108
|
-
|
|
109
|
-
# SEQUEL5: Remove
|
|
110
|
-
ARRAY_TYPES = {}
|
|
111
|
-
|
|
112
|
-
# SEQUEL5: Remove
|
|
113
|
-
def self.register(db_type, opts=OPTS, &block)
|
|
114
|
-
Sequel::Deprecation.deprecate("Sequel::Postgres::PGArray.register", "Use Database#register_array_type on a Database instance using the pg_array extension") unless opts[:skip_deprecation_warning]
|
|
115
|
-
|
|
116
|
-
db_type = db_type.to_s
|
|
117
|
-
type = (opts[:type_symbol] || db_type).to_sym
|
|
118
|
-
type_procs = opts[:type_procs] || PG__TYPES
|
|
119
|
-
mod = opts[:typecast_methods_module] || DatabaseMethods
|
|
120
|
-
typecast_method_map = opts[:typecast_method_map] || ARRAY_TYPES
|
|
121
|
-
|
|
122
|
-
if converter = opts[:converter]
|
|
123
|
-
raise Error, "can't provide both a block and :converter option to register" if block
|
|
124
|
-
else
|
|
125
|
-
converter = block
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
if soid = opts[:scalar_oid]
|
|
129
|
-
raise Error, "can't provide both a converter and :scalar_oid option to register" if converter
|
|
130
|
-
converter = type_procs[soid]
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
array_type = (opts[:array_type] || db_type).to_s.dup.freeze
|
|
134
|
-
creator = Creator.new(array_type, converter)
|
|
135
|
-
|
|
136
|
-
typecast_method_map[db_type] = :"#{type}_array"
|
|
137
|
-
|
|
138
|
-
define_array_typecast_method(mod, type, creator, opts.fetch(:scalar_typecast, type))
|
|
139
|
-
|
|
140
|
-
if oid = opts[:oid]
|
|
141
|
-
if opts[:skip_deprecation_warning]
|
|
142
|
-
def creator.call(s)
|
|
143
|
-
Sequel::Deprecation.deprecate("Conversion proc for #{type}[] added globally by pg_array or other pg_* extension", "Load the appropriate pg_* extension(s) into the Database instance")
|
|
144
|
-
super
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
type_procs[oid] = creator
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
nil
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
# SEQUEL5: Remove
|
|
154
|
-
def self.define_array_typecast_method(mod, type, creator, scalar_typecast)
|
|
155
|
-
mod.class_eval do
|
|
156
|
-
meth = :"typecast_value_#{type}_array"
|
|
157
|
-
scalar_typecast_method = :"typecast_value_#{scalar_typecast}"
|
|
158
|
-
define_method(meth){|v| typecast_value_pg_array(v, creator, scalar_typecast_method)}
|
|
159
|
-
private meth
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
private_class_method :define_array_typecast_method
|
|
163
|
-
|
|
164
81
|
module DatabaseMethods
|
|
165
|
-
APOS = "'".freeze
|
|
166
|
-
Sequel::Deprecation.deprecate_constant(self, :APOS)
|
|
167
|
-
DOUBLE_APOS = "''".freeze
|
|
168
|
-
Sequel::Deprecation.deprecate_constant(self, :DOUBLE_APOS)
|
|
169
|
-
ESCAPE_RE = /("|\\)/.freeze
|
|
170
|
-
Sequel::Deprecation.deprecate_constant(self, :ESCAPE_RE)
|
|
171
|
-
ESCAPE_REPLACEMENT = '\\\\\1'.freeze
|
|
172
|
-
Sequel::Deprecation.deprecate_constant(self, :ESCAPE_REPLACEMENT)
|
|
173
|
-
|
|
174
82
|
BLOB_RANGE = 1...-1
|
|
175
83
|
|
|
176
84
|
# Create the local hash of database type strings to schema type symbols,
|
|
177
85
|
# used for array types local to this database.
|
|
178
86
|
def self.extended(db)
|
|
179
|
-
db.
|
|
87
|
+
db.instance_exec do
|
|
180
88
|
@pg_array_schema_types ||= {}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
add_conversion_proc(1185, Creator.new("timestamp with time zone", procs[1184]))
|
|
89
|
+
register_array_type('timestamp without time zone', :oid=>1115, :scalar_oid=>1114, :type_symbol=>:datetime)
|
|
90
|
+
register_array_type('timestamp with time zone', :oid=>1185, :scalar_oid=>1184, :type_symbol=>:datetime_timezone, :scalar_typecast=>:datetime)
|
|
184
91
|
|
|
185
92
|
register_array_type('text', :oid=>1009, :scalar_oid=>25, :type_symbol=>:string)
|
|
186
93
|
register_array_type('integer', :oid=>1007, :scalar_oid=>23)
|
|
@@ -220,6 +127,15 @@ module Sequel
|
|
|
220
127
|
end
|
|
221
128
|
end
|
|
222
129
|
|
|
130
|
+
def add_named_conversion_proc(name, &block)
|
|
131
|
+
ret = super
|
|
132
|
+
name = name.to_s if name.is_a?(Symbol)
|
|
133
|
+
from(:pg_type).where(:typname=>name).select_map([:oid, :typarray]).each do |scalar_oid, array_oid|
|
|
134
|
+
register_array_type(name, :oid=>array_oid.to_i, :scalar_oid=>scalar_oid.to_i)
|
|
135
|
+
end
|
|
136
|
+
ret
|
|
137
|
+
end
|
|
138
|
+
|
|
223
139
|
# Handle arrays in bound variables
|
|
224
140
|
def bound_variable_arg(arg, conn)
|
|
225
141
|
case arg
|
|
@@ -260,9 +176,6 @@ module Sequel
|
|
|
260
176
|
#
|
|
261
177
|
# If a block is given, it is treated as the :converter option.
|
|
262
178
|
def register_array_type(db_type, opts=OPTS, &block)
|
|
263
|
-
# Only for convert_named_procs_to_procs usage
|
|
264
|
-
type_procs = opts[:type_procs] || conversion_procs # SEQUEL5: Remove
|
|
265
|
-
|
|
266
179
|
oid = opts[:oid]
|
|
267
180
|
soid = opts[:scalar_oid]
|
|
268
181
|
|
|
@@ -286,17 +199,16 @@ module Sequel
|
|
|
286
199
|
|
|
287
200
|
if soid
|
|
288
201
|
raise Error, "can't provide both a converter and :scalar_oid option to register" if has_converter
|
|
289
|
-
converter =
|
|
202
|
+
converter = conversion_procs[soid]
|
|
290
203
|
end
|
|
291
204
|
|
|
292
205
|
array_type = (opts[:array_type] || db_type).to_s.dup.freeze
|
|
293
206
|
creator = Creator.new(array_type, converter)
|
|
294
|
-
|
|
295
|
-
#add_conversion_proc(oid, creator) # SEQUEL5
|
|
207
|
+
add_conversion_proc(oid, creator)
|
|
296
208
|
|
|
297
209
|
typecast_method_map[db_type] = :"#{type}_array"
|
|
298
210
|
|
|
299
|
-
|
|
211
|
+
singleton_class.class_eval do
|
|
300
212
|
meth = :"typecast_value_#{type}_array"
|
|
301
213
|
scalar_typecast_method = :"typecast_value_#{opts.fetch(:scalar_typecast, type)}"
|
|
302
214
|
define_method(meth){|v| typecast_value_pg_array(v, creator, scalar_typecast_method)}
|
|
@@ -304,15 +216,9 @@ module Sequel
|
|
|
304
216
|
end
|
|
305
217
|
|
|
306
218
|
@schema_type_classes[:"#{type}_array"] = PGArray
|
|
307
|
-
conversion_procs_updated # SEQUEL5: Remove
|
|
308
219
|
nil
|
|
309
220
|
end
|
|
310
221
|
|
|
311
|
-
# SEQUEL5: Remove
|
|
312
|
-
def schema_type_class(type)
|
|
313
|
-
super || (ARRAY_TYPES.each_value{|v| return PGArray if type == v}; nil)
|
|
314
|
-
end
|
|
315
|
-
|
|
316
222
|
private
|
|
317
223
|
|
|
318
224
|
# Format arrays used in bound variables.
|
|
@@ -331,32 +237,11 @@ module Sequel
|
|
|
331
237
|
end
|
|
332
238
|
end
|
|
333
239
|
|
|
334
|
-
# Automatically handle array types for the given named types.
|
|
335
|
-
def convert_named_procs_to_procs(named_procs)
|
|
336
|
-
h = super
|
|
337
|
-
unless h.empty?
|
|
338
|
-
from(:pg_type).where(:oid=>h.keys).select_map([:typname, :oid, :typarray]).each do |name, scalar_oid, array_oid|
|
|
339
|
-
register_array_type(name, :type_procs=>h, :oid=>array_oid.to_i, :scalar_oid=>scalar_oid.to_i)
|
|
340
|
-
end
|
|
341
|
-
end
|
|
342
|
-
h
|
|
343
|
-
end
|
|
344
|
-
|
|
345
|
-
# SEQUEL5: Remove
|
|
346
|
-
def get_conversion_procs
|
|
347
|
-
procs = super
|
|
348
|
-
|
|
349
|
-
procs[1115] = Creator.new("timestamp without time zone", procs[1114])
|
|
350
|
-
procs[1185] = Creator.new("timestamp with time zone", procs[1184])
|
|
351
|
-
|
|
352
|
-
procs
|
|
353
|
-
end
|
|
354
|
-
|
|
355
240
|
# Look into both the current database's array schema types and the global
|
|
356
241
|
# array schema types to get the type symbol for the given database type
|
|
357
242
|
# string.
|
|
358
243
|
def pg_array_schema_type(type)
|
|
359
|
-
@pg_array_schema_types[type]
|
|
244
|
+
@pg_array_schema_types[type]
|
|
360
245
|
end
|
|
361
246
|
|
|
362
247
|
# Make the column type detection handle registered array types.
|
|
@@ -408,15 +293,6 @@ module Sequel
|
|
|
408
293
|
# Note that does not handle all forms out input that PostgreSQL will
|
|
409
294
|
# accept, and it will not raise an error for all forms of invalid input.
|
|
410
295
|
class Parser < StringScanner
|
|
411
|
-
UNQUOTED_RE = /[{}",]|[^{}",]+/
|
|
412
|
-
Sequel::Deprecation.deprecate_constant(self, :UNQUOTED_RE)
|
|
413
|
-
QUOTED_RE = /["\\]|[^"\\]+/
|
|
414
|
-
Sequel::Deprecation.deprecate_constant(self, :QUOTED_RE)
|
|
415
|
-
NULL_RE = /NULL",/
|
|
416
|
-
Sequel::Deprecation.deprecate_constant(self, :NULL_RE)
|
|
417
|
-
OPEN_RE = /((\[\d+:\d+\])+=)?\{/
|
|
418
|
-
Sequel::Deprecation.deprecate_constant(self, :OPEN_RE)
|
|
419
|
-
|
|
420
296
|
# Set the source for the input, and any converter callable
|
|
421
297
|
# to call with objects to be created. For nested parsers
|
|
422
298
|
# the source may contain text after the end current parse,
|
|
@@ -425,8 +301,8 @@ module Sequel
|
|
|
425
301
|
super(source)
|
|
426
302
|
@converter = converter
|
|
427
303
|
@stack = [[]]
|
|
428
|
-
@
|
|
429
|
-
|
|
304
|
+
@encoding = string.encoding
|
|
305
|
+
@recorded = String.new.force_encoding(@encoding)
|
|
430
306
|
end
|
|
431
307
|
|
|
432
308
|
# Take the buffer of recorded characters and add it to the array
|
|
@@ -440,7 +316,7 @@ module Sequel
|
|
|
440
316
|
entry = @converter.call(entry)
|
|
441
317
|
end
|
|
442
318
|
@stack.last.push(entry)
|
|
443
|
-
@recorded =
|
|
319
|
+
@recorded = String.new.force_encoding(@encoding)
|
|
444
320
|
end
|
|
445
321
|
end
|
|
446
322
|
|
|
@@ -499,21 +375,6 @@ module Sequel
|
|
|
499
375
|
|
|
500
376
|
raise Sequel::Error, "array parsing finished with array unclosed"
|
|
501
377
|
end
|
|
502
|
-
|
|
503
|
-
private
|
|
504
|
-
|
|
505
|
-
if RUBY_VERSION < '1.9.0'
|
|
506
|
-
# :nocov:
|
|
507
|
-
def new_entry_buffer
|
|
508
|
-
String.new
|
|
509
|
-
end
|
|
510
|
-
# :nocov:
|
|
511
|
-
else
|
|
512
|
-
def new_entry_buffer
|
|
513
|
-
String.new.force_encoding(string.encoding)
|
|
514
|
-
#String.new.force_encoding(@encoding) # SEQUEL5
|
|
515
|
-
end
|
|
516
|
-
end
|
|
517
378
|
end unless Sequel::Postgres.respond_to?(:parse_pg_array)
|
|
518
379
|
|
|
519
380
|
# Callable object that takes the input string and parses it using Parser.
|
|
@@ -596,36 +457,6 @@ module Sequel
|
|
|
596
457
|
end
|
|
597
458
|
sql << ']'
|
|
598
459
|
end
|
|
599
|
-
|
|
600
|
-
# SEQUEL5: Remove
|
|
601
|
-
register('text', :oid=>1009, :scalar_oid=>25, :type_symbol=>:string, :skip_deprecation_warning=>true)
|
|
602
|
-
register('integer', :oid=>1007, :scalar_oid=>23, :skip_deprecation_warning=>true)
|
|
603
|
-
register('bigint', :oid=>1016, :scalar_oid=>20, :scalar_typecast=>:integer, :skip_deprecation_warning=>true)
|
|
604
|
-
register('numeric', :oid=>1231, :scalar_oid=>1700, :type_symbol=>:decimal, :skip_deprecation_warning=>true)
|
|
605
|
-
register('double precision', :oid=>1022, :scalar_oid=>701, :type_symbol=>:float, :skip_deprecation_warning=>true)
|
|
606
|
-
register('boolean', :oid=>1000, :scalar_oid=>16, :skip_deprecation_warning=>true)
|
|
607
|
-
register('bytea', :oid=>1001, :scalar_oid=>17, :type_symbol=>:blob, :skip_deprecation_warning=>true)
|
|
608
|
-
register('date', :oid=>1182, :scalar_oid=>1082, :skip_deprecation_warning=>true)
|
|
609
|
-
register('time without time zone', :oid=>1183, :scalar_oid=>1083, :type_symbol=>:time, :skip_deprecation_warning=>true)
|
|
610
|
-
register('timestamp without time zone', :oid=>1115, :scalar_oid=>1114, :type_symbol=>:datetime, :skip_deprecation_warning=>true)
|
|
611
|
-
register('time with time zone', :oid=>1270, :scalar_oid=>1083, :type_symbol=>:time_timezone, :scalar_typecast=>:time, :skip_deprecation_warning=>true)
|
|
612
|
-
register('timestamp with time zone', :oid=>1185, :scalar_oid=>1184, :type_symbol=>:datetime_timezone, :scalar_typecast=>:datetime, :skip_deprecation_warning=>true)
|
|
613
|
-
register('smallint', :oid=>1005, :scalar_oid=>21, :scalar_typecast=>:integer, :skip_deprecation_warning=>true)
|
|
614
|
-
register('oid', :oid=>1028, :scalar_oid=>26, :scalar_typecast=>:integer, :skip_deprecation_warning=>true)
|
|
615
|
-
register('real', :oid=>1021, :scalar_oid=>700, :scalar_typecast=>:float, :skip_deprecation_warning=>true)
|
|
616
|
-
register('character', :oid=>1014, :array_type=>:text, :scalar_typecast=>:string, :skip_deprecation_warning=>true)
|
|
617
|
-
register('character varying', :oid=>1015, :scalar_typecast=>:string, :type_symbol=>:varchar, :skip_deprecation_warning=>true)
|
|
618
|
-
register('xml', :oid=>143, :scalar_oid=>142, :skip_deprecation_warning=>true)
|
|
619
|
-
register('money', :oid=>791, :scalar_oid=>790, :skip_deprecation_warning=>true)
|
|
620
|
-
register('bit', :oid=>1561, :scalar_oid=>1560, :skip_deprecation_warning=>true)
|
|
621
|
-
register('bit varying', :oid=>1563, :scalar_oid=>1562, :type_symbol=>:varbit, :skip_deprecation_warning=>true)
|
|
622
|
-
register('uuid', :oid=>2951, :scalar_oid=>2950, :skip_deprecation_warning=>true)
|
|
623
|
-
register('xid', :oid=>1011, :scalar_oid=>28, :skip_deprecation_warning=>true)
|
|
624
|
-
register('cid', :oid=>1012, :scalar_oid=>29, :skip_deprecation_warning=>true)
|
|
625
|
-
register('name', :oid=>1003, :scalar_oid=>19, :skip_deprecation_warning=>true)
|
|
626
|
-
register('tid', :oid=>1010, :scalar_oid=>27, :skip_deprecation_warning=>true)
|
|
627
|
-
register('int2vector', :oid=>1006, :scalar_oid=>22, :skip_deprecation_warning=>true)
|
|
628
|
-
register('oidvector', :oid=>1013, :scalar_oid=>30, :skip_deprecation_warning=>true)
|
|
629
460
|
end
|
|
630
461
|
end
|
|
631
462
|
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The pg_extended_date_support extension allows support
|
|
4
|
+
# for BC dates/timestamps by default, and infinite
|
|
5
|
+
# dates/timestamps if configured. Without this extension,
|
|
6
|
+
# BC and infinite dates/timestamps will be handled incorrectly
|
|
7
|
+
# or raise an error. This behavior isn't the default because
|
|
8
|
+
# it can hurt performance, and few users need support for BC
|
|
9
|
+
# and infinite dates/timestamps.
|
|
10
|
+
#
|
|
11
|
+
# To load the extension into the database:
|
|
12
|
+
#
|
|
13
|
+
# DB.extension :pg_extended_date_support
|
|
14
|
+
#
|
|
15
|
+
# To enable support for infinite dates/timestamps:
|
|
16
|
+
#
|
|
17
|
+
# DB.convert_infinite_timestamps = 'string' # or 'nil' or 'float'
|
|
18
|
+
#
|
|
19
|
+
# Related module: Sequel::Postgres::ExtendedDateSupport
|
|
20
|
+
|
|
21
|
+
#
|
|
22
|
+
module Sequel
|
|
23
|
+
module Postgres
|
|
24
|
+
module ExtendedDateSupport
|
|
25
|
+
DATE_YEAR_1 = Date.new(1)
|
|
26
|
+
DATETIME_YEAR_1 = DateTime.new(1)
|
|
27
|
+
TIME_YEAR_1 = Time.at(-62135596800).utc
|
|
28
|
+
INFINITE_TIMESTAMP_STRINGS = ['infinity'.freeze, '-infinity'.freeze].freeze
|
|
29
|
+
INFINITE_DATETIME_VALUES = ([PLUS_INFINITY, MINUS_INFINITY] + INFINITE_TIMESTAMP_STRINGS).freeze
|
|
30
|
+
PLUS_DATE_INFINITY = Date::Infinity.new
|
|
31
|
+
MINUS_DATE_INFINITY = -PLUS_DATE_INFINITY
|
|
32
|
+
|
|
33
|
+
# Add dataset methods and update the conversion proces for dates and timestamps.
|
|
34
|
+
def self.extended(db)
|
|
35
|
+
db.extend_datasets(DatasetMethods)
|
|
36
|
+
procs = db.conversion_procs
|
|
37
|
+
procs[1082] = ::Sequel.method(:string_to_date)
|
|
38
|
+
procs[1184] = procs[1114] = db.method(:to_application_timestamp)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Whether infinite timestamps/dates should be converted on retrieval. By default, no
|
|
42
|
+
# conversion is done, so an error is raised if you attempt to retrieve an infinite
|
|
43
|
+
# timestamp/date. You can set this to :nil to convert to nil, :string to leave
|
|
44
|
+
# as a string, or :float to convert to an infinite float.
|
|
45
|
+
attr_reader :convert_infinite_timestamps
|
|
46
|
+
|
|
47
|
+
# Set whether to allow infinite timestamps/dates. Make sure the
|
|
48
|
+
# conversion proc for date reflects that setting.
|
|
49
|
+
def convert_infinite_timestamps=(v)
|
|
50
|
+
@convert_infinite_timestamps = case v
|
|
51
|
+
when Symbol
|
|
52
|
+
v
|
|
53
|
+
when 'nil'
|
|
54
|
+
:nil
|
|
55
|
+
when 'string'
|
|
56
|
+
:string
|
|
57
|
+
when 'date'
|
|
58
|
+
:date
|
|
59
|
+
when 'float'
|
|
60
|
+
:float
|
|
61
|
+
when String, true
|
|
62
|
+
typecast_value_boolean(v)
|
|
63
|
+
else
|
|
64
|
+
false
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
pr = old_pr = Sequel.method(:string_to_date)
|
|
68
|
+
if @convert_infinite_timestamps
|
|
69
|
+
pr = lambda do |val|
|
|
70
|
+
case val
|
|
71
|
+
when *INFINITE_TIMESTAMP_STRINGS
|
|
72
|
+
infinite_timestamp_value(val)
|
|
73
|
+
else
|
|
74
|
+
old_pr.call(val)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
add_conversion_proc(1082, pr)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Handle BC dates in timestamps by moving the BC from after the time to
|
|
82
|
+
# after the date, to appease ruby's date parser.
|
|
83
|
+
# If convert_infinite_timestamps is true and the value is infinite, return an appropriate
|
|
84
|
+
# value based on the convert_infinite_timestamps setting.
|
|
85
|
+
def to_application_timestamp(value)
|
|
86
|
+
if value.is_a?(String) && (m = value.match(/(?:(?:[-+]\d\d:\d\d)(:\d\d)?)?( BC)?\z/)) && (m[1] || m[2])
|
|
87
|
+
if m[2]
|
|
88
|
+
value = value.sub(' BC', '').sub(' ', ' BC ')
|
|
89
|
+
end
|
|
90
|
+
if m[1]
|
|
91
|
+
dt = DateTime.parse(value)
|
|
92
|
+
dt = dt.to_time unless Sequel.datetime_class == DateTime
|
|
93
|
+
Sequel.convert_output_timestamp(dt, Sequel.application_timezone)
|
|
94
|
+
else
|
|
95
|
+
super(value)
|
|
96
|
+
end
|
|
97
|
+
elsif convert_infinite_timestamps
|
|
98
|
+
case value
|
|
99
|
+
when *INFINITE_TIMESTAMP_STRINGS
|
|
100
|
+
infinite_timestamp_value(value)
|
|
101
|
+
else
|
|
102
|
+
super
|
|
103
|
+
end
|
|
104
|
+
else
|
|
105
|
+
super
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
private
|
|
110
|
+
|
|
111
|
+
# Return an appropriate value for the given infinite timestamp string.
|
|
112
|
+
def infinite_timestamp_value(value)
|
|
113
|
+
case convert_infinite_timestamps
|
|
114
|
+
when :nil
|
|
115
|
+
nil
|
|
116
|
+
when :string
|
|
117
|
+
value
|
|
118
|
+
when :date
|
|
119
|
+
value == 'infinity' ? PLUS_DATE_INFINITY : MINUS_DATE_INFINITY
|
|
120
|
+
else
|
|
121
|
+
value == 'infinity' ? PLUS_INFINITY : MINUS_INFINITY
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# If the value is an infinite value (either an infinite float or a string returned by
|
|
126
|
+
# by PostgreSQL for an infinite date), return it without converting it if
|
|
127
|
+
# convert_infinite_timestamps is set.
|
|
128
|
+
def typecast_value_date(value)
|
|
129
|
+
if convert_infinite_timestamps
|
|
130
|
+
case value
|
|
131
|
+
when *INFINITE_DATETIME_VALUES
|
|
132
|
+
value
|
|
133
|
+
else
|
|
134
|
+
super
|
|
135
|
+
end
|
|
136
|
+
else
|
|
137
|
+
super
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# If the value is an infinite value (either an infinite float or a string returned by
|
|
142
|
+
# by PostgreSQL for an infinite timestamp), return it without converting it if
|
|
143
|
+
# convert_infinite_timestamps is set.
|
|
144
|
+
def typecast_value_datetime(value)
|
|
145
|
+
if convert_infinite_timestamps
|
|
146
|
+
case value
|
|
147
|
+
when *INFINITE_DATETIME_VALUES
|
|
148
|
+
value
|
|
149
|
+
else
|
|
150
|
+
super
|
|
151
|
+
end
|
|
152
|
+
else
|
|
153
|
+
super
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
module DatasetMethods
|
|
158
|
+
private
|
|
159
|
+
|
|
160
|
+
# Handle BC Date objects.
|
|
161
|
+
def literal_date(date)
|
|
162
|
+
if date < DATE_YEAR_1
|
|
163
|
+
date <<= ((date.year) * 24 - 12)
|
|
164
|
+
date.strftime("'%Y-%m-%d BC'")
|
|
165
|
+
else
|
|
166
|
+
super
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Handle BC DateTime objects.
|
|
171
|
+
def literal_datetime(date)
|
|
172
|
+
if date < DATETIME_YEAR_1
|
|
173
|
+
date <<= ((date.year) * 24 - 12)
|
|
174
|
+
date = db.from_application_timestamp(date)
|
|
175
|
+
minutes = (date.is_a?(DateTime) ? date.offset * 1440 : date.utc_offset/60).to_i
|
|
176
|
+
date.strftime("'%Y-%m-%d %H:%M:%S.%N#{format_timestamp_offset(*minutes.divmod(60))} BC'")
|
|
177
|
+
else
|
|
178
|
+
super
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# Handle Date::Infinity values
|
|
183
|
+
def literal_other_append(sql, v)
|
|
184
|
+
if v.is_a?(Date::Infinity)
|
|
185
|
+
sql << (v > 0 ? "'infinity'" : "'-infinity'")
|
|
186
|
+
else
|
|
187
|
+
super
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
if RUBY_ENGINE == 'jruby'
|
|
192
|
+
# :nocov:
|
|
193
|
+
|
|
194
|
+
# Work around JRuby bug #4822 in Time#to_datetime for times before date of calendar reform
|
|
195
|
+
def literal_time(time)
|
|
196
|
+
if time < TIME_YEAR_1
|
|
197
|
+
literal_datetime(DateTime.parse(super))
|
|
198
|
+
else
|
|
199
|
+
super
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
ExtendedDateSupport::CONVERT_TYPES = [Java::JavaSQL::Types::DATE, Java::JavaSQL::Types::TIMESTAMP]
|
|
204
|
+
|
|
205
|
+
# Use non-JDBC parsing as JDBC parsing doesn't work for BC dates/timestamps.
|
|
206
|
+
def type_convertor(map, meta, type, i)
|
|
207
|
+
case type
|
|
208
|
+
when *CONVERT_TYPES
|
|
209
|
+
db.oid_convertor_proc(meta.getField(i).getOID)
|
|
210
|
+
else
|
|
211
|
+
super
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
# :nocov:
|
|
215
|
+
else
|
|
216
|
+
# Handle BC Time objects.
|
|
217
|
+
def literal_time(time)
|
|
218
|
+
if time < TIME_YEAR_1
|
|
219
|
+
literal_datetime(time.to_datetime)
|
|
220
|
+
else
|
|
221
|
+
super
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
Database.register_extension(:pg_extended_date_support, Postgres::ExtendedDateSupport)
|
|
230
|
+
end
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
# Since the hstore type only supports strings, non string keys and
|
|
31
31
|
# values are converted to strings
|
|
32
32
|
#
|
|
33
|
-
# Sequel.hstore(:
|
|
33
|
+
# Sequel.hstore(foo: 1).to_hash # {'foo'=>'1'}
|
|
34
34
|
# v = Sequel.hstore({})
|
|
35
35
|
# v[:foo] = 1
|
|
36
36
|
# v # {'foo'=>'1'}
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
#
|
|
69
69
|
# If you want to insert a hash into an hstore database column:
|
|
70
70
|
#
|
|
71
|
-
# DB[:table].insert(:
|
|
71
|
+
# DB[:table].insert(column: Sequel.hstore('foo'=>'bar'))
|
|
72
72
|
#
|
|
73
73
|
# To use this extension, first load it into your Sequel::Database instance:
|
|
74
74
|
#
|
|
@@ -91,21 +91,6 @@ module Sequel
|
|
|
91
91
|
|
|
92
92
|
# Parser for PostgreSQL hstore output format.
|
|
93
93
|
class Parser < StringScanner
|
|
94
|
-
QUOTE_RE = /"/.freeze
|
|
95
|
-
Sequel::Deprecation.deprecate_constant(self, :QUOTE_RE)
|
|
96
|
-
KV_SEP_RE = /"\s*=>\s*/.freeze
|
|
97
|
-
Sequel::Deprecation.deprecate_constant(self, :KV_SEP_RE)
|
|
98
|
-
NULL_RE = /NULL/.freeze
|
|
99
|
-
Sequel::Deprecation.deprecate_constant(self, :NULL_RE)
|
|
100
|
-
SEP_RE = /,\s*/.freeze
|
|
101
|
-
Sequel::Deprecation.deprecate_constant(self, :SEP_RE)
|
|
102
|
-
QUOTED_RE = /(\\"|[^"])*/.freeze
|
|
103
|
-
Sequel::Deprecation.deprecate_constant(self, :QUOTED_RE)
|
|
104
|
-
REPLACE_RE = /\\(.)/.freeze
|
|
105
|
-
Sequel::Deprecation.deprecate_constant(self, :REPLACE_RE)
|
|
106
|
-
REPLACE_WITH = '\1'.freeze
|
|
107
|
-
Sequel::Deprecation.deprecate_constant(self, :REPLACE_WITH)
|
|
108
|
-
|
|
109
94
|
# Parse the output format that PostgreSQL uses for hstore
|
|
110
95
|
# columns. Note that this does not attempt to parse all
|
|
111
96
|
# input formats that PostgreSQL will accept. For instance,
|
|
@@ -144,7 +129,7 @@ module Sequel
|
|
|
144
129
|
|
|
145
130
|
module DatabaseMethods
|
|
146
131
|
def self.extended(db)
|
|
147
|
-
db.
|
|
132
|
+
db.instance_exec do
|
|
148
133
|
add_named_conversion_proc(:hstore, &HStore.method(:parse))
|
|
149
134
|
@schema_type_classes[:hstore] = HStore
|
|
150
135
|
end
|
|
@@ -162,13 +147,6 @@ module Sequel
|
|
|
162
147
|
end
|
|
163
148
|
end
|
|
164
149
|
|
|
165
|
-
# SEQUEL5: Remove
|
|
166
|
-
def reset_conversion_procs
|
|
167
|
-
procs = super
|
|
168
|
-
add_named_conversion_proc(:hstore, &HStore.method(:parse))
|
|
169
|
-
procs
|
|
170
|
-
end
|
|
171
|
-
|
|
172
150
|
private
|
|
173
151
|
|
|
174
152
|
# Recognize the hstore database type.
|
|
@@ -198,29 +176,12 @@ module Sequel
|
|
|
198
176
|
# keys to strings during lookup.
|
|
199
177
|
DEFAULT_PROC = lambda{|h, k| h[k.to_s] unless k.is_a?(String)}
|
|
200
178
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
NULL = "NULL".freeze
|
|
208
|
-
Sequel::Deprecation.deprecate_constant(self, :NULL)
|
|
209
|
-
ESCAPE_RE = /("|\\)/.freeze
|
|
210
|
-
Sequel::Deprecation.deprecate_constant(self, :ESCAPE_RE)
|
|
211
|
-
ESCAPE_REPLACE = '\\\\\1'.freeze
|
|
212
|
-
Sequel::Deprecation.deprecate_constant(self, :ESCAPE_REPLACE)
|
|
213
|
-
HSTORE_CAST = '::hstore'.freeze
|
|
214
|
-
Sequel::Deprecation.deprecate_constant(self, :HSTORE_CAST)
|
|
215
|
-
|
|
216
|
-
if RUBY_VERSION >= '1.9'
|
|
217
|
-
# Undef 1.9 marshal_{dump,load} methods in the delegate class,
|
|
218
|
-
# so that ruby 1.9 uses the old style _dump/_load methods defined
|
|
219
|
-
# in the delegate class, instead of the marshal_{dump,load} methods
|
|
220
|
-
# in the Hash class.
|
|
221
|
-
undef_method :marshal_load
|
|
222
|
-
undef_method :marshal_dump
|
|
223
|
-
end
|
|
179
|
+
# Undef marshal_{dump,load} methods in the delegate class,
|
|
180
|
+
# so that ruby uses the old style _dump/_load methods defined
|
|
181
|
+
# in the delegate class, instead of the marshal_{dump,load} methods
|
|
182
|
+
# in the Hash class.
|
|
183
|
+
undef_method :marshal_load
|
|
184
|
+
undef_method :marshal_dump
|
|
224
185
|
|
|
225
186
|
# Use custom marshal loading, since underlying hash uses a default proc.
|
|
226
187
|
def self._load(args)
|
|
@@ -234,12 +195,12 @@ module Sequel
|
|
|
234
195
|
end
|
|
235
196
|
|
|
236
197
|
# Override methods that accept key argument to convert to string.
|
|
237
|
-
|
|
198
|
+
%w'[] delete has_key? include? key? member? assoc'.each do |m|
|
|
238
199
|
class_eval("def #{m}(k) super(k.to_s) end", __FILE__, __LINE__)
|
|
239
200
|
end
|
|
240
201
|
|
|
241
202
|
# Override methods that accept value argument to convert to string unless nil.
|
|
242
|
-
|
|
203
|
+
%w'has_value? value? key rassoc'.each do |m|
|
|
243
204
|
class_eval("def #{m}(v) super(convert_value(v)) end", __FILE__, __LINE__)
|
|
244
205
|
end
|
|
245
206
|
|
|
@@ -57,10 +57,10 @@
|
|
|
57
57
|
# Here are a couple examples for updating an existing hstore column:
|
|
58
58
|
#
|
|
59
59
|
# # Add a key, or update an existing key with a new value
|
|
60
|
-
# DB[:tab].update(:
|
|
60
|
+
# DB[:tab].update(h: Sequel.hstore_op(:h).concat('c'=>3))
|
|
61
61
|
#
|
|
62
62
|
# # Delete a key
|
|
63
|
-
# DB[:tab].update(:
|
|
63
|
+
# DB[:tab].update(h: Sequel.hstore_op(:h).delete('k1'))
|
|
64
64
|
#
|
|
65
65
|
# See the PostgreSQL hstore function and operator documentation for more
|
|
66
66
|
# details on what these functions and operators do.
|