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.
- checksums.yaml +4 -4
- data/.gitignore +15 -0
- data/CHANGELOG.md +60 -0
- data/Gemfile +45 -0
- data/Guardfile +29 -0
- data/MIT-LICENSE +5 -5
- data/README.md +193 -0
- data/RUNNING_UNIT_TESTS.md +95 -0
- data/Rakefile +48 -0
- data/activerecord-sqlserver-adapter.gemspec +28 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +5 -15
- data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +25 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +6 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/odbc.rb +9 -3
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +3 -1
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +130 -151
- data/lib/active_record/connection_adapters/sqlserver/errors.rb +0 -25
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +39 -78
- data/lib/active_record/connection_adapters/sqlserver/schema_cache.rb +71 -47
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +14 -30
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +112 -108
- data/lib/active_record/connection_adapters/sqlserver/showplan.rb +4 -2
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +1 -1
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +1 -1
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +52 -7
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +52 -0
- data/lib/active_record/connection_adapters/sqlserver/type.rb +46 -0
- data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +13 -0
- data/lib/active_record/connection_adapters/sqlserver/type/castable.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/char.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/core_ext/value.rb +39 -0
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +14 -0
- data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +37 -0
- data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +13 -0
- data/lib/active_record/connection_adapters/sqlserver/type/float.rb +17 -0
- data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +13 -0
- data/lib/active_record/connection_adapters/sqlserver/type/money.rb +21 -0
- data/lib/active_record/connection_adapters/sqlserver/type/quoter.rb +32 -0
- data/lib/active_record/connection_adapters/sqlserver/type/real.rb +17 -0
- data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +13 -0
- data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +21 -0
- data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +24 -0
- data/lib/active_record/connection_adapters/sqlserver/type/string.rb +12 -0
- data/lib/active_record/connection_adapters/sqlserver/type/text.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/time.rb +59 -0
- data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +22 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +12 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +20 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +20 -0
- data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +23 -0
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +20 -0
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +20 -0
- data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +20 -0
- data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +20 -0
- data/lib/active_record/connection_adapters/sqlserver/utils.rb +118 -12
- data/lib/active_record/connection_adapters/sqlserver/version.rb +11 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +133 -198
- data/lib/active_record/connection_adapters/sqlserver_column.rb +15 -86
- data/lib/active_record/sqlserver_base.rb +2 -0
- data/lib/arel/visitors/sqlserver.rb +120 -393
- data/lib/{arel/arel_sqlserver.rb → arel_sqlserver.rb} +1 -3
- data/test/cases/adapter_test_sqlserver.rb +420 -0
- data/test/cases/coerced_tests.rb +642 -0
- data/test/cases/column_test_sqlserver.rb +703 -0
- data/test/cases/connection_test_sqlserver.rb +216 -0
- data/test/cases/database_statements_test_sqlserver.rb +57 -0
- data/test/cases/execute_procedure_test_sqlserver.rb +38 -0
- data/test/cases/helper_sqlserver.rb +36 -0
- data/test/cases/migration_test_sqlserver.rb +66 -0
- data/test/cases/order_test_sqlserver.rb +147 -0
- data/test/cases/pessimistic_locking_test_sqlserver.rb +90 -0
- data/test/cases/schema_dumper_test_sqlserver.rb +175 -0
- data/test/cases/schema_test_sqlserver.rb +54 -0
- data/test/cases/scratchpad_test_sqlserver.rb +9 -0
- data/test/cases/showplan_test_sqlserver.rb +65 -0
- data/test/cases/specific_schema_test_sqlserver.rb +118 -0
- data/test/cases/transaction_test_sqlserver.rb +61 -0
- data/test/cases/utils_test_sqlserver.rb +91 -0
- data/test/cases/uuid_test_sqlserver.rb +41 -0
- data/test/config.yml +35 -0
- data/test/fixtures/1px.gif +0 -0
- data/test/migrations/transaction_table/1_table_will_never_be_created.rb +11 -0
- data/test/models/sqlserver/customers_view.rb +3 -0
- data/test/models/sqlserver/datatype.rb +3 -0
- data/test/models/sqlserver/datatype_migration.rb +3 -0
- data/test/models/sqlserver/dollar_table_name.rb +3 -0
- data/test/models/sqlserver/edge_schema.rb +13 -0
- data/test/models/sqlserver/fk_has_fk.rb +3 -0
- data/test/models/sqlserver/fk_has_pk.rb +3 -0
- data/test/models/sqlserver/natural_pk_data.rb +4 -0
- data/test/models/sqlserver/natural_pk_int_data.rb +3 -0
- data/test/models/sqlserver/no_pk_data.rb +3 -0
- data/test/models/sqlserver/quoted_table.rb +7 -0
- data/test/models/sqlserver/quoted_view_1.rb +3 -0
- data/test/models/sqlserver/quoted_view_2.rb +3 -0
- data/test/models/sqlserver/string_default.rb +3 -0
- data/test/models/sqlserver/string_defaults_big_view.rb +3 -0
- data/test/models/sqlserver/string_defaults_view.rb +3 -0
- data/test/models/sqlserver/tinyint_pk.rb +3 -0
- data/test/models/sqlserver/upper.rb +3 -0
- data/test/models/sqlserver/uppered.rb +3 -0
- data/test/models/sqlserver/uuid.rb +3 -0
- data/test/schema/datatypes/2012.sql +64 -0
- data/test/schema/sqlserver_specific_schema.rb +181 -0
- data/test/support/coerceable_test_sqlserver.rb +45 -0
- data/test/support/load_schema_sqlserver.rb +29 -0
- data/test/support/minitest_sqlserver.rb +1 -0
- data/test/support/paths_sqlserver.rb +48 -0
- data/test/support/rake_helpers.rb +41 -0
- data/test/support/sql_counter_sqlserver.rb +32 -0
- metadata +271 -21
- data/CHANGELOG +0 -39
- data/VERSION +0 -1
- data/lib/active_record/connection_adapters/sqlserver/core_ext/relation.rb +0 -17
- data/lib/active_record/sqlserver_test_case.rb +0 -17
- data/lib/arel/nodes_sqlserver.rb +0 -14
- 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
|
|
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 {
|
|
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,10 +1,7 @@
|
|
|
1
1
|
module ActiveRecord
|
|
2
2
|
module ConnectionAdapters
|
|
3
|
-
module
|
|
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
|
|
17
|
-
|
|
18
|
-
|
|
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,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,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
|