activerecord-jdbcsqlserver-adapter 50.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.travis.yml +27 -0
- data/CHANGELOG.md +124 -0
- data/CODE_OF_CONDUCT.md +31 -0
- data/Dockerfile +20 -0
- data/Gemfile +77 -0
- data/Guardfile +29 -0
- data/MIT-LICENSE +20 -0
- data/RAILS5-TODO.md +5 -0
- data/README.md +93 -0
- data/RUNNING_UNIT_TESTS.md +96 -0
- data/Rakefile +46 -0
- data/VERSION +1 -0
- data/activerecord-jdbcsqlserver-adapter.gemspec +21 -0
- data/appveyor.yml +39 -0
- data/docker-compose.ci.yml +11 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +27 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +25 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/date_time.rb +58 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +47 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +49 -0
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +362 -0
- data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +67 -0
- data/lib/active_record/connection_adapters/sqlserver/errors.rb +7 -0
- data/lib/active_record/connection_adapters/sqlserver/jdbc_overrides.rb +192 -0
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +99 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +34 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +16 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +517 -0
- data/lib/active_record/connection_adapters/sqlserver/showplan.rb +66 -0
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +66 -0
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +22 -0
- data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +20 -0
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +112 -0
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +64 -0
- data/lib/active_record/connection_adapters/sqlserver/type.rb +49 -0
- data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +19 -0
- data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +21 -0
- data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/char.rb +32 -0
- data/lib/active_record/connection_adapters/sqlserver/type/data.rb +30 -0
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +61 -0
- data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +71 -0
- data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +17 -0
- data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +23 -0
- data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +21 -0
- data/lib/active_record/connection_adapters/sqlserver/type/float.rb +19 -0
- data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/json.rb +11 -0
- data/lib/active_record/connection_adapters/sqlserver/type/money.rb +25 -0
- data/lib/active_record/connection_adapters/sqlserver/type/real.rb +19 -0
- data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +25 -0
- data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +29 -0
- data/lib/active_record/connection_adapters/sqlserver/type/string.rb +12 -0
- data/lib/active_record/connection_adapters/sqlserver/type/text.rb +19 -0
- data/lib/active_record/connection_adapters/sqlserver/type/time.rb +68 -0
- data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +93 -0
- data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +19 -0
- data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +25 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +21 -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 +19 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +26 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +24 -0
- data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +36 -0
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +26 -0
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +24 -0
- data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +26 -0
- data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +24 -0
- data/lib/active_record/connection_adapters/sqlserver/utils.rb +146 -0
- data/lib/active_record/connection_adapters/sqlserver/version.rb +11 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +445 -0
- data/lib/active_record/connection_adapters/sqlserver_column.rb +28 -0
- data/lib/active_record/jdbc_sqlserver_connection_methods.rb +31 -0
- data/lib/active_record/sqlserver_base.rb +16 -0
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +131 -0
- data/lib/activerecord-jdbcsqlserver-adapter.rb +24 -0
- data/lib/activerecord-sqlserver-adapter.rb +1 -0
- data/lib/arel/visitors/sqlserver.rb +205 -0
- data/lib/arel_sqlserver.rb +3 -0
- data/test/appveyor/dbsetup.ps1 +27 -0
- data/test/appveyor/dbsetup.sql +11 -0
- data/test/bin/wait-for.sh +79 -0
- data/test/cases/adapter_test_sqlserver.rb +430 -0
- data/test/cases/coerced_tests.rb +845 -0
- data/test/cases/column_test_sqlserver.rb +812 -0
- data/test/cases/connection_test_sqlserver.rb +71 -0
- data/test/cases/execute_procedure_test_sqlserver.rb +45 -0
- data/test/cases/fetch_test_sqlserver.rb +57 -0
- data/test/cases/fully_qualified_identifier_test_sqlserver.rb +76 -0
- data/test/cases/helper_sqlserver.rb +44 -0
- data/test/cases/index_test_sqlserver.rb +47 -0
- data/test/cases/json_test_sqlserver.rb +32 -0
- data/test/cases/migration_test_sqlserver.rb +61 -0
- data/test/cases/order_test_sqlserver.rb +147 -0
- data/test/cases/pessimistic_locking_test_sqlserver.rb +94 -0
- data/test/cases/rake_test_sqlserver.rb +169 -0
- data/test/cases/schema_dumper_test_sqlserver.rb +234 -0
- data/test/cases/schema_test_sqlserver.rb +54 -0
- data/test/cases/scratchpad_test_sqlserver.rb +8 -0
- data/test/cases/showplan_test_sqlserver.rb +65 -0
- data/test/cases/specific_schema_test_sqlserver.rb +180 -0
- data/test/cases/transaction_test_sqlserver.rb +91 -0
- data/test/cases/utils_test_sqlserver.rb +129 -0
- data/test/cases/uuid_test_sqlserver.rb +49 -0
- data/test/config.yml +38 -0
- data/test/debug.rb +14 -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/booking.rb +3 -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 +8 -0
- data/test/models/sqlserver/dollar_table_name.rb +3 -0
- data/test/models/sqlserver/dot_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/object_default.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/sst_memory.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 +55 -0
- data/test/schema/enable-in-memory-oltp.sql +81 -0
- data/test/schema/sqlserver_specific_schema.rb +238 -0
- data/test/support/coerceable_test_sqlserver.rb +49 -0
- data/test/support/connection_reflection.rb +34 -0
- data/test/support/load_schema_sqlserver.rb +29 -0
- data/test/support/minitest_sqlserver.rb +1 -0
- data/test/support/paths_sqlserver.rb +50 -0
- data/test/support/rake_helpers.rb +41 -0
- data/test/support/sql_counter_sqlserver.rb +28 -0
- data/test/support/test_in_memory_oltp.rb +15 -0
- metadata +310 -0
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
def serialize(value)
|
|
12
|
+
return if value.nil?
|
|
13
|
+
return value if value.is_a?(Data)
|
|
14
|
+
Data.new super, self
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def sqlserver_type
|
|
18
|
+
'char'.tap do |type|
|
|
19
|
+
type << "(#{limit})" if limit
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def quoted(value)
|
|
24
|
+
return value.quoted_id if value.respond_to?(:quoted_id)
|
|
25
|
+
Utils.quote_string_single(value)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
module ConnectionAdapters
|
|
3
|
+
module SQLServer
|
|
4
|
+
module Type
|
|
5
|
+
class Data
|
|
6
|
+
|
|
7
|
+
attr_reader :value, :type
|
|
8
|
+
|
|
9
|
+
def initialize(value, type)
|
|
10
|
+
@value, @type = value, type
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def quoted
|
|
14
|
+
type.quoted(@value)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def to_s
|
|
18
|
+
@value
|
|
19
|
+
end
|
|
20
|
+
alias_method :to_str, :to_s
|
|
21
|
+
|
|
22
|
+
def inspect
|
|
23
|
+
@value.inspect
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
module ConnectionAdapters
|
|
3
|
+
module SQLServer
|
|
4
|
+
module Type
|
|
5
|
+
class Date < ActiveRecord::Type::Date
|
|
6
|
+
|
|
7
|
+
def sqlserver_type
|
|
8
|
+
'date'.freeze
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def serialize(value)
|
|
12
|
+
return unless value.present?
|
|
13
|
+
date = super(value).to_s(:_sqlserver_dateformat)
|
|
14
|
+
Data.new date, self
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
if defined? JRUBY_VERSION
|
|
18
|
+
|
|
19
|
+
# Currently only called by our custom DateTime type for formatting
|
|
20
|
+
def _formatted(value)
|
|
21
|
+
value.to_s(:_sqlserver_dateformat)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @Override
|
|
25
|
+
# We do not want the DateTime object to be turned into a string
|
|
26
|
+
def serialize(value)
|
|
27
|
+
value = super
|
|
28
|
+
value.present? ? CoreExt::DateTime._jd_with_sql_type(value, self) : value
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def deserialize(value)
|
|
34
|
+
value.is_a?(Data) ? super(value.value) : super
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def type_cast_for_schema(value)
|
|
38
|
+
serialize(value).quoted
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def quoted(value)
|
|
42
|
+
Utils.quote_string_single(value)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def fast_string_to_date(string)
|
|
48
|
+
::Date.strptime(string, fast_string_to_date_format)
|
|
49
|
+
rescue ArgumentError
|
|
50
|
+
super
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def fast_string_to_date_format
|
|
54
|
+
::Date::DATE_FORMATS[:_sqlserver_dateformat]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
module ConnectionAdapters
|
|
3
|
+
module SQLServer
|
|
4
|
+
module Type
|
|
5
|
+
class DateTime < ActiveRecord::Type::DateTime
|
|
6
|
+
|
|
7
|
+
include TimeValueFractional
|
|
8
|
+
|
|
9
|
+
def sqlserver_type
|
|
10
|
+
'datetime'.freeze
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def serialize(value)
|
|
14
|
+
value = super
|
|
15
|
+
return value unless value.acts_like?(:time)
|
|
16
|
+
datetime = value.to_s(:_sqlserver_datetime).tap do |v|
|
|
17
|
+
fraction = quote_fractional(value)
|
|
18
|
+
v << ".#{fraction}"
|
|
19
|
+
end
|
|
20
|
+
Data.new datetime, self
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
if defined? JRUBY_VERSION
|
|
24
|
+
|
|
25
|
+
# Currently only called by our custom Time type for formatting
|
|
26
|
+
def _formatted(value)
|
|
27
|
+
"#{value.to_s(:_sqlserver_datetime)}.#{quote_fractional(value)}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @Override
|
|
31
|
+
# We do not want the Time object to be turned into a string
|
|
32
|
+
def serialize(value)
|
|
33
|
+
value = super
|
|
34
|
+
value.acts_like?(:time) ? CoreExt::Time._at_with_sql_type(value, self) : value
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def deserialize(value)
|
|
40
|
+
value.is_a?(Data) ? super(value.value) : super
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def type_cast_for_schema(value)
|
|
44
|
+
serialize(value).quoted
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def quoted(value)
|
|
48
|
+
Utils.quote_string_single(value)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def fast_string_to_time(string)
|
|
54
|
+
fast_string_to_time_zone.strptime(string, fast_string_to_time_format).time
|
|
55
|
+
rescue ArgumentError
|
|
56
|
+
super
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def fast_string_to_time_format
|
|
60
|
+
"#{::Time::DATE_FORMATS[:_sqlserver_datetime]}.%N".freeze
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def fast_string_to_time_zone
|
|
64
|
+
::Time.zone || ActiveSupport::TimeZone['UTC']
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
module ConnectionAdapters
|
|
3
|
+
module SQLServer
|
|
4
|
+
module Type
|
|
5
|
+
class DateTimeOffset < DateTime2
|
|
6
|
+
|
|
7
|
+
def type
|
|
8
|
+
:datetimeoffset
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def sqlserver_type
|
|
12
|
+
"datetimeoffset(#{precision.to_i})"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def quoted(value)
|
|
16
|
+
Utils.quote_string_single(value)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
module ConnectionAdapters
|
|
3
|
+
module SQLServer
|
|
4
|
+
module Type
|
|
5
|
+
class Decimal < ActiveRecord::Type::Decimal
|
|
6
|
+
|
|
7
|
+
def sqlserver_type
|
|
8
|
+
'decimal'.tap do |type|
|
|
9
|
+
type << "(#{precision.to_i},#{scale.to_i})" if precision || scale
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def type_cast_for_schema(value)
|
|
14
|
+
value.is_a?(BigDecimal) ? value.to_s : value.inspect
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
module ConnectionAdapters
|
|
3
|
+
module SQLServer
|
|
4
|
+
module Type
|
|
5
|
+
class Money < Decimal
|
|
6
|
+
|
|
7
|
+
def initialize(*args)
|
|
8
|
+
super
|
|
9
|
+
@precision = 19
|
|
10
|
+
@scale = 4
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def type
|
|
14
|
+
:money
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def sqlserver_type
|
|
18
|
+
'money'.freeze
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
module ConnectionAdapters
|
|
3
|
+
module SQLServer
|
|
4
|
+
module Type
|
|
5
|
+
class SmallMoney < Money
|
|
6
|
+
|
|
7
|
+
def initialize(*args)
|
|
8
|
+
super
|
|
9
|
+
@precision = 10
|
|
10
|
+
@scale = 4
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def type
|
|
14
|
+
:smallmoney
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def sqlserver_type
|
|
18
|
+
'smallmoney'.freeze
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
module ConnectionAdapters
|
|
3
|
+
module SQLServer
|
|
4
|
+
module Type
|
|
5
|
+
class SmallDateTime < DateTime
|
|
6
|
+
|
|
7
|
+
def type
|
|
8
|
+
:smalldatetime
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def sqlserver_type
|
|
12
|
+
'smalldatetime'.freeze
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def fast_string_to_time_format
|
|
18
|
+
::Time::DATE_FORMATS[:_sqlserver_datetime]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def apply_seconds_precision(value)
|
|
22
|
+
value.change usec: 0 if value
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|