Files

Class/Module Index [+]

Quicksearch

ArJdbc::MSSQL

Constants

ADAPTER_NAME

Public Class Methods

arel2_visitors(config) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 52
def self.arel2_visitors(config)
  require 'arel/visitors/sql_server'
  visitors = config[:sqlserver_version] == '2000' ? 
    ::Arel::Visitors::SQLServer2000 : ::Arel::Visitors::SQLServer
  { 'mssql' => visitors, 'jdbcmssql' => visitors, 'sqlserver' => visitors }
end
column_selector() click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 44
def self.column_selector
  [ /sqlserver|tds|Microsoft SQL/, lambda { |cfg, column| column.extend(::ArJdbc::MSSQL::Column) } ]
end
extended(base) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 15
def self.extended(base)
  unless @@_lob_callback_added
    ActiveRecord::Base.class_eval do
      def after_save_with_mssql_lob
        self.class.columns.select { |c| c.sql_type =~ /image/ }.each do |column|
          value = ::ArJdbc::SerializedAttributesHelper.dump_column_value(self, column)
          next if value.nil? || (value == '')

          connection.write_large_object(
            column.type == :binary, column.name, 
            self.class.table_name, self.class.primary_key, 
            quote_value(id), value
          )
        end
      end
    end

    ActiveRecord::Base.after_save :after_save_with_mssql_lob
    @@_lob_callback_added = true
  end
  
  if ( version = base.sqlserver_version ) == '2000'
    extend LimitHelpers::SqlServer2000AddLimitOffset
  else
    extend LimitHelpers::SqlServerAddLimitOffset
  end
  base.config[:sqlserver_version] ||= version
end
jdbc_connection_class() click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 48
def self.jdbc_connection_class
  ::ActiveRecord::ConnectionAdapters::MSSQLJdbcConnection
end

Public Instance Methods

add_column(table_name, column_name, type, options = {}) click to toggle source

Adds a new column to the named table. See TableDefinition#column for details of the options you can use.

# File lib/arjdbc/mssql/adapter.rb, line 282
def add_column(table_name, column_name, type, options = {})
  clear_cached_table(table_name)
  add_column_sql = "ALTER TABLE #{table_name} ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
  add_column_options!(add_column_sql, options)
  # TODO: Add support to mimic date columns, using constraints to mark them as such in the database
  # add_column_sql << " CONSTRAINT ck__#{table_name}__#{column_name}__date_only CHECK ( CONVERT(CHAR(12), #{quote_column_name(column_name)}, 14)='00:00:00:000' )" if type == :date
  execute(add_column_sql)
end
after_save_with_mssql_lob() click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 18
def after_save_with_mssql_lob
  self.class.columns.select { |c| c.sql_type =~ /image/ }.each do |column|
    value = ::ArJdbc::SerializedAttributesHelper.dump_column_value(self, column)
    next if value.nil? || (value == '')

    connection.write_large_object(
      column.type == :binary, column.name, 
      self.class.table_name, self.class.primary_key, 
      quote_value(id), value
    )
  end
end
change_order_direction(order) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 245
def change_order_direction(order)
  asc, desc = /\bASC\b/, /\bDESC\b/
  order.split(",").collect do |fragment|
    case fragment
    when desc  then fragment.gsub(desc, "ASC")
    when asc   then fragment.gsub(asc, "DESC")
    else "#{fragment.split(',').join(' DESC,')} DESC"
    end
  end.join(",")
end
clear_cached_table(name) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 437
def clear_cached_table(name)
  (@table_columns ||= {}).delete(name.to_s)
end
columns(table_name, name = nil) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 368
def columns(table_name, name = nil)
  # It's possible for table_name to be an empty string, or nil, if something 
  # attempts to issue SQL which doesn't involve a table. 
  # IE. "SELECT 1" or "SELECT * FROM someFunction()".
  return [] if table_name.blank?
  
  table_name = unquote_table_name(table_name)

  return [] if table_name =~ SKIP_COLUMNS_TABLE_NAMES_RE
  
  unless (@table_columns ||= {})[table_name]
    @table_columns[table_name] = super
    @table_columns[table_name].each do |column|
      column.identity = true if column.sql_type =~ /identity/
      column.is_special = true if column.sql_type =~ /text|ntext|image|xml/
    end
  end
  @table_columns[table_name]
end
create_database(name, options = {}) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 270
def create_database(name, options = {})
  execute "CREATE DATABASE #{name}"
  execute "USE #{name}"
end
determine_order_clause(sql) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 421
def determine_order_clause(sql)
  return $1 if sql =~ /ORDER BY (.*)$/
  table_name = get_table_name(sql)
  "#{table_name}.#{determine_primary_key(table_name)}"
end
determine_primary_key(table_name) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 427
def determine_primary_key(table_name)
  primary_key = columns(table_name).detect { |column| column.primary || column.identity }
  return primary_key.name if primary_key
  # Look for an id column and return it, 
  # without changing case, to cover DBs with a case-sensitive collation :
  columns(table_name).each { |column| return column.name if column.name =~ /^id$/ }
  # Give up and provide something which is going to crash almost certainly
  columns(table_name)[0].name
end
drop_database(name) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 265
def drop_database(name)
  execute "USE master"
  execute "DROP DATABASE #{name}"
end
identity_column(table_name) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 405
def identity_column(table_name)
  for column in columns(table_name)
    return column.name if column.identity
  end
  nil
end
query_requires_identity_insert?(sql) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 412
def query_requires_identity_insert?(sql)
  table_name = get_table_name(sql)
  id_column = identity_column(table_name)
  if sql.strip =~ /insert into [^ ]+ ?\((.+?)\)/
    insert_columns = $1.split(/, */).map(&method(:unquote_column_name))
    return table_name if insert_columns.include?(id_column)
  end
end
quote(value, column = nil) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 203
def quote(value, column = nil)
  return value.quoted_id if value.respond_to?(:quoted_id)

  case value
  # SQL Server 2000 doesn't let you insert an integer into a NVARCHAR
  # column, so we include Integer here.
  when String, ActiveSupport::Multibyte::Chars, Integer
    value = value.to_s
    column_type = column && column.type
    if column_type == :binary
      "'#{quote_string(ArJdbc::MSSQL::Column.string_to_binary(value))}'" # ' (for ruby-mode)
    elsif column_type == :integer
      value.to_i.to_s
    elsif column_type == :float
      value.to_f.to_s
    elsif ! column.respond_to?(:is_utf8?) || column.is_utf8?
      "N'#{quote_string(value)}'" # ' (for ruby-mode)
    else
      super
    end
  when TrueClass  then '1'
  when FalseClass then '0'
  else super
  end
end
quote_column_name(name) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 233
def quote_column_name(name)
  name.to_s.split('.').map do |n| # "[#{name}]"
    n =~ /^\[.*\]$/ ? n : "[#{n.gsub(']', ']]')}]"
  end.join('.')
end
quote_table_name(name) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 229
def quote_table_name(name)
  quote_column_name(name)
end
recreate_database(name, options = {}) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 260
def recreate_database(name, options = {})
  drop_database(name)
  create_database(name, options)
end
remove_check_constraints(table_name, column_name) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 348
def remove_check_constraints(table_name, column_name)
  clear_cached_table(table_name)
  constraints = select_values "SELECT constraint_name" <<
    " FROM information_schema.constraint_column_usage" <<
    " WHERE table_name = '#{table_name}' AND column_name = '#{column_name}'"
  constraints.each do |constraint_name|
    execute "ALTER TABLE #{table_name} DROP CONSTRAINT #{constraint_name}"
  end
end
remove_default_constraint(table_name, column_name) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 328
def remove_default_constraint(table_name, column_name)
  clear_cached_table(table_name)
  if sqlserver_2000?
    # NOTE: since SQLServer 2005 these are provided as sys.sysobjects etc.
    # but only due backwards-compatibility views and should be avoided ...
    defaults = select_values "SELECT d.name" <<
      " FROM sysobjects d, syscolumns c, sysobjects t" <<
      " WHERE c.cdefault = d.id AND c.name = '#{column_name}'" <<
      " AND t.name = '#{table_name}' AND c.id = t.id"
  else
    defaults = select_values "SELECT d.name FROM sys.tables t" <<
      " JOIN sys.default_constraints d ON d.parent_object_id = t.object_id" <<
      " JOIN sys.columns c ON c.object_id = t.object_id AND c.column_id = d.parent_column_id" <<
      " WHERE t.name = '#{table_name}' AND c.name = '#{column_name}'"
  end
  defaults.each do |def_name|
    execute "ALTER TABLE #{table_name} DROP CONSTRAINT #{def_name}"
  end
end
remove_index(table_name, options = {}) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 358
def remove_index(table_name, options = {})
  execute "DROP INDEX #{table_name}.#{index_name(table_name, options)}"
end
rename_column(table, column, new_column_name) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 291
def rename_column(table, column, new_column_name)
  clear_cached_table(table)
  execute "EXEC sp_rename '#{table}.#{column}', '#{new_column_name}'"
end
rename_table(name, new_name) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 275
def rename_table(name, new_name)
  clear_cached_table(name)
  execute "EXEC sp_rename '#{name}', '#{new_name}'"
end
reset_column_information() click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 441
def reset_column_information
  @table_columns = nil if defined? @table_columns
end
set_identity_insert(table_name, enable = true) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 398
def set_identity_insert(table_name, enable = true)
  execute "SET IDENTITY_INSERT #{table_name} #{enable ? 'ON' : 'OFF'}"
rescue Exception => e
  raise ActiveRecord::ActiveRecordError, "IDENTITY_INSERT could not be turned" + 
        " #{enable ? 'ON' : 'OFF'} for table #{table_name} due : #{e.inspect}"
end
sqlserver_version() click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 59
def sqlserver_version
  @sqlserver_version ||= begin
    config_version = config[:sqlserver_version]
    config_version ? config_version.to_s :
      select_value("SELECT @@version")[/Microsoft SQL Server\s+(\d{4})/, 1]
  end
end
supports_ddl_transactions?() click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 256
def supports_ddl_transactions?
  true
end
table_exists?(name) click to toggle source
# File lib/arjdbc/mssql/adapter.rb, line 362
def table_exists?(name)
  !! ( jdbc_columns(name) rescue nil )
end
with_identity_insert_enabled(table_name) click to toggle source

Turns IDENTITY_INSERT ON for table during execution of the block N.B. This sets the state of IDENTITY_INSERT to OFF after the block has been executed without regard to its previous state

# File lib/arjdbc/mssql/adapter.rb, line 391
def with_identity_insert_enabled(table_name)
  set_identity_insert(table_name, true)
  yield
ensure
  set_identity_insert(table_name, false)
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.