sequel 4.47.0 → 4.48.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 +134 -0
- data/Rakefile +1 -1
- data/doc/release_notes/4.48.0.txt +293 -0
- data/lib/sequel/adapters/ado/access.rb +2 -1
- data/lib/sequel/adapters/do/postgres.rb +5 -2
- data/lib/sequel/adapters/ibmdb.rb +24 -7
- data/lib/sequel/adapters/jdbc.rb +36 -22
- data/lib/sequel/adapters/jdbc/db2.rb +12 -3
- data/lib/sequel/adapters/jdbc/derby.rb +4 -5
- data/lib/sequel/adapters/jdbc/oracle.rb +16 -2
- data/lib/sequel/adapters/jdbc/postgresql.rb +43 -18
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +9 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +11 -4
- data/lib/sequel/adapters/mock.rb +24 -19
- data/lib/sequel/adapters/mysql.rb +17 -16
- data/lib/sequel/adapters/mysql2.rb +4 -5
- data/lib/sequel/adapters/oracle.rb +5 -9
- data/lib/sequel/adapters/postgres.rb +89 -102
- data/lib/sequel/adapters/shared/db2.rb +22 -6
- data/lib/sequel/adapters/shared/mssql.rb +5 -4
- data/lib/sequel/adapters/shared/mysql.rb +75 -24
- data/lib/sequel/adapters/shared/postgres.rb +196 -94
- data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
- data/lib/sequel/adapters/shared/sqlite.rb +72 -82
- data/lib/sequel/adapters/sqlanywhere.rb +4 -1
- data/lib/sequel/adapters/sqlite.rb +5 -3
- data/lib/sequel/adapters/swift/postgres.rb +5 -2
- data/lib/sequel/adapters/tinytds.rb +0 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -1
- data/lib/sequel/adapters/utils/pg_types.rb +2 -76
- data/lib/sequel/core.rb +2 -2
- data/lib/sequel/database/connecting.rb +5 -5
- data/lib/sequel/database/dataset.rb +6 -3
- data/lib/sequel/database/misc.rb +1 -1
- data/lib/sequel/database/query.rb +3 -0
- data/lib/sequel/database/schema_methods.rb +1 -1
- data/lib/sequel/dataset/actions.rb +18 -10
- data/lib/sequel/dataset/graph.rb +1 -1
- data/lib/sequel/dataset/misc.rb +1 -0
- data/lib/sequel/dataset/prepared_statements.rb +3 -3
- data/lib/sequel/dataset/query.rb +19 -8
- data/lib/sequel/extensions/core_extensions.rb +4 -1
- data/lib/sequel/extensions/duplicate_columns_handler.rb +1 -1
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +3 -0
- data/lib/sequel/extensions/filter_having.rb +2 -0
- data/lib/sequel/extensions/freeze_datasets.rb +2 -0
- data/lib/sequel/extensions/from_block.rb +1 -1
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/hash_aliases.rb +2 -0
- data/lib/sequel/extensions/identifier_mangling.rb +0 -7
- data/lib/sequel/extensions/meta_def.rb +2 -0
- data/lib/sequel/extensions/migration.rb +6 -6
- data/lib/sequel/extensions/no_auto_literal_strings.rb +1 -1
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +207 -130
- data/lib/sequel/extensions/pg_hstore.rb +38 -20
- data/lib/sequel/extensions/pg_inet.rb +18 -6
- data/lib/sequel/extensions/pg_interval.rb +19 -12
- data/lib/sequel/extensions/pg_json.rb +25 -14
- data/lib/sequel/extensions/pg_json_ops.rb +2 -2
- data/lib/sequel/extensions/pg_range.rb +133 -100
- data/lib/sequel/extensions/pg_range_ops.rb +4 -3
- data/lib/sequel/extensions/pg_row.rb +68 -39
- data/lib/sequel/extensions/pg_row_ops.rb +11 -5
- data/lib/sequel/extensions/query_literals.rb +2 -0
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +2 -0
- data/lib/sequel/extensions/s.rb +1 -1
- data/lib/sequel/extensions/schema_dumper.rb +24 -24
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +3 -1
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +83 -0
- data/lib/sequel/extensions/set_overrides.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +0 -1
- data/lib/sequel/extensions/symbol_aref.rb +0 -4
- data/lib/sequel/model.rb +25 -57
- data/lib/sequel/model/associations.rb +14 -5
- data/lib/sequel/model/base.rb +96 -32
- data/lib/sequel/plugins/association_pks.rb +73 -46
- data/lib/sequel/plugins/association_proxies.rb +1 -1
- data/lib/sequel/plugins/auto_validations.rb +6 -2
- data/lib/sequel/plugins/boolean_readers.rb +1 -1
- data/lib/sequel/plugins/caching.rb +19 -13
- data/lib/sequel/plugins/class_table_inheritance.rb +19 -10
- data/lib/sequel/plugins/column_conflicts.rb +7 -2
- data/lib/sequel/plugins/column_select.rb +1 -1
- data/lib/sequel/plugins/csv_serializer.rb +8 -8
- data/lib/sequel/plugins/defaults_setter.rb +10 -0
- data/lib/sequel/plugins/eager_each.rb +1 -1
- data/lib/sequel/plugins/force_encoding.rb +2 -2
- data/lib/sequel/plugins/hook_class_methods.rb +9 -12
- data/lib/sequel/plugins/identifier_columns.rb +2 -0
- data/lib/sequel/plugins/instance_filters.rb +3 -1
- data/lib/sequel/plugins/instance_hooks.rb +17 -9
- data/lib/sequel/plugins/json_serializer.rb +17 -10
- data/lib/sequel/plugins/lazy_attributes.rb +8 -7
- data/lib/sequel/plugins/modification_detection.rb +3 -0
- data/lib/sequel/plugins/nested_attributes.rb +5 -1
- data/lib/sequel/plugins/pg_array_associations.rb +5 -0
- data/lib/sequel/plugins/prepared_statements.rb +1 -0
- data/lib/sequel/plugins/rcte_tree.rb +4 -4
- data/lib/sequel/plugins/serialization.rb +3 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/split_values.rb +6 -5
- data/lib/sequel/plugins/static_cache.rb +31 -25
- data/lib/sequel/plugins/subset_conditions.rb +3 -1
- data/lib/sequel/plugins/table_select.rb +1 -1
- data/lib/sequel/plugins/touch.rb +2 -1
- data/lib/sequel/plugins/validation_class_methods.rb +5 -6
- data/lib/sequel/plugins/validation_helpers.rb +2 -4
- data/lib/sequel/plugins/xml_serializer.rb +4 -4
- data/lib/sequel/sql.rb +2 -2
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +115 -14
- data/spec/adapters/mysql_spec.rb +78 -28
- data/spec/adapters/oracle_spec.rb +24 -24
- data/spec/adapters/postgres_spec.rb +38 -24
- data/spec/adapters/sqlanywhere_spec.rb +88 -86
- data/spec/adapters/sqlite_spec.rb +29 -24
- data/spec/core/connection_pool_spec.rb +17 -0
- data/spec/core/database_spec.rb +6 -0
- data/spec/core/dataset_spec.rb +46 -36
- data/spec/core/schema_spec.rb +16 -0
- data/spec/core/spec_helper.rb +1 -0
- data/spec/core_extensions_spec.rb +6 -2
- data/spec/extensions/active_model_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +34 -2
- data/spec/extensions/auto_literal_strings_spec.rb +5 -1
- data/spec/extensions/auto_validations_spec.rb +2 -0
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +48 -2
- data/spec/extensions/column_conflicts_spec.rb +11 -0
- data/spec/extensions/connection_validator_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +8 -8
- data/spec/extensions/defaults_setter_spec.rb +1 -1
- data/spec/extensions/filter_having_spec.rb +5 -3
- data/spec/extensions/hash_aliases_spec.rb +3 -1
- data/spec/extensions/identifier_columns_spec.rb +3 -1
- data/spec/extensions/implicit_subquery_spec.rb +4 -2
- data/spec/extensions/json_serializer_spec.rb +18 -0
- data/spec/extensions/lazy_attributes_spec.rb +3 -3
- data/spec/extensions/meta_def_spec.rb +9 -0
- data/spec/extensions/migration_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +14 -3
- data/spec/extensions/no_auto_literal_strings_spec.rb +8 -4
- data/spec/extensions/pg_array_associations_spec.rb +29 -18
- data/spec/extensions/pg_array_spec.rb +44 -25
- data/spec/extensions/pg_hstore_spec.rb +10 -0
- data/spec/extensions/pg_inet_spec.rb +26 -0
- data/spec/extensions/pg_interval_spec.rb +20 -0
- data/spec/extensions/pg_json_spec.rb +24 -0
- data/spec/extensions/pg_range_spec.rb +98 -14
- data/spec/extensions/pg_row_spec.rb +14 -4
- data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
- data/spec/extensions/query_literals_spec.rb +3 -1
- data/spec/extensions/schema_dumper_spec.rb +96 -98
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +10 -6
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +121 -0
- data/spec/extensions/single_table_inheritance_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +7 -1
- data/spec/extensions/static_cache_spec.rb +75 -24
- data/spec/extensions/string_agg_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +9 -0
- data/spec/extensions/validation_helpers_spec.rb +9 -3
- data/spec/extensions/whitelist_security_spec.rb +26 -0
- data/spec/integration/dataset_test.rb +45 -44
- data/spec/integration/plugin_test.rb +20 -0
- data/spec/integration/prepared_statement_test.rb +3 -0
- data/spec/integration/schema_test.rb +21 -1
- data/spec/integration/transaction_test.rb +40 -40
- data/spec/model/class_dataset_methods_spec.rb +14 -4
- data/spec/model/dataset_methods_spec.rb +12 -3
- data/spec/model/model_spec.rb +8 -0
- metadata +6 -4
- data/spec/adapters/firebird_spec.rb +0 -405
- data/spec/adapters/informix_spec.rb +0 -100
|
@@ -4,12 +4,17 @@ module Sequel
|
|
|
4
4
|
module SqlAnywhere
|
|
5
5
|
Sequel::Database.set_shared_adapter_scheme(:sqlanywhere, self)
|
|
6
6
|
|
|
7
|
+
# SEQUEL5: Remove
|
|
7
8
|
@convert_smallint_to_bool = true
|
|
8
|
-
|
|
9
9
|
class << self
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
def convert_smallint_to_bool
|
|
11
|
+
Sequel::Deprecation.deprecate("Sequel::SqlAnywhere.convert_smallint_to_bool", "Call this method on the Database instance")
|
|
12
|
+
@convert_smallint_to_bool
|
|
13
|
+
end
|
|
14
|
+
def convert_smallint_to_bool=(v)
|
|
15
|
+
Sequel::Deprecation.deprecate("Sequel::SqlAnywhere.convert_smallint_to_bool=", "Call this method on the Database instance")
|
|
16
|
+
@convert_smallint_to_bool = v
|
|
17
|
+
end
|
|
13
18
|
end
|
|
14
19
|
|
|
15
20
|
module DatabaseMethods
|
|
@@ -36,7 +41,7 @@ module Sequel
|
|
|
36
41
|
# Whether to convert smallint to boolean arguments for this dataset.
|
|
37
42
|
# Defaults to the SqlAnywhere module setting.
|
|
38
43
|
def convert_smallint_to_bool
|
|
39
|
-
defined?(@convert_smallint_to_bool) ? @convert_smallint_to_bool : (@convert_smallint_to_bool = ::Sequel::SqlAnywhere.convert_smallint_to_bool)
|
|
44
|
+
defined?(@convert_smallint_to_bool) ? @convert_smallint_to_bool : (@convert_smallint_to_bool = ::Sequel::SqlAnywhere.instance_variable_get(:@convert_smallint_to_bool)) # true) # SEQUEL5
|
|
40
45
|
end
|
|
41
46
|
|
|
42
47
|
# Sysbase Server uses the :sqlanywhere type.
|
|
@@ -319,14 +324,22 @@ module Sequel
|
|
|
319
324
|
Dataset.def_sql_method(self, :insert, %w'with insert into columns values')
|
|
320
325
|
Dataset.def_sql_method(self, :select, %w'with select distinct limit columns into from join where group having compounds order lock')
|
|
321
326
|
|
|
327
|
+
# Override the default IBMDB.convert_smallint_to_bool setting for this dataset.
|
|
328
|
+
def convert_smallint_to_bool=(v)
|
|
329
|
+
Sequel::Deprecation.deprecate("Sequel::SqlAnywhere::Dataset#convert_smallint_to_bool=", "Call with_convert_smallint_to_bool instead, which returns a modified copy instead of modifying the object")
|
|
330
|
+
@opts[:convert_smallint_to_bool] = v
|
|
331
|
+
end
|
|
332
|
+
|
|
322
333
|
# Whether to convert smallint to boolean arguments for this dataset.
|
|
323
|
-
# Defaults to the
|
|
334
|
+
# Defaults to the IBMDB module setting.
|
|
324
335
|
def convert_smallint_to_bool
|
|
325
|
-
|
|
336
|
+
opts.has_key?(:convert_smallint_to_bool) ? opts[:convert_smallint_to_bool] : db.convert_smallint_to_bool
|
|
326
337
|
end
|
|
327
338
|
|
|
328
|
-
#
|
|
329
|
-
|
|
339
|
+
# Return a cloned dataset with the convert_smallint_to_bool option set.
|
|
340
|
+
def with_convert_smallint_to_bool(v)
|
|
341
|
+
clone(:convert_smallint_to_bool=>v)
|
|
342
|
+
end
|
|
330
343
|
|
|
331
344
|
def supports_cte?(type=:select)
|
|
332
345
|
type == :select || type == :insert
|
|
@@ -424,7 +437,7 @@ module Sequel
|
|
|
424
437
|
string.gsub(/[\\%_\[]/){|m| "\\#{m}"}
|
|
425
438
|
end
|
|
426
439
|
|
|
427
|
-
# Use
|
|
440
|
+
# Use today() and Now() for CURRENT_DATE and CURRENT_TIMESTAMP
|
|
428
441
|
def constant_sql_append(sql, constant)
|
|
429
442
|
case constant
|
|
430
443
|
when :CURRENT_DATE
|
|
@@ -20,12 +20,14 @@ module Sequel
|
|
|
20
20
|
|
|
21
21
|
PRIMARY_KEY_INDEX_RE = /\Asqlite_autoindex_/.freeze
|
|
22
22
|
Sequel::Deprecation.deprecate_constant(self, :PRIMARY_KEY_INDEX_RE)
|
|
23
|
+
TABLES_FILTER = Sequel.~(:name=>'sqlite_sequence'.freeze) & {:type => 'table'.freeze}
|
|
24
|
+
Sequel::Deprecation.deprecate_constant(self, :TABLES_FILTER)
|
|
25
|
+
VIEWS_FILTER = {:type => 'view'.freeze}.freeze
|
|
26
|
+
Sequel::Deprecation.deprecate_constant(self, :VIEWS_FILTER)
|
|
23
27
|
|
|
24
28
|
AUTO_VACUUM = [:none, :full, :incremental].freeze
|
|
25
29
|
SYNCHRONOUS = [:off, :normal, :full].freeze
|
|
26
|
-
TABLES_FILTER = Sequel.~(:name=>'sqlite_sequence'.freeze) & {:type => 'table'.freeze}
|
|
27
30
|
TEMP_STORE = [:default, :file, :memory].freeze
|
|
28
|
-
VIEWS_FILTER = {:type => 'view'.freeze}.freeze
|
|
29
31
|
TRANSACTION_MODE = {
|
|
30
32
|
:deferred => "BEGIN DEFERRED TRANSACTION".freeze,
|
|
31
33
|
:immediate => "BEGIN IMMEDIATE TRANSACTION".freeze,
|
|
@@ -37,26 +39,6 @@ module Sequel
|
|
|
37
39
|
# booleans be stored as integers, but historically Sequel has used 't'/'f'.
|
|
38
40
|
attr_accessor :integer_booleans
|
|
39
41
|
|
|
40
|
-
# A symbol signifying the value of the auto_vacuum PRAGMA.
|
|
41
|
-
def auto_vacuum
|
|
42
|
-
AUTO_VACUUM[pragma_get(:auto_vacuum).to_i]
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# Set the auto_vacuum PRAGMA using the given symbol (:none, :full, or
|
|
46
|
-
# :incremental). See pragma_set. Consider using the :auto_vacuum
|
|
47
|
-
# Database option instead.
|
|
48
|
-
def auto_vacuum=(value)
|
|
49
|
-
value = AUTO_VACUUM.index(value) || (raise Error, "Invalid value for auto_vacuum option. Please specify one of :none, :full, :incremental.")
|
|
50
|
-
pragma_set(:auto_vacuum, value)
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# Set the case_sensitive_like PRAGMA using the given boolean value, if using
|
|
54
|
-
# SQLite 3.2.3+. If not using 3.2.3+, no error is raised. See pragma_set.
|
|
55
|
-
# Consider using the :case_sensitive_like Database option instead.
|
|
56
|
-
def case_sensitive_like=(value)
|
|
57
|
-
pragma_set(:case_sensitive_like, !!value ? 'on' : 'off') if sqlite_version >= 30203
|
|
58
|
-
end
|
|
59
|
-
|
|
60
42
|
# A symbol signifying the value of the default transaction mode
|
|
61
43
|
attr_reader :transaction_mode
|
|
62
44
|
|
|
@@ -74,18 +56,50 @@ module Sequel
|
|
|
74
56
|
:sqlite
|
|
75
57
|
end
|
|
76
58
|
|
|
77
|
-
#
|
|
78
|
-
|
|
59
|
+
# SEQUEL5: Remove
|
|
60
|
+
def auto_vacuum
|
|
61
|
+
AUTO_VACUUM[pragma_get(:auto_vacuum).to_i]
|
|
62
|
+
end
|
|
63
|
+
def auto_vacuum=(value)
|
|
64
|
+
value = AUTO_VACUUM.index(value) || (raise Error, "Invalid value for auto_vacuum option. Please specify one of :none, :full, :incremental.")
|
|
65
|
+
pragma_set(:auto_vacuum, value)
|
|
66
|
+
end
|
|
67
|
+
def case_sensitive_like=(value)
|
|
68
|
+
pragma_set(:case_sensitive_like, !!value ? 'on' : 'off') if sqlite_version >= 30203
|
|
69
|
+
end
|
|
79
70
|
def foreign_keys
|
|
80
71
|
pragma_get(:foreign_keys).to_i == 1 if sqlite_version >= 30619
|
|
81
72
|
end
|
|
82
|
-
|
|
83
|
-
# Set the foreign_keys PRAGMA using the given boolean value, if using
|
|
84
|
-
# SQLite 3.6.19+. If not using 3.6.19+, no error is raised. See pragma_set.
|
|
85
|
-
# Consider using the :foreign_keys Database option instead.
|
|
86
73
|
def foreign_keys=(value)
|
|
87
74
|
pragma_set(:foreign_keys, !!value ? 'on' : 'off') if sqlite_version >= 30619
|
|
88
75
|
end
|
|
76
|
+
def pragma_get(name)
|
|
77
|
+
Sequel::Deprecation.deprecate('Database#{pragma_get,auto_vacuum,case_sensitive_like,foreign_keys,synchronous,temp_store} on SQLite', "These methods may not be safe when using multiple connections, call fetch(#{"PRAGMA #{name}".inspect}).single_value if you really want to get the pragma value")
|
|
78
|
+
self["PRAGMA #{name}"].single_value
|
|
79
|
+
end
|
|
80
|
+
def pragma_set(name, value)
|
|
81
|
+
Sequel::Deprecation.deprecate('Database#{pragma_set,auto_vacuum=,case_sensitive_like=,foreign_keys=,synchronous=,temp_store=} on SQLite', "These methods are not thread safe or safe when using multiple connections, pass the appropriate option when connecting to set the pragma correctly for all connections")
|
|
82
|
+
execute_ddl("PRAGMA #{name} = #{value}")
|
|
83
|
+
end
|
|
84
|
+
def synchronous
|
|
85
|
+
SYNCHRONOUS[pragma_get(:synchronous).to_i]
|
|
86
|
+
end
|
|
87
|
+
def synchronous=(value)
|
|
88
|
+
value = SYNCHRONOUS.index(value) || (raise Error, "Invalid value for synchronous option. Please specify one of :off, :normal, :full.")
|
|
89
|
+
pragma_set(:synchronous, value)
|
|
90
|
+
end
|
|
91
|
+
def temp_store
|
|
92
|
+
TEMP_STORE[pragma_get(:temp_store).to_i]
|
|
93
|
+
end
|
|
94
|
+
def temp_store=(value)
|
|
95
|
+
value = TEMP_STORE.index(value) || (raise Error, "Invalid value for temp_store option. Please specify one of :default, :file, :memory.")
|
|
96
|
+
pragma_set(:temp_store, value)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Set the integer_booleans option using the passed in :integer_boolean option.
|
|
100
|
+
def set_integer_booleans
|
|
101
|
+
@integer_booleans = @opts.has_key?(:integer_booleans) ? typecast_value_boolean(@opts[:integer_booleans]) : true
|
|
102
|
+
end
|
|
89
103
|
|
|
90
104
|
# Return the array of foreign key info hashes using the foreign_key_list PRAGMA,
|
|
91
105
|
# including information for the :on_update and :on_delete entries.
|
|
@@ -115,8 +129,18 @@ module Sequel
|
|
|
115
129
|
im = input_identifier_meth
|
|
116
130
|
indexes = {}
|
|
117
131
|
metadata_dataset.with_sql("PRAGMA index_list(?)", im.call(table)).each do |r|
|
|
118
|
-
|
|
119
|
-
|
|
132
|
+
if opts[:only_autocreated]
|
|
133
|
+
# If specifically asked for only autocreated indexes, then return those an only those
|
|
134
|
+
next unless r[:name] =~ /\Asqlite_autoindex_/
|
|
135
|
+
elsif r.has_key?(:origin)
|
|
136
|
+
# If origin is set, then only exclude primary key indexes and partial indexes
|
|
137
|
+
next if r[:origin] == 'pk'
|
|
138
|
+
next if r[:partial].to_i == 1
|
|
139
|
+
else
|
|
140
|
+
# When :origin key not present, assume any autoindex could be a primary key one and exclude it
|
|
141
|
+
next if r[:name] =~ /\Asqlite_autoindex_/
|
|
142
|
+
end
|
|
143
|
+
|
|
120
144
|
indexes[m.call(r[:name])] = {:unique=>r[:unique].to_i==1}
|
|
121
145
|
end
|
|
122
146
|
indexes.each do |k, v|
|
|
@@ -125,28 +149,6 @@ module Sequel
|
|
|
125
149
|
indexes
|
|
126
150
|
end
|
|
127
151
|
|
|
128
|
-
# Get the value of the given PRAGMA.
|
|
129
|
-
def pragma_get(name)
|
|
130
|
-
Sequel::Deprecation.deprecate('Database#{pragma_get,auto_vacuum,case_sensitive_like,foreign_keys,synchronous,temp_store} on SQLite', "These methods may not be safe when using multiple connections, call fetch(#{"PRAGMA #{name}".inspect}).single_value if you really want to get the pragma value")
|
|
131
|
-
self["PRAGMA #{name}"].single_value
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
# Set the value of the given PRAGMA to value.
|
|
135
|
-
#
|
|
136
|
-
# This method is not thread safe, and will not work correctly if there
|
|
137
|
-
# are multiple connections in the Database's connection pool. PRAGMA
|
|
138
|
-
# modifications should be done when the connection is created, using
|
|
139
|
-
# an option provided when creating the Database object.
|
|
140
|
-
def pragma_set(name, value)
|
|
141
|
-
Sequel::Deprecation.deprecate('Database#{pragma_set,auto_vacuum=,case_sensitive_like=,foreign_keys=,synchronous=,temp_store=} on SQLite', "These methods are not thread safe or safe when using multiple connections, pass the appropriate option when connecting to set the pragma correctly for all connections")
|
|
142
|
-
execute_ddl("PRAGMA #{name} = #{value}")
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# Set the integer_booleans option using the passed in :integer_boolean option.
|
|
146
|
-
def set_integer_booleans
|
|
147
|
-
@integer_booleans = @opts.has_key?(:integer_booleans) ? typecast_value_boolean(@opts[:integer_booleans]) : true
|
|
148
|
-
end
|
|
149
|
-
|
|
150
152
|
# The version of the server as an integer, where 3.6.19 = 30619.
|
|
151
153
|
# If the server version can't be determined, 0 is used.
|
|
152
154
|
def sqlite_version
|
|
@@ -190,36 +192,12 @@ module Sequel
|
|
|
190
192
|
defined?(@use_timestamp_timezones) ? @use_timestamp_timezones : (@use_timestamp_timezones = false)
|
|
191
193
|
end
|
|
192
194
|
|
|
193
|
-
# A symbol signifying the value of the synchronous PRAGMA.
|
|
194
|
-
def synchronous
|
|
195
|
-
SYNCHRONOUS[pragma_get(:synchronous).to_i]
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
# Set the synchronous PRAGMA using the given symbol (:off, :normal, or :full). See pragma_set.
|
|
199
|
-
# Consider using the :synchronous Database option instead.
|
|
200
|
-
def synchronous=(value)
|
|
201
|
-
value = SYNCHRONOUS.index(value) || (raise Error, "Invalid value for synchronous option. Please specify one of :off, :normal, :full.")
|
|
202
|
-
pragma_set(:synchronous, value)
|
|
203
|
-
end
|
|
204
|
-
|
|
205
195
|
# Array of symbols specifying the table names in the current database.
|
|
206
196
|
#
|
|
207
197
|
# Options:
|
|
208
198
|
# :server :: Set the server to use.
|
|
209
199
|
def tables(opts=OPTS)
|
|
210
|
-
tables_and_views(
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
# A symbol signifying the value of the temp_store PRAGMA.
|
|
214
|
-
def temp_store
|
|
215
|
-
TEMP_STORE[pragma_get(:temp_store).to_i]
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
# Set the temp_store PRAGMA using the given symbol (:default, :file, or :memory). See pragma_set.
|
|
219
|
-
# Consider using the :temp_store Database option instead.
|
|
220
|
-
def temp_store=(value)
|
|
221
|
-
value = TEMP_STORE.index(value) || (raise Error, "Invalid value for temp_store option. Please specify one of :default, :file, :memory.")
|
|
222
|
-
pragma_set(:temp_store, value)
|
|
200
|
+
tables_and_views(Sequel.~(:name=>'sqlite_sequence') & {:type => 'table'}, opts)
|
|
223
201
|
end
|
|
224
202
|
|
|
225
203
|
# Creates a dataset that uses the VALUES clause:
|
|
@@ -235,7 +213,7 @@ module Sequel
|
|
|
235
213
|
# Options:
|
|
236
214
|
# :server :: Set the server to use.
|
|
237
215
|
def views(opts=OPTS)
|
|
238
|
-
tables_and_views(
|
|
216
|
+
tables_and_views({:type => 'view'}, opts)
|
|
239
217
|
end
|
|
240
218
|
|
|
241
219
|
private
|
|
@@ -438,8 +416,12 @@ module Sequel
|
|
|
438
416
|
|
|
439
417
|
# Determine unique constraints and make sure the new columns have them
|
|
440
418
|
unique_columns = []
|
|
441
|
-
|
|
442
|
-
|
|
419
|
+
skip_indexes = []
|
|
420
|
+
indexes(table, :only_autocreated=>true).each do |name, h|
|
|
421
|
+
skip_indexes << name
|
|
422
|
+
if h[:columns].length == 1 && h[:unique]
|
|
423
|
+
unique_columns.concat(h[:columns])
|
|
424
|
+
end
|
|
443
425
|
end
|
|
444
426
|
unique_columns -= pks
|
|
445
427
|
unless unique_columns.empty?
|
|
@@ -462,6 +444,7 @@ module Sequel
|
|
|
462
444
|
"DROP TABLE #{bt}"
|
|
463
445
|
]
|
|
464
446
|
indexes(table).each do |name, h|
|
|
447
|
+
next if skip_indexes.include?(name)
|
|
465
448
|
if (h[:columns].map(&:to_s) - new_columns).empty?
|
|
466
449
|
a << alter_table_sql(table, h.merge(:op=>:add_index, :name=>name))
|
|
467
450
|
end
|
|
@@ -471,7 +454,7 @@ module Sequel
|
|
|
471
454
|
|
|
472
455
|
# Does the reverse of on_delete_clause, eg. converts strings like +'SET NULL'+
|
|
473
456
|
# to symbols +:set_null+.
|
|
474
|
-
def on_delete_sql_to_sym
|
|
457
|
+
def on_delete_sql_to_sym(str)
|
|
475
458
|
case str
|
|
476
459
|
when 'RESTRICT'
|
|
477
460
|
:restrict
|
|
@@ -549,6 +532,9 @@ module Sequel
|
|
|
549
532
|
include Dataset::Replace
|
|
550
533
|
include UnmodifiedIdentifiers::DatasetMethods
|
|
551
534
|
|
|
535
|
+
# The allowed values for insert_conflict
|
|
536
|
+
INSERT_CONFLICT_RESOLUTIONS = %w'ROLLBACK ABORT FAIL IGNORE REPLACE'.each(&:freeze).freeze
|
|
537
|
+
|
|
552
538
|
CONSTANT_MAP = {:CURRENT_DATE=>"date(CURRENT_TIMESTAMP, 'localtime')".freeze, :CURRENT_TIMESTAMP=>"datetime(CURRENT_TIMESTAMP, 'localtime')".freeze, :CURRENT_TIME=>"time(CURRENT_TIMESTAMP, 'localtime')".freeze}#.freeze # SEQUEL5
|
|
553
539
|
EXTRACT_MAP = {:year=>"'%Y'", :month=>"'%m'", :day=>"'%d'", :hour=>"'%H'", :minute=>"'%M'", :second=>"'%f'"}#.freeze # SEQUEL5
|
|
554
540
|
#EXTRACT_MAP.each_value(&:freeze) # SEQUEL5
|
|
@@ -676,7 +662,7 @@ module Sequel
|
|
|
676
662
|
end
|
|
677
663
|
|
|
678
664
|
# Return an array of strings specifying a query explanation for a SELECT of the
|
|
679
|
-
# current dataset. Currently, the options are
|
|
665
|
+
# current dataset. Currently, the options are ignored, but it accepts options
|
|
680
666
|
# to be compatible with other adapters.
|
|
681
667
|
def explain(opts=nil)
|
|
682
668
|
# Load the PrettyTable class, needed for explain output
|
|
@@ -723,6 +709,10 @@ module Sequel
|
|
|
723
709
|
# DB[:table].insert_conflict(:replace).insert(:a=>1, :b=>2)
|
|
724
710
|
# # INSERT OR REPLACE INTO TABLE (a, b) VALUES (1, 2)
|
|
725
711
|
def insert_conflict(resolution = :ignore)
|
|
712
|
+
unless INSERT_CONFLICT_RESOLUTIONS.include?(resolution.to_s.upcase)
|
|
713
|
+
Sequel::Deprecation.deprecate("Passing #{resolution.inspect} argument to Dataset#insert_conflict", "The allowed values are: :rollback, :abort, :fail, :ignore, or :replace")
|
|
714
|
+
# raise Error, "Invalid value passed to Dataset#insert_conflict: #{resolution.inspect}. The allowed values are: :rollback, :abort, :fail, :ignore, or :replace"
|
|
715
|
+
end
|
|
726
716
|
clone(:insert_conflict => resolution)
|
|
727
717
|
end
|
|
728
718
|
|
|
@@ -19,7 +19,7 @@ module Sequel
|
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
tt = Class.new do
|
|
23
23
|
def blob(s) ::Sequel::SQL::Blob.new(s) end
|
|
24
24
|
def boolean(s) s.to_i != 0 end
|
|
25
25
|
def date(s) ::Date.strptime(s) end
|
|
@@ -27,6 +27,9 @@ module Sequel
|
|
|
27
27
|
def time(s) ::Sequel.string_to_time(s) end
|
|
28
28
|
end.new
|
|
29
29
|
|
|
30
|
+
TYPE_TRANSLATOR = tt
|
|
31
|
+
Sequel::Deprecation.deprecate_constant(self, :TYPE_TRANSLATOR)
|
|
32
|
+
|
|
30
33
|
SQLANYWHERE_TYPES = {}
|
|
31
34
|
{
|
|
32
35
|
[0, 484] => tt.method(:decimal),
|
|
@@ -7,9 +7,9 @@ module Sequel
|
|
|
7
7
|
# Top level module for holding all SQLite-related modules and classes
|
|
8
8
|
# for Sequel.
|
|
9
9
|
module SQLite
|
|
10
|
-
|
|
11
|
-
FALSE_VALUES = (%w'0 false f no n' + [0]).freeze
|
|
10
|
+
FALSE_VALUES = (%w'0 false f no n' + [0]).freeze
|
|
12
11
|
|
|
12
|
+
tt = Class.new do
|
|
13
13
|
def blob(s)
|
|
14
14
|
Sequel::SQL::Blob.new(s.to_s)
|
|
15
15
|
end
|
|
@@ -58,9 +58,11 @@ module Sequel
|
|
|
58
58
|
raise Sequel::Error, "unhandled type when converting to date: #{s.inspect} (#{s.class.inspect})"
|
|
59
59
|
end
|
|
60
60
|
end
|
|
61
|
-
|
|
62
61
|
end.new
|
|
63
62
|
|
|
63
|
+
TYPE_TRANSLATOR = tt
|
|
64
|
+
Sequel::Deprecation.deprecate_constant(self, :TYPE_TRANSLATOR)
|
|
65
|
+
|
|
64
66
|
# Hash with string keys and callable values for converting SQLite types.
|
|
65
67
|
SQLITE_TYPES = {}
|
|
66
68
|
{
|
|
@@ -4,8 +4,6 @@ require 'swift/db/postgres'
|
|
|
4
4
|
Sequel.require 'adapters/shared/postgres'
|
|
5
5
|
|
|
6
6
|
module Sequel
|
|
7
|
-
Postgres::CONVERTED_EXCEPTIONS << ::Swift::Error
|
|
8
|
-
|
|
9
7
|
module Swift
|
|
10
8
|
# Adapter, Database, and Dataset support for accessing a PostgreSQL
|
|
11
9
|
# database via Swift.
|
|
@@ -23,6 +21,11 @@ module Sequel
|
|
|
23
21
|
|
|
24
22
|
private
|
|
25
23
|
|
|
24
|
+
DATABASE_ERROR_CLASSES = [::Swift::Error].freeze
|
|
25
|
+
def database_error_classes
|
|
26
|
+
DATABASE_ERROR_CLASSES
|
|
27
|
+
end
|
|
28
|
+
|
|
26
29
|
# Remove all other options except for ones specifically handled, as
|
|
27
30
|
# otherwise swift passes them to dbic++ which passes them to PostgreSQL
|
|
28
31
|
# which can raise an error.
|
|
@@ -188,14 +188,11 @@ module Sequel
|
|
|
188
188
|
Database::DatasetClass = self
|
|
189
189
|
Sequel::Deprecation.deprecate_constant(Database, :DatasetClass)
|
|
190
190
|
|
|
191
|
-
# SQLite already supports named bind arguments, so use directly.
|
|
192
191
|
module ArgumentMapper
|
|
193
192
|
include Sequel::Dataset::ArgumentMapper
|
|
194
193
|
|
|
195
194
|
protected
|
|
196
195
|
|
|
197
|
-
# Return a hash with the same values as the given hash,
|
|
198
|
-
# but with the keys converted to strings.
|
|
199
196
|
def map_to_prepared_args(hash)
|
|
200
197
|
args = {}
|
|
201
198
|
hash.each{|k,v| args[k.to_s.gsub('.', '__')] = v}
|
|
@@ -204,8 +201,6 @@ module Sequel
|
|
|
204
201
|
|
|
205
202
|
private
|
|
206
203
|
|
|
207
|
-
# SQLite uses a : before the name of the argument for named
|
|
208
|
-
# arguments.
|
|
209
204
|
def prepared_arg(k)
|
|
210
205
|
LiteralString.new("@#{k.to_s.gsub('.', '__')}")
|
|
211
206
|
end
|
|
@@ -18,7 +18,7 @@ module Sequel
|
|
|
18
18
|
closed MySQL connection
|
|
19
19
|
END
|
|
20
20
|
# Error messages for mysql and mysql2 that indicate the current connection should be disconnected
|
|
21
|
-
MYSQL_DATABASE_DISCONNECT_ERRORS = /\A#{Regexp.union(disconnect_errors)}/
|
|
21
|
+
MYSQL_DATABASE_DISCONNECT_ERRORS = /\A#{Regexp.union(disconnect_errors)}/
|
|
22
22
|
|
|
23
23
|
# Support stored procedures on MySQL
|
|
24
24
|
def call_sproc(name, opts=OPTS, &block)
|
|
@@ -1,78 +1,4 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
NAN = 0.0/0.0
|
|
6
|
-
PLUS_INFINITY = 1.0/0.0
|
|
7
|
-
MINUS_INFINITY = -1.0/0.0
|
|
8
|
-
|
|
9
|
-
NAN_STR = 'NaN'.freeze
|
|
10
|
-
Sequel::Deprecation.deprecate_constant(self, :NAN_STR)
|
|
11
|
-
PLUS_INFINITY_STR = 'Infinity'.freeze
|
|
12
|
-
Sequel::Deprecation.deprecate_constant(self, :PLUS_INFINITY_STR)
|
|
13
|
-
MINUS_INFINITY_STR = '-Infinity'.freeze
|
|
14
|
-
Sequel::Deprecation.deprecate_constant(self, :MINUS_INFINITY_STR)
|
|
15
|
-
TRUE_STR = 't'.freeze
|
|
16
|
-
Sequel::Deprecation.deprecate_constant(self, :TRUE_STR)
|
|
17
|
-
DASH_STR = '-'.freeze
|
|
18
|
-
Sequel::Deprecation.deprecate_constant(self, :DASH_STR)
|
|
19
|
-
|
|
20
|
-
TYPE_TRANSLATOR = tt = Class.new do
|
|
21
|
-
def boolean(s) s == 't' end
|
|
22
|
-
def integer(s) s.to_i end
|
|
23
|
-
def float(s)
|
|
24
|
-
case s
|
|
25
|
-
when 'NaN'
|
|
26
|
-
NAN
|
|
27
|
-
when 'Infinity'
|
|
28
|
-
PLUS_INFINITY
|
|
29
|
-
when '-Infinity'
|
|
30
|
-
MINUS_INFINITY
|
|
31
|
-
else
|
|
32
|
-
s.to_f
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
def date(s) ::Date.new(*s.split('-').map(&:to_i)) end
|
|
36
|
-
def bytea(str)
|
|
37
|
-
str = if str =~ /\A\\x/
|
|
38
|
-
# PostgreSQL 9.0+ bytea hex format
|
|
39
|
-
str[2..-1].gsub(/(..)/){|s| s.to_i(16).chr}
|
|
40
|
-
else
|
|
41
|
-
# Historical PostgreSQL bytea escape format
|
|
42
|
-
str.gsub(/\\(\\|'|[0-3][0-7][0-7])/) {|s|
|
|
43
|
-
if s.size == 2 then s[1,1] else s[1,3].oct.chr end
|
|
44
|
-
}
|
|
45
|
-
end
|
|
46
|
-
::Sequel::SQL::Blob.new(str)
|
|
47
|
-
end
|
|
48
|
-
end.new
|
|
49
|
-
|
|
50
|
-
# Type OIDs for string types used by PostgreSQL. These types don't
|
|
51
|
-
# have conversion procs associated with them (since the data is
|
|
52
|
-
# already in the form of a string).
|
|
53
|
-
STRING_TYPES = [18, 19, 25, 1042, 1043]#.freeze # SEQUEL5
|
|
54
|
-
|
|
55
|
-
# Hash with type name strings/symbols and callable values for converting PostgreSQL types.
|
|
56
|
-
# Non-builtin types that don't have fixed numbers should use this to register
|
|
57
|
-
# conversion procs.
|
|
58
|
-
PG_NAMED_TYPES = {} unless defined?(PG_NAMED_TYPES)
|
|
59
|
-
PG_NAMED__TYPES = PG_NAMED_TYPES
|
|
60
|
-
Sequel::Deprecation.deprecate_constant(self, :PG_NAMED_TYPES)
|
|
61
|
-
|
|
62
|
-
# Hash with integer keys and callable values for converting PostgreSQL types.
|
|
63
|
-
PG_TYPES = {} unless defined?(PG_TYPES)
|
|
64
|
-
|
|
65
|
-
{
|
|
66
|
-
[16] => tt.method(:boolean),
|
|
67
|
-
[17] => tt.method(:bytea),
|
|
68
|
-
[20, 21, 23, 26] => tt.method(:integer),
|
|
69
|
-
[700, 701] => tt.method(:float),
|
|
70
|
-
[1700] => ::BigDecimal.method(:new),
|
|
71
|
-
[1083, 1266] => ::Sequel.method(:string_to_time),
|
|
72
|
-
[1082] => ::Sequel.method(:string_to_date),
|
|
73
|
-
[1184, 1114] => ::Sequel.method(:database_to_application_timestamp),
|
|
74
|
-
}.each do |k,v|
|
|
75
|
-
k.each{|n| PG_TYPES[n] = v}
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
|
3
|
+
Sequel::Deprecation.deprecate("requiring sequel/adapters/utils/pg_types", "This file should no longer be required, use Database#conversion_procs to modify conversion procs for a Database instance")
|
|
4
|
+
Sequel.require 'adapters/shared/postgres'
|