activerecord-sqlserver-adapter_new 4.2.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/CHANGELOG.md +212 -0
- data/CODE_OF_CONDUCT.md +31 -0
- data/Gemfile +61 -0
- data/Guardfile +29 -0
- data/MIT-LICENSE +20 -0
- data/README.md +201 -0
- data/RUNNING_UNIT_TESTS.md +121 -0
- data/Rakefile +48 -0
- data/VERSION +1 -0
- data/activerecord-sqlserver-adapter_new.gemspec +20 -0
- data/appveyor.yml +39 -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/explain.rb +40 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/odbc.rb +34 -0
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +49 -0
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +386 -0
- data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +68 -0
- data/lib/active_record/connection_adapters/sqlserver/errors.rb +7 -0
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +69 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_cache.rb +114 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +52 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +473 -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/table_definition.rb +76 -0
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +57 -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 +12 -0
- data/lib/active_record/connection_adapters/sqlserver/type/char.rb +38 -0
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +21 -0
- data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +41 -0
- data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +17 -0
- data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +31 -0
- data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +12 -0
- data/lib/active_record/connection_adapters/sqlserver/type/float.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +12 -0
- data/lib/active_record/connection_adapters/sqlserver/type/money.rb +21 -0
- data/lib/active_record/connection_adapters/sqlserver/type/real.rb +15 -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 +22 -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 +40 -0
- data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +76 -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 +136 -0
- data/lib/active_record/connection_adapters/sqlserver/version.rb +11 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +405 -0
- data/lib/active_record/connection_adapters/sqlserver_column.rb +53 -0
- data/lib/active_record/sqlserver_base.rb +20 -0
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +131 -0
- data/lib/activerecord-sqlserver-adapter.rb +1 -0
- data/lib/arel/visitors/sqlserver.rb +214 -0
- data/lib/arel_sqlserver.rb +3 -0
- data/test/appveyor/dbsetup.ps1 +27 -0
- data/test/appveyor/dbsetup.sql +11 -0
- data/test/cases/adapter_test_sqlserver.rb +444 -0
- data/test/cases/coerced_tests.rb +713 -0
- data/test/cases/column_test_sqlserver.rb +780 -0
- data/test/cases/connection_test_sqlserver.rb +142 -0
- data/test/cases/execute_procedure_test_sqlserver.rb +44 -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 +54 -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 +90 -0
- data/test/cases/rake_test_sqlserver.rb +163 -0
- data/test/cases/schema_dumper_test_sqlserver.rb +198 -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 +167 -0
- data/test/cases/transaction_test_sqlserver.rb +66 -0
- data/test/cases/utils_test_sqlserver.rb +129 -0
- data/test/cases/uuid_test_sqlserver.rb +48 -0
- data/test/config.yml +41 -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 +3 -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/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/sqlserver_specific_schema.rb +207 -0
- data/test/support/coerceable_test_sqlserver.rb +45 -0
- data/test/support/connection_reflection.rb +37 -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 +32 -0
- metadata +253 -0
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'active_record/connection_adapters/sqlserver/showplan/printer_table'
|
2
|
+
require 'active_record/connection_adapters/sqlserver/showplan/printer_xml'
|
3
|
+
|
4
|
+
module ActiveRecord
|
5
|
+
module ConnectionAdapters
|
6
|
+
module SQLServer
|
7
|
+
module Showplan
|
8
|
+
|
9
|
+
OPTION_ALL = 'SHOWPLAN_ALL'
|
10
|
+
OPTION_TEXT = 'SHOWPLAN_TEXT'
|
11
|
+
OPTION_XML = 'SHOWPLAN_XML'
|
12
|
+
OPTIONS = [OPTION_ALL, OPTION_TEXT, OPTION_XML]
|
13
|
+
|
14
|
+
def explain(arel, binds = [])
|
15
|
+
sql = to_sql(arel)
|
16
|
+
result = with_showplan_on { sp_executesql(sql, 'EXPLAIN', binds) }
|
17
|
+
printer = showplan_printer.new(result)
|
18
|
+
printer.pp
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def with_showplan_on
|
24
|
+
set_showplan_option(true)
|
25
|
+
yield
|
26
|
+
ensure
|
27
|
+
set_showplan_option(false)
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_showplan_option(enable = true)
|
31
|
+
sql = "SET #{option} #{enable ? 'ON' : 'OFF'}"
|
32
|
+
raw_connection_do(sql)
|
33
|
+
rescue Exception
|
34
|
+
raise ActiveRecordError, "#{option} could not be turned #{enable ? 'ON' : 'OFF'}, perhaps you do not have SHOWPLAN permissions?"
|
35
|
+
end
|
36
|
+
|
37
|
+
def option
|
38
|
+
(SQLServerAdapter.showplan_option || OPTION_ALL).tap do |opt|
|
39
|
+
raise(ArgumentError, "Unknown SHOWPLAN option #{opt.inspect} found.") if OPTIONS.exclude?(opt)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def showplan_all?
|
44
|
+
option == OPTION_ALL
|
45
|
+
end
|
46
|
+
|
47
|
+
def showplan_text?
|
48
|
+
option == OPTION_TEXT
|
49
|
+
end
|
50
|
+
|
51
|
+
def showplan_xml?
|
52
|
+
option == OPTION_XML
|
53
|
+
end
|
54
|
+
|
55
|
+
def showplan_printer
|
56
|
+
case option
|
57
|
+
when OPTION_XML then PrinterXml
|
58
|
+
when OPTION_ALL, OPTION_TEXT then PrinterTable
|
59
|
+
else PrinterTable
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module SQLServer
|
4
|
+
module Showplan
|
5
|
+
class PrinterTable
|
6
|
+
cattr_accessor :max_column_width, :cell_padding
|
7
|
+
self.max_column_width = 50
|
8
|
+
self.cell_padding = 1
|
9
|
+
|
10
|
+
attr_reader :result
|
11
|
+
|
12
|
+
def initialize(result)
|
13
|
+
@result = result
|
14
|
+
end
|
15
|
+
|
16
|
+
def pp
|
17
|
+
@widths = compute_column_widths
|
18
|
+
@separator = build_separator
|
19
|
+
pp = []
|
20
|
+
pp << @separator
|
21
|
+
pp << build_cells(result.columns)
|
22
|
+
pp << @separator
|
23
|
+
result.rows.each do |row|
|
24
|
+
pp << build_cells(row)
|
25
|
+
end
|
26
|
+
pp << @separator
|
27
|
+
pp.join("\n") + "\n"
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def compute_column_widths
|
33
|
+
[].tap do |computed_widths|
|
34
|
+
result.columns.each_with_index do |column, i|
|
35
|
+
cells_in_column = [column] + result.rows.map { |r| cast_item(r[i]) }
|
36
|
+
computed_width = cells_in_column.map(&:length).max
|
37
|
+
final_width = computed_width > max_column_width ? max_column_width : computed_width
|
38
|
+
computed_widths << final_width
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def build_separator
|
44
|
+
'+' + @widths.map { |w| '-' * (w + (cell_padding * 2)) }.join('+') + '+'
|
45
|
+
end
|
46
|
+
|
47
|
+
def build_cells(items)
|
48
|
+
cells = []
|
49
|
+
items.each_with_index do |item, i|
|
50
|
+
cells << cast_item(item).ljust(@widths[i])
|
51
|
+
end
|
52
|
+
"| #{cells.join(' | ')} |"
|
53
|
+
end
|
54
|
+
|
55
|
+
def cast_item(item)
|
56
|
+
case item
|
57
|
+
when NilClass then 'NULL'
|
58
|
+
when Float then item.to_s.to(9)
|
59
|
+
else item.to_s.truncate(max_column_width)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module SQLServer
|
4
|
+
module Showplan
|
5
|
+
class PrinterXml
|
6
|
+
def initialize(result)
|
7
|
+
@result = result
|
8
|
+
end
|
9
|
+
|
10
|
+
def pp
|
11
|
+
xml = @result.rows.first.first
|
12
|
+
if defined?(Nokogiri)
|
13
|
+
Nokogiri::XML(xml).to_xml indent: 2, encoding: 'UTF-8'
|
14
|
+
else
|
15
|
+
xml
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module SQLServer
|
4
|
+
class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition
|
5
|
+
|
6
|
+
def primary_key(name, type = :primary_key, options = {})
|
7
|
+
return super unless type == :uuid
|
8
|
+
options[:default] = options.fetch(:default, 'NEWID()')
|
9
|
+
options[:primary_key] = true
|
10
|
+
column name, type, options
|
11
|
+
end
|
12
|
+
|
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 datetime2(name, options = {})
|
22
|
+
column(name, :datetime2, options)
|
23
|
+
end
|
24
|
+
|
25
|
+
def datetimeoffset(name, options = {})
|
26
|
+
column(name, :datetimeoffset, options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def smallmoney(name, options = {})
|
30
|
+
column(name, :smallmoney, options)
|
31
|
+
end
|
32
|
+
|
33
|
+
def char(name, options = {})
|
34
|
+
column(name, :char, options)
|
35
|
+
end
|
36
|
+
|
37
|
+
def varchar(name, options = {})
|
38
|
+
column(name, :varchar, options)
|
39
|
+
end
|
40
|
+
|
41
|
+
def varchar_max(name, options = {})
|
42
|
+
column(name, :varchar_max, options)
|
43
|
+
end
|
44
|
+
|
45
|
+
def text_basic(name, options = {})
|
46
|
+
column(name, :text_basic, options)
|
47
|
+
end
|
48
|
+
|
49
|
+
def nchar(name, options = {})
|
50
|
+
column(name, :nchar, options)
|
51
|
+
end
|
52
|
+
|
53
|
+
def ntext(name, options = {})
|
54
|
+
column(name, :ntext, options)
|
55
|
+
end
|
56
|
+
|
57
|
+
def binary_basic(name, options = {})
|
58
|
+
column(name, :binary_basic, options)
|
59
|
+
end
|
60
|
+
|
61
|
+
def varbinary(name, options = {})
|
62
|
+
column(name, :varbinary, options)
|
63
|
+
end
|
64
|
+
|
65
|
+
def uuid(name, options = {})
|
66
|
+
column(name, :uniqueidentifier, options)
|
67
|
+
end
|
68
|
+
|
69
|
+
def ss_timestamp(name, options = {})
|
70
|
+
column(name, :ss_timestamp, options)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,57 @@
|
|
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.send :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
|
+
def rollback
|
40
|
+
super
|
41
|
+
reset_starting_isolation_level
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def reset_starting_isolation_level
|
47
|
+
if sqlserver? && starting_isolation_level
|
48
|
+
connection.set_transaction_isolation_level(starting_isolation_level)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
RealTransaction.send :include, SQLServerRealTransaction
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'active_record/type'
|
2
|
+
# Exact Numerics
|
3
|
+
require 'active_record/connection_adapters/sqlserver/type/integer.rb'
|
4
|
+
require 'active_record/connection_adapters/sqlserver/type/big_integer.rb'
|
5
|
+
require 'active_record/connection_adapters/sqlserver/type/small_integer.rb'
|
6
|
+
require 'active_record/connection_adapters/sqlserver/type/tiny_integer.rb'
|
7
|
+
require 'active_record/connection_adapters/sqlserver/type/boolean.rb'
|
8
|
+
require 'active_record/connection_adapters/sqlserver/type/decimal.rb'
|
9
|
+
require 'active_record/connection_adapters/sqlserver/type/money.rb'
|
10
|
+
require 'active_record/connection_adapters/sqlserver/type/small_money.rb'
|
11
|
+
# Approximate Numerics
|
12
|
+
require 'active_record/connection_adapters/sqlserver/type/float.rb'
|
13
|
+
require 'active_record/connection_adapters/sqlserver/type/real.rb'
|
14
|
+
# Date and Time
|
15
|
+
require 'active_record/connection_adapters/sqlserver/type/time_value_fractional.rb'
|
16
|
+
require 'active_record/connection_adapters/sqlserver/type/date.rb'
|
17
|
+
require 'active_record/connection_adapters/sqlserver/type/datetime.rb'
|
18
|
+
require 'active_record/connection_adapters/sqlserver/type/datetime2.rb'
|
19
|
+
require 'active_record/connection_adapters/sqlserver/type/datetimeoffset.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,38 @@
|
|
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 type_cast_for_database(value)
|
12
|
+
return if value.nil?
|
13
|
+
return value if value.is_a?(Data)
|
14
|
+
Data.new(super)
|
15
|
+
end
|
16
|
+
|
17
|
+
class Data
|
18
|
+
|
19
|
+
def initialize(value)
|
20
|
+
@value = value.to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
def quoted
|
24
|
+
"'#{Utils.quote_string(@value)}'"
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
@value
|
29
|
+
end
|
30
|
+
alias_method :to_str, :to_s
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module SQLServer
|
4
|
+
module Type
|
5
|
+
class Date < ActiveRecord::Type::Date
|
6
|
+
|
7
|
+
def type_cast_for_database(value)
|
8
|
+
return unless value.present?
|
9
|
+
return value if value.acts_like?(:string)
|
10
|
+
value.to_s(:_sqlserver_dateformat)
|
11
|
+
end
|
12
|
+
|
13
|
+
def type_cast_for_schema(value)
|
14
|
+
type_cast_for_database(value).inspect
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|