Class: ActiveRecord::ConnectionAdapters::SQLServerAdapter

Constant Summary collapse

ADAPTER_NAME =
"SQLServer".freeze
DEFAULT_TIME_PRECISION =
7

Constants included from ActiveRecord::ConnectionAdapters::SQLServer::Version

ActiveRecord::ConnectionAdapters::SQLServer::Version::VERSION

Constants included from ActiveRecord::ConnectionAdapters::SQLServer::Quoting

ActiveRecord::ConnectionAdapters::SQLServer::Quoting::QUOTED_FALSE, ActiveRecord::ConnectionAdapters::SQLServer::Quoting::QUOTED_STRING_PREFIX, ActiveRecord::ConnectionAdapters::SQLServer::Quoting::QUOTED_TRUE

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

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ActiveRecord::ConnectionAdapters::SQLServer::Quoting

#column_name_matcher, #column_name_with_order_matcher, #fetch_type_metadata, #quote_column_name, #quote_default_expression, #quote_string, #quote_string_single, #quote_string_single_national, #quoted_date, #quoted_false, #quoted_true, #unquoted_false, #unquoted_true

Methods included from ActiveRecord::ConnectionAdapters::SQLServer::DatabaseStatements

#begin_db_transaction, #begin_isolated_db_transaction, #build_insert_sql, #case_sensitive_comparison, #commit_db_transaction, #create_savepoint, #exec_delete, #exec_insert, #exec_query, #exec_rollback_db_transaction, #exec_rollback_to_savepoint, #exec_update, #execute, #execute_procedure, #insert_fixtures_set, #newid_function, #newsequentialid_function, #release_savepoint, #set_transaction_isolation_level, #transaction_isolation_levels, #use_database, #user_options, #user_options_dateformat, #user_options_isolation_level, #user_options_language, #with_identity_insert_enabled, #write_query?

Methods included from ActiveRecord::ConnectionAdapters::SQLServer::Showplan

#explain

Methods included from ActiveRecord::ConnectionAdapters::SQLServer::SchemaStatements

#change_column, #change_column_default, #change_column_null, #change_table_schema, #columns, #columns_for_distinct, #create_schema, #create_schema_dumper, #create_table, #drop_schema, #drop_table, #extract_foreign_key_action, #foreign_keys, #indexes, #native_database_types, #new_column, #primary_keys, #primary_keys_select, #remove_column, #remove_index!, #rename_column, #rename_index, #rename_table, #type_to_sql, #update_table_definition

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::DatabaseTasks

#charset, #collation, #create_database, #current_database, #drop_database

Constructor Details

#initialize(connection, logger = nil, config = {}) ⇒ SQLServerAdapter

Returns a new instance of SQLServerAdapter.



62
63
64
65
66
67
68
69
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 62

def initialize(connection, logger = nil, config = {})
  super(connection, logger, config)
  # Our Responsibility
  @connection_options = config
  connect
  initialize_dateformatter
  use_database
end

Instance Attribute Details

#spidObject (readonly)

Returns the value of attribute spid.



50
51
52
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 50

def spid
  @spid
end

Class Method Details

.database_exists?(config) ⇒ Boolean

Returns:

  • (Boolean)


85
86
87
88
89
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 85

def self.database_exists?(config)
  !!ActiveRecord::Base.sqlserver_connection(config)
rescue ActiveRecord::NoDatabaseError
  false
end

Instance Method Details

#active?Boolean

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

Returns:

  • (Boolean)


193
194
195
196
197
198
199
200
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 193

def active?
  return false unless @connection

  raw_connection_do "SELECT 1"
  true
rescue *connection_errors
  false
end

#arel_visitorObject

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



73
74
75
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 73

def arel_visitor
  Arel::Visitors::SQLServer.new self
end

#clear_cache!Object



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

def clear_cache!
  @view_information = nil
  super
end

#combine_bind_parameters(from_clause: [], join_clause: [], where_clause: [], having_clause: [], limit: nil, offset: nil) ⇒ Object



286
287
288
289
290
291
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 286

def combine_bind_parameters(from_clause: [], join_clause: [], where_clause: [], having_clause: [], limit: nil, offset: nil)
  result = from_clause + join_clause + where_clause + having_clause
  result << offset if offset
  result << limit if limit
  result
end

#database_prefixObject



266
267
268
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 266

def database_prefix
  @connection_options[:database_prefix]
end

#database_prefix_identifier(name) ⇒ Object



270
271
272
273
274
275
276
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 270

def database_prefix_identifier(name)
  if database_prefix_remote_server?
    SQLServer::Utils.extract_identifiers("#{database_prefix}#{name}")
  else
    SQLServer::Utils.extract_identifiers(name)
  end
end

#database_prefix_remote_server?Boolean

Returns:

  • (Boolean)


259
260
261
262
263
264
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 259

def database_prefix_remote_server?
  return false if database_prefix.blank?

  name = SQLServer::Utils.extract_identifiers(database_prefix)
  name.fully_qualified? && name.object.blank?
end

#disable_referential_integrityObject



183
184
185
186
187
188
189
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 183

def disable_referential_integrity
  tables = tables_with_referential_integrity
  tables.each { |t| do_execute "ALTER TABLE #{quote_table_name(t)} NOCHECK CONSTRAINT ALL" }
  yield
ensure
  tables.each { |t| do_execute "ALTER TABLE #{quote_table_name(t)} CHECK CONSTRAINT ALL" }
end

#disconnect!Object



208
209
210
211
212
213
214
215
216
217
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 208

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

#get_database_versionObject

:nodoc:



293
294
295
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 293

def get_database_version # :nodoc:
  version_year
end

#inspectObject



282
283
284
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 282

def inspect
  "#<#{self.class} version: #{version}, mode: #{@connection_options[:mode]}, azure: #{sqlserver_azure?.inspect}>"
end

#pk_and_sequence_for(table_name) ⇒ Object



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

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

#reconnect!Object



202
203
204
205
206
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 202

def reconnect!
  super
  disconnect!
  connect
end

#reset!Object



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

def reset!
  reset_transaction
  do_execute "IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION"
end

#schema_creationObject



81
82
83
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 81

def schema_creation
  SQLServer::SchemaCreation.new self
end

#sqlserver?Boolean

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

Returns:

  • (Boolean)


251
252
253
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 251

def sqlserver?
  true
end

#sqlserver_azure?Boolean

Returns:

  • (Boolean)


255
256
257
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 255

def sqlserver_azure?
  !!(sqlserver_version =~ /Azure/i)
end

#supports_advisory_locks?Boolean

Returns:

  • (Boolean)


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

def supports_advisory_locks?
  false
end

#supports_bulk_alter?Boolean

Returns:

  • (Boolean)


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

def supports_bulk_alter?
  false
end

#supports_comments?Boolean

Returns:

  • (Boolean)


143
144
145
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 143

def supports_comments?
  false
end

#supports_comments_in_create?Boolean

Returns:

  • (Boolean)


147
148
149
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 147

def supports_comments_in_create?
  false
end

#supports_datetime_with_precision?Boolean

Returns:

  • (Boolean)


135
136
137
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 135

def supports_datetime_with_precision?
  true
end

#supports_ddl_transactions?Boolean

Returns:

  • (Boolean)


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

def supports_ddl_transactions?
  true
end

#supports_explain?Boolean

Returns:

  • (Boolean)


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

def supports_explain?
  true
end

#supports_expression_index?Boolean

Returns:

  • (Boolean)


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

def supports_expression_index?
  false
end

#supports_foreign_keys?Boolean

Returns:

  • (Boolean)


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

def supports_foreign_keys?
  true
end

#supports_in_memory_oltp?Boolean

Returns:

  • (Boolean)


163
164
165
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 163

def supports_in_memory_oltp?
  @version_year >= 2014
end

#supports_index_sort_order?Boolean

Returns:

  • (Boolean)


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

def supports_index_sort_order?
  true
end

#supports_indexes_in_create?Boolean

Returns:

  • (Boolean)


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

def supports_indexes_in_create?
  false
end

#supports_insert_conflict_target?Boolean

Returns:

  • (Boolean)


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

def supports_insert_conflict_target?
  false
end

#supports_insert_on_duplicate_skip?Boolean

Returns:

  • (Boolean)


171
172
173
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 171

def supports_insert_on_duplicate_skip?
  false
end

#supports_insert_on_duplicate_update?Boolean

Returns:

  • (Boolean)


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

def supports_insert_on_duplicate_update?
  false
end

#supports_insert_returning?Boolean

Returns:

  • (Boolean)


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

def supports_insert_returning?
  true
end

#supports_json?Boolean

Returns:

  • (Boolean)


139
140
141
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 139

def supports_json?
  @version_year >= 2016
end

#supports_lazy_transactions?Boolean

Returns:

  • (Boolean)


159
160
161
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 159

def supports_lazy_transactions?
  true
end

#supports_optimizer_hints?Boolean

Returns:

  • (Boolean)


155
156
157
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 155

def supports_optimizer_hints?
  true
end

#supports_partial_index?Boolean

Returns:

  • (Boolean)


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

def supports_partial_index?
  true
end

#supports_savepoints?Boolean

Returns:

  • (Boolean)


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

def supports_savepoints?
  true
end

#supports_transaction_isolation?Boolean

Returns:

  • (Boolean)


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

def supports_transaction_isolation?
  true
end

#supports_views?Boolean

Returns:

  • (Boolean)


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

def supports_views?
  true
end

#tables_with_referential_integrityObject

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



231
232
233
234
235
236
237
238
239
240
241
242
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 231

def tables_with_referential_integrity
  schemas_and_tables = select_rows <<~SQL.squish
    SELECT DISTINCT s.name, o.name
    FROM sys.foreign_keys i
    INNER JOIN sys.objects o ON i.parent_object_id = o.OBJECT_ID
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
  SQL
  schemas_and_tables.map do |schema_table|
    schema, table = schema_table
    "#{SQLServer::Utils.quoted_raw(schema)}.#{SQLServer::Utils.quoted_raw(table)}"
  end
end

#valid_type?(type) ⇒ Boolean

Returns:

  • (Boolean)


77
78
79
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 77

def valid_type?(type)
  !native_database_types[type].nil?
end

#versionObject



278
279
280
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 278

def version
  self.class::VERSION
end