Skip to content

Commit

Permalink
SQLServer: fix obscure optimistic locking bug, support uniqueidentifi…
Browse files Browse the repository at this point in the history
…er columns, cope with tables names qualified by owner, cope with columns with desc in the name, cope with primary keys with select in the name. Closes #3068, #2930, #3067, #1950, #3057, #3162.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3270 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information
jeremy committed Dec 10, 2005
1 parent 6b7e51d commit 42576ff
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 4 deletions.
10 changes: 10 additions & 0 deletions activerecord/CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
*SVN*

* SQLServer: fix obscure optimistic locking bug. #3068 [kajism@yahoo.com]

* SQLServer: support uniqueidentifier columns. #2930 [keithm@infused.org]

* SQLServer: cope with tables names qualified by owner. #3067 [jeff@ministrycentered.com]

* SQLServer: cope with columns with "desc" in the name. #1950 [Ron Lusk, Ryan Tomayko]

* SQLServer: cope with primary keys with "select" in the name. #3057 [rdifrango@captechventures.com]

* Oracle: active? performs a select instead of a commit. #3133 [Michael Schoen]

* MySQL: more robust test for nullified result hashes. #3124 [Stefan Kaes]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ def simplified_type(field_type)
when /binary|image|varbinary/i then :binary
when /char|nchar|nvarchar|string|varchar/i then :string
when /bit/i then :boolean
when /uniqueidentifier/i then :string
end
end

Expand Down Expand Up @@ -233,6 +234,9 @@ def select_one(sql, name = nil)
end

def columns(table_name, name = nil)
return [] if table_name.blank?
table_name = table_name.to_s if table_name.is_a?(Symbol)
table_name = table_name.split('.')[-1] unless table_name.nil?
sql = "SELECT COLUMN_NAME as ColName, COLUMN_DEFAULT as DefaultValue, DATA_TYPE as ColType, COL_LENGTH('#{table_name}', COLUMN_NAME) as Length, COLUMNPROPERTY(OBJECT_ID('#{table_name}'), COLUMN_NAME, 'IsIdentity') as IsIdentity, NUMERIC_SCALE as Scale FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '#{table_name}'"
# Comment out if you want to have the Columns select statment logged.
# Personnally, I think it adds unneccessary bloat to the log.
Expand Down Expand Up @@ -347,7 +351,7 @@ def quote_column_name(name)

def add_limit_offset!(sql, options)
if options[:limit] and options[:offset]
total_rows = @connection.select_all("SELECT count(*) as TotalRows from (#{sql.gsub(/SELECT/i, "SELECT TOP 1000000000")}) tally")[0][:TotalRows].to_i
total_rows = @connection.select_all("SELECT count(*) as TotalRows from (#{sql.gsub(/\bSELECT\b/i, "SELECT TOP 1000000000")}) tally")[0][:TotalRows].to_i
if (options[:limit] + options[:offset]) >= total_rows
options[:limit] = (total_rows - options[:offset] >= 0) ? (total_rows - options[:offset]) : 0
end
Expand Down Expand Up @@ -509,9 +513,9 @@ def query_contains_identity_column(sql, col)

def change_order_direction(order)
case order
when /DESC/i then order.gsub(/DESC/i, "ASC")
when /ASC/i then order.gsub(/ASC/i, "DESC")
else String.new(order).split(',').join(' DESC,') + ' DESC'
when /\bDESC\b/i then order.gsub(/\bDESC\b/i, "ASC")
when /\bASC\b/i then order.gsub(/\bASC\b/i, "DESC")
else String.new(order).split(',').join(' DESC,') + ' DESC'
end
end

Expand Down

0 comments on commit 42576ff

Please sign in to comment.