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