| Class | ActiveRecord::ConnectionAdapters::SQLServerAdapter |
| In: |
vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb
|
| Parent: | AbstractAdapter |
This adapter will ONLY work on Windows systems, since it relies on Win32OLE, which, to my knowledge, is only available on Window.
It relies on the ADO support in the DBI module. If you are using the one-click installer of Ruby, then you already have DBI installed, but the ADO module is NOT installed. You will need to get the latest source distribution of Ruby-DBI from ruby-dbi.sourceforge.net/ unzip it, and copy the file src/lib/dbd_ado/ADO.rb to X:/Ruby/lib/ruby/site_ruby/1.8/DBD/ADO/ADO.rb (you will need to create the ADO directory). Once you’ve installed that file, you are ready to go.
Options:
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 295
295: def adapter_name()
296: 'SqlServer'
297: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 257
257: def add_limit!(sql, limit)
258: if sql =~ /LIMIT/i
259: limit = sql.slice!(/LIMIT.*/).gsub(/LIMIT.(.*)$/, '\1')
260: end
261: if !limit.nil?
262: limit_amount = limit.to_s.include?("OFFSET") ? get_offset_amount(limit) : Array.new([limit])
263: order_by = sql.include?("ORDER BY") ? get_order_by(sql.sub(/.*ORDER\sBY./, "")) : nil
264: if limit_amount.size == 2
265: 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]}"
266: else
267: sql.gsub!(/SELECT/i, "SELECT TOP #{limit_amount[0]}")
268: end
269: end
270: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 207
207: def begin_db_transaction
208: begin
209: @connection["AutoCommit"] = false
210: rescue Exception => e
211: @connection["AutoCommit"] = true
212: end
213: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 138
138: def columns(table_name, name = nil)
139: sql = "SELECT \nCOLUMN_NAME as ColName,\nCOLUMN_DEFAULT as DefaultValue,\nDATA_TYPE as ColType,\nCOL_LENGTH('\#{table_name}', COLUMN_NAME) as Length,\nCOLUMNPROPERTY(OBJECT_ID('\#{table_name}'), COLUMN_NAME, 'IsIdentity') as IsIdentity,\nNUMERIC_SCALE as Scale\nFROM INFORMATION_SCHEMA.columns\nWHERE TABLE_NAME = '\#{table_name}'\n"
140:
141: result = nil
142: # Uncomment if you want to have the Columns select statment logged.
143: # Personnally, I think it adds unneccessary SQL statement bloat to the log.
144: # If you do uncomment, make sure to comment the "result" line that follows
145: log(sql, name, @connection) { |conn| result = conn.select_all(sql) }
146: #result = @connection.select_all(sql)
147: columns = []
148: result.each { |field| columns << ColumnWithIdentity.new(field[:ColName], field[:DefaultValue].to_s.gsub!(/[()\']/,"") =~ /null/ ? nil : field[:DefaultValue], "#{field[:ColType]}(#{field[:Length]})", field[:IsIdentity] == 1 ? true : false, field[:Scale]) }
149:
150: columns
151: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 215
215: def commit_db_transaction
216: begin
217: @connection.commit
218: ensure
219: @connection["AutoCommit"] = true
220: end
221: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 281
281: def create_database(name)
282: execute "CREATE DATABASE #{name}"
283: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 277
277: def drop_database(name)
278: execute "DROP DATABASE #{name}"
279: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 285
285: def execute(sql, name = nil)
286: if sql =~ /^INSERT/i
287: insert(sql, name)
288: else
289: log(sql, name, @connection) do |conn|
290: conn.execute(sql)
291: end
292: end
293: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 164
164: def insert(sql, name = nil, pk = nil, id_value = nil)
165: begin
166: table_name = get_table_name(sql)
167:
168: col = get_identity_column(table_name)
169:
170: ii_enabled = false
171:
172: if col != nil
173: if query_contains_identity_column(sql, col)
174: begin
175: execute enable_identity_insert(table_name, true)
176: ii_enabled = true
177: rescue Exception => e
178: # Coulnd't turn on IDENTITY_INSERT
179: end
180: end
181: end
182:
183: log(sql, name, @connection) do |conn|
184: conn.execute(sql)
185:
186: select_one("SELECT @@IDENTITY AS Ident")["Ident"]
187: end
188: ensure
189: if ii_enabled
190: begin
191: execute enable_identity_insert(table_name, false)
192:
193: rescue Exception => e
194: # Couldn't turn off IDENTITY_INSERT
195: end
196: end
197: end
198: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 231
231: def quote(value, column = nil)
232: case value
233: when String
234: if column && column.type == :binary
235: "'#{quote_string(column.string_to_binary(value))}'"
236: else
237: "'#{quote_string(value)}'"
238: end
239: when NilClass then "NULL"
240: when TrueClass then (column && column.type == :boolean ? "'t'" : "1")
241: when FalseClass then (column && column.type == :boolean ? "'f'" : "0")
242: when Float, Fixnum, Bignum then value.to_s
243: when Date then "'#{value.to_s}'"
244: when Time, DateTime then "'#{value.strftime("%Y-%m-%d %H:%M:%S")}'"
245: else "'#{quote_string(value.to_yaml)}'"
246: end
247: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 253
253: def quote_column_name(name)
254: "[#{name}]"
255: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 249
249: def quote_string(s)
250: s.gsub(/\'/, "''")
251: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 272
272: def recreate_database(name)
273: drop_database(name)
274: create_database(name)
275: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 223
223: def rollback_db_transaction
224: begin
225: @connection.rollback
226: ensure
227: @connection["AutoCommit"] = true
228: end
229: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 127
127: def select_all(sql, name = nil)
128: add_limit!(sql, nil)
129: select(sql, name)
130: end
# File vendor/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb, line 132
132: def select_one(sql, name = nil)
133: add_limit!(sql, nil)
134: result = select(sql, name)
135: result.nil? ? nil : result.first
136: end