sequel 5.7.1 → 5.8.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 +53 -1
- data/doc/association_basics.rdoc +2 -2
- data/doc/migration.rdoc +11 -10
- data/doc/postgresql.rdoc +71 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/lib/sequel/adapters/jdbc.rb +6 -1
- data/lib/sequel/adapters/jdbc/postgresql.rb +3 -3
- data/lib/sequel/adapters/mysql2.rb +2 -1
- data/lib/sequel/adapters/postgres.rb +32 -10
- data/lib/sequel/adapters/shared/mssql.rb +11 -11
- data/lib/sequel/adapters/shared/mysql.rb +51 -6
- data/lib/sequel/adapters/shared/oracle.rb +12 -2
- data/lib/sequel/adapters/shared/postgres.rb +97 -30
- data/lib/sequel/adapters/shared/sqlanywhere.rb +2 -2
- data/lib/sequel/adapters/shared/sqlite.rb +6 -1
- data/lib/sequel/dataset/features.rb +5 -0
- data/lib/sequel/dataset/query.rb +48 -19
- data/lib/sequel/exceptions.rb +7 -0
- data/lib/sequel/extensions/connection_expiration.rb +8 -3
- data/lib/sequel/extensions/pg_enum.rb +28 -5
- data/lib/sequel/plugins/association_proxies.rb +16 -4
- data/lib/sequel/plugins/error_splitter.rb +16 -11
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +260 -0
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/tactical_eager_loading.rb +1 -1
- data/lib/sequel/version.rb +2 -2
- data/spec/adapters/mysql_spec.rb +0 -1
- data/spec/adapters/postgres_spec.rb +169 -4
- data/spec/adapters/sqlite_spec.rb +13 -0
- data/spec/core/dataset_spec.rb +21 -0
- data/spec/extensions/association_proxies_spec.rb +21 -7
- data/spec/extensions/connection_expiration_spec.rb +13 -1
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +165 -0
- data/spec/extensions/pg_enum_spec.rb +26 -22
- data/spec/extensions/tactical_eager_loading_spec.rb +11 -0
- data/spec/integration/dataset_test.rb +30 -6
- data/spec/integration/plugin_test.rb +2 -2
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5802a8e3fdb50b3d51f78111c604c86c64f0a3705bcf272423f0b9281800720b
|
4
|
+
data.tar.gz: 2257a05863d62c70a871032ecc5fdff36196ab717094af98c096570c08f380a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3caabfec31c2953c4f0dd57e68dc58466ff416ab80276ae5ac111fffde7a6dcdddf068b074e33e8df4ea6f41ca941f59f60ec1507d5de2a07ce7b3cdb9016c82
|
7
|
+
data.tar.gz: 811720c5223a1e2113b47fb0430870dec6377f8d6d1408f0b61dd52abacd596f26af6077c77cf619692c80a43224f06e44633d5c8bd2ee403eafac3a5e7050db
|
data/CHANGELOG
CHANGED
@@ -1,7 +1,59 @@
|
|
1
|
-
=== 5.
|
1
|
+
=== 5.8.0 (2018-05-01)
|
2
|
+
|
3
|
+
* Don't mark SQLAnywhere as supporting WITH in INSERT statement (jeremyevans)
|
4
|
+
|
5
|
+
* Support :search_path as a shard option on PostgreSQL (jeremyevans)
|
6
|
+
|
7
|
+
* Add Dataset#nowait for raising a Sequel::DatabaseLockTimeout when a locked row is encountered, supported on PostgreSQL, MySQL 8+, MSSQL, and Oracle (jeremyevans)
|
8
|
+
|
9
|
+
* Support Dataset#skip_locked on MySQL 8+ (jeremyevans)
|
10
|
+
|
11
|
+
* Make schema modification methods in the pg_enum extension work on a frozen Database object (jeremyevans)
|
12
|
+
|
13
|
+
* Support common table expressions and window functions on MySQL 8+ (jeremyevans)
|
14
|
+
|
15
|
+
* Ignore Dataset#explain :extended option on MySQL 5.7+, since extended output is then the MySQL default (jeremyevans)
|
16
|
+
|
17
|
+
* Work around REGEXP BINARY not working correctly on MySQL 8+ by using REGEXP_LIKE with the 'c' match_type (jeremyevans)
|
18
|
+
|
19
|
+
* Force correct column order in Database#foreign_key_list on MySQL (jeremyevans)
|
20
|
+
|
21
|
+
* Add ConnectionPool#connection_expiration_random_delay to connection_expiration extension, to avoid thundering herd if preallocating connections (hex2a, jeremyevans) (#1503)
|
22
|
+
|
23
|
+
* Emit deprecation warning in association_proxies plugin if using #filter on an association proxy, since behavior will change on ruby 2.6+ (utilum) (#1497)
|
24
|
+
|
25
|
+
* Handle multiple add_constraint calls and a set_column_null call in the same alter_table block on SQLite (jeremyevans) (#1498)
|
26
|
+
|
27
|
+
* Add Database#rename_enum to the pg_enum extension (AlexWayfer) (#1495)
|
28
|
+
|
29
|
+
* Make tactical_eager_loading plugin respect the :allow_eager association option (jeremyevans) (#1494)
|
30
|
+
|
31
|
+
* Add pg_auto_constraint_validations plugin, for automatically converting constraint violations to validation failures on PostgreSQL (jeremyevans)
|
32
|
+
|
33
|
+
* Don't make Model#_valid? public in the error_splitter plugin (jeremyevans)
|
34
|
+
|
35
|
+
* Support Database#indexes :include_partial option on PostgreSQL for including partial indexes (jeremyevans)
|
36
|
+
|
37
|
+
* Include more diagnostic information in Database#error_info on PostgreSQL (jeremyevans)
|
38
|
+
|
39
|
+
* Support Database#foreign_key_list :reverse option on PostgreSQL for parsing foreign key constraints that reference a given table (jeremyevans)
|
40
|
+
|
41
|
+
* Add Database#check_constraints on PostgreSQL for parsing CHECK constraints (jeremyevans)
|
2
42
|
|
3
43
|
* Don't use identity columns if :serial=>true or :type=>:serial|:bigserial column options are used (#1490) (jeremyevans)
|
4
44
|
|
45
|
+
* Cache Dataset#select_all datasets if no arguments are given (jeremyevans)
|
46
|
+
|
47
|
+
* Cache Dataset#returning datasets if no arguments are given (jeremyevans)
|
48
|
+
|
49
|
+
* Cache Dataset#qualify datasets if no argument is given (jeremyevans)
|
50
|
+
|
51
|
+
* Cache Dataset#lateral datasets (jeremyevans)
|
52
|
+
|
53
|
+
* Cache Dataset#from_self datasets if no options are given (jeremyevans)
|
54
|
+
|
55
|
+
* Cache Dataset#distinct datasets if no arguments or block is given (jeremyevans)
|
56
|
+
|
5
57
|
=== 5.7.0 (2018-04-01)
|
6
58
|
|
7
59
|
* Add Sequel.start_timer and .elapsed_seconds_since for more accurate elapsed time calculations on ruby 2.1+ (jeremyevans)
|
data/doc/association_basics.rdoc
CHANGED
@@ -859,13 +859,13 @@ The defaults for any of these options can be set at the class level using
|
|
859
859
|
<tt>Sequel::Model.default_association_options</tt>. To make
|
860
860
|
associations read only by default:
|
861
861
|
|
862
|
-
Sequel::Model.default_association_options[:read_only] = true
|
862
|
+
Sequel::Model.default_association_options[:read_only] = true
|
863
863
|
|
864
864
|
Many of these options are specific to particular association types, and
|
865
865
|
the defaults can be set on a per association type basis. To make one_to_many
|
866
866
|
associations read only by default:
|
867
867
|
|
868
|
-
Sequel::Model.default_association_type_options[:one_to_many] = {read_only: true}
|
868
|
+
Sequel::Model.default_association_type_options[:one_to_many] = {read_only: true}
|
869
869
|
|
870
870
|
=== Association Dataset Modification Options
|
871
871
|
|
data/doc/migration.rdoc
CHANGED
@@ -469,21 +469,16 @@ or equal to that version will be migrated up.
|
|
469
469
|
|
470
470
|
== Running migrations from a Rake task
|
471
471
|
|
472
|
-
You can also incorporate migrations into a Rakefile
|
473
|
-
using integer migration versions.
|
472
|
+
You can also incorporate migrations into a Rakefile:
|
474
473
|
|
475
474
|
namespace :db do
|
476
475
|
desc "Run migrations"
|
477
476
|
task :migrate, [:version] do |t, args|
|
478
|
-
require "sequel"
|
477
|
+
require "sequel/core"
|
479
478
|
Sequel.extension :migration
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
Sequel::Migrator.run(db, "db/migrations", target: args[:version].to_i)
|
484
|
-
else
|
485
|
-
puts "Migrating to latest"
|
486
|
-
Sequel::Migrator.run(db, "db/migrations")
|
479
|
+
version = args[:version].to_i if args[:version]
|
480
|
+
Sequel.connect(ENV.fetch("DATABASE_URL")) do |db|
|
481
|
+
Sequel::Migrator.run(db, "db/migrations", target: version)
|
487
482
|
end
|
488
483
|
end
|
489
484
|
end
|
@@ -506,6 +501,12 @@ migration takes, you can use the <tt>-E</tt> option to +sequel+ to set up a
|
|
506
501
|
+Database+ logger that logs to +STDOUT+. You can also log that same output to
|
507
502
|
a file using the <tt>-l</tt> option with a log file name.
|
508
503
|
|
504
|
+
If you want to include a logger in the rake task above, add a +:logger+ option
|
505
|
+
when calling Sequel.connect:
|
506
|
+
|
507
|
+
require "logger"
|
508
|
+
Sequel.connect(ENV.fetch("DATABASE_URL"), logger: Logger.new($stderr))
|
509
|
+
|
509
510
|
== Using models in your migrations
|
510
511
|
|
511
512
|
Just don't do it.
|
data/doc/postgresql.rdoc
CHANGED
@@ -189,6 +189,49 @@ Sequel has built in support for creating and dropping PostgreSQL schemas, proced
|
|
189
189
|
|
190
190
|
However, you may want to consider just use <tt>Database#run</tt> with the necessary SQL code, at least for functions and triggers.
|
191
191
|
|
192
|
+
=== Parsing Check Constraints
|
193
|
+
|
194
|
+
Sequel has support for parsing CHECK constraints on PostgreSQL using <tt>Sequel::Database#check_constraints</tt>:
|
195
|
+
|
196
|
+
DB.create_table(:foo) do
|
197
|
+
Integer :i
|
198
|
+
Integer :j
|
199
|
+
constraint(:ic, Sequel[:i] > 2)
|
200
|
+
constraint(:jc, Sequel[:j] > 2)
|
201
|
+
constraint(:ijc, Sequel[:i] - Sequel[:j] > 2)
|
202
|
+
end
|
203
|
+
DB.check_constraints(:foo)
|
204
|
+
# => {
|
205
|
+
# :ic=>{:definition=>"CHECK ((i > 2))", :columns=>[:i]},
|
206
|
+
# :jc=>{:definition=>"CHECK ((j > 2))", :columns=>[:j]},
|
207
|
+
# :ijc=>{:definition=>"CHECK (((i - j) > 2))", :columns=>[:i, :j]}
|
208
|
+
# }
|
209
|
+
|
210
|
+
=== Parsing Foreign Key Constraints Referencing A Given Table
|
211
|
+
|
212
|
+
Sequel has support for parsing FOREIGN KEY constraints that reference a given table, using the +:reverse+
|
213
|
+
option to +foreign_key_list+:
|
214
|
+
|
215
|
+
DB.create_table!(:a) do
|
216
|
+
primary_key :id
|
217
|
+
Integer :i
|
218
|
+
Integer :j
|
219
|
+
foreign_key :a_id, :a, :foreign_key_constraint_name=>:a_a
|
220
|
+
unique [:i, :j]
|
221
|
+
end
|
222
|
+
DB.create_table!(:b) do
|
223
|
+
foreign_key :a_id, :a, :foreign_key_constraint_name=>:a_a
|
224
|
+
Integer :c
|
225
|
+
Integer :d
|
226
|
+
foreign_key [:c, :d], :a, :key=>[:j, :i], :name=>:a_c_d
|
227
|
+
end
|
228
|
+
DB.foreign_key_list(:a, :reverse=>true)
|
229
|
+
# => [
|
230
|
+
# {:name=>:a_a, :columns=>[:a_id], :key=>[:id], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:a, :schema=>:public},
|
231
|
+
# {:name=>:a_a, :columns=>[:a_id], :key=>[:id], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:b, :schema=>:public},
|
232
|
+
# {:name=>:a_c_d, :columns=>[:c, :d], :key=>[:j, :i], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:b, :schema=>:public}
|
233
|
+
# ]
|
234
|
+
|
192
235
|
== PostgreSQL-specific DML Support
|
193
236
|
|
194
237
|
=== Returning Rows From Insert, Update, and Delete Statements
|
@@ -397,6 +440,34 @@ handle locking:
|
|
397
440
|
# INSERT INTO "table" ("id") VALUES (2) RETURNING NULL;
|
398
441
|
# COMMIT;
|
399
442
|
|
443
|
+
== Extended Error Info (<tt>postgres/pg only</tt>)
|
444
|
+
|
445
|
+
If you run a query that raises a Sequel::DatabaseError, you can pass the exception object to
|
446
|
+
<tt>Database#error_info</tt>, and that will return a hash with metadata regarding the error,
|
447
|
+
such as the related table and column or constraint.
|
448
|
+
|
449
|
+
DB.create_table(:test1){primary_key :id}
|
450
|
+
DB.create_table(:test2){primary_key :id; foreign_key :test1_id, :test1}
|
451
|
+
DB[:test2].insert(:test1_id=>1) rescue DB.error_info($!)
|
452
|
+
# => {
|
453
|
+
# :schema=>"public",
|
454
|
+
# :table=>"test2",
|
455
|
+
# :column=>nil,
|
456
|
+
# :constraint=>"test2_test1_id_fkey",
|
457
|
+
# :type=>nil,
|
458
|
+
# :severity=>"ERROR",
|
459
|
+
# :sql_state=>"23503",
|
460
|
+
# :message_primary=>"insert or update on table \"test2\" violates foreign key constraint \"test2_test1_id_fkey\"",
|
461
|
+
# :message_detail=>"Key (test1_id)=(1) is not present in table \"test1\"."
|
462
|
+
# :message_hint=>nil,
|
463
|
+
# :statement_position=>nil,
|
464
|
+
# :internal_position=>nil,
|
465
|
+
# :internal_query=>nil,
|
466
|
+
# :source_file=>"ri_triggers.c",
|
467
|
+
# :source_line=>"3321",
|
468
|
+
# :source_function=>"ri_ReportViolation"
|
469
|
+
# }
|
470
|
+
|
400
471
|
== sequel_pg (<tt>postgres/pg only</tt>)
|
401
472
|
|
402
473
|
When the postgres adapter is used with the pg driver, Sequel automatically checks for sequel_pg, and
|
@@ -0,0 +1,170 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A pg_auto_constraint_validations plugin has been added, which
|
4
|
+
automatically converts many constraint violations raised as
|
5
|
+
exceptions to ValidationFailed exceptions when saving a model
|
6
|
+
instance.
|
7
|
+
|
8
|
+
The following constraint violation types are recognized and
|
9
|
+
supported:
|
10
|
+
|
11
|
+
* NOT NULL
|
12
|
+
* CHECK
|
13
|
+
* UNIQUE (except expression/functional indexes)
|
14
|
+
* FOREIGN KEY (both referencing and referenced by)
|
15
|
+
|
16
|
+
In the cases where the plugin cannot determine an appropriate
|
17
|
+
validation failure for the constraint violation, it just
|
18
|
+
reraises the original exception.
|
19
|
+
|
20
|
+
This plugin is not intended as a replacement for other validations,
|
21
|
+
it is intended as a last resort. The purpose of validations is to
|
22
|
+
provide nice error messages for the user, and the error messages
|
23
|
+
generated by this plugin are fairly generic. The error messages can
|
24
|
+
be customized using the :messages plugin option, but there is only a
|
25
|
+
single message used per constraint type.
|
26
|
+
|
27
|
+
* Database#check_constraints has been added on PostgreSQL. This
|
28
|
+
returns metadata related to each check constraint on a table:
|
29
|
+
|
30
|
+
DB.create_table(:foo) do
|
31
|
+
Integer :i
|
32
|
+
Integer :j
|
33
|
+
constraint(:ic, Sequel[:i] > 2)
|
34
|
+
constraint(:jc, Sequel[:j] > 2)
|
35
|
+
constraint(:ijc, Sequel[:i] - Sequel[:j] > 2)
|
36
|
+
end
|
37
|
+
DB.check_constraints(:foo)
|
38
|
+
# => {
|
39
|
+
# :ic=>{:definition=>"CHECK ((i > 2))", :columns=>[:i]},
|
40
|
+
# :jc=>{:definition=>"CHECK ((j > 2))", :columns=>[:j]},
|
41
|
+
# :ijc=>{:definition=>"CHECK (((i - j) > 2))", :columns=>[:i, :j]}
|
42
|
+
# }
|
43
|
+
|
44
|
+
* Database#foreign_key_list now supports a :reverse option on
|
45
|
+
PostgreSQL, which returns foreign keys referencing the given table,
|
46
|
+
instead of of foreign keys in the given table referencing other
|
47
|
+
tables:
|
48
|
+
|
49
|
+
DB.create_table!(:a) do
|
50
|
+
primary_key :id
|
51
|
+
Integer :i
|
52
|
+
Integer :j
|
53
|
+
foreign_key :a_id, :a, :foreign_key_constraint_name=>:a_a
|
54
|
+
unique [:i, :j]
|
55
|
+
end
|
56
|
+
DB.create_table!(:b) do
|
57
|
+
foreign_key :a_id, :a, :foreign_key_constraint_name=>:a_a
|
58
|
+
Integer :c
|
59
|
+
Integer :d
|
60
|
+
foreign_key [:c, :d], :a, :key=>[:j, :i], :name=>:a_c_d
|
61
|
+
end
|
62
|
+
DB.foreign_key_list(:a, :reverse=>true)
|
63
|
+
# => [
|
64
|
+
# {:name=>:a_a, :columns=>[:a_id], :key=>[:id], :on_update=>:no_action,
|
65
|
+
# :on_delete=>:no_action, :deferrable=>false, :table=>:a, :schema=>:public},
|
66
|
+
# {:name=>:a_a, :columns=>[:a_id], :key=>[:id], :on_update=>:no_action,
|
67
|
+
# :on_delete=>:no_action, :deferrable=>false, :table=>:b, :schema=>:public},
|
68
|
+
# {:name=>:a_c_d, :columns=>[:c, :d], :key=>[:j, :i], :on_update=>:no_action,
|
69
|
+
# :on_delete=>:no_action, :deferrable=>false, :table=>:b, :schema=>:public}
|
70
|
+
# ]
|
71
|
+
|
72
|
+
* Dataset#nowait has been added, which will make the query fail
|
73
|
+
with a Sequel::DatabaseLockTimeout exception if it encounters
|
74
|
+
a locked row, overriding the default database behavior that
|
75
|
+
would wait until the lock was released. This method is supported
|
76
|
+
on PostgreSQL, Microsoft SQL Server, Oracle, and MySQL 8+.
|
77
|
+
|
78
|
+
* Database#indexes now supports an :include_partial option on
|
79
|
+
PostgreSQL, which will include partial indexes in the output (Sequel
|
80
|
+
by default excludes partial indexes).
|
81
|
+
|
82
|
+
* Common table expressions and window functions are now supported when
|
83
|
+
using MySQL 8+.
|
84
|
+
|
85
|
+
* Dataset#skip_locked is now supported on MySQL 8+.
|
86
|
+
|
87
|
+
* The connection_expiration extension now supports a
|
88
|
+
Database#connection_expiration_random_delay attribute, which is used
|
89
|
+
to randomize the expiration times, avoiding the thundering herd
|
90
|
+
problem.
|
91
|
+
|
92
|
+
* The pg_enum extension now supports a rename_enum method for renaming
|
93
|
+
existing enum types.
|
94
|
+
|
95
|
+
* Database#error_info on PostgreSQL now returns much more metadata
|
96
|
+
regarding the error.
|
97
|
+
|
98
|
+
= Other Improvements
|
99
|
+
|
100
|
+
* The dataset returned by the following dataset methods is cached,
|
101
|
+
which can improve performance significantly in certain cases:
|
102
|
+
|
103
|
+
* #distinct (without arguments or block)
|
104
|
+
* #from_self (without options)
|
105
|
+
* #lateral
|
106
|
+
* #qualify (without argument)
|
107
|
+
* #returning (without arguments)
|
108
|
+
* #select_all (without arguments)
|
109
|
+
|
110
|
+
* If the primary_key serial: true, type: :serial, or type: :bigserial
|
111
|
+
options are given on PostgreSQL 10.2+, use a serial primary key
|
112
|
+
instead of an identity primary key. This change was included in
|
113
|
+
Sequel 5.7.1.
|
114
|
+
|
115
|
+
* The :search_path Database option is now supported as a shard
|
116
|
+
option on PostgreSQL, so different shards can use different
|
117
|
+
search paths.
|
118
|
+
|
119
|
+
* The correct column order in Database#foreign_key_list on MySQL is
|
120
|
+
now forced, fixing issues on MySQL 8+.
|
121
|
+
|
122
|
+
* When using case sensitive regexp matches on MySQL 8+, Sequel now
|
123
|
+
uses the REGEXP_LIKE function instead of the REGEXP BINARY
|
124
|
+
operator, to work around what appears to be a bug in MySQL 8+
|
125
|
+
related to the change in MySQL's regexp engine.
|
126
|
+
|
127
|
+
* On MySQL 5.7+, the :extended option to Dataset#explain is now
|
128
|
+
ignored, since the :extended option's behavior in previous
|
129
|
+
MySQL versions is now the default behavior.
|
130
|
+
|
131
|
+
* The MySQL HY000 generic SQL state error code is now ignored
|
132
|
+
in the mysql2 adapter, so it falls back to using the more
|
133
|
+
accurate backup error mapping in that case.
|
134
|
+
|
135
|
+
* The pg_enum extension's schema modification methods now work
|
136
|
+
correctly if the Database instance is frozen.
|
137
|
+
|
138
|
+
* The tactical_eager_loading plugin now respects the :allow_eager
|
139
|
+
association option, and will not attempt to eagerly load
|
140
|
+
associations when :allow_eager is false.
|
141
|
+
|
142
|
+
* Using multiple add_constraint calls and a set_column_null call in
|
143
|
+
the same alter_table block on SQLite now works correctly. Note
|
144
|
+
that if you are planning on ever modifying existing tables beyond
|
145
|
+
adding columns, you should probably choose a database that natively
|
146
|
+
supports such modification (SQLite does not).
|
147
|
+
|
148
|
+
* Hashes returned by Database#foreign_key_list on PostgreSQL now
|
149
|
+
include a :schema entry, unless the support has been enabled
|
150
|
+
to make the :table entry be a qualified identifier.
|
151
|
+
|
152
|
+
* Dataset#support_cte?(:insert) no longer returns true on
|
153
|
+
SQLAnywhere. SQLAnywhere only supports common table
|
154
|
+
expressions for INSERT ... SELECT, not for all INSERT
|
155
|
+
statements. INSERT ... WITH ... SELECT is already
|
156
|
+
supported in Sequel using:
|
157
|
+
|
158
|
+
DB[:t1].insert(DB[:t2].with(DB[:t3]))
|
159
|
+
|
160
|
+
* Model#_valid? is no longer made a public method in the
|
161
|
+
error_splitter plugin.
|
162
|
+
|
163
|
+
= Backwards Compatibility
|
164
|
+
|
165
|
+
* Calling the filter method on a proxy object returned by the
|
166
|
+
association_proxies plugin now warns on ruby <2.6. This is
|
167
|
+
because starting in ruby 2.6, the behavior will change and the
|
168
|
+
method will be called on the array of associated objects
|
169
|
+
instead of on the dataset, as Enumerable#filter is being added
|
170
|
+
in ruby 2.6.
|
data/lib/sequel/adapters/jdbc.rb
CHANGED
@@ -211,7 +211,7 @@ module Sequel
|
|
211
211
|
end
|
212
212
|
end
|
213
213
|
end
|
214
|
-
|
214
|
+
setup_connection_with_opts(conn, opts)
|
215
215
|
end
|
216
216
|
|
217
217
|
# Close given adapter connections, and delete any related prepared statements.
|
@@ -585,6 +585,11 @@ module Sequel
|
|
585
585
|
conn
|
586
586
|
end
|
587
587
|
|
588
|
+
# Setup the connection using the given connection options. Return the connection. Can be overridden in subadapters for database specific setup.
|
589
|
+
def setup_connection_with_opts(conn, opts)
|
590
|
+
setup_connection(conn)
|
591
|
+
end
|
592
|
+
|
588
593
|
def schema_column_set_db_type(schema)
|
589
594
|
case schema[:type]
|
590
595
|
when :string
|
@@ -187,10 +187,10 @@ module Sequel
|
|
187
187
|
end
|
188
188
|
|
189
189
|
# Execute the connection configuration SQL queries on the connection.
|
190
|
-
def
|
191
|
-
conn = super
|
190
|
+
def setup_connection_with_opts(conn, opts)
|
191
|
+
conn = super
|
192
192
|
statement(conn) do |stmt|
|
193
|
-
connection_configuration_sqls.each{|sql| log_connection_yield(sql, conn){stmt.execute(sql)}}
|
193
|
+
connection_configuration_sqls(opts).each{|sql| log_connection_yield(sql, conn){stmt.execute(sql)}}
|
194
194
|
end
|
195
195
|
conn
|
196
196
|
end
|
@@ -220,7 +220,7 @@ module Sequel
|
|
220
220
|
end
|
221
221
|
end
|
222
222
|
|
223
|
-
connection_configuration_sqls.each{|sql| conn.execute(sql)}
|
223
|
+
connection_configuration_sqls(opts).each{|sql| conn.execute(sql)}
|
224
224
|
conn
|
225
225
|
end
|
226
226
|
|
@@ -247,26 +247,48 @@ module Sequel
|
|
247
247
|
|
248
248
|
if USES_PG && Object.const_defined?(:PG) && ::PG.const_defined?(:Constants) && ::PG::Constants.const_defined?(:PG_DIAG_SCHEMA_NAME)
|
249
249
|
# Return a hash of information about the related PGError (or Sequel::DatabaseError that
|
250
|
-
# wraps a PGError), with the following entries:
|
250
|
+
# wraps a PGError), with the following entries (any of which may be +nil+):
|
251
251
|
#
|
252
252
|
# :schema :: The schema name related to the error
|
253
253
|
# :table :: The table name related to the error
|
254
254
|
# :column :: the column name related to the error
|
255
255
|
# :constraint :: The constraint name related to the error
|
256
256
|
# :type :: The datatype name related to the error
|
257
|
+
# :severity :: The severity of the error (e.g. "ERROR")
|
258
|
+
# :sql_state :: The SQL state code related to the error
|
259
|
+
# :message_primary :: A single line message related to the error
|
260
|
+
# :message_detail :: Any detail supplementing the primary message
|
261
|
+
# :message_hint :: Possible suggestion about how to fix the problem
|
262
|
+
# :statement_position :: Character offset in statement submitted by client where error occurred (starting at 1)
|
263
|
+
# :internal_position :: Character offset in internal statement where error occurred (starting at 1)
|
264
|
+
# :internal_query :: Text of internally-generated statement where error occurred
|
265
|
+
# :source_file :: PostgreSQL source file where the error occurred
|
266
|
+
# :source_line :: Line number of PostgreSQL source file where the error occurred
|
267
|
+
# :source_function :: Function in PostgreSQL source file where the error occurred
|
257
268
|
#
|
258
269
|
# This requires a PostgreSQL 9.3+ server and 9.3+ client library,
|
259
270
|
# and ruby-pg 0.16.0+ to be supported.
|
260
271
|
def error_info(e)
|
261
272
|
e = e.wrapped_exception if e.is_a?(DatabaseError)
|
262
273
|
r = e.result
|
263
|
-
h = {
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
274
|
+
h = {
|
275
|
+
:schema => r.error_field(::PG::PG_DIAG_SCHEMA_NAME),
|
276
|
+
:table => r.error_field(::PG::PG_DIAG_TABLE_NAME),
|
277
|
+
:column => r.error_field(::PG::PG_DIAG_COLUMN_NAME),
|
278
|
+
:constraint => r.error_field(::PG::PG_DIAG_CONSTRAINT_NAME),
|
279
|
+
:type => r.error_field(::PG::PG_DIAG_DATATYPE_NAME),
|
280
|
+
:severity => r.error_field(::PG::PG_DIAG_SEVERITY),
|
281
|
+
:sql_state => r.error_field(::PG::PG_DIAG_SQLSTATE),
|
282
|
+
:message_primary => r.error_field(::PG::PG_DIAG_MESSAGE_PRIMARY),
|
283
|
+
:message_detail => r.error_field(::PG::PG_DIAG_MESSAGE_DETAIL),
|
284
|
+
:message_hint => r.error_field(::PG::PG_DIAG_MESSAGE_HINT),
|
285
|
+
:statement_position => r.error_field(::PG::PG_DIAG_STATEMENT_POSITION),
|
286
|
+
:internal_position => r.error_field(::PG::PG_DIAG_INTERNAL_POSITION),
|
287
|
+
:internal_query => r.error_field(::PG::PG_DIAG_INTERNAL_QUERY),
|
288
|
+
:source_file => r.error_field(::PG::PG_DIAG_SOURCE_FILE),
|
289
|
+
:source_line => r.error_field(::PG::PG_DIAG_SOURCE_LINE),
|
290
|
+
:source_function => r.error_field(::PG::PG_DIAG_SOURCE_FUNCTION)
|
291
|
+
}
|
270
292
|
end
|
271
293
|
end
|
272
294
|
|
@@ -482,7 +504,7 @@ module Sequel
|
|
482
504
|
end
|
483
505
|
|
484
506
|
# Set the DateStyle to ISO if configured, for faster date parsing.
|
485
|
-
def connection_configuration_sqls
|
507
|
+
def connection_configuration_sqls(opts=@opts)
|
486
508
|
sqls = super
|
487
509
|
sqls << "SET DateStyle = 'ISO'" if @use_iso_date_format
|
488
510
|
sqls
|