sequel 5.5.0 → 5.6.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 +12 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/lib/sequel/adapters/shared/mssql.rb +1 -1
- data/lib/sequel/database/query.rb +20 -4
- data/lib/sequel/extensions/migration.rb +16 -26
- data/lib/sequel/extensions/pg_array.rb +1 -1
- data/lib/sequel/extensions/pg_enum.rb +1 -1
- data/lib/sequel/extensions/pg_hstore.rb +1 -1
- data/lib/sequel/extensions/pg_inet.rb +1 -1
- data/lib/sequel/extensions/pg_interval.rb +1 -1
- data/lib/sequel/extensions/pg_json.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +2 -2
- data/lib/sequel/extensions/schema_caching.rb +10 -1
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/postgres_spec.rb +1 -1
- data/spec/core/connection_pool_spec.rb +4 -4
- data/spec/core/schema_spec.rb +9 -0
- data/spec/core_extensions_spec.rb +2 -0
- data/spec/extensions/association_pks_spec.rb +1 -1
- data/spec/extensions/migration_spec.rb +49 -13
- data/spec/extensions/pg_extended_date_support_spec.rb +4 -4
- data/spec/extensions/pg_json_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +23 -0
- data/spec/extensions/synchronize_sql_spec.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22f13ee2ed2a19be6277fbe8092c8e450e241e57acac0c950aa5d8d9c8c49782
|
4
|
+
data.tar.gz: e8d0938b3a2998bb46e09bbab86c7a0e669d87b8bde8f5b39f43be9ce2cc6a41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48f505592a3d093fd3a355011c08c1eb971f47ef6aa56a80510c4de88009a3e52739d2294f1c03b3a60243632e53b9d4cd218c4d5f96efdce5c78bf2b029c3ba
|
7
|
+
data.tar.gz: dfb7034d9f9c358f6b8a90fd0164e4ff503571445ce3d25afc99be3e873631acc45ea3bdf964680d0a5b6bc92b58fd9807117278adea6d984f89a4368ac1a75a
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
=== 5.6.0 (2018-03-01)
|
2
|
+
|
3
|
+
* Dedup :db_type strings in schema hashes on Ruby 2.5+ (jeremyevans)
|
4
|
+
|
5
|
+
* Make schema_caching extension work with :callable_default schema values (jeremyevans)
|
6
|
+
|
7
|
+
* Freeze string valuse in hashes returned by Database#schema when using the schema_caching extension (jeremyevans)
|
8
|
+
|
9
|
+
* Protect migration file loading with a mutex to not break when multiple threads load migration files simultaneously (jeremyevans)
|
10
|
+
|
11
|
+
* Respect identifier mangling rules when renaming columns on Microsoft SQL Server (jeremyevans)
|
12
|
+
|
1
13
|
=== 5.5.0 (2018-01-31)
|
2
14
|
|
3
15
|
* Make Database#copy_table in the postgres adapter handle errors that occur while processing rows (jeremyevans) (#1470)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
= Improvements
|
2
|
+
|
3
|
+
* Running migrations using one of the included migrators on separate
|
4
|
+
Database objects in separate threads simultaneously is now
|
5
|
+
supported. Previously, the migrators were not thread-safe.
|
6
|
+
|
7
|
+
* On Ruby 2.5+, :db_type entries in the schema hashes are now deduped
|
8
|
+
for a slight memory savings when using many columns with the same
|
9
|
+
database type.
|
10
|
+
|
11
|
+
* The schema_caching extension now freezes string values in the
|
12
|
+
resulting hashes, just as the default schema parsing code started
|
13
|
+
doing in 5.5.0.
|
14
|
+
|
15
|
+
* The schema_caching extension now supports the :callable_default
|
16
|
+
schema values used by the pg_json, pg_array, and pg_hstore
|
17
|
+
extensions, by removing the entry before caching and resetting it
|
18
|
+
after restoring the cache.
|
19
|
+
|
20
|
+
* Identifier mangling rules are now respected when renaming columns on
|
21
|
+
Microsoft SQL Server.
|
22
|
+
|
23
|
+
= Backwards Compatibility
|
24
|
+
|
25
|
+
* The migrator internals were modified in order to support
|
26
|
+
thread-safety. The private Migrator#remove_migration_classes
|
27
|
+
method has been removed, and #load_migration_file now returns the
|
28
|
+
migration object/class instead of populating Migration.descendants.
|
29
|
+
Migration.descendants is now only used for temporary storage, and
|
30
|
+
will no longer contain all migration objects/classes used by the
|
31
|
+
migrator.
|
@@ -260,7 +260,7 @@ module Sequel
|
|
260
260
|
add_drop_default_constraint_sql(sqls, table, op[:name])
|
261
261
|
sqls << super
|
262
262
|
when :rename_column
|
263
|
-
"sp_rename #{literal("#{quote_schema_table(table)}.#{quote_identifier(op[:name])}")}, #{literal(op[:new_name]
|
263
|
+
"sp_rename #{literal("#{quote_schema_table(table)}.#{quote_identifier(op[:name])}")}, #{literal(metadata_dataset.with_quote_identifiers(false).quote_identifier(op[:new_name]))}, 'COLUMN'"
|
264
264
|
when :set_column_type
|
265
265
|
sqls = []
|
266
266
|
if sch = schema(table)
|
@@ -175,11 +175,9 @@ module Sequel
|
|
175
175
|
if !c[:max_length] && c[:type] == :string && (max_length = column_schema_max_length(c[:db_type]))
|
176
176
|
c[:max_length] = max_length
|
177
177
|
end
|
178
|
-
|
179
|
-
c.each_value do |v|
|
180
|
-
v.freeze if v.is_a?(String)
|
181
|
-
end
|
182
178
|
end
|
179
|
+
schema_post_process(cols)
|
180
|
+
|
183
181
|
Sequel.synchronize{@schemas[quoted_name] = cols} if cache_schema
|
184
182
|
cols
|
185
183
|
end
|
@@ -343,5 +341,23 @@ module Sequel
|
|
343
341
|
:enum
|
344
342
|
end
|
345
343
|
end
|
344
|
+
|
345
|
+
# Post process the schema values.
|
346
|
+
def schema_post_process(cols)
|
347
|
+
if RUBY_VERSION >= '2.5'
|
348
|
+
cols.each do |_, h|
|
349
|
+
db_type = h[:db_type]
|
350
|
+
if db_type.is_a?(String)
|
351
|
+
h[:db_type] = -db_type
|
352
|
+
end
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
cols.each do |_,c|
|
357
|
+
c.each_value do |val|
|
358
|
+
val.freeze if val.is_a?(String)
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|
346
362
|
end
|
347
363
|
end
|
@@ -352,6 +352,9 @@ module Sequel
|
|
352
352
|
class Migrator
|
353
353
|
MIGRATION_FILE_PATTERN = /\A(\d+)_.+\.rb\z/i.freeze
|
354
354
|
|
355
|
+
# Mutex used around migration file loading
|
356
|
+
MUTEX = Mutex.new
|
357
|
+
|
355
358
|
# Exception class raised when there is an error with the migrator's
|
356
359
|
# file structure, database, or arguments.
|
357
360
|
class Error < Sequel::Error
|
@@ -476,19 +479,16 @@ module Sequel
|
|
476
479
|
# Load the migration file, raising an exception if the file does not define
|
477
480
|
# a single migration.
|
478
481
|
def load_migration_file(file)
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
Migration.descendants.each do |c|
|
489
|
-
Object.send(:remove_const, c.name) if c.is_a?(Class) && !c.name.to_s.empty? && Object.const_defined?(c.name)
|
482
|
+
MUTEX.synchronize do
|
483
|
+
n = Migration.descendants.length
|
484
|
+
load(file)
|
485
|
+
raise Error, "Migration file #{file.inspect} not containing a single migration detected" unless n + 1 == Migration.descendants.length
|
486
|
+
c = Migration.descendants.pop
|
487
|
+
if c.is_a?(Class) && !c.name.to_s.empty? && Object.const_defined?(c.name)
|
488
|
+
Object.send(:remove_const, c.name)
|
489
|
+
end
|
490
|
+
c
|
490
491
|
end
|
491
|
-
Migration.descendants.clear # remove any defined migration classes
|
492
492
|
end
|
493
493
|
|
494
494
|
# Return the integer migration version based on the filename.
|
@@ -597,13 +597,7 @@ module Sequel
|
|
597
597
|
# Returns a list of migration classes filtered for the migration range and
|
598
598
|
# ordered according to the migration direction.
|
599
599
|
def get_migrations
|
600
|
-
|
601
|
-
|
602
|
-
# load migration files
|
603
|
-
version_numbers.each{|n| load_migration_file(files[n])}
|
604
|
-
|
605
|
-
# get migration classes
|
606
|
-
Migration.descendants
|
600
|
+
version_numbers.map{|n| load_migration_file(files[n])}
|
607
601
|
end
|
608
602
|
|
609
603
|
# Returns the latest version available in the specified directory.
|
@@ -740,7 +734,6 @@ module Sequel
|
|
740
734
|
|
741
735
|
# Returns tuples of migration, filename, and direction
|
742
736
|
def get_migration_tuples
|
743
|
-
remove_migration_classes
|
744
737
|
up_mts = []
|
745
738
|
down_mts = []
|
746
739
|
ms = Migration.descendants
|
@@ -750,16 +743,13 @@ module Sequel
|
|
750
743
|
if target
|
751
744
|
if migration_version_from_file(f) > target
|
752
745
|
if applied_migrations.include?(fi)
|
753
|
-
load_migration_file(path)
|
754
|
-
down_mts << [ms.last, f, :down]
|
746
|
+
down_mts << [load_migration_file(path), f, :down]
|
755
747
|
end
|
756
748
|
elsif !applied_migrations.include?(fi)
|
757
|
-
load_migration_file(path)
|
758
|
-
up_mts << [ms.last, f, :up]
|
749
|
+
up_mts << [load_migration_file(path), f, :up]
|
759
750
|
end
|
760
751
|
elsif !applied_migrations.include?(fi)
|
761
|
-
load_migration_file(path)
|
762
|
-
up_mts << [ms.last, f, :up]
|
752
|
+
up_mts << [load_migration_file(path), f, :up]
|
763
753
|
end
|
764
754
|
end
|
765
755
|
up_mts + down_mts.reverse
|
@@ -254,7 +254,7 @@ module Sequel
|
|
254
254
|
end
|
255
255
|
|
256
256
|
# Set the :callable_default value if the default value is recognized as an empty array.
|
257
|
-
def
|
257
|
+
def schema_post_process(_)
|
258
258
|
super.each do |a|
|
259
259
|
h = a[1]
|
260
260
|
if h[:default] =~ /\A(?:'\{\}'|ARRAY\[\])::([\w ]+)\[\]\z/
|
@@ -131,7 +131,7 @@ module Sequel
|
|
131
131
|
|
132
132
|
# For schema entries that are enums, set the type to
|
133
133
|
# :enum and add a :enum_values entry with the enum values.
|
134
|
-
def
|
134
|
+
def schema_post_process(_)
|
135
135
|
super.each do |_, s|
|
136
136
|
if values = @enum_labels[s[:oid]]
|
137
137
|
s[:type] = :enum
|
@@ -155,7 +155,7 @@ module Sequel
|
|
155
155
|
end
|
156
156
|
|
157
157
|
# Set the :callable_default value if the default value is recognized as an empty hstore.
|
158
|
-
def
|
158
|
+
def schema_post_process(_)
|
159
159
|
super.each do |a|
|
160
160
|
h = a[1]
|
161
161
|
if h[:type] == :hstore && h[:default] =~ /\A''::hstore\z/
|
@@ -86,7 +86,7 @@ module Sequel
|
|
86
86
|
end
|
87
87
|
|
88
88
|
# Set the :ruby_default value if the default value is recognized as an ip address.
|
89
|
-
def
|
89
|
+
def schema_post_process(_)
|
90
90
|
super.each do |a|
|
91
91
|
h = a[1]
|
92
92
|
if h[:type] == :ipaddr && h[:default] =~ /\A'([:a-fA-F0-9\.\/]+)'::(?:inet|cidr)\z/
|
@@ -147,7 +147,7 @@ module Sequel
|
|
147
147
|
end
|
148
148
|
|
149
149
|
# Set the :ruby_default value if the default value is recognized as an interval.
|
150
|
-
def
|
150
|
+
def schema_post_process(_)
|
151
151
|
super.each do |a|
|
152
152
|
h = a[1]
|
153
153
|
if h[:type] == :interval && h[:default] =~ /\A'([\w ]+)'::interval\z/
|
@@ -215,7 +215,7 @@ module Sequel
|
|
215
215
|
end
|
216
216
|
|
217
217
|
# Set the :callable_default value if the default value is recognized as an empty json/jsonb array/hash.
|
218
|
-
def
|
218
|
+
def schema_post_process(_)
|
219
219
|
super.each do |a|
|
220
220
|
h = a[1]
|
221
221
|
if (h[:type] == :json || h[:type] == :jsonb) && h[:default] =~ /\A'(\{\}|\[\])'::jsonb?\z/
|
@@ -263,14 +263,14 @@ module Sequel
|
|
263
263
|
end
|
264
264
|
|
265
265
|
# Set the :ruby_default value if the default value is recognized as a range.
|
266
|
-
def
|
266
|
+
def schema_post_process(_)
|
267
267
|
super.each do |a|
|
268
268
|
h = a[1]
|
269
269
|
db_type = h[:db_type]
|
270
270
|
if @pg_range_schema_types[db_type] && h[:default] =~ /\A'([^']+)'::#{db_type}\z/
|
271
271
|
default = $1
|
272
272
|
if convertor = conversion_procs[h[:oid]]
|
273
|
-
h[:ruby_default] = convertor.call(
|
273
|
+
h[:ruby_default] = convertor.call(default)
|
274
274
|
end
|
275
275
|
end
|
276
276
|
end
|
@@ -51,7 +51,15 @@ module Sequel
|
|
51
51
|
module SchemaCaching
|
52
52
|
# Dump the cached schema to the filename given in Marshal format.
|
53
53
|
def dump_schema_cache(file)
|
54
|
-
|
54
|
+
sch = {}
|
55
|
+
@schemas.each do |k,v|
|
56
|
+
sch[k] = v.map do |c, h|
|
57
|
+
h = Hash[h]
|
58
|
+
h.delete(:callable_default)
|
59
|
+
[c, h]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
File.open(file, 'wb'){|f| f.write(Marshal.dump(sch))}
|
55
63
|
nil
|
56
64
|
end
|
57
65
|
|
@@ -65,6 +73,7 @@ module Sequel
|
|
65
73
|
# should be in Marshal format.
|
66
74
|
def load_schema_cache(file)
|
67
75
|
@schemas = Marshal.load(File.read(file))
|
76
|
+
@schemas.each_value{|v| schema_post_process(v)}
|
68
77
|
nil
|
69
78
|
end
|
70
79
|
|
data/lib/sequel/version.rb
CHANGED
@@ -5,7 +5,7 @@ module Sequel
|
|
5
5
|
MAJOR = 5
|
6
6
|
# The minor version of Sequel. Bumped for every non-patch level
|
7
7
|
# release, generally around once a month.
|
8
|
-
MINOR =
|
8
|
+
MINOR = 6
|
9
9
|
# The tiny version of Sequel. Usually 0, only bumped for bugfix
|
10
10
|
# releases that fix regressions from previous versions.
|
11
11
|
TINY = 0
|
@@ -788,7 +788,7 @@ describe "A PostgreSQL dataset with a timestamp field" do
|
|
788
788
|
@db.convert_infinite_timestamps = :string
|
789
789
|
@db[:test3].get(:time).must_equal '-infinity'
|
790
790
|
@db.convert_infinite_timestamps = :date
|
791
|
-
@db[:test3].get(:time).must_equal
|
791
|
+
@db[:test3].get(:time).must_equal(-Date::Infinity.new)
|
792
792
|
@db.convert_infinite_timestamps = :float
|
793
793
|
@db[:test3].get(:time).must_equal(-1.0/0.0)
|
794
794
|
end
|
@@ -354,16 +354,16 @@ ThreadedConnectionPoolSpecs = shared_description do
|
|
354
354
|
@pool.disconnect
|
355
355
|
b = @icpp
|
356
356
|
|
357
|
-
|
357
|
+
time = Time.now
|
358
358
|
cc = {}
|
359
359
|
threads = []
|
360
360
|
results = []
|
361
|
-
|
361
|
+
j = 0
|
362
362
|
q, q1, q2, q3, q4 = Queue.new, Queue.new, Queue.new, Queue.new, Queue.new
|
363
363
|
m = @m
|
364
364
|
@pool.db.define_singleton_method(:connect) do |server|
|
365
365
|
q1.pop
|
366
|
-
m.synchronize{q3.push(
|
366
|
+
m.synchronize{q3.push(j += 1)}
|
367
367
|
q4.pop
|
368
368
|
b.call
|
369
369
|
end
|
@@ -375,7 +375,7 @@ ThreadedConnectionPoolSpecs = shared_description do
|
|
375
375
|
5.times{|i| q.pop}
|
376
376
|
results.sort.must_equal (1..5).to_a
|
377
377
|
threads.each(&:join)
|
378
|
-
(Time.now -
|
378
|
+
(Time.now - time).must_be :<, 0.75
|
379
379
|
|
380
380
|
threads.each{|t| t.wont_be :alive?}
|
381
381
|
cc.size.must_equal 5
|
data/spec/core/schema_spec.rb
CHANGED
@@ -1672,6 +1672,15 @@ describe "Schema Parser" do
|
|
1672
1672
|
@sqls.must_equal ['x', 'x']
|
1673
1673
|
end
|
1674
1674
|
|
1675
|
+
it "should dedup :db_type strings" do
|
1676
|
+
@db.define_singleton_method(:schema_parse_table) do |t, opts|
|
1677
|
+
[[:a, {:db_type=>t.to_s.dup}], [:b, {:db_type=>t.to_s.dup}]]
|
1678
|
+
end
|
1679
|
+
sch = @db.schema(:x)
|
1680
|
+
sch.must_equal [[:a, {:db_type=>"x", :ruby_default=>nil}], [:b, {:db_type=>"x", :ruby_default=>nil}]]
|
1681
|
+
sch[0][1][:db_type].must_be_same_as(sch[1][1][:db_type])
|
1682
|
+
end if RUBY_VERSION >= '2.5'
|
1683
|
+
|
1675
1684
|
it "should set :auto_increment to true by default if unset and a single integer primary key is used" do
|
1676
1685
|
@db.define_singleton_method(:schema_parse_table){|*| [[:a, {:primary_key=>true, :db_type=>'integer'}]]}
|
1677
1686
|
@db.schema(:x).first.last[:auto_increment].must_equal true
|
@@ -266,7 +266,7 @@ describe "Sequel::Plugins::AssociationPks" do
|
|
266
266
|
it "should not automatically convert keys to numbers if the primary key is an integer for many_to_many associations" do
|
267
267
|
@Tag.db_schema[:id][:type] = :string
|
268
268
|
@Album.load(:id=>2).tag_pks = %w'1 3'
|
269
|
-
|
269
|
+
@db.sqls.must_equal [
|
270
270
|
"DELETE FROM albums_tags WHERE ((album_id = 2) AND (tag_id NOT IN ('1', '3')))",
|
271
271
|
'SELECT tag_id FROM albums_tags WHERE (album_id = 2)',
|
272
272
|
'BEGIN',
|
@@ -463,11 +463,10 @@ end
|
|
463
463
|
|
464
464
|
describe "Sequel::TimestampMigrator" do
|
465
465
|
before do
|
466
|
-
sequel_migration_version = 0
|
467
466
|
@dsc = dsc = Class.new(Sequel::Mock::Dataset) do
|
468
|
-
|
469
|
-
|
470
|
-
|
467
|
+
def files
|
468
|
+
db.files
|
469
|
+
end
|
471
470
|
|
472
471
|
def columns
|
473
472
|
super
|
@@ -485,11 +484,11 @@ describe "Sequel::TimestampMigrator" do
|
|
485
484
|
super
|
486
485
|
case opts[:from].first
|
487
486
|
when :schema_info, 'schema_info'
|
488
|
-
yield({:version=>sequel_migration_version})
|
487
|
+
yield({:version=>db.sequel_migration_version})
|
489
488
|
when :schema_migrations, 'schema_migrations'
|
490
|
-
|
489
|
+
files.sort.each{|f| yield(:filename=>f)}
|
491
490
|
when :sm, 'sm'
|
492
|
-
|
491
|
+
files.sort.each{|f| yield(:fn=>f)}
|
493
492
|
end
|
494
493
|
end
|
495
494
|
|
@@ -497,9 +496,9 @@ describe "Sequel::TimestampMigrator" do
|
|
497
496
|
super
|
498
497
|
case opts[:from].first
|
499
498
|
when :schema_info, 'schema_info'
|
500
|
-
|
499
|
+
db.sequel_migration_version = h.values.first
|
501
500
|
when :schema_migrations, :sm, 'schema_migrations', 'sm'
|
502
|
-
|
501
|
+
files << h.values.first
|
503
502
|
end
|
504
503
|
end
|
505
504
|
|
@@ -507,7 +506,7 @@ describe "Sequel::TimestampMigrator" do
|
|
507
506
|
super
|
508
507
|
case opts[:from].first
|
509
508
|
when :schema_info, 'schema_info'
|
510
|
-
|
509
|
+
db.sequel_migration_version = h.values.first
|
511
510
|
end
|
512
511
|
end
|
513
512
|
|
@@ -515,15 +514,27 @@ describe "Sequel::TimestampMigrator" do
|
|
515
514
|
super
|
516
515
|
case opts[:from].first
|
517
516
|
when :schema_migrations, :sm, 'schema_migrations', 'sm'
|
518
|
-
|
517
|
+
files.delete(opts[:where].args.last)
|
519
518
|
end
|
520
519
|
end
|
521
520
|
end
|
522
521
|
dbc = Class.new(Sequel::Mock::Database) do
|
523
|
-
|
522
|
+
def files
|
523
|
+
@files ||= []
|
524
|
+
end
|
525
|
+
|
526
|
+
def tables
|
527
|
+
@tables ||= {}
|
528
|
+
end
|
529
|
+
|
530
|
+
def sequel_migration_version
|
531
|
+
@sequel_migration_version ||= 0
|
532
|
+
end
|
533
|
+
attr_writer :sequel_migration_version
|
534
|
+
|
524
535
|
def create_table(name, *args, &block)
|
525
536
|
super
|
526
|
-
|
537
|
+
tables[name.to_sym] = true
|
527
538
|
end
|
528
539
|
define_method(:drop_table){|*names| super(*names); names.each{|n| tables.delete(n.to_sym)}}
|
529
540
|
define_method(:table_exists?){|name| super(name); tables.has_key?(name.to_sym)}
|
@@ -569,6 +580,31 @@ describe "Sequel::TimestampMigrator" do
|
|
569
580
|
@db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb'
|
570
581
|
end
|
571
582
|
|
583
|
+
it "should work correctly when multithreaded" do
|
584
|
+
range = 0..4
|
585
|
+
dbs = range.map do
|
586
|
+
db = @db.class.new
|
587
|
+
db.dataset_class = @db.dataset_class
|
588
|
+
db
|
589
|
+
end
|
590
|
+
|
591
|
+
q1, q2 = Queue.new, Queue.new
|
592
|
+
@dir = 'spec/files/timestamped_migrations'
|
593
|
+
threads = dbs.map do |db|
|
594
|
+
Thread.new do
|
595
|
+
q1.pop
|
596
|
+
@m.apply(db, @dir)
|
597
|
+
[:schema_migrations, :sm1111, :sm2222, :sm3333].each{|n| _(db.table_exists?(n)).must_equal true}
|
598
|
+
_(db[:schema_migrations].select_order_map(:filename)).must_equal %w'1273253849_create_sessions.rb 1273253851_create_nodes.rb 1273253853_3_create_users.rb'
|
599
|
+
q2.push db
|
600
|
+
end
|
601
|
+
end
|
602
|
+
|
603
|
+
range.each{q1.push nil}
|
604
|
+
(dbs - range.map{q2.pop}).must_be :empty?
|
605
|
+
threads.each(&:join)
|
606
|
+
end
|
607
|
+
|
572
608
|
it "should not be current when there are migrations to apply" do
|
573
609
|
@dir = 'spec/files/timestamped_migrations'
|
574
610
|
@m.apply(@db, @dir)
|
@@ -53,16 +53,16 @@ describe "pg_extended_date_support extension" do
|
|
53
53
|
@db.convert_infinite_timestamps = v
|
54
54
|
d.(pi).must_equal Date::Infinity.new
|
55
55
|
t.(pi).must_equal Date::Infinity.new
|
56
|
-
d.(ni).must_equal
|
57
|
-
t.(ni).must_equal
|
56
|
+
d.(ni).must_equal(-Date::Infinity.new)
|
57
|
+
t.(ni).must_equal(-Date::Infinity.new)
|
58
58
|
end
|
59
59
|
|
60
60
|
[:float, 'float', 't', true].each do |v|
|
61
61
|
@db.convert_infinite_timestamps = v
|
62
62
|
d.(pi).must_equal 1.0/0.0
|
63
63
|
t.(pi).must_equal 1.0/0.0
|
64
|
-
d.(ni).must_equal
|
65
|
-
t.(ni).must_equal
|
64
|
+
d.(ni).must_equal(-1.0/0.0)
|
65
|
+
t.(ni).must_equal(-1.0/0.0)
|
66
66
|
end
|
67
67
|
|
68
68
|
['f', false].each do |v|
|
@@ -91,7 +91,7 @@ describe "pg_json extension" do
|
|
91
91
|
@db.literal(Sequel.pg_json('a'=>'b')).must_equal "'{\"a\":\"b\"}'::json"
|
92
92
|
end
|
93
93
|
|
94
|
-
it "should literalize
|
94
|
+
it "should literalize JSONBHash and JSONBArray to strings correctly" do
|
95
95
|
@db.literal(Sequel.pg_jsonb([])).must_equal "'[]'::jsonb"
|
96
96
|
@db.literal(Sequel.pg_jsonb([1, [2], {'a'=>'b'}])).must_equal "'[1,[2],{\"a\":\"b\"}]'::jsonb"
|
97
97
|
@db.literal(Sequel.pg_jsonb({})).must_equal "'{}'::jsonb"
|
@@ -18,6 +18,18 @@ describe "schema_caching extension" do
|
|
18
18
|
File.size(@filename).must_be :>, 0
|
19
19
|
end
|
20
20
|
|
21
|
+
it "Database#dump_schema_cache/load_schema_cache should work with :callable_default values set in schema_post_process" do
|
22
|
+
@schemas['"table"'][0][1][:callable_default] = lambda{1}
|
23
|
+
@schemas['"table"'][0][1][:default] = 'call_1'
|
24
|
+
@db.dump_schema_cache(@filename)
|
25
|
+
db = Sequel.mock(:host=>'postgres').extension(:schema_caching)
|
26
|
+
def db.schema_post_process(_)
|
27
|
+
super.each{|_, c| c[:callable_default] = lambda{1} if c[:default] == 'call_1'}
|
28
|
+
end
|
29
|
+
db.load_schema_cache(@filename)
|
30
|
+
db.schema(:table)[0][1][:callable_default].call.must_equal 1
|
31
|
+
end
|
32
|
+
|
21
33
|
it "Database#load_schema_cache should load cached schema from the given file dumped by #dump_schema_cache" do
|
22
34
|
@db.dump_schema_cache(@filename)
|
23
35
|
db = Sequel::Database.new.extension(:schema_caching)
|
@@ -25,6 +37,17 @@ describe "schema_caching extension" do
|
|
25
37
|
@db.instance_variable_get(:@schemas).must_equal @schemas
|
26
38
|
end
|
27
39
|
|
40
|
+
it "Database#load_schema_cache should have frozen string values in the schema caches" do
|
41
|
+
@db.dump_schema_cache(@filename)
|
42
|
+
db = Sequel.mock(:host=>'postgres').extension(:schema_caching)
|
43
|
+
db.load_schema_cache(@filename)
|
44
|
+
h = db.schema(:table)[0][1]
|
45
|
+
h[:db_type].must_equal 'integer'
|
46
|
+
h[:db_type].frozen?.must_equal true
|
47
|
+
h[:default].must_equal "nextval('table_id_seq'::regclass)"
|
48
|
+
h[:default].frozen?.must_equal true
|
49
|
+
end
|
50
|
+
|
28
51
|
it "Database#dump_schema_cache? should dump cached schema to the given file unless the file exists" do
|
29
52
|
File.open(@filename, 'wb'){|f|}
|
30
53
|
File.size(@filename).must_equal 0
|
@@ -28,7 +28,7 @@ describe "synchronize_sql extension" do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'does not checkout a connection if SQL is given as a string' do
|
31
|
-
|
31
|
+
@ds.extension(:synchronize_sql).with_sql('SELECT 1').sql
|
32
32
|
@db.pool.times_connection_acquired.must_equal 0
|
33
33
|
end
|
34
34
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01
|
11
|
+
date: 2018-03-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -256,6 +256,7 @@ extra_rdoc_files:
|
|
256
256
|
- doc/release_notes/5.3.0.txt
|
257
257
|
- doc/release_notes/5.4.0.txt
|
258
258
|
- doc/release_notes/5.5.0.txt
|
259
|
+
- doc/release_notes/5.6.0.txt
|
259
260
|
files:
|
260
261
|
- CHANGELOG
|
261
262
|
- MIT-LICENSE
|
@@ -406,6 +407,7 @@ files:
|
|
406
407
|
- doc/release_notes/5.3.0.txt
|
407
408
|
- doc/release_notes/5.4.0.txt
|
408
409
|
- doc/release_notes/5.5.0.txt
|
410
|
+
- doc/release_notes/5.6.0.txt
|
409
411
|
- doc/schema_modification.rdoc
|
410
412
|
- doc/security.rdoc
|
411
413
|
- doc/sharding.rdoc
|