Class: ActiveRecord::ConnectionAdapters::SQLServerAdapter

Defined Under Namespace

Classes: BindSubstitution

Constant Summary collapse

VERSION =
File.read(File.expand_path('../../../../VERSION', __FILE__)).strip
ADAPTER_NAME =
'SQLServer'.freeze
DATABASE_VERSION_REGEXP =
/Microsoft SQL Server\s+"?(\d{4}|\w+)"?/
SUPPORTED_VERSIONS =
[2005, 2008, 2010, 2011, 2012, 2014, 2016, 2017]

Constants included from ActiveRecord::ConnectionAdapters::Sqlserver::Errors

ActiveRecord::ConnectionAdapters::Sqlserver::Errors::LOST_CONNECTION_EXCEPTIONS, ActiveRecord::ConnectionAdapters::Sqlserver::Errors::LOST_CONNECTION_MESSAGES

Constants included from ActiveRecord::ConnectionAdapters::Sqlserver::Showplan

ActiveRecord::ConnectionAdapters::Sqlserver::Showplan::OPTIONS, ActiveRecord::ConnectionAdapters::Sqlserver::Showplan::OPTION_ALL, ActiveRecord::ConnectionAdapters::Sqlserver::Showplan::OPTION_TEXT, ActiveRecord::ConnectionAdapters::Sqlserver::Showplan::OPTION_XML

Constants included from ActiveRecord::ConnectionAdapters::Sqlserver::Quoting

ActiveRecord::ConnectionAdapters::Sqlserver::Quoting::QUOTED_STRING_PREFIX

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ActiveRecord::ConnectionAdapters::Sqlserver::Errors

#lost_connection_exceptions, #lost_connection_messages

Methods included from ActiveRecord::ConnectionAdapters::Sqlserver::DatabaseLimits

#column_name_length, #columns_per_multicolumn_index, #columns_per_table, #in_clause_length, #index_name_length, #indexes_per_table, #joins_per_query, #sql_query_length, #table_alias_length, #table_name_length

Methods included from ActiveRecord::ConnectionAdapters::Sqlserver::SchemaStatements

#change_column, #change_column_default, #change_column_null, #columns, #columns_for_distinct, #create_table, #indexes, #native_database_types, #remove_column, #remove_index!, #rename_column, #rename_index, #rename_table, #table_exists?, #tables, #type_to_sql, #views

Methods included from ActiveRecord::ConnectionAdapters::Sqlserver::Showplan

#explain

Methods included from ActiveRecord::ConnectionAdapters::Sqlserver::DatabaseStatements

#activity_stats, #add_limit_offset!, #begin_db_transaction, #case_sensitive_modifier, #charset, #commit_db_transaction, #create_database, #create_savepoint, #current_database, #drop_database, #empty_insert_statement_value, #exec_delete, #exec_insert, #exec_query, #exec_update, #execute, #execute_procedure, #newid_function, #newsequentialid_function, #recreate_database, #recreate_database!, #release_savepoint, #rollback_db_transaction, #rollback_to_savepoint, #run_with_isolation_level, #select_rows, #supports_statement_cache?, #use_database, #user_options, #user_options_dateformat, #user_options_isolation_level, #user_options_language

Methods included from ActiveRecord::ConnectionAdapters::Sqlserver::Quoting

#quote, #quote_column_name, #quote_database_name, #quote_default_value, #quote_string, #quote_table_name, #quoted_date, #quoted_datetime, #quoted_false, #quoted_full_iso8601, #quoted_string_prefix, #quoted_true, #substitute_at

Constructor Details

#initialize(connection, logger, pool, config) ⇒ SQLServerAdapter

Returns a new instance of SQLServerAdapter.



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 54

def initialize(connection, logger, pool, config)
  super(connection, logger, pool)
  # AbstractAdapter Responsibility
  @schema_cache = Sqlserver::SchemaCache.new self
  @visitor = Arel::Visitors::SQLServer.new self
  # Our Responsibility
  @config = config
  @connection_options = config
  connect
  @database_version = select_value 'SELECT @@version', 'SCHEMA'
  @database_year = begin
                     if @database_version =~ /Azure/i
                       @sqlserver_azure = true
                       @database_version.match(/\s-\s([0-9.]+)/)[1]
                       year = 2016
                     elsif @database_version =~ /vNext/i
                       year = 2016
                     else
                       year = DATABASE_VERSION_REGEXP.match(@database_version)[1]
                       year == 'Denali' ? 2011 : year.to_i
                     end
                   rescue
                     0
                   end
  @product_level    = select_value "SELECT CAST(SERVERPROPERTY('productlevel') AS VARCHAR(128))", 'SCHEMA'
  @product_version  = select_value "SELECT CAST(SERVERPROPERTY('productversion') AS VARCHAR(128))", 'SCHEMA'
  @edition          = select_value "SELECT CAST(SERVERPROPERTY('edition') AS VARCHAR(128))", 'SCHEMA'
  initialize_dateformatter
  use_database
  unless @sqlserver_azure == true || SUPPORTED_VERSIONS.include?(@database_year)
    raise NotImplementedError, "Currently, only #{SUPPORTED_VERSIONS.to_sentence} are supported. We got back #{@database_version}."
  end
end

Instance Attribute Details

#database_versionObject (readonly)

Returns the value of attribute database_version.



42
43
44
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 42

def database_version
  @database_version
end

#database_yearObject (readonly)

Returns the value of attribute database_year.



42
43
44
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 42

def database_year
  @database_year
end

#editionObject (readonly)

Returns the value of attribute edition.



42
43
44
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 42

def edition
  @edition
end

#product_levelObject (readonly)

Returns the value of attribute product_level.



42
43
44
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 42

def product_level
  @product_level
end

#product_versionObject (readonly)

Returns the value of attribute product_version.



42
43
44
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 42

def product_version
  @product_version
end

#spidObject (readonly)

Returns the value of attribute spid.



42
43
44
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 42

def spid
  @spid
end

Instance Method Details

#active?Boolean

Abstract Adapter (Connection Management) ================== #

Returns:

  • (Boolean)


139
140
141
142
143
144
145
146
147
148
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 139

def active?
  case @connection_options[:mode]
  when :dblib
    return @connection.active?
  end
  raw_connection_do('SELECT 1')
  true
rescue *lost_connection_exceptions
  false
end

#adapter_nameObject

Abstract Adapter ========================================== #



90
91
92
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 90

def adapter_name
  ADAPTER_NAME
end

#auto_connectObject



225
226
227
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 225

def auto_connect
  @@auto_connect.is_a?(FalseClass) ? false : true
end

#auto_connect_durationObject



229
230
231
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 229

def auto_connect_duration
  @@auto_connect_duration ||= 10
end

#cs_equality_operatorObject



253
254
255
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 253

def cs_equality_operator
  @@cs_equality_operator || 'COLLATE Latin1_General_CS_AS_WS'
end

#disable_referential_integrityObject



130
131
132
133
134
135
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 130

def disable_referential_integrity
  do_execute "EXEC sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'"
  yield
ensure
  do_execute "EXEC sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'"
end

#disconnect!Object



157
158
159
160
161
162
163
164
165
166
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 157

def disconnect!
  reset_transaction
  @spid = nil
  case @connection_options[:mode]
  when :dblib
    @connection.close rescue nil
  when :odbc
    @connection.disconnect rescue nil
  end
end

#inspectObject



221
222
223
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 221

def inspect
  "#<#{self.class} version: #{version}, year: #{@database_year}, product_level: #{@product_level.inspect}, product_version: #{@product_version.inspect}, edition: #{@edition.inspect}, connection_options: #{@connection_options.inspect}>"
end

#native_binary_database_typeObject



249
250
251
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 249

def native_binary_database_type
  @@native_binary_database_type || 'varbinary(max)'
end

#native_date_database_typeObject



245
246
247
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 245

def native_date_database_type
  sqlserver_2005? ? 'datetime' : 'date'
end

#native_string_database_typeObject



233
234
235
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 233

def native_string_database_type
  @@native_string_database_type || (enable_default_unicode_types ? 'nvarchar' : 'varchar')
end

#native_text_database_typeObject



237
238
239
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 237

def native_text_database_type
  @@native_text_database_type || (enable_default_unicode_types ? 'nvarchar(max)' : 'varchar(max)')
end

#native_time_database_typeObject



241
242
243
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 241

def native_time_database_type
  sqlserver_2005? ? 'datetime' : 'time'
end

#pk_and_sequence_for(table_name) ⇒ Object

Abstract Adapter (Misc Support) =========================== #



174
175
176
177
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 174

def pk_and_sequence_for(table_name)
  pk = primary_key(table_name)
  pk ? [pk, nil] : nil
end

#primary_key(table_name) ⇒ Object



179
180
181
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 179

def primary_key(table_name)
  identity_column(table_name).try(:name) || schema_cache.columns(table_name).find(&:is_primary?).try(:name)
end

#reconnect!Object



150
151
152
153
154
155
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 150

def reconnect!
  reset_transaction
  disconnect!
  connect
  active?
end

#reset!Object



168
169
170
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 168

def reset!
  remove_database_connections_and_rollback {}
end

#schema_creationObject



183
184
185
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 183

def schema_creation
  Sqlserver::SchemaCreation.new self
end

#sqlserver?Boolean

SQLServer Specific (DB Reflection) ======================== #

Returns:

  • (Boolean)


189
190
191
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 189

def sqlserver?
  true
end

#sqlserver_2005?Boolean

Returns:

  • (Boolean)


193
194
195
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 193

def sqlserver_2005?
  @database_year == 2005
end

#sqlserver_2008?Boolean

Returns:

  • (Boolean)


197
198
199
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 197

def sqlserver_2008?
  @database_year == 2008
end

#sqlserver_2011?Boolean

Returns:

  • (Boolean)


201
202
203
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 201

def sqlserver_2011?
  @database_year == 2011
end

#sqlserver_2012?Boolean

Returns:

  • (Boolean)


205
206
207
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 205

def sqlserver_2012?
  @database_year == 2012
end

#sqlserver_2014?Boolean

Returns:

  • (Boolean)


209
210
211
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 209

def sqlserver_2014?
  @database_year == 2014
end

#sqlserver_azure?Boolean

Returns:

  • (Boolean)


213
214
215
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 213

def sqlserver_azure?
  @sqlserver_azure
end

#supports_bulk_alter?Boolean

Returns:

  • (Boolean)


110
111
112
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 110

def supports_bulk_alter?
  false
end

#supports_count_distinct?Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 102

def supports_count_distinct?
  true
end

#supports_ddl_transactions?Boolean

Returns:

  • (Boolean)


106
107
108
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 106

def supports_ddl_transactions?
  true
end

#supports_explain?Boolean

Returns:

  • (Boolean)


126
127
128
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 126

def supports_explain?
  true
end

#supports_index_sort_order?Boolean

Returns:

  • (Boolean)


118
119
120
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 118

def supports_index_sort_order?
  true
end

#supports_migrations?Boolean

Returns:

  • (Boolean)


94
95
96
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 94

def supports_migrations?
  true
end

#supports_partial_index?Boolean

Returns:

  • (Boolean)


122
123
124
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 122

def supports_partial_index?
  @database_year >= 2008
end

#supports_primary_key?Boolean

Returns:

  • (Boolean)


98
99
100
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 98

def supports_primary_key?
  true
end

#supports_savepoints?Boolean

Returns:

  • (Boolean)


114
115
116
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 114

def supports_savepoints?
  true
end

#versionObject



217
218
219
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 217

def version
  self.class::VERSION
end