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
|
@@ -1,71 +1,3 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
|
-
#
|
|
3
|
-
# The freeze_datasets extension freezes a databases's datasets by
|
|
4
|
-
# default, and makes it so the databases's datasets are always
|
|
5
|
-
# frozen. This makes sure you can never accidentally modify a
|
|
6
|
-
# dataset that may be used elsewhere (such as a model class's
|
|
7
|
-
# dataset or the same dataset being used in another thread).
|
|
8
|
-
# Frozen datasets can also perform caching for many
|
|
9
|
-
# different methods that can significantly improve performance.
|
|
10
|
-
#
|
|
11
|
-
# In addition to the caching provided by frozen datasets, this
|
|
12
|
-
# also adds caching of Database#from calls if the method is
|
|
13
|
-
# called with a single Symbol argument and not a block. In
|
|
14
|
-
# addition to speeding up Dataset#from itself, because it
|
|
15
|
-
# returns a cached dataset, all caching done by that dataset
|
|
16
|
-
# can also improve performance.
|
|
17
|
-
#
|
|
18
|
-
# Usage:
|
|
19
|
-
#
|
|
20
|
-
# DB.extension(:freeze_datasets)
|
|
21
|
-
#
|
|
22
|
-
# Related module: Sequel::FreezeDatasets
|
|
23
2
|
|
|
24
|
-
|
|
25
|
-
module Sequel
|
|
26
|
-
class Database
|
|
27
|
-
module FreezeDatasets
|
|
28
|
-
module DatasetMethods
|
|
29
|
-
# Make dup be an alias to clone, so that it
|
|
30
|
-
# returns a frozen dataset.
|
|
31
|
-
def dup
|
|
32
|
-
clone
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# Reset the default dataset for this database after
|
|
37
|
-
# loading the extension.
|
|
38
|
-
def self.extended(db)
|
|
39
|
-
db.extend_datasets(DatasetMethods)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# Cache returned dataset if given a single argument and no block.
|
|
43
|
-
def from(*args, &block)
|
|
44
|
-
if !block && args.length == 1 && (table = args[0]).is_a?(Symbol)
|
|
45
|
-
@default_dataset.send(:cached_dataset, :"_from_#{table}_ds"){super}
|
|
46
|
-
else
|
|
47
|
-
super
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# Freeze datasets created from this dataset.
|
|
52
|
-
def dataset
|
|
53
|
-
super.freeze
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
private
|
|
57
|
-
|
|
58
|
-
# Clear the cache of the default dataset when removing a cached
|
|
59
|
-
# schema, in order to clear the from table cache.
|
|
60
|
-
def remove_cached_schema(table)
|
|
61
|
-
cache = @default_dataset.send(:cache)
|
|
62
|
-
Sequel.synchronize{cache.clear}
|
|
63
|
-
super
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
register_extension(:freeze_datasets, FreezeDatasets)
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# Sequel::Database.register_extension(:freeze_datasets){} # SEQUEL5
|
|
3
|
+
Sequel::Database.register_extension(:freeze_datasets){}
|
|
@@ -1,37 +1,3 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
|
-
#
|
|
3
|
-
# The from_block extension changes Database#from so that blocks given
|
|
4
|
-
# to it are treated as virtual rows applying to the FROM clause,
|
|
5
|
-
# instead of virtual rows applying to the WHERE clause. This will
|
|
6
|
-
# probably be made the default in the next major version of Sequel.
|
|
7
|
-
#
|
|
8
|
-
# This makes it easier to use table returning functions:
|
|
9
|
-
#
|
|
10
|
-
# DB.from{table_function(1)}
|
|
11
|
-
# # SELECT * FROM table_function(1)
|
|
12
|
-
#
|
|
13
|
-
# To load the extension into the database:
|
|
14
|
-
#
|
|
15
|
-
# DB.extension :from_block
|
|
16
|
-
#
|
|
17
|
-
# Related module: Sequel::Database::FromBlock
|
|
18
2
|
|
|
19
|
-
|
|
20
|
-
module Sequel
|
|
21
|
-
module Database::FromBlock
|
|
22
|
-
# If a block is given, make it affect the FROM clause:
|
|
23
|
-
# DB.from{table_function(1)}
|
|
24
|
-
# # SELECT * FROM table_function(1)
|
|
25
|
-
def from(*args, &block)
|
|
26
|
-
if block
|
|
27
|
-
@default_dataset.from(*args, &block)
|
|
28
|
-
else
|
|
29
|
-
super
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
Database.register_extension(:from_block, Database::FromBlock)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# Sequel::Database.register_extension(:from_block){} # SEQUEL5
|
|
3
|
+
Sequel::Database.register_extension(:from_block){}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# makes Dataset#each call #graph_each if the dataset has been graphed.
|
|
5
5
|
# Dataset#graph_each splits result hashes into subhashes per table:
|
|
6
6
|
#
|
|
7
|
-
# DB[:a].graph(:b, :
|
|
7
|
+
# DB[:a].graph(:b, id: :b_id).all
|
|
8
8
|
# # => {:a=>{:id=>1, :b_id=>2}, :b=>{:id=>2}}
|
|
9
9
|
#
|
|
10
10
|
# You can load this extension into specific datasets:
|
|
@@ -56,7 +56,7 @@ module Sequel
|
|
|
56
56
|
datasets = datasets.map{|ta, ds| [ta, ds, ds.row_proc]}
|
|
57
57
|
# Use the manually set graph aliases, if any, otherwise
|
|
58
58
|
# use the ones automatically created by .graph
|
|
59
|
-
column_aliases = @opts[:
|
|
59
|
+
column_aliases = @opts[:graph][:column_aliases]
|
|
60
60
|
fetch_rows(sql) do |r|
|
|
61
61
|
graph = {}
|
|
62
62
|
# Create the sub hashes, one per table
|
|
@@ -120,10 +120,9 @@ module Sequel
|
|
|
120
120
|
# Reset the identifier mangling options. Overrides any already set on
|
|
121
121
|
# the instance. Only for internal use by shared adapters.
|
|
122
122
|
def reset_identifier_mangling
|
|
123
|
-
|
|
124
|
-
@
|
|
125
|
-
@
|
|
126
|
-
@identifier_output_method = @opts.fetch(:identifier_output_method){(iom = Database.identifier_output_method).nil? ? identifier_output_method_default : (iom if iom)}
|
|
123
|
+
@quote_identifiers = @opts.fetch(:quote_identifiers, quote_identifiers_default)
|
|
124
|
+
@identifier_input_method = @opts.fetch(:identifier_input_method, identifier_input_method_default)
|
|
125
|
+
@identifier_output_method = @opts.fetch(:identifier_output_method, identifier_output_method_default)
|
|
127
126
|
reset_default_dataset
|
|
128
127
|
end
|
|
129
128
|
end
|
|
@@ -135,25 +134,12 @@ module Sequel
|
|
|
135
134
|
@opts.fetch(:identifier_input_method, db.identifier_input_method)
|
|
136
135
|
end
|
|
137
136
|
|
|
138
|
-
# Set the method to call on identifiers going into the database for this dataset
|
|
139
|
-
def identifier_input_method=(v)
|
|
140
|
-
raise_if_frozen!(%w"identifier_input_method= with_identifier_input_method")
|
|
141
|
-
skip_symbol_cache!
|
|
142
|
-
@opts[:identifier_input_method] = v
|
|
143
|
-
end
|
|
144
|
-
|
|
145
137
|
# The String instance method to call on identifiers before sending them to
|
|
146
138
|
# the database.
|
|
147
139
|
def identifier_output_method
|
|
148
140
|
@opts.fetch(:identifier_output_method, db.identifier_output_method)
|
|
149
141
|
end
|
|
150
142
|
|
|
151
|
-
# Set the method to call on identifiers coming the database for this dataset
|
|
152
|
-
def identifier_output_method=(v)
|
|
153
|
-
raise_if_frozen!(%w"identifier_output_method= with_identifier_output_method")
|
|
154
|
-
@opts[:identifier_output_method] = v
|
|
155
|
-
end
|
|
156
|
-
|
|
157
143
|
# Check with the database to see if identifier quoting is enabled
|
|
158
144
|
def quote_identifiers?
|
|
159
145
|
@opts.fetch(:quote_identifiers, db.quote_identifiers?)
|
|
@@ -174,14 +160,18 @@ module Sequel
|
|
|
174
160
|
# Convert the identifier to the version used in the database via
|
|
175
161
|
# identifier_input_method.
|
|
176
162
|
def input_identifier(v)
|
|
177
|
-
(i = identifier_input_method) ? v.to_s.
|
|
163
|
+
(i = identifier_input_method) ? v.to_s.public_send(i) : v.to_s
|
|
178
164
|
end
|
|
179
165
|
|
|
180
166
|
# Modify the identifier returned from the database based on the
|
|
181
167
|
# identifier_output_method.
|
|
182
168
|
def output_identifier(v)
|
|
183
169
|
v = 'untitled' if v == ''
|
|
184
|
-
(i = identifier_output_method) ? v.to_s.
|
|
170
|
+
(i = identifier_output_method) ? v.to_s.public_send(i).to_sym : v.to_sym
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def non_sql_option?(key)
|
|
174
|
+
super || key == :identifier_input_method || key == :identifier_output_method
|
|
185
175
|
end
|
|
186
176
|
end
|
|
187
177
|
end
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
module Sequel
|
|
28
28
|
class Dataset
|
|
29
29
|
module ImplicitSubquery
|
|
30
|
-
exceptions = [:
|
|
30
|
+
exceptions = [:add_graph_aliases, :filter, :from, :from_self, :naked, :or, :order_more,
|
|
31
31
|
:qualify, :reverse, :reverse_order, :select_all, :select_more, :server,
|
|
32
32
|
:set_graph_aliases, :unfiltered, :ungraphed, :ungrouped, :unlimited, :unordered,
|
|
33
33
|
:with_sql]
|
|
@@ -35,7 +35,7 @@ module Sequel
|
|
|
35
35
|
(Dataset::QUERY_METHODS - Dataset::JOIN_METHODS - exceptions + additions).each do |meth|
|
|
36
36
|
define_method(meth) do |*a, &b|
|
|
37
37
|
if opts[:sql]
|
|
38
|
-
from_self.
|
|
38
|
+
from_self.public_send(meth, *a, &b)
|
|
39
39
|
else
|
|
40
40
|
super(*a, &b)
|
|
41
41
|
end
|
|
@@ -95,8 +95,8 @@ class String
|
|
|
95
95
|
(@uncountables << words).flatten!
|
|
96
96
|
end
|
|
97
97
|
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
require_relative '../model/default_inflections'
|
|
99
|
+
instance_exec(&Sequel::DEFAULT_INFLECTIONS_PROC)
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
# Yield the Inflections module if a block is given, and return
|
|
@@ -151,7 +151,7 @@ class String
|
|
|
151
151
|
# Example
|
|
152
152
|
# "puni_puni".dasherize #=> "puni-puni"
|
|
153
153
|
def dasherize
|
|
154
|
-
gsub(
|
|
154
|
+
gsub('_', '-')
|
|
155
155
|
end
|
|
156
156
|
|
|
157
157
|
# Removes the module part from the expression in the string
|
|
@@ -181,7 +181,7 @@ class String
|
|
|
181
181
|
# "employee_salary" #=> "Employee salary"
|
|
182
182
|
# "author_id" #=> "Author"
|
|
183
183
|
def humanize
|
|
184
|
-
gsub(/_id$/, "").gsub(
|
|
184
|
+
gsub(/_id$/, "").gsub('_', " ").capitalize
|
|
185
185
|
end
|
|
186
186
|
|
|
187
187
|
# Returns the plural form of the word in the string.
|
|
@@ -41,7 +41,7 @@ module Sequel
|
|
|
41
41
|
# direction.
|
|
42
42
|
def self.apply(db, direction)
|
|
43
43
|
raise(ArgumentError, "Invalid migration direction specified (#{direction.inspect})") unless [:up, :down].include?(direction)
|
|
44
|
-
new(db).
|
|
44
|
+
new(db).public_send(direction)
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
# Returns the list of Migration descendants.
|
|
@@ -65,6 +65,7 @@ module Sequel
|
|
|
65
65
|
|
|
66
66
|
# Intercepts method calls intended for the database and sends them along.
|
|
67
67
|
def method_missing(method_sym, *args, &block)
|
|
68
|
+
# Allow calling private methods for backwards compatibility
|
|
68
69
|
@db.send(method_sym, *args, &block)
|
|
69
70
|
end
|
|
70
71
|
|
|
@@ -99,29 +100,29 @@ module Sequel
|
|
|
99
100
|
end
|
|
100
101
|
|
|
101
102
|
# Apply the appropriate block on the +Database+
|
|
102
|
-
# instance using
|
|
103
|
+
# instance using instance_exec.
|
|
103
104
|
def apply(db, direction)
|
|
104
105
|
raise(ArgumentError, "Invalid migration direction specified (#{direction.inspect})") unless [:up, :down].include?(direction)
|
|
105
|
-
if prok =
|
|
106
|
-
db.
|
|
106
|
+
if prok = public_send(direction)
|
|
107
|
+
db.instance_exec(&prok)
|
|
107
108
|
end
|
|
108
109
|
end
|
|
109
110
|
end
|
|
110
111
|
|
|
111
112
|
# Internal class used by the Sequel.migration DSL, part of the +migration+ extension.
|
|
112
113
|
class MigrationDSL < BasicObject
|
|
113
|
-
# The underlying
|
|
114
|
+
# The underlying SimpleMigration instance
|
|
114
115
|
attr_reader :migration
|
|
115
116
|
|
|
116
117
|
def self.create(&block)
|
|
117
118
|
new(&block).migration
|
|
118
119
|
end
|
|
119
120
|
|
|
120
|
-
# Create a new migration class, and
|
|
121
|
+
# Create a new migration class, and instance_exec the block.
|
|
121
122
|
def initialize(&block)
|
|
122
123
|
@migration = SimpleMigration.new
|
|
123
124
|
Migration.descendants << migration
|
|
124
|
-
|
|
125
|
+
instance_exec(&block)
|
|
125
126
|
end
|
|
126
127
|
|
|
127
128
|
# Defines the migration's down action.
|
|
@@ -150,7 +151,7 @@ module Sequel
|
|
|
150
151
|
# the block.
|
|
151
152
|
#
|
|
152
153
|
# There are no guarantees that this will work perfectly
|
|
153
|
-
# in all cases, but it
|
|
154
|
+
# in all cases, but it works for some simple cases.
|
|
154
155
|
def change(&block)
|
|
155
156
|
migration.up = block
|
|
156
157
|
migration.down = MigrationReverser.new.reverse(&block)
|
|
@@ -170,7 +171,7 @@ module Sequel
|
|
|
170
171
|
# the given block.
|
|
171
172
|
def reverse(&block)
|
|
172
173
|
begin
|
|
173
|
-
|
|
174
|
+
instance_exec(&block)
|
|
174
175
|
rescue
|
|
175
176
|
just_raise = true
|
|
176
177
|
end
|
|
@@ -180,12 +181,9 @@ module Sequel
|
|
|
180
181
|
actions = @actions.reverse
|
|
181
182
|
Proc.new do
|
|
182
183
|
actions.each do |a|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
else
|
|
187
|
-
send(*a)
|
|
188
|
-
end
|
|
184
|
+
pr = a.last.is_a?(Proc) ? a.pop : nil
|
|
185
|
+
# Allow calling private methods as the reversing methods are private
|
|
186
|
+
send(*a, &pr)
|
|
189
187
|
end
|
|
190
188
|
end
|
|
191
189
|
end
|
|
@@ -233,8 +231,9 @@ module Sequel
|
|
|
233
231
|
end
|
|
234
232
|
|
|
235
233
|
def reverse(&block)
|
|
236
|
-
|
|
234
|
+
instance_exec(&block)
|
|
237
235
|
actions = @actions.reverse
|
|
236
|
+
# Allow calling private methods as the reversing methods are private
|
|
238
237
|
Proc.new{actions.each{|a| send(*a)}}
|
|
239
238
|
end
|
|
240
239
|
|
|
@@ -339,25 +338,20 @@ module Sequel
|
|
|
339
338
|
#
|
|
340
339
|
# For example, to migrate the database all the way down:
|
|
341
340
|
#
|
|
342
|
-
# Sequel::Migrator.run(DB, '.', :
|
|
341
|
+
# Sequel::Migrator.run(DB, '.', target: 0)
|
|
343
342
|
#
|
|
344
343
|
# For example, to migrate the database to version 4:
|
|
345
344
|
#
|
|
346
|
-
# Sequel::Migrator.run(DB, '.', :
|
|
345
|
+
# Sequel::Migrator.run(DB, '.', target: 4)
|
|
347
346
|
#
|
|
348
347
|
# To migrate the database from version 1 to version 5:
|
|
349
348
|
#
|
|
350
|
-
# Sequel::Migrator.run(DB, '.', :
|
|
349
|
+
# Sequel::Migrator.run(DB, '.', target: 5, current: 1)
|
|
351
350
|
#
|
|
352
351
|
# Part of the +migration+ extension.
|
|
353
352
|
class Migrator
|
|
354
353
|
MIGRATION_FILE_PATTERN = /\A(\d+)_.+\.rb\z/i.freeze
|
|
355
354
|
|
|
356
|
-
MIGRATION_SPLITTER = '_'.freeze
|
|
357
|
-
Sequel::Deprecation.deprecate_constant(self, :MIGRATION_SPLITTER)
|
|
358
|
-
MINIMUM_TIMESTAMP = 20000101
|
|
359
|
-
Sequel::Deprecation.deprecate_constant(self, :MINIMUM_TIMESTAMP)
|
|
360
|
-
|
|
361
355
|
# Exception class raised when there is an error with the migrator's
|
|
362
356
|
# file structure, database, or arguments.
|
|
363
357
|
class Error < Sequel::Error
|
|
@@ -397,16 +391,15 @@ module Sequel
|
|
|
397
391
|
#
|
|
398
392
|
# Examples:
|
|
399
393
|
# Sequel::Migrator.run(DB, "migrations")
|
|
400
|
-
# Sequel::Migrator.run(DB, "migrations", :
|
|
401
|
-
# Sequel::Migrator.run(DB, "app1/migrations", :
|
|
402
|
-
# Sequel::Migrator.run(DB, "app2/migrations", :
|
|
394
|
+
# Sequel::Migrator.run(DB, "migrations", target: 15, current: 10)
|
|
395
|
+
# Sequel::Migrator.run(DB, "app1/migrations", column: :app2_version)
|
|
396
|
+
# Sequel::Migrator.run(DB, "app2/migrations", column: :app2_version, table: :schema_info2)
|
|
403
397
|
def self.run(db, directory, opts=OPTS)
|
|
404
398
|
migrator_class(directory).new(db, directory, opts).run
|
|
405
399
|
end
|
|
406
400
|
|
|
407
401
|
# Choose the Migrator subclass to use. Uses the TimestampMigrator
|
|
408
|
-
# if the version number
|
|
409
|
-
# after 2005, otherwise uses the IntegerMigrator.
|
|
402
|
+
# if the version number is greater than 20000101, otherwise uses the IntegerMigrator.
|
|
410
403
|
def self.migrator_class(directory)
|
|
411
404
|
if self.equal?(Migrator)
|
|
412
405
|
Dir.new(directory).each do |file|
|
|
@@ -508,11 +501,6 @@ module Sequel
|
|
|
508
501
|
# version number starting with 1, where missing or duplicate migration file
|
|
509
502
|
# versions are not allowed. Part of the +migration+ extension.
|
|
510
503
|
class IntegerMigrator < Migrator
|
|
511
|
-
DEFAULT_SCHEMA_COLUMN = :version
|
|
512
|
-
DEFAULT_SCHEMA_TABLE = :schema_info
|
|
513
|
-
Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SCHEMA_COLUMN)
|
|
514
|
-
Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SCHEMA_TABLE)
|
|
515
|
-
|
|
516
504
|
Error = Migrator::Error
|
|
517
505
|
|
|
518
506
|
# The current version for this migrator
|
|
@@ -528,6 +516,8 @@ module Sequel
|
|
|
528
516
|
def initialize(db, directory, opts=OPTS)
|
|
529
517
|
super
|
|
530
518
|
@current = opts[:current] || current_migration_version
|
|
519
|
+
raise(Error, "No current version available") unless current
|
|
520
|
+
|
|
531
521
|
latest_version = latest_migration_version
|
|
532
522
|
|
|
533
523
|
@target = if opts[:target]
|
|
@@ -538,15 +528,14 @@ module Sequel
|
|
|
538
528
|
latest_version
|
|
539
529
|
end
|
|
540
530
|
|
|
531
|
+
raise(Error, "No target version available, probably because no migration files found or filenames don't follow the migration filename convention") unless target
|
|
532
|
+
|
|
541
533
|
if @target > latest_version
|
|
542
534
|
@target = latest_version
|
|
543
535
|
elsif @target < 0
|
|
544
536
|
@target = 0
|
|
545
537
|
end
|
|
546
538
|
|
|
547
|
-
raise(Error, "No current version available") unless current
|
|
548
|
-
raise(Error, "No target version available, probably because no migration files found or filenames don't follow the migration filename convention") unless target
|
|
549
|
-
|
|
550
539
|
@direction = current < target ? :up : :down
|
|
551
540
|
@migrations = get_migrations
|
|
552
541
|
end
|
|
@@ -663,17 +652,12 @@ module Sequel
|
|
|
663
652
|
end
|
|
664
653
|
end
|
|
665
654
|
|
|
666
|
-
# The migrator used if any migration file version
|
|
655
|
+
# The migrator used if any migration file version is greater than 20000101.
|
|
667
656
|
# Stores filenames of migration files, and can figure out which migrations
|
|
668
657
|
# have not been applied and apply them, even if earlier migrations are added
|
|
669
658
|
# after later migrations. If you plan to do that, the responsibility is on
|
|
670
659
|
# you to make sure the migrations don't conflict. Part of the +migration+ extension.
|
|
671
660
|
class TimestampMigrator < Migrator
|
|
672
|
-
DEFAULT_SCHEMA_COLUMN = :filename
|
|
673
|
-
DEFAULT_SCHEMA_TABLE = :schema_migrations
|
|
674
|
-
Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SCHEMA_COLUMN)
|
|
675
|
-
Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SCHEMA_TABLE)
|
|
676
|
-
|
|
677
661
|
Error = Migrator::Error
|
|
678
662
|
|
|
679
663
|
# Array of strings of applied migration filenames
|
|
@@ -1,86 +1,4 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
|
-
#
|
|
3
|
-
# The no_auto_literal_strings extension removes Sequel's automatic conversion
|
|
4
|
-
# of strings to literal strings in the dataset filter methods. By default,
|
|
5
|
-
# Sequel considers a string passed to a filter method as a literal string:
|
|
6
|
-
#
|
|
7
|
-
# DB[:table].where("name > 'A'")
|
|
8
|
-
#
|
|
9
|
-
# This is fine, except when the string is derived from user input:
|
|
10
|
-
#
|
|
11
|
-
# DB[:table].where("name > '#{params[:user]}'") # SQL Injection!
|
|
12
|
-
#
|
|
13
|
-
# Sequel does support using placeholders for such strings:
|
|
14
|
-
#
|
|
15
|
-
# DB[:table].where("name > ?", params[:user].to_s) # Safe
|
|
16
|
-
#
|
|
17
|
-
# However, if you forget to user placeholders, and pass a string to a filter
|
|
18
|
-
# method that is derived from user input, you open yourself up to SQL injection.
|
|
19
|
-
# With this extension, using a plain string in a filter method will result
|
|
20
|
-
# in an exception being raised. You either need to explicitly use a literal
|
|
21
|
-
# string:
|
|
22
|
-
#
|
|
23
|
-
# DB[:table].where(Sequel.lit("name > ?", params[:user].to_s))
|
|
24
|
-
#
|
|
25
|
-
# or you need to construct the same SQL using a non-string based approach:
|
|
26
|
-
#
|
|
27
|
-
# DB[:table].where{|o| o.name > params[:user].to_s}
|
|
28
|
-
#
|
|
29
|
-
# Note that as listed in Sequel's security guide, a large number of dataset
|
|
30
|
-
# methods call down to a filtering method, and this protects all of those
|
|
31
|
-
# cases.
|
|
32
|
-
#
|
|
33
|
-
# This extension also protects the use of a plain string passed to Dataset#update:
|
|
34
|
-
#
|
|
35
|
-
# DB[:table].update("column = column + 1")
|
|
36
|
-
#
|
|
37
|
-
# Again, you either need to explicitly use a literal string:
|
|
38
|
-
#
|
|
39
|
-
# DB[:table].update(Sequel.lit("column = column + 1"))
|
|
40
|
-
#
|
|
41
|
-
# or construct the same SQL using a non-string based approach:
|
|
42
|
-
#
|
|
43
|
-
# DB[:table].update(:column => Sequel[:column] + 1)
|
|
44
|
-
#
|
|
45
|
-
# Related module: Sequel::Dataset::NoAutoLiteralStrings
|
|
46
2
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
class Dataset
|
|
50
|
-
module NoAutoLiteralStrings
|
|
51
|
-
# Raise an error if passing a plain string or an array whose first
|
|
52
|
-
# entry is a plain string.
|
|
53
|
-
def filter_expr(expr = nil)
|
|
54
|
-
case expr
|
|
55
|
-
when LiteralString
|
|
56
|
-
super
|
|
57
|
-
when String
|
|
58
|
-
raise Error, "plain string passed to a dataset filtering method"
|
|
59
|
-
when Array
|
|
60
|
-
if expr.first.is_a?(String) && !expr.first.is_a?(LiteralString)
|
|
61
|
-
raise Error, "plain string passed to a dataset filtering method"
|
|
62
|
-
end
|
|
63
|
-
super
|
|
64
|
-
else
|
|
65
|
-
super
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Raise an error if passing a plain string.
|
|
70
|
-
def update_sql(values=OPTS)
|
|
71
|
-
case values
|
|
72
|
-
when LiteralString
|
|
73
|
-
super
|
|
74
|
-
when String
|
|
75
|
-
raise Error, "plain string passed to a dataset filtering method"
|
|
76
|
-
else
|
|
77
|
-
super
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
register_extension(:no_auto_literal_strings, NoAutoLiteralStrings)
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# Sequel::Dataset.register_extension(:no_auto_literal_strings){} # SEQUEL5
|
|
3
|
+
Sequel::Database.register_extension(:no_auto_literal_strings){}
|
|
4
|
+
Sequel::Dataset.register_extension(:no_auto_literal_strings){}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
#
|
|
14
14
|
# Usage:
|
|
15
15
|
#
|
|
16
|
-
# ds = DB[:items].nullify.where(:
|
|
16
|
+
# ds = DB[:items].nullify.where(a: :b).select(:c)
|
|
17
17
|
# ds.sql # => "SELECT c FROM items WHERE (a = b)"
|
|
18
18
|
# ds.all # => [] # no query sent to the database
|
|
19
19
|
#
|
|
@@ -41,13 +41,7 @@ module Sequel
|
|
|
41
41
|
module Nullifiable
|
|
42
42
|
# Return a cloned nullified dataset.
|
|
43
43
|
def nullify
|
|
44
|
-
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# Nullify the current dataset
|
|
48
|
-
def nullify!
|
|
49
|
-
Sequel::Deprecation.deprecate("Dataset#nullify! from the null_dataset extension", "Use Dataset#nullify, which returned a modified copy")
|
|
50
|
-
extend NullDataset
|
|
44
|
+
with_extend(NullDataset)
|
|
51
45
|
end
|
|
52
46
|
end
|
|
53
47
|
|
|
@@ -64,10 +64,8 @@ module Sequel
|
|
|
64
64
|
|
|
65
65
|
class Dataset
|
|
66
66
|
# Holds methods that only relate to paginated datasets. Paginated dataset
|
|
67
|
-
# have pages starting at 1 (page 1 is offset 0, page
|
|
67
|
+
# have pages starting at 1 (page 1 is offset 0, page 2 is offset 1 * page_size).
|
|
68
68
|
module Pagination
|
|
69
|
-
Sequel::Dataset.def_deprecated_opts_setter(self, :page_size, :page_count, :current_page, :pagination_record_count)
|
|
70
|
-
|
|
71
69
|
# The number of records per page (the final page may have fewer than
|
|
72
70
|
# this number of records).
|
|
73
71
|
def page_size
|
|
@@ -135,20 +133,6 @@ module Sequel
|
|
|
135
133
|
def prev_page
|
|
136
134
|
current_page > 1 ? (current_page - 1) : nil
|
|
137
135
|
end
|
|
138
|
-
|
|
139
|
-
# SEQUEL5: Remove
|
|
140
|
-
# :nocov:
|
|
141
|
-
def set_pagination_info(page_no, page_size, record_count)
|
|
142
|
-
Sequel::Deprecation.deprecate("Dataset#set_pagination_info", "It should no longer be necessary to call this method")
|
|
143
|
-
self.current_page = page_no
|
|
144
|
-
self.page_size = page_size
|
|
145
|
-
self.pagination_record_count = record_count
|
|
146
|
-
page_count = (record_count / page_size.to_f).ceil
|
|
147
|
-
page_count = 1 if page_count == 0
|
|
148
|
-
self.page_count = page_count
|
|
149
|
-
self
|
|
150
|
-
end
|
|
151
|
-
# :nocov:
|
|
152
136
|
end
|
|
153
137
|
end
|
|
154
138
|
|