activerecord-sqlserver-adapter 6.0.0.rc1 → 6.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +29 -0
  4. data/CHANGELOG.md +20 -0
  5. data/Gemfile +11 -5
  6. data/Guardfile +9 -8
  7. data/Rakefile +12 -16
  8. data/VERSION +1 -1
  9. data/activerecord-sqlserver-adapter.gemspec +3 -3
  10. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +0 -4
  11. data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +1 -4
  12. data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +3 -4
  13. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +1 -3
  14. data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +2 -3
  15. data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +2 -3
  16. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +35 -32
  17. data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +7 -12
  18. data/lib/active_record/connection_adapters/sqlserver/errors.rb +0 -3
  19. data/lib/active_record/connection_adapters/sqlserver/quoting.rb +8 -8
  20. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +0 -2
  21. data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +7 -7
  22. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +106 -103
  23. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +6 -8
  24. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +2 -2
  25. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +1 -1
  26. data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +0 -2
  27. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +1 -4
  28. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +4 -8
  29. data/lib/active_record/connection_adapters/sqlserver/type.rb +35 -35
  30. data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +0 -2
  31. data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +0 -2
  32. data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +0 -2
  33. data/lib/active_record/connection_adapters/sqlserver/type/char.rb +2 -2
  34. data/lib/active_record/connection_adapters/sqlserver/type/data.rb +0 -2
  35. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +2 -3
  36. data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +2 -3
  37. data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +0 -2
  38. data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +0 -2
  39. data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +0 -2
  40. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +0 -2
  41. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +0 -2
  42. data/lib/active_record/connection_adapters/sqlserver/type/json.rb +0 -1
  43. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +0 -2
  44. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +0 -2
  45. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +0 -2
  46. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +0 -2
  47. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +0 -2
  48. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +0 -2
  49. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +0 -2
  50. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +2 -3
  51. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +6 -9
  52. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +0 -2
  53. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +0 -2
  54. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +1 -3
  55. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +0 -2
  56. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +0 -2
  57. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +0 -2
  58. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +0 -2
  59. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +1 -2
  60. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +1 -3
  61. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +0 -2
  62. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +1 -3
  63. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +0 -2
  64. data/lib/active_record/connection_adapters/sqlserver/utils.rb +8 -11
  65. data/lib/active_record/connection_adapters/sqlserver/version.rb +0 -2
  66. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +85 -83
  67. data/lib/active_record/connection_adapters/sqlserver_column.rb +0 -2
  68. data/lib/active_record/sqlserver_base.rb +1 -1
  69. data/lib/active_record/tasks/sqlserver_database_tasks.rb +26 -32
  70. data/lib/activerecord-sqlserver-adapter.rb +1 -1
  71. data/lib/arel/visitors/sqlserver.rb +18 -14
  72. data/lib/arel_sqlserver.rb +2 -2
  73. data/test/cases/adapter_test_sqlserver.rb +161 -182
  74. data/test/cases/change_column_null_test_sqlserver.rb +12 -12
  75. data/test/cases/coerced_tests.rb +88 -270
  76. data/test/cases/column_test_sqlserver.rb +281 -283
  77. data/test/cases/connection_test_sqlserver.rb +15 -20
  78. data/test/cases/execute_procedure_test_sqlserver.rb +18 -20
  79. data/test/cases/fetch_test_sqlserver.rb +14 -22
  80. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +12 -18
  81. data/test/cases/helper_sqlserver.rb +13 -15
  82. data/test/cases/in_clause_test_sqlserver.rb +9 -9
  83. data/test/cases/index_test_sqlserver.rb +13 -15
  84. data/test/cases/json_test_sqlserver.rb +23 -25
  85. data/test/cases/migration_test_sqlserver.rb +22 -28
  86. data/test/cases/order_test_sqlserver.rb +51 -54
  87. data/test/cases/pessimistic_locking_test_sqlserver.rb +25 -33
  88. data/test/cases/rake_test_sqlserver.rb +31 -45
  89. data/test/cases/schema_dumper_test_sqlserver.rb +104 -108
  90. data/test/cases/schema_test_sqlserver.rb +18 -26
  91. data/test/cases/scratchpad_test_sqlserver.rb +2 -4
  92. data/test/cases/showplan_test_sqlserver.rb +24 -33
  93. data/test/cases/specific_schema_test_sqlserver.rb +66 -65
  94. data/test/cases/transaction_test_sqlserver.rb +16 -19
  95. data/test/cases/trigger_test_sqlserver.rb +12 -12
  96. data/test/cases/utils_test_sqlserver.rb +68 -70
  97. data/test/cases/uuid_test_sqlserver.rb +11 -13
  98. data/test/debug.rb +6 -6
  99. data/test/migrations/create_clients_and_change_column_null.rb +1 -1
  100. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +2 -4
  101. data/test/models/sqlserver/booking.rb +1 -1
  102. data/test/models/sqlserver/customers_view.rb +1 -1
  103. data/test/models/sqlserver/dollar_table_name.rb +1 -1
  104. data/test/models/sqlserver/edge_schema.rb +1 -3
  105. data/test/models/sqlserver/fk_has_fk.rb +1 -1
  106. data/test/models/sqlserver/fk_has_pk.rb +1 -1
  107. data/test/models/sqlserver/natural_pk_data.rb +2 -2
  108. data/test/models/sqlserver/natural_pk_int_data.rb +1 -1
  109. data/test/models/sqlserver/no_pk_data.rb +1 -1
  110. data/test/models/sqlserver/object_default.rb +1 -1
  111. data/test/models/sqlserver/quoted_table.rb +2 -2
  112. data/test/models/sqlserver/quoted_view_1.rb +1 -1
  113. data/test/models/sqlserver/quoted_view_2.rb +1 -1
  114. data/test/models/sqlserver/sst_memory.rb +1 -1
  115. data/test/models/sqlserver/string_default.rb +1 -1
  116. data/test/models/sqlserver/string_defaults_big_view.rb +1 -1
  117. data/test/models/sqlserver/string_defaults_view.rb +1 -1
  118. data/test/models/sqlserver/tinyint_pk.rb +1 -1
  119. data/test/models/sqlserver/trigger.rb +2 -2
  120. data/test/models/sqlserver/trigger_history.rb +1 -1
  121. data/test/models/sqlserver/upper.rb +1 -1
  122. data/test/models/sqlserver/uppered.rb +1 -1
  123. data/test/models/sqlserver/uuid.rb +1 -1
  124. data/test/schema/sqlserver_specific_schema.rb +20 -22
  125. data/test/support/coerceable_test_sqlserver.rb +1 -4
  126. data/test/support/connection_reflection.rb +1 -2
  127. data/test/support/core_ext/query_cache.rb +1 -1
  128. data/test/support/load_schema_sqlserver.rb +3 -5
  129. data/test/support/minitest_sqlserver.rb +1 -1
  130. data/test/support/paths_sqlserver.rb +9 -11
  131. data/test/support/rake_helpers.rb +12 -10
  132. data/test/support/sql_counter_sqlserver.rb +0 -4
  133. data/test/support/test_in_memory_oltp.rb +7 -7
  134. metadata +5 -4
@@ -4,9 +4,7 @@ module ActiveRecord
4
4
  module ConnectionAdapters
5
5
  module SQLServer
6
6
  module Version
7
-
8
7
  VERSION = File.read(File.expand_path("../../../../../VERSION", __FILE__)).chomp
9
-
10
8
  end
11
9
  end
12
10
  end
@@ -1,40 +1,39 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'base64'
4
- require 'active_record'
5
- require 'arel_sqlserver'
6
- require 'active_record/connection_adapters/abstract_adapter'
7
- require 'active_record/connection_adapters/sqlserver/core_ext/active_record'
8
- require 'active_record/connection_adapters/sqlserver/core_ext/calculations'
9
- require 'active_record/connection_adapters/sqlserver/core_ext/explain'
10
- require 'active_record/connection_adapters/sqlserver/core_ext/explain_subscriber'
11
- require 'active_record/connection_adapters/sqlserver/core_ext/attribute_methods'
12
- require 'active_record/connection_adapters/sqlserver/core_ext/finder_methods'
13
- require 'active_record/connection_adapters/sqlserver/core_ext/query_methods'
14
- require 'active_record/connection_adapters/sqlserver/core_ext/preloader'
15
- require 'active_record/connection_adapters/sqlserver/version'
16
- require 'active_record/connection_adapters/sqlserver/type'
17
- require 'active_record/connection_adapters/sqlserver/database_limits'
18
- require 'active_record/connection_adapters/sqlserver/database_statements'
19
- require 'active_record/connection_adapters/sqlserver/database_tasks'
20
- require 'active_record/connection_adapters/sqlserver/transaction'
21
- require 'active_record/connection_adapters/sqlserver/errors'
22
- require 'active_record/connection_adapters/sqlserver/schema_creation'
23
- require 'active_record/connection_adapters/sqlserver/schema_dumper'
24
- require 'active_record/connection_adapters/sqlserver/schema_statements'
25
- require 'active_record/connection_adapters/sqlserver/sql_type_metadata'
26
- require 'active_record/connection_adapters/sqlserver/showplan'
27
- require 'active_record/connection_adapters/sqlserver/table_definition'
28
- require 'active_record/connection_adapters/sqlserver/quoting'
29
- require 'active_record/connection_adapters/sqlserver/utils'
30
- require 'active_record/sqlserver_base'
31
- require 'active_record/connection_adapters/sqlserver_column'
32
- require 'active_record/tasks/sqlserver_database_tasks'
3
+ require "base64"
4
+ require "active_record"
5
+ require "arel_sqlserver"
6
+ require "active_record/connection_adapters/abstract_adapter"
7
+ require "active_record/connection_adapters/sqlserver/core_ext/active_record"
8
+ require "active_record/connection_adapters/sqlserver/core_ext/calculations"
9
+ require "active_record/connection_adapters/sqlserver/core_ext/explain"
10
+ require "active_record/connection_adapters/sqlserver/core_ext/explain_subscriber"
11
+ require "active_record/connection_adapters/sqlserver/core_ext/attribute_methods"
12
+ require "active_record/connection_adapters/sqlserver/core_ext/finder_methods"
13
+ require "active_record/connection_adapters/sqlserver/core_ext/query_methods"
14
+ require "active_record/connection_adapters/sqlserver/core_ext/preloader"
15
+ require "active_record/connection_adapters/sqlserver/version"
16
+ require "active_record/connection_adapters/sqlserver/type"
17
+ require "active_record/connection_adapters/sqlserver/database_limits"
18
+ require "active_record/connection_adapters/sqlserver/database_statements"
19
+ require "active_record/connection_adapters/sqlserver/database_tasks"
20
+ require "active_record/connection_adapters/sqlserver/transaction"
21
+ require "active_record/connection_adapters/sqlserver/errors"
22
+ require "active_record/connection_adapters/sqlserver/schema_creation"
23
+ require "active_record/connection_adapters/sqlserver/schema_dumper"
24
+ require "active_record/connection_adapters/sqlserver/schema_statements"
25
+ require "active_record/connection_adapters/sqlserver/sql_type_metadata"
26
+ require "active_record/connection_adapters/sqlserver/showplan"
27
+ require "active_record/connection_adapters/sqlserver/table_definition"
28
+ require "active_record/connection_adapters/sqlserver/quoting"
29
+ require "active_record/connection_adapters/sqlserver/utils"
30
+ require "active_record/sqlserver_base"
31
+ require "active_record/connection_adapters/sqlserver_column"
32
+ require "active_record/tasks/sqlserver_database_tasks"
33
33
 
34
34
  module ActiveRecord
35
35
  module ConnectionAdapters
36
36
  class SQLServerAdapter < AbstractAdapter
37
-
38
37
  include SQLServer::Version,
39
38
  SQLServer::Quoting,
40
39
  SQLServer::DatabaseStatements,
@@ -43,7 +42,7 @@ module ActiveRecord
43
42
  SQLServer::DatabaseLimits,
44
43
  SQLServer::DatabaseTasks
45
44
 
46
- ADAPTER_NAME = 'SQLServer'.freeze
45
+ ADAPTER_NAME = "SQLServer".freeze
47
46
 
48
47
  # Default precision for 'time' (See https://docs.microsoft.com/en-us/sql/t-sql/data-types/time-transact-sql)
49
48
  DEFAULT_TIME_PRECISION = 7
@@ -56,7 +55,7 @@ module ActiveRecord
56
55
  cattr_accessor :showplan_option, instance_accessor: false
57
56
  cattr_accessor :lowercase_schema_reflection
58
57
 
59
- self.cs_equality_operator = 'COLLATE Latin1_General_CS_AS_WS'
58
+ self.cs_equality_operator = "COLLATE Latin1_General_CS_AS_WS"
60
59
  self.use_output_inserted = true
61
60
  self.exclude_output_inserted_table_names = Concurrent::Map.new { false }
62
61
 
@@ -189,7 +188,8 @@ module ActiveRecord
189
188
 
190
189
  def active?
191
190
  return false unless @connection
192
- raw_connection_do 'SELECT 1'
191
+
192
+ raw_connection_do "SELECT 1"
193
193
  true
194
194
  rescue *connection_errors
195
195
  false
@@ -219,7 +219,7 @@ module ActiveRecord
219
219
 
220
220
  def reset!
221
221
  reset_transaction
222
- do_execute 'IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION'
222
+ do_execute "IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION"
223
223
  end
224
224
 
225
225
  # === Abstract Adapter (Misc Support) =========================== #
@@ -254,6 +254,7 @@ module ActiveRecord
254
254
 
255
255
  def database_prefix_remote_server?
256
256
  return false if database_prefix.blank?
257
+
257
258
  name = SQLServer::Utils.extract_identifiers(database_prefix)
258
259
  name.fully_qualified? && name.object.blank?
259
260
  end
@@ -294,31 +295,31 @@ module ActiveRecord
294
295
  # === Abstract Adapter (Misc Support) =========================== #
295
296
 
296
297
  def initialize_type_map(m = type_map)
297
- m.register_type %r{.*}, SQLServer::Type::UnicodeString.new
298
+ m.register_type %r{.*}, SQLServer::Type::UnicodeString.new
298
299
  # Exact Numerics
299
- register_class_with_limit m, 'bigint(8)', SQLServer::Type::BigInteger
300
- m.alias_type 'bigint', 'bigint(8)'
301
- register_class_with_limit m, 'int(4)', SQLServer::Type::Integer
302
- m.alias_type 'integer', 'int(4)'
303
- m.alias_type 'int', 'int(4)'
304
- register_class_with_limit m, 'smallint(2)', SQLServer::Type::SmallInteger
305
- m.alias_type 'smallint', 'smallint(2)'
306
- register_class_with_limit m, 'tinyint(1)', SQLServer::Type::TinyInteger
307
- m.alias_type 'tinyint', 'tinyint(1)'
308
- m.register_type 'bit', SQLServer::Type::Boolean.new
300
+ register_class_with_limit m, "bigint(8)", SQLServer::Type::BigInteger
301
+ m.alias_type "bigint", "bigint(8)"
302
+ register_class_with_limit m, "int(4)", SQLServer::Type::Integer
303
+ m.alias_type "integer", "int(4)"
304
+ m.alias_type "int", "int(4)"
305
+ register_class_with_limit m, "smallint(2)", SQLServer::Type::SmallInteger
306
+ m.alias_type "smallint", "smallint(2)"
307
+ register_class_with_limit m, "tinyint(1)", SQLServer::Type::TinyInteger
308
+ m.alias_type "tinyint", "tinyint(1)"
309
+ m.register_type "bit", SQLServer::Type::Boolean.new
309
310
  m.register_type %r{\Adecimal}i do |sql_type|
310
311
  scale = extract_scale(sql_type)
311
312
  precision = extract_precision(sql_type)
312
313
  SQLServer::Type::Decimal.new precision: precision, scale: scale
313
314
  end
314
- m.alias_type %r{\Anumeric}i, 'decimal'
315
- m.register_type 'money', SQLServer::Type::Money.new
316
- m.register_type 'smallmoney', SQLServer::Type::SmallMoney.new
315
+ m.alias_type %r{\Anumeric}i, "decimal"
316
+ m.register_type "money", SQLServer::Type::Money.new
317
+ m.register_type "smallmoney", SQLServer::Type::SmallMoney.new
317
318
  # Approximate Numerics
318
- m.register_type 'float', SQLServer::Type::Float.new
319
- m.register_type 'real', SQLServer::Type::Real.new
319
+ m.register_type "float", SQLServer::Type::Float.new
320
+ m.register_type "real", SQLServer::Type::Real.new
320
321
  # Date and Time
321
- m.register_type 'date', SQLServer::Type::Date.new
322
+ m.register_type "date", SQLServer::Type::Date.new
322
323
  m.register_type %r{\Adatetime} do |sql_type|
323
324
  precision = extract_precision(sql_type)
324
325
  if precision
@@ -327,11 +328,11 @@ module ActiveRecord
327
328
  SQLServer::Type::DateTime.new
328
329
  end
329
330
  end
330
- m.register_type %r{\Adatetimeoffset}i do |sql_type|
331
+ m.register_type %r{\Adatetimeoffset}i do |sql_type|
331
332
  precision = extract_precision(sql_type)
332
333
  SQLServer::Type::DateTimeOffset.new precision: precision
333
334
  end
334
- m.register_type 'smalldatetime', SQLServer::Type::SmallDateTime.new
335
+ m.register_type "smalldatetime", SQLServer::Type::SmallDateTime.new
335
336
  m.register_type %r{\Atime}i do |sql_type|
336
337
  precision = extract_precision(sql_type) || DEFAULT_TIME_PRECISION
337
338
  SQLServer::Type::Time.new precision: precision
@@ -339,22 +340,22 @@ module ActiveRecord
339
340
  # Character Strings
340
341
  register_class_with_limit m, %r{\Achar}i, SQLServer::Type::Char
341
342
  register_class_with_limit m, %r{\Avarchar}i, SQLServer::Type::Varchar
342
- m.register_type 'varchar(max)', SQLServer::Type::VarcharMax.new
343
- m.register_type 'text', SQLServer::Type::Text.new
343
+ m.register_type "varchar(max)", SQLServer::Type::VarcharMax.new
344
+ m.register_type "text", SQLServer::Type::Text.new
344
345
  # Unicode Character Strings
345
346
  register_class_with_limit m, %r{\Anchar}i, SQLServer::Type::UnicodeChar
346
347
  register_class_with_limit m, %r{\Anvarchar}i, SQLServer::Type::UnicodeVarchar
347
- m.alias_type 'string', 'nvarchar(4000)'
348
- m.register_type 'nvarchar(max)', SQLServer::Type::UnicodeVarcharMax.new
349
- m.register_type 'nvarchar(max)', SQLServer::Type::UnicodeVarcharMax.new
350
- m.register_type 'ntext', SQLServer::Type::UnicodeText.new
348
+ m.alias_type "string", "nvarchar(4000)"
349
+ m.register_type "nvarchar(max)", SQLServer::Type::UnicodeVarcharMax.new
350
+ m.register_type "nvarchar(max)", SQLServer::Type::UnicodeVarcharMax.new
351
+ m.register_type "ntext", SQLServer::Type::UnicodeText.new
351
352
  # Binary Strings
352
353
  register_class_with_limit m, %r{\Abinary}i, SQLServer::Type::Binary
353
354
  register_class_with_limit m, %r{\Avarbinary}i, SQLServer::Type::Varbinary
354
- m.register_type 'varbinary(max)', SQLServer::Type::VarbinaryMax.new
355
+ m.register_type "varbinary(max)", SQLServer::Type::VarbinaryMax.new
355
356
  # Other Data Types
356
- m.register_type 'uniqueidentifier', SQLServer::Type::Uuid.new
357
- m.register_type 'timestamp', SQLServer::Type::Timestamp.new
357
+ m.register_type "uniqueidentifier", SQLServer::Type::Uuid.new
358
+ m.register_type "timestamp", SQLServer::Type::Timestamp.new
358
359
  end
359
360
 
360
361
  def translate_exception(e, message:, sql:, binds:)
@@ -398,7 +399,7 @@ module ActiveRecord
398
399
  when :dblib
399
400
  dblib_connect(config)
400
401
  end
401
- @spid = _raw_select('SELECT @@SPID', fetch: :rows).first.first
402
+ @spid = _raw_select("SELECT @@SPID", fetch: :rows).first.first
402
403
  @version_year = version_year
403
404
  configure_connection
404
405
  end
@@ -417,32 +418,32 @@ module ActiveRecord
417
418
  username: config[:username],
418
419
  password: config[:password],
419
420
  database: config[:database],
420
- tds_version: config[:tds_version] || '7.3',
421
+ tds_version: config[:tds_version] || "7.3",
421
422
  appname: config_appname(config),
422
423
  login_timeout: config_login_timeout(config),
423
424
  timeout: config_timeout(config),
424
- encoding: config_encoding(config),
425
+ encoding: config_encoding(config),
425
426
  azure: config[:azure],
426
427
  contained: config[:contained]
427
428
  ).tap do |client|
428
429
  if config[:azure]
429
- client.execute('SET ANSI_NULLS ON').do
430
- client.execute('SET ANSI_NULL_DFLT_ON ON').do
431
- client.execute('SET ANSI_PADDING ON').do
432
- client.execute('SET ANSI_WARNINGS ON').do
430
+ client.execute("SET ANSI_NULLS ON").do
431
+ client.execute("SET ANSI_NULL_DFLT_ON ON").do
432
+ client.execute("SET ANSI_PADDING ON").do
433
+ client.execute("SET ANSI_WARNINGS ON").do
433
434
  else
434
- client.execute('SET ANSI_DEFAULTS ON').do
435
+ client.execute("SET ANSI_DEFAULTS ON").do
435
436
  end
436
- client.execute('SET QUOTED_IDENTIFIER ON').do
437
- client.execute('SET CURSOR_CLOSE_ON_COMMIT OFF').do
438
- client.execute('SET IMPLICIT_TRANSACTIONS OFF').do
439
- client.execute('SET TEXTSIZE 2147483647').do
440
- client.execute('SET CONCAT_NULL_YIELDS_NULL ON').do
437
+ client.execute("SET QUOTED_IDENTIFIER ON").do
438
+ client.execute("SET CURSOR_CLOSE_ON_COMMIT OFF").do
439
+ client.execute("SET IMPLICIT_TRANSACTIONS OFF").do
440
+ client.execute("SET TEXTSIZE 2147483647").do
441
+ client.execute("SET CONCAT_NULL_YIELDS_NULL ON").do
441
442
  end
442
443
  end
443
444
 
444
445
  def config_appname(config)
445
- config[:appname] || configure_application_name || Rails.application.class.name.split('::').first rescue nil
446
+ config[:appname] || configure_application_name || Rails.application.class.name.split("::").first rescue nil
446
447
  end
447
448
 
448
449
  def config_login_timeout(config)
@@ -457,18 +458,18 @@ module ActiveRecord
457
458
  config[:encoding].present? ? config[:encoding] : nil
458
459
  end
459
460
 
460
- def configure_connection ; end
461
+ def configure_connection; end
461
462
 
462
- def configure_application_name ; end
463
+ def configure_application_name; end
463
464
 
464
465
  def initialize_dateformatter
465
466
  @database_dateformat = user_options_dateformat
466
467
  a, b, c = @database_dateformat.each_char.to_a
467
- [a, b, c].each { |f| f.upcase! if f == 'y' }
468
+ [a, b, c].each { |f| f.upcase! if f == "y" }
468
469
  dateformat = "%#{a}-%#{b}-%#{c}"
469
470
  ::Date::DATE_FORMATS[:_sqlserver_dateformat] = dateformat
470
471
  ::Time::DATE_FORMATS[:_sqlserver_dateformat] = dateformat
471
- ::Time::DATE_FORMATS[:_sqlserver_time] = '%H:%M:%S'
472
+ ::Time::DATE_FORMATS[:_sqlserver_time] = "%H:%M:%S"
472
473
  ::Time::DATE_FORMATS[:_sqlserver_datetime] = "#{dateformat} %H:%M:%S"
473
474
  ::Time::DATE_FORMATS[:_sqlserver_datetimeoffset] = lambda { |time|
474
475
  time.strftime "#{dateformat} %H:%M:%S.%9N #{time.formatted_offset}"
@@ -477,13 +478,14 @@ module ActiveRecord
477
478
 
478
479
  def version_year
479
480
  return 2016 if sqlserver_version =~ /vNext/
481
+
480
482
  /SQL Server (\d+)/.match(sqlserver_version).to_a.last.to_s.to_i
481
- rescue StandardError => e
483
+ rescue StandardError
482
484
  2016
483
485
  end
484
486
 
485
487
  def sqlserver_version
486
- @sqlserver_version ||= _raw_select('SELECT @@version', fetch: :rows).first.first.to_s
488
+ @sqlserver_version ||= _raw_select("SELECT @@version", fetch: :rows).first.first.to_s
487
489
  end
488
490
  end
489
491
  end
@@ -3,7 +3,6 @@
3
3
  module ActiveRecord
4
4
  module ConnectionAdapters
5
5
  class SQLServerColumn < Column
6
-
7
6
  def initialize(name, default, sql_type_metadata = nil, null = true, default_function = nil, collation: nil, comment: nil, **sqlserver_options)
8
7
  @sqlserver_options = sqlserver_options
9
8
  super
@@ -28,7 +27,6 @@ module ActiveRecord
28
27
  def case_sensitive?
29
28
  collation && collation.match(/_CS/)
30
29
  end
31
-
32
30
  end
33
31
  end
34
32
  end
@@ -8,7 +8,7 @@ module ActiveRecord
8
8
  mode = config[:mode].to_s.downcase.underscore.to_sym
9
9
  case mode
10
10
  when :dblib
11
- require 'tiny_tds'
11
+ require "tiny_tds"
12
12
  else
13
13
  raise ArgumentError, "Unknown connection mode in #{config.inspect}."
14
14
  end
@@ -1,16 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_record/tasks/database_tasks'
4
- require 'shellwords'
5
- require 'ipaddr'
6
- require 'socket'
3
+ require "active_record/tasks/database_tasks"
4
+ require "shellwords"
5
+ require "ipaddr"
6
+ require "socket"
7
7
 
8
8
  module ActiveRecord
9
9
  module Tasks
10
-
11
10
  class SQLServerDatabaseTasks
12
-
13
- DEFAULT_COLLATION = 'SQL_Latin1_General_CP1_CI_AS'
11
+ DEFAULT_COLLATION = "SQL_Latin1_General_CP1_CI_AS"
14
12
 
15
13
  delegate :connection, :establish_connection, :clear_active_connections!,
16
14
  to: ActiveRecord::Base
@@ -21,10 +19,10 @@ module ActiveRecord
21
19
 
22
20
  def create(master_established = false)
23
21
  establish_master_connection unless master_established
24
- connection.create_database configuration['database'], configuration.merge('collation' => default_collation)
22
+ connection.create_database configuration["database"], configuration.merge("collation" => default_collation)
25
23
  establish_connection configuration
26
- rescue ActiveRecord::StatementInvalid => error
27
- if /database .* already exists/i === error.message
24
+ rescue ActiveRecord::StatementInvalid => e
25
+ if /database .* already exists/i === e.message
28
26
  raise DatabaseAlreadyExists
29
27
  else
30
28
  raise
@@ -33,7 +31,7 @@ module ActiveRecord
33
31
 
34
32
  def drop
35
33
  establish_master_connection
36
- connection.drop_database configuration['database']
34
+ connection.drop_database configuration["database"]
37
35
  end
38
36
 
39
37
  def charset
@@ -52,7 +50,7 @@ module ActiveRecord
52
50
 
53
51
  def structure_dump(filename, extra_flags)
54
52
  server_arg = "-S #{Shellwords.escape(configuration['host'])}"
55
- server_arg += ":#{Shellwords.escape(configuration['port'])}" if configuration['port']
53
+ server_arg += ":#{Shellwords.escape(configuration['port'])}" if configuration["port"]
56
54
  command = [
57
55
  "defncopy-ttds",
58
56
  server_arg,
@@ -65,13 +63,14 @@ module ActiveRecord
65
63
  command.concat(table_args)
66
64
  view_args = connection.views.map { |v| Shellwords.escape(v) }
67
65
  command.concat(view_args)
68
- raise 'Error dumping database' unless Kernel.system(command.join(' '))
66
+ raise "Error dumping database" unless Kernel.system(command.join(" "))
67
+
69
68
  dump = File.read(filename)
70
- dump.gsub!(/^USE .*$\nGO\n/, '') # Strip db USE statements
71
- dump.gsub!(/^GO\n/, '') # Strip db GO statements
72
- dump.gsub!(/nvarchar\(8000\)/, 'nvarchar(4000)') # Fix nvarchar(8000) column defs
73
- dump.gsub!(/nvarchar\(-1\)/, 'nvarchar(max)') # Fix nvarchar(-1) column defs
74
- dump.gsub!(/text\(\d+\)/, 'text') # Fix text(16) column defs
69
+ dump.gsub!(/^USE .*$\nGO\n/, "") # Strip db USE statements
70
+ dump.gsub!(/^GO\n/, "") # Strip db GO statements
71
+ dump.gsub!(/nvarchar\(8000\)/, "nvarchar(4000)") # Fix nvarchar(8000) column defs
72
+ dump.gsub!(/nvarchar\(-1\)/, "nvarchar(max)") # Fix nvarchar(-1) column defs
73
+ dump.gsub!(/text\(\d+\)/, "text") # Fix text(16) column defs
75
74
  File.open(filename, "w") { |file| file.puts dump }
76
75
  end
77
76
 
@@ -79,7 +78,6 @@ module ActiveRecord
79
78
  connection.execute File.read(filename)
80
79
  end
81
80
 
82
-
83
81
  private
84
82
 
85
83
  def configuration
@@ -87,25 +85,22 @@ module ActiveRecord
87
85
  end
88
86
 
89
87
  def default_collation
90
- configuration['collation'] || DEFAULT_COLLATION
88
+ configuration["collation"] || DEFAULT_COLLATION
91
89
  end
92
90
 
93
91
  def establish_master_connection
94
- establish_connection configuration.merge('database' => 'master')
92
+ establish_connection configuration.merge("database" => "master")
95
93
  end
96
-
97
94
  end
98
95
 
99
96
  module DatabaseTasksSQLServer
100
-
101
97
  extend ActiveSupport::Concern
102
98
 
103
99
  module ClassMethods
104
-
105
100
  LOCAL_IPADDR = [
106
- IPAddr.new('192.168.0.0/16'),
107
- IPAddr.new('10.0.0.0/8'),
108
- IPAddr.new('172.16.0.0/12')
101
+ IPAddr.new("192.168.0.0/16"),
102
+ IPAddr.new("10.0.0.0/8"),
103
+ IPAddr.new("172.16.0.0/12")
109
104
  ]
110
105
 
111
106
  private
@@ -115,21 +110,20 @@ module ActiveRecord
115
110
  end
116
111
 
117
112
  def configuration_host_ip(configuration)
118
- return nil unless configuration['host']
119
- Socket::getaddrinfo(configuration['host'], 'echo', Socket::AF_INET)[0][3]
113
+ return nil unless configuration["host"]
114
+
115
+ Socket::getaddrinfo(configuration["host"], "echo", Socket::AF_INET)[0][3]
120
116
  end
121
117
 
122
118
  def local_ipaddr?(host_ip)
123
119
  return false unless host_ip
120
+
124
121
  LOCAL_IPADDR.any? { |ip| ip.include?(host_ip) }
125
122
  end
126
-
127
123
  end
128
-
129
124
  end
130
125
 
131
126
  DatabaseTasks.register_task %r{sqlserver}, SQLServerDatabaseTasks
132
127
  DatabaseTasks.send :include, DatabaseTasksSQLServer
133
-
134
128
  end
135
129
  end