sequel 4.39.0 → 4.40.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +34 -0
- data/README.rdoc +8 -4
- data/doc/active_record.rdoc +1 -1
- data/doc/advanced_associations.rdoc +7 -7
- data/doc/association_basics.rdoc +7 -7
- data/doc/cheat_sheet.rdoc +5 -3
- data/doc/core_extensions.rdoc +3 -3
- data/doc/dataset_filtering.rdoc +1 -1
- data/doc/object_model.rdoc +16 -7
- data/doc/postgresql.rdoc +3 -3
- data/doc/querying.rdoc +3 -3
- data/doc/release_notes/4.40.0.txt +179 -0
- data/doc/security.rdoc +2 -1
- data/doc/sql.rdoc +34 -18
- data/doc/testing.rdoc +1 -0
- data/doc/virtual_rows.rdoc +11 -2
- data/lib/sequel/adapters/jdbc/derby.rb +7 -1
- data/lib/sequel/adapters/jdbc/h2.rb +15 -1
- data/lib/sequel/adapters/oracle.rb +9 -5
- data/lib/sequel/adapters/postgres.rb +0 -1
- data/lib/sequel/adapters/shared/cubrid.rb +11 -11
- data/lib/sequel/adapters/shared/db2.rb +4 -8
- data/lib/sequel/adapters/shared/mssql.rb +41 -28
- data/lib/sequel/adapters/shared/mysql.rb +9 -6
- data/lib/sequel/adapters/shared/oracle.rb +16 -5
- data/lib/sequel/adapters/shared/postgres.rb +84 -45
- data/lib/sequel/adapters/shared/sqlanywhere.rb +29 -15
- data/lib/sequel/adapters/shared/sqlite.rb +6 -6
- data/lib/sequel/core.rb +61 -10
- data/lib/sequel/database/connecting.rb +2 -1
- data/lib/sequel/database/features.rb +7 -0
- data/lib/sequel/database/query.rb +1 -1
- data/lib/sequel/database/schema_methods.rb +30 -3
- data/lib/sequel/database/transactions.rb +4 -2
- data/lib/sequel/dataset/actions.rb +1 -1
- data/lib/sequel/dataset/graph.rb +6 -1
- data/lib/sequel/dataset/query.rb +14 -7
- data/lib/sequel/dataset/sql.rb +2 -2
- data/lib/sequel/extensions/core_extensions.rb +2 -1
- data/lib/sequel/extensions/pg_row.rb +2 -2
- data/lib/sequel/extensions/s.rb +57 -0
- data/lib/sequel/extensions/set_overrides.rb +5 -1
- data/lib/sequel/extensions/sql_expr.rb +1 -0
- data/lib/sequel/extensions/symbol_aref.rb +71 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +41 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +35 -0
- data/lib/sequel/model/base.rb +3 -3
- data/lib/sequel/plugins/class_table_inheritance.rb +14 -3
- data/lib/sequel/plugins/column_select.rb +4 -2
- data/lib/sequel/plugins/dataset_associations.rb +12 -4
- data/lib/sequel/plugins/insert_returning_select.rb +1 -1
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +1 -1
- data/lib/sequel/plugins/prepared_statements.rb +1 -0
- data/lib/sequel/sql.rb +40 -8
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/firebird_spec.rb +3 -3
- data/spec/adapters/mssql_spec.rb +40 -40
- data/spec/adapters/mysql_spec.rb +5 -5
- data/spec/adapters/oracle_spec.rb +4 -4
- data/spec/adapters/postgres_spec.rb +135 -124
- data/spec/adapters/spec_helper.rb +1 -0
- data/spec/adapters/sqlite_spec.rb +6 -6
- data/spec/core/dataset_spec.rb +2 -2
- data/spec/core/expression_filters_spec.rb +43 -2
- data/spec/core/schema_spec.rb +35 -1
- data/spec/core_extensions_spec.rb +27 -0
- data/spec/extensions/class_table_inheritance_spec.rb +8 -0
- data/spec/extensions/column_select_spec.rb +8 -0
- data/spec/extensions/core_refinements_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +9 -0
- data/spec/extensions/insert_returning_select_spec.rb +20 -0
- data/spec/extensions/prepared_statements_spec.rb +7 -0
- data/spec/extensions/s_spec.rb +60 -0
- data/spec/extensions/symbol_aref_refinement_spec.rb +28 -0
- data/spec/extensions/symbol_as_refinement_spec.rb +21 -0
- data/spec/integration/associations_test.rb +62 -57
- data/spec/integration/dataset_test.rb +54 -54
- data/spec/integration/eager_loader_test.rb +7 -7
- data/spec/integration/plugin_test.rb +20 -20
- data/spec/integration/prepared_statement_test.rb +1 -1
- data/spec/integration/schema_test.rb +21 -0
- data/spec/integration/spec_helper.rb +1 -0
- metadata +12 -2
@@ -135,13 +135,14 @@ module Sequel
|
|
135
135
|
#
|
136
136
|
# # in file sequel/adapters/shared/mydb.rb
|
137
137
|
# module Sequel::MyDB
|
138
|
-
# Sequel::Database.set_shared_adapter_scheme :mydb,
|
138
|
+
# Sequel::Database.set_shared_adapter_scheme :mydb, self
|
139
139
|
#
|
140
140
|
# def self.mock_adapter_setup(db)
|
141
141
|
# # ...
|
142
142
|
# end
|
143
143
|
#
|
144
144
|
# module DatabaseMethods
|
145
|
+
# extend Sequel::Database::ResetIdentifierMangling
|
145
146
|
# # ...
|
146
147
|
# end
|
147
148
|
#
|
@@ -108,6 +108,13 @@ module Sequel
|
|
108
108
|
|
109
109
|
private
|
110
110
|
|
111
|
+
# Whether the database supports adding primary key constraints on NULLable columns,
|
112
|
+
# automatically making them NOT NULL. If false, the columns must be set NOT NULL
|
113
|
+
# before the primary key constraint is added.
|
114
|
+
def can_add_primary_key_constraint_on_nullable_columns?
|
115
|
+
true
|
116
|
+
end
|
117
|
+
|
111
118
|
# Whether the database supports combining multiple alter table
|
112
119
|
# operations into a single query, false by default.
|
113
120
|
def supports_combining_alter_table_ops?
|
@@ -159,7 +159,7 @@ module Sequel
|
|
159
159
|
end
|
160
160
|
|
161
161
|
cols = schema_parse_table(table_name, opts)
|
162
|
-
raise(Error,
|
162
|
+
raise(Error, "schema parsing returned no columns, table #{table_name.inspect} probably doesn't exist") if cols.nil? || cols.empty?
|
163
163
|
|
164
164
|
primary_keys = 0
|
165
165
|
auto_increment_set = false
|
@@ -422,7 +422,15 @@ module Sequel
|
|
422
422
|
|
423
423
|
# Apply the operations in the given generator to the table given by name.
|
424
424
|
def apply_alter_table_generator(name, generator)
|
425
|
-
|
425
|
+
ops = generator.operations
|
426
|
+
|
427
|
+
unless can_add_primary_key_constraint_on_nullable_columns?
|
428
|
+
if add_pk = ops.find{|op| op[:op] == :add_constraint && op[:type] == :primary_key}
|
429
|
+
ops = add_pk[:columns].map{|column| {:op => :set_column_null, :name => column, :null => false}} + ops
|
430
|
+
end
|
431
|
+
end
|
432
|
+
|
433
|
+
apply_alter_table(name, ops)
|
426
434
|
end
|
427
435
|
|
428
436
|
# The class used for alter_table generators.
|
@@ -558,8 +566,16 @@ module Sequel
|
|
558
566
|
# Add null/not null SQL fragment to column creation SQL.
|
559
567
|
def column_definition_null_sql(sql, column)
|
560
568
|
null = column.fetch(:null, column[:allow_null])
|
561
|
-
|
562
|
-
|
569
|
+
if null.nil? && !can_add_primary_key_constraint_on_nullable_columns? && column[:primary_key]
|
570
|
+
null = false
|
571
|
+
end
|
572
|
+
|
573
|
+
case null
|
574
|
+
when false
|
575
|
+
sql << NOT_NULL
|
576
|
+
when true
|
577
|
+
sql << NULL
|
578
|
+
end
|
563
579
|
end
|
564
580
|
|
565
581
|
# Add primary key SQL fragment to column creation SQL.
|
@@ -702,6 +718,17 @@ module Sequel
|
|
702
718
|
end
|
703
719
|
end
|
704
720
|
end
|
721
|
+
|
722
|
+
unless can_add_primary_key_constraint_on_nullable_columns?
|
723
|
+
if pk = generator.constraints.find{|op| op[:type] == :primary_key}
|
724
|
+
pk[:columns].each do |column|
|
725
|
+
if matched_column = generator.columns.find{|gc| gc[:name] == column}
|
726
|
+
matched_column[:null] = false
|
727
|
+
end
|
728
|
+
end
|
729
|
+
end
|
730
|
+
end
|
731
|
+
|
705
732
|
"#{create_table_prefix_sql(name, options)} (#{column_list_sql(generator)})"
|
706
733
|
end
|
707
734
|
|
@@ -80,7 +80,7 @@ module Sequel
|
|
80
80
|
def rollback_checker(opts=OPTS)
|
81
81
|
synchronize(opts[:server]) do |conn|
|
82
82
|
raise Error, "not in a transaction" unless t = _trans(conn)
|
83
|
-
t[:rollback_checker] ||= proc{t[:rolled_back]}
|
83
|
+
t[:rollback_checker] ||= proc{Sequel.synchronize{t[:rolled_back]}}
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
@@ -382,7 +382,9 @@ module Sequel
|
|
382
382
|
callbacks = transaction_hooks(conn, committed)
|
383
383
|
|
384
384
|
if transaction_finished?(conn)
|
385
|
-
@transactions[conn]
|
385
|
+
h = @transactions[conn]
|
386
|
+
rolled_back = !committed
|
387
|
+
Sequel.synchronize{h[:rolled_back] = rolled_back}
|
386
388
|
Sequel.synchronize{@transactions.delete(conn)}
|
387
389
|
end
|
388
390
|
|
@@ -10,7 +10,7 @@ module Sequel
|
|
10
10
|
# ---------------------
|
11
11
|
|
12
12
|
# Action methods defined by Sequel that execute code on the database.
|
13
|
-
ACTION_METHODS = (<<-METHS).split.map(&:to_sym)
|
13
|
+
ACTION_METHODS = (<<-METHS).split.map(&:to_sym).freeze
|
14
14
|
<< [] all avg count columns columns! delete each
|
15
15
|
empty? fetch_rows first first! get import insert interval last
|
16
16
|
map max min multi_insert paged_each range select_hash select_hash_groups select_map select_order_map
|
data/lib/sequel/dataset/graph.rb
CHANGED
@@ -246,8 +246,13 @@ module Sequel
|
|
246
246
|
# double embedded underscores which would be considered an implicit qualified identifier
|
247
247
|
# if not wrapped in an SQL::Identifier.
|
248
248
|
def qualifier_from_alias_symbol(aliaz, identifier)
|
249
|
-
identifier = identifier.column if identifier.is_a?(SQL::QualifiedIdentifier)
|
250
249
|
case identifier
|
250
|
+
when SQL::QualifiedIdentifier
|
251
|
+
if identifier.column.is_a?(String)
|
252
|
+
Sequel.identifier(aliaz)
|
253
|
+
else
|
254
|
+
aliaz
|
255
|
+
end
|
251
256
|
when SQL::Identifier
|
252
257
|
Sequel.identifier(aliaz)
|
253
258
|
else
|
data/lib/sequel/dataset/query.rb
CHANGED
@@ -18,23 +18,23 @@ module Sequel
|
|
18
18
|
|
19
19
|
# Which options don't affect the SQL generation. Used by simple_select_all?
|
20
20
|
# to determine if this is a simple SELECT * FROM table.
|
21
|
-
NON_SQL_OPTIONS = [:server, :
|
21
|
+
NON_SQL_OPTIONS = [:server, :graph, :eager, :eager_graph, :graph_aliases].freeze
|
22
22
|
|
23
23
|
# These symbols have _join methods created (e.g. inner_join) that
|
24
24
|
# call join_table with the symbol, passing along the arguments and
|
25
25
|
# block from the method call.
|
26
|
-
CONDITIONED_JOIN_TYPES = [:inner, :full_outer, :right_outer, :left_outer, :full, :right, :left]
|
26
|
+
CONDITIONED_JOIN_TYPES = [:inner, :full_outer, :right_outer, :left_outer, :full, :right, :left].freeze
|
27
27
|
|
28
28
|
# These symbols have _join methods created (e.g. natural_join).
|
29
29
|
# They accept a table argument and options hash which is passed to join_table,
|
30
30
|
# and they raise an error if called with a block.
|
31
|
-
UNCONDITIONED_JOIN_TYPES = [:natural, :natural_left, :natural_right, :natural_full, :cross]
|
31
|
+
UNCONDITIONED_JOIN_TYPES = [:natural, :natural_left, :natural_right, :natural_full, :cross].freeze
|
32
32
|
|
33
33
|
# All methods that return modified datasets with a joined table added.
|
34
|
-
JOIN_METHODS = (CONDITIONED_JOIN_TYPES + UNCONDITIONED_JOIN_TYPES).map{|x| "#{x}_join".to_sym} + [:join, :join_table]
|
34
|
+
JOIN_METHODS = ((CONDITIONED_JOIN_TYPES + UNCONDITIONED_JOIN_TYPES).map{|x| "#{x}_join".to_sym} + [:join, :join_table]).freeze
|
35
35
|
|
36
36
|
# Methods that return modified datasets
|
37
|
-
QUERY_METHODS = (<<-METHS).split.map(&:to_sym) + JOIN_METHODS
|
37
|
+
QUERY_METHODS = ((<<-METHS).split.map(&:to_sym) + JOIN_METHODS).freeze
|
38
38
|
add_graph_aliases and distinct except exclude exclude_having exclude_where
|
39
39
|
filter for_update from from_self graph grep group group_and_count group_append group_by having intersect invert
|
40
40
|
limit lock_style naked offset or order order_append order_by order_more order_prepend qualify
|
@@ -221,7 +221,8 @@ module Sequel
|
|
221
221
|
# # SELECT * FROM (SELECT id, name FROM items ORDER BY name) AS foo(c1, c2)
|
222
222
|
def from_self(opts=OPTS)
|
223
223
|
fs = {}
|
224
|
-
|
224
|
+
non_sql = non_sql_options
|
225
|
+
@opts.keys.each{|k| fs[k] = nil unless non_sql.include?(k)}
|
225
226
|
clone(fs).from(opts[:alias] ? as(opts[:alias], opts[:column_aliases]) : self)
|
226
227
|
end
|
227
228
|
|
@@ -1043,7 +1044,8 @@ module Sequel
|
|
1043
1044
|
# SELECT * FROM table
|
1044
1045
|
# SELECT table.* FROM table
|
1045
1046
|
def simple_select_all?
|
1046
|
-
|
1047
|
+
non_sql = non_sql_options
|
1048
|
+
o = @opts.reject{|k,v| v.nil? || non_sql.include?(k)}
|
1047
1049
|
if (f = o[:from]) && f.length == 1 && (f.first.is_a?(Symbol) || f.first.is_a?(SQL::AliasedExpression))
|
1048
1050
|
case o.length
|
1049
1051
|
when 1
|
@@ -1161,6 +1163,11 @@ module Sequel
|
|
1161
1163
|
server?(:default)
|
1162
1164
|
end
|
1163
1165
|
|
1166
|
+
# Dataset options that do not affect the generated SQL.
|
1167
|
+
def non_sql_options
|
1168
|
+
NON_SQL_OPTIONS
|
1169
|
+
end
|
1170
|
+
|
1164
1171
|
# Treat the +block+ as a virtual_row block if not +nil+ and
|
1165
1172
|
# add the resulting columns to the +columns+ array (modifies +columns+).
|
1166
1173
|
def virtual_row_columns(columns, block)
|
data/lib/sequel/dataset/sql.rb
CHANGED
@@ -761,8 +761,8 @@ module Sequel
|
|
761
761
|
#
|
762
762
|
# ds.split_qualifiers(:s) # ['s']
|
763
763
|
# ds.split_qualifiers(:t__s) # ['t', 's']
|
764
|
-
# ds.split_qualifiers(Sequel
|
765
|
-
# ds.split_qualifiers(Sequel
|
764
|
+
# ds.split_qualifiers(Sequel[:d][:t__s]) # ['d', 't', 's']
|
765
|
+
# ds.split_qualifiers(Sequel[:h__d][:t__s]) # ['h', 'd', 't', 's']
|
766
766
|
def split_qualifiers(table_name, *args)
|
767
767
|
case table_name
|
768
768
|
when SQL::QualifiedIdentifier
|
@@ -12,6 +12,8 @@ def Sequel.core_extensions?
|
|
12
12
|
true
|
13
13
|
end
|
14
14
|
|
15
|
+
Sequel.extension :symbol_as
|
16
|
+
|
15
17
|
# Sequel extends +Array+ to add methods to implement the SQL DSL.
|
16
18
|
# Most of these methods require that the array not be empty and that it
|
17
19
|
# must consist solely of other arrays that have exactly two elements.
|
@@ -195,7 +197,6 @@ end
|
|
195
197
|
|
196
198
|
# Sequel extends +Symbol+ to add methods to implement the SQL DSL.
|
197
199
|
class Symbol
|
198
|
-
include Sequel::SQL::AliasMethods
|
199
200
|
include Sequel::SQL::CastMethods
|
200
201
|
include Sequel::SQL::OrderMethods
|
201
202
|
include Sequel::SQL::BooleanMethods
|
@@ -432,7 +432,7 @@ module Sequel
|
|
432
432
|
|
433
433
|
# Get basic oid information for the composite type.
|
434
434
|
ds = from(:pg_type).
|
435
|
-
select
|
435
|
+
select{[pg_type[:oid], :typrelid, :typarray]}.
|
436
436
|
where([[:typtype, 'c'], [:typname, type_name.to_s]])
|
437
437
|
if type_schema
|
438
438
|
ds = ds.join(:pg_namespace, [[:oid, :typnamespace], [:nspname, type_schema.to_s]])
|
@@ -454,7 +454,7 @@ module Sequel
|
|
454
454
|
where{attnum > 0}.
|
455
455
|
exclude(:attisdropped).
|
456
456
|
order(:attnum).
|
457
|
-
select_map
|
457
|
+
select_map{[:attname, Sequel.case({0=>:atttypid}, pg_type[:typbasetype], pg_type[:typbasetype]).as(:atttypid)]}
|
458
458
|
if res.empty?
|
459
459
|
raise Error, "no columns for row type #{db_type.inspect} in database"
|
460
460
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
#
|
3
|
+
# The s extension adds Sequel::S, a module containing a private #S
|
4
|
+
# method that calls Sequel.expr. It's designed as a shortcut so
|
5
|
+
# that instead of:
|
6
|
+
#
|
7
|
+
# Sequel.expr(:column) + 1
|
8
|
+
# # or
|
9
|
+
# Sequel.expr{column + 1}
|
10
|
+
#
|
11
|
+
# you can just write:
|
12
|
+
#
|
13
|
+
# S(:column) + 1
|
14
|
+
# # or
|
15
|
+
# S{column + 1}
|
16
|
+
#
|
17
|
+
# To load the extension:
|
18
|
+
#
|
19
|
+
# Sequel.extension :s
|
20
|
+
#
|
21
|
+
# Then you can include the Sequel::S module into whatever classes or
|
22
|
+
# objects you care about:
|
23
|
+
#
|
24
|
+
# Sequel::Model.send(:include, Sequel::S) # available in model instance methods
|
25
|
+
# Sequel::Model.extend(Sequel::S) # available in model class methods
|
26
|
+
# Sequel::Dataset.send(:include, Sequel::S) # available in dataset methods
|
27
|
+
#
|
28
|
+
# or just into Object if you want it available everywhere:
|
29
|
+
#
|
30
|
+
# Object.send(:include, Sequel::SQL)
|
31
|
+
#
|
32
|
+
# If you are using Ruby 2+, and you would like to use refinements, you
|
33
|
+
# can use Sequel::S as a refinement, in which case the private #S method
|
34
|
+
# will be available on all objects while the refinement is active.
|
35
|
+
#
|
36
|
+
# using Sequel::S
|
37
|
+
#
|
38
|
+
# S(:column) + 1
|
39
|
+
#
|
40
|
+
# Related module: Sequel::S
|
41
|
+
|
42
|
+
|
43
|
+
#
|
44
|
+
module Sequel::S
|
45
|
+
private
|
46
|
+
|
47
|
+
# Delegate to Sequel.expr
|
48
|
+
def S(*a, &block)
|
49
|
+
Sequel.expr(*a, &block)
|
50
|
+
end
|
51
|
+
|
52
|
+
if RUBY_VERSION >= '2.0.0'
|
53
|
+
refine Object do
|
54
|
+
include Sequel::S
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -21,7 +21,6 @@
|
|
21
21
|
#
|
22
22
|
module Sequel
|
23
23
|
module SetOverrides
|
24
|
-
Dataset::NON_SQL_OPTIONS.concat([:defaults, :overrides])
|
25
24
|
Dataset.def_mutation_method(:set_defaults, :set_overrides, :module=>self)
|
26
25
|
|
27
26
|
# Set overrides/defaults for insert hashes
|
@@ -70,6 +69,11 @@ module Sequel
|
|
70
69
|
vals = vals.merge(@opts[:overrides]) if @opts[:overrides]
|
71
70
|
vals
|
72
71
|
end
|
72
|
+
|
73
|
+
# Dataset options that do not affect the generated SQL.
|
74
|
+
def non_sql_options
|
75
|
+
super + [:defaults, :overrides]
|
76
|
+
end
|
73
77
|
end
|
74
78
|
|
75
79
|
Dataset.register_extension(:set_overrides, SetOverrides)
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
#
|
3
|
+
# The symbol_aref extension makes Symbol#[] support Symbol,
|
4
|
+
# Sequel::SQL::Indentifier, and Sequel::SQL::QualifiedIdentifier instances,
|
5
|
+
# returning appropriate Sequel::SQL::QualifiedIdentifier instances. It's
|
6
|
+
# designed as a shortcut so that instead of:
|
7
|
+
#
|
8
|
+
# Sequel[:table][:column] # table.column
|
9
|
+
#
|
10
|
+
# you can just write:
|
11
|
+
#
|
12
|
+
# :table[:column] # table.column
|
13
|
+
#
|
14
|
+
# To load the extension:
|
15
|
+
#
|
16
|
+
# Sequel.extension :symbol_aref
|
17
|
+
#
|
18
|
+
# If you are using Ruby 2+, and you would like to use refinements, there
|
19
|
+
# is a refinement version of this in the symbol_aref_refinement extension.
|
20
|
+
#
|
21
|
+
# If you are using the ruby18_symbol_extensions, and would like symbol_aref
|
22
|
+
# to take affect, load the symbol_aref extension after the
|
23
|
+
# ruby18_symbol_extensions.
|
24
|
+
#
|
25
|
+
# Related module: Sequel::SymbolAref
|
26
|
+
|
27
|
+
if RUBY_VERSION >= '2.0'
|
28
|
+
module Sequel::SymbolAref
|
29
|
+
def [](v)
|
30
|
+
case v
|
31
|
+
when Symbol, Sequel::SQL::Identifier, Sequel::SQL::QualifiedIdentifier
|
32
|
+
Sequel::SQL::QualifiedIdentifier.new(self, v)
|
33
|
+
else
|
34
|
+
super
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class Symbol
|
40
|
+
prepend Sequel::SymbolAref
|
41
|
+
end
|
42
|
+
else
|
43
|
+
class Symbol
|
44
|
+
if method_defined?(:[])
|
45
|
+
alias_method :aref_before_sequel, :[]
|
46
|
+
end
|
47
|
+
|
48
|
+
if RUBY_VERSION >= '1.9'
|
49
|
+
#
|
50
|
+
def [](v)
|
51
|
+
case v
|
52
|
+
when Symbol, Sequel::SQL::Identifier, Sequel::SQL::QualifiedIdentifier
|
53
|
+
Sequel::SQL::QualifiedIdentifier.new(self, v)
|
54
|
+
else
|
55
|
+
aref_before_sequel(v)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
else
|
59
|
+
def [](*v)
|
60
|
+
arg = v.first if v.length == 1
|
61
|
+
|
62
|
+
case arg
|
63
|
+
when Symbol, Sequel::SQL::Identifier, Sequel::SQL::QualifiedIdentifier
|
64
|
+
Sequel::SQL::QualifiedIdentifier.new(self, arg)
|
65
|
+
else
|
66
|
+
respond_to?(:aref_before_sequel) ? aref_before_sequel(*v) : super(*v)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
#
|
3
|
+
# The symbol_aref_refinement extension adds a refinement that makes
|
4
|
+
# Symbol#[] support Symbol, #Sequel::SQL::Indentifier, and
|
5
|
+
# Sequel::SQL::QualifiedIdentifier instances, returning appropriate
|
6
|
+
# Sequel::SQL::QualifiedIdentifier instances. It's designed as a
|
7
|
+
# shortcut so that instead of:
|
8
|
+
#
|
9
|
+
# Sequel[:table][:column] # table.column
|
10
|
+
#
|
11
|
+
# you can just write:
|
12
|
+
#
|
13
|
+
# :table[:column] # table.column
|
14
|
+
#
|
15
|
+
# To load the extension:
|
16
|
+
#
|
17
|
+
# Sequel.extension :symbol_aref_refinement
|
18
|
+
#
|
19
|
+
# To enable the refinement for the current file:
|
20
|
+
#
|
21
|
+
# using Sequel::SymbolAref
|
22
|
+
#
|
23
|
+
# If you would like this extension to be enabled globally instead
|
24
|
+
# of as a refinement, use the symbol_aref extension.
|
25
|
+
#
|
26
|
+
# Related module: Sequel::SymbolAref
|
27
|
+
|
28
|
+
raise(Sequel::Error, "Refinements require ruby 2.0.0 or greater") unless RUBY_VERSION >= '2.0.0'
|
29
|
+
|
30
|
+
module Sequel::SymbolAref
|
31
|
+
refine Symbol do
|
32
|
+
def [](v)
|
33
|
+
case v
|
34
|
+
when Symbol, Sequel::SQL::Identifier, Sequel::SQL::QualifiedIdentifier
|
35
|
+
Sequel::SQL::QualifiedIdentifier.new(self, v)
|
36
|
+
else
|
37
|
+
super
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|