]> source.dussan.org Git - sonarqube.git/blob
fe03f2d4ff3e5374822c6514d67fb6743c732668
[sonarqube.git] /
1 module JdbcSpec
2   module Mimer
3     def self.adapter_selector
4       [/mimer/i, lambda {|cfg,adapt| adapt.extend(::JdbcSpec::Mimer)}]
5     end
6
7     def modify_types(tp)
8       tp[:primary_key] = "INTEGER NOT NULL PRIMARY KEY"
9       tp[:boolean][:limit] = nil
10       tp[:string][:limit] = 255
11       tp[:binary] = {:name => "BINARY VARYING", :limit => 4096}
12       tp[:text] = {:name => "VARCHAR", :limit => 4096}
13       tp[:datetime] = { :name => "TIMESTAMP" }
14       tp[:timestamp] = { :name => "TIMESTAMP" }
15       tp[:time] = { :name => "TIMESTAMP" }
16       tp[:date] = { :name => "TIMESTAMP" }
17       tp
18     end
19     
20     def default_sequence_name(table, column) #:nodoc:
21       "#{table}_seq"
22     end
23
24     def create_table(name, options = {}) #:nodoc:
25       super(name, options)
26       execute "CREATE SEQUENCE #{name}_seq" unless options[:id] == false
27     end
28
29     def drop_table(name, options = {}) #:nodoc:
30       super(name) rescue nil
31       execute "DROP SEQUENCE #{name}_seq" rescue nil
32     end
33
34     def change_column(table_name, column_name, type, options = {}) #:nodoc:
35       execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} #{type_to_sql(type, options[:limit])}"
36     end
37
38     def change_column_default(table_name, column_name, default) #:nodoc:
39       execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET DEFAULT #{quote(default)}"
40     end
41
42     def remove_index(table_name, options = {}) #:nodoc:
43       execute "DROP INDEX #{index_name(table_name, options)}"
44     end
45
46     def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc:
47       if pk.nil? # Who called us? What does the sql look like? No idea!
48         execute sql, name
49       elsif id_value # Pre-assigned id
50         log(sql, name) { @connection.execute_insert sql,pk }
51       else # Assume the sql contains a bind-variable for the id
52         id_value = select_one("SELECT NEXT_VALUE OF #{sequence_name} AS val FROM MIMER.ONEROW")['val']
53         log(sql, name) { 
54           execute_prepared_insert(sql,id_value)
55         }
56       end
57       id_value
58     end
59     
60     def execute_prepared_insert(sql, id)
61       @stmts ||= {}
62       @stmts[sql] ||= @connection.ps(sql)
63       stmt = @stmts[sql]
64       stmt.setLong(1,id)
65       stmt.executeUpdate
66       id
67     end
68
69     def quote(value, column = nil) #:nodoc:
70       return value.quoted_id if value.respond_to?(:quoted_id)
71       
72       if String === value && column && column.type == :binary
73         return "X'#{quote_string(value.unpack("C*").collect {|v| v.to_s(16)}.join)}'"
74       end
75       case value
76       when String     : %Q{'#{quote_string(value)}'}
77       when NilClass   : 'NULL'
78       when TrueClass  : '1'
79       when FalseClass : '0'
80       when Numeric    : value.to_s
81       when Date, Time : %Q{TIMESTAMP '#{value.strftime("%Y-%m-%d %H:%M:%S")}'}
82       else              %Q{'#{quote_string(value.to_yaml)}'}
83       end
84     end
85
86     def quoted_true
87       '1'
88     end
89
90     def quoted_false
91       '0'
92     end
93
94     def add_limit_offset!(sql, options) # :nodoc:
95       @limit = options[:limit]
96       @offset = options[:offset]
97     end
98     
99     def select_all(sql, name = nil)
100       @offset ||= 0
101       if !@limit || @limit == -1
102         range = @offset..-1
103       else
104         range = @offset...(@offset+@limit)
105       end
106       select(sql, name)[range]
107     ensure
108       @limit = @offset = nil
109     end
110     
111     def select_one(sql, name = nil)
112       @offset ||= 0
113       select(sql, name)[@offset]
114     ensure
115       @limit = @offset = nil
116     end
117
118     def _execute(sql, name = nil)
119         if sql =~ /^select/i
120           @offset ||= 0
121           if !@limit || @limit == -1
122             range = @offset..-1
123           else
124             range = @offset...(@offset+@limit)
125           end
126           @connection.execute_query(sql)[range]
127         else
128           @connection.execute_update(sql)
129         end
130     ensure
131       @limit = @offset = nil
132     end
133   end
134 end