activerecord-sqlserver-adapter 4.1.8 → 4.2.0.pre

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 (122) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +15 -0
  3. data/CHANGELOG.md +60 -0
  4. data/Gemfile +45 -0
  5. data/Guardfile +29 -0
  6. data/MIT-LICENSE +5 -5
  7. data/README.md +193 -0
  8. data/RUNNING_UNIT_TESTS.md +95 -0
  9. data/Rakefile +48 -0
  10. data/activerecord-sqlserver-adapter.gemspec +28 -0
  11. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +5 -15
  12. data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +25 -0
  13. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +6 -4
  14. data/lib/active_record/connection_adapters/sqlserver/core_ext/odbc.rb +9 -3
  15. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +3 -1
  16. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +130 -151
  17. data/lib/active_record/connection_adapters/sqlserver/errors.rb +0 -25
  18. data/lib/active_record/connection_adapters/sqlserver/quoting.rb +39 -78
  19. data/lib/active_record/connection_adapters/sqlserver/schema_cache.rb +71 -47
  20. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +14 -30
  21. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +112 -108
  22. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +4 -2
  23. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +1 -1
  24. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +1 -1
  25. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +52 -7
  26. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +52 -0
  27. data/lib/active_record/connection_adapters/sqlserver/type.rb +46 -0
  28. data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +15 -0
  29. data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +15 -0
  30. data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +13 -0
  31. data/lib/active_record/connection_adapters/sqlserver/type/castable.rb +15 -0
  32. data/lib/active_record/connection_adapters/sqlserver/type/char.rb +15 -0
  33. data/lib/active_record/connection_adapters/sqlserver/type/core_ext/value.rb +39 -0
  34. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +14 -0
  35. data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +37 -0
  36. data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +13 -0
  37. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +17 -0
  38. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +13 -0
  39. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +21 -0
  40. data/lib/active_record/connection_adapters/sqlserver/type/quoter.rb +32 -0
  41. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +17 -0
  42. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +13 -0
  43. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +21 -0
  44. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +24 -0
  45. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +12 -0
  46. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +15 -0
  47. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +59 -0
  48. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +15 -0
  49. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +22 -0
  50. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +15 -0
  51. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +12 -0
  52. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +15 -0
  53. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +20 -0
  54. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +20 -0
  55. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +23 -0
  56. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +20 -0
  57. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +20 -0
  58. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +20 -0
  59. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +20 -0
  60. data/lib/active_record/connection_adapters/sqlserver/utils.rb +118 -12
  61. data/lib/active_record/connection_adapters/sqlserver/version.rb +11 -0
  62. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +133 -198
  63. data/lib/active_record/connection_adapters/sqlserver_column.rb +15 -86
  64. data/lib/active_record/sqlserver_base.rb +2 -0
  65. data/lib/arel/visitors/sqlserver.rb +120 -393
  66. data/lib/{arel/arel_sqlserver.rb → arel_sqlserver.rb} +1 -3
  67. data/test/cases/adapter_test_sqlserver.rb +420 -0
  68. data/test/cases/coerced_tests.rb +642 -0
  69. data/test/cases/column_test_sqlserver.rb +703 -0
  70. data/test/cases/connection_test_sqlserver.rb +216 -0
  71. data/test/cases/database_statements_test_sqlserver.rb +57 -0
  72. data/test/cases/execute_procedure_test_sqlserver.rb +38 -0
  73. data/test/cases/helper_sqlserver.rb +36 -0
  74. data/test/cases/migration_test_sqlserver.rb +66 -0
  75. data/test/cases/order_test_sqlserver.rb +147 -0
  76. data/test/cases/pessimistic_locking_test_sqlserver.rb +90 -0
  77. data/test/cases/schema_dumper_test_sqlserver.rb +175 -0
  78. data/test/cases/schema_test_sqlserver.rb +54 -0
  79. data/test/cases/scratchpad_test_sqlserver.rb +9 -0
  80. data/test/cases/showplan_test_sqlserver.rb +65 -0
  81. data/test/cases/specific_schema_test_sqlserver.rb +118 -0
  82. data/test/cases/transaction_test_sqlserver.rb +61 -0
  83. data/test/cases/utils_test_sqlserver.rb +91 -0
  84. data/test/cases/uuid_test_sqlserver.rb +41 -0
  85. data/test/config.yml +35 -0
  86. data/test/fixtures/1px.gif +0 -0
  87. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +11 -0
  88. data/test/models/sqlserver/customers_view.rb +3 -0
  89. data/test/models/sqlserver/datatype.rb +3 -0
  90. data/test/models/sqlserver/datatype_migration.rb +3 -0
  91. data/test/models/sqlserver/dollar_table_name.rb +3 -0
  92. data/test/models/sqlserver/edge_schema.rb +13 -0
  93. data/test/models/sqlserver/fk_has_fk.rb +3 -0
  94. data/test/models/sqlserver/fk_has_pk.rb +3 -0
  95. data/test/models/sqlserver/natural_pk_data.rb +4 -0
  96. data/test/models/sqlserver/natural_pk_int_data.rb +3 -0
  97. data/test/models/sqlserver/no_pk_data.rb +3 -0
  98. data/test/models/sqlserver/quoted_table.rb +7 -0
  99. data/test/models/sqlserver/quoted_view_1.rb +3 -0
  100. data/test/models/sqlserver/quoted_view_2.rb +3 -0
  101. data/test/models/sqlserver/string_default.rb +3 -0
  102. data/test/models/sqlserver/string_defaults_big_view.rb +3 -0
  103. data/test/models/sqlserver/string_defaults_view.rb +3 -0
  104. data/test/models/sqlserver/tinyint_pk.rb +3 -0
  105. data/test/models/sqlserver/upper.rb +3 -0
  106. data/test/models/sqlserver/uppered.rb +3 -0
  107. data/test/models/sqlserver/uuid.rb +3 -0
  108. data/test/schema/datatypes/2012.sql +64 -0
  109. data/test/schema/sqlserver_specific_schema.rb +181 -0
  110. data/test/support/coerceable_test_sqlserver.rb +45 -0
  111. data/test/support/load_schema_sqlserver.rb +29 -0
  112. data/test/support/minitest_sqlserver.rb +1 -0
  113. data/test/support/paths_sqlserver.rb +48 -0
  114. data/test/support/rake_helpers.rb +41 -0
  115. data/test/support/sql_counter_sqlserver.rb +32 -0
  116. metadata +271 -21
  117. data/CHANGELOG +0 -39
  118. data/VERSION +0 -1
  119. data/lib/active_record/connection_adapters/sqlserver/core_ext/relation.rb +0 -17
  120. data/lib/active_record/sqlserver_test_case.rb +0 -17
  121. data/lib/arel/nodes_sqlserver.rb +0 -14
  122. data/lib/arel/select_manager_sqlserver.rb +0 -62
@@ -3,8 +3,9 @@ require 'active_record/connection_adapters/sqlserver/showplan/printer_xml'
3
3
 
4
4
  module ActiveRecord
5
5
  module ConnectionAdapters
6
- module Sqlserver
6
+ module SQLServer
7
7
  module Showplan
8
+
8
9
  OPTION_ALL = 'SHOWPLAN_ALL'
9
10
  OPTION_TEXT = 'SHOWPLAN_TEXT'
10
11
  OPTION_XML = 'SHOWPLAN_XML'
@@ -12,7 +13,7 @@ module ActiveRecord
12
13
 
13
14
  def explain(arel, binds = [])
14
15
  sql = to_sql(arel)
15
- result = with_showplan_on { do_exec_query(sql, 'EXPLAIN', binds) }
16
+ result = with_showplan_on { sp_executesql(sql, 'EXPLAIN', binds) }
16
17
  printer = showplan_printer.new(result)
17
18
  printer.pp
18
19
  end
@@ -58,6 +59,7 @@ module ActiveRecord
58
59
  else PrinterTable
59
60
  end
60
61
  end
62
+
61
63
  end
62
64
  end
63
65
  end
@@ -1,6 +1,6 @@
1
1
  module ActiveRecord
2
2
  module ConnectionAdapters
3
- module Sqlserver
3
+ module SQLServer
4
4
  module Showplan
5
5
  class PrinterTable
6
6
  cattr_accessor :max_column_width, :cell_padding
@@ -1,6 +1,6 @@
1
1
  module ActiveRecord
2
2
  module ConnectionAdapters
3
- module Sqlserver
3
+ module SQLServer
4
4
  module Showplan
5
5
  class PrinterXml
6
6
  def initialize(result)
@@ -1,10 +1,7 @@
1
1
  module ActiveRecord
2
2
  module ConnectionAdapters
3
- module Sqlserver
3
+ module SQLServer
4
4
  class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition
5
- def uuid(name, options = {})
6
- column(name, 'uniqueidentifier', options)
7
- end
8
5
 
9
6
  def primary_key(name, type = :primary_key, options = {})
10
7
  return super unless type == :uuid
@@ -13,10 +10,58 @@ module ActiveRecord
13
10
  column name, type, options
14
11
  end
15
12
 
16
- def column(name, type = nil, options = {})
17
- super
18
- self
13
+ def real(name, options = {})
14
+ column(name, :real, options)
15
+ end
16
+
17
+ def money(name, options = {})
18
+ column(name, :money, options)
19
+ end
20
+
21
+ def smallmoney(name, options = {})
22
+ column(name, :smallmoney, options)
23
+ end
24
+
25
+ def char(name, options = {})
26
+ column(name, :char, options)
27
+ end
28
+
29
+ def varchar(name, options = {})
30
+ column(name, :varchar, options)
31
+ end
32
+
33
+ def varchar_max(name, options = {})
34
+ column(name, :varchar_max, options)
35
+ end
36
+
37
+ def text_basic(name, options = {})
38
+ column(name, :text_basic, options)
19
39
  end
40
+
41
+ def nchar(name, options = {})
42
+ column(name, :nchar, options)
43
+ end
44
+
45
+ def ntext(name, options = {})
46
+ column(name, :ntext, options)
47
+ end
48
+
49
+ def binary_basic(name, options = {})
50
+ column(name, :binary_basic, options)
51
+ end
52
+
53
+ def varbinary(name, options = {})
54
+ column(name, :varbinary, options)
55
+ end
56
+
57
+ def uuid(name, options = {})
58
+ column(name, :uniqueidentifier, options)
59
+ end
60
+
61
+ def ss_timestamp(name, options = {})
62
+ column(name, :ss_timestamp, options)
63
+ end
64
+
20
65
  end
21
66
  end
22
67
  end
@@ -0,0 +1,52 @@
1
+ require 'active_record/connection_adapters/abstract/transaction'
2
+
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+
6
+ module SQLServerTransaction
7
+
8
+ private
9
+
10
+ def sqlserver?
11
+ connection.respond_to?(:sqlserver?) && connection.sqlserver?
12
+ end
13
+
14
+ def current_isolation_level
15
+ return unless sqlserver?
16
+ level = connection.user_options_isolation_level
17
+ level.blank? ? 'READ COMMITTED' : level.upcase
18
+ end
19
+
20
+ end
21
+
22
+ Transaction.include SQLServerTransaction
23
+
24
+ module SQLServerRealTransaction
25
+
26
+ attr_reader :starting_isolation_level
27
+
28
+ def initialize(connection, options)
29
+ @connection = connection
30
+ @starting_isolation_level = current_isolation_level if options[:isolation]
31
+ super
32
+ end
33
+
34
+ def commit
35
+ super
36
+ reset_starting_isolation_level
37
+ end
38
+
39
+ private
40
+
41
+ def reset_starting_isolation_level
42
+ if sqlserver? && starting_isolation_level
43
+ connection.set_transaction_isolation_level(starting_isolation_level)
44
+ end
45
+ end
46
+
47
+ end
48
+
49
+ RealTransaction.include SQLServerRealTransaction
50
+
51
+ end
52
+ end
@@ -0,0 +1,46 @@
1
+ require 'active_record/type'
2
+ require 'active_record/connection_adapters/sqlserver/type/core_ext/value.rb'
3
+ require 'active_record/connection_adapters/sqlserver/type/castable.rb'
4
+ require 'active_record/connection_adapters/sqlserver/type/quoter.rb'
5
+ # Exact Numerics
6
+ require 'active_record/connection_adapters/sqlserver/type/integer.rb'
7
+ require 'active_record/connection_adapters/sqlserver/type/big_integer.rb'
8
+ require 'active_record/connection_adapters/sqlserver/type/small_integer.rb'
9
+ require 'active_record/connection_adapters/sqlserver/type/tiny_integer.rb'
10
+ require 'active_record/connection_adapters/sqlserver/type/boolean.rb'
11
+ require 'active_record/connection_adapters/sqlserver/type/decimal.rb'
12
+ require 'active_record/connection_adapters/sqlserver/type/money.rb'
13
+ require 'active_record/connection_adapters/sqlserver/type/small_money.rb'
14
+ # Approximate Numerics
15
+ require 'active_record/connection_adapters/sqlserver/type/float.rb'
16
+ require 'active_record/connection_adapters/sqlserver/type/real.rb'
17
+ # Date and Time
18
+ require 'active_record/connection_adapters/sqlserver/type/date.rb'
19
+ require 'active_record/connection_adapters/sqlserver/type/datetime.rb'
20
+ require 'active_record/connection_adapters/sqlserver/type/smalldatetime.rb'
21
+ require 'active_record/connection_adapters/sqlserver/type/time.rb'
22
+ # Character Strings
23
+ require 'active_record/connection_adapters/sqlserver/type/string.rb'
24
+ require 'active_record/connection_adapters/sqlserver/type/char.rb'
25
+ require 'active_record/connection_adapters/sqlserver/type/varchar.rb'
26
+ require 'active_record/connection_adapters/sqlserver/type/varchar_max.rb'
27
+ require 'active_record/connection_adapters/sqlserver/type/text.rb'
28
+ # Unicode Character Strings
29
+ require 'active_record/connection_adapters/sqlserver/type/unicode_string.rb'
30
+ require 'active_record/connection_adapters/sqlserver/type/unicode_char.rb'
31
+ require 'active_record/connection_adapters/sqlserver/type/unicode_varchar.rb'
32
+ require 'active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb'
33
+ require 'active_record/connection_adapters/sqlserver/type/unicode_text.rb'
34
+ # Binary Strings
35
+ require 'active_record/connection_adapters/sqlserver/type/binary.rb'
36
+ require 'active_record/connection_adapters/sqlserver/type/varbinary.rb'
37
+ require 'active_record/connection_adapters/sqlserver/type/varbinary_max.rb'
38
+ # Other Data Types
39
+ require 'active_record/connection_adapters/sqlserver/type/uuid.rb'
40
+ require 'active_record/connection_adapters/sqlserver/type/timestamp.rb'
41
+
42
+ module ActiveRecord
43
+ module Type
44
+ SQLServer = ConnectionAdapters::SQLServer::Type
45
+ end
46
+ end
@@ -0,0 +1,15 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class BigInteger < Integer
6
+
7
+ def type
8
+ :bigint
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Binary < ActiveRecord::Type::Binary
6
+
7
+ def type
8
+ :binary_basic
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Boolean < ActiveRecord::Type::Boolean
6
+
7
+ include Castable
8
+
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ module Castable
6
+
7
+ def type_cast_from_database(value)
8
+ type_cast_from_ss_database? ? super : value
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Char < String
6
+
7
+ def type
8
+ :char
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,39 @@
1
+ module ActiveRecord
2
+ module Type
3
+ class Value
4
+
5
+ module SQLServerBehavior
6
+
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ self.type_cast_from_ss_database = false
11
+ end
12
+
13
+ module ClassMethods
14
+
15
+ def type_cast_from_ss_database
16
+ @@type_cast_from_ss_database
17
+ end
18
+
19
+ def type_cast_from_ss_database=(boolean)
20
+ @@type_cast_from_ss_database = !!boolean
21
+ end
22
+
23
+ end
24
+
25
+ def type_cast_from_ss_database?
26
+ self.class.type_cast_from_ss_database
27
+ end
28
+
29
+ def type_cast_from_database(value)
30
+ type_cast_from_ss_database? ? super : value
31
+ end
32
+
33
+ end
34
+
35
+ include SQLServerBehavior
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,14 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Date < ActiveRecord::Type::Date
6
+
7
+ # When FreeTDS/TinyTDS casts this data type natively.
8
+ # include Castable
9
+
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class DateTime < ActiveRecord::Type::DateTime
6
+
7
+ include Castable
8
+
9
+ def type_cast_for_schema(value)
10
+ value.acts_like?(:string) ? "'#{value}'" : super
11
+ end
12
+
13
+
14
+ private
15
+
16
+ def cast_value(value)
17
+ value = value.respond_to?(:usec) ? value : super
18
+ return unless value
19
+ value.change usec: cast_usec(value)
20
+ end
21
+
22
+ def cast_usec(value)
23
+ return 0 if !value.respond_to?(:usec) || value.usec.zero?
24
+ seconds = value.usec.to_f / 1_000_000.0
25
+ ss_seconds = ((seconds * (1 / second_precision)).round / (1 / second_precision)).round(3)
26
+ (ss_seconds * 1_000_000).to_i
27
+ end
28
+
29
+ def second_precision
30
+ 0.00333
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,13 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Decimal < ActiveRecord::Type::Decimal
6
+
7
+ include Castable
8
+
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Float < ActiveRecord::Type::Float
6
+
7
+ include Castable
8
+
9
+ def type
10
+ :float
11
+ end
12
+
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Integer < ActiveRecord::Type::Integer
6
+
7
+ include Castable
8
+
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end