Module: ActiveRecord::ConnectionAdapters::SQLServer::DatabaseStatements
- Includes:
 - Savepoints
 
- Included in:
 - ActiveRecord::ConnectionAdapters::SQLServerAdapter
 
- Defined in:
 - lib/active_record/connection_adapters/sqlserver/database_statements.rb
 
Instance Method Summary collapse
- #begin_db_transaction ⇒ Object
 - #begin_isolated_db_transaction(isolation) ⇒ Object
 - 
  
    
      #build_insert_sql(insert)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
:nodoc:.
 - #case_sensitive_comparison(attribute, value) ⇒ Object
 - #commit_db_transaction ⇒ Object
 - #create_savepoint(name = current_savepoint_name) ⇒ Object
 - #exec_delete(sql, name, binds) ⇒ Object
 - #exec_insert(sql, name = nil, binds = [], pk = nil, _sequence_name = nil) ⇒ Object
 - #exec_query(sql, name = "SQL", binds = [], prepare: false, async: false) ⇒ Object
 - #exec_rollback_db_transaction ⇒ Object
 - #exec_rollback_to_savepoint(name = current_savepoint_name) ⇒ Object
 - #exec_update(sql, name, binds) ⇒ Object
 - #execute(sql, name = nil) ⇒ Object
 - 
  
    
      #execute_procedure(proc_name, *variables)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
SQLServer Specific ======================================== #.
 - 
  
    
      #insert_fixtures_set(fixture_set, tables_to_delete = [])  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
We should propose this change to Rails team.
 - #newid_function ⇒ Object
 - #newsequentialid_function ⇒ Object
 - #release_savepoint(name = current_savepoint_name) ⇒ Object
 - #set_transaction_isolation_level(isolation_level) ⇒ Object
 - #transaction_isolation_levels ⇒ Object
 - #use_database(database = nil) ⇒ Object
 - #user_options ⇒ Object
 - #user_options_dateformat ⇒ Object
 - #user_options_isolation_level ⇒ Object
 - #user_options_language ⇒ Object
 - #with_identity_insert_enabled(table_name) ⇒ Object
 - 
  
    
      #write_query?(sql)  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    
:nodoc:.
 
Instance Method Details
#begin_db_transaction ⇒ Object
      62 63 64  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 62 def begin_db_transaction do_execute "BEGIN TRANSACTION", "TRANSACTION" end  | 
  
#begin_isolated_db_transaction(isolation) ⇒ Object
      70 71 72 73  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 70 def begin_isolated_db_transaction(isolation) set_transaction_isolation_level transaction_isolation_levels.fetch(isolation) begin_db_transaction end  | 
  
#build_insert_sql(insert) ⇒ Object
:nodoc:
      148 149 150 151 152 153 154 155 156 157 158 159 160 161 162  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 148 def build_insert_sql(insert) # :nodoc: sql = +"INSERT #{insert.into}" if returning = insert.send(:insert_all).returning returning_sql = if returning.is_a?(String) returning else returning.map { |column| "INSERTED.#{quote_column_name(column)}" }.join(", ") end sql << " OUTPUT #{returning_sql}" end sql << " #{insert.values_list}" sql end  | 
  
#case_sensitive_comparison(attribute, value) ⇒ Object
      100 101 102 103 104 105 106 107 108  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 100 def case_sensitive_comparison(attribute, value) column = column_for_attribute(attribute) if column.collation && !column.case_sensitive? attribute.eq(Arel::Nodes::Bin.new(value)) else super end end  | 
  
#commit_db_transaction ⇒ Object
      79 80 81  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 79 def commit_db_transaction do_execute "COMMIT TRANSACTION", "TRANSACTION" end  | 
  
#create_savepoint(name = current_savepoint_name) ⇒ Object
      89 90 91  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 89 def create_savepoint(name = current_savepoint_name) do_execute "SAVE TRANSACTION #{name}", "TRANSACTION" end  | 
  
#exec_delete(sql, name, binds) ⇒ Object
      52 53 54 55  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 52 def exec_delete(sql, name, binds) sql = sql.dup << "; SELECT @@ROWCOUNT AS AffectedRows" super(sql, name, binds).rows.first.first end  | 
  
#exec_insert(sql, name = nil, binds = [], pk = nil, _sequence_name = nil) ⇒ Object
      44 45 46 47 48 49 50  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 44 def exec_insert(sql, name = nil, binds = [], pk = nil, _sequence_name = nil) if id_insert_table_name = exec_insert_requires_identity?(sql, pk, binds) with_identity_insert_enabled(id_insert_table_name) { super(sql, name, binds, pk) } else super(sql, name, binds, pk) end end  | 
  
#exec_query(sql, name = "SQL", binds = [], prepare: false, async: false) ⇒ Object
      32 33 34 35 36 37 38 39 40 41 42  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 32 def exec_query(sql, name = "SQL", binds = [], prepare: false, async: false) sql = transform_query(sql) if preventing_writes? && write_query?(sql) raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}" end materialize_transactions mark_transaction_written_if_write(sql) sp_executesql(sql, name, binds, prepare: prepare, async: async) end  | 
  
#exec_rollback_db_transaction ⇒ Object
      83 84 85  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 83 def exec_rollback_db_transaction do_execute "IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION", "TRANSACTION" end  | 
  
#exec_rollback_to_savepoint(name = current_savepoint_name) ⇒ Object
      93 94 95  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 93 def exec_rollback_to_savepoint(name = current_savepoint_name) do_execute "ROLLBACK TRANSACTION #{name}", "TRANSACTION" end  | 
  
#exec_update(sql, name, binds) ⇒ Object
      57 58 59 60  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 57 def exec_update(sql, name, binds) sql = sql.dup << "; SELECT @@ROWCOUNT AS AffectedRows" super(sql, name, binds).rows.first.first end  | 
  
#execute(sql, name = nil) ⇒ Object
      16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 16 def execute(sql, name = nil) sql = transform_query(sql) if preventing_writes? && write_query?(sql) raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}" end materialize_transactions mark_transaction_written_if_write(sql) if id_insert_table_name = query_requires_identity_insert?(sql) with_identity_insert_enabled(id_insert_table_name) { do_execute(sql, name) } else do_execute(sql, name) end end  | 
  
#execute_procedure(proc_name, *variables) ⇒ Object
SQLServer Specific ======================================== #
      166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 166 def execute_procedure(proc_name, *variables) materialize_transactions vars = if variables.any? && variables.first.is_a?(Hash) variables.first.map { |k, v| "@#{k} = #{quote(v)}" } else variables.map { |v| quote(v) } end.join(", ") sql = "EXEC #{proc_name} #{vars}".strip name = "Execute Procedure" log(sql, name) do case @connection_options[:mode] when :dblib result = ensure_established_connection! { dblib_execute(sql) } = { as: :hash, cache_rows: true, timezone: ActiveRecord.default_timezone || :utc } result.each() do |row| r = row.with_indifferent_access yield(r) if block_given? end result.each.map { |row| row.is_a?(Hash) ? row.with_indifferent_access : row } end end end  | 
  
#insert_fixtures_set(fixture_set, tables_to_delete = []) ⇒ Object
We should propose this change to Rails team
      111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 111 def insert_fixtures_set(fixture_set, tables_to_delete = []) fixture_inserts = [] fixture_set.each do |table_name, fixtures| fixtures.each_slice(insert_rows_length) do |batch| fixture_inserts << build_fixture_sql(batch, table_name) end end table_deletes = tables_to_delete.map { |table| "DELETE FROM #{quote_table_name table}" } total_sqls = Array.wrap(table_deletes + fixture_inserts) disable_referential_integrity do transaction(requires_new: true) do total_sqls.each do |sql| execute sql, "Fixtures Load" yield if block_given? end end end end  | 
  
#newid_function ⇒ Object
      256 257 258  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 256 def newid_function select_value "SELECT NEWID()" end  | 
  
#newsequentialid_function ⇒ Object
      260 261 262  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 260 def newsequentialid_function select_value "SELECT NEWSEQUENTIALID()" end  | 
  
#release_savepoint(name = current_savepoint_name) ⇒ Object
      97 98  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 97 def release_savepoint(name = current_savepoint_name) end  | 
  
#set_transaction_isolation_level(isolation_level) ⇒ Object
      75 76 77  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 75 def set_transaction_isolation_level(isolation_level) do_execute "SET TRANSACTION ISOLATION LEVEL #{isolation_level}", "TRANSACTION" end  | 
  
#transaction_isolation_levels ⇒ Object
      66 67 68  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 66 def transaction_isolation_levels super.merge snapshot: "SNAPSHOT" end  | 
  
#use_database(database = nil) ⇒ Object
      198 199 200 201 202 203  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 198 def use_database(database = nil) return if sqlserver_azure? name = SQLServer::Utils.extract_identifiers(database || @connection_options[:database]).quoted do_execute "USE #{name}" unless name.blank? end  | 
  
#user_options ⇒ Object
      205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 205 def return {} if sqlserver_azure? rows = select_rows("DBCC USEROPTIONS WITH NO_INFOMSGS", "SCHEMA") rows = rows.first if rows.size == 2 && rows.last.empty? rows.reduce(HashWithIndifferentAccess.new) do |values, row| if row.instance_of? Hash set_option = row.values[0].gsub(/\s+/, "_") user_value = row.values[1] elsif row.instance_of? Array set_option = row[0].gsub(/\s+/, "_") user_value = row[1] end values[set_option] = user_value values end end  | 
  
#user_options_dateformat ⇒ Object
      223 224 225 226 227 228 229  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 223 def if sqlserver_azure? select_value "SELECT [dateformat] FROM [sys].[syslanguages] WHERE [langid] = @@LANGID", "SCHEMA" else ["dateformat"] end end  | 
  
#user_options_isolation_level ⇒ Object
      231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 231 def if sqlserver_azure? sql = %(SELECT CASE [transaction_isolation_level] WHEN 0 THEN NULL WHEN 1 THEN 'READ UNCOMMITTED' WHEN 2 THEN 'READ COMMITTED' WHEN 3 THEN 'REPEATABLE READ' WHEN 4 THEN 'SERIALIZABLE' WHEN 5 THEN 'SNAPSHOT' END AS [isolation_level] FROM [sys].[dm_exec_sessions] WHERE [session_id] = @@SPID).squish select_value sql, "SCHEMA" else ["isolation_level"] end end  | 
  
#user_options_language ⇒ Object
      248 249 250 251 252 253 254  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 248 def if sqlserver_azure? select_value "SELECT @@LANGUAGE AS [language]", "SCHEMA" else ["language"] end end  | 
  
#with_identity_insert_enabled(table_name) ⇒ Object
      190 191 192 193 194 195 196  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 190 def with_identity_insert_enabled(table_name) table_name = quote_table_name(table_name) set_identity_insert(table_name, true) yield ensure set_identity_insert(table_name, false) end  | 
  
#write_query?(sql) ⇒ Boolean
:nodoc:
      10 11 12 13 14  | 
    
      # File 'lib/active_record/connection_adapters/sqlserver/database_statements.rb', line 10 def write_query?(sql) # :nodoc: !READ_QUERY.match?(sql) rescue ArgumentError # Invalid encoding !READ_QUERY.match?(sql.b) end  |