activerecord-sqlserver-adapter 5.2.1 → 7.0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) 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 +29 -0
  5. data/.gitignore +1 -0
  6. data/.rubocop.yml +29 -0
  7. data/CHANGELOG.md +17 -27
  8. data/{Dockerfile → Dockerfile.ci} +1 -1
  9. data/Gemfile +49 -41
  10. data/Guardfile +9 -8
  11. data/MIT-LICENSE +1 -1
  12. data/README.md +65 -42
  13. data/RUNNING_UNIT_TESTS.md +3 -0
  14. data/Rakefile +14 -16
  15. data/VERSION +1 -1
  16. data/activerecord-sqlserver-adapter.gemspec +25 -14
  17. data/appveyor.yml +22 -17
  18. data/docker-compose.ci.yml +7 -5
  19. data/guides/RELEASING.md +11 -0
  20. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +2 -4
  21. data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +5 -4
  22. data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +10 -14
  23. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +12 -5
  24. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +2 -0
  25. data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +10 -7
  26. data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +30 -0
  27. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -4
  28. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +117 -52
  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 +51 -14
  32. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +40 -6
  33. data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +18 -10
  34. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +235 -167
  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 +36 -7
  39. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -45
  40. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +8 -10
  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 +5 -3
  46. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +7 -5
  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/decimal_without_scale.rb +22 -0
  52. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +3 -3
  53. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -3
  54. data/lib/active_record/connection_adapters/sqlserver/type/json.rb +2 -1
  55. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +4 -4
  56. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +3 -3
  57. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -3
  58. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +4 -4
  59. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +3 -3
  60. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +2 -2
  61. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +3 -3
  62. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +6 -6
  63. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +8 -9
  64. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +3 -3
  65. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -3
  66. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +5 -4
  67. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +2 -2
  68. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +3 -3
  69. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +6 -5
  70. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +4 -4
  71. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +4 -3
  72. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +6 -5
  73. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +4 -4
  74. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +6 -5
  75. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +4 -4
  76. data/lib/active_record/connection_adapters/sqlserver/type.rb +38 -35
  77. data/lib/active_record/connection_adapters/sqlserver/utils.rb +26 -12
  78. data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
  79. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +271 -180
  80. data/lib/active_record/connection_adapters/sqlserver_column.rb +76 -16
  81. data/lib/active_record/sqlserver_base.rb +11 -9
  82. data/lib/active_record/tasks/sqlserver_database_tasks.rb +38 -39
  83. data/lib/activerecord-sqlserver-adapter.rb +3 -1
  84. data/lib/arel/visitors/sqlserver.rb +177 -56
  85. data/lib/arel_sqlserver.rb +4 -2
  86. data/test/appveyor/dbsetup.ps1 +4 -4
  87. data/test/cases/active_schema_test_sqlserver.rb +55 -0
  88. data/test/cases/adapter_test_sqlserver.rb +258 -173
  89. data/test/cases/change_column_collation_test_sqlserver.rb +33 -0
  90. data/test/cases/change_column_null_test_sqlserver.rb +14 -12
  91. data/test/cases/coerced_tests.rb +1421 -397
  92. data/test/cases/column_test_sqlserver.rb +321 -315
  93. data/test/cases/connection_test_sqlserver.rb +17 -20
  94. data/test/cases/disconnected_test_sqlserver.rb +39 -0
  95. data/test/cases/eager_load_too_many_ids_test_sqlserver.rb +18 -0
  96. data/test/cases/execute_procedure_test_sqlserver.rb +28 -19
  97. data/test/cases/fetch_test_sqlserver.rb +33 -21
  98. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +15 -19
  99. data/test/cases/helper_sqlserver.rb +15 -15
  100. data/test/cases/in_clause_test_sqlserver.rb +63 -0
  101. data/test/cases/index_test_sqlserver.rb +15 -15
  102. data/test/cases/json_test_sqlserver.rb +25 -25
  103. data/test/cases/lateral_test_sqlserver.rb +35 -0
  104. data/test/cases/migration_test_sqlserver.rb +74 -27
  105. data/test/cases/optimizer_hints_test_sqlserver.rb +72 -0
  106. data/test/cases/order_test_sqlserver.rb +59 -53
  107. data/test/cases/pessimistic_locking_test_sqlserver.rb +27 -33
  108. data/test/cases/primary_keys_test_sqlserver.rb +103 -0
  109. data/test/cases/rake_test_sqlserver.rb +70 -45
  110. data/test/cases/schema_dumper_test_sqlserver.rb +124 -109
  111. data/test/cases/schema_test_sqlserver.rb +20 -26
  112. data/test/cases/scratchpad_test_sqlserver.rb +4 -4
  113. data/test/cases/showplan_test_sqlserver.rb +28 -35
  114. data/test/cases/specific_schema_test_sqlserver.rb +68 -65
  115. data/test/cases/transaction_test_sqlserver.rb +18 -20
  116. data/test/cases/trigger_test_sqlserver.rb +14 -13
  117. data/test/cases/utils_test_sqlserver.rb +70 -70
  118. data/test/cases/uuid_test_sqlserver.rb +13 -14
  119. data/test/debug.rb +8 -6
  120. data/test/migrations/create_clients_and_change_column_collation.rb +19 -0
  121. data/test/migrations/create_clients_and_change_column_null.rb +3 -1
  122. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +4 -4
  123. data/test/models/sqlserver/booking.rb +3 -1
  124. data/test/models/sqlserver/composite_pk.rb +9 -0
  125. data/test/models/sqlserver/customers_view.rb +3 -1
  126. data/test/models/sqlserver/datatype.rb +2 -0
  127. data/test/models/sqlserver/datatype_migration.rb +2 -0
  128. data/test/models/sqlserver/dollar_table_name.rb +3 -1
  129. data/test/models/sqlserver/edge_schema.rb +3 -3
  130. data/test/models/sqlserver/fk_has_fk.rb +3 -1
  131. data/test/models/sqlserver/fk_has_pk.rb +3 -1
  132. data/test/models/sqlserver/natural_pk_data.rb +4 -2
  133. data/test/models/sqlserver/natural_pk_int_data.rb +3 -1
  134. data/test/models/sqlserver/no_pk_data.rb +3 -1
  135. data/test/models/sqlserver/object_default.rb +3 -1
  136. data/test/models/sqlserver/quoted_table.rb +4 -2
  137. data/test/models/sqlserver/quoted_view_1.rb +3 -1
  138. data/test/models/sqlserver/quoted_view_2.rb +3 -1
  139. data/test/models/sqlserver/sst_memory.rb +3 -1
  140. data/test/models/sqlserver/sst_string_collation.rb +3 -0
  141. data/test/models/sqlserver/string_default.rb +3 -1
  142. data/test/models/sqlserver/string_defaults_big_view.rb +3 -1
  143. data/test/models/sqlserver/string_defaults_view.rb +3 -1
  144. data/test/models/sqlserver/tinyint_pk.rb +3 -1
  145. data/test/models/sqlserver/trigger.rb +4 -2
  146. data/test/models/sqlserver/trigger_history.rb +3 -1
  147. data/test/models/sqlserver/upper.rb +3 -1
  148. data/test/models/sqlserver/uppered.rb +3 -1
  149. data/test/models/sqlserver/uuid.rb +3 -1
  150. data/test/schema/sqlserver_specific_schema.rb +56 -21
  151. data/test/support/coerceable_test_sqlserver.rb +19 -13
  152. data/test/support/connection_reflection.rb +3 -2
  153. data/test/support/core_ext/query_cache.rb +4 -1
  154. data/test/support/load_schema_sqlserver.rb +5 -5
  155. data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic.dump +0 -0
  156. data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic_associations.dump +0 -0
  157. data/test/support/minitest_sqlserver.rb +3 -1
  158. data/test/support/paths_sqlserver.rb +11 -11
  159. data/test/support/rake_helpers.rb +15 -10
  160. data/test/support/sql_counter_sqlserver.rb +16 -15
  161. data/test/support/test_in_memory_oltp.rb +9 -7
  162. metadata +47 -13
  163. data/.travis.yml +0 -25
  164. data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +0 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5c31b843cb8193ccc2c2777a80e658c3b7675c3ea5387f78f3b4b1316b96dd00
4
- data.tar.gz: ab77e8f296d0eb35877a34f5a0d31fa1da51f69e09bb852db6b97ced8c133f04
3
+ metadata.gz: da2be1cf7b3b5d8c8ad40cb1c79e037d5054cdf522e8e98b53fd22185af10a24
4
+ data.tar.gz: 9d1da7dc2e59761988098939f3254979df4862f26a7edcb617d7a35ff720155d
5
5
  SHA512:
6
- metadata.gz: 11d4df1451f076a4877e09698a9696355f16d2b958ef0fb19f353217211c0871645736c40ab2300bfba7f6e7fcac994b918de927dfef40db66cca2500dd43b5a
7
- data.tar.gz: cecaad6271fb78bb6ace828f7e16bd67007c0ae5e55f6759c49c710f5cb02dbe361f9a06bf9159599b36cf1c6325c0e631670cf30dca519447145d0bee62823e
6
+ metadata.gz: 51b6f8a1d55f2e27dd0301ee9b65a2922c7120b20db3831a774c33acd3b736035f6a6238c26a3491c817ebe808ccd8719eabfd957766a2064c8368ad2c6cd2ee
7
+ data.tar.gz: dc7b43ee4d532e44f1106064d3757ea3dd636ecc0bc5cec64d58a5c4de3e4b6bf5ce4017ad9bf6ee8c5a4503627b345e2b83811b71318765f5c4072c5e327456
data/.editorconfig ADDED
@@ -0,0 +1,9 @@
1
+ root = true
2
+
3
+ [*]
4
+ indent_style = space
5
+ indent_size = 2
6
+ end_of_line = lf
7
+ charset = utf-8
8
+ trim_trailing_whitespace = true
9
+ insert_final_newline = true
@@ -0,0 +1,23 @@
1
+ ## Issue
2
+ <!-- Give a brief summary of the issue. -->
3
+
4
+ ## Expected behavior
5
+ <!-- Tell us what should happen -->
6
+
7
+ ## Actual behavior
8
+ <!-- Tell us what happens instead -->
9
+
10
+ ## How to reproduce
11
+ <!-- See https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/wiki/How-to-report-a-bug -->
12
+
13
+ ## Details
14
+
15
+ - **Rails version**: `x.x.x`
16
+ - **SQL Server adapter version**: `x.x.x`
17
+ - **TinyTDS version**: `x.x.x`
18
+ - **FreeTDS details**:
19
+
20
+ ```
21
+ run `tsql -C` and paste here the output.
22
+ ```
23
+
@@ -0,0 +1,29 @@
1
+ name: CI
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ name: Run test suite
8
+ runs-on: ubuntu-latest
9
+
10
+ env:
11
+ COMPOSE_FILE: docker-compose.ci.yml
12
+
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ ruby:
17
+ - 2.7.5
18
+ - 3.0.3
19
+ - 3.1.0
20
+
21
+ steps:
22
+ - name: Checkout code
23
+ uses: actions/checkout@v2
24
+
25
+ - name: Build docker images
26
+ run: docker-compose build --build-arg TARGET_VERSION=${{ matrix.ruby }}
27
+
28
+ - name: Run tests
29
+ run: docker-compose run ci
data/.gitignore CHANGED
@@ -3,6 +3,7 @@ debug.log
3
3
  .DS_Store
4
4
  pkg/
5
5
  doc/
6
+ db/
6
7
  *.gem
7
8
  .bundle
8
9
  Gemfile.lock
data/.rubocop.yml ADDED
@@ -0,0 +1,29 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.5
3
+
4
+ Layout/LineLength:
5
+ Max: 120
6
+
7
+ Naming/AccessorMethodName:
8
+ Enabled: false
9
+
10
+ Naming/FileName:
11
+ Exclude:
12
+ - lib/activerecord-sqlserver-adapter.rb
13
+
14
+ Naming/MethodName:
15
+ IgnoredPatterns:
16
+ - visit_.*
17
+ - primary_Key_From_Table
18
+ - table_From_Statement
19
+ - distinct_One_As_One_Is_So_Not_Fetch
20
+ - make_Fetch_Possible_And_Deterministic
21
+
22
+ Naming/MethodParameterName:
23
+ Enabled: false
24
+
25
+ Naming/PredicateName:
26
+ Enabled: false
27
+
28
+ Style/StringLiterals:
29
+ EnforcedStyle: double_quotes
data/CHANGELOG.md CHANGED
@@ -1,40 +1,30 @@
1
- ## v5.2.1
1
+ ## v7.0.0.0
2
2
 
3
- #### Fixed
4
-
5
- - #691 Fix constraints bug
6
- - #700 SET SINGLE_USER before dropping the database
7
- - #733 Calculate should not remove ordering for MSSQL
8
- - #735 Order by selected items when using distinct exists
9
- - #737 Use default precision for 'time' column type
10
- - #744 Adapter does not use prepared statement cache
11
- - #743 Set default time precision when registering time type
12
- - #745 Quoted table names containing square brackets need to be regex escaped
13
-
14
- ## v5.2.0
3
+ [Full changelog](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/compare/v7.0.0.0.rc1...v7.0.0.0)
15
4
 
16
5
  #### Fixed
17
6
 
18
- - #686 sql_for_insert set table name in case when pk is not nil
7
+ - [#1002](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1002) Fix support for index types
19
8
 
20
- ## v5.2.0.rc2
21
-
22
- #### Fixed
23
-
24
- - #681 change_column_null should not clear other column attributes. Fixes #582.
25
- - #684 Fix explain with array conditions. Fixes #673.
9
+ #### Changed
26
10
 
27
- ## v5.2.0.rc1
11
+ - [#1004](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1004) Dump the precision for datetime columns following the new defaults.
28
12
 
29
- #### Fixed
13
+ ## v7.0.0.0.rc1
30
14
 
31
- - #638 Don't disable referential integrity for the same table twice.
32
- - #646 Make String equality check work for Type::Data values. Fixes #645.
33
- - #671 Fix tinyint columns schema migration. Fixes #670.
15
+ [Full changelog](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/compare/6-1-stable...v7.0.0.0.rc1)
34
16
 
35
17
  #### Changed
36
18
 
37
- - #642 Added with (nolock) hint to information_schema.views.
19
+ - [#968](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/968) Define adapter type maps statically
20
+ - [#983](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/983) Optimize remove_columns to use a single SQL statement
21
+ - [#984](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/984) Better handle SQL queries with invalid encoding
22
+ - [#988](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/988) Raise `ActiveRecord::StatementInvalid` when `columns` is called with a non-existing table (***breaking change***)
23
+
24
+ #### Added
38
25
 
26
+ - [#972](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/972) Support `ActiveRecord::QueryLogs`
27
+ - [#981](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/981) Support `find_by` an encrypted attribute
28
+ - [#985](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/985) Support string returning clause for `ActiveRecord#insert_all`
39
29
 
40
- Please check [5-1-stable](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/5-1-stable/CHANGELOG.md) for previous changes.
30
+ Please check [6-1-stable](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/6-1-stable/CHANGELOG.md) for previous changes.
@@ -1,6 +1,6 @@
1
1
  ARG TARGET_VERSION=2.6.3
2
2
 
3
- FROM wpolicarpo/activerecord-sqlserver-adapter:${TARGET_VERSION}
3
+ FROM railssqlserver/activerecord-sqlserver-adapter:${TARGET_VERSION}
4
4
 
5
5
  ENV WORKDIR /activerecord-sqlserver-adapter
6
6
 
data/Gemfile CHANGED
@@ -1,62 +1,70 @@
1
- require 'openssl'
2
- source 'https://rubygems.org'
3
- gemspec
1
+ # frozen_string_literal: true
4
2
 
5
- gem 'sqlite3', '~> 1.3.6'
6
- gem 'bcrypt'
7
- gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
3
+ source "https://rubygems.org"
8
4
 
9
- if RbConfig::CONFIG["host_os"] =~ /darwin/
10
- gem 'terminal-notifier-guard'
11
- end
5
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
6
+
7
+ gemspec
12
8
 
13
- if ENV['RAILS_SOURCE']
14
- gemspec path: ENV['RAILS_SOURCE']
9
+ gem "bcrypt"
10
+ gem "pg", ">= 0.18.0"
11
+ gem "sqlite3", "~> 1.4"
12
+ gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby]
13
+ gem "benchmark-ips"
14
+
15
+ if ENV["RAILS_SOURCE"]
16
+ gemspec path: ENV["RAILS_SOURCE"]
15
17
  else
16
- # Need to get rails source beacause the gem doesn't include tests
17
- version = ENV['RAILS_VERSION'] || begin
18
- require 'net/http'
19
- require 'yaml'
20
- spec = eval(File.read('activerecord-sqlserver-adapter.gemspec'))
21
- ver = spec.dependencies.detect{ |d|d.name == 'activerecord' }.requirement.requirements.first.last.version
22
- major, minor, tiny, pre = ver.split('.')
23
- if !pre
24
- uri = URI.parse "https://rubygems.org/api/v1/versions/activerecord.yaml"
18
+ # Need to get rails source because the gem doesn't include tests
19
+ version = ENV["RAILS_VERSION"] || begin
20
+ require "openssl"
21
+ require "net/http"
22
+ require "yaml"
23
+
24
+ spec = eval(File.read("activerecord-sqlserver-adapter.gemspec"))
25
+ ver = spec.dependencies.detect { |d| d.name == "activerecord" }.requirement.requirements.first.last.version
26
+ major, minor, _tiny, pre = ver.split(".")
27
+
28
+ if pre
29
+ ver
30
+ else
31
+ uri = URI.parse("https://rubygems.org/api/v1/versions/activerecord.yaml")
25
32
  http = Net::HTTP.new(uri.host, uri.port)
26
33
  http.use_ssl = true
27
34
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
28
- YAML.load(http.request(Net::HTTP::Get.new(uri.request_uri)).body).select do |data|
29
- a, b, c = data['number'].split('.')
30
- !data['prerelease'] && major == a && (minor.nil? || minor == b)
31
- end.first['number']
32
- else
33
- ver
35
+ YAML.load(http.request(Net::HTTP::Get.new(uri.request_uri)).body).find do |data|
36
+ a, b, = data["number"].split(".")
37
+ !data["prerelease"] && major == a && (minor.nil? || minor == b)
38
+ end["number"]
34
39
  end
35
40
  end
36
- gem 'rails', git: "git://github.com/rails/rails.git", tag: "v#{version}"
37
- end
38
-
39
- if ENV['AREL']
40
- gem 'arel', path: ENV['AREL']
41
+ gem "rails", github: "rails/rails", tag: "v#{version}"
41
42
  end
42
43
 
44
+ # rubocop:disable Bundler/DuplicatedGem
43
45
  group :tinytds do
44
- if ENV['TINYTDS_SOURCE']
45
- gem 'tiny_tds', path: ENV['TINYTDS_SOURCE']
46
- elsif ENV['TINYTDS_VERSION']
47
- gem 'tiny_tds', ENV['TINYTDS_VERSION']
46
+ if ENV["TINYTDS_SOURCE"]
47
+ gem "tiny_tds", path: ENV["TINYTDS_SOURCE"]
48
+ elsif ENV["TINYTDS_VERSION"]
49
+ gem "tiny_tds", ENV["TINYTDS_VERSION"]
48
50
  else
49
- gem 'tiny_tds'
51
+ gem "tiny_tds"
50
52
  end
51
53
  end
54
+ # rubocop:enable Bundler/DuplicatedGem
52
55
 
53
56
  group :development do
54
- gem 'byebug'
55
- gem 'mocha'
56
- gem 'minitest-spec-rails'
57
+ gem "minitest-spec-rails"
58
+ gem "mocha"
59
+ gem "pry-byebug", platform: [:mri, :mingw, :x64_mingw]
57
60
  end
58
61
 
59
62
  group :guard do
60
- gem 'guard'
61
- gem 'guard-minitest'
63
+ gem "guard"
64
+ gem "guard-minitest"
65
+ gem "terminal-notifier-guard" if RbConfig::CONFIG["host_os"] =~ /darwin/
66
+ end
67
+
68
+ group :rubocop do
69
+ gem "rubocop", require: false
62
70
  end
data/Guardfile CHANGED
@@ -1,29 +1,30 @@
1
+ # frozen_string_literal: true
1
2
 
2
- require_relative 'test/support/paths_sqlserver'
3
+ require_relative "test/support/paths_sqlserver"
3
4
 
4
5
  clearing :on
5
6
  notification :terminal_notifier if defined?(TerminalNotifier)
6
7
  ignore %r{debug\.log}
7
8
 
8
- ar_lib = File.join ARTest::SQLServer.root_activerecord, 'lib'
9
- ar_test = File.join ARTest::SQLServer.root_activerecord, 'test'
9
+ ar_lib = File.join ARTest::SQLServer.root_activerecord, "lib"
10
+ ar_test = File.join ARTest::SQLServer.root_activerecord, "test"
10
11
 
11
12
  guard :minitest, {
12
13
  all_on_start: false,
13
14
  autorun: false,
14
- include: ['lib', 'test', ar_lib, ar_test],
15
- test_folders: ['test'],
15
+ include: ["lib", "test", ar_lib, ar_test],
16
+ test_folders: ["test"],
16
17
  test_file_patterns: ["*_test.rb", "*_test_sqlserver.rb"]
17
18
  } do
18
19
  # Our project watchers.
19
- if ENV['TEST_FILES']
20
- ENV['TEST_FILES'].split(',').map(&:strip).each do |file|
20
+ if ENV["TEST_FILES"]
21
+ ENV["TEST_FILES"].split(",").map(&:strip).each do |file|
21
22
  watch(%r{.*}) { file }
22
23
  end
23
24
  else
24
25
  watch(%r{^test/cases/\w+_test_sqlserver\.rb$})
25
26
  watch(%r{^test/cases/coerced_tests\.rb$}) { "test/cases/coerced_tests.rb" }
26
27
  watch(%r{^lib/active_record/connection_adapters/sqlserver/([^/]+)\.rb$}) { |m| "test/cases/#{m[1]}_test_sqlserver.rb" }
27
- watch(%r{^test/cases/helper_sqlserver\.rb$}) { 'test' }
28
+ watch(%r{^test/cases/helper_sqlserver\.rb$}) { "test" }
28
29
  end
29
30
  end
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2008-2015
1
+ Copyright (c) 2008-2022
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,23 +1,35 @@
1
1
  # ActiveRecord SQL Server Adapter. For SQL Server 2012 And Higher.
2
2
 
3
- * [![TravisCI](https://travis-ci.org/rails-sqlserver/activerecord-sqlserver-adapter.svg?branch=master)](https://travis-ci.org/rails-sqlserver/activerecord-sqlserver-adapter) - TravisCI
3
+ * [![CI](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/actions/workflows/ci.yml/badge.svg)](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/actions/workflows/ci.yml) - CI
4
4
  * [![Build Status](https://ci.appveyor.com/api/projects/status/mtgbx8f57vr7k2qa/branch/master?svg=true)](https://ci.appveyor.com/project/rails-sqlserver/activerecord-sqlserver-adapter/branch/master) - Appveyor
5
5
  * [![Gem Version](http://img.shields.io/gem/v/activerecord-sqlserver-adapter.svg)](https://rubygems.org/gems/activerecord-sqlserver-adapter) - Gem Version
6
6
  * [![Gitter chat](https://img.shields.io/badge/%E2%8A%AA%20GITTER%20-JOIN%20CHAT%20%E2%86%92-brightgreen.svg?style=flat)](https://gitter.im/rails-sqlserver/activerecord-sqlserver-adapter) - Community
7
7
 
8
8
  ## About The Adapter
9
9
 
10
- The SQL Server adapter for ActiveRecord v5.2 using SQL Server 2012 or higher.
10
+ The SQL Server adapter for ActiveRecord using SQL Server 2012 or higher.
11
11
 
12
- Interested in older versions? We follow a rational versioning policy that tracks Rails. That means that our 5.1.x version of the adapter is only for the latest 5.1 version of Rails. If you need the adapter for SQL Server 2008 or 2005, you are still in the right spot. Just install the latest 3.2.x to 4.1.x version of the adapter that matches your Rails version. We also have stable branches for each major/minor release of ActiveRecord.
12
+ Interested in older versions? We follow a rational versioning policy that tracks Rails. That means that our 7.x version of the adapter is only for the latest 7.x version of Rails. If you need the adapter for SQL Server 2008 or 2005, you are still in the right spot. Just install the latest 3.2.x to 4.1.x version of the adapter that matches your Rails version. We also have stable branches for each major/minor release of ActiveRecord.
13
+
14
+ | Adapter Version | Rails Version | Support |
15
+ | --------------- | ------------- | ------------------------------------------------------------------------------------------- |
16
+ | `7.0.0.0` | `7.0.x` | [active](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/main) |
17
+ | `6.1.2.1` | `6.1.x` | [active](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/6-1-stable) |
18
+ | `6.0.2` | `6.0.x` | [active](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/6-0-stable) |
19
+ | `5.2.1` | `5.2.x` | [ended](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/5-2-stable) |
20
+ | `5.1.6` | `5.1.x` | [ended](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/5-1-stable) |
21
+ | `4.2.18` | `4.2.x` | [ended](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/4-2-stable) |
22
+ | `4.1.8` | `4.1.x` | [ended](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/4-1-stable) |
23
+
24
+ For older versions, please check their stable branches.
13
25
 
14
26
  #### Native Data Type Support
15
27
 
16
28
  We support every data type supported by FreeTDS. All simplified Rails types in migrations will coorespond to a matching SQL Server national (unicode) data type. Always check the `initialize_native_database_types` [(here)](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/master/lib/active_record/connection_adapters/sqlserver/schema_statements.rb) for an updated list.
17
29
 
18
- The following types (date, datetime2, datetimeoffset, time) all require TDS version 7.3 with TinyTDS. We recommend using FreeTDS 1.0 or higher which default to using `TDSVER` to "7.3". The adapter also sets TinyTDS's `tds_version` to this as well if non is specified.
30
+ The following types (`date`, `datetime2`, `datetimeoffset`, `time`) all require TDS version `7.3` with TinyTDS. We recommend using FreeTDS 1.0 or higher which default to using `TDSVER` to `7.3`. The adapter also sets TinyTDS's `tds_version` to this as well if non is specified.
19
31
 
20
- The Rails v5 adapter supports ActiveRecord's `datetime_with_precision` setting. This means that passing `:precision` to a datetime column is supported. Using a pecision with the `:datetime` type will signal the adapter to use the `datetime2` type under the hood.
32
+ The Rails v5 adapter supports ActiveRecord's `datetime_with_precision` setting. This means that passing `:precision` to a datetime column is supported. Using a precision with the `:datetime` type will signal the adapter to use the `datetime2` type under the hood.
21
33
 
22
34
 
23
35
  #### Identity Inserts with Triggers
@@ -52,37 +64,61 @@ Depending on your user and schema setup, it may be needed to use a table name pr
52
64
  ActiveRecord::Base.table_name_prefix = 'dbo.'
53
65
  ```
54
66
 
67
+ It's also possible to create/change/drop a schema in the migration file as in the example below:
55
68
 
56
- #### Configure Connection & App Name
69
+ ```ruby
70
+ class CreateFooSchema < ActiveRecord::Migration[7.0]
71
+ def up
72
+ create_schema('foo')
57
73
 
58
- We currently conform to an unpublished and non-standard AbstractAdapter interface to configure connections made to the database. To do so, just override the `configure_connection` method in an initializer like so. In this case below we are setting the `TEXTSIZE` to 64 megabytes. Also, TinyTDS supports an application name when it logs into SQL Server. This can be used to identify the connection in SQL Server's activity monitor. By default it will use the `appname` from your database.yml file or a lowercased version of your Rails::Application name. It is now possible to define a `configure_application_name` method that can give you per instance details. Below shows how you might use this to get the process id and thread id of the current connection.
74
+ # Or you could move a table to a different schema
75
+
76
+ change_table_schema('foo', 'dbo.admin')
77
+ end
78
+
79
+ def down
80
+ drop_schema('foo')
81
+ end
82
+ end
83
+ ```
84
+
85
+
86
+ #### Configure Connection
87
+
88
+ We currently conform to an unpublished and non-standard AbstractAdapter interface to configure connections made to the database. To do so, just override the `configure_connection` method in an initializer like so. In this case below we are setting the `TEXTSIZE` to 64 megabytes.
59
89
 
60
90
  ```ruby
61
91
  module ActiveRecord
62
92
  module ConnectionAdapters
63
93
  class SQLServerAdapter < AbstractAdapter
64
-
65
94
  def configure_connection
66
95
  raw_connection_do "SET TEXTSIZE #{64.megabytes}"
67
96
  end
68
-
69
- def configure_application_name
70
- "myapp_#{$$}_#{Thread.current.object_id}".to(29)
71
- end
72
-
73
97
  end
74
98
  end
75
99
  end
76
100
  ```
77
101
 
102
+ #### Configure Application Name
103
+
104
+ TinyTDS supports an application name when it logs into SQL Server. This can be used to identify the connection in SQL Server's activity monitor. By default it will use the `appname` from your database.yml file or your Rails::Application name.
105
+
106
+ Below shows how you might use the database.yml file to use the process ID in your application name.
107
+
108
+ ```yaml
109
+ development:
110
+ adapter: sqlserver
111
+ appname: <%= "myapp_#{Process.pid}" %>
112
+ ```
113
+
78
114
  #### Executing Stored Procedures
79
115
 
80
116
  Every class that sub classes ActiveRecord::Base will now have an execute_procedure class method to use. This method takes the name of the stored procedure which can be a string or symbol and any number of variables to pass to the procedure. Arguments will automatically be quoted per the connection's standards as normal. For example:
81
117
 
82
118
  ```ruby
83
- Account.execute_procedure :update_totals, 'admin', nil, true
119
+ Account.execute_procedure(:update_totals, 'admin', nil, true)
84
120
  # Or with named parameters.
85
- Account.execute_procedure :update_totals, named: 'params'
121
+ Account.execute_procedure(:update_totals, named: 'params')
86
122
  ```
87
123
 
88
124
  #### Explain Support (SHOWPLAN)
@@ -117,16 +153,25 @@ ActiveRecord::ConnectionAdapters::SQLServerAdapter.showplan_option = 'SHOWPLAN_X
117
153
  **NOTE:** The method we utilize to make SHOWPLANs work is very brittle to complex SQL. There is no getting around this as we have to deconstruct an already prepared statement for the sp_executesql method. If you find that explain breaks your app, simple disable it. Do not open a github issue unless you have a patch. Please [consult the Rails guides](http://guides.rubyonrails.org/active_record_querying.html#running-explain) for more info.
118
154
 
119
155
 
156
+ ## New Rails Applications
157
+
158
+ When creating a new Rails application you can specify that you want to use the SQL Server adapter using the `database` option:
159
+
160
+ ```
161
+ rails new my_app --database=sqlserver
162
+ ```
163
+
164
+ To then connect the application to your SQL Server instance edit the `config/database.yml` file with the username, password and host of your SQL Server instance.
165
+
166
+
120
167
  ## Installation
121
168
 
122
- The adapter has no strict gem dependencies outside of ActiveRecord. You will have to pick a connection mode, the default is dblib which uses the TinyTDS gem. Just bundle the gem and the adapter will use it.
169
+ The adapter has no strict gem dependencies outside of `ActiveRecord`. You will have to pick a connection mode, the default is dblib which uses the `TinyTDS` gem. Just bundle the gem and the adapter will use it.
123
170
 
124
171
  ```ruby
125
- gem 'tiny_tds'
126
172
  gem 'activerecord-sqlserver-adapter'
127
173
  ```
128
174
 
129
-
130
175
  ## Contributing
131
176
 
132
177
  If you would like to contribute a feature or bugfix, thanks! To make sure your fix/feature has a high chance of being added, please read the following guidelines. First, ask on the Gitter, or post a ticket on github issues. Second, make sure there are tests! We will not accept any patch that is not tested. Please read the [`RUNNING_UNIT_TESTS`](RUNNING_UNIT_TESTS.md) file for the details of how to run the unit tests.
@@ -139,30 +184,8 @@ If you would like to contribute a feature or bugfix, thanks! To make sure your f
139
184
 
140
185
  Many many people have contributed. If you do not see your name here and it should be let us know. Also, many thanks go out to those that have pledged financial contributions.
141
186
 
142
-
143
- ## Contributors
144
-
145
- Up-to-date list of contributors: http://github.com/rails-sqlserver/activerecord-sqlserver-adapter/contributors
146
-
147
- * metaskills (Ken Collins)
148
- * Annaswims (Annaswims)
149
- * wbond (Will Bond)
150
- * Thirdshift (Garrett Hart)
151
- * h-lame (Murray Steele)
152
- * vegantech
153
- * cjheath (Clifford Heath)
154
- * fryguy (Jason Frey)
155
- * jrafanie (Joe Rafaniello)
156
- * nerdrew (Andrew Ryan)
157
- * snowblink (Jonathan Lim)
158
- * koppen (Jakob Skjerning)
159
- * ebryn (Erik Bryn)
160
- * adzap (Adam Meehan)
161
- * neomindryan (Ryan Findley)
162
- * jeremydurham (Jeremy Durham)
163
-
187
+ You can see an up-to-date list of contributors here: http://github.com/rails-sqlserver/activerecord-sqlserver-adapter/contributors
164
188
 
165
189
  ## License
166
190
 
167
- Copyright © 2008-2017. It is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.
168
-
191
+ Copyright © 2008-2022. It is free software, and may be redistributed under the terms specified in the [MIT-LICENSE](MIT-LICENSE) file.
@@ -3,6 +3,9 @@
3
3
 
4
4
  This process is much easier than it has been before!
5
5
 
6
+ ## MS SQL SERVER
7
+
8
+ If you don't have easy access to MS SQL Server, you can set up a Vagrant/VirtualBox virtual machine with MS SQL Server. [Here's how](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter-dev-box).
6
9
 
7
10
  ## TL;DR
8
11
 
data/Rakefile CHANGED
@@ -1,37 +1,35 @@
1
- require 'bundler/gem_tasks'
2
- require 'rake/testtask'
3
- require_relative 'test/support/paths_sqlserver'
4
- require_relative 'test/support/rake_helpers'
1
+ # frozen_string_literal: true
5
2
 
6
- task test: ['test:dblib']
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+ require_relative "test/support/paths_sqlserver"
6
+ require_relative "test/support/rake_helpers"
7
+
8
+ task test: ["test:dblib"]
7
9
  task default: [:test]
8
10
 
9
11
  namespace :test do
10
-
11
12
  %w(dblib).each do |mode|
12
-
13
13
  Rake::TestTask.new(mode) do |t|
14
14
  t.libs = ARTest::SQLServer.test_load_paths
15
15
  t.test_files = test_files
16
- t.warning = !!ENV['WARNING']
16
+ t.warning = !!ENV["WARNING"]
17
17
  t.verbose = false
18
18
  end
19
-
20
19
  end
21
20
 
22
- task 'dblib:env' do
23
- ENV['ARCONN'] = 'dblib'
21
+ task "dblib:env" do
22
+ ENV["ARCONN"] = "dblib"
24
23
  end
25
-
26
24
  end
27
25
 
28
- task 'test:dblib' => 'test:dblib:env'
26
+ task "test:dblib" => "test:dblib:env"
29
27
 
30
28
  namespace :profile do
31
- ['dblib'].each do |mode|
29
+ ["dblib"].each do |mode|
32
30
  namespace mode.to_sym do
33
- Dir.glob('test/profile/*_profile_case.rb').sort.each do |test_file|
34
- profile_case = File.basename(test_file).sub('_profile_case.rb', '')
31
+ Dir.glob("test/profile/*_profile_case.rb").sort.each do |test_file|
32
+ profile_case = File.basename(test_file).sub("_profile_case.rb", "")
35
33
  Rake::TestTask.new(profile_case) do |t|
36
34
  t.libs = ARTest::SQLServer.test_load_paths
37
35
  t.test_files = [test_file]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.2.1
1
+ 7.0.0.0
@@ -1,21 +1,32 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "active_record/connection_adapters/sqlserver/version"
1
+ # frozen_string_literal: true
2
+
3
+ version = File.read(File.expand_path("VERSION", __dir__)).strip
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = 'activerecord-sqlserver-adapter'
7
- spec.version = ActiveRecord::ConnectionAdapters::SQLServer::Version::VERSION
6
+ spec.name = "activerecord-sqlserver-adapter"
8
7
  spec.platform = Gem::Platform::RUBY
9
- spec.license = 'MIT'
10
- spec.authors = ['Ken Collins', 'Anna Carey', 'Will Bond', 'Murray Steele', 'Shawn Balestracci', 'Joe Rafaniello', 'Tom Ward']
11
- spec.email = ['ken@metaskills.net', 'will@wbond.net']
12
- spec.homepage = 'http://github.com/rails-sqlserver/activerecord-sqlserver-adapter'
13
- spec.summary = 'ActiveRecord SQL Server Adapter.'
14
- spec.description = 'ActiveRecord SQL Server Adapter. SQL Server 2012 and upward.'
8
+ spec.version = version
9
+
10
+ spec.required_ruby_version = ">= 2.7.0"
11
+
12
+ spec.license = "MIT"
13
+ spec.authors = ["Ken Collins", "Anna Carey", "Will Bond", "Murray Steele", "Shawn Balestracci", "Joe Rafaniello", "Tom Ward"]
14
+ spec.email = ["ken@metaskills.net", "will@wbond.net"]
15
+ spec.homepage = "http://github.com/rails-sqlserver/activerecord-sqlserver-adapter"
16
+ spec.summary = "ActiveRecord SQL Server Adapter."
17
+ spec.description = "ActiveRecord SQL Server Adapter. SQL Server 2012 and upward."
18
+
19
+ spec.metadata = {
20
+ "bug_tracker_uri" => "https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/issues",
21
+ "changelog_uri" => "https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/v#{version}/CHANGELOG.md",
22
+ "source_code_uri" => "https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/v#{version}",
23
+ }
24
+
15
25
  spec.files = `git ls-files -z`.split("\x0")
16
26
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
27
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
- spec.require_paths = ['lib']
19
- spec.add_dependency 'activerecord', '~> 5.2.0'
20
- spec.add_dependency 'tiny_tds'
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_dependency "activerecord", "~> 7.0.0"
31
+ spec.add_dependency "tiny_tds"
21
32
  end