activerecord-sqlserver-adapter 4.2.18 → 5.0.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.md +8 -223
- data/Gemfile +18 -17
- data/RAILS5-TODO.md +36 -0
- data/README.md +27 -8
- data/RUNNING_UNIT_TESTS.md +0 -17
- data/Rakefile +2 -7
- data/VERSION +1 -1
- data/activerecord-sqlserver-adapter.gemspec +1 -1
- data/appveyor.yml +0 -2
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +15 -8
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +45 -97
- data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +1 -2
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +31 -10
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +0 -18
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +16 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +101 -58
- data/lib/active_record/connection_adapters/sqlserver/showplan.rb +7 -7
- data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +20 -0
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +56 -32
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +1 -1
- data/lib/active_record/connection_adapters/sqlserver/type.rb +34 -32
- data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +6 -0
- data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -0
- data/lib/active_record/connection_adapters/sqlserver/type/char.rb +9 -20
- data/lib/active_record/connection_adapters/sqlserver/type/data.rb +30 -0
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +28 -4
- data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +28 -14
- data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +4 -16
- data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +9 -0
- data/lib/active_record/connection_adapters/sqlserver/type/float.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -0
- data/lib/active_record/connection_adapters/sqlserver/type/money.rb +5 -1
- data/lib/active_record/connection_adapters/sqlserver/type/real.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -1
- data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +5 -1
- data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +8 -1
- data/lib/active_record/connection_adapters/sqlserver/type/text.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/type/time.rb +20 -8
- data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +25 -10
- data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +6 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +7 -1
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +5 -1
- data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +15 -2
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +7 -1
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +5 -1
- data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +7 -1
- data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +5 -1
- data/lib/active_record/connection_adapters/sqlserver/utils.rb +10 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +71 -57
- data/lib/active_record/connection_adapters/sqlserver_column.rb +5 -30
- data/lib/active_record/sqlserver_base.rb +1 -5
- data/lib/arel/visitors/sqlserver.rb +11 -20
- data/test/bin/setup.sh +4 -6
- data/test/cases/adapter_test_sqlserver.rb +11 -20
- data/test/cases/coerced_tests.rb +233 -138
- data/test/cases/column_test_sqlserver.rb +244 -227
- data/test/cases/connection_test_sqlserver.rb +5 -76
- data/test/cases/fully_qualified_identifier_test_sqlserver.rb +7 -7
- data/test/cases/helper_sqlserver.rb +4 -15
- data/test/cases/pessimistic_locking_test_sqlserver.rb +1 -1
- data/test/cases/rake_test_sqlserver.rb +20 -14
- data/test/cases/schema_dumper_test_sqlserver.rb +94 -63
- data/test/cases/schema_test_sqlserver.rb +2 -2
- data/test/cases/showplan_test_sqlserver.rb +1 -1
- data/test/cases/specific_schema_test_sqlserver.rb +7 -14
- data/test/cases/transaction_test_sqlserver.rb +1 -1
- data/test/cases/uuid_test_sqlserver.rb +0 -1
- data/test/config.yml +0 -10
- data/test/migrations/transaction_table/1_table_will_never_be_created.rb +1 -1
- data/test/schema/sqlserver_specific_schema.rb +0 -16
- data/test/support/coerceable_test_sqlserver.rb +6 -2
- data/test/support/connection_reflection.rb +0 -4
- data/test/support/sql_counter_sqlserver.rb +17 -21
- metadata +9 -7
- data/lib/active_record/connection_adapters/sqlserver/core_ext/odbc.rb +0 -34
- data/lib/active_record/connection_adapters/sqlserver/schema_cache.rb +0 -114
@@ -25,7 +25,7 @@ module ActiveRecord
|
|
25
25
|
|
26
26
|
attr_reader :starting_isolation_level
|
27
27
|
|
28
|
-
def initialize(connection, options)
|
28
|
+
def initialize(connection, options, run_commit_callbacks: false)
|
29
29
|
@connection = connection
|
30
30
|
@starting_isolation_level = current_isolation_level if options[:isolation]
|
31
31
|
super
|
@@ -1,43 +1,45 @@
|
|
1
1
|
require 'active_record/type'
|
2
|
+
# Behaviors
|
3
|
+
require 'active_record/connection_adapters/sqlserver/type/data'
|
4
|
+
require 'active_record/connection_adapters/sqlserver/type/time_value_fractional'
|
2
5
|
# Exact Numerics
|
3
|
-
require 'active_record/connection_adapters/sqlserver/type/integer
|
4
|
-
require 'active_record/connection_adapters/sqlserver/type/big_integer
|
5
|
-
require 'active_record/connection_adapters/sqlserver/type/small_integer
|
6
|
-
require 'active_record/connection_adapters/sqlserver/type/tiny_integer
|
7
|
-
require 'active_record/connection_adapters/sqlserver/type/boolean
|
8
|
-
require 'active_record/connection_adapters/sqlserver/type/decimal
|
9
|
-
require 'active_record/connection_adapters/sqlserver/type/money
|
10
|
-
require 'active_record/connection_adapters/sqlserver/type/small_money
|
6
|
+
require 'active_record/connection_adapters/sqlserver/type/integer'
|
7
|
+
require 'active_record/connection_adapters/sqlserver/type/big_integer'
|
8
|
+
require 'active_record/connection_adapters/sqlserver/type/small_integer'
|
9
|
+
require 'active_record/connection_adapters/sqlserver/type/tiny_integer'
|
10
|
+
require 'active_record/connection_adapters/sqlserver/type/boolean'
|
11
|
+
require 'active_record/connection_adapters/sqlserver/type/decimal'
|
12
|
+
require 'active_record/connection_adapters/sqlserver/type/money'
|
13
|
+
require 'active_record/connection_adapters/sqlserver/type/small_money'
|
11
14
|
# Approximate Numerics
|
12
|
-
require 'active_record/connection_adapters/sqlserver/type/float
|
13
|
-
require 'active_record/connection_adapters/sqlserver/type/real
|
15
|
+
require 'active_record/connection_adapters/sqlserver/type/float'
|
16
|
+
require 'active_record/connection_adapters/sqlserver/type/real'
|
14
17
|
# Date and Time
|
15
|
-
require 'active_record/connection_adapters/sqlserver/type/
|
16
|
-
require 'active_record/connection_adapters/sqlserver/type/
|
17
|
-
require 'active_record/connection_adapters/sqlserver/type/
|
18
|
-
require 'active_record/connection_adapters/sqlserver/type/
|
19
|
-
require 'active_record/connection_adapters/sqlserver/type/
|
20
|
-
require 'active_record/connection_adapters/sqlserver/type/
|
21
|
-
require 'active_record/connection_adapters/sqlserver/type/time.rb'
|
18
|
+
require 'active_record/connection_adapters/sqlserver/type/date'
|
19
|
+
require 'active_record/connection_adapters/sqlserver/type/datetime'
|
20
|
+
require 'active_record/connection_adapters/sqlserver/type/datetime2'
|
21
|
+
require 'active_record/connection_adapters/sqlserver/type/datetimeoffset'
|
22
|
+
require 'active_record/connection_adapters/sqlserver/type/smalldatetime'
|
23
|
+
require 'active_record/connection_adapters/sqlserver/type/time'
|
22
24
|
# Character Strings
|
23
|
-
require 'active_record/connection_adapters/sqlserver/type/string
|
24
|
-
require 'active_record/connection_adapters/sqlserver/type/char
|
25
|
-
require 'active_record/connection_adapters/sqlserver/type/varchar
|
26
|
-
require 'active_record/connection_adapters/sqlserver/type/varchar_max
|
27
|
-
require 'active_record/connection_adapters/sqlserver/type/text
|
25
|
+
require 'active_record/connection_adapters/sqlserver/type/string'
|
26
|
+
require 'active_record/connection_adapters/sqlserver/type/char'
|
27
|
+
require 'active_record/connection_adapters/sqlserver/type/varchar'
|
28
|
+
require 'active_record/connection_adapters/sqlserver/type/varchar_max'
|
29
|
+
require 'active_record/connection_adapters/sqlserver/type/text'
|
28
30
|
# Unicode Character Strings
|
29
|
-
require 'active_record/connection_adapters/sqlserver/type/unicode_string
|
30
|
-
require 'active_record/connection_adapters/sqlserver/type/unicode_char
|
31
|
-
require 'active_record/connection_adapters/sqlserver/type/unicode_varchar
|
32
|
-
require 'active_record/connection_adapters/sqlserver/type/unicode_varchar_max
|
33
|
-
require 'active_record/connection_adapters/sqlserver/type/unicode_text
|
31
|
+
require 'active_record/connection_adapters/sqlserver/type/unicode_string'
|
32
|
+
require 'active_record/connection_adapters/sqlserver/type/unicode_char'
|
33
|
+
require 'active_record/connection_adapters/sqlserver/type/unicode_varchar'
|
34
|
+
require 'active_record/connection_adapters/sqlserver/type/unicode_varchar_max'
|
35
|
+
require 'active_record/connection_adapters/sqlserver/type/unicode_text'
|
34
36
|
# Binary Strings
|
35
|
-
require 'active_record/connection_adapters/sqlserver/type/binary
|
36
|
-
require 'active_record/connection_adapters/sqlserver/type/varbinary
|
37
|
-
require 'active_record/connection_adapters/sqlserver/type/varbinary_max
|
37
|
+
require 'active_record/connection_adapters/sqlserver/type/binary'
|
38
|
+
require 'active_record/connection_adapters/sqlserver/type/varbinary'
|
39
|
+
require 'active_record/connection_adapters/sqlserver/type/varbinary_max'
|
38
40
|
# Other Data Types
|
39
|
-
require 'active_record/connection_adapters/sqlserver/type/uuid
|
40
|
-
require 'active_record/connection_adapters/sqlserver/type/timestamp
|
41
|
+
require 'active_record/connection_adapters/sqlserver/type/uuid'
|
42
|
+
require 'active_record/connection_adapters/sqlserver/type/timestamp'
|
41
43
|
|
42
44
|
module ActiveRecord
|
43
45
|
module Type
|
@@ -8,32 +8,21 @@ module ActiveRecord
|
|
8
8
|
:char
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def serialize(value)
|
12
12
|
return if value.nil?
|
13
13
|
return value if value.is_a?(Data)
|
14
|
-
Data.new
|
14
|
+
Data.new super, self
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
@value = value.to_s
|
21
|
-
end
|
22
|
-
|
23
|
-
def quoted
|
24
|
-
"'#{Utils.quote_string(@value)}'"
|
25
|
-
end
|
26
|
-
|
27
|
-
def to_s
|
28
|
-
@value
|
29
|
-
end
|
30
|
-
alias_method :to_str, :to_s
|
31
|
-
|
32
|
-
def ==(other)
|
33
|
-
self.to_s == other.to_s
|
17
|
+
def sqlserver_type
|
18
|
+
'char'.tap do |type|
|
19
|
+
type << "(#{limit})" if limit
|
34
20
|
end
|
35
|
-
|
21
|
+
end
|
36
22
|
|
23
|
+
def quoted(value)
|
24
|
+
return value.quoted_id if value.respond_to?(:quoted_id)
|
25
|
+
Utils.quote_string_single(value)
|
37
26
|
end
|
38
27
|
|
39
28
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module SQLServer
|
4
|
+
module Type
|
5
|
+
class Data
|
6
|
+
|
7
|
+
attr_reader :value, :type
|
8
|
+
|
9
|
+
def initialize(value, type)
|
10
|
+
@value, @type = value, type
|
11
|
+
end
|
12
|
+
|
13
|
+
def quoted
|
14
|
+
type.quoted(@value)
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
@value
|
19
|
+
end
|
20
|
+
alias_method :to_str, :to_s
|
21
|
+
|
22
|
+
def inspect
|
23
|
+
@value.inspect
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -4,14 +4,38 @@ module ActiveRecord
|
|
4
4
|
module Type
|
5
5
|
class Date < ActiveRecord::Type::Date
|
6
6
|
|
7
|
-
def
|
7
|
+
def sqlserver_type
|
8
|
+
'date'.freeze
|
9
|
+
end
|
10
|
+
|
11
|
+
def serialize(value)
|
8
12
|
return unless value.present?
|
9
|
-
|
10
|
-
|
13
|
+
date = super(value).to_s(:_sqlserver_dateformat)
|
14
|
+
Data.new date, self
|
15
|
+
end
|
16
|
+
|
17
|
+
def deserialize(value)
|
18
|
+
value.is_a?(Data) ? super(value.value) : super
|
11
19
|
end
|
12
20
|
|
13
21
|
def type_cast_for_schema(value)
|
14
|
-
|
22
|
+
serialize(value).quoted
|
23
|
+
end
|
24
|
+
|
25
|
+
def quoted(value)
|
26
|
+
Utils.quote_string_single(value)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def fast_string_to_date(string)
|
32
|
+
::Date.strptime(string, fast_string_to_date_format)
|
33
|
+
rescue ArgumentError
|
34
|
+
super
|
35
|
+
end
|
36
|
+
|
37
|
+
def fast_string_to_date_format
|
38
|
+
::Date::DATE_FORMATS[:_sqlserver_dateformat]
|
15
39
|
end
|
16
40
|
|
17
41
|
end
|
@@ -6,32 +6,46 @@ module ActiveRecord
|
|
6
6
|
|
7
7
|
include TimeValueFractional
|
8
8
|
|
9
|
-
def
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
def sqlserver_type
|
10
|
+
'datetime'.freeze
|
11
|
+
end
|
12
|
+
|
13
|
+
def serialize(value)
|
14
|
+
value = super
|
15
|
+
return value unless value.acts_like?(:time)
|
16
|
+
datetime = value.to_s(:_sqlserver_datetime).tap do |v|
|
14
17
|
fraction = quote_fractional(value)
|
15
|
-
v << ".#{fraction}"
|
18
|
+
v << ".#{fraction}"
|
16
19
|
end
|
20
|
+
Data.new datetime, self
|
21
|
+
end
|
22
|
+
|
23
|
+
def deserialize(value)
|
24
|
+
value.is_a?(Data) ? super(value.value) : super
|
17
25
|
end
|
18
26
|
|
19
27
|
def type_cast_for_schema(value)
|
20
|
-
|
28
|
+
serialize(value).quoted
|
21
29
|
end
|
22
30
|
|
31
|
+
def quoted(value)
|
32
|
+
Utils.quote_string_single(value)
|
33
|
+
end
|
23
34
|
|
24
35
|
private
|
25
36
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
29
|
-
|
37
|
+
def fast_string_to_time(string)
|
38
|
+
fast_string_to_time_zone.strptime(string, fast_string_to_time_format).time
|
39
|
+
rescue ArgumentError
|
40
|
+
super
|
41
|
+
end
|
42
|
+
|
43
|
+
def fast_string_to_time_format
|
44
|
+
"#{::Time::DATE_FORMATS[:_sqlserver_datetime]}.%N".freeze
|
30
45
|
end
|
31
46
|
|
32
|
-
def
|
33
|
-
|
34
|
-
value.respond_to?(method) ? value.send(method) : value
|
47
|
+
def fast_string_to_time_zone
|
48
|
+
::Time.zone || ActiveSupport::TimeZone['UTC']
|
35
49
|
end
|
36
50
|
|
37
51
|
end
|
@@ -4,24 +4,12 @@ module ActiveRecord
|
|
4
4
|
module Type
|
5
5
|
class DateTimeOffset < DateTime2
|
6
6
|
|
7
|
-
def
|
8
|
-
|
7
|
+
def sqlserver_type
|
8
|
+
"datetimeoffset(#{precision.to_i})"
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
|
13
|
-
value.to_s :_sqlserver_datetimeoffset
|
14
|
-
end
|
15
|
-
|
16
|
-
def type_cast_for_schema(value)
|
17
|
-
type_cast_for_database(value).inspect
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def zone_conversion(value)
|
24
|
-
value
|
11
|
+
def quoted(value)
|
12
|
+
Utils.quote_string_single(value)
|
25
13
|
end
|
26
14
|
|
27
15
|
end
|
@@ -4,6 +4,15 @@ module ActiveRecord
|
|
4
4
|
module Type
|
5
5
|
class Decimal < ActiveRecord::Type::Decimal
|
6
6
|
|
7
|
+
def sqlserver_type
|
8
|
+
'decimal'.tap do |type|
|
9
|
+
type << "(#{precision.to_i},#{scale.to_i})" if precision || scale
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def type_cast_for_schema(value)
|
14
|
+
value.is_a?(BigDecimal) ? value.to_s : value.inspect
|
15
|
+
end
|
7
16
|
|
8
17
|
end
|
9
18
|
end
|
@@ -4,7 +4,7 @@ module ActiveRecord
|
|
4
4
|
module Type
|
5
5
|
class Money < Decimal
|
6
6
|
|
7
|
-
def initialize(
|
7
|
+
def initialize(*args)
|
8
8
|
super
|
9
9
|
@precision = 19
|
10
10
|
@scale = 4
|
@@ -14,6 +14,10 @@ module ActiveRecord
|
|
14
14
|
:money
|
15
15
|
end
|
16
16
|
|
17
|
+
def sqlserver_type
|
18
|
+
'money'.freeze
|
19
|
+
end
|
20
|
+
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|
@@ -4,7 +4,7 @@ module ActiveRecord
|
|
4
4
|
module Type
|
5
5
|
class SmallMoney < Money
|
6
6
|
|
7
|
-
def initialize(
|
7
|
+
def initialize(*args)
|
8
8
|
super
|
9
9
|
@precision = 10
|
10
10
|
@scale = 4
|
@@ -14,6 +14,10 @@ module ActiveRecord
|
|
14
14
|
:smallmoney
|
15
15
|
end
|
16
16
|
|
17
|
+
def sqlserver_type
|
18
|
+
'smallmoney'.freeze
|
19
|
+
end
|
20
|
+
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|