Class: ActiveRecord::ConnectionAdapters::SQLServerAdapter

Inherits:
AbstractAdapter show all
Defined in:
lib/active_record/connection_adapters/sqlserver_adapter.rb

Overview

:nodoc:

Instance Method Summary collapse

Methods inherited from AbstractAdapter

#initialize, #quote, #quote_string, #reset_runtime, #structure_dump, #transaction

Constructor Details

This class inherits a constructor from ActiveRecord::ConnectionAdapters::AbstractAdapter

Instance Method Details

#add_limit!(sql, limit) ⇒ Object



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

def add_limit!(sql, limit)
  limit_amount = limit.to_s.include?("OFFSET") ? get_offset_amount(limit) : Array.new([limit])
  order_by = sql.include?("ORDER BY") ? get_order_by(sql.sub(/.*ORDER\sBY./, "")) : nil
  if limit_amount.size == 2
    sql.gsub!(/SELECT/i, "SELECT * FROM ( SELECT TOP #{limit_amount[0]} * FROM ( SELECT TOP #{limit_amount[1]}")<<" ) AS tmp1 ORDER BY #{order_by[1]} ) AS tmp2 ORDER BY #{order_by[0]}"
  else
    sql.gsub!(/SELECT/i, "SELECT TOP #{limit_amount[0]}")
  end     
end

#begin_db_transactionObject



164
165
166
167
168
169
170
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 164

def begin_db_transaction
  begin
    @connection["AutoCommit"] = false
  rescue Exception => e
    @connection["AutoCommit"] = true
  end
end

#columns(table_name, name = nil) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 78

def columns(table_name, name = nil)
  sql = <<EOL
SELECT s.name AS TableName, c.id AS ColId, c.name AS ColName, t.name AS ColType, c.length AS Length,
c.AutoVal AS IsIdentity,
c.cdefault AS DefaultId, com.text AS DefaultValue
FROM syscolumns AS c
JOIN systypes AS t ON (c.xtype = t.xtype AND c.usertype = t.usertype)
JOIN sysobjects AS s ON (c.id = s.id)
LEFT OUTER JOIN syscomments AS com ON (c.cdefault = com.id)
WHERE s.name = '#{table_name}'
EOL
  columns = []

  log(sql, name, @connection) do |conn|
    conn.select_all(sql) do |row|
      default_value = row[:DefaultValue]

      if default_value =~ /null/i
        default_value = nil
      else
        default_value =~ /\(([^)]+)\)/
        default_value = $1
      end

      col = ColumnWithIdentity.new(row[:ColName], default_value, "#{row[:ColType]}(#{row[:Length]})", row[:IsIdentity] != nil)

      columns << col
    end
  end

  columns
end

#commit_db_transactionObject



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

def commit_db_transaction
  begin
    @connection.commit
  ensure
    @connection["AutoCommit"] = true
  end
end

#create_database(name) ⇒ Object



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

def create_database(name)
  execute "CREATE DATABASE #{name}"
end

#drop_database(name) ⇒ Object



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

def drop_database(name)
  execute "DROP DATABASE #{name}"
end

#execute(sql, name = nil) ⇒ Object



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

def execute(sql, name = nil)
  if sql =~ /^INSERT/i
    insert(sql, name)
  else
    log(sql, name, @connection) do |conn|
      conn.execute(sql)
    end
  end
end

#insert(sql, name = nil, pk = nil, id_value = nil) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 111

def insert(sql, name = nil, pk = nil, id_value = nil)
  begin
    table_name = get_table_name(sql)

    col = get_identity_column(table_name)

    ii_enabled = false

    if col != nil
      if query_contains_identity_column(sql, col)
        begin
          execute enable_identity_insert(table_name, true)
          ii_enabled = true
        rescue Exception => e
          # Coulnd't turn on IDENTITY_INSERT
        end
      end
    end

    log(sql, name, @connection) do |conn|
      conn.execute(sql)

      select_one("SELECT @@IDENTITY AS Ident")["Ident"]
    end
  ensure
    if ii_enabled
      begin
        execute enable_identity_insert(table_name, false)

      rescue Exception => e
        # Couldn't turn off IDENTITY_INSERT
      end
    end
  end
end

#quote_column_name(name) ⇒ Object



65
66
67
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 65

def quote_column_name(name)
  "[#{name}]"
end

#recreate_database(name) ⇒ Object



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

def recreate_database(name)
  drop_database(name)
  create_database(name)
end

#rollback_db_transactionObject



180
181
182
183
184
185
186
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 180

def rollback_db_transaction
  begin
    @connection.rollback
  ensure
    @connection["AutoCommit"] = true
  end
end

#select_all(sql, name = nil) ⇒ Object



69
70
71
# File 'lib/active_record/connection_adapters/sqlserver_adapter.rb', line 69

def select_all(sql, name = nil)
  select(sql, name)
end

#select_one(sql, name = nil) ⇒ Object



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

def select_one(sql, name = nil)
  result = select(sql, name)
  result.nil? ? nil : result.first
end

#update(sql, name = nil) ⇒ Object Also known as: delete



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

def update(sql, name = nil)
  execute(sql, name)
  affected_rows(name)
end