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.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +9 -0
  3. data/.github/issue_template.md +23 -0
  4. data/.github/workflows/ci.yml +26 -0
  5. data/.gitignore +1 -0
  6. data/.rubocop.yml +29 -0
  7. data/CHANGELOG.md +58 -20
  8. data/{Dockerfile → Dockerfile.ci} +1 -1
  9. data/Gemfile +48 -41
  10. data/Guardfile +9 -8
  11. data/README.md +28 -31
  12. data/RUNNING_UNIT_TESTS.md +3 -0
  13. data/Rakefile +14 -16
  14. data/VERSION +1 -1
  15. data/activerecord-sqlserver-adapter.gemspec +25 -14
  16. data/appveyor.yml +24 -17
  17. data/docker-compose.ci.yml +7 -5
  18. data/guides/RELEASING.md +11 -0
  19. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +2 -4
  20. data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +3 -4
  21. data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +5 -4
  22. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +3 -3
  23. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +2 -0
  24. data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +8 -7
  25. data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +36 -0
  26. data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +6 -4
  27. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -0
  28. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +88 -44
  29. data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +9 -12
  30. data/lib/active_record/connection_adapters/sqlserver/errors.rb +2 -3
  31. data/lib/active_record/connection_adapters/sqlserver/quoting.rb +46 -8
  32. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +16 -5
  33. data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +9 -7
  34. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +210 -163
  35. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +8 -8
  36. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +4 -2
  37. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +3 -1
  38. data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +2 -2
  39. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -44
  40. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +7 -9
  41. data/lib/active_record/connection_adapters/sqlserver/type.rb +38 -35
  42. data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +3 -3
  43. data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +5 -4
  44. data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -3
  45. data/lib/active_record/connection_adapters/sqlserver/type/char.rb +7 -4
  46. data/lib/active_record/connection_adapters/sqlserver/type/data.rb +2 -2
  47. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +4 -3
  48. data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +8 -8
  49. data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
  50. data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +2 -2
  51. data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +5 -4
  52. data/lib/active_record/connection_adapters/sqlserver/type/decimal_without_scale.rb +22 -0
  53. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +3 -3
  54. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -3
  55. data/lib/active_record/connection_adapters/sqlserver/type/json.rb +2 -1
  56. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +4 -4
  57. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +3 -3
  58. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -3
  59. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +4 -4
  60. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +3 -3
  61. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +2 -2
  62. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +3 -3
  63. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +6 -6
  64. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +8 -9
  65. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +3 -3
  66. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -3
  67. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +5 -4
  68. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +2 -2
  69. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +3 -3
  70. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +6 -5
  71. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +4 -4
  72. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +4 -3
  73. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +6 -5
  74. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +4 -4
  75. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +6 -5
  76. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +4 -4
  77. data/lib/active_record/connection_adapters/sqlserver/utils.rb +10 -11
  78. data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
  79. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +145 -94
  80. data/lib/active_record/connection_adapters/sqlserver_column.rb +9 -5
  81. data/lib/active_record/sqlserver_base.rb +9 -1
  82. data/lib/active_record/tasks/sqlserver_database_tasks.rb +28 -32
  83. data/lib/activerecord-sqlserver-adapter.rb +3 -1
  84. data/lib/arel/visitors/sqlserver.rb +108 -34
  85. data/lib/arel_sqlserver.rb +4 -2
  86. data/test/appveyor/dbsetup.ps1 +4 -4
  87. data/test/cases/adapter_test_sqlserver.rb +246 -171
  88. data/test/cases/change_column_null_test_sqlserver.rb +14 -12
  89. data/test/cases/coerced_tests.rb +722 -381
  90. data/test/cases/column_test_sqlserver.rb +287 -285
  91. data/test/cases/connection_test_sqlserver.rb +17 -20
  92. data/test/cases/execute_procedure_test_sqlserver.rb +20 -20
  93. data/test/cases/fetch_test_sqlserver.rb +16 -22
  94. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +15 -19
  95. data/test/cases/helper_sqlserver.rb +15 -15
  96. data/test/cases/in_clause_test_sqlserver.rb +36 -0
  97. data/test/cases/index_test_sqlserver.rb +15 -15
  98. data/test/cases/json_test_sqlserver.rb +25 -25
  99. data/test/cases/lateral_test_sqlserver.rb +35 -0
  100. data/test/cases/migration_test_sqlserver.rb +67 -27
  101. data/test/cases/optimizer_hints_test_sqlserver.rb +72 -0
  102. data/test/cases/order_test_sqlserver.rb +53 -54
  103. data/test/cases/pessimistic_locking_test_sqlserver.rb +27 -33
  104. data/test/cases/rake_test_sqlserver.rb +33 -45
  105. data/test/cases/schema_dumper_test_sqlserver.rb +115 -109
  106. data/test/cases/schema_test_sqlserver.rb +20 -26
  107. data/test/cases/scratchpad_test_sqlserver.rb +4 -4
  108. data/test/cases/showplan_test_sqlserver.rb +28 -35
  109. data/test/cases/specific_schema_test_sqlserver.rb +68 -65
  110. data/test/cases/transaction_test_sqlserver.rb +18 -20
  111. data/test/cases/trigger_test_sqlserver.rb +14 -13
  112. data/test/cases/utils_test_sqlserver.rb +70 -70
  113. data/test/cases/uuid_test_sqlserver.rb +13 -14
  114. data/test/debug.rb +8 -6
  115. data/test/migrations/create_clients_and_change_column_null.rb +3 -1
  116. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +4 -4
  117. data/test/models/sqlserver/booking.rb +3 -1
  118. data/test/models/sqlserver/customers_view.rb +3 -1
  119. data/test/models/sqlserver/datatype.rb +2 -0
  120. data/test/models/sqlserver/datatype_migration.rb +2 -0
  121. data/test/models/sqlserver/dollar_table_name.rb +3 -1
  122. data/test/models/sqlserver/edge_schema.rb +3 -3
  123. data/test/models/sqlserver/fk_has_fk.rb +3 -1
  124. data/test/models/sqlserver/fk_has_pk.rb +3 -1
  125. data/test/models/sqlserver/natural_pk_data.rb +4 -2
  126. data/test/models/sqlserver/natural_pk_int_data.rb +3 -1
  127. data/test/models/sqlserver/no_pk_data.rb +3 -1
  128. data/test/models/sqlserver/object_default.rb +3 -1
  129. data/test/models/sqlserver/quoted_table.rb +4 -2
  130. data/test/models/sqlserver/quoted_view_1.rb +3 -1
  131. data/test/models/sqlserver/quoted_view_2.rb +3 -1
  132. data/test/models/sqlserver/sst_memory.rb +3 -1
  133. data/test/models/sqlserver/string_default.rb +3 -1
  134. data/test/models/sqlserver/string_defaults_big_view.rb +3 -1
  135. data/test/models/sqlserver/string_defaults_view.rb +3 -1
  136. data/test/models/sqlserver/tinyint_pk.rb +3 -1
  137. data/test/models/sqlserver/trigger.rb +4 -2
  138. data/test/models/sqlserver/trigger_history.rb +3 -1
  139. data/test/models/sqlserver/upper.rb +3 -1
  140. data/test/models/sqlserver/uppered.rb +3 -1
  141. data/test/models/sqlserver/uuid.rb +3 -1
  142. data/test/schema/sqlserver_specific_schema.rb +31 -21
  143. data/test/support/coerceable_test_sqlserver.rb +15 -9
  144. data/test/support/connection_reflection.rb +3 -2
  145. data/test/support/core_ext/query_cache.rb +4 -1
  146. data/test/support/load_schema_sqlserver.rb +5 -5
  147. data/test/support/minitest_sqlserver.rb +3 -1
  148. data/test/support/paths_sqlserver.rb +11 -11
  149. data/test/support/rake_helpers.rb +13 -10
  150. data/test/support/sql_counter_sqlserver.rb +3 -4
  151. data/test/support/test_in_memory_oltp.rb +9 -7
  152. metadata +27 -12
  153. 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
- 'date'.freeze
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
- 'datetime'.freeze
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
- datetime = value.to_s(:_sqlserver_datetime).tap do |v|
17
- fraction = quote_fractional(value)
18
- v << ".#{fraction}"
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['UTC'].strptime(string, fast_string_to_time_format)
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".freeze
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
- 'decimal'.tap do |type|
9
- type << "(#{precision.to_i},#{scale.to_i})" if precision || scale
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
- 'float'.freeze
13
+ "float"
13
14
  end
14
-
15
15
  end
16
16
  end
17
17
  end
@@ -1,13 +1,13 @@
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 Integer < ActiveRecord::Type::Integer
6
-
7
8
  def sqlserver_type
8
- 'int'.freeze
9
+ "int"
9
10
  end
10
-
11
11
  end
12
12
  end
13
13
  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 Json < ActiveRecord::Type::Json
6
-
7
8
  end
8
9
  end
9
10
  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
- 'money'.freeze
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
- 'real'.freeze
13
+ "real"
13
14
  end
14
-
15
15
  end
16
16
  end
17
17
  end
@@ -1,13 +1,13 @@
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 SmallInteger < Integer
6
-
7
8
  def sqlserver_type
8
- 'smallint'.freeze
9
+ "smallint"
9
10
  end
10
-
11
11
  end
12
12
  end
13
13
  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
- 'smallmoney'.freeze
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
- 'smalldatetime'.freeze
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
- 'text'.freeze
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
- time = value.to_s(:_sqlserver_time).tap do |v|
13
- fraction = quote_fractional(value)
14
- v << ".#{fraction}"
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('.').last.to(fractional_scale-1)
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 ** fractional_digits
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
- ('9' * fractional_scale) + ('0' * (fractional_digits - fractional_scale))
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