activerecord-sqlserver-adapter 5.0.3 → 5.0.4
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.md +8 -0
- data/VERSION +1 -1
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +8 -1
- data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +4 -0
- data/test/cases/column_test_sqlserver.rb +10 -4
- data/test/cases/schema_dumper_test_sqlserver.rb +14 -13
- data/test/cases/transaction_test_sqlserver.rb +25 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f171340d9c4e11e1baf5bfcdcc51c6de645f7c1
|
4
|
+
data.tar.gz: ef6051e74b57e8e5630993749d651a4be43c6f4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 554f6f57cc679315c150b9fe1a624dfc7a58ccd0992c894bfbde6c8b6d487e1b6d0604d4d63048bd48994cfac62b07420a748fe8fdc9ca6b32e875895a58970a
|
7
|
+
data.tar.gz: d3e2d4fe42b20c3d6d6a25a39d6268d0c8f882669c88c3d8f1822d4a5c2ece0599a1d2806fdcdc48b5e79ed53b2d1556bb949c504377d8a3d35d253717e084b3
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## v5.0.4
|
2
|
+
|
3
|
+
#### Fixed
|
4
|
+
|
5
|
+
* Allow `datetimeoffset` to be used in migrations and represented in schema.
|
6
|
+
* Using transactions and resetting isolation level correctly when `READ_COMMITTED_SNAPSHOT` is set to `ON` Fixes #520
|
7
|
+
|
8
|
+
|
1
9
|
## v5.0.3
|
2
10
|
|
3
11
|
#### Changed
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
5.0.
|
1
|
+
5.0.4
|
@@ -14,7 +14,14 @@ module ActiveRecord
|
|
14
14
|
def current_isolation_level
|
15
15
|
return unless sqlserver?
|
16
16
|
level = connection.user_options_isolation_level
|
17
|
-
|
17
|
+
# When READ_COMMITTED_SNAPSHOT is set to ON,
|
18
|
+
# user_options_isolation_level will be equal to 'read committed
|
19
|
+
# snapshot' which is not a valid isolation level
|
20
|
+
if level.blank? || level == 'read committed snapshot'
|
21
|
+
'READ COMMITTED'
|
22
|
+
else
|
23
|
+
level.upcase
|
24
|
+
end
|
18
25
|
end
|
19
26
|
|
20
27
|
end
|
@@ -417,7 +417,7 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
417
417
|
skip 'datetimeoffset not supported in this protocal version' unless connection_dblib_73?
|
418
418
|
col = column('datetimeoffset_7')
|
419
419
|
col.sql_type.must_equal 'datetimeoffset(7)'
|
420
|
-
col.type.must_equal :
|
420
|
+
col.type.must_equal :datetimeoffset
|
421
421
|
col.null.must_equal true
|
422
422
|
col.default.must_equal Time.new(1984, 01, 24, 04, 20, 00, -28800).change(nsec: 123456700), "Nanoseconds <#{col.default.nsec}> vs <123456700>"
|
423
423
|
obj.datetimeoffset_7.must_equal Time.new(1984, 01, 24, 04, 20, 00, -28800).change(nsec: 123456700), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <999999900>"
|
@@ -434,20 +434,26 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
434
434
|
obj.datetimeoffset_7.must_equal Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456800), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <123456800>"
|
435
435
|
obj.reload
|
436
436
|
obj.datetimeoffset_7.must_equal Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456800), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <123456800>"
|
437
|
+
# Maintains the timezone
|
438
|
+
time = ActiveSupport::TimeZone['America/Los_Angeles'].local 2010, 12, 31, 23, 59, 59, Rational(123456800, 1000)
|
439
|
+
obj.datetimeoffset_7 = time
|
440
|
+
obj.datetimeoffset_7.must_equal time
|
441
|
+
obj.save!
|
442
|
+
obj.datetimeoffset_7.must_equal time
|
443
|
+
obj.reload.datetimeoffset_7.must_equal time
|
437
444
|
# With other precisions.
|
438
445
|
time = ActiveSupport::TimeZone['America/Los_Angeles'].local 2010, 12, 31, 23, 59, 59, Rational(123456755, 1000)
|
439
446
|
col = column('datetimeoffset_3')
|
440
447
|
connection.lookup_cast_type_from_column(col).precision.must_equal 3
|
441
448
|
obj.datetimeoffset_3 = time
|
442
449
|
obj.datetimeoffset_3.must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetimeoffset_3.nsec}> vs <123000000>"
|
443
|
-
|
444
|
-
obj.save! ; obj.reload
|
450
|
+
obj.save!
|
445
451
|
obj.datetimeoffset_3.must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetimeoffset_3.nsec}> vs <123000000>"
|
446
452
|
col = column('datetime2_1')
|
447
453
|
connection.lookup_cast_type_from_column(col).precision.must_equal 1
|
448
454
|
obj.datetime2_1 = time
|
449
455
|
obj.datetime2_1.must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
|
450
|
-
obj.save!
|
456
|
+
obj.save!
|
451
457
|
obj.datetime2_1.must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
|
452
458
|
end
|
453
459
|
|
@@ -97,19 +97,20 @@ class SchemaDumperTestSQLServer < ActiveRecord::TestCase
|
|
97
97
|
columns['varbinary_col'].sql_type.must_equal 'varbinary(8000)'
|
98
98
|
columns['uuid_col'].sql_type.must_equal 'uniqueidentifier'
|
99
99
|
columns['sstimestamp_col'].sql_type.must_equal 'timestamp'
|
100
|
-
assert_line :real_col, type: 'real',
|
101
|
-
assert_line :money_col, type: 'money',
|
102
|
-
assert_line :datetime2_col, type: 'datetime',
|
103
|
-
assert_line :
|
104
|
-
assert_line :
|
105
|
-
assert_line :
|
106
|
-
assert_line :
|
107
|
-
assert_line :
|
108
|
-
assert_line :
|
109
|
-
assert_line :
|
110
|
-
assert_line :
|
111
|
-
assert_line :
|
112
|
-
assert_line :
|
100
|
+
assert_line :real_col, type: 'real', limit: nil, precision: nil, scale: nil, default: nil
|
101
|
+
assert_line :money_col, type: 'money', limit: nil, precision: 19, scale: 4, default: nil
|
102
|
+
assert_line :datetime2_col, type: 'datetime', limit: nil, precision: 7, scale: nil, default: nil
|
103
|
+
assert_line :datetimeoffset, type: 'datetimeoffset', limit: nil, precision: 7, scale: nil, default: nil
|
104
|
+
assert_line :smallmoney_col, type: 'smallmoney', limit: nil, precision: 10, scale: 4, default: nil
|
105
|
+
assert_line :char_col, type: 'char', limit: 1, precision: nil, scale: nil, default: nil
|
106
|
+
assert_line :varchar_col, type: 'varchar', limit: nil, precision: nil, scale: nil, default: nil
|
107
|
+
assert_line :text_basic_col, type: 'text_basic', limit: 2147483647, precision: nil, scale: nil, default: nil
|
108
|
+
assert_line :nchar_col, type: 'nchar', limit: 1, precision: nil, scale: nil, default: nil
|
109
|
+
assert_line :ntext_col, type: 'ntext', limit: 2147483647, precision: nil, scale: nil, default: nil
|
110
|
+
assert_line :binary_basic_col, type: 'binary_basic', limit: 1, precision: nil, scale: nil, default: nil
|
111
|
+
assert_line :varbinary_col, type: 'varbinary', limit: nil, precision: nil, scale: nil, default: nil
|
112
|
+
assert_line :uuid_col, type: 'uuid', limit: nil, precision: nil, scale: nil, default: nil
|
113
|
+
assert_line :sstimestamp_col, type: 'ss_timestamp', limit: nil, precision: nil, scale: nil, default: nil
|
113
114
|
end
|
114
115
|
|
115
116
|
# Special Cases
|
@@ -52,6 +52,31 @@ class TransactionTestSQLServer < ActiveRecord::TestCase
|
|
52
52
|
connection.user_options_isolation_level.must_match %r{read committed}i
|
53
53
|
end
|
54
54
|
|
55
|
+
describe 'when READ_COMMITTED_SNAPSHOT is set' do
|
56
|
+
before do
|
57
|
+
connection.execute "ALTER DATABASE [#{connection.current_database}] SET ALLOW_SNAPSHOT_ISOLATION ON"
|
58
|
+
connection.execute "ALTER DATABASE [#{connection.current_database}] SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE"
|
59
|
+
end
|
60
|
+
|
61
|
+
after do
|
62
|
+
connection.execute "ALTER DATABASE [#{connection.current_database}] SET ALLOW_SNAPSHOT_ISOLATION OFF"
|
63
|
+
connection.execute "ALTER DATABASE [#{connection.current_database}] SET READ_COMMITTED_SNAPSHOT OFF WITH ROLLBACK IMMEDIATE"
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should use READ COMMITTED as an isolation level' do
|
67
|
+
connection.user_options_isolation_level.must_match "read committed snapshot"
|
68
|
+
|
69
|
+
Ship.transaction(isolation: :serializable) do
|
70
|
+
Ship.create! name: 'Black Pearl'
|
71
|
+
end
|
72
|
+
|
73
|
+
# We're actually testing that the isolation level was correctly reset to
|
74
|
+
# "READ COMMITTED", and that no exception was raised (it's reported back
|
75
|
+
# by SQL Server as "read committed snapshot").
|
76
|
+
connection.user_options_isolation_level.must_match "read committed snapshot"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
55
80
|
|
56
81
|
protected
|
57
82
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-sqlserver-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ken Collins
|
@@ -14,7 +14,7 @@ authors:
|
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
|
-
date: 2017-02-
|
17
|
+
date: 2017-02-16 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: activerecord
|