]> source.dussan.org Git - sonarqube.git/blob
ea20e8fcf4be61a790b9019b48d2b8944c324a19
[sonarqube.git] /
1 # Common methods for handling TSQL databases.
2 module TSqlMethods
3
4   def modify_types(tp) #:nodoc:
5     tp[:primary_key] = "int NOT NULL IDENTITY(1, 1) PRIMARY KEY"
6     tp[:integer][:limit] = nil
7     tp[:boolean] = {:name => "bit"}
8     tp[:binary] = { :name => "image"}
9     tp
10   end
11
12   def type_to_sql(type, limit = nil, precision = nil, scale = nil) #:nodoc:
13     limit = nil if %w(text binary).include? type.to_s
14     return 'uniqueidentifier' if (type.to_s == 'uniqueidentifier')
15     return super unless type.to_s == 'integer'
16
17     if limit.nil? || limit == 4
18       'int'
19     elsif limit == 2
20       'smallint'
21     elsif limit == 1
22       'tinyint'
23     else
24       'bigint'
25     end
26   end
27
28   def add_limit_offset!(sql, options)
29     if options[:limit] and options[:offset]
30       total_rows = select_all("SELECT count(*) as TotalRows from (#{sql.gsub(/\bSELECT(\s+DISTINCT)?\b/i, "SELECT\\1 TOP 1000000000")}) tally")[0]["TotalRows"].to_i
31       if (options[:limit] + options[:offset]) >= total_rows
32         options[:limit] = (total_rows - options[:offset] >= 0) ? (total_rows - options[:offset]) : 0
33       end
34       sql.sub!(/^\s*SELECT(\s+DISTINCT)?/i, "SELECT * FROM (SELECT TOP #{options[:limit]} * FROM (SELECT\\1 TOP #{options[:limit] + options[:offset]} ")
35       sql << ") AS tmp1"
36       if options[:order]
37         options[:order] = options[:order].split(',').map do |field|
38           parts = field.split(" ")
39           tc = parts[0]
40           if sql =~ /\.\[/ and tc =~ /\./ # if column quoting used in query
41             tc.gsub!(/\./, '\\.\\[')
42             tc << '\\]'
43           end
44           if sql =~ /#{tc} AS (t\d_r\d\d?)/
45               parts[0] = $1
46           elsif parts[0] =~ /\w+\.(\w+)/
47             parts[0] = $1
48           end
49           parts.join(' ')
50         end.join(', ')
51         sql << " ORDER BY #{change_order_direction(options[:order])}) AS tmp2 ORDER BY #{options[:order]}"
52       else
53         sql << " ) AS tmp2"
54       end
55     elsif sql !~ /^\s*SELECT (@@|COUNT\()/i
56       sql.sub!(/^\s*SELECT(\s+DISTINCT)?/i) do
57         "SELECT#{$1} TOP #{options[:limit]}"
58       end unless options[:limit].nil?
59     end
60   end
61 end