sequel 4.45.0 → 4.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +108 -0
- data/doc/release_notes/4.46.0.txt +404 -0
- data/doc/security.rdoc +9 -0
- data/doc/sql.rdoc +2 -2
- data/doc/testing.rdoc +1 -1
- data/doc/validations.rdoc +1 -2
- data/lib/sequel/adapters/ado.rb +8 -3
- data/lib/sequel/adapters/ado/access.rb +8 -4
- data/lib/sequel/adapters/ado/mssql.rb +3 -1
- data/lib/sequel/adapters/amalgalite.rb +5 -0
- data/lib/sequel/adapters/cubrid.rb +16 -7
- data/lib/sequel/adapters/do.rb +7 -1
- data/lib/sequel/adapters/do/mysql.rb +8 -4
- data/lib/sequel/adapters/ibmdb.rb +10 -5
- data/lib/sequel/adapters/jdbc.rb +8 -2
- data/lib/sequel/adapters/jdbc/as400.rb +10 -3
- data/lib/sequel/adapters/jdbc/db2.rb +27 -16
- data/lib/sequel/adapters/jdbc/derby.rb +47 -20
- data/lib/sequel/adapters/jdbc/h2.rb +13 -7
- data/lib/sequel/adapters/jdbc/hsqldb.rb +18 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +5 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +3 -2
- data/lib/sequel/adapters/jdbc/oracle.rb +3 -2
- data/lib/sequel/adapters/jdbc/postgresql.rb +4 -3
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +2 -1
- data/lib/sequel/adapters/jdbc/sqlite.rb +10 -3
- data/lib/sequel/adapters/jdbc/sqlserver.rb +23 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +16 -10
- data/lib/sequel/adapters/mock.rb +5 -0
- data/lib/sequel/adapters/mysql.rb +8 -1
- data/lib/sequel/adapters/mysql2.rb +6 -1
- data/lib/sequel/adapters/odbc.rb +20 -8
- data/lib/sequel/adapters/odbc/mssql.rb +6 -3
- data/lib/sequel/adapters/oracle.rb +12 -6
- data/lib/sequel/adapters/postgres.rb +20 -8
- data/lib/sequel/adapters/shared/access.rb +76 -47
- data/lib/sequel/adapters/shared/cubrid.rb +16 -11
- data/lib/sequel/adapters/shared/db2.rb +46 -19
- data/lib/sequel/adapters/shared/firebird.rb +20 -8
- data/lib/sequel/adapters/shared/informix.rb +6 -3
- data/lib/sequel/adapters/shared/mssql.rb +132 -72
- data/lib/sequel/adapters/shared/mysql.rb +112 -65
- data/lib/sequel/adapters/shared/oracle.rb +36 -21
- data/lib/sequel/adapters/shared/postgres.rb +91 -56
- data/lib/sequel/adapters/shared/sqlanywhere.rb +65 -37
- data/lib/sequel/adapters/shared/sqlite.rb +67 -32
- data/lib/sequel/adapters/sqlanywhere.rb +9 -1
- data/lib/sequel/adapters/sqlite.rb +8 -1
- data/lib/sequel/adapters/swift.rb +5 -0
- data/lib/sequel/adapters/swift/mysql.rb +4 -2
- data/lib/sequel/adapters/swift/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +10 -3
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -0
- data/lib/sequel/adapters/utils/pg_types.rb +14 -6
- data/lib/sequel/adapters/utils/replace.rb +4 -2
- data/lib/sequel/connection_pool/single.rb +2 -2
- data/lib/sequel/core.rb +24 -11
- data/lib/sequel/database/connecting.rb +9 -3
- data/lib/sequel/database/dataset_defaults.rb +7 -1
- data/lib/sequel/database/logging.rb +1 -0
- data/lib/sequel/database/misc.rb +5 -2
- data/lib/sequel/database/query.rb +7 -5
- data/lib/sequel/database/schema_generator.rb +1 -0
- data/lib/sequel/database/schema_methods.rb +50 -27
- data/lib/sequel/database/transactions.rb +19 -9
- data/lib/sequel/dataset/actions.rb +15 -6
- data/lib/sequel/dataset/graph.rb +15 -5
- data/lib/sequel/dataset/misc.rb +12 -4
- data/lib/sequel/dataset/mutation.rb +17 -8
- data/lib/sequel/dataset/prepared_statements.rb +3 -2
- data/lib/sequel/dataset/query.rb +84 -38
- data/lib/sequel/dataset/sql.rb +302 -191
- data/lib/sequel/deprecated.rb +26 -17
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +2 -2
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/from_block.rb +1 -0
- data/lib/sequel/extensions/graph_each.rb +1 -1
- data/lib/sequel/extensions/identifier_mangling.rb +2 -2
- data/lib/sequel/extensions/migration.rb +28 -4
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +4 -4
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +5 -3
- data/lib/sequel/extensions/set_overrides.rb +2 -0
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model.rb +11 -7
- data/lib/sequel/model/associations.rb +5 -7
- data/lib/sequel/model/base.rb +47 -45
- data/lib/sequel/model/dataset_module.rb +9 -14
- data/lib/sequel/model/plugins.rb +3 -0
- data/lib/sequel/no_core_ext.rb +1 -0
- data/lib/sequel/plugins/blacklist_security.rb +1 -1
- data/lib/sequel/plugins/boolean_subsets.rb +7 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +47 -10
- data/lib/sequel/plugins/dataset_associations.rb +1 -1
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/finder.rb +240 -0
- data/lib/sequel/plugins/inverted_subsets.rb +19 -12
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +1 -1
- data/lib/sequel/plugins/schema.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +7 -1
- data/lib/sequel/plugins/subset_conditions.rb +11 -3
- data/lib/sequel/plugins/whitelist_security.rb +118 -0
- data/lib/sequel/sql.rb +80 -36
- data/lib/sequel/timezones.rb +2 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +20 -0
- data/spec/adapters/mysql_spec.rb +1 -1
- data/spec/adapters/oracle_spec.rb +12 -8
- data/spec/adapters/postgres_spec.rb +1 -1
- data/spec/adapters/spec_helper.rb +1 -1
- data/spec/adapters/sqlite_spec.rb +36 -34
- data/spec/core/connection_pool_spec.rb +2 -1
- data/spec/core/database_spec.rb +87 -9
- data/spec/core/dataset_spec.rb +501 -129
- data/spec/core/deprecated_spec.rb +1 -1
- data/spec/core/expression_filters_spec.rb +146 -60
- data/spec/core/mock_adapter_spec.rb +1 -1
- data/spec/core/object_graph_spec.rb +61 -9
- data/spec/core/placeholder_literalizer_spec.rb +20 -2
- data/spec/core/schema_generator_spec.rb +6 -6
- data/spec/core/schema_spec.rb +54 -5
- data/spec/core_extensions_spec.rb +122 -18
- data/spec/deprecation_helper.rb +27 -2
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +6 -6
- data/spec/extensions/association_proxies_spec.rb +2 -2
- data/spec/extensions/auto_literal_strings_spec.rb +212 -0
- data/spec/extensions/blacklist_security_spec.rb +1 -0
- data/spec/extensions/class_table_inheritance_spec.rb +1037 -39
- data/spec/extensions/column_select_spec.rb +20 -8
- data/spec/extensions/columns_introspection_spec.rb +3 -3
- data/spec/extensions/core_refinements_spec.rb +29 -12
- data/spec/extensions/dataset_associations_spec.rb +12 -12
- data/spec/extensions/def_dataset_method_spec.rb +100 -0
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +260 -0
- data/spec/extensions/graph_each_spec.rb +2 -2
- data/spec/extensions/identifier_mangling_spec.rb +14 -8
- data/spec/extensions/inverted_subsets_spec.rb +4 -4
- data/spec/extensions/lazy_attributes_spec.rb +7 -0
- data/spec/extensions/many_through_many_spec.rb +38 -14
- data/spec/extensions/nested_attributes_spec.rb +18 -6
- data/spec/extensions/no_auto_literal_strings_spec.rb +1 -1
- data/spec/extensions/pg_enum_spec.rb +16 -1
- data/spec/extensions/pg_interval_spec.rb +11 -2
- data/spec/extensions/pg_loose_count_spec.rb +5 -0
- data/spec/extensions/pg_row_spec.rb +25 -0
- data/spec/extensions/prepared_statements_spec.rb +10 -1
- data/spec/extensions/query_spec.rb +2 -2
- data/spec/extensions/schema_dumper_spec.rb +2 -2
- data/spec/extensions/schema_spec.rb +2 -2
- data/spec/extensions/set_overrides_spec.rb +7 -3
- data/spec/extensions/sql_expr_spec.rb +0 -1
- data/spec/extensions/subset_conditions_spec.rb +6 -6
- data/spec/extensions/table_select_spec.rb +24 -12
- data/spec/extensions/to_dot_spec.rb +4 -4
- data/spec/extensions/whitelist_security_spec.rb +131 -0
- data/spec/integration/dataset_test.rb +9 -5
- data/spec/integration/model_test.rb +2 -0
- data/spec/integration/plugin_test.rb +2 -2
- data/spec/integration/spec_helper.rb +1 -1
- data/spec/model/associations_spec.rb +39 -11
- data/spec/model/base_spec.rb +44 -24
- data/spec/model/class_dataset_methods_spec.rb +18 -16
- data/spec/model/dataset_methods_spec.rb +4 -4
- data/spec/model/eager_loading_spec.rb +84 -24
- data/spec/model/model_spec.rb +97 -63
- data/spec/model/record_spec.rb +21 -13
- metadata +13 -2
data/lib/sequel/deprecated.rb
CHANGED
|
@@ -36,25 +36,34 @@ module Sequel
|
|
|
36
36
|
attr_accessor :prefix
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
39
|
+
if RUBY_VERSION < '1.9'
|
|
40
|
+
# :nocov:
|
|
41
|
+
def self.deprecate(_method, _instead=nil)
|
|
42
|
+
# Sequel 5 will drop ruby 1.8 support completely, so it doesn't make sense to issue deprecation
|
|
43
|
+
# warnings on ruby 1.8.
|
|
44
|
+
end
|
|
45
|
+
# :nocov:
|
|
46
|
+
else
|
|
47
|
+
# Print the message and possibly backtrace to the output.
|
|
48
|
+
def self.deprecate(method, instead=nil)
|
|
49
|
+
return unless output
|
|
50
|
+
message = instead ? "#{method} is deprecated and will be removed in Sequel 5. #{instead}." : method
|
|
51
|
+
message = "#{prefix}#{message}" if prefix
|
|
52
|
+
output.puts(message)
|
|
53
|
+
case b = backtrace_filter
|
|
54
|
+
when Integer
|
|
55
|
+
caller.each do |c|
|
|
56
|
+
b -= 1
|
|
57
|
+
output.puts(c)
|
|
58
|
+
break if b <= 0
|
|
59
|
+
end
|
|
60
|
+
when true
|
|
61
|
+
caller.each{|c| output.puts(c)}
|
|
62
|
+
when Proc
|
|
63
|
+
caller.each_with_index{|line, line_no| output.puts(line) if b.call(line, line_no)}
|
|
51
64
|
end
|
|
52
|
-
|
|
53
|
-
caller.each{|c| output.puts(c)}
|
|
54
|
-
when Proc
|
|
55
|
-
caller.each_with_index{|line, line_no| output.puts(line) if b.call(line, line_no)}
|
|
65
|
+
nil
|
|
56
66
|
end
|
|
57
|
-
nil
|
|
58
67
|
end
|
|
59
68
|
|
|
60
69
|
# If using ruby 2.3+, use Module#deprecate_constant to deprecate the constant,
|
|
@@ -70,7 +70,7 @@ module Sequel
|
|
|
70
70
|
|
|
71
71
|
def identifier_input_method=(v)
|
|
72
72
|
Sequel::Deprecation.deprecate("Dataset#identifier_input_method=", "Explicitly load the identifier_mangling extension if you would like to use this")
|
|
73
|
-
raise_if_frozen!("identifier_input_method=")
|
|
73
|
+
raise_if_frozen!(%w"identifier_input_method= with_identifier_input_method")
|
|
74
74
|
skip_symbol_cache!
|
|
75
75
|
@opts[:identifier_input_method] = v
|
|
76
76
|
end
|
|
@@ -81,7 +81,7 @@ module Sequel
|
|
|
81
81
|
|
|
82
82
|
def identifier_output_method=(v)
|
|
83
83
|
Sequel::Deprecation.deprecate("Dataset#identifier_output_method=", "Explicitly load the identifier_mangling extension if you would like to use this")
|
|
84
|
-
raise_if_frozen!("identifier_output_method=")
|
|
84
|
+
raise_if_frozen!(%w"identifier_output_method= with_identifier_output_method")
|
|
85
85
|
@opts[:identifier_output_method] = v
|
|
86
86
|
end
|
|
87
87
|
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The auto_literal_strings extension treats string values passed as filter
|
|
4
|
+
# arguments as SQL query fragments. This is the behavior of previous
|
|
5
|
+
# versions of Sequel. Using this extension makes using raw SQL fragments
|
|
6
|
+
# easier, since you don't need to wrap them with Sequel.lit, but also makes
|
|
7
|
+
# it easier to introduce SQL injection vulnerabilities into the application.
|
|
8
|
+
# It is only recommended to use this extension for
|
|
9
|
+
# backwards compatibility with previous versions of Sequel.
|
|
10
|
+
#
|
|
11
|
+
# With this extension, if a single string is given, it is used as an SQL
|
|
12
|
+
# query fragment:
|
|
13
|
+
#
|
|
14
|
+
# ds = DB[:table].extension(:auto_literal_strings)
|
|
15
|
+
# ds.where("name > 'A'")
|
|
16
|
+
# # SELECT * FROM table WHERE (name > 'A')
|
|
17
|
+
#
|
|
18
|
+
# If additional arguments are given, they are used as placeholders:
|
|
19
|
+
#
|
|
20
|
+
# ds.where("name > ?", "A")
|
|
21
|
+
# # SELECT * FROM table WHERE (name > 'A')
|
|
22
|
+
#
|
|
23
|
+
# Named placeholders can also be used with a hash:
|
|
24
|
+
#
|
|
25
|
+
# ds.where("name > :a", :a=>"A")
|
|
26
|
+
# # SELECT * FROM table WHERE (name > 'A')
|
|
27
|
+
#
|
|
28
|
+
# This extension also allows the use of a plain string passed to Dataset#update:
|
|
29
|
+
#
|
|
30
|
+
# ds.update("column = column + 1")
|
|
31
|
+
# # UPDATE table SET column = column + 1
|
|
32
|
+
#
|
|
33
|
+
# Related module: Sequel::Dataset::AutoLiteralStrings
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
module Sequel
|
|
37
|
+
class Dataset
|
|
38
|
+
module AutoLiteralStrings
|
|
39
|
+
# Treat plain strings as literal strings, and arrays where the first element
|
|
40
|
+
# is a string as a literal string with placeholders.
|
|
41
|
+
def filter_expr(expr = nil)
|
|
42
|
+
case expr
|
|
43
|
+
when LiteralString
|
|
44
|
+
super
|
|
45
|
+
when String
|
|
46
|
+
super(LiteralString.new(expr))
|
|
47
|
+
when Array
|
|
48
|
+
if (sexpr = expr.first).is_a?(String)
|
|
49
|
+
super(SQL::PlaceholderLiteralString.new(sexpr, expr[1..-1], true))
|
|
50
|
+
else
|
|
51
|
+
super
|
|
52
|
+
end
|
|
53
|
+
else
|
|
54
|
+
super
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Treat plain strings as literal strings.
|
|
59
|
+
def update_sql(values=OPTS)
|
|
60
|
+
case values
|
|
61
|
+
when LiteralString
|
|
62
|
+
super
|
|
63
|
+
when String
|
|
64
|
+
super(LiteralString.new(values))
|
|
65
|
+
else
|
|
66
|
+
super
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
register_extension(:auto_literal_strings, AutoLiteralStrings)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
@@ -56,7 +56,7 @@ module Sequel
|
|
|
56
56
|
datasets = datasets.collect{|ta, ds| [ta, ds, ds.row_proc]}
|
|
57
57
|
# Use the manually set graph aliases, if any, otherwise
|
|
58
58
|
# use the ones automatically created by .graph
|
|
59
|
-
column_aliases = @opts[:graph_aliases] || @opts[:graph][:column_aliases]
|
|
59
|
+
column_aliases = @opts[:graph_aliases] || @opts[:graph][:column_aliases] # SEQUEL5: Remove :graph_aliases support
|
|
60
60
|
fetch_rows(sql) do |r|
|
|
61
61
|
graph = {}
|
|
62
62
|
# Create the sub hashes, one per table
|
|
@@ -144,7 +144,7 @@ module Sequel
|
|
|
144
144
|
|
|
145
145
|
# Set the method to call on identifiers going into the database for this dataset
|
|
146
146
|
def identifier_input_method=(v)
|
|
147
|
-
raise_if_frozen!("identifier_input_method=")
|
|
147
|
+
raise_if_frozen!(%w"identifier_input_method= with_identifier_input_method")
|
|
148
148
|
skip_symbol_cache!
|
|
149
149
|
@opts[:identifier_input_method] = v
|
|
150
150
|
end
|
|
@@ -157,7 +157,7 @@ module Sequel
|
|
|
157
157
|
|
|
158
158
|
# Set the method to call on identifiers coming the database for this dataset
|
|
159
159
|
def identifier_output_method=(v)
|
|
160
|
-
raise_if_frozen!("identifier_output_method=")
|
|
160
|
+
raise_if_frozen!(%w"identifier_output_method= with_identifier_output_method")
|
|
161
161
|
@opts[:identifier_output_method] = v
|
|
162
162
|
end
|
|
163
163
|
|
|
@@ -448,9 +448,9 @@ module Sequel
|
|
|
448
448
|
@directory = directory
|
|
449
449
|
@allow_missing_migration_files = opts[:allow_missing_migration_files]
|
|
450
450
|
@files = get_migration_files
|
|
451
|
-
schema, table = @db.send(:schema_and_table, opts[:table]
|
|
451
|
+
schema, table = @db.send(:schema_and_table, opts[:table] || default_schema_table)
|
|
452
452
|
@table = schema ? Sequel::SQL::QualifiedIdentifier.new(schema, table) : table
|
|
453
|
-
@column = opts[:column] ||
|
|
453
|
+
@column = opts[:column] || default_schema_column
|
|
454
454
|
@ds = schema_dataset
|
|
455
455
|
@use_transactions = opts[:use_transactions]
|
|
456
456
|
end
|
|
@@ -482,7 +482,7 @@ module Sequel
|
|
|
482
482
|
def load_migration_file(file)
|
|
483
483
|
n = Migration.descendants.length
|
|
484
484
|
load(file)
|
|
485
|
-
raise Error, "Migration file not containing a single migration detected" unless n + 1 == Migration.descendants.length
|
|
485
|
+
raise Error, "Migration file #{file.inspect} not containing a single migration detected" unless n + 1 == Migration.descendants.length
|
|
486
486
|
end
|
|
487
487
|
|
|
488
488
|
# Remove all migration classes. Done by the migrator to ensure that
|
|
@@ -507,6 +507,8 @@ module Sequel
|
|
|
507
507
|
class IntegerMigrator < Migrator
|
|
508
508
|
DEFAULT_SCHEMA_COLUMN = :version
|
|
509
509
|
DEFAULT_SCHEMA_TABLE = :schema_info
|
|
510
|
+
Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SCHEMA_COLUMN)
|
|
511
|
+
Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SCHEMA_TABLE)
|
|
510
512
|
|
|
511
513
|
Error = Migrator::Error
|
|
512
514
|
|
|
@@ -574,6 +576,16 @@ module Sequel
|
|
|
574
576
|
ds.get(column) || 0
|
|
575
577
|
end
|
|
576
578
|
|
|
579
|
+
# The default column storing schema version.
|
|
580
|
+
def default_schema_column
|
|
581
|
+
:version
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
# The default table storing schema version.
|
|
585
|
+
def default_schema_table
|
|
586
|
+
:schema_info
|
|
587
|
+
end
|
|
588
|
+
|
|
577
589
|
# Returns any found migration files in the supplied directory.
|
|
578
590
|
def get_migration_files
|
|
579
591
|
files = []
|
|
@@ -656,6 +668,8 @@ module Sequel
|
|
|
656
668
|
class TimestampMigrator < Migrator
|
|
657
669
|
DEFAULT_SCHEMA_COLUMN = :filename
|
|
658
670
|
DEFAULT_SCHEMA_TABLE = :schema_migrations
|
|
671
|
+
Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SCHEMA_COLUMN)
|
|
672
|
+
Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SCHEMA_TABLE)
|
|
659
673
|
|
|
660
674
|
Error = Migrator::Error
|
|
661
675
|
|
|
@@ -699,7 +713,7 @@ module Sequel
|
|
|
699
713
|
# Convert the schema_info table to the new schema_migrations table format,
|
|
700
714
|
# using the version of the schema_info table and the current migration files.
|
|
701
715
|
def convert_from_schema_info
|
|
702
|
-
v = db[
|
|
716
|
+
v = db[:schema_info].get(:version)
|
|
703
717
|
ds = db.from(table)
|
|
704
718
|
files.each do |path|
|
|
705
719
|
f = File.basename(path)
|
|
@@ -709,6 +723,16 @@ module Sequel
|
|
|
709
723
|
end
|
|
710
724
|
end
|
|
711
725
|
|
|
726
|
+
# The default column storing migration filenames.
|
|
727
|
+
def default_schema_column
|
|
728
|
+
:filename
|
|
729
|
+
end
|
|
730
|
+
|
|
731
|
+
# The default table storing migration filenames.
|
|
732
|
+
def default_schema_table
|
|
733
|
+
:schema_migrations
|
|
734
|
+
end
|
|
735
|
+
|
|
712
736
|
# Returns filenames of all applied migrations
|
|
713
737
|
def get_applied_migrations
|
|
714
738
|
am = ds.select_order_map(column)
|
|
@@ -163,7 +163,7 @@ END_MIG
|
|
|
163
163
|
end
|
|
164
164
|
end
|
|
165
165
|
|
|
166
|
-
# Recreate the column in the passed Schema::
|
|
166
|
+
# Recreate the column in the passed Schema::CreateTableGenerator from the given name and parsed database schema.
|
|
167
167
|
def recreate_column(name, schema, gen, options)
|
|
168
168
|
if options[:single_pk] && schema_autoincrementing_primary_key?(schema)
|
|
169
169
|
type_hash = options[:same_db] ? {:type=>schema[:db_type]} : column_schema_to_ruby_type(schema)
|
|
@@ -242,7 +242,7 @@ END_MIG
|
|
|
242
242
|
end
|
|
243
243
|
end
|
|
244
244
|
|
|
245
|
-
# Return a Schema::
|
|
245
|
+
# Return a Schema::CreateTableGenerator object that will recreate the
|
|
246
246
|
# table's schema. Takes the same options as dump_schema_migration.
|
|
247
247
|
def dump_table_generator(table, options=OPTS)
|
|
248
248
|
s = schema(table, options).dup
|
|
@@ -304,7 +304,7 @@ END_MIG
|
|
|
304
304
|
gen.dump_indexes(meth=>table, :ignore_errors=>!options[:same_db])
|
|
305
305
|
end
|
|
306
306
|
|
|
307
|
-
# Convert the parsed index information into options to the
|
|
307
|
+
# Convert the parsed index information into options to the CreateTableGenerator's index method.
|
|
308
308
|
def index_to_generator_opts(table, name, index_opts, options=OPTS)
|
|
309
309
|
h = {}
|
|
310
310
|
if options[:index_names] != false && default_index_name(table, index_opts[:columns]) != name.to_s
|
|
@@ -380,7 +380,7 @@ END_MIG
|
|
|
380
380
|
end
|
|
381
381
|
|
|
382
382
|
module Schema
|
|
383
|
-
class
|
|
383
|
+
class CreateTableGenerator
|
|
384
384
|
# Dump this generator's columns to a string that could be evaled inside
|
|
385
385
|
# another instance to represent the same columns
|
|
386
386
|
def dump_columns
|
|
@@ -26,7 +26,9 @@
|
|
|
26
26
|
#
|
|
27
27
|
module Sequel
|
|
28
28
|
module Sequel3DatasetMethods
|
|
29
|
-
COMMA =
|
|
29
|
+
COMMA = ', '
|
|
30
|
+
Sequel::Deprecation.deprecate_constant(self, :COMMA)
|
|
31
|
+
|
|
30
32
|
# Change the database for this dataset.
|
|
31
33
|
def db=(v)
|
|
32
34
|
raise_if_frozen!("db=")
|
|
@@ -119,8 +121,8 @@ module Sequel
|
|
|
119
121
|
n = naked
|
|
120
122
|
cols = n.columns
|
|
121
123
|
csv = String.new
|
|
122
|
-
csv << "#{cols.join(
|
|
123
|
-
n.each{|r| csv << "#{cols.collect{|c| r[c]}.join(
|
|
124
|
+
csv << "#{cols.join(', ')}\r\n" if include_column_titles
|
|
125
|
+
n.each{|r| csv << "#{cols.collect{|c| r[c]}.join(', ')}\r\n"}
|
|
124
126
|
csv
|
|
125
127
|
end
|
|
126
128
|
end
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
#
|
|
19
19
|
# Related module: Sequel::SetOverrides
|
|
20
20
|
|
|
21
|
+
Sequel::Deprecation.deprecate("The set_overrides extension", "Please consider maintaining it yourself as an external sequel extension if you want to continue using it")
|
|
22
|
+
|
|
21
23
|
#
|
|
22
24
|
module Sequel
|
|
23
25
|
module SetOverrides
|
|
@@ -46,9 +46,9 @@ module Sequel
|
|
|
46
46
|
def complex_expression_sql_append(sql, op, args)
|
|
47
47
|
case op
|
|
48
48
|
when :IN, :"NOT IN"
|
|
49
|
-
vals = args
|
|
49
|
+
vals = args[1]
|
|
50
50
|
if vals.is_a?(Array) && vals.any?(&:nil?)
|
|
51
|
-
cols = args
|
|
51
|
+
cols = args[0]
|
|
52
52
|
vals = vals.compact
|
|
53
53
|
c = Sequel::SQL::BooleanExpression
|
|
54
54
|
if op == :IN
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# These modifies virtual row blocks so that you can pass a block
|
|
4
|
+
# when calling a method to change the behavior. It only exists
|
|
5
|
+
# for backwards compatibility with previous Sequel versions, and
|
|
6
|
+
# is not recommended for new applications.
|
|
7
|
+
#
|
|
8
|
+
# To load the extension:
|
|
9
|
+
#
|
|
10
|
+
# Sequel.extension :virtual_row_method_block
|
|
11
|
+
|
|
12
|
+
#
|
|
13
|
+
module Sequel
|
|
14
|
+
module SQL
|
|
15
|
+
class VirtualRow < BasicObject
|
|
16
|
+
include(Module.new do
|
|
17
|
+
# Handle blocks passed to methods and change the behavior.
|
|
18
|
+
def method_missing(m, *args, &block)
|
|
19
|
+
if block
|
|
20
|
+
if args.empty?
|
|
21
|
+
Function.new(m)
|
|
22
|
+
else
|
|
23
|
+
case args.shift
|
|
24
|
+
when :*
|
|
25
|
+
Function.new(m, *args).*
|
|
26
|
+
when :distinct
|
|
27
|
+
Function.new(m, *args).distinct
|
|
28
|
+
when :over
|
|
29
|
+
opts = args.shift || OPTS
|
|
30
|
+
f = Function.new(m, *::Kernel.Array(opts[:args]))
|
|
31
|
+
f = f.* if opts[:*]
|
|
32
|
+
f.over(opts)
|
|
33
|
+
else
|
|
34
|
+
Kernel.raise(Error, 'unsupported VirtualRow method argument used with block')
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
else
|
|
38
|
+
super
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
data/lib/sequel/model.rb
CHANGED
|
@@ -33,11 +33,13 @@ module Sequel
|
|
|
33
33
|
|
|
34
34
|
# Class methods added to model that call the method of the same name on the dataset
|
|
35
35
|
DATASET_METHODS = (Dataset::ACTION_METHODS + Dataset::QUERY_METHODS + [:each_server, :where_all, :where_each, :where_single_value]) -
|
|
36
|
-
[:and, :or, :[], :columns, :columns!, :delete, :update, :add_graph_aliases
|
|
36
|
+
[:and, :or, :[], :columns, :columns!, :delete, :update, :add_graph_aliases] # SEQUEL5: Remove set_graph_aliases
|
|
37
37
|
|
|
38
38
|
# Boolean settings that can be modified at the global, class, or instance level.
|
|
39
39
|
BOOLEAN_SETTINGS = [:typecast_empty_string_to_nil, :typecast_on_assignment, :strict_param_setting, \
|
|
40
|
-
:raise_on_save_failure, :raise_on_typecast_failure, :require_modification, :
|
|
40
|
+
:raise_on_save_failure, :raise_on_typecast_failure, :require_modification, :use_transactions,
|
|
41
|
+
:use_after_commit_rollback # SEQUEL5: Remove
|
|
42
|
+
]
|
|
41
43
|
|
|
42
44
|
# Hooks that are called before an action. Can return false to not do the action. When
|
|
43
45
|
# overriding these, it is recommended to call +super+ as the last line of your method,
|
|
@@ -64,14 +66,16 @@ module Sequel
|
|
|
64
66
|
# Class instance variables that are inherited in subclasses. If the value is <tt>:dup</tt>, dup is called
|
|
65
67
|
# on the superclass's instance variable when creating the instance variable in the subclass.
|
|
66
68
|
# If the value is +nil+, the superclass's instance variable is used directly in the subclass.
|
|
67
|
-
INHERITED_INSTANCE_VARIABLES = {
|
|
69
|
+
INHERITED_INSTANCE_VARIABLES = {
|
|
70
|
+
:@allowed_columns=>:dup, # SEQUEL5: Remove
|
|
68
71
|
:@dataset_method_modules=>:dup, :@primary_key=>nil, :@use_transactions=>nil,
|
|
69
72
|
:@raise_on_save_failure=>nil, :@require_modification=>nil, :@restrict_primary_key=>nil,
|
|
70
73
|
:@simple_pk=>nil, :@simple_table=>nil, :@strict_param_setting=>nil,
|
|
71
74
|
:@typecast_empty_string_to_nil=>nil, :@typecast_on_assignment=>nil,
|
|
72
75
|
:@raise_on_typecast_failure=>nil, :@plugins=>:dup, :@setter_methods=>nil,
|
|
73
76
|
:@use_after_commit_rollback=>nil, :@fast_pk_lookup_sql=>nil,
|
|
74
|
-
:@fast_instance_delete_sql=>nil,
|
|
77
|
+
:@fast_instance_delete_sql=>nil,
|
|
78
|
+
:@finders=>:dup, :@finder_loaders=>:dup, # SEQUEL5: Remove
|
|
75
79
|
:@db=>nil, :@default_set_fields_options=>:dup, :@require_valid_table=>nil,
|
|
76
80
|
:@cache_anonymous_models=>nil, :@dataset_module_class=>nil}
|
|
77
81
|
|
|
@@ -84,7 +88,7 @@ module Sequel
|
|
|
84
88
|
# (i.e. it ends with =).
|
|
85
89
|
SETTER_METHOD_REGEXP = /=\z/
|
|
86
90
|
|
|
87
|
-
@allowed_columns = nil
|
|
91
|
+
@allowed_columns = nil # SEQUEL5: Remove
|
|
88
92
|
@cache_anonymous_models = true
|
|
89
93
|
@db = nil
|
|
90
94
|
@db_schema = nil
|
|
@@ -92,8 +96,8 @@ module Sequel
|
|
|
92
96
|
@dataset_method_modules = []
|
|
93
97
|
@default_eager_limit_strategy = true
|
|
94
98
|
@default_set_fields_options = {}
|
|
95
|
-
@finders = {}
|
|
96
|
-
@finder_loaders = {}
|
|
99
|
+
@finders = {} # SEQUEL5: Remove
|
|
100
|
+
@finder_loaders = {} # SEQUEL5: Remove
|
|
97
101
|
@overridable_methods_module = nil
|
|
98
102
|
@fast_pk_lookup_sql = nil
|
|
99
103
|
@fast_instance_delete_sql = nil
|