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
|
# The mssql_emulate_lateral_with_apply extension converts
|
|
2
4
|
# queries that use LATERAL into queries that use CROSS/OUTER
|
|
3
5
|
# APPLY, allowing code that works on databases that support
|
|
@@ -21,6 +23,8 @@
|
|
|
21
23
|
# Or you can load it into all of a database's datasets:
|
|
22
24
|
#
|
|
23
25
|
# DB.extension(:mssql_emulate_lateral_with_apply)
|
|
26
|
+
#
|
|
27
|
+
# Related module: Sequel::MSSQL::EmulateLateralWithApply
|
|
24
28
|
|
|
25
29
|
#
|
|
26
30
|
module Sequel
|
|
@@ -1,17 +1,22 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
1
3
|
# Allows the use of named timezones via TZInfo (requires tzinfo).
|
|
2
4
|
# Forces the use of DateTime as Sequel's datetime_class, since
|
|
3
|
-
#
|
|
4
|
-
# and UTC.
|
|
5
|
+
# historically, Ruby's Time class doesn't support timezones other
|
|
6
|
+
# than local and UTC. To continue using Ruby's Time class when using
|
|
7
|
+
# the named_timezones extension:
|
|
8
|
+
#
|
|
9
|
+
# # Load the extension
|
|
10
|
+
# Sequel.extension :named_timezones
|
|
11
|
+
#
|
|
12
|
+
# # Set Sequel.datetime_class back to Time
|
|
13
|
+
# Sequel.datetime_class = Time
|
|
5
14
|
#
|
|
6
15
|
# This allows you to either pass strings or TZInfo::Timezone
|
|
7
16
|
# instance to Sequel.database_timezone=, application_timezone=, and
|
|
8
17
|
# typecast_timezone=. If a string is passed, it is converted to a
|
|
9
18
|
# TZInfo::Timezone using TZInfo::Timezone.get.
|
|
10
19
|
#
|
|
11
|
-
# To load the extension:
|
|
12
|
-
#
|
|
13
|
-
# Sequel.extension :named_timezones
|
|
14
|
-
#
|
|
15
20
|
# Let's say you have the database server in New York and the
|
|
16
21
|
# application server in Los Angeles. For historical reasons, data
|
|
17
22
|
# is stored in local New York time, but the application server only
|
|
@@ -35,7 +40,10 @@
|
|
|
35
40
|
# Note that typecasting from the database timezone to the application
|
|
36
41
|
# timezone when fetching rows is dependent on the database adapter,
|
|
37
42
|
# and only works on adapters where Sequel itself does the conversion.
|
|
38
|
-
# It should work
|
|
43
|
+
# It should work with the mysql, postgres, sqlite, ibmdb, and jdbc
|
|
44
|
+
# adapters.
|
|
45
|
+
#
|
|
46
|
+
# Related module: Sequel::NamedTimezones
|
|
39
47
|
|
|
40
48
|
require 'tzinfo'
|
|
41
49
|
|
|
@@ -59,24 +67,81 @@ module Sequel
|
|
|
59
67
|
|
|
60
68
|
private
|
|
61
69
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
70
|
+
if RUBY_VERSION >= '2.6'
|
|
71
|
+
# Convert the given input Time (which must be in UTC) to the given input timezone,
|
|
72
|
+
# which should be a TZInfo::Timezone instance.
|
|
73
|
+
def convert_input_time_other(v, input_timezone)
|
|
74
|
+
Time.new(v.year, v.mon, v.day, v.hour, v.min, (v.sec + Rational(v.nsec, 1000000000)), input_timezone)
|
|
75
|
+
rescue TZInfo::AmbiguousTime
|
|
76
|
+
raise unless disamb = tzinfo_disambiguator_for(v)
|
|
77
|
+
period = input_timezone.period_for_local(v, &disamb)
|
|
78
|
+
offset = period.utc_total_offset
|
|
79
|
+
Time.at(v.to_i - offset, :in => input_timezone)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Convert the given input Time to the given output timezone,
|
|
83
|
+
# which should be a TZInfo::Timezone instance.
|
|
84
|
+
def convert_output_time_other(v, output_timezone)
|
|
85
|
+
Time.at(v.to_i, :in => output_timezone)
|
|
86
|
+
end
|
|
87
|
+
else
|
|
88
|
+
# :nodoc:
|
|
89
|
+
# :nocov:
|
|
90
|
+
def convert_input_time_other(v, input_timezone)
|
|
91
|
+
local_offset = input_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset
|
|
92
|
+
Time.new(1970, 1, 1, 0, 0, 0, local_offset) + v.to_i
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
if defined?(TZInfo::VERSION) && TZInfo::VERSION > '2'
|
|
96
|
+
def convert_output_time_other(v, output_timezone)
|
|
97
|
+
v = output_timezone.utc_to_local(v.getutc)
|
|
98
|
+
local_offset = output_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset
|
|
99
|
+
Time.new(1970, 1, 1, 0, 0, 0, local_offset) + v.to_i + local_offset
|
|
100
|
+
end
|
|
101
|
+
else
|
|
102
|
+
def convert_output_time_other(v, output_timezone)
|
|
103
|
+
v = output_timezone.utc_to_local(v.getutc)
|
|
104
|
+
local_offset = output_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset
|
|
105
|
+
Time.new(1970, 1, 1, 0, 0, 0, local_offset) + v.to_i
|
|
106
|
+
end
|
|
107
|
+
end
|
|
69
108
|
end
|
|
70
109
|
|
|
71
|
-
#
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
110
|
+
# Handle both TZInfo 1 and TZInfo 2
|
|
111
|
+
if defined?(TZInfo::VERSION) && TZInfo::VERSION > '2'
|
|
112
|
+
def convert_input_datetime_other(v, input_timezone)
|
|
113
|
+
local_offset = Rational(input_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset, 86400)
|
|
114
|
+
(v - local_offset).new_offset(local_offset)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def convert_output_datetime_other(v, output_timezone)
|
|
118
|
+
v = output_timezone.utc_to_local(v.new_offset(0))
|
|
119
|
+
|
|
120
|
+
# Force DateTime output instead of TZInfo::DateTimeWithOffset
|
|
121
|
+
DateTime.jd(v.jd, v.hour, v.minute, v.second + v.sec_fraction, v.offset, v.start)
|
|
122
|
+
end
|
|
123
|
+
# :nodoc:
|
|
124
|
+
# :nocov:
|
|
125
|
+
else
|
|
126
|
+
# Assume the given DateTime has a correct time but a wrong timezone. It is
|
|
127
|
+
# currently in UTC timezone, but it should be converted to the input_timezone.
|
|
128
|
+
# Keep the time the same but convert the timezone to the input_timezone.
|
|
129
|
+
# Expects the input_timezone to be a TZInfo::Timezone instance.
|
|
130
|
+
def convert_input_datetime_other(v, input_timezone)
|
|
131
|
+
local_offset = input_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset_rational
|
|
132
|
+
(v - local_offset).new_offset(local_offset)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Convert the given DateTime to use the given output_timezone.
|
|
136
|
+
# Expects the output_timezone to be a TZInfo::Timezone instance.
|
|
137
|
+
def convert_output_datetime_other(v, output_timezone)
|
|
138
|
+
# TZInfo 1 converts times, but expects the given DateTime to have an offset
|
|
139
|
+
# of 0 and always leaves the timezone offset as 0
|
|
140
|
+
v = output_timezone.utc_to_local(v.new_offset(0))
|
|
141
|
+
local_offset = output_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset_rational
|
|
142
|
+
# Convert timezone offset from UTC to the offset for the output_timezone
|
|
143
|
+
(v - local_offset).new_offset(local_offset)
|
|
144
|
+
end
|
|
80
145
|
end
|
|
81
146
|
|
|
82
147
|
# Returns TZInfo::Timezone instance if given a String.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
1
3
|
# The null_dataset extension adds the Dataset#nullify method, which
|
|
2
4
|
# returns a cloned dataset that will never issue a query to the
|
|
3
5
|
# database. It implements the null object pattern for datasets.
|
|
@@ -11,7 +13,7 @@
|
|
|
11
13
|
#
|
|
12
14
|
# Usage:
|
|
13
15
|
#
|
|
14
|
-
# ds = DB[:items].nullify.where(:
|
|
16
|
+
# ds = DB[:items].nullify.where(a: :b).select(:c)
|
|
15
17
|
# ds.sql # => "SELECT c FROM items WHERE (a = b)"
|
|
16
18
|
# ds.all # => [] # no query sent to the database
|
|
17
19
|
#
|
|
@@ -30,6 +32,8 @@
|
|
|
30
32
|
# To add the nullify method to all datasets on a single database:
|
|
31
33
|
#
|
|
32
34
|
# DB.extension(:null_dataset)
|
|
35
|
+
#
|
|
36
|
+
# Related modules: Sequel::Dataset::Nullifiable, Sequel::Dataset::NullDataset
|
|
33
37
|
|
|
34
38
|
#
|
|
35
39
|
module Sequel
|
|
@@ -37,12 +41,9 @@ module Sequel
|
|
|
37
41
|
module Nullifiable
|
|
38
42
|
# Return a cloned nullified dataset.
|
|
39
43
|
def nullify
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
# Nullify the current dataset
|
|
44
|
-
def nullify!
|
|
45
|
-
extend NullDataset
|
|
44
|
+
cached_dataset(:_nullify_ds) do
|
|
45
|
+
with_extend(NullDataset)
|
|
46
|
+
end
|
|
46
47
|
end
|
|
47
48
|
end
|
|
48
49
|
|
|
@@ -50,7 +51,10 @@ module Sequel
|
|
|
50
51
|
# Create a new dataset from the dataset (which won't
|
|
51
52
|
# be nulled) to get the columns if they aren't already cached.
|
|
52
53
|
def columns
|
|
53
|
-
|
|
54
|
+
if cols = _columns
|
|
55
|
+
return cols
|
|
56
|
+
end
|
|
57
|
+
self.columns = db.dataset.clone(@opts).columns
|
|
54
58
|
end
|
|
55
59
|
|
|
56
60
|
# Return 0 without sending a database query.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
1
3
|
# The pagination extension adds the Sequel::Dataset#paginate and #each_page methods,
|
|
2
4
|
# which return paginated (limited and offset) datasets with the following methods
|
|
3
5
|
# added that make creating a paginated display easier:
|
|
@@ -25,6 +27,8 @@
|
|
|
25
27
|
# is probably the desired behavior if you are using this extension:
|
|
26
28
|
#
|
|
27
29
|
# DB.extension(:pagination)
|
|
30
|
+
#
|
|
31
|
+
# Related modules: Sequel::DatasetPagination, Sequel::Dataset::Pagination
|
|
28
32
|
|
|
29
33
|
#
|
|
30
34
|
module Sequel
|
|
@@ -35,9 +39,14 @@ module Sequel
|
|
|
35
39
|
# number of records for this dataset.
|
|
36
40
|
def paginate(page_no, page_size, record_count=nil)
|
|
37
41
|
raise(Error, "You cannot paginate a dataset that already has a limit") if @opts[:limit]
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
42
|
+
|
|
43
|
+
record_count ||= count
|
|
44
|
+
page_count = (record_count / page_size.to_f).ceil
|
|
45
|
+
page_count = 1 if page_count == 0
|
|
46
|
+
|
|
47
|
+
limit(page_size, (page_no - 1) * page_size).
|
|
48
|
+
with_extend(Dataset::Pagination).
|
|
49
|
+
clone(:page_size=>page_size, :current_page=>page_no, :pagination_record_count=>record_count, :page_count=>page_count)
|
|
41
50
|
end
|
|
42
51
|
|
|
43
52
|
# Yields a paginated dataset for each page and returns the receiver. Does
|
|
@@ -55,51 +64,59 @@ module Sequel
|
|
|
55
64
|
|
|
56
65
|
class Dataset
|
|
57
66
|
# Holds methods that only relate to paginated datasets. Paginated dataset
|
|
58
|
-
# have pages starting at 1 (page 1 is offset 0, page
|
|
67
|
+
# have pages starting at 1 (page 1 is offset 0, page 2 is offset 1 * page_size).
|
|
59
68
|
module Pagination
|
|
60
69
|
# The number of records per page (the final page may have fewer than
|
|
61
70
|
# this number of records).
|
|
62
|
-
|
|
71
|
+
def page_size
|
|
72
|
+
@opts[:page_size]
|
|
73
|
+
end
|
|
63
74
|
|
|
64
75
|
# The number of pages in the dataset before pagination, of which
|
|
65
76
|
# this paginated dataset is one. Empty datasets are considered
|
|
66
77
|
# to have a single page.
|
|
67
|
-
|
|
78
|
+
def page_count
|
|
79
|
+
@opts[:page_count]
|
|
80
|
+
end
|
|
68
81
|
|
|
69
82
|
# The current page of the dataset, starting at 1 and not 0.
|
|
70
|
-
|
|
83
|
+
def current_page
|
|
84
|
+
@opts[:current_page]
|
|
85
|
+
end
|
|
71
86
|
|
|
72
87
|
# The total number of records in the dataset before pagination.
|
|
73
|
-
|
|
88
|
+
def pagination_record_count
|
|
89
|
+
@opts[:pagination_record_count]
|
|
90
|
+
end
|
|
74
91
|
|
|
75
92
|
# Returns the record range for the current page
|
|
76
93
|
def current_page_record_range
|
|
77
|
-
return (0..0) if
|
|
94
|
+
return (0..0) if current_page > page_count
|
|
78
95
|
|
|
79
|
-
a = 1 + (
|
|
80
|
-
b = a +
|
|
81
|
-
b =
|
|
96
|
+
a = 1 + (current_page - 1) * page_size
|
|
97
|
+
b = a + page_size - 1
|
|
98
|
+
b = pagination_record_count if b > pagination_record_count
|
|
82
99
|
a..b
|
|
83
100
|
end
|
|
84
101
|
|
|
85
102
|
# Returns the number of records in the current page
|
|
86
103
|
def current_page_record_count
|
|
87
|
-
return 0 if
|
|
104
|
+
return 0 if current_page > page_count
|
|
88
105
|
|
|
89
|
-
a = 1 + (
|
|
90
|
-
b = a +
|
|
91
|
-
b =
|
|
106
|
+
a = 1 + (current_page - 1) * page_size
|
|
107
|
+
b = a + page_size - 1
|
|
108
|
+
b = pagination_record_count if b > pagination_record_count
|
|
92
109
|
b - a + 1
|
|
93
110
|
end
|
|
94
111
|
|
|
95
112
|
# Returns true if the current page is the first page
|
|
96
113
|
def first_page?
|
|
97
|
-
|
|
114
|
+
current_page == 1
|
|
98
115
|
end
|
|
99
116
|
|
|
100
117
|
# Returns true if the current page is the last page
|
|
101
118
|
def last_page?
|
|
102
|
-
|
|
119
|
+
current_page == page_count
|
|
103
120
|
end
|
|
104
121
|
|
|
105
122
|
# Returns the next page number or nil if the current page is the last page
|
|
@@ -116,16 +133,6 @@ module Sequel
|
|
|
116
133
|
def prev_page
|
|
117
134
|
current_page > 1 ? (current_page - 1) : nil
|
|
118
135
|
end
|
|
119
|
-
|
|
120
|
-
# Sets the pagination info for this paginated dataset, and returns self.
|
|
121
|
-
def set_pagination_info(page_no, page_size, record_count)
|
|
122
|
-
@current_page = page_no
|
|
123
|
-
@page_size = page_size
|
|
124
|
-
@pagination_record_count = record_count
|
|
125
|
-
@page_count = (record_count / page_size.to_f).ceil
|
|
126
|
-
@page_count = 1 if @page_count == 0
|
|
127
|
-
self
|
|
128
|
-
end
|
|
129
136
|
end
|
|
130
137
|
end
|
|
131
138
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
1
3
|
# The pg_array extension adds support for Sequel to handle
|
|
2
4
|
# PostgreSQL's array types.
|
|
3
5
|
#
|
|
@@ -30,7 +32,7 @@
|
|
|
30
32
|
#
|
|
31
33
|
# So if you want to insert an array into an integer[] database column:
|
|
32
34
|
#
|
|
33
|
-
# DB[:table].insert(:
|
|
35
|
+
# DB[:table].insert(column: Sequel.pg_array([1, 2, 3]))
|
|
34
36
|
#
|
|
35
37
|
# To use this extension, first load it into your Sequel::Database instance:
|
|
36
38
|
#
|
|
@@ -39,20 +41,14 @@
|
|
|
39
41
|
# See the {schema modification guide}[rdoc-ref:doc/schema_modification.rdoc]
|
|
40
42
|
# for details on using postgres array columns in CREATE/ALTER TABLE statements.
|
|
41
43
|
#
|
|
42
|
-
# If you are not using the native postgres or jdbc/postgresql adapter and are using array
|
|
43
|
-
# types as model column values you probably should use the the pg_typecast_on_load plugin
|
|
44
|
-
# if the column values are returned as a string.
|
|
45
|
-
#
|
|
46
44
|
# This extension by default includes handlers for array types for
|
|
47
45
|
# all scalar types that the native postgres adapter handles. It
|
|
48
46
|
# also makes it easy to add support for other array types. In
|
|
49
47
|
# general, you just need to make sure that the scalar type is
|
|
50
|
-
# handled and has the appropriate converter installed
|
|
51
|
-
# Sequel::Postgres::PG_TYPES or the Database instance's
|
|
52
|
-
# conversion_procs usingthe appropriate type OID. For user defined
|
|
48
|
+
# handled and has the appropriate converter installed. For user defined
|
|
53
49
|
# types, you can do this via:
|
|
54
50
|
#
|
|
55
|
-
# DB.
|
|
51
|
+
# DB.add_conversion_proc(scalar_type_oid){|string| }
|
|
56
52
|
#
|
|
57
53
|
# Then you can call
|
|
58
54
|
# Sequel::Postgres::PGArray::DatabaseMethods#register_array_type
|
|
@@ -62,27 +58,19 @@
|
|
|
62
58
|
#
|
|
63
59
|
# DB.register_array_type('foo')
|
|
64
60
|
#
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
#
|
|
68
|
-
#
|
|
69
|
-
# Sequel::Postgres::PG_TYPES[1234] = lambda{|string| }
|
|
70
|
-
# Sequel::Postgres::PGArray.register('foo', :oid=>4321, :scalar_oid=>1234)
|
|
71
|
-
#
|
|
72
|
-
# Both Sequel::Postgres::PGArray::DatabaseMethods#register_array_type
|
|
73
|
-
# and Sequel::Postgres::PGArray.register support many options to
|
|
74
|
-
# customize the array type handling. See the Sequel::Postgres::PGArray.register
|
|
75
|
-
# method documentation.
|
|
61
|
+
# While this extension can parse PostgreSQL arrays with explicit bounds, it
|
|
62
|
+
# currently ignores explicit bounds, so such values do not round
|
|
63
|
+
# trip.
|
|
76
64
|
#
|
|
77
65
|
# If you want an easy way to call PostgreSQL array functions and
|
|
78
66
|
# operators, look into the pg_array_ops extension.
|
|
79
67
|
#
|
|
80
|
-
# This extension requires the
|
|
68
|
+
# This extension requires the delegate library, and the strscan library
|
|
69
|
+
# sequel_pg has not been loaded.
|
|
70
|
+
#
|
|
71
|
+
# Related module: Sequel::Postgres::PGArray
|
|
81
72
|
|
|
82
73
|
require 'delegate'
|
|
83
|
-
require 'strscan'
|
|
84
|
-
require 'json'
|
|
85
|
-
Sequel.require 'adapters/utils/pg_types'
|
|
86
74
|
|
|
87
75
|
module Sequel
|
|
88
76
|
module Postgres
|
|
@@ -90,126 +78,64 @@ module Sequel
|
|
|
90
78
|
class PGArray < DelegateClass(Array)
|
|
91
79
|
include Sequel::SQL::AliasMethods
|
|
92
80
|
|
|
93
|
-
ARRAY = "ARRAY".freeze
|
|
94
|
-
DOUBLE_COLON = '::'.freeze
|
|
95
|
-
EMPTY_ARRAY = "'{}'".freeze
|
|
96
|
-
EMPTY_BRACKET = '[]'.freeze
|
|
97
|
-
OPEN_BRACKET = '['.freeze
|
|
98
|
-
CLOSE_BRACKET = ']'.freeze
|
|
99
|
-
COMMA = ','.freeze
|
|
100
|
-
BACKSLASH = '\\'.freeze
|
|
101
|
-
EMPTY_STRING = ''.freeze
|
|
102
|
-
OPEN_BRACE = '{'.freeze
|
|
103
|
-
CLOSE_BRACE = '}'.freeze
|
|
104
|
-
NULL = 'NULL'.freeze
|
|
105
|
-
QUOTE = '"'.freeze
|
|
106
|
-
|
|
107
|
-
# Global hash of database array type name strings to symbols (e.g. 'double precision' => :float),
|
|
108
|
-
# used by the schema parsing for array types registered globally.
|
|
109
|
-
ARRAY_TYPES = {}
|
|
110
|
-
|
|
111
|
-
# Registers an array type that the extension should handle. Makes a Database instance that
|
|
112
|
-
# has been extended with DatabaseMethods recognize the array type given and set up the
|
|
113
|
-
# appropriate typecasting. Also sets up automatic typecasting for the native postgres
|
|
114
|
-
# adapter, so that on retrieval, the values are automatically converted to PGArray instances.
|
|
115
|
-
# The db_type argument should be the exact database type used (as returned by the PostgreSQL
|
|
116
|
-
# format_type database function). Accepts the following options:
|
|
117
|
-
#
|
|
118
|
-
# :array_type :: The type to automatically cast the array to when literalizing the array.
|
|
119
|
-
# Usually the same as db_type.
|
|
120
|
-
# :converter :: A callable object (e.g. Proc), that is called with each element of the array
|
|
121
|
-
# (usually a string), and should return the appropriate typecasted object.
|
|
122
|
-
# :oid :: The PostgreSQL OID for the array type. This is used by the Sequel postgres adapter
|
|
123
|
-
# to set up automatic type conversion on retrieval from the database.
|
|
124
|
-
# :parser :: Can be set to :json to use the faster JSON-based parser. Note that the JSON-based
|
|
125
|
-
# parser can only correctly handle integers values correctly. It doesn't handle
|
|
126
|
-
# full precision for numeric types, and doesn't handle NaN/Infinity values for
|
|
127
|
-
# floating point types.
|
|
128
|
-
# :scalar_oid :: Should be the PostgreSQL OID for the scalar version of this array type. If given,
|
|
129
|
-
# automatically sets the :converter option by looking for scalar conversion
|
|
130
|
-
# proc.
|
|
131
|
-
# :scalar_typecast :: Should be a symbol indicating the typecast method that should be called on
|
|
132
|
-
# each element of the array, when a plain array is passed into a database
|
|
133
|
-
# typecast method. For example, for an array of integers, this could be set to
|
|
134
|
-
# :integer, so that the typecast_value_integer method is called on all of the
|
|
135
|
-
# array elements. Defaults to :type_symbol option.
|
|
136
|
-
# :type_procs :: A hash mapping oids to conversion procs, used for looking up the :scalar_oid and
|
|
137
|
-
# value and setting the :oid value. Defaults to the global Sequel::Postgres::PG_TYPES.
|
|
138
|
-
# :type_symbol :: The base of the schema type symbol for this type. For example, if you provide
|
|
139
|
-
# :integer, Sequel will recognize this type as :integer_array during schema parsing.
|
|
140
|
-
# Defaults to the db_type argument.
|
|
141
|
-
# :typecast_method_map :: The map in which to place the database type string to type symbol mapping.
|
|
142
|
-
# Defaults to ARRAY_TYPES.
|
|
143
|
-
# :typecast_methods_module :: If given, a module object to add the typecasting method to. Defaults
|
|
144
|
-
# to DatabaseMethods.
|
|
145
|
-
#
|
|
146
|
-
# If a block is given, it is treated as the :converter option.
|
|
147
|
-
def self.register(db_type, opts=OPTS, &block)
|
|
148
|
-
db_type = db_type.to_s
|
|
149
|
-
type = (opts[:type_symbol] || db_type).to_sym
|
|
150
|
-
type_procs = opts[:type_procs] || PG_TYPES
|
|
151
|
-
mod = opts[:typecast_methods_module] || DatabaseMethods
|
|
152
|
-
typecast_method_map = opts[:typecast_method_map] || ARRAY_TYPES
|
|
153
|
-
|
|
154
|
-
if converter = opts[:converter]
|
|
155
|
-
raise Error, "can't provide both a block and :converter option to register" if block
|
|
156
|
-
else
|
|
157
|
-
converter = block
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
if soid = opts[:scalar_oid]
|
|
161
|
-
raise Error, "can't provide both a converter and :scalar_oid option to register" if converter
|
|
162
|
-
converter = type_procs[soid]
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
array_type = (opts[:array_type] || db_type).to_s.dup.freeze
|
|
166
|
-
creator = (opts[:parser] == :json ? JSONCreator : Creator).new(array_type, converter)
|
|
167
|
-
|
|
168
|
-
typecast_method_map[db_type] = :"#{type}_array"
|
|
169
|
-
|
|
170
|
-
define_array_typecast_method(mod, type, creator, opts.fetch(:scalar_typecast, type))
|
|
171
|
-
|
|
172
|
-
if oid = opts[:oid]
|
|
173
|
-
type_procs[oid] = creator
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
nil
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
# Define a private array typecasting method in the given module for the given type that uses
|
|
180
|
-
# the creator argument to do the type conversion.
|
|
181
|
-
def self.define_array_typecast_method(mod, type, creator, scalar_typecast)
|
|
182
|
-
mod.class_eval do
|
|
183
|
-
meth = :"typecast_value_#{type}_array"
|
|
184
|
-
scalar_typecast_method = :"typecast_value_#{scalar_typecast}"
|
|
185
|
-
define_method(meth){|v| typecast_value_pg_array(v, creator, scalar_typecast_method)}
|
|
186
|
-
private meth
|
|
187
|
-
end
|
|
188
|
-
end
|
|
189
|
-
private_class_method :define_array_typecast_method
|
|
190
|
-
|
|
191
81
|
module DatabaseMethods
|
|
192
|
-
APOS = "'".freeze
|
|
193
|
-
DOUBLE_APOS = "''".freeze
|
|
194
|
-
ESCAPE_RE = /("|\\)/.freeze
|
|
195
|
-
ESCAPE_REPLACEMENT = '\\\\\1'.freeze
|
|
196
82
|
BLOB_RANGE = 1...-1
|
|
197
83
|
|
|
198
84
|
# Create the local hash of database type strings to schema type symbols,
|
|
199
85
|
# used for array types local to this database.
|
|
200
86
|
def self.extended(db)
|
|
201
|
-
db.
|
|
87
|
+
db.instance_exec do
|
|
202
88
|
@pg_array_schema_types ||= {}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
89
|
+
register_array_type('timestamp without time zone', :oid=>1115, :scalar_oid=>1114, :type_symbol=>:datetime)
|
|
90
|
+
register_array_type('timestamp with time zone', :oid=>1185, :scalar_oid=>1184, :type_symbol=>:datetime_timezone, :scalar_typecast=>:datetime)
|
|
91
|
+
|
|
92
|
+
register_array_type('text', :oid=>1009, :scalar_oid=>25, :type_symbol=>:string)
|
|
93
|
+
register_array_type('integer', :oid=>1007, :scalar_oid=>23)
|
|
94
|
+
register_array_type('bigint', :oid=>1016, :scalar_oid=>20, :scalar_typecast=>:integer)
|
|
95
|
+
register_array_type('numeric', :oid=>1231, :scalar_oid=>1700, :type_symbol=>:decimal)
|
|
96
|
+
register_array_type('double precision', :oid=>1022, :scalar_oid=>701, :type_symbol=>:float)
|
|
97
|
+
|
|
98
|
+
register_array_type('boolean', :oid=>1000, :scalar_oid=>16)
|
|
99
|
+
register_array_type('bytea', :oid=>1001, :scalar_oid=>17, :type_symbol=>:blob)
|
|
100
|
+
register_array_type('date', :oid=>1182, :scalar_oid=>1082)
|
|
101
|
+
register_array_type('time without time zone', :oid=>1183, :scalar_oid=>1083, :type_symbol=>:time)
|
|
102
|
+
register_array_type('time with time zone', :oid=>1270, :scalar_oid=>1266, :type_symbol=>:time_timezone, :scalar_typecast=>:time)
|
|
103
|
+
|
|
104
|
+
register_array_type('smallint', :oid=>1005, :scalar_oid=>21, :scalar_typecast=>:integer)
|
|
105
|
+
register_array_type('oid', :oid=>1028, :scalar_oid=>26, :scalar_typecast=>:integer)
|
|
106
|
+
register_array_type('real', :oid=>1021, :scalar_oid=>700, :scalar_typecast=>:float)
|
|
107
|
+
register_array_type('character', :oid=>1014, :converter=>nil, :array_type=>:text, :scalar_typecast=>:string)
|
|
108
|
+
register_array_type('character varying', :oid=>1015, :converter=>nil, :scalar_typecast=>:string, :type_symbol=>:varchar)
|
|
109
|
+
|
|
110
|
+
register_array_type('xml', :oid=>143, :scalar_oid=>142)
|
|
111
|
+
register_array_type('money', :oid=>791, :scalar_oid=>790)
|
|
112
|
+
register_array_type('bit', :oid=>1561, :scalar_oid=>1560)
|
|
113
|
+
register_array_type('bit varying', :oid=>1563, :scalar_oid=>1562, :type_symbol=>:varbit)
|
|
114
|
+
register_array_type('uuid', :oid=>2951, :scalar_oid=>2950)
|
|
115
|
+
|
|
116
|
+
register_array_type('xid', :oid=>1011, :scalar_oid=>28)
|
|
117
|
+
register_array_type('cid', :oid=>1012, :scalar_oid=>29)
|
|
118
|
+
|
|
119
|
+
register_array_type('name', :oid=>1003, :scalar_oid=>19)
|
|
120
|
+
register_array_type('tid', :oid=>1010, :scalar_oid=>27)
|
|
121
|
+
register_array_type('int2vector', :oid=>1006, :scalar_oid=>22)
|
|
122
|
+
register_array_type('oidvector', :oid=>1013, :scalar_oid=>30)
|
|
123
|
+
|
|
207
124
|
[:string_array, :integer_array, :decimal_array, :float_array, :boolean_array, :blob_array, :date_array, :time_array, :datetime_array].each do |v|
|
|
208
125
|
@schema_type_classes[v] = PGArray
|
|
209
126
|
end
|
|
210
127
|
end
|
|
211
128
|
end
|
|
212
129
|
|
|
130
|
+
def add_named_conversion_proc(name, &block)
|
|
131
|
+
ret = super
|
|
132
|
+
name = name.to_s if name.is_a?(Symbol)
|
|
133
|
+
from(:pg_type).where(:typname=>name).select_map([:oid, :typarray]).each do |scalar_oid, array_oid|
|
|
134
|
+
register_array_type(name, :oid=>array_oid.to_i, :scalar_oid=>scalar_oid.to_i)
|
|
135
|
+
end
|
|
136
|
+
ret
|
|
137
|
+
end
|
|
138
|
+
|
|
213
139
|
# Handle arrays in bound variables
|
|
214
140
|
def bound_variable_arg(arg, conn)
|
|
215
141
|
case arg
|
|
@@ -222,25 +148,75 @@ module Sequel
|
|
|
222
148
|
end
|
|
223
149
|
end
|
|
224
150
|
|
|
225
|
-
#
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
151
|
+
# Freeze the pg array schema types to prevent adding new ones.
|
|
152
|
+
def freeze
|
|
153
|
+
@pg_array_schema_types.freeze
|
|
154
|
+
super
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Register a database specific array type. Options:
|
|
158
|
+
#
|
|
159
|
+
# :array_type :: The type to automatically cast the array to when literalizing the array.
|
|
160
|
+
# Usually the same as db_type.
|
|
161
|
+
# :converter :: A callable object (e.g. Proc), that is called with each element of the array
|
|
162
|
+
# (usually a string), and should return the appropriate typecasted object.
|
|
163
|
+
# :oid :: The PostgreSQL OID for the array type. This is used by the Sequel postgres adapter
|
|
164
|
+
# to set up automatic type conversion on retrieval from the database.
|
|
165
|
+
# :scalar_oid :: Should be the PostgreSQL OID for the scalar version of this array type. If given,
|
|
166
|
+
# automatically sets the :converter option by looking for scalar conversion
|
|
167
|
+
# proc.
|
|
168
|
+
# :scalar_typecast :: Should be a symbol indicating the typecast method that should be called on
|
|
169
|
+
# each element of the array, when a plain array is passed into a database
|
|
170
|
+
# typecast method. For example, for an array of integers, this could be set to
|
|
171
|
+
# :integer, so that the typecast_value_integer method is called on all of the
|
|
172
|
+
# array elements. Defaults to :type_symbol option.
|
|
173
|
+
# :type_symbol :: The base of the schema type symbol for this type. For example, if you provide
|
|
174
|
+
# :integer, Sequel will recognize this type as :integer_array during schema parsing.
|
|
175
|
+
# Defaults to the db_type argument.
|
|
176
|
+
#
|
|
177
|
+
# If a block is given, it is treated as the :converter option.
|
|
229
178
|
def register_array_type(db_type, opts=OPTS, &block)
|
|
230
|
-
|
|
231
|
-
|
|
179
|
+
oid = opts[:oid]
|
|
180
|
+
soid = opts[:scalar_oid]
|
|
181
|
+
|
|
182
|
+
if has_converter = opts.has_key?(:converter)
|
|
183
|
+
raise Error, "can't provide both a block and :converter option to register_array_type" if block
|
|
184
|
+
converter = opts[:converter]
|
|
185
|
+
else
|
|
186
|
+
has_converter = true if block
|
|
187
|
+
converter = block
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
unless (soid || has_converter) && oid
|
|
232
191
|
array_oid, scalar_oid = from(:pg_type).where(:typname=>db_type.to_s).get([:typarray, :oid])
|
|
233
|
-
|
|
234
|
-
|
|
192
|
+
soid ||= scalar_oid unless has_converter
|
|
193
|
+
oid ||= array_oid
|
|
235
194
|
end
|
|
236
|
-
PGArray.register(db_type, opts, &block)
|
|
237
|
-
@schema_type_classes[:"#{opts[:type_symbol] || db_type}_array"] = PGArray
|
|
238
|
-
conversion_procs_updated
|
|
239
|
-
end
|
|
240
195
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
196
|
+
db_type = db_type.to_s
|
|
197
|
+
type = (opts[:type_symbol] || db_type).to_sym
|
|
198
|
+
typecast_method_map = @pg_array_schema_types
|
|
199
|
+
|
|
200
|
+
if soid
|
|
201
|
+
raise Error, "can't provide both a converter and :scalar_oid option to register" if has_converter
|
|
202
|
+
converter = conversion_procs[soid]
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
array_type = (opts[:array_type] || db_type).to_s.dup.freeze
|
|
206
|
+
creator = Creator.new(array_type, converter)
|
|
207
|
+
add_conversion_proc(oid, creator)
|
|
208
|
+
|
|
209
|
+
typecast_method_map[db_type] = :"#{type}_array"
|
|
210
|
+
|
|
211
|
+
singleton_class.class_eval do
|
|
212
|
+
meth = :"typecast_value_#{type}_array"
|
|
213
|
+
scalar_typecast_method = :"typecast_value_#{opts.fetch(:scalar_typecast, type)}"
|
|
214
|
+
define_method(meth){|v| typecast_value_pg_array(v, creator, scalar_typecast_method)}
|
|
215
|
+
private meth
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
@schema_type_classes[:"#{type}_array"] = PGArray
|
|
219
|
+
nil
|
|
244
220
|
end
|
|
245
221
|
|
|
246
222
|
private
|
|
@@ -249,46 +225,23 @@ module Sequel
|
|
|
249
225
|
def bound_variable_array(a)
|
|
250
226
|
case a
|
|
251
227
|
when Array
|
|
252
|
-
"{#{a.map{|i| bound_variable_array(i)}.join(
|
|
228
|
+
"{#{a.map{|i| bound_variable_array(i)}.join(',')}}"
|
|
253
229
|
when Sequel::SQL::Blob
|
|
254
|
-
"\"#{literal(a)[BLOB_RANGE].gsub(
|
|
230
|
+
"\"#{literal(a)[BLOB_RANGE].gsub("''", "'").gsub(/("|\\)/, '\\\\\1')}\""
|
|
255
231
|
when Sequel::LiteralString
|
|
256
232
|
a
|
|
257
233
|
when String
|
|
258
|
-
"\"#{a.gsub(
|
|
234
|
+
"\"#{a.gsub(/("|\\)/, '\\\\\1')}\""
|
|
259
235
|
else
|
|
260
236
|
literal(a)
|
|
261
237
|
end
|
|
262
238
|
end
|
|
263
239
|
|
|
264
|
-
# Automatically handle array types for the given named types.
|
|
265
|
-
def convert_named_procs_to_procs(named_procs)
|
|
266
|
-
h = super
|
|
267
|
-
unless h.empty?
|
|
268
|
-
from(:pg_type).where(:oid=>h.keys).select_map([:typname, :oid, :typarray]).each do |name, scalar_oid, array_oid|
|
|
269
|
-
register_array_type(name, :type_procs=>h, :oid=>array_oid.to_i, :scalar_oid=>scalar_oid.to_i)
|
|
270
|
-
end
|
|
271
|
-
end
|
|
272
|
-
h
|
|
273
|
-
end
|
|
274
|
-
|
|
275
|
-
# Manually override the typecasting for timestamp array types so that
|
|
276
|
-
# they use the database's timezone instead of the global Sequel
|
|
277
|
-
# timezone.
|
|
278
|
-
def get_conversion_procs
|
|
279
|
-
procs = super
|
|
280
|
-
|
|
281
|
-
procs[1115] = Creator.new("timestamp without time zone", procs[1114])
|
|
282
|
-
procs[1185] = Creator.new("timestamp with time zone", procs[1184])
|
|
283
|
-
|
|
284
|
-
procs
|
|
285
|
-
end
|
|
286
|
-
|
|
287
240
|
# Look into both the current database's array schema types and the global
|
|
288
241
|
# array schema types to get the type symbol for the given database type
|
|
289
242
|
# string.
|
|
290
243
|
def pg_array_schema_type(type)
|
|
291
|
-
@pg_array_schema_types[type]
|
|
244
|
+
@pg_array_schema_types[type]
|
|
292
245
|
end
|
|
293
246
|
|
|
294
247
|
# Make the column type detection handle registered array types.
|
|
@@ -300,6 +253,17 @@ module Sequel
|
|
|
300
253
|
end
|
|
301
254
|
end
|
|
302
255
|
|
|
256
|
+
# Set the :callable_default value if the default value is recognized as an empty array.
|
|
257
|
+
def schema_post_process(_)
|
|
258
|
+
super.each do |a|
|
|
259
|
+
h = a[1]
|
|
260
|
+
if h[:default] =~ /\A(?:'\{\}'|ARRAY\[\])::([\w ]+)\[\]\z/
|
|
261
|
+
type = $1.freeze
|
|
262
|
+
h[:callable_default] = lambda{Sequel.pg_array([], type)}
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
303
267
|
# Convert ruby arrays to PostgreSQL arrays when used as default values.
|
|
304
268
|
def column_definition_default_sql(sql, column)
|
|
305
269
|
if (d = column[:default]) && d.is_a?(Array) && !Sequel.condition_specifier?(d)
|
|
@@ -336,97 +300,101 @@ module Sequel
|
|
|
336
300
|
end
|
|
337
301
|
end
|
|
338
302
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
end
|
|
303
|
+
unless Sequel::Postgres.respond_to?(:parse_pg_array)
|
|
304
|
+
require 'strscan'
|
|
305
|
+
|
|
306
|
+
# PostgreSQL array parser that handles PostgreSQL array output format.
|
|
307
|
+
# Note that does not handle all forms out input that PostgreSQL will
|
|
308
|
+
# accept, and it will not raise an error for all forms of invalid input.
|
|
309
|
+
class Parser < StringScanner
|
|
310
|
+
# Set the source for the input, and any converter callable
|
|
311
|
+
# to call with objects to be created. For nested parsers
|
|
312
|
+
# the source may contain text after the end current parse,
|
|
313
|
+
# which will be ignored.
|
|
314
|
+
def initialize(source, converter=nil)
|
|
315
|
+
super(source)
|
|
316
|
+
@converter = converter
|
|
317
|
+
@stack = [[]]
|
|
318
|
+
@encoding = string.encoding
|
|
319
|
+
@recorded = String.new.force_encoding(@encoding)
|
|
320
|
+
end
|
|
358
321
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
322
|
+
# Take the buffer of recorded characters and add it to the array
|
|
323
|
+
# of entries, and use a new buffer for recorded characters.
|
|
324
|
+
def new_entry(include_empty=false)
|
|
325
|
+
if !@recorded.empty? || include_empty
|
|
326
|
+
entry = @recorded
|
|
327
|
+
if entry == 'NULL' && !include_empty
|
|
328
|
+
entry = nil
|
|
329
|
+
elsif @converter
|
|
330
|
+
entry = @converter.call(entry)
|
|
331
|
+
end
|
|
332
|
+
@stack.last.push(entry)
|
|
333
|
+
@recorded = String.new.force_encoding(@encoding)
|
|
368
334
|
end
|
|
369
|
-
@stack.last.push(entry)
|
|
370
|
-
@recorded = ""
|
|
371
335
|
end
|
|
372
|
-
end
|
|
373
336
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
337
|
+
# Parse the input character by character, returning an array
|
|
338
|
+
# of parsed (and potentially converted) objects.
|
|
339
|
+
def parse
|
|
340
|
+
raise Sequel::Error, "invalid array, empty string" if eos?
|
|
341
|
+
raise Sequel::Error, "invalid array, doesn't start with {" unless scan(/((\[\d+:\d+\])+=)?\{/)
|
|
342
|
+
|
|
343
|
+
# :nocov:
|
|
344
|
+
while !eos?
|
|
345
|
+
# :nocov:
|
|
346
|
+
char = scan(/[{}",]|[^{}",]+/)
|
|
347
|
+
if char == ','
|
|
348
|
+
# Comma outside quoted string indicates end of current entry
|
|
349
|
+
new_entry
|
|
350
|
+
elsif char == '"'
|
|
351
|
+
raise Sequel::Error, "invalid array, opening quote with existing recorded data" unless @recorded.empty?
|
|
352
|
+
# :nocov:
|
|
353
|
+
while true
|
|
354
|
+
# :nocov:
|
|
355
|
+
char = scan(/["\\]|[^"\\]+/)
|
|
356
|
+
if char == '\\'
|
|
357
|
+
@recorded << getch
|
|
358
|
+
elsif char == '"'
|
|
359
|
+
n = peek(1)
|
|
360
|
+
raise Sequel::Error, "invalid array, closing quote not followed by comma or closing brace" unless n == ',' || n == '}'
|
|
361
|
+
break
|
|
362
|
+
else
|
|
363
|
+
@recorded << char
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
new_entry(true)
|
|
367
|
+
elsif char == '{'
|
|
368
|
+
raise Sequel::Error, "invalid array, opening brace with existing recorded data" unless @recorded.empty?
|
|
369
|
+
|
|
370
|
+
# Start of new array, add it to the stack
|
|
371
|
+
new = []
|
|
372
|
+
@stack.last << new
|
|
373
|
+
@stack << new
|
|
374
|
+
elsif char == '}'
|
|
375
|
+
# End of current array, add current entry to the current array
|
|
376
|
+
new_entry
|
|
377
|
+
|
|
378
|
+
if @stack.length == 1
|
|
379
|
+
raise Sequel::Error, "array parsing finished without parsing entire string" unless eos?
|
|
380
|
+
|
|
381
|
+
# Top level of array, parsing should be over.
|
|
382
|
+
# Pop current array off stack and return it as result
|
|
383
|
+
return @stack.pop
|
|
395
384
|
else
|
|
396
|
-
|
|
385
|
+
# Nested array, pop current array off stack
|
|
386
|
+
@stack.pop
|
|
397
387
|
end
|
|
398
|
-
end
|
|
399
|
-
new_entry(true)
|
|
400
|
-
elsif char == OPEN_BRACE
|
|
401
|
-
raise Sequel::Error, "invalid array, opening brace with existing recorded data" unless @recorded.empty?
|
|
402
|
-
|
|
403
|
-
# Start of new array, add it to the stack
|
|
404
|
-
new = []
|
|
405
|
-
@stack.last << new
|
|
406
|
-
@stack << new
|
|
407
|
-
elsif char == CLOSE_BRACE
|
|
408
|
-
# End of current array, add current entry to the current array
|
|
409
|
-
new_entry
|
|
410
|
-
|
|
411
|
-
if @stack.length == 1
|
|
412
|
-
raise Sequel::Error, "array parsing finished without parsing entire string" unless eos?
|
|
413
|
-
|
|
414
|
-
# Top level of array, parsing should be over.
|
|
415
|
-
# Pop current array off stack and return it as result
|
|
416
|
-
return @stack.pop
|
|
417
388
|
else
|
|
418
|
-
#
|
|
419
|
-
@
|
|
389
|
+
# Add the character to the recorded character buffer.
|
|
390
|
+
@recorded << char
|
|
420
391
|
end
|
|
421
|
-
else
|
|
422
|
-
# Add the character to the recorded character buffer.
|
|
423
|
-
@recorded << char
|
|
424
392
|
end
|
|
425
|
-
end
|
|
426
393
|
|
|
427
|
-
|
|
394
|
+
raise Sequel::Error, "array parsing finished with array unclosed"
|
|
395
|
+
end
|
|
428
396
|
end
|
|
429
|
-
end
|
|
397
|
+
end
|
|
430
398
|
|
|
431
399
|
# Callable object that takes the input string and parses it using Parser.
|
|
432
400
|
class Creator
|
|
@@ -460,27 +428,6 @@ module Sequel
|
|
|
460
428
|
end
|
|
461
429
|
end
|
|
462
430
|
|
|
463
|
-
# Callable object that takes the input string and parses it using.
|
|
464
|
-
# a JSON parser. This should be faster than the standard Creator,
|
|
465
|
-
# but only handles integer types correctly.
|
|
466
|
-
class JSONCreator < Creator
|
|
467
|
-
# Character conversion map mapping input strings to JSON replacements
|
|
468
|
-
SUBST = {'{'.freeze=>'['.freeze, '}'.freeze=>']'.freeze, 'NULL'.freeze=>'null'.freeze}
|
|
469
|
-
|
|
470
|
-
# Regular expression matching input strings to convert
|
|
471
|
-
SUBST_RE = %r[\{|\}|NULL].freeze
|
|
472
|
-
|
|
473
|
-
# Parse the input string by using a gsub to convert non-JSON characters to
|
|
474
|
-
# JSON, running it through a regular JSON parser. If a converter is used, a
|
|
475
|
-
# recursive map of the output is done to make sure that the entires in the
|
|
476
|
-
# correct type.
|
|
477
|
-
def call(string)
|
|
478
|
-
array = Sequel.parse_json(string.gsub(SUBST_RE){|m| SUBST[m]})
|
|
479
|
-
array = Sequel.recursive_map(array, @converter) if @converter
|
|
480
|
-
PGArray.new(array, @type)
|
|
481
|
-
end
|
|
482
|
-
end
|
|
483
|
-
|
|
484
431
|
# The type of this array. May be nil if no type was given. If a type
|
|
485
432
|
# is provided, the array is automatically casted to this type when
|
|
486
433
|
# literalizing. This type is the underlying type, not the array type
|
|
@@ -499,13 +446,13 @@ module Sequel
|
|
|
499
446
|
def sql_literal_append(ds, sql)
|
|
500
447
|
at = array_type
|
|
501
448
|
if empty? && at
|
|
502
|
-
sql <<
|
|
449
|
+
sql << "'{}'"
|
|
503
450
|
else
|
|
504
|
-
sql << ARRAY
|
|
451
|
+
sql << "ARRAY"
|
|
505
452
|
_literal_append(sql, ds, to_a)
|
|
506
453
|
end
|
|
507
454
|
if at
|
|
508
|
-
sql <<
|
|
455
|
+
sql << '::' << at.to_s << '[]'
|
|
509
456
|
end
|
|
510
457
|
end
|
|
511
458
|
|
|
@@ -515,9 +462,9 @@ module Sequel
|
|
|
515
462
|
# arrays, surrounding each with [] and interspersing
|
|
516
463
|
# entries with ,.
|
|
517
464
|
def _literal_append(sql, ds, array)
|
|
518
|
-
sql <<
|
|
465
|
+
sql << '['
|
|
519
466
|
comma = false
|
|
520
|
-
commas =
|
|
467
|
+
commas = ','
|
|
521
468
|
array.each do |i|
|
|
522
469
|
sql << commas if comma
|
|
523
470
|
if i.is_a?(Array)
|
|
@@ -527,44 +474,8 @@ module Sequel
|
|
|
527
474
|
end
|
|
528
475
|
comma = true
|
|
529
476
|
end
|
|
530
|
-
sql <<
|
|
477
|
+
sql << ']'
|
|
531
478
|
end
|
|
532
|
-
|
|
533
|
-
# Register all array types that this extension handles by default.
|
|
534
|
-
|
|
535
|
-
register('text', :oid=>1009, :type_symbol=>:string)
|
|
536
|
-
register('integer', :oid=>1007, :parser=>:json)
|
|
537
|
-
register('bigint', :oid=>1016, :parser=>:json, :scalar_typecast=>:integer)
|
|
538
|
-
register('numeric', :oid=>1231, :scalar_oid=>1700, :type_symbol=>:decimal)
|
|
539
|
-
register('double precision', :oid=>1022, :scalar_oid=>701, :type_symbol=>:float)
|
|
540
|
-
|
|
541
|
-
register('boolean', :oid=>1000, :scalar_oid=>16)
|
|
542
|
-
register('bytea', :oid=>1001, :scalar_oid=>17, :type_symbol=>:blob)
|
|
543
|
-
register('date', :oid=>1182, :scalar_oid=>1082)
|
|
544
|
-
register('time without time zone', :oid=>1183, :scalar_oid=>1083, :type_symbol=>:time)
|
|
545
|
-
register('timestamp without time zone', :oid=>1115, :scalar_oid=>1114, :type_symbol=>:datetime)
|
|
546
|
-
register('time with time zone', :oid=>1270, :scalar_oid=>1083, :type_symbol=>:time_timezone, :scalar_typecast=>:time)
|
|
547
|
-
register('timestamp with time zone', :oid=>1185, :scalar_oid=>1184, :type_symbol=>:datetime_timezone, :scalar_typecast=>:datetime)
|
|
548
|
-
|
|
549
|
-
register('smallint', :oid=>1005, :parser=>:json, :scalar_typecast=>:integer)
|
|
550
|
-
register('oid', :oid=>1028, :parser=>:json, :scalar_typecast=>:integer)
|
|
551
|
-
register('real', :oid=>1021, :scalar_oid=>700, :scalar_typecast=>:float)
|
|
552
|
-
register('character', :oid=>1014, :array_type=>:text, :scalar_typecast=>:string)
|
|
553
|
-
register('character varying', :oid=>1015, :scalar_typecast=>:string, :type_symbol=>:varchar)
|
|
554
|
-
|
|
555
|
-
register('xml', :oid=>143, :scalar_oid=>142)
|
|
556
|
-
register('money', :oid=>791, :scalar_oid=>790)
|
|
557
|
-
register('bit', :oid=>1561, :scalar_oid=>1560)
|
|
558
|
-
register('bit varying', :oid=>1563, :scalar_oid=>1562, :type_symbol=>:varbit)
|
|
559
|
-
register('uuid', :oid=>2951, :scalar_oid=>2950)
|
|
560
|
-
|
|
561
|
-
register('xid', :oid=>1011, :scalar_oid=>28)
|
|
562
|
-
register('cid', :oid=>1012, :scalar_oid=>29)
|
|
563
|
-
|
|
564
|
-
register('name', :oid=>1003, :scalar_oid=>19)
|
|
565
|
-
register('tid', :oid=>1010, :scalar_oid=>27)
|
|
566
|
-
register('int2vector', :oid=>1006, :scalar_oid=>22)
|
|
567
|
-
register('oidvector', :oid=>1013, :scalar_oid=>30)
|
|
568
479
|
end
|
|
569
480
|
end
|
|
570
481
|
|