sequel 4.26.0 → 5.37.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 +5 -5
- data/CHANGELOG +405 -5656
- data/MIT-LICENSE +1 -1
- data/README.rdoc +232 -157
- data/bin/sequel +32 -9
- data/doc/advanced_associations.rdoc +252 -188
- data/doc/association_basics.rdoc +231 -273
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +75 -48
- data/doc/code_order.rdoc +28 -10
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +72 -46
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +59 -69
- data/doc/opening_databases.rdoc +84 -94
- data/doc/postgresql.rdoc +268 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +184 -164
- 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.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.4.0.txt +80 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +102 -77
- data/doc/security.rdoc +160 -87
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +135 -122
- data/doc/testing.rdoc +34 -18
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +101 -19
- data/doc/validations.rdoc +64 -51
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel.rb +3 -1
- data/lib/sequel/adapters/ado.rb +154 -22
- data/lib/sequel/adapters/ado/access.rb +21 -21
- data/lib/sequel/adapters/ado/mssql.rb +8 -15
- data/lib/sequel/adapters/amalgalite.rb +17 -25
- data/lib/sequel/adapters/ibmdb.rb +52 -58
- data/lib/sequel/adapters/jdbc.rb +149 -127
- data/lib/sequel/adapters/jdbc/db2.rb +32 -40
- data/lib/sequel/adapters/jdbc/derby.rb +56 -58
- data/lib/sequel/adapters/jdbc/h2.rb +40 -30
- data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
- data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
- data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
- data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
- data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
- data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
- data/lib/sequel/adapters/mock.rb +104 -113
- data/lib/sequel/adapters/mysql.rb +42 -61
- data/lib/sequel/adapters/mysql2.rb +126 -35
- data/lib/sequel/adapters/odbc.rb +21 -28
- data/lib/sequel/adapters/odbc/db2.rb +3 -1
- data/lib/sequel/adapters/odbc/mssql.rb +11 -15
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/oracle.rb +62 -68
- data/lib/sequel/adapters/postgres.rb +257 -311
- data/lib/sequel/adapters/postgresql.rb +3 -1
- data/lib/sequel/adapters/shared/access.rb +75 -79
- data/lib/sequel/adapters/shared/db2.rb +96 -74
- data/lib/sequel/adapters/shared/mssql.rb +258 -213
- data/lib/sequel/adapters/shared/mysql.rb +284 -216
- data/lib/sequel/adapters/shared/oracle.rb +175 -60
- data/lib/sequel/adapters/shared/postgres.rb +829 -383
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
- data/lib/sequel/adapters/shared/sqlite.rb +382 -159
- data/lib/sequel/adapters/sqlanywhere.rb +53 -38
- data/lib/sequel/adapters/sqlite.rb +111 -105
- data/lib/sequel/adapters/tinytds.rb +38 -46
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +3 -4
- data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +13 -89
- data/lib/sequel/connection_pool.rb +54 -26
- data/lib/sequel/connection_pool/sharded_single.rb +19 -12
- data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
- data/lib/sequel/connection_pool/single.rb +21 -12
- data/lib/sequel/connection_pool/threaded.rb +137 -119
- data/lib/sequel/core.rb +352 -320
- data/lib/sequel/database.rb +19 -2
- data/lib/sequel/database/connecting.rb +70 -55
- data/lib/sequel/database/dataset.rb +15 -5
- data/lib/sequel/database/dataset_defaults.rb +20 -102
- data/lib/sequel/database/features.rb +20 -4
- data/lib/sequel/database/logging.rb +25 -7
- data/lib/sequel/database/misc.rb +132 -118
- data/lib/sequel/database/query.rb +51 -28
- data/lib/sequel/database/schema_generator.rb +188 -75
- data/lib/sequel/database/schema_methods.rb +161 -92
- data/lib/sequel/database/transactions.rb +260 -58
- data/lib/sequel/dataset.rb +28 -12
- data/lib/sequel/dataset/actions.rb +354 -170
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +81 -34
- data/lib/sequel/dataset/graph.rb +82 -58
- data/lib/sequel/dataset/misc.rb +139 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +428 -214
- data/lib/sequel/dataset/sql.rb +446 -339
- data/lib/sequel/deprecated.rb +14 -2
- data/lib/sequel/exceptions.rb +48 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +10 -9
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +2 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +9 -4
- data/lib/sequel/extensions/connection_expiration.rb +99 -0
- data/lib/sequel/extensions/connection_validator.rb +26 -13
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +93 -38
- data/lib/sequel/extensions/core_extensions.rb +45 -53
- data/lib/sequel/extensions/core_refinements.rb +44 -46
- data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
- data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
- data/lib/sequel/extensions/date_arithmetic.rb +42 -16
- data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
- data/lib/sequel/extensions/error_sql.rb +7 -3
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +14 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +2 -31
- data/lib/sequel/extensions/graph_each.rb +19 -6
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +8 -4
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/looser_typecasting.rb +19 -9
- data/lib/sequel/extensions/migration.rb +132 -80
- data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
- data/lib/sequel/extensions/null_dataset.rb +12 -8
- data/lib/sequel/extensions/pagination.rb +35 -28
- data/lib/sequel/extensions/pg_array.rb +227 -316
- data/lib/sequel/extensions/pg_array_ops.rb +19 -7
- data/lib/sequel/extensions/pg_enum.rb +69 -24
- data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
- data/lib/sequel/extensions/pg_hstore.rb +50 -59
- data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
- data/lib/sequel/extensions/pg_inet.rb +34 -15
- data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
- data/lib/sequel/extensions/pg_interval.rb +26 -26
- data/lib/sequel/extensions/pg_json.rb +422 -141
- data/lib/sequel/extensions/pg_json_ops.rb +248 -9
- data/lib/sequel/extensions/pg_loose_count.rb +5 -1
- data/lib/sequel/extensions/pg_range.rb +162 -146
- data/lib/sequel/extensions/pg_range_ops.rb +10 -5
- data/lib/sequel/extensions/pg_row.rb +53 -87
- data/lib/sequel/extensions/pg_row_ops.rb +36 -13
- data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/pretty_table.rb +4 -0
- data/lib/sequel/extensions/query.rb +12 -7
- data/lib/sequel/extensions/round_timestamps.rb +6 -9
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +59 -0
- data/lib/sequel/extensions/schema_caching.rb +14 -1
- data/lib/sequel/extensions/schema_dumper.rb +83 -55
- data/lib/sequel/extensions/select_remove.rb +8 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +50 -17
- data/lib/sequel/extensions/server_logging.rb +61 -0
- data/lib/sequel/extensions/split_array_nil.rb +8 -4
- data/lib/sequel/extensions/sql_comments.rb +96 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -1
- data/lib/sequel/extensions/string_agg.rb +181 -0
- data/lib/sequel/extensions/string_date_time.rb +2 -0
- data/lib/sequel/extensions/symbol_aref.rb +53 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
- data/lib/sequel/extensions/to_dot.rb +15 -5
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model.rb +36 -126
- data/lib/sequel/model/associations.rb +850 -257
- data/lib/sequel/model/base.rb +652 -764
- data/lib/sequel/model/dataset_module.rb +13 -10
- data/lib/sequel/model/default_inflections.rb +3 -1
- data/lib/sequel/model/errors.rb +3 -3
- data/lib/sequel/model/exceptions.rb +12 -12
- data/lib/sequel/model/inflections.rb +8 -19
- data/lib/sequel/model/plugins.rb +111 -0
- data/lib/sequel/plugins/accessed_columns.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +32 -7
- data/lib/sequel/plugins/after_initialize.rb +3 -1
- data/lib/sequel/plugins/association_dependencies.rb +27 -18
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +181 -83
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/auto_validations.rb +58 -23
- data/lib/sequel/plugins/before_after_save.rb +8 -0
- data/lib/sequel/plugins/blacklist_security.rb +23 -12
- data/lib/sequel/plugins/boolean_readers.rb +9 -6
- data/lib/sequel/plugins/boolean_subsets.rb +64 -0
- data/lib/sequel/plugins/caching.rb +27 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
- data/lib/sequel/plugins/column_conflicts.rb +18 -3
- data/lib/sequel/plugins/column_select.rb +9 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +36 -24
- data/lib/sequel/plugins/constraint_validations.rb +37 -16
- data/lib/sequel/plugins/csv_serializer.rb +58 -35
- data/lib/sequel/plugins/dataset_associations.rb +60 -18
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +74 -13
- data/lib/sequel/plugins/delay_add_association.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +65 -24
- data/lib/sequel/plugins/eager_each.rb +27 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/error_splitter.rb +19 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +9 -12
- data/lib/sequel/plugins/hook_class_methods.rb +39 -54
- data/lib/sequel/plugins/input_transformer.rb +20 -10
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/insert_returning_select.rb +4 -2
- data/lib/sequel/plugins/instance_filters.rb +12 -8
- data/lib/sequel/plugins/instance_hooks.rb +36 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +24 -13
- data/lib/sequel/plugins/json_serializer.rb +123 -47
- data/lib/sequel/plugins/lazy_attributes.rb +20 -14
- data/lib/sequel/plugins/list.rb +40 -26
- data/lib/sequel/plugins/many_through_many.rb +28 -12
- data/lib/sequel/plugins/modification_detection.rb +17 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
- data/lib/sequel/plugins/nested_attributes.rb +55 -28
- data/lib/sequel/plugins/optimistic_locking.rb +5 -3
- data/lib/sequel/plugins/pg_array_associations.rb +52 -18
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
- data/lib/sequel/plugins/pg_row.rb +7 -51
- data/lib/sequel/plugins/prepared_statements.rb +53 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
- data/lib/sequel/plugins/rcte_tree.rb +43 -63
- data/lib/sequel/plugins/serialization.rb +37 -44
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
- data/lib/sequel/plugins/sharding.rb +17 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
- data/lib/sequel/plugins/singular_table_names.rb +2 -0
- data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +13 -6
- data/lib/sequel/plugins/static_cache.rb +79 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +5 -3
- data/lib/sequel/plugins/subclasses.rb +20 -2
- data/lib/sequel/plugins/subset_conditions.rb +48 -0
- data/lib/sequel/plugins/table_select.rb +4 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +22 -8
- data/lib/sequel/plugins/touch.rb +21 -8
- data/lib/sequel/plugins/tree.rb +57 -30
- data/lib/sequel/plugins/typecast_on_load.rb +14 -4
- data/lib/sequel/plugins/unlimited_update.rb +3 -7
- data/lib/sequel/plugins/update_or_create.rb +6 -4
- data/lib/sequel/plugins/update_primary_key.rb +3 -1
- data/lib/sequel/plugins/update_refresh.rb +28 -15
- data/lib/sequel/plugins/uuid.rb +70 -0
- data/lib/sequel/plugins/validate_associated.rb +20 -0
- data/lib/sequel/plugins/validation_class_methods.rb +40 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +49 -31
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +31 -30
- data/lib/sequel/sql.rb +479 -329
- data/lib/sequel/timezones.rb +62 -32
- data/lib/sequel/version.rb +10 -3
- metadata +177 -477
- data/Rakefile +0 -165
- data/doc/active_record.rdoc +0 -912
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/lib/sequel/adapters/cubrid.rb +0 -142
- data/lib/sequel/adapters/do.rb +0 -156
- data/lib/sequel/adapters/do/mysql.rb +0 -64
- data/lib/sequel/adapters/do/postgres.rb +0 -42
- data/lib/sequel/adapters/do/sqlite3.rb +0 -40
- data/lib/sequel/adapters/jdbc/as400.rb +0 -82
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
- data/lib/sequel/adapters/odbc/progress.rb +0 -8
- data/lib/sequel/adapters/shared/cubrid.rb +0 -243
- data/lib/sequel/adapters/shared/firebird.rb +0 -245
- data/lib/sequel/adapters/shared/informix.rb +0 -52
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
- data/lib/sequel/adapters/shared/progress.rb +0 -38
- data/lib/sequel/adapters/swift.rb +0 -158
- data/lib/sequel/adapters/swift/mysql.rb +0 -47
- data/lib/sequel/adapters/swift/postgres.rb +0 -45
- data/lib/sequel/adapters/swift/sqlite.rb +0 -47
- data/lib/sequel/adapters/utils/pg_types.rb +0 -68
- data/lib/sequel/dataset/mutation.rb +0 -109
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
- data/lib/sequel/extensions/filter_having.rb +0 -59
- data/lib/sequel/extensions/hash_aliases.rb +0 -45
- data/lib/sequel/extensions/meta_def.rb +0 -31
- data/lib/sequel/extensions/query_literals.rb +0 -80
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
- data/lib/sequel/extensions/set_overrides.rb +0 -72
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/association_autoreloading.rb +0 -7
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
- data/lib/sequel/plugins/schema.rb +0 -80
- data/lib/sequel/plugins/scissors.rb +0 -33
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -706
- data/spec/adapters/mysql_spec.rb +0 -1287
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3725
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -653
- data/spec/bin_spec.rb +0 -254
- data/spec/core/connection_pool_spec.rb +0 -1016
- data/spec/core/database_spec.rb +0 -2531
- data/spec/core/dataset_spec.rb +0 -5098
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1243
- data/spec/core/mock_adapter_spec.rb +0 -462
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -179
- data/spec/core/schema_spec.rb +0 -1659
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -123
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -365
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -420
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_validator_spec.rb +0 -120
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
- data/spec/extensions/constraint_validations_spec.rb +0 -325
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -173
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -311
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -150
- data/spec/extensions/defaults_setter_spec.rb +0 -101
- data/spec/extensions/delay_add_association_spec.rb +0 -52
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/eager_each_spec.rb +0 -42
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -109
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -291
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -267
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -712
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -395
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -229
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -404
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -789
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -66
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -541
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -55
- data/spec/integration/associations_test.rb +0 -2454
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1808
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -240
- data/spec/integration/model_test.rb +0 -226
- data/spec/integration/plugin_test.rb +0 -2240
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -817
- data/spec/integration/spec_helper.rb +0 -48
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -374
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -525
- data/spec/model/associations_spec.rb +0 -4426
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2137
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -982
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2147
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
class Database
|
|
3
5
|
# ---------------------
|
|
@@ -5,10 +7,8 @@ module Sequel
|
|
|
5
7
|
# This methods generally execute SQL code on the database server.
|
|
6
8
|
# ---------------------
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
COLUMN_SCHEMA_DATETIME_TYPES = [:date, :datetime]
|
|
11
|
-
COLUMN_SCHEMA_STRING_TYPES = [:string, :blob, :date, :datetime, :time, :enum, :set, :interval]
|
|
10
|
+
COLUMN_SCHEMA_DATETIME_TYPES = [:date, :datetime].freeze
|
|
11
|
+
COLUMN_SCHEMA_STRING_TYPES = [:string, :blob, :date, :datetime, :time, :enum, :set, :interval].freeze
|
|
12
12
|
|
|
13
13
|
# The prepared statement object hash for this database, keyed by name symbol
|
|
14
14
|
attr_reader :prepared_statements
|
|
@@ -30,9 +30,9 @@ module Sequel
|
|
|
30
30
|
# Call the prepared statement with the given name with the given hash
|
|
31
31
|
# of arguments.
|
|
32
32
|
#
|
|
33
|
-
# DB[:items].
|
|
33
|
+
# DB[:items].where(id: 1).prepare(:first, :sa)
|
|
34
34
|
# DB.call(:sa) # SELECT * FROM items WHERE id = 1
|
|
35
|
-
def call(ps_name, hash=
|
|
35
|
+
def call(ps_name, hash=OPTS, &block)
|
|
36
36
|
prepared_statement(ps_name).call(hash, &block)
|
|
37
37
|
end
|
|
38
38
|
|
|
@@ -43,7 +43,7 @@ module Sequel
|
|
|
43
43
|
execute_dui(sql, opts, &block)
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
# Method that should be used when issuing a DELETE
|
|
46
|
+
# Method that should be used when issuing a DELETE or UPDATE
|
|
47
47
|
# statement. By default, calls execute.
|
|
48
48
|
# This method should not be called directly by user code.
|
|
49
49
|
def execute_dui(sql, opts=OPTS, &block)
|
|
@@ -57,11 +57,11 @@ module Sequel
|
|
|
57
57
|
execute_dui(sql, opts, &block)
|
|
58
58
|
end
|
|
59
59
|
|
|
60
|
-
# Returns a single value from the database,
|
|
60
|
+
# Returns a single value from the database, see Dataset#get.
|
|
61
61
|
#
|
|
62
62
|
# DB.get(1) # SELECT 1
|
|
63
63
|
# # => 1
|
|
64
|
-
# DB.get{server_version
|
|
64
|
+
# DB.get{server_version.function} # SELECT server_version()
|
|
65
65
|
def get(*args, &block)
|
|
66
66
|
@default_dataset.get(*args, &block)
|
|
67
67
|
end
|
|
@@ -86,7 +86,7 @@ module Sequel
|
|
|
86
86
|
# :schema :: An explicit schema to use. It may also be implicitly provided
|
|
87
87
|
# via the table name.
|
|
88
88
|
#
|
|
89
|
-
# If schema parsing is supported by the database, the column information should
|
|
89
|
+
# If schema parsing is supported by the database, the column information hash should contain at least the
|
|
90
90
|
# following entries:
|
|
91
91
|
#
|
|
92
92
|
# :allow_null :: Whether NULL is an allowed value for the column.
|
|
@@ -157,11 +157,11 @@ module Sequel
|
|
|
157
157
|
end
|
|
158
158
|
|
|
159
159
|
cols = schema_parse_table(table_name, opts)
|
|
160
|
-
raise(Error,
|
|
160
|
+
raise(Error, "schema parsing returned no columns, table #{table_name.inspect} probably doesn't exist") if cols.nil? || cols.empty?
|
|
161
161
|
|
|
162
162
|
primary_keys = 0
|
|
163
163
|
auto_increment_set = false
|
|
164
|
-
cols.
|
|
164
|
+
cols.each do |_,c|
|
|
165
165
|
auto_increment_set = true if c.has_key?(:auto_increment)
|
|
166
166
|
primary_keys += 1 if c[:primary_key]
|
|
167
167
|
end
|
|
@@ -176,6 +176,8 @@ module Sequel
|
|
|
176
176
|
c[:max_length] = max_length
|
|
177
177
|
end
|
|
178
178
|
end
|
|
179
|
+
schema_post_process(cols)
|
|
180
|
+
|
|
179
181
|
Sequel.synchronize{@schemas[quoted_name] = cols} if cache_schema
|
|
180
182
|
cols
|
|
181
183
|
end
|
|
@@ -191,7 +193,8 @@ module Sequel
|
|
|
191
193
|
def table_exists?(name)
|
|
192
194
|
sch, table_name = schema_and_table(name)
|
|
193
195
|
name = SQL::QualifiedIdentifier.new(sch, table_name) if sch
|
|
194
|
-
|
|
196
|
+
ds = from(name)
|
|
197
|
+
transaction(:savepoint=>:only){_table_exists?(ds)}
|
|
195
198
|
true
|
|
196
199
|
rescue DatabaseError
|
|
197
200
|
false
|
|
@@ -237,7 +240,7 @@ module Sequel
|
|
|
237
240
|
when :time
|
|
238
241
|
Sequel.string_to_time(default)
|
|
239
242
|
when :decimal
|
|
240
|
-
BigDecimal
|
|
243
|
+
BigDecimal(default)
|
|
241
244
|
end
|
|
242
245
|
end
|
|
243
246
|
|
|
@@ -245,7 +248,7 @@ module Sequel
|
|
|
245
248
|
# and return the normalized value.
|
|
246
249
|
def column_schema_normalize_default(default, type)
|
|
247
250
|
if column_schema_default_string_type?(type)
|
|
248
|
-
return unless m =
|
|
251
|
+
return unless m = /\A'(.*)'\z/.match(default)
|
|
249
252
|
m[1].gsub("''", "'")
|
|
250
253
|
else
|
|
251
254
|
default
|
|
@@ -257,7 +260,7 @@ module Sequel
|
|
|
257
260
|
def column_schema_to_ruby_default(default, type)
|
|
258
261
|
return default unless default.is_a?(String)
|
|
259
262
|
if COLUMN_SCHEMA_DATETIME_TYPES.include?(type)
|
|
260
|
-
if
|
|
263
|
+
if /now|today|CURRENT|getdate|\ADate\(\)\z/i.match(default)
|
|
261
264
|
if type == :date
|
|
262
265
|
return Sequel::CURRENT_DATE
|
|
263
266
|
else
|
|
@@ -284,16 +287,16 @@ module Sequel
|
|
|
284
287
|
(ds || dataset).method(:input_identifier)
|
|
285
288
|
end
|
|
286
289
|
|
|
290
|
+
# Uncached version of metadata_dataset, designed for overriding.
|
|
291
|
+
def _metadata_dataset
|
|
292
|
+
dataset
|
|
293
|
+
end
|
|
294
|
+
|
|
287
295
|
# Return a dataset that uses the default identifier input and output methods
|
|
288
296
|
# for this database. Used when parsing metadata so that column symbols are
|
|
289
297
|
# returned as expected.
|
|
290
298
|
def metadata_dataset
|
|
291
|
-
@metadata_dataset ||=
|
|
292
|
-
ds = dataset;
|
|
293
|
-
ds.identifier_input_method = identifier_input_method_default;
|
|
294
|
-
ds.identifier_output_method = identifier_output_method_default;
|
|
295
|
-
ds
|
|
296
|
-
)
|
|
299
|
+
@metadata_dataset ||= _metadata_dataset
|
|
297
300
|
end
|
|
298
301
|
|
|
299
302
|
# Return a Method object for the dataset's output_identifier_method.
|
|
@@ -305,10 +308,10 @@ module Sequel
|
|
|
305
308
|
|
|
306
309
|
# Remove the cached schema for the given schema name
|
|
307
310
|
def remove_cached_schema(table)
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
311
|
+
cache = @default_dataset.send(:cache)
|
|
312
|
+
Sequel.synchronize{cache.clear}
|
|
313
|
+
k = quote_schema_table(table)
|
|
314
|
+
Sequel.synchronize{@schemas.delete(k)}
|
|
312
315
|
end
|
|
313
316
|
|
|
314
317
|
# Match the database's column type to a ruby type via a
|
|
@@ -322,13 +325,13 @@ module Sequel
|
|
|
322
325
|
:integer
|
|
323
326
|
when /\Adate\z/io
|
|
324
327
|
:date
|
|
325
|
-
when /\A((small)?datetime|timestamp( with(out)? time zone)?)
|
|
328
|
+
when /\A((small)?datetime|timestamp(\(\d\))?( with(out)? time zone)?)\z/io
|
|
326
329
|
:datetime
|
|
327
330
|
when /\Atime( with(out)? time zone)?\z/io
|
|
328
331
|
:time
|
|
329
332
|
when /\A(bool(ean)?)\z/io
|
|
330
333
|
:boolean
|
|
331
|
-
when /\A(real|float
|
|
334
|
+
when /\A(real|float( unsigned)?|double( precision)?|double\(\d+,\d+\)( unsigned)?)\z/io
|
|
332
335
|
:float
|
|
333
336
|
when /\A(?:(?:(?:num(?:ber|eric)?|decimal)(?:\(\d+,\s*(\d+|false|true)\))?))\z/io
|
|
334
337
|
$1 && ['0', 'false'].include?($1) ? :integer : :decimal
|
|
@@ -338,5 +341,25 @@ module Sequel
|
|
|
338
341
|
:enum
|
|
339
342
|
end
|
|
340
343
|
end
|
|
344
|
+
|
|
345
|
+
# Post process the schema values.
|
|
346
|
+
def schema_post_process(cols)
|
|
347
|
+
# :nocov:
|
|
348
|
+
if RUBY_VERSION >= '2.5'
|
|
349
|
+
# :nocov:
|
|
350
|
+
cols.each do |_, h|
|
|
351
|
+
db_type = h[:db_type]
|
|
352
|
+
if db_type.is_a?(String)
|
|
353
|
+
h[:db_type] = -db_type
|
|
354
|
+
end
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
cols.each do |_,c|
|
|
359
|
+
c.each_value do |val|
|
|
360
|
+
val.freeze if val.is_a?(String)
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
end
|
|
341
364
|
end
|
|
342
365
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
# The Schema module holds the schema generators.
|
|
3
5
|
module Schema
|
|
@@ -16,16 +18,15 @@ module Sequel
|
|
|
16
18
|
# the {"Schema Modification" guide}[rdoc-ref:doc/schema_modification.rdoc].
|
|
17
19
|
class CreateTableGenerator
|
|
18
20
|
# Classes specifying generic types that Sequel will convert to database-specific types.
|
|
19
|
-
GENERIC_TYPES
|
|
20
|
-
Date, DateTime, Time, File, TrueClass, FalseClass]
|
|
21
|
+
GENERIC_TYPES=%w'String Integer Float Numeric BigDecimal Date DateTime Time File TrueClass FalseClass'.freeze
|
|
21
22
|
|
|
22
|
-
#
|
|
23
|
+
# Column hashes created by this generator
|
|
23
24
|
attr_reader :columns
|
|
24
25
|
|
|
25
|
-
#
|
|
26
|
+
# Constraint hashes created by this generator
|
|
26
27
|
attr_reader :constraints
|
|
27
28
|
|
|
28
|
-
#
|
|
29
|
+
# Index hashes created by this generator
|
|
29
30
|
attr_reader :indexes
|
|
30
31
|
|
|
31
32
|
# Set the database in which to create the table, and evaluate the block
|
|
@@ -36,38 +37,55 @@ module Sequel
|
|
|
36
37
|
@indexes = []
|
|
37
38
|
@constraints = []
|
|
38
39
|
@primary_key = nil
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
instance_exec(&block) if block
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Use custom Bignum method to use :Bignum instead of Bignum class, to work
|
|
44
|
+
# correctly in cases where Bignum is the same as Integer.
|
|
45
|
+
def Bignum(name, opts=OPTS)
|
|
46
|
+
column(name, :Bignum, opts)
|
|
41
47
|
end
|
|
42
48
|
|
|
49
|
+
# Use custom Fixnum method to use Integer instead of Fixnum class, to avoid
|
|
50
|
+
# warnings on ruby 2.4+.
|
|
51
|
+
def Fixnum(name, opts=OPTS)
|
|
52
|
+
column(name, Integer, opts)
|
|
53
|
+
end
|
|
54
|
+
|
|
43
55
|
# Add a method for each of the given types that creates a column
|
|
44
56
|
# with that type as a constant. Types given should either already
|
|
45
57
|
# be constants/classes or a capitalized string/symbol with the same name
|
|
46
58
|
# as a constant/class.
|
|
47
|
-
#
|
|
48
|
-
# Do not call this method with untrusted input, as that can result in
|
|
49
|
-
# arbitrary code execution.
|
|
50
59
|
def self.add_type_method(*types)
|
|
51
60
|
types.each do |type|
|
|
52
|
-
|
|
61
|
+
case type
|
|
62
|
+
when Symbol, String
|
|
63
|
+
method = type
|
|
64
|
+
type = Object.const_get(type)
|
|
65
|
+
else
|
|
66
|
+
method = type.to_s
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
define_method(method){|name, opts=OPTS| column(name, type, opts)}
|
|
53
70
|
end
|
|
71
|
+
nil
|
|
54
72
|
end
|
|
55
73
|
|
|
56
|
-
# Add an unnamed constraint
|
|
74
|
+
# Add an unnamed constraint, specified by the given block
|
|
57
75
|
# or args:
|
|
58
76
|
#
|
|
59
|
-
# check(:
|
|
60
|
-
# check{num > 5}
|
|
77
|
+
# check(num: 1..5) # CHECK num >= 1 AND num <= 5
|
|
78
|
+
# check{num > 5} # CHECK num > 5
|
|
61
79
|
def check(*args, &block)
|
|
62
80
|
constraint(nil, *args, &block)
|
|
63
81
|
end
|
|
64
82
|
|
|
65
|
-
# Add a column with the given name, type, and opts
|
|
83
|
+
# Add a column with the given name, type, and opts:
|
|
66
84
|
#
|
|
67
85
|
# column :num, :integer
|
|
68
86
|
# # num INTEGER
|
|
69
87
|
#
|
|
70
|
-
# column :name, String, :
|
|
88
|
+
# column :name, String, null: false, default: 'a'
|
|
71
89
|
# # name varchar(255) NOT NULL DEFAULT 'a'
|
|
72
90
|
#
|
|
73
91
|
# inet :ip
|
|
@@ -91,6 +109,9 @@ module Sequel
|
|
|
91
109
|
# yet exist on referenced table (but will exist before the transaction commits).
|
|
92
110
|
# Basically it adds DEFERRABLE INITIALLY DEFERRED on key creation.
|
|
93
111
|
# If you use :immediate as the value, uses DEFERRABLE INITIALLY IMMEDIATE.
|
|
112
|
+
# :generated_always_as :: Specify a GENERATED ALWAYS AS column expression,
|
|
113
|
+
# if generated columns are supported (PostgreSQL 12+, MariaDB 5.2.0+,
|
|
114
|
+
# and MySQL 5.7.6+).
|
|
94
115
|
# :index :: Create an index on this column. If given a hash, use the hash as the
|
|
95
116
|
# options for the index.
|
|
96
117
|
# :key :: For foreign key columns, the column in the associated table
|
|
@@ -98,47 +119,61 @@ module Sequel
|
|
|
98
119
|
# references the primary key of the associated table, except if you are
|
|
99
120
|
# using MySQL.
|
|
100
121
|
# :null :: Mark the column as allowing NULL values (if true),
|
|
101
|
-
# or not allowing NULL values (if false).
|
|
102
|
-
# to whatever the database default is.
|
|
122
|
+
# or not allowing NULL values (if false). The default is to allow NULL values.
|
|
103
123
|
# :on_delete :: Specify the behavior of this column when being deleted
|
|
104
124
|
# (:restrict, :cascade, :set_null, :set_default, :no_action).
|
|
105
125
|
# :on_update :: Specify the behavior of this column when being updated
|
|
106
126
|
# (:restrict, :cascade, :set_null, :set_default, :no_action).
|
|
107
|
-
# :primary_key :: Make the column as a single primary key column. This should
|
|
108
|
-
# be used if you
|
|
127
|
+
# :primary_key :: Make the column as a single primary key column. This should not
|
|
128
|
+
# be used if you want a single autoincrementing primary key column
|
|
129
|
+
# (use the primary_key method in that case).
|
|
109
130
|
# :primary_key_constraint_name :: The name to give the primary key constraint
|
|
131
|
+
# :primary_key_deferrable :: Similar to :deferrable, but for the primary key constraint
|
|
132
|
+
# if :primary_key is used.
|
|
110
133
|
# :type :: Overrides the type given as the argument. Generally not used by column
|
|
111
134
|
# itself, but can be passed as an option to other methods that call column.
|
|
112
135
|
# :unique :: Mark the column as unique, generally has the same effect as
|
|
113
136
|
# creating a unique index on the column.
|
|
114
137
|
# :unique_constraint_name :: The name to give the unique key constraint
|
|
138
|
+
# :unique_deferrable :: Similar to :deferrable, but for the unique constraint if :unique
|
|
139
|
+
# is used.
|
|
140
|
+
#
|
|
141
|
+
# PostgreSQL specific options:
|
|
142
|
+
#
|
|
143
|
+
# :identity :: Create an identity column.
|
|
144
|
+
#
|
|
145
|
+
# MySQL specific options:
|
|
146
|
+
# :generated_type :: Set the type of column when using :generated_always_as,
|
|
147
|
+
# should be :virtual or :stored to force a type.
|
|
115
148
|
def column(name, type, opts = OPTS)
|
|
116
149
|
columns << {:name => name, :type => type}.merge!(opts)
|
|
117
150
|
if index_opts = opts[:index]
|
|
118
|
-
index(name, index_opts.is_a?(Hash) ? index_opts :
|
|
151
|
+
index(name, index_opts.is_a?(Hash) ? index_opts : OPTS)
|
|
119
152
|
end
|
|
153
|
+
nil
|
|
120
154
|
end
|
|
121
155
|
|
|
122
|
-
# Adds a named constraint (or unnamed if name is nil)
|
|
156
|
+
# Adds a named constraint (or unnamed if name is nil),
|
|
123
157
|
# with the given block or args. To provide options for the constraint, pass
|
|
124
158
|
# a hash as the first argument.
|
|
125
159
|
#
|
|
126
|
-
# constraint(:blah, :
|
|
160
|
+
# constraint(:blah, num: 1..5)
|
|
127
161
|
# # CONSTRAINT blah CHECK num >= 1 AND num <= 5
|
|
128
|
-
# constraint({:
|
|
162
|
+
# constraint({name: :blah, deferrable: true}, num: 1..5)
|
|
129
163
|
# # CONSTRAINT blah CHECK num >= 1 AND num <= 5 DEFERRABLE INITIALLY DEFERRED
|
|
130
164
|
def constraint(name, *args, &block)
|
|
131
165
|
opts = name.is_a?(Hash) ? name : {:name=>name}
|
|
132
166
|
constraints << opts.merge(:type=>:check, :check=>block || args)
|
|
167
|
+
nil
|
|
133
168
|
end
|
|
134
169
|
|
|
135
|
-
# Add a foreign key in the table that references another table
|
|
170
|
+
# Add a foreign key in the table that references another table. See #column
|
|
136
171
|
# for available options.
|
|
137
172
|
#
|
|
138
173
|
# foreign_key(:artist_id) # artist_id INTEGER
|
|
139
174
|
# foreign_key(:artist_id, :artists) # artist_id INTEGER REFERENCES artists
|
|
140
|
-
# foreign_key(:artist_id, :artists, :
|
|
141
|
-
# foreign_key(:artist_id, :artists, :
|
|
175
|
+
# foreign_key(:artist_id, :artists, key: :id) # artist_id INTEGER REFERENCES artists(id)
|
|
176
|
+
# foreign_key(:artist_id, :artists, type: String) # artist_id varchar(255) REFERENCES artists(id)
|
|
142
177
|
#
|
|
143
178
|
# Additional Options:
|
|
144
179
|
#
|
|
@@ -148,24 +183,22 @@ module Sequel
|
|
|
148
183
|
# composite foreign key), you can provide an array of columns as the first argument, and
|
|
149
184
|
# you can provide the :name option to name the constraint:
|
|
150
185
|
#
|
|
151
|
-
# foreign_key([:artist_name, :artist_location], :artists, :
|
|
186
|
+
# foreign_key([:artist_name, :artist_location], :artists, name: :artist_fk)
|
|
152
187
|
# # ADD CONSTRAINT artist_fk FOREIGN KEY (artist_name, artist_location) REFERENCES artists
|
|
153
188
|
def foreign_key(name, table=nil, opts = OPTS)
|
|
154
189
|
opts = case table
|
|
155
190
|
when Hash
|
|
156
191
|
table.merge(opts)
|
|
157
|
-
when Symbol
|
|
158
|
-
opts.merge(:table=>table)
|
|
159
192
|
when NilClass
|
|
160
193
|
opts
|
|
161
194
|
else
|
|
162
|
-
|
|
195
|
+
opts.merge(:table=>table)
|
|
163
196
|
end
|
|
164
197
|
return composite_foreign_key(name, opts) if name.is_a?(Array)
|
|
165
198
|
column(name, Integer, opts)
|
|
166
199
|
end
|
|
167
200
|
|
|
168
|
-
# Add a full text index on the given columns
|
|
201
|
+
# Add a full text index on the given columns.
|
|
169
202
|
#
|
|
170
203
|
# PostgreSQL specific options:
|
|
171
204
|
# :index_type :: Can be set to :gist to use a GIST index instead of the
|
|
@@ -178,12 +211,12 @@ module Sequel
|
|
|
178
211
|
index(columns, opts.merge(:type => :full_text))
|
|
179
212
|
end
|
|
180
213
|
|
|
181
|
-
# True if the
|
|
214
|
+
# True if the generator includes the creation of a column with the given name.
|
|
182
215
|
def has_column?(name)
|
|
183
216
|
columns.any?{|c| c[:name] == name}
|
|
184
217
|
end
|
|
185
218
|
|
|
186
|
-
# Add an index on the given column(s) with the given options
|
|
219
|
+
# Add an index on the given column(s) with the given options.
|
|
187
220
|
# General options:
|
|
188
221
|
#
|
|
189
222
|
# :name :: The name to use for the index. If not given, a default name
|
|
@@ -198,6 +231,9 @@ module Sequel
|
|
|
198
231
|
# operations on the table while the index is being
|
|
199
232
|
# built.
|
|
200
233
|
# :opclass :: Use a specific operator class in the index.
|
|
234
|
+
# :include :: Include additional column values in the index, without
|
|
235
|
+
# actually indexing on those values (PostgreSQL 11+).
|
|
236
|
+
# :tablespace :: Specify tablespace for index.
|
|
201
237
|
#
|
|
202
238
|
# Microsoft SQL Server specific options:
|
|
203
239
|
#
|
|
@@ -211,9 +247,10 @@ module Sequel
|
|
|
211
247
|
# # CREATE INDEX table_artist_id_name_index ON table (artist_id, name)
|
|
212
248
|
def index(columns, opts = OPTS)
|
|
213
249
|
indexes << {:columns => Array(columns)}.merge!(opts)
|
|
250
|
+
nil
|
|
214
251
|
end
|
|
215
252
|
|
|
216
|
-
# Add a column with the given type, name, and opts
|
|
253
|
+
# Add a column with the given type, name, and opts. See #column for available
|
|
217
254
|
# options.
|
|
218
255
|
def method_missing(type, name = nil, opts = OPTS)
|
|
219
256
|
name ? column(name, type, opts) : super
|
|
@@ -224,7 +261,7 @@ module Sequel
|
|
|
224
261
|
true
|
|
225
262
|
end
|
|
226
263
|
|
|
227
|
-
# Adds an autoincrementing primary key column or a primary key constraint
|
|
264
|
+
# Adds an autoincrementing primary key column or a primary key constraint.
|
|
228
265
|
# To just create a constraint, the first argument should be an array of column symbols
|
|
229
266
|
# specifying the primary key columns. To create an autoincrementing primary key
|
|
230
267
|
# column, a single symbol can be used. In both cases, an options hash can be used
|
|
@@ -232,26 +269,39 @@ module Sequel
|
|
|
232
269
|
#
|
|
233
270
|
# If you want to create a primary key column that is not autoincrementing, you
|
|
234
271
|
# should not use this method. Instead, you should use the regular +column+ method
|
|
235
|
-
# with a <tt
|
|
272
|
+
# with a <tt>primary_key: true</tt> option.
|
|
236
273
|
#
|
|
237
274
|
# If an array of column symbols is used, you can specify the :name option
|
|
238
275
|
# to name the constraint.
|
|
276
|
+
#
|
|
277
|
+
# Options:
|
|
278
|
+
# :keep_order :: For non-composite primary keys, respects the existing order of
|
|
279
|
+
# columns, overriding the default behavior of making the primary
|
|
280
|
+
# key the first column.
|
|
239
281
|
#
|
|
240
282
|
# Examples:
|
|
241
283
|
# primary_key(:id)
|
|
242
|
-
# primary_key(
|
|
284
|
+
# primary_key(:id, type: :Bignum, keep_order: true)
|
|
285
|
+
# primary_key([:street_number, :house_number], name: :some constraint_name)
|
|
243
286
|
def primary_key(name, *args)
|
|
244
287
|
return composite_primary_key(name, *args) if name.is_a?(Array)
|
|
245
|
-
|
|
288
|
+
column = @db.serial_primary_key_options.merge({:name => name})
|
|
246
289
|
|
|
247
290
|
if opts = args.pop
|
|
248
291
|
opts = {:type => opts} unless opts.is_a?(Hash)
|
|
249
292
|
if type = args.pop
|
|
250
|
-
opts.merge
|
|
293
|
+
opts = opts.merge(:type => type)
|
|
251
294
|
end
|
|
252
|
-
|
|
295
|
+
column.merge!(opts)
|
|
253
296
|
end
|
|
254
|
-
|
|
297
|
+
|
|
298
|
+
@primary_key = column
|
|
299
|
+
if column[:keep_order]
|
|
300
|
+
columns << column
|
|
301
|
+
else
|
|
302
|
+
columns.unshift(column)
|
|
303
|
+
end
|
|
304
|
+
nil
|
|
255
305
|
end
|
|
256
306
|
|
|
257
307
|
# The name of the primary key for this generator, if it has a primary key.
|
|
@@ -259,12 +309,12 @@ module Sequel
|
|
|
259
309
|
@primary_key[:name] if @primary_key
|
|
260
310
|
end
|
|
261
311
|
|
|
262
|
-
# Add a spatial index on the given columns
|
|
312
|
+
# Add a spatial index on the given columns.
|
|
263
313
|
def spatial_index(columns, opts = OPTS)
|
|
264
314
|
index(columns, opts.merge(:type => :spatial))
|
|
265
315
|
end
|
|
266
316
|
|
|
267
|
-
# Add a unique constraint on the given columns
|
|
317
|
+
# Add a unique constraint on the given columns.
|
|
268
318
|
#
|
|
269
319
|
# unique(:name) # UNIQUE (name)
|
|
270
320
|
#
|
|
@@ -272,27 +322,27 @@ module Sequel
|
|
|
272
322
|
# to name the constraint.
|
|
273
323
|
def unique(columns, opts = OPTS)
|
|
274
324
|
constraints << {:type => :unique, :columns => Array(columns)}.merge!(opts)
|
|
325
|
+
nil
|
|
275
326
|
end
|
|
276
327
|
|
|
277
328
|
private
|
|
278
329
|
|
|
279
330
|
# Add a composite primary key constraint
|
|
280
331
|
def composite_primary_key(columns, *args)
|
|
281
|
-
opts = args.pop ||
|
|
332
|
+
opts = args.pop || OPTS
|
|
282
333
|
constraints << {:type => :primary_key, :columns => columns}.merge!(opts)
|
|
334
|
+
nil
|
|
283
335
|
end
|
|
284
336
|
|
|
285
337
|
# Add a composite foreign key constraint
|
|
286
338
|
def composite_foreign_key(columns, opts)
|
|
287
339
|
constraints << {:type => :foreign_key, :columns => columns}.merge!(opts)
|
|
340
|
+
nil
|
|
288
341
|
end
|
|
289
342
|
|
|
290
343
|
add_type_method(*GENERIC_TYPES)
|
|
291
344
|
end
|
|
292
345
|
|
|
293
|
-
# Alias of CreateTableGenerator for backwards compatibility.
|
|
294
|
-
Generator = CreateTableGenerator
|
|
295
|
-
|
|
296
346
|
# Schema::AlterTableGenerator is an internal class that the user is not expected
|
|
297
347
|
# to instantiate directly. Instances are created by Database#alter_table.
|
|
298
348
|
# It is used to specify table alteration parameters. It takes a Database
|
|
@@ -303,49 +353,63 @@ module Sequel
|
|
|
303
353
|
# For more information on Sequel's support for schema modification, see
|
|
304
354
|
# the {"Schema Modification" guide}[link:files/doc/schema_modification_rdoc.html].
|
|
305
355
|
class AlterTableGenerator
|
|
306
|
-
# An array of
|
|
356
|
+
# An array of operations to perform
|
|
307
357
|
attr_reader :operations
|
|
308
358
|
|
|
309
|
-
# Set the Database object to which to apply the
|
|
359
|
+
# Set the Database object to which to apply the changes, and evaluate the
|
|
310
360
|
# block in the context of this object.
|
|
311
361
|
def initialize(db, &block)
|
|
312
362
|
@db = db
|
|
313
363
|
@operations = []
|
|
314
|
-
|
|
364
|
+
instance_exec(&block) if block
|
|
315
365
|
end
|
|
316
366
|
|
|
317
|
-
# Add a column with the given name, type, and opts
|
|
318
|
-
# See CreateTableGenerator#column for the available options
|
|
367
|
+
# Add a column with the given name, type, and opts.
|
|
368
|
+
# See CreateTableGenerator#column for the available options (except for +:index+, use a
|
|
369
|
+
# separate +add_index+ call to add an index for the column).
|
|
319
370
|
#
|
|
320
371
|
# add_column(:name, String) # ADD COLUMN name varchar(255)
|
|
372
|
+
#
|
|
373
|
+
# PostgreSQL specific options:
|
|
374
|
+
#
|
|
375
|
+
# :if_not_exists :: Set to true to not add the column if it already exists (PostgreSQL 9.6+)
|
|
376
|
+
#
|
|
377
|
+
# MySQL specific options:
|
|
378
|
+
#
|
|
379
|
+
# :after :: The name of an existing column that the new column should be positioned after
|
|
380
|
+
# :first :: Create this new column before all other existing columns
|
|
321
381
|
def add_column(name, type, opts = OPTS)
|
|
322
382
|
@operations << {:op => :add_column, :name => name, :type => type}.merge!(opts)
|
|
383
|
+
nil
|
|
323
384
|
end
|
|
324
385
|
|
|
325
|
-
# Add a constraint with the given name and args
|
|
386
|
+
# Add a constraint with the given name and args.
|
|
326
387
|
# See CreateTableGenerator#constraint.
|
|
327
388
|
#
|
|
328
389
|
# add_constraint(:valid_name, Sequel.like(:name, 'A%'))
|
|
329
390
|
# # ADD CONSTRAINT valid_name CHECK (name LIKE 'A%' ESCAPE '\')
|
|
330
|
-
# add_constraint({:
|
|
391
|
+
# add_constraint({name: :valid_name, deferrable: true}, Sequel.like(:name, 'A%'))
|
|
331
392
|
# # ADD CONSTRAINT valid_name CHECK (name LIKE 'A%' ESCAPE '\') DEFERRABLE INITIALLY DEFERRED
|
|
332
393
|
def add_constraint(name, *args, &block)
|
|
333
394
|
opts = name.is_a?(Hash) ? name : {:name=>name}
|
|
334
395
|
@operations << opts.merge(:op=>:add_constraint, :type=>:check, :check=>block || args)
|
|
396
|
+
nil
|
|
335
397
|
end
|
|
336
398
|
|
|
337
399
|
# Add a unique constraint to the given column(s)
|
|
338
400
|
#
|
|
339
401
|
# add_unique_constraint(:name) # ADD UNIQUE (name)
|
|
340
|
-
# add_unique_constraint(:name, :
|
|
402
|
+
# add_unique_constraint(:name, name: :unique_name) # ADD CONSTRAINT unique_name UNIQUE (name)
|
|
341
403
|
#
|
|
342
404
|
# Supports the same :deferrable option as CreateTableGenerator#column.
|
|
343
405
|
def add_unique_constraint(columns, opts = OPTS)
|
|
344
406
|
@operations << {:op => :add_constraint, :type => :unique, :columns => Array(columns)}.merge!(opts)
|
|
407
|
+
nil
|
|
345
408
|
end
|
|
346
409
|
|
|
347
|
-
# Add a foreign key with the given name and referencing the given table
|
|
348
|
-
#
|
|
410
|
+
# Add a foreign key with the given name and referencing the given table.
|
|
411
|
+
# See CreateTableGenerator#column for the available options (except for +:index+, use a
|
|
412
|
+
# separate +add_index+ call to add an index for the column).
|
|
349
413
|
#
|
|
350
414
|
# You can also pass an array of column names for creating composite foreign
|
|
351
415
|
# keys. In this case, it will assume the columns exist and will only add
|
|
@@ -371,21 +435,50 @@ module Sequel
|
|
|
371
435
|
add_column(name, Integer, {:table=>table}.merge!(opts))
|
|
372
436
|
end
|
|
373
437
|
|
|
374
|
-
# Add a full text index on the given columns
|
|
438
|
+
# Add a full text index on the given columns.
|
|
375
439
|
# See CreateTableGenerator#index for available options.
|
|
376
440
|
def add_full_text_index(columns, opts = OPTS)
|
|
377
441
|
add_index(columns, {:type=>:full_text}.merge!(opts))
|
|
378
442
|
end
|
|
379
443
|
|
|
380
|
-
# Add an index on the given columns
|
|
444
|
+
# Add an index on the given columns. See
|
|
381
445
|
# CreateTableGenerator#index for available options.
|
|
382
446
|
#
|
|
383
447
|
# add_index(:artist_id) # CREATE INDEX table_artist_id_index ON table (artist_id)
|
|
448
|
+
#
|
|
449
|
+
# Options:
|
|
450
|
+
#
|
|
451
|
+
# :name :: Give a specific name for the index. Highly recommended if you plan on
|
|
452
|
+
# dropping the index later.
|
|
453
|
+
# :where :: A filter expression, used to setup a partial index (if supported).
|
|
454
|
+
# :unique :: Create a unique index.
|
|
455
|
+
#
|
|
456
|
+
# PostgreSQL specific options:
|
|
457
|
+
#
|
|
458
|
+
# :concurrently :: Create the index concurrently, so it doesn't require an exclusive lock
|
|
459
|
+
# on the table.
|
|
460
|
+
# :index_type :: The underlying index type to use for a full_text index, gin by default).
|
|
461
|
+
# :language :: The language to use for a full text index (simple by default).
|
|
462
|
+
# :opclass :: Set an opclass to use for all columns (per-column opclasses require
|
|
463
|
+
# custom SQL).
|
|
464
|
+
# :type :: Set the index type (e.g. full_text, spatial, hash, gin, gist, btree).
|
|
465
|
+
# :if_not_exists :: Only create the index if an index of the same name doesn't already exists
|
|
466
|
+
#
|
|
467
|
+
# MySQL specific options:
|
|
468
|
+
#
|
|
469
|
+
# :type :: Set the index type, with full_text and spatial indexes handled specially.
|
|
470
|
+
#
|
|
471
|
+
# Microsoft SQL Server specific options:
|
|
472
|
+
#
|
|
473
|
+
# :include :: Includes additional columns in the index.
|
|
474
|
+
# :key_index :: Sets the KEY INDEX to the given value.
|
|
475
|
+
# :type :: clustered uses a clustered index, full_text uses a full text index.
|
|
384
476
|
def add_index(columns, opts = OPTS)
|
|
385
477
|
@operations << {:op => :add_index, :columns => Array(columns)}.merge!(opts)
|
|
478
|
+
nil
|
|
386
479
|
end
|
|
387
480
|
|
|
388
|
-
# Add a primary key
|
|
481
|
+
# Add a primary key. See CreateTableGenerator#column
|
|
389
482
|
# for the available options. Like +add_foreign_key+, if you specify
|
|
390
483
|
# the column name as an array, it just creates a constraint:
|
|
391
484
|
#
|
|
@@ -397,16 +490,16 @@ module Sequel
|
|
|
397
490
|
add_column(name, opts.delete(:type), opts)
|
|
398
491
|
end
|
|
399
492
|
|
|
400
|
-
# Add a spatial index on the given columns
|
|
493
|
+
# Add a spatial index on the given columns.
|
|
401
494
|
# See CreateTableGenerator#index for available options.
|
|
402
495
|
def add_spatial_index(columns, opts = OPTS)
|
|
403
496
|
add_index(columns, {:type=>:spatial}.merge!(opts))
|
|
404
497
|
end
|
|
405
498
|
|
|
406
|
-
# Remove a column from the
|
|
499
|
+
# Remove a column from the table.
|
|
407
500
|
#
|
|
408
501
|
# drop_column(:artist_id) # DROP COLUMN artist_id
|
|
409
|
-
# drop_column(:artist_id, :
|
|
502
|
+
# drop_column(:artist_id, cascade: true) # DROP COLUMN artist_id CASCADE
|
|
410
503
|
#
|
|
411
504
|
# Options:
|
|
412
505
|
#
|
|
@@ -418,20 +511,24 @@ module Sequel
|
|
|
418
511
|
# exist.
|
|
419
512
|
def drop_column(name, opts=OPTS)
|
|
420
513
|
@operations << {:op => :drop_column, :name => name}.merge!(opts)
|
|
514
|
+
nil
|
|
421
515
|
end
|
|
422
516
|
|
|
423
|
-
# Remove a constraint from the
|
|
517
|
+
# Remove a constraint from the table:
|
|
518
|
+
#
|
|
519
|
+
# drop_constraint(:unique_name) # DROP CONSTRAINT unique_name
|
|
520
|
+
# drop_constraint(:unique_name, cascade: true) # DROP CONSTRAINT unique_name CASCADE
|
|
521
|
+
#
|
|
522
|
+
# MySQL/SQLite specific options:
|
|
424
523
|
#
|
|
425
524
|
# :type :: Set the type of constraint to drop, either :primary_key, :foreign_key,
|
|
426
525
|
# or :unique.
|
|
427
|
-
#
|
|
428
|
-
# drop_constraint(:unique_name) # DROP CONSTRAINT unique_name
|
|
429
|
-
# drop_constraint(:unique_name, :cascade=>true) # DROP CONSTRAINT unique_name CASCADE
|
|
430
526
|
def drop_constraint(name, opts=OPTS)
|
|
431
527
|
@operations << {:op => :drop_constraint, :name => name}.merge!(opts)
|
|
528
|
+
nil
|
|
432
529
|
end
|
|
433
530
|
|
|
434
|
-
# Remove a foreign key and the associated column from the
|
|
531
|
+
# Remove a foreign key and the associated column from the table. General options:
|
|
435
532
|
#
|
|
436
533
|
# :name :: The name of the constraint to drop. If not given, uses the same name
|
|
437
534
|
# that would be used by add_foreign_key with the same columns.
|
|
@@ -442,11 +539,15 @@ module Sequel
|
|
|
442
539
|
# drop_foreign_key(:artist_id) # DROP CONSTRAINT table_artist_id_fkey, DROP COLUMN artist_id
|
|
443
540
|
# drop_foreign_key([:name]) # DROP CONSTRAINT table_name_fkey
|
|
444
541
|
def drop_foreign_key(name, opts=OPTS)
|
|
542
|
+
if !name.is_a?(Array) && opts[:foreign_key_constraint_name]
|
|
543
|
+
opts = Hash[opts]
|
|
544
|
+
opts[:name] = opts[:foreign_key_constraint_name]
|
|
545
|
+
end
|
|
445
546
|
drop_composite_foreign_key(Array(name), opts)
|
|
446
547
|
drop_column(name) unless name.is_a?(Array)
|
|
447
548
|
end
|
|
448
549
|
|
|
449
|
-
# Remove an index from the
|
|
550
|
+
# Remove an index from the table. General options:
|
|
450
551
|
#
|
|
451
552
|
# :name :: The name of the index to drop. If not given, uses the same name
|
|
452
553
|
# that would be used by add_index with the same columns.
|
|
@@ -460,29 +561,36 @@ module Sequel
|
|
|
460
561
|
#
|
|
461
562
|
# drop_index(:artist_id) # DROP INDEX table_artist_id_index
|
|
462
563
|
# drop_index([:a, :b]) # DROP INDEX table_a_b_index
|
|
463
|
-
# drop_index([:a, :b], :
|
|
564
|
+
# drop_index([:a, :b], name: :foo) # DROP INDEX foo
|
|
464
565
|
def drop_index(columns, options=OPTS)
|
|
465
566
|
@operations << {:op => :drop_index, :columns => Array(columns)}.merge!(options)
|
|
567
|
+
nil
|
|
466
568
|
end
|
|
467
569
|
|
|
468
|
-
#
|
|
570
|
+
# Rename one of the table's columns.
|
|
469
571
|
#
|
|
470
572
|
# rename_column(:name, :artist_name) # RENAME COLUMN name TO artist_name
|
|
471
573
|
def rename_column(name, new_name, opts = OPTS)
|
|
472
574
|
@operations << {:op => :rename_column, :name => name, :new_name => new_name}.merge!(opts)
|
|
575
|
+
nil
|
|
473
576
|
end
|
|
474
577
|
|
|
475
|
-
# Modify
|
|
578
|
+
# Modify the default value for one of the table's column.
|
|
476
579
|
#
|
|
477
580
|
# set_column_default(:artist_name, 'a') # ALTER COLUMN artist_name SET DEFAULT 'a'
|
|
478
581
|
#
|
|
582
|
+
# To remove an existing default value, use +nil+ as the value:
|
|
583
|
+
#
|
|
584
|
+
# set_column_default(:artist_name, nil) # ALTER COLUMN artist_name SET DEFAULT NULL
|
|
585
|
+
#
|
|
479
586
|
# On MySQL, make sure to use a symbol for the name of the column, as otherwise you
|
|
480
587
|
# can lose the type and NULL/NOT NULL setting for the column.
|
|
481
588
|
def set_column_default(name, default)
|
|
482
589
|
@operations << {:op => :set_column_default, :name => name, :default => default}
|
|
590
|
+
nil
|
|
483
591
|
end
|
|
484
592
|
|
|
485
|
-
# Modify
|
|
593
|
+
# Modify the type of one of the table's column.
|
|
486
594
|
#
|
|
487
595
|
# set_column_type(:artist_name, 'char(10)') # ALTER COLUMN artist_name TYPE char(10)
|
|
488
596
|
#
|
|
@@ -494,6 +602,7 @@ module Sequel
|
|
|
494
602
|
# can lose the default and NULL/NOT NULL setting for the column.
|
|
495
603
|
def set_column_type(name, type, opts=OPTS)
|
|
496
604
|
@operations << {:op => :set_column_type, :name => name, :type => type}.merge!(opts)
|
|
605
|
+
nil
|
|
497
606
|
end
|
|
498
607
|
|
|
499
608
|
# Set a given column as allowing NULL values.
|
|
@@ -504,6 +613,7 @@ module Sequel
|
|
|
504
613
|
# can lose the default and type for the column.
|
|
505
614
|
def set_column_allow_null(name, allow_null=true)
|
|
506
615
|
@operations << {:op => :set_column_null, :name => name, :null => allow_null}
|
|
616
|
+
nil
|
|
507
617
|
end
|
|
508
618
|
|
|
509
619
|
# Set a given column as not allowing NULL values.
|
|
@@ -521,16 +631,19 @@ module Sequel
|
|
|
521
631
|
# Add a composite primary key constraint
|
|
522
632
|
def add_composite_primary_key(columns, opts)
|
|
523
633
|
@operations << {:op => :add_constraint, :type => :primary_key, :columns => columns}.merge!(opts)
|
|
634
|
+
nil
|
|
524
635
|
end
|
|
525
636
|
|
|
526
637
|
# Add a composite foreign key constraint
|
|
527
638
|
def add_composite_foreign_key(columns, table, opts)
|
|
528
639
|
@operations << {:op => :add_constraint, :type => :foreign_key, :columns => columns, :table => table}.merge!(opts)
|
|
640
|
+
nil
|
|
529
641
|
end
|
|
530
642
|
|
|
531
643
|
# Drop a composite foreign key constraint
|
|
532
644
|
def drop_composite_foreign_key(columns, opts)
|
|
533
|
-
@operations <<
|
|
645
|
+
@operations << opts.merge(:op => :drop_constraint, :type => :foreign_key, :columns => columns)
|
|
646
|
+
nil
|
|
534
647
|
end
|
|
535
648
|
end
|
|
536
649
|
end
|