# 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
# 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
# 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
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
# 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
# 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
# File lib/arjdbc/mssql/adapter.rb, line 437 def clear_cached_table(name) (@table_columns ||= {}).delete(name.to_s) end
# 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
# File lib/arjdbc/mssql/adapter.rb, line 270 def create_database(name, options = {}) execute "CREATE DATABASE #{name}" execute "USE #{name}" end
# 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
# 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
# File lib/arjdbc/mssql/adapter.rb, line 265 def drop_database(name) execute "USE master" execute "DROP DATABASE #{name}" end
# 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
# 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
# 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
# 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
# File lib/arjdbc/mssql/adapter.rb, line 229 def quote_table_name(name) quote_column_name(name) end
# File lib/arjdbc/mssql/adapter.rb, line 260 def recreate_database(name, options = {}) drop_database(name) create_database(name, options) end
# 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
# 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
# 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
# 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
# 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
# File lib/arjdbc/mssql/adapter.rb, line 441 def reset_column_information @table_columns = nil if defined? @table_columns end
# 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
# 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
# File lib/arjdbc/mssql/adapter.rb, line 256 def supports_ddl_transactions? true end
# File lib/arjdbc/mssql/adapter.rb, line 362 def table_exists?(name) !! ( jdbc_columns(name) rescue nil ) end
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
Generated with the Darkfish Rdoc Generator 2.