]> source.dussan.org Git - sonarqube.git/blob
261a06ef401906d54fa2741a15de33be629aed5b
[sonarqube.git] /
1 module JdbcSpec
2   module DB2
3     def self.column_selector
4       [/db2/i, lambda {|cfg,col|
5          if cfg[:url] =~ /^jdbc:derby:net:/
6            col.extend(::JdbcSpec::Derby::Column)
7          else
8            col.extend(::JdbcSpec::DB2::Column)
9          end }]
10     end
11
12     def self.adapter_selector
13       [/db2/i, lambda {|cfg,adapt|
14          if cfg[:url] =~ /^jdbc:derby:net:/
15            adapt.extend(::JdbcSpec::Derby)
16          else
17            adapt.extend(::JdbcSpec::DB2)
18          end }]
19     end
20
21     module Column
22       def type_cast(value)
23         return nil if value.nil? || value =~ /^\s*null\s*$/i
24         case type
25         when :string    then value
26         when :integer   then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
27         when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
28         when :float     then value.to_f
29         when :datetime  then cast_to_date_or_time(value)
30         when :timestamp then cast_to_time(value)
31         when :time      then cast_to_time(value)
32         else value
33         end
34       end
35       def cast_to_date_or_time(value)
36         return value if value.is_a? Date
37         return nil if value.blank?
38         guess_date_or_time((value.is_a? Time) ? value : cast_to_time(value))
39       end
40
41       def cast_to_time(value)
42         return value if value.is_a? Time
43         time_array = ParseDate.parsedate value
44         time_array[0] ||= 2000; time_array[1] ||= 1; time_array[2] ||= 1;
45         Time.send(ActiveRecord::Base.default_timezone, *time_array) rescue nil
46       end
47
48       def guess_date_or_time(value)
49         (value.hour == 0 and value.min == 0 and value.sec == 0) ?
50         Date.new(value.year, value.month, value.day) : value
51       end
52     end
53
54     def modify_types(tp)
55       tp[:primary_key] = 'int generated by default as identity (start with 42) primary key'
56       tp[:string][:limit] = 255
57       tp[:integer][:limit] = nil
58       tp[:boolean][:limit] = nil
59       tp
60     end
61
62     def add_limit_offset!(sql, options)
63       if limit = options[:limit]
64         offset = options[:offset] || 0
65         sql.gsub!(/SELECT/i, 'SELECT B.* FROM (SELECT A.*, row_number() over () AS internal$rownum FROM (SELECT')
66         sql << ") A ) B WHERE B.internal$rownum > #{offset} AND B.internal$rownum <= #{limit + offset}"
67       end
68     end
69
70     def quote_column_name(column_name)
71       column_name
72     end
73
74     def quote(value, column = nil) # :nodoc:
75       if column && column.type == :primary_key
76         return value.to_s
77       end
78       if column && (column.type == :decimal || column.type == :integer) && value
79         return value.to_s
80       end
81       case value
82       when String
83         if column && column.type == :binary
84           "BLOB('#{quote_string(value)}')"
85         else
86           "'#{quote_string(value)}'"
87         end
88       else super
89       end
90     end
91
92     def quote_string(string)
93       string.gsub(/'/, "''") # ' (for ruby-mode)
94     end
95
96     def quoted_true
97       '1'
98     end
99
100     def quoted_false
101       '0'
102     end
103
104     def recreate_database(name)
105       do_not_drop = ["stmg_dbsize_info","hmon_atm_info","hmon_collection","policy"]
106       tables.each do |table|
107         unless do_not_drop.include?(table)
108           drop_table(table)
109         end
110       end
111     end
112
113     def remove_index(table_name, options = { })
114       execute "DROP INDEX #{quote_column_name(index_name(table_name, options))}"
115     end
116
117     # This method makes tests pass without understanding why.
118     # Don't use this in production.
119     def columns(table_name, name = nil)
120       super.select do |col|
121         # strip out "magic" columns from DB2 (?)
122         !/rolename|roleid|create_time|auditpolicyname|auditpolicyid|remarks/.match(col.name)
123       end
124     end
125
126     def add_quotes(name)
127       return name unless name
128       %Q{"#{name}"}
129     end
130
131     def strip_quotes(str)
132       return str unless str
133       return str unless /^(["']).*\1$/ =~ str
134       str[1..-2]
135     end
136
137     def expand_double_quotes(name)
138       return name unless name && name['"']
139       name.gsub(/"/,'""')
140     end
141
142
143     def structure_dump #:nodoc:
144       definition=""
145       rs = @connection.connection.meta_data.getTables(nil,nil,nil,["TABLE"].to_java(:string))
146       while rs.next
147         tname = rs.getString(3)
148         definition << "CREATE TABLE #{tname} (\n"
149         rs2 = @connection.connection.meta_data.getColumns(nil,nil,tname,nil)
150         first_col = true
151         while rs2.next
152           col_name = add_quotes(rs2.getString(4));
153           default = ""
154           d1 = rs2.getString(13)
155           default = d1 ? " DEFAULT #{d1}" : ""
156
157           type = rs2.getString(6)
158           col_size = rs2.getString(7)
159           nulling = (rs2.getString(18) == 'NO' ? " NOT NULL" : "")
160           create_col_string = add_quotes(expand_double_quotes(strip_quotes(col_name))) +
161             " " +
162             type +
163             "" +
164             nulling +
165             default
166           if !first_col
167             create_col_string = ",\n #{create_col_string}"
168           else
169             create_col_string = " #{create_col_string}"
170           end
171
172           definition << create_col_string
173
174           first_col = false
175         end
176         definition << ");\n\n"
177       end
178       definition
179     end
180
181     def dump_schema_information
182       begin
183         if (current_schema = ActiveRecord::Migrator.current_version) > 0
184           #TODO: Find a way to get the DB2 instace name to properly form the statement
185           return "INSERT INTO DB2INST2.SCHEMA_INFO (version) VALUES (#{current_schema})"
186         end
187       rescue ActiveRecord::StatementInvalid
188         # No Schema Info
189       end
190     end
191
192   end
193 end