# File lib/arjdbc/mssql/limit_helpers.rb, line 85 def get_primary_key(order, table_name) # table_name might be quoted if order =~ /(\w*id\w*)/ $1 else unquoted_name = unquote_table_name(table_name) model = descendants.find { |m| m.table_name == table_name || m.table_name == unquoted_name } model ? model.primary_key : 'id' end end
# File lib/arjdbc/mssql/limit_helpers.rb, line 49 def replace_limit_offset!(sql, limit, offset, order) if limit offset ||= 0 start_row = offset + 1 end_row = offset + limit.to_i _, select, rest_of_query = FIND_SELECT.match(sql).to_a if (start_row == 1) && (end_row ==1) new_sql = "#{select} TOP 1 #{rest_of_query}" sql.replace(new_sql) else #UGLY #KLUDGY? #removing out stuff before the FROM... rest = rest_of_query[/FROM/=~ rest_of_query.. -1] #need the table name for avoiding amiguity table_name = Utils.get_table_name(sql, true) primary_key = get_primary_key(order, table_name) #I am not sure this will cover all bases. but all the tests pass if order[/ORDER/].nil? new_order = "ORDER BY #{order}, #{table_name}.#{primary_key}" if order.index("#{table_name}.#{primary_key}").nil? else new_order ||= order end if (rest_of_query.match(/WHERE/).nil?) new_sql = "#{select} TOP #{limit} #{rest_of_query} WHERE #{table_name}.#{primary_key} NOT IN (#{select} TOP #{offset} #{table_name}.#{primary_key} #{rest} #{new_order}) #{order} " else new_sql = "#{select} TOP #{limit} #{rest_of_query} AND #{table_name}.#{primary_key} NOT IN (#{select} TOP #{offset} #{table_name}.#{primary_key} #{rest} #{new_order}) #{order} " end sql.replace(new_sql) end end sql end
Generated with the Darkfish Rdoc Generator 2.