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
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The caller_logging extension includes caller information before
|
|
4
|
+
# query logging, showing which code caused the query. It skips
|
|
5
|
+
# internal Sequel code, showing the first non-Sequel caller line.
|
|
6
|
+
#
|
|
7
|
+
# DB.extension :caller_logging
|
|
8
|
+
# DB[:table].first
|
|
9
|
+
# # Logger:
|
|
10
|
+
# # (0.000041s) (source: /path/to/app/foo/t.rb:12 in `get_first`) SELECT * FROM table LIMIT 1
|
|
11
|
+
#
|
|
12
|
+
# You can further filter the caller lines by setting
|
|
13
|
+
# <tt>Database#caller_logging_ignore</tt> to a regexp of additional
|
|
14
|
+
# caller lines to ignore. This is useful if you have specific
|
|
15
|
+
# methods or internal extensions/plugins that you would also
|
|
16
|
+
# like to ignore as they obscure the code actually making the
|
|
17
|
+
# request.
|
|
18
|
+
#
|
|
19
|
+
# DB.caller_logging_ignore = %r{/path/to/app/lib/plugins}
|
|
20
|
+
#
|
|
21
|
+
# You can also format the caller before it is placed in the logger,
|
|
22
|
+
# using +caller_logging_formatter+:
|
|
23
|
+
#
|
|
24
|
+
# DB.caller_logging_formatter = lambda do |caller|
|
|
25
|
+
# "(#{caller.sub(/\A\/path\/to\/app\//, '')})"
|
|
26
|
+
# end
|
|
27
|
+
# DB[:table].first
|
|
28
|
+
# # Logger:
|
|
29
|
+
# # (0.000041s) (foo/t.rb:12 in `get_first`) SELECT * FROM table LIMIT 1
|
|
30
|
+
#
|
|
31
|
+
# Related module: Sequel::CallerLogging
|
|
32
|
+
|
|
33
|
+
require 'rbconfig'
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
module Sequel
|
|
37
|
+
module CallerLogging
|
|
38
|
+
SEQUEL_LIB_PATH = (File.expand_path('../../..', __FILE__) + '/').freeze
|
|
39
|
+
|
|
40
|
+
# A regexp of caller lines to ignore, in addition to internal Sequel and Ruby code.
|
|
41
|
+
attr_accessor :caller_logging_ignore
|
|
42
|
+
|
|
43
|
+
# A callable to format the external caller
|
|
44
|
+
attr_accessor :caller_logging_formatter
|
|
45
|
+
|
|
46
|
+
# Include caller information when logging query.
|
|
47
|
+
def log_connection_yield(sql, conn, args=nil)
|
|
48
|
+
if !@loggers.empty? && (external_caller = external_caller_for_log)
|
|
49
|
+
sql = "#{external_caller} #{sql}"
|
|
50
|
+
end
|
|
51
|
+
super
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
# The caller to log, ignoring internal Sequel and Ruby code, and user specified
|
|
57
|
+
# lines to ignore.
|
|
58
|
+
def external_caller_for_log
|
|
59
|
+
ignore = caller_logging_ignore
|
|
60
|
+
c = caller.find do |line|
|
|
61
|
+
!(line.start_with?(SEQUEL_LIB_PATH) ||
|
|
62
|
+
line.start_with?(RbConfig::CONFIG["rubylibdir"]) ||
|
|
63
|
+
(ignore && line =~ ignore))
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
if c
|
|
67
|
+
c = if formatter = caller_logging_formatter
|
|
68
|
+
formatter.call(c)
|
|
69
|
+
else
|
|
70
|
+
"(source: #{c})"
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
c
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
Database.register_extension(:caller_logging, CallerLogging)
|
|
79
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
1
3
|
# The columns_introspection extension attempts to introspect the
|
|
2
4
|
# selected columns for a dataset before issuing a query. If it
|
|
3
5
|
# thinks it can guess correctly at the columns the query will use,
|
|
@@ -14,6 +16,8 @@
|
|
|
14
16
|
# To attempt to introspect columns for all datasets on a single database:
|
|
15
17
|
#
|
|
16
18
|
# DB.extension(:columns_introspection)
|
|
19
|
+
#
|
|
20
|
+
# Related module: Sequel::ColumnsIntrospection
|
|
17
21
|
|
|
18
22
|
#
|
|
19
23
|
module Sequel
|
|
@@ -24,9 +28,11 @@ module Sequel
|
|
|
24
28
|
# Symbols, SQL::Identifiers, SQL::QualifiedIdentifiers, and
|
|
25
29
|
# SQL::AliasedExpressions.
|
|
26
30
|
def columns
|
|
27
|
-
|
|
31
|
+
if cols = _columns
|
|
32
|
+
return cols
|
|
33
|
+
end
|
|
28
34
|
if (pcs = probable_columns) && pcs.all?
|
|
29
|
-
|
|
35
|
+
self.columns = pcs
|
|
30
36
|
else
|
|
31
37
|
super
|
|
32
38
|
end
|
|
@@ -69,8 +75,7 @@ module Sequel
|
|
|
69
75
|
when SQL::Identifier
|
|
70
76
|
c.value.to_sym
|
|
71
77
|
when SQL::QualifiedIdentifier
|
|
72
|
-
|
|
73
|
-
col.is_a?(SQL::Identifier) ? col.value.to_sym : col.to_sym
|
|
78
|
+
c.column.to_sym
|
|
74
79
|
when SQL::AliasedExpression
|
|
75
80
|
a = c.alias
|
|
76
81
|
a.is_a?(SQL::Identifier) ? a.value.to_sym : a.to_sym
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The connection_expiration extension modifies a database's
|
|
4
|
+
# connection pool to validate that connections checked out
|
|
5
|
+
# from the pool are not expired, before yielding them for
|
|
6
|
+
# use. If it detects an expired connection, it removes it
|
|
7
|
+
# from the pool and tries the next available connection,
|
|
8
|
+
# creating a new connection if no available connection is
|
|
9
|
+
# unexpired. Example of use:
|
|
10
|
+
#
|
|
11
|
+
# DB.extension(:connection_expiration)
|
|
12
|
+
#
|
|
13
|
+
# The default connection timeout is 14400 seconds (4 hours).
|
|
14
|
+
# To override it:
|
|
15
|
+
#
|
|
16
|
+
# DB.pool.connection_expiration_timeout = 3600 # 1 hour
|
|
17
|
+
#
|
|
18
|
+
# Note that this extension only affects the default threaded
|
|
19
|
+
# and the sharded threaded connection pool. The single
|
|
20
|
+
# threaded and sharded single threaded connection pools are
|
|
21
|
+
# not affected. As the only reason to use the single threaded
|
|
22
|
+
# pools is for speed, and this extension makes the connection
|
|
23
|
+
# pool slower, there's not much point in modifying this
|
|
24
|
+
# extension to work with the single threaded pools. The
|
|
25
|
+
# threaded pools work fine even in single threaded code, so if
|
|
26
|
+
# you are currently using a single threaded pool and want to
|
|
27
|
+
# use this extension, switch to using a threaded pool.
|
|
28
|
+
#
|
|
29
|
+
# Related module: Sequel::ConnectionExpiration
|
|
30
|
+
|
|
31
|
+
#
|
|
32
|
+
module Sequel
|
|
33
|
+
module ConnectionExpiration
|
|
34
|
+
class Retry < Error; end
|
|
35
|
+
Sequel::Deprecation.deprecate_constant(self, :Retry)
|
|
36
|
+
|
|
37
|
+
# The number of seconds that need to pass since
|
|
38
|
+
# connection creation before expiring a connection.
|
|
39
|
+
# Defaults to 14400 seconds (4 hours).
|
|
40
|
+
attr_accessor :connection_expiration_timeout
|
|
41
|
+
|
|
42
|
+
# The maximum number of seconds that will be added as a random delay to the expiration timeout
|
|
43
|
+
# Defaults to 0 seconds (no random delay).
|
|
44
|
+
attr_accessor :connection_expiration_random_delay
|
|
45
|
+
|
|
46
|
+
# Initialize the data structures used by this extension.
|
|
47
|
+
def self.extended(pool)
|
|
48
|
+
pool.instance_exec do
|
|
49
|
+
sync do
|
|
50
|
+
@connection_expiration_timestamps ||= {}
|
|
51
|
+
@connection_expiration_timeout ||= 14400
|
|
52
|
+
@connection_expiration_random_delay ||= 0
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
# Clean up expiration timestamps during disconnect.
|
|
60
|
+
def disconnect_connection(conn)
|
|
61
|
+
sync{@connection_expiration_timestamps.delete(conn)}
|
|
62
|
+
super
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Record the time the connection was created.
|
|
66
|
+
def make_new(*)
|
|
67
|
+
conn = super
|
|
68
|
+
@connection_expiration_timestamps[conn] = [Sequel.start_timer, @connection_expiration_timeout + (rand * @connection_expiration_random_delay)].freeze
|
|
69
|
+
conn
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# When acquiring a connection, check if the connection is expired.
|
|
73
|
+
# If it is expired, disconnect the connection, and retry with a new
|
|
74
|
+
# connection.
|
|
75
|
+
def acquire(*a)
|
|
76
|
+
conn = nil
|
|
77
|
+
1.times do
|
|
78
|
+
if (conn = super) &&
|
|
79
|
+
(cet = sync{@connection_expiration_timestamps[conn]}) &&
|
|
80
|
+
Sequel.elapsed_seconds_since(cet[0]) > cet[1]
|
|
81
|
+
|
|
82
|
+
if pool_type == :sharded_threaded
|
|
83
|
+
sync{allocated(a.last).delete(Sequel.current)}
|
|
84
|
+
else
|
|
85
|
+
sync{@allocated.delete(Sequel.current)}
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
disconnect_connection(conn)
|
|
89
|
+
redo
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
conn
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
Database.register_extension(:connection_expiration){|db| db.pool.extend(ConnectionExpiration)}
|
|
98
|
+
end
|
|
99
|
+
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
1
3
|
# The connection_validator extension modifies a database's
|
|
2
4
|
# connection pool to validate that connections checked out
|
|
3
5
|
# from the pool are still valid, before yielding them for
|
|
@@ -42,11 +44,14 @@
|
|
|
42
44
|
# threaded pools work fine even in single threaded code, so if
|
|
43
45
|
# you are currently using a single threaded pool and want to
|
|
44
46
|
# use this extension, switch to using a threaded pool.
|
|
47
|
+
#
|
|
48
|
+
# Related module: Sequel::ConnectionValidator
|
|
45
49
|
|
|
46
50
|
#
|
|
47
51
|
module Sequel
|
|
48
52
|
module ConnectionValidator
|
|
49
53
|
class Retry < Error; end
|
|
54
|
+
Sequel::Deprecation.deprecate_constant(self, :Retry)
|
|
50
55
|
|
|
51
56
|
# The number of seconds that need to pass since
|
|
52
57
|
# connection checkin before attempting to validate
|
|
@@ -56,9 +61,11 @@ module Sequel
|
|
|
56
61
|
|
|
57
62
|
# Initialize the data structures used by this extension.
|
|
58
63
|
def self.extended(pool)
|
|
59
|
-
pool.
|
|
60
|
-
|
|
61
|
-
|
|
64
|
+
pool.instance_exec do
|
|
65
|
+
sync do
|
|
66
|
+
@connection_timestamps ||= {}
|
|
67
|
+
@connection_validation_timeout ||= 3600
|
|
68
|
+
end
|
|
62
69
|
end
|
|
63
70
|
|
|
64
71
|
# Make sure the valid connection SQL query is precached,
|
|
@@ -73,32 +80,38 @@ module Sequel
|
|
|
73
80
|
# Record the time the connection was checked back into the pool.
|
|
74
81
|
def checkin_connection(*)
|
|
75
82
|
conn = super
|
|
76
|
-
@connection_timestamps[conn] =
|
|
83
|
+
@connection_timestamps[conn] = Sequel.start_timer
|
|
77
84
|
conn
|
|
78
85
|
end
|
|
79
86
|
|
|
87
|
+
# Clean up timestamps during disconnect.
|
|
88
|
+
def disconnect_connection(conn)
|
|
89
|
+
sync{@connection_timestamps.delete(conn)}
|
|
90
|
+
super
|
|
91
|
+
end
|
|
92
|
+
|
|
80
93
|
# When acquiring a connection, if it has been
|
|
81
94
|
# idle for longer than the connection validation timeout,
|
|
82
95
|
# test the connection for validity. If it is not valid,
|
|
83
96
|
# disconnect the connection, and retry with a new connection.
|
|
84
97
|
def acquire(*a)
|
|
85
|
-
|
|
98
|
+
conn = nil
|
|
99
|
+
|
|
100
|
+
1.times do
|
|
86
101
|
if (conn = super) &&
|
|
87
|
-
(
|
|
88
|
-
|
|
102
|
+
(timer = sync{@connection_timestamps.delete(conn)}) &&
|
|
103
|
+
Sequel.elapsed_seconds_since(timer) > @connection_validation_timeout &&
|
|
89
104
|
!db.valid_connection?(conn)
|
|
90
105
|
|
|
91
106
|
if pool_type == :sharded_threaded
|
|
92
|
-
sync{allocated(a.last).delete(
|
|
107
|
+
sync{allocated(a.last).delete(Sequel.current)}
|
|
93
108
|
else
|
|
94
|
-
sync{@allocated.delete(
|
|
109
|
+
sync{@allocated.delete(Sequel.current)}
|
|
95
110
|
end
|
|
96
111
|
|
|
97
|
-
|
|
98
|
-
|
|
112
|
+
disconnect_connection(conn)
|
|
113
|
+
redo
|
|
99
114
|
end
|
|
100
|
-
rescue Retry
|
|
101
|
-
retry
|
|
102
115
|
end
|
|
103
116
|
|
|
104
117
|
conn
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The constant_sql_override extension allows you to change the SQL
|
|
4
|
+
# generated for Sequel constants.
|
|
5
|
+
#
|
|
6
|
+
# One possible use-case for this is to have Sequel::CURRENT_TIMESTAMP use UTC time when
|
|
7
|
+
# you have Sequel.database_timezone = :utc, but the database uses localtime when
|
|
8
|
+
# generating CURRENT_TIMESTAMP.
|
|
9
|
+
#
|
|
10
|
+
# You can set SQL overrides with Database#set_constant_sql:
|
|
11
|
+
#
|
|
12
|
+
# DB.set_constant_sql(Sequel::CURRENT_TIMESTAMP, "CURRENT_TIMESTAMP AT TIME ZONE 'UTC'")
|
|
13
|
+
#
|
|
14
|
+
# Now, using Sequel::CURRENT_TIMESTAMP will use your override instead:
|
|
15
|
+
#
|
|
16
|
+
# Album.where(released_at: Sequel::CURRENT_TIMESTAMP).sql
|
|
17
|
+
# # => SELECT "albums.*" FROM "albums" WHERE ("released_at" = CURRENT_TIMESTAMP AT TIME ZONE 'UTC')
|
|
18
|
+
#
|
|
19
|
+
# To use this extension, first load it into your Sequel::Database instance:
|
|
20
|
+
#
|
|
21
|
+
# DB.extension :constant_sql_override
|
|
22
|
+
#
|
|
23
|
+
# Related module: Sequel::ConstantSqlOverride
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
module Sequel
|
|
27
|
+
module ConstantSqlOverride
|
|
28
|
+
module DatabaseMethods
|
|
29
|
+
# Create the initial empty hash of constant sql overrides.
|
|
30
|
+
def self.extended(db)
|
|
31
|
+
db.instance_exec do
|
|
32
|
+
@constant_sqls ||= {}
|
|
33
|
+
extend_datasets(DatasetMethods)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Hash mapping constant symbols to SQL. For internal use only.
|
|
38
|
+
attr_reader :constant_sqls # :nodoc:
|
|
39
|
+
|
|
40
|
+
# Set the SQL to use for the given Sequel::SQL::Constant
|
|
41
|
+
def set_constant_sql(constant, override)
|
|
42
|
+
@constant_sqls[constant.constant] = override
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Freeze the constant_sqls hash to prevent adding new overrides.
|
|
46
|
+
def freeze
|
|
47
|
+
@constant_sqls.freeze
|
|
48
|
+
super
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
module DatasetMethods
|
|
53
|
+
# Use overridden constant SQL
|
|
54
|
+
def constant_sql_append(sql, constant)
|
|
55
|
+
if constant_sql = db.constant_sqls[constant]
|
|
56
|
+
sql << constant_sql
|
|
57
|
+
else
|
|
58
|
+
super
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
Database.register_extension(:constant_sql_override, ConstantSqlOverride::DatabaseMethods)
|
|
65
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
1
3
|
# The constraint_validations extension is designed to easily create database
|
|
2
4
|
# constraints inside create_table and alter_table blocks. It also adds
|
|
3
5
|
# relevant metadata about the constraints to a separate table, which the
|
|
@@ -20,7 +22,7 @@
|
|
|
20
22
|
# generally want to create it first, before creating any other application
|
|
21
23
|
# tables.
|
|
22
24
|
#
|
|
23
|
-
# Because migrations
|
|
25
|
+
# Because migrations instance_exec the up and down blocks on a database,
|
|
24
26
|
# using this extension in a migration can be done via:
|
|
25
27
|
#
|
|
26
28
|
# Sequel.migration do
|
|
@@ -41,7 +43,7 @@
|
|
|
41
43
|
# similar to the validation_helpers model plugin API. However,
|
|
42
44
|
# instead of having separate validates_* methods, it just adds a validate
|
|
43
45
|
# method that accepts a block to the schema generators. Like the
|
|
44
|
-
# create_table and alter_table blocks, this block is
|
|
46
|
+
# create_table and alter_table blocks, this block is instance_execed and
|
|
45
47
|
# offers its own DSL. Example:
|
|
46
48
|
#
|
|
47
49
|
# DB.create_table(:table) do
|
|
@@ -54,8 +56,8 @@
|
|
|
54
56
|
# end
|
|
55
57
|
# end
|
|
56
58
|
#
|
|
57
|
-
#
|
|
58
|
-
# already use
|
|
59
|
+
# instance_exec is used in this case because create_table and alter_table
|
|
60
|
+
# already use instance_exec, so losing access to the surrounding receiver
|
|
59
61
|
# is not an issue.
|
|
60
62
|
#
|
|
61
63
|
# Here's a breakdown of the constraints created for each constraint validation
|
|
@@ -76,6 +78,10 @@
|
|
|
76
78
|
# includes [1, 2] :: CHECK column IN (1, 2)
|
|
77
79
|
# includes 3..5 :: CHECK column >= 3 AND column <= 5
|
|
78
80
|
# includes 3...5 :: CHECK column >= 3 AND column < 5
|
|
81
|
+
# operator :>, 1 :: CHECK column > 1
|
|
82
|
+
# operator :>=, 2 :: CHECK column >= 2
|
|
83
|
+
# operator :<, "M" :: CHECK column < 'M'
|
|
84
|
+
# operator :<=, 'K' :: CHECK column <= 'K'
|
|
79
85
|
# unique :: UNIQUE (column)
|
|
80
86
|
#
|
|
81
87
|
# There are some additional API differences:
|
|
@@ -92,6 +98,8 @@
|
|
|
92
98
|
# patters are very simple, so many regexp patterns cannot be expressed by
|
|
93
99
|
# them, but only a couple databases (PostgreSQL and MySQL) support regexp
|
|
94
100
|
# patterns.
|
|
101
|
+
# * The operator validation only supports >, >=, <, and <= operators, and the
|
|
102
|
+
# argument must be a string or an integer.
|
|
95
103
|
# * When using the unique validation, column names cannot have embedded commas.
|
|
96
104
|
# For similar reasons, when using an includes validation with an array of
|
|
97
105
|
# strings, none of the strings in the array can have embedded commas.
|
|
@@ -121,12 +129,21 @@
|
|
|
121
129
|
# <tt>drop_constraint_validations_for(:table=>'table')</tt>, and then
|
|
122
130
|
# readd all constraints you want to use inside the alter table block,
|
|
123
131
|
# making no other changes inside the alter_table block.
|
|
132
|
+
#
|
|
133
|
+
# Dropping a table will automatically delete all constraint validations for
|
|
134
|
+
# that table. However, altering a table (e.g. to drop a column) will not
|
|
135
|
+
# currently make any changes to the constraint validations metadata.
|
|
136
|
+
#
|
|
137
|
+
# Related module: Sequel::ConstraintValidations
|
|
124
138
|
|
|
125
139
|
#
|
|
126
140
|
module Sequel
|
|
127
141
|
module ConstraintValidations
|
|
128
142
|
# The default table name used for the validation metadata.
|
|
129
143
|
DEFAULT_CONSTRAINT_VALIDATIONS_TABLE = :sequel_constraint_validations
|
|
144
|
+
OPERATORS = {:< => :lt, :<= => :lte, :> => :gt, :>= => :gte}.freeze
|
|
145
|
+
REVERSE_OPERATOR_MAP = {:str_lt => :<, :str_lte => :<=, :str_gt => :>, :str_gte => :>=,
|
|
146
|
+
:int_lt => :<, :int_lte => :<=, :int_gt => :>, :int_gte => :>=}.freeze
|
|
130
147
|
|
|
131
148
|
# Set the default validation metadata table name if it has not already
|
|
132
149
|
# been set.
|
|
@@ -160,15 +177,32 @@ module Sequel
|
|
|
160
177
|
END
|
|
161
178
|
end
|
|
162
179
|
|
|
180
|
+
# Create operator validation. The op should be either +:>+, +:>=+, +:<+, or +:<=+, and
|
|
181
|
+
# the arg should be either a string or an integer.
|
|
182
|
+
def operator(op, arg, columns, opts=OPTS)
|
|
183
|
+
raise Error, "invalid operator (#{op}) used when creating operator validation" unless suffix = OPERATORS[op]
|
|
184
|
+
|
|
185
|
+
prefix = case arg
|
|
186
|
+
when String
|
|
187
|
+
"str"
|
|
188
|
+
when Integer
|
|
189
|
+
"int"
|
|
190
|
+
else
|
|
191
|
+
raise Error, "invalid argument (#{arg.inspect}) used when creating operator validation"
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
@generator.validation({:type=>:"#{prefix}_#{suffix}", :columns=>Array(columns), :arg=>arg}.merge!(opts))
|
|
195
|
+
end
|
|
196
|
+
|
|
163
197
|
# Given the name of a constraint, drop that constraint from the database,
|
|
164
198
|
# and remove the related validation metadata.
|
|
165
199
|
def drop(constraint)
|
|
166
200
|
@generator.validation({:type=>:drop, :name=>constraint})
|
|
167
201
|
end
|
|
168
202
|
|
|
169
|
-
# Alias of
|
|
203
|
+
# Alias of instance_exec for a nicer API.
|
|
170
204
|
def process(&block)
|
|
171
|
-
|
|
205
|
+
instance_exec(&block)
|
|
172
206
|
end
|
|
173
207
|
end
|
|
174
208
|
|
|
@@ -230,10 +264,20 @@ module Sequel
|
|
|
230
264
|
super do
|
|
231
265
|
extend CreateTableGeneratorMethods
|
|
232
266
|
@validations = []
|
|
233
|
-
|
|
267
|
+
instance_exec(&block) if block
|
|
234
268
|
end
|
|
235
269
|
end
|
|
236
270
|
|
|
271
|
+
# Drop all constraint validations for a table if dropping the table.
|
|
272
|
+
def drop_table(*names)
|
|
273
|
+
names.each do |name|
|
|
274
|
+
if !name.is_a?(Hash) && table_exists?(constraint_validations_table)
|
|
275
|
+
drop_constraint_validations_for(:table=>name)
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
super
|
|
279
|
+
end
|
|
280
|
+
|
|
237
281
|
# Drop the constraint validations table.
|
|
238
282
|
def drop_constraint_validations_table
|
|
239
283
|
drop_table(constraint_validations_table)
|
|
@@ -278,7 +322,7 @@ module Sequel
|
|
|
278
322
|
super do
|
|
279
323
|
extend AlterTableGeneratorMethods
|
|
280
324
|
@validations = []
|
|
281
|
-
|
|
325
|
+
instance_exec(&block) if block
|
|
282
326
|
end
|
|
283
327
|
end
|
|
284
328
|
|
|
@@ -313,9 +357,7 @@ module Sequel
|
|
|
313
357
|
# This allows the code to handle schema qualified tables,
|
|
314
358
|
# without quoting all table names.
|
|
315
359
|
def constraint_validations_literal_table(table)
|
|
316
|
-
|
|
317
|
-
ds.quote_identifiers = false
|
|
318
|
-
ds.literal(table)
|
|
360
|
+
dataset.with_quote_identifiers(false).literal(table)
|
|
319
361
|
end
|
|
320
362
|
|
|
321
363
|
# Before creating the table, add constraints for all of the
|
|
@@ -327,6 +369,18 @@ module Sequel
|
|
|
327
369
|
super
|
|
328
370
|
end
|
|
329
371
|
|
|
372
|
+
def constraint_validation_expression(cols, allow_nil)
|
|
373
|
+
exprs = cols.map do |c|
|
|
374
|
+
expr = yield c
|
|
375
|
+
if allow_nil
|
|
376
|
+
Sequel.|({c=>nil}, expr)
|
|
377
|
+
else
|
|
378
|
+
Sequel.&(Sequel.~(c=>nil), expr)
|
|
379
|
+
end
|
|
380
|
+
end
|
|
381
|
+
Sequel.&(*exprs)
|
|
382
|
+
end
|
|
383
|
+
|
|
330
384
|
# For the given table, generator, and validations, add constraints
|
|
331
385
|
# to the generator for each of the validations, as well as adding
|
|
332
386
|
# validation metadata to the constraint validations table.
|
|
@@ -337,26 +391,44 @@ module Sequel
|
|
|
337
391
|
|
|
338
392
|
case validation_type
|
|
339
393
|
when :presence
|
|
340
|
-
|
|
341
|
-
|
|
394
|
+
strings, non_strings = columns.partition{|c| generator_string_column?(generator, table, c)}
|
|
395
|
+
if !non_strings.empty? && !allow_nil
|
|
396
|
+
non_strings_expr = Sequel.&(*non_strings.map{|c| Sequel.~(c=>nil)})
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
unless strings.empty?
|
|
400
|
+
strings_expr = constraint_validation_expression(strings, allow_nil){|c| Sequel.~(Sequel.trim(c) => blank_string_value)}
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
expr = if non_strings_expr && strings_expr
|
|
404
|
+
Sequel.&(strings_expr, non_strings_expr)
|
|
405
|
+
else
|
|
406
|
+
strings_expr || non_strings_expr
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
if expr
|
|
410
|
+
generator.constraint(constraint, expr)
|
|
411
|
+
end
|
|
342
412
|
when :exact_length
|
|
343
|
-
|
|
413
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| {Sequel.char_length(c) => arg}})
|
|
344
414
|
when :min_length
|
|
345
|
-
|
|
415
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| Sequel.char_length(c) >= arg})
|
|
346
416
|
when :max_length
|
|
347
|
-
|
|
417
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| Sequel.char_length(c) <= arg})
|
|
418
|
+
when *REVERSE_OPERATOR_MAP.keys
|
|
419
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| Sequel.identifier(c).public_send(REVERSE_OPERATOR_MAP[validation_type], arg)})
|
|
348
420
|
when :length_range
|
|
349
421
|
op = arg.exclude_end? ? :< : :<=
|
|
350
|
-
|
|
422
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| (Sequel.char_length(c) >= arg.begin) & Sequel.char_length(c).public_send(op, arg.end)})
|
|
351
423
|
arg = "#{arg.begin}..#{'.' if arg.exclude_end?}#{arg.end}"
|
|
352
424
|
when :format
|
|
353
|
-
|
|
425
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| {c => arg}})
|
|
354
426
|
if arg.casefold?
|
|
355
427
|
validation_type = :iformat
|
|
356
428
|
end
|
|
357
429
|
arg = arg.source
|
|
358
430
|
when :includes
|
|
359
|
-
|
|
431
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| {c => arg}})
|
|
360
432
|
if arg.is_a?(Range)
|
|
361
433
|
if arg.begin.is_a?(Integer) && arg.end.is_a?(Integer)
|
|
362
434
|
validation_type = :includes_int_range
|
|
@@ -377,7 +449,7 @@ module Sequel
|
|
|
377
449
|
raise Error, "validates includes only supports arrays and ranges currently, cannot handle: #{arg.inspect}"
|
|
378
450
|
end
|
|
379
451
|
when :like, :ilike
|
|
380
|
-
|
|
452
|
+
generator.constraint(constraint, constraint_validation_expression(columns, allow_nil){|c| Sequel.public_send(validation_type, c, arg)})
|
|
381
453
|
when :unique
|
|
382
454
|
generator.unique(columns, :name=>constraint)
|
|
383
455
|
columns = [columns.join(',')]
|
|
@@ -401,30 +473,13 @@ module Sequel
|
|
|
401
473
|
end
|
|
402
474
|
end
|
|
403
475
|
|
|
404
|
-
ds = from(
|
|
476
|
+
ds = from(constraint_validations_table)
|
|
405
477
|
unless drop_rows.empty?
|
|
406
478
|
ds.where([:table, :constraint_name]=>drop_rows).delete
|
|
407
479
|
end
|
|
408
480
|
ds.multi_insert(rows.flatten)
|
|
409
481
|
end
|
|
410
482
|
|
|
411
|
-
# Add the constraint to the generator, including a NOT NULL constraint
|
|
412
|
-
# for all columns unless the :allow_nil option is given.
|
|
413
|
-
def generator_add_constraint_from_validation(generator, val, cons)
|
|
414
|
-
if val[:allow_nil]
|
|
415
|
-
nil_cons = Sequel.expr(val[:columns].map{|c| [c, nil]})
|
|
416
|
-
cons = Sequel.|(nil_cons, cons) if cons
|
|
417
|
-
else
|
|
418
|
-
nil_cons = Sequel.negate(val[:columns].map{|c| [c, nil]})
|
|
419
|
-
cons = cons ? Sequel.&(nil_cons, cons) : nil_cons
|
|
420
|
-
end
|
|
421
|
-
|
|
422
|
-
if cons
|
|
423
|
-
generator.constraint(val[:name], cons)
|
|
424
|
-
end
|
|
425
|
-
end
|
|
426
|
-
|
|
427
|
-
|
|
428
483
|
# Introspect the generator to determine if column
|
|
429
484
|
# created is a string or not.
|
|
430
485
|
def generator_string_column?(generator, table, c)
|