activerecord-sqlserver-adapter 5.2.1 → 6.0.2
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/.editorconfig +9 -0
- data/.github/issue_template.md +23 -0
- data/.github/workflows/ci.yml +26 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +29 -0
- data/CHANGELOG.md +58 -20
- data/{Dockerfile → Dockerfile.ci} +1 -1
- data/Gemfile +48 -41
- data/Guardfile +9 -8
- data/README.md +28 -31
- data/RUNNING_UNIT_TESTS.md +3 -0
- data/Rakefile +14 -16
- data/VERSION +1 -1
- data/activerecord-sqlserver-adapter.gemspec +25 -14
- data/appveyor.yml +24 -17
- data/docker-compose.ci.yml +7 -5
- data/guides/RELEASING.md +11 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +2 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +3 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +2 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +8 -7
- data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +36 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +6 -4
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -0
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +88 -44
- data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +9 -12
- data/lib/active_record/connection_adapters/sqlserver/errors.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +46 -8
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +16 -5
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +9 -7
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +210 -163
- data/lib/active_record/connection_adapters/sqlserver/showplan.rb +8 -8
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +4 -2
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +3 -1
- data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -44
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +7 -9
- data/lib/active_record/connection_adapters/sqlserver/type.rb +38 -35
- data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/char.rb +7 -4
- data/lib/active_record/connection_adapters/sqlserver/type/data.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +4 -3
- data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +8 -8
- data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/type/decimal_without_scale.rb +22 -0
- data/lib/active_record/connection_adapters/sqlserver/type/float.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/json.rb +2 -1
- data/lib/active_record/connection_adapters/sqlserver/type/money.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/real.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/string.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/text.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/time.rb +6 -6
- data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +8 -9
- data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +6 -5
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +4 -3
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +6 -5
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +6 -5
- data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/utils.rb +10 -11
- data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +145 -94
- data/lib/active_record/connection_adapters/sqlserver_column.rb +9 -5
- data/lib/active_record/sqlserver_base.rb +9 -1
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +28 -32
- data/lib/activerecord-sqlserver-adapter.rb +3 -1
- data/lib/arel/visitors/sqlserver.rb +108 -34
- data/lib/arel_sqlserver.rb +4 -2
- data/test/appveyor/dbsetup.ps1 +4 -4
- data/test/cases/adapter_test_sqlserver.rb +246 -171
- data/test/cases/change_column_null_test_sqlserver.rb +14 -12
- data/test/cases/coerced_tests.rb +722 -381
- data/test/cases/column_test_sqlserver.rb +287 -285
- data/test/cases/connection_test_sqlserver.rb +17 -20
- data/test/cases/execute_procedure_test_sqlserver.rb +20 -20
- data/test/cases/fetch_test_sqlserver.rb +16 -22
- data/test/cases/fully_qualified_identifier_test_sqlserver.rb +15 -19
- data/test/cases/helper_sqlserver.rb +15 -15
- data/test/cases/in_clause_test_sqlserver.rb +36 -0
- data/test/cases/index_test_sqlserver.rb +15 -15
- data/test/cases/json_test_sqlserver.rb +25 -25
- data/test/cases/lateral_test_sqlserver.rb +35 -0
- data/test/cases/migration_test_sqlserver.rb +67 -27
- data/test/cases/optimizer_hints_test_sqlserver.rb +72 -0
- data/test/cases/order_test_sqlserver.rb +53 -54
- data/test/cases/pessimistic_locking_test_sqlserver.rb +27 -33
- data/test/cases/rake_test_sqlserver.rb +33 -45
- data/test/cases/schema_dumper_test_sqlserver.rb +115 -109
- data/test/cases/schema_test_sqlserver.rb +20 -26
- data/test/cases/scratchpad_test_sqlserver.rb +4 -4
- data/test/cases/showplan_test_sqlserver.rb +28 -35
- data/test/cases/specific_schema_test_sqlserver.rb +68 -65
- data/test/cases/transaction_test_sqlserver.rb +18 -20
- data/test/cases/trigger_test_sqlserver.rb +14 -13
- data/test/cases/utils_test_sqlserver.rb +70 -70
- data/test/cases/uuid_test_sqlserver.rb +13 -14
- data/test/debug.rb +8 -6
- data/test/migrations/create_clients_and_change_column_null.rb +3 -1
- data/test/migrations/transaction_table/1_table_will_never_be_created.rb +4 -4
- data/test/models/sqlserver/booking.rb +3 -1
- data/test/models/sqlserver/customers_view.rb +3 -1
- data/test/models/sqlserver/datatype.rb +2 -0
- data/test/models/sqlserver/datatype_migration.rb +2 -0
- data/test/models/sqlserver/dollar_table_name.rb +3 -1
- data/test/models/sqlserver/edge_schema.rb +3 -3
- data/test/models/sqlserver/fk_has_fk.rb +3 -1
- data/test/models/sqlserver/fk_has_pk.rb +3 -1
- data/test/models/sqlserver/natural_pk_data.rb +4 -2
- data/test/models/sqlserver/natural_pk_int_data.rb +3 -1
- data/test/models/sqlserver/no_pk_data.rb +3 -1
- data/test/models/sqlserver/object_default.rb +3 -1
- data/test/models/sqlserver/quoted_table.rb +4 -2
- data/test/models/sqlserver/quoted_view_1.rb +3 -1
- data/test/models/sqlserver/quoted_view_2.rb +3 -1
- data/test/models/sqlserver/sst_memory.rb +3 -1
- data/test/models/sqlserver/string_default.rb +3 -1
- data/test/models/sqlserver/string_defaults_big_view.rb +3 -1
- data/test/models/sqlserver/string_defaults_view.rb +3 -1
- data/test/models/sqlserver/tinyint_pk.rb +3 -1
- data/test/models/sqlserver/trigger.rb +4 -2
- data/test/models/sqlserver/trigger_history.rb +3 -1
- data/test/models/sqlserver/upper.rb +3 -1
- data/test/models/sqlserver/uppered.rb +3 -1
- data/test/models/sqlserver/uuid.rb +3 -1
- data/test/schema/sqlserver_specific_schema.rb +31 -21
- data/test/support/coerceable_test_sqlserver.rb +15 -9
- data/test/support/connection_reflection.rb +3 -2
- data/test/support/core_ext/query_cache.rb +4 -1
- data/test/support/load_schema_sqlserver.rb +5 -5
- data/test/support/minitest_sqlserver.rb +3 -1
- data/test/support/paths_sqlserver.rb +11 -11
- data/test/support/rake_helpers.rb +13 -10
- data/test/support/sql_counter_sqlserver.rb +3 -4
- data/test/support/test_in_memory_oltp.rb +9 -7
- metadata +27 -12
- data/.travis.yml +0 -25
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Data
|
|
6
|
-
|
|
7
8
|
attr_reader :value, :type
|
|
8
9
|
|
|
9
10
|
def initialize(value, type)
|
|
@@ -27,7 +28,6 @@ module ActiveRecord
|
|
|
27
28
|
self.class == other.class && self.value == other.value
|
|
28
29
|
end
|
|
29
30
|
alias :== :eql?
|
|
30
|
-
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
end
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Date < ActiveRecord::Type::Date
|
|
6
|
-
|
|
7
8
|
def sqlserver_type
|
|
8
|
-
|
|
9
|
+
"date"
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def serialize(value)
|
|
12
13
|
return unless value.present?
|
|
14
|
+
|
|
13
15
|
date = super(value).to_s(:_sqlserver_dateformat)
|
|
14
16
|
Data.new date, self
|
|
15
17
|
end
|
|
@@ -37,7 +39,6 @@ module ActiveRecord
|
|
|
37
39
|
def fast_string_to_date_format
|
|
38
40
|
::Date::DATE_FORMATS[:_sqlserver_dateformat]
|
|
39
41
|
end
|
|
40
|
-
|
|
41
42
|
end
|
|
42
43
|
end
|
|
43
44
|
end
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class DateTime < ActiveRecord::Type::DateTime
|
|
6
|
-
|
|
7
8
|
include TimeValueFractional
|
|
8
9
|
|
|
9
10
|
def sqlserver_type
|
|
10
|
-
|
|
11
|
+
"datetime"
|
|
11
12
|
end
|
|
12
13
|
|
|
13
14
|
def serialize(value)
|
|
14
15
|
value = super
|
|
15
16
|
return value unless value.acts_like?(:time)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
end
|
|
17
|
+
|
|
18
|
+
datetime = "#{value.to_s(:_sqlserver_datetime)}.#{quote_fractional(value)}"
|
|
19
|
+
|
|
20
20
|
Data.new datetime, self
|
|
21
21
|
end
|
|
22
22
|
|
|
@@ -35,7 +35,7 @@ module ActiveRecord
|
|
|
35
35
|
private
|
|
36
36
|
|
|
37
37
|
def fast_string_to_time(string)
|
|
38
|
-
time = ActiveSupport::TimeZone[
|
|
38
|
+
time = ActiveSupport::TimeZone["UTC"].strptime(string, fast_string_to_time_format)
|
|
39
39
|
new_time(time.year, time.month, time.day, time.hour,
|
|
40
40
|
time.min, time.sec, Rational(time.nsec, 1_000))
|
|
41
41
|
rescue ArgumentError
|
|
@@ -43,7 +43,7 @@ module ActiveRecord
|
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
def fast_string_to_time_format
|
|
46
|
-
"#{::Time::DATE_FORMATS[:_sqlserver_datetime]}.%N"
|
|
46
|
+
"#{::Time::DATE_FORMATS[:_sqlserver_datetime]}.%N"
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
end
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class DateTime2 < DateTime
|
|
6
|
-
|
|
7
8
|
include TimeValueFractional2
|
|
8
9
|
|
|
9
10
|
def sqlserver_type
|
|
10
11
|
"datetime2(#{precision.to_i})"
|
|
11
12
|
end
|
|
12
|
-
|
|
13
13
|
end
|
|
14
14
|
end
|
|
15
15
|
end
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class DateTimeOffset < DateTime2
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:datetimeoffset
|
|
9
10
|
end
|
|
@@ -15,7 +16,6 @@ module ActiveRecord
|
|
|
15
16
|
def quoted(value)
|
|
16
17
|
Utils.quote_string_single(value)
|
|
17
18
|
end
|
|
18
|
-
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
end
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Decimal < ActiveRecord::Type::Decimal
|
|
6
|
-
|
|
7
8
|
def sqlserver_type
|
|
8
|
-
|
|
9
|
-
type
|
|
9
|
+
"decimal".yield_self do |type|
|
|
10
|
+
type += "(#{precision.to_i},#{scale.to_i})" if precision || scale
|
|
11
|
+
type
|
|
10
12
|
end
|
|
11
13
|
end
|
|
12
14
|
|
|
13
15
|
def type_cast_for_schema(value)
|
|
14
16
|
value.is_a?(BigDecimal) ? value.to_s : value.inspect
|
|
15
17
|
end
|
|
16
|
-
|
|
17
18
|
end
|
|
18
19
|
end
|
|
19
20
|
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module ConnectionAdapters
|
|
5
|
+
module SQLServer
|
|
6
|
+
module Type
|
|
7
|
+
class DecimalWithoutScale < ActiveRecord::Type::DecimalWithoutScale
|
|
8
|
+
def sqlserver_type
|
|
9
|
+
"decimal".yield_self do |type|
|
|
10
|
+
type += "(#{precision.to_i},0)" if precision
|
|
11
|
+
type
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def type_cast_for_schema(value)
|
|
16
|
+
value.is_a?(BigDecimal) ? value.to_s : value.inspect
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Float < ActiveRecord::Type::Float
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:float
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def sqlserver_type
|
|
12
|
-
|
|
13
|
+
"float"
|
|
13
14
|
end
|
|
14
|
-
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
end
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Money < Decimal
|
|
6
|
-
|
|
7
|
-
def initialize(*args)
|
|
8
|
+
def initialize(**args)
|
|
8
9
|
super
|
|
9
10
|
@precision = 19
|
|
10
11
|
@scale = 4
|
|
@@ -15,9 +16,8 @@ module ActiveRecord
|
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
def sqlserver_type
|
|
18
|
-
|
|
19
|
+
"money"
|
|
19
20
|
end
|
|
20
|
-
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
end
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Real < Float
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:real
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def sqlserver_type
|
|
12
|
-
|
|
13
|
+
"real"
|
|
13
14
|
end
|
|
14
|
-
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
end
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class SmallMoney < Money
|
|
6
|
-
|
|
7
|
-
def initialize(*args)
|
|
8
|
+
def initialize(**args)
|
|
8
9
|
super
|
|
9
10
|
@precision = 10
|
|
10
11
|
@scale = 4
|
|
@@ -15,9 +16,8 @@ module ActiveRecord
|
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
def sqlserver_type
|
|
18
|
-
|
|
19
|
+
"smallmoney"
|
|
19
20
|
end
|
|
20
|
-
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
end
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class SmallDateTime < DateTime
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:smalldatetime
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def sqlserver_type
|
|
12
|
-
|
|
13
|
+
"smalldatetime"
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
private
|
|
@@ -21,7 +22,6 @@ module ActiveRecord
|
|
|
21
22
|
def apply_seconds_precision(value)
|
|
22
23
|
value.change usec: 0 if value
|
|
23
24
|
end
|
|
24
|
-
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
27
|
end
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class String < ActiveRecord::Type::String
|
|
6
|
-
|
|
7
8
|
def changed_in_place?(raw_old_value, new_value)
|
|
8
9
|
if raw_old_value.is_a?(Data)
|
|
9
10
|
raw_old_value.value != new_value
|
|
@@ -11,7 +12,6 @@ module ActiveRecord
|
|
|
11
12
|
super
|
|
12
13
|
end
|
|
13
14
|
end
|
|
14
|
-
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
end
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Text < VarcharMax
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:text_basic
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def sqlserver_type
|
|
12
|
-
|
|
13
|
+
"text"
|
|
13
14
|
end
|
|
14
|
-
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
end
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Time < ActiveRecord::Type::Time
|
|
6
|
-
|
|
7
8
|
include TimeValueFractional2
|
|
8
9
|
|
|
9
10
|
def serialize(value)
|
|
10
11
|
value = super
|
|
11
12
|
return value unless value.acts_like?(:time)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
end
|
|
13
|
+
|
|
14
|
+
time = "#{value.to_s(:_sqlserver_time)}.#{quote_fractional(value)}"
|
|
15
|
+
|
|
16
16
|
Data.new time, self
|
|
17
17
|
end
|
|
18
18
|
|
|
@@ -37,6 +37,7 @@ module ActiveRecord
|
|
|
37
37
|
def cast_value(value)
|
|
38
38
|
value = super
|
|
39
39
|
return if value.blank?
|
|
40
|
+
|
|
40
41
|
value = value.change year: 2000, month: 01, day: 01
|
|
41
42
|
apply_seconds_precision(value)
|
|
42
43
|
end
|
|
@@ -44,7 +45,6 @@ module ActiveRecord
|
|
|
44
45
|
def fractional_scale
|
|
45
46
|
precision
|
|
46
47
|
end
|
|
47
|
-
|
|
48
48
|
end
|
|
49
49
|
end
|
|
50
50
|
end
|
|
@@ -1,19 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
|
-
|
|
6
7
|
module TimeValueFractional
|
|
7
|
-
|
|
8
8
|
private
|
|
9
9
|
|
|
10
10
|
def apply_seconds_precision(value)
|
|
11
11
|
return value if !value.respond_to?(fractional_property) || value.send(fractional_property).zero?
|
|
12
|
+
|
|
12
13
|
value.change fractional_property => seconds_precision(value)
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
def seconds_precision(value)
|
|
16
17
|
return 0 if fractional_scale == 0
|
|
18
|
+
|
|
17
19
|
seconds = value.send(fractional_property).to_f / fractional_operator.to_f
|
|
18
20
|
seconds = ((seconds * (1 / fractional_precision)).round / (1 / fractional_precision)).round(fractional_scale)
|
|
19
21
|
(seconds * fractional_operator).round(0).to_i
|
|
@@ -21,9 +23,10 @@ module ActiveRecord
|
|
|
21
23
|
|
|
22
24
|
def quote_fractional(value)
|
|
23
25
|
return 0 if fractional_scale == 0
|
|
26
|
+
|
|
24
27
|
frac_seconds = seconds_precision(value)
|
|
25
28
|
seconds = (frac_seconds.to_f / fractional_operator.to_f).round(fractional_scale)
|
|
26
|
-
seconds.to_d.to_s.split(
|
|
29
|
+
seconds.to_d.to_s.split(".").last.to(fractional_scale - 1)
|
|
27
30
|
end
|
|
28
31
|
|
|
29
32
|
def fractional_property
|
|
@@ -35,7 +38,7 @@ module ActiveRecord
|
|
|
35
38
|
end
|
|
36
39
|
|
|
37
40
|
def fractional_operator
|
|
38
|
-
10
|
|
41
|
+
10**fractional_digits
|
|
39
42
|
end
|
|
40
43
|
|
|
41
44
|
def fractional_precision
|
|
@@ -45,11 +48,9 @@ module ActiveRecord
|
|
|
45
48
|
def fractional_scale
|
|
46
49
|
3
|
|
47
50
|
end
|
|
48
|
-
|
|
49
51
|
end
|
|
50
52
|
|
|
51
53
|
module TimeValueFractional2
|
|
52
|
-
|
|
53
54
|
include TimeValueFractional
|
|
54
55
|
|
|
55
56
|
private
|
|
@@ -80,11 +81,9 @@ module ActiveRecord
|
|
|
80
81
|
end
|
|
81
82
|
|
|
82
83
|
def fractional_scale_max
|
|
83
|
-
(
|
|
84
|
+
("9" * fractional_scale) + ("0" * (fractional_digits - fractional_scale))
|
|
84
85
|
end
|
|
85
|
-
|
|
86
86
|
end
|
|
87
|
-
|
|
88
87
|
end
|
|
89
88
|
end
|
|
90
89
|
end
|