activerecord-sqlserver-adapter 5.2.1 → 6.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.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +9 -0
  3. data/.github/issue_template.md +23 -0
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +29 -0
  6. data/.travis.yml +6 -8
  7. data/CHANGELOG.md +38 -24
  8. data/{Dockerfile → Dockerfile.ci} +1 -1
  9. data/Gemfile +48 -41
  10. data/Guardfile +9 -8
  11. data/README.md +9 -30
  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 +190 -164
  35. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +4 -2
  36. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +3 -1
  37. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +8 -8
  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/big_integer.rb +3 -3
  42. data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +5 -4
  43. data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -3
  44. data/lib/active_record/connection_adapters/sqlserver/type/char.rb +7 -4
  45. data/lib/active_record/connection_adapters/sqlserver/type/data.rb +2 -2
  46. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +4 -3
  47. data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +8 -8
  48. data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
  49. data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +2 -2
  50. data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +5 -4
  51. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +3 -3
  52. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -3
  53. data/lib/active_record/connection_adapters/sqlserver/type/json.rb +2 -1
  54. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +4 -4
  55. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +3 -3
  56. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -3
  57. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +4 -4
  58. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +3 -3
  59. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +2 -2
  60. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +3 -3
  61. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +6 -6
  62. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +8 -9
  63. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +3 -3
  64. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -3
  65. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +5 -4
  66. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +2 -2
  67. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +3 -3
  68. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +6 -5
  69. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +4 -4
  70. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +4 -3
  71. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +6 -5
  72. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +4 -4
  73. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +6 -5
  74. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +4 -4
  75. data/lib/active_record/connection_adapters/sqlserver/type.rb +37 -35
  76. data/lib/active_record/connection_adapters/sqlserver/utils.rb +10 -11
  77. data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
  78. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +128 -92
  79. data/lib/active_record/connection_adapters/sqlserver_column.rb +9 -5
  80. data/lib/active_record/sqlserver_base.rb +9 -1
  81. data/lib/active_record/tasks/sqlserver_database_tasks.rb +28 -32
  82. data/lib/activerecord-sqlserver-adapter.rb +3 -1
  83. data/lib/arel/visitors/sqlserver.rb +58 -24
  84. data/lib/arel_sqlserver.rb +4 -2
  85. data/test/appveyor/dbsetup.ps1 +4 -4
  86. data/test/cases/adapter_test_sqlserver.rb +214 -171
  87. data/test/cases/change_column_null_test_sqlserver.rb +14 -12
  88. data/test/cases/coerced_tests.rb +631 -356
  89. data/test/cases/column_test_sqlserver.rb +283 -284
  90. data/test/cases/connection_test_sqlserver.rb +17 -20
  91. data/test/cases/execute_procedure_test_sqlserver.rb +20 -20
  92. data/test/cases/fetch_test_sqlserver.rb +16 -22
  93. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +15 -19
  94. data/test/cases/helper_sqlserver.rb +15 -15
  95. data/test/cases/in_clause_test_sqlserver.rb +36 -0
  96. data/test/cases/index_test_sqlserver.rb +15 -15
  97. data/test/cases/json_test_sqlserver.rb +25 -25
  98. data/test/cases/migration_test_sqlserver.rb +25 -29
  99. data/test/cases/order_test_sqlserver.rb +53 -54
  100. data/test/cases/pessimistic_locking_test_sqlserver.rb +27 -33
  101. data/test/cases/rake_test_sqlserver.rb +33 -45
  102. data/test/cases/schema_dumper_test_sqlserver.rb +107 -109
  103. data/test/cases/schema_test_sqlserver.rb +20 -26
  104. data/test/cases/scratchpad_test_sqlserver.rb +4 -4
  105. data/test/cases/showplan_test_sqlserver.rb +28 -35
  106. data/test/cases/specific_schema_test_sqlserver.rb +68 -65
  107. data/test/cases/transaction_test_sqlserver.rb +18 -20
  108. data/test/cases/trigger_test_sqlserver.rb +14 -13
  109. data/test/cases/utils_test_sqlserver.rb +70 -70
  110. data/test/cases/uuid_test_sqlserver.rb +13 -14
  111. data/test/debug.rb +8 -6
  112. data/test/migrations/create_clients_and_change_column_null.rb +3 -1
  113. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +4 -4
  114. data/test/models/sqlserver/booking.rb +3 -1
  115. data/test/models/sqlserver/customers_view.rb +3 -1
  116. data/test/models/sqlserver/datatype.rb +2 -0
  117. data/test/models/sqlserver/datatype_migration.rb +2 -0
  118. data/test/models/sqlserver/dollar_table_name.rb +3 -1
  119. data/test/models/sqlserver/edge_schema.rb +3 -3
  120. data/test/models/sqlserver/fk_has_fk.rb +3 -1
  121. data/test/models/sqlserver/fk_has_pk.rb +3 -1
  122. data/test/models/sqlserver/natural_pk_data.rb +4 -2
  123. data/test/models/sqlserver/natural_pk_int_data.rb +3 -1
  124. data/test/models/sqlserver/no_pk_data.rb +3 -1
  125. data/test/models/sqlserver/object_default.rb +3 -1
  126. data/test/models/sqlserver/quoted_table.rb +4 -2
  127. data/test/models/sqlserver/quoted_view_1.rb +3 -1
  128. data/test/models/sqlserver/quoted_view_2.rb +3 -1
  129. data/test/models/sqlserver/sst_memory.rb +3 -1
  130. data/test/models/sqlserver/string_default.rb +3 -1
  131. data/test/models/sqlserver/string_defaults_big_view.rb +3 -1
  132. data/test/models/sqlserver/string_defaults_view.rb +3 -1
  133. data/test/models/sqlserver/tinyint_pk.rb +3 -1
  134. data/test/models/sqlserver/trigger.rb +4 -2
  135. data/test/models/sqlserver/trigger_history.rb +3 -1
  136. data/test/models/sqlserver/upper.rb +3 -1
  137. data/test/models/sqlserver/uppered.rb +3 -1
  138. data/test/models/sqlserver/uuid.rb +3 -1
  139. data/test/schema/sqlserver_specific_schema.rb +22 -22
  140. data/test/support/coerceable_test_sqlserver.rb +15 -9
  141. data/test/support/connection_reflection.rb +3 -2
  142. data/test/support/core_ext/query_cache.rb +4 -1
  143. data/test/support/load_schema_sqlserver.rb +5 -5
  144. data/test/support/minitest_sqlserver.rb +3 -1
  145. data/test/support/paths_sqlserver.rb +11 -11
  146. data/test/support/rake_helpers.rb +13 -10
  147. data/test/support/sql_counter_sqlserver.rb +3 -4
  148. data/test/support/test_in_memory_oltp.rb +9 -7
  149. metadata +17 -7
@@ -1,19 +1,20 @@
1
- require 'active_record/connection_adapters/sqlserver/showplan/printer_table'
2
- require 'active_record/connection_adapters/sqlserver/showplan/printer_xml'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/connection_adapters/sqlserver/showplan/printer_table"
4
+ require "active_record/connection_adapters/sqlserver/showplan/printer_xml"
3
5
 
4
6
  module ActiveRecord
5
7
  module ConnectionAdapters
6
8
  module SQLServer
7
9
  module Showplan
8
-
9
- OPTION_ALL = 'SHOWPLAN_ALL'
10
- OPTION_TEXT = 'SHOWPLAN_TEXT'
11
- OPTION_XML = 'SHOWPLAN_XML'
10
+ OPTION_ALL = "SHOWPLAN_ALL"
11
+ OPTION_TEXT = "SHOWPLAN_TEXT"
12
+ OPTION_XML = "SHOWPLAN_XML"
12
13
  OPTIONS = [OPTION_ALL, OPTION_TEXT, OPTION_XML]
13
14
 
14
15
  def explain(arel, binds = [])
15
16
  sql = to_sql(arel)
16
- result = with_showplan_on { sp_executesql(sql, 'EXPLAIN', binds) }
17
+ result = with_showplan_on { sp_executesql(sql, "EXPLAIN", binds) }
17
18
  printer = showplan_printer.new(result)
18
19
  printer.pp
19
20
  end
@@ -59,7 +60,6 @@ module ActiveRecord
59
60
  else PrinterTable
60
61
  end
61
62
  end
62
-
63
63
  end
64
64
  end
65
65
  end
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module SQLServer
4
6
  class SqlTypeMetadata < ActiveRecord::ConnectionAdapters::SqlTypeMetadata
5
-
6
7
  def initialize(**kwargs)
7
8
  @sqlserver_options = kwargs.extract!(:sqlserver_options)
8
9
  super(**kwargs)
@@ -13,7 +14,6 @@ module ActiveRecord
13
14
  def attributes_for_hash
14
15
  super + [@sqlserver_options]
15
16
  end
16
-
17
17
  end
18
18
  end
19
19
  end
@@ -1,101 +1,100 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module SQLServer
4
-
5
6
  module ColumnMethods
6
-
7
7
  def primary_key(name, type = :primary_key, **options)
8
8
  if [:integer, :bigint].include?(type)
9
9
  options[:is_identity] = true unless options.key?(:default)
10
10
  elsif type == :uuid
11
- options[:default] = options.fetch(:default, 'NEWID()')
11
+ options[:default] = options.fetch(:default, "NEWID()")
12
12
  options[:primary_key] = true
13
13
  end
14
14
  super
15
15
  end
16
16
 
17
- def primary_key_nonclustered(*args, **options)
18
- args.each { |name| column(name, :primary_key_nonclustered, options) }
17
+ def primary_key_nonclustered(*names, **options)
18
+ names.each { |name| column(name, :primary_key_nonclustered, **options) }
19
19
  end
20
20
 
21
- def real(*args, **options)
22
- args.each { |name| column(name, :real, options) }
21
+ def real(*names, **options)
22
+ names.each { |name| column(name, :real, **options) }
23
23
  end
24
24
 
25
- def money(*args, **options)
26
- args.each { |name| column(name, :money, options) }
25
+ def money(*names, **options)
26
+ names.each { |name| column(name, :money, **options) }
27
27
  end
28
28
 
29
- def smalldatetime(*args, **options)
30
- args.each { |name| column(name, :smalldatetime, options) }
29
+ def smalldatetime(*names, **options)
30
+ names.each { |name| column(name, :smalldatetime, **options) }
31
31
  end
32
32
 
33
- def datetime(*args, **options)
34
- args.each do |name|
33
+ def datetime(*names, **options)
34
+ names.each do |name|
35
35
  if options[:precision]
36
- datetime2(name, options)
36
+ datetime2(name, **options)
37
37
  else
38
- column(name, :datetime, options)
38
+ column(name, :datetime, **options)
39
39
  end
40
40
  end
41
41
  end
42
42
 
43
- def datetime2(*args, **options)
44
- args.each { |name| column(name, :datetime2, options) }
43
+ def datetime2(*names, **options)
44
+ names.each { |name| column(name, :datetime2, **options) }
45
45
  end
46
46
 
47
- def datetimeoffset(*args, **options)
48
- args.each { |name| column(name, :datetimeoffset, options) }
47
+ def datetimeoffset(*names, **options)
48
+ names.each { |name| column(name, :datetimeoffset, **options) }
49
49
  end
50
50
 
51
- def smallmoney(*args, **options)
52
- args.each { |name| column(name, :smallmoney, options) }
51
+ def smallmoney(*names, **options)
52
+ names.each { |name| column(name, :smallmoney, **options) }
53
53
  end
54
54
 
55
- def char(*args, **options)
56
- args.each { |name| column(name, :char, options) }
55
+ def char(*names, **options)
56
+ names.each { |name| column(name, :char, **options) }
57
57
  end
58
58
 
59
- def varchar(*args, **options)
60
- args.each { |name| column(name, :varchar, options) }
59
+ def varchar(*names, **options)
60
+ names.each { |name| column(name, :varchar, **options) }
61
61
  end
62
62
 
63
- def varchar_max(*args, **options)
64
- args.each { |name| column(name, :varchar_max, options) }
63
+ def varchar_max(*names, **options)
64
+ names.each { |name| column(name, :varchar_max, **options) }
65
65
  end
66
66
 
67
- def text_basic(*args, **options)
68
- args.each { |name| column(name, :text_basic, options) }
67
+ def text_basic(*names, **options)
68
+ names.each { |name| column(name, :text_basic, **options) }
69
69
  end
70
70
 
71
- def nchar(*args, **options)
72
- args.each { |name| column(name, :nchar, options) }
71
+ def nchar(*names, **options)
72
+ names.each { |name| column(name, :nchar, **options) }
73
73
  end
74
74
 
75
- def ntext(*args, **options)
76
- args.each { |name| column(name, :ntext, options) }
75
+ def ntext(*names, **options)
76
+ names.each { |name| column(name, :ntext, **options) }
77
77
  end
78
78
 
79
- def binary_basic(*args, **options)
80
- args.each { |name| column(name, :binary_basic, options) }
79
+ def binary_basic(*names, **options)
80
+ names.each { |name| column(name, :binary_basic, **options) }
81
81
  end
82
82
 
83
- def varbinary(*args, **options)
84
- args.each { |name| column(name, :varbinary, options) }
83
+ def varbinary(*names, **options)
84
+ names.each { |name| column(name, :varbinary, **options) }
85
85
  end
86
86
 
87
- def uuid(*args, **options)
88
- args.each { |name| column(name, :uniqueidentifier, options) }
87
+ def uuid(*names, **options)
88
+ names.each { |name| column(name, :uniqueidentifier, **options) }
89
89
  end
90
90
 
91
- def ss_timestamp(*args, **options)
92
- args.each { |name| column(name, :ss_timestamp, options) }
91
+ def ss_timestamp(*names, **options)
92
+ names.each { |name| column(name, :ss_timestamp, **options) }
93
93
  end
94
94
 
95
- def json(*args, **options)
96
- args.each { |name| column(name, :text, options) }
95
+ def json(*names, **options)
96
+ names.each { |name| column(name, :text, **options) }
97
97
  end
98
-
99
98
  end
100
99
 
101
100
  class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition
@@ -1,10 +1,10 @@
1
- require 'active_record/connection_adapters/abstract/transaction'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/connection_adapters/abstract/transaction"
2
4
 
3
5
  module ActiveRecord
4
6
  module ConnectionAdapters
5
-
6
7
  module SQLServerTransaction
7
-
8
8
  private
9
9
 
10
10
  def sqlserver?
@@ -13,26 +13,25 @@ module ActiveRecord
13
13
 
14
14
  def current_isolation_level
15
15
  return unless sqlserver?
16
+
16
17
  level = connection.user_options_isolation_level
17
18
  # When READ_COMMITTED_SNAPSHOT is set to ON,
18
19
  # user_options_isolation_level will be equal to 'read committed
19
20
  # snapshot' which is not a valid isolation level
20
- if level.blank? || level == 'read committed snapshot'
21
- 'READ COMMITTED'
21
+ if level.blank? || level == "read committed snapshot"
22
+ "READ COMMITTED"
22
23
  else
23
24
  level.upcase
24
25
  end
25
26
  end
26
-
27
27
  end
28
28
 
29
29
  Transaction.send :prepend, SQLServerTransaction
30
30
 
31
31
  module SQLServerRealTransaction
32
-
33
32
  attr_reader :starting_isolation_level
34
33
 
35
- def initialize(connection, options, *args)
34
+ def initialize(connection, options, **args)
36
35
  @connection = connection
37
36
  @starting_isolation_level = current_isolation_level if options[:isolation]
38
37
  super
@@ -55,7 +54,6 @@ module ActiveRecord
55
54
  connection.set_transaction_isolation_level(starting_isolation_level)
56
55
  end
57
56
  end
58
-
59
57
  end
60
58
 
61
59
  RealTransaction.send :prepend, SQLServerRealTransaction
@@ -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 BigInteger < Integer
6
-
7
8
  def sqlserver_type
8
- 'bigint'.freeze
9
+ "bigint"
9
10
  end
10
-
11
11
  end
12
12
  end
13
13
  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 Binary < ActiveRecord::Type::Binary
6
-
7
8
  def type
8
9
  :binary_basic
9
10
  end
10
11
 
11
12
  def sqlserver_type
12
- 'binary'.tap do |type|
13
- type << "(#{limit})" if limit
13
+ "binary".yield_self do |type|
14
+ type += "(#{limit})" if limit
15
+ type
14
16
  end
15
17
  end
16
-
17
18
  end
18
19
  end
19
20
  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 Boolean < ActiveRecord::Type::Boolean
6
-
7
8
  def sqlserver_type
8
- 'bit'.freeze
9
+ "bit"
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 Char < String
6
-
7
8
  def type
8
9
  :char
9
10
  end
@@ -11,20 +12,22 @@ module ActiveRecord
11
12
  def serialize(value)
12
13
  return if value.nil?
13
14
  return value if value.is_a?(Data)
15
+
14
16
  Data.new super, self
15
17
  end
16
18
 
17
19
  def sqlserver_type
18
- 'char'.tap do |type|
19
- type << "(#{limit})" if limit
20
+ "char".yield_self do |type|
21
+ type += "(#{limit})" if limit
22
+ type
20
23
  end
21
24
  end
22
25
 
23
26
  def quoted(value)
24
27
  return value.quoted_id if value.respond_to?(:quoted_id)
28
+
25
29
  Utils.quote_string_single(value)
26
30
  end
27
-
28
31
  end
29
32
  end
30
33
  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 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
@@ -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