]> source.dussan.org Git - sonarqube.git/blob
afc8cb202b08d726aad63d0cc627097e7607bd95
[sonarqube.git] /
1 module ActiveRecord
2   module ConnectionAdapters
3     class JdbcConnection
4       module ConfigHelper
5         attr_reader :config
6
7         def config=(config)
8           @config = config.symbolize_keys
9         end
10
11         def configure_connection
12           config[:retry_count] ||= 5
13           config[:connection_alive_sql] ||= "select 1"
14
15           # sonar
16           @jndi_connection = true
17           # /sonar
18           @connection = nil
19           if config[:jndi]
20             begin
21               configure_jndi
22             rescue => e
23               warn "JNDI data source unavailable: #{e.message}; trying straight JDBC"
24               configure_jdbc
25             end
26           else
27             configure_jdbc
28           end
29         end
30
31         def configure_jndi
32           jndi = config[:jndi].to_s
33           ctx = javax.naming.InitialContext.new
34           ds = ctx.lookup(jndi)
35           @connection_factory = JdbcConnectionFactory.impl do
36             ds.connection
37           end
38           unless config[:driver]
39             config[:driver] = connection.meta_data.connection.java_class.name
40           end
41           @jndi_connection = true
42         end
43
44         def configure_url
45           url = config[:url].to_s
46           if Hash === config[:options]
47             options = ''
48             config[:options].each do |k,v|
49               options << '&' unless options.empty?
50               options << "#{k}=#{v}"
51             end
52             url = url['?'] ? "#{url}&#{options}" : "#{url}?#{options}" unless options.empty?
53             config[:url] = url
54             config[:options] = nil
55           end
56           url
57         end
58
59         def configure_jdbc
60           unless config[:driver] && config[:url]
61             raise ::ActiveRecord::ConnectionNotEstablished, "jdbc adapter requires driver class and url"
62           end
63
64           driver = config[:driver].to_s
65           user   = config[:username].to_s
66           pass   = config[:password].to_s
67           url    = configure_url
68           # sonar
69           #jdbc_driver = (config[:driver_instance] ||= JdbcDriver.new(driver))
70           # /sonar
71           @connection_factory = JdbcConnectionFactory.impl do
72             # sonar
73             #jdbc_driver.connection(url, user, pass)
74             ::Java::OrgSonarServerUi::JRubyFacade.getInstance().getConnection()
75             # /sonar
76           end
77         end
78       end
79
80       attr_reader :adapter, :connection_factory
81
82       # @native_database_types - setup properly by adapter= versus set_native_database_types.
83       #   This contains type information for the adapter.  Individual adapters can make tweaks
84       #   by defined modify_types
85       #
86       # @native_types - This is the default type settings sans any modifications by the
87       # individual adapter.  My guess is that if we loaded two adapters of different types
88       # then this is used as a base to be tweaked by each adapter to create @native_database_types
89
90       def initialize(config)
91         self.config = config
92         configure_connection
93         connection # force the connection to load
94         set_native_database_types
95         @stmts = {}
96       rescue ::ActiveRecord::ActiveRecordError
97         raise
98       rescue Exception => e
99         raise ::ActiveRecord::JDBCError.new("The driver encountered an unknown error: #{e}").tap { |err|
100           err.errno = 0
101           err.sql_exception = e
102         }
103       end
104
105       def adapter=(adapter)
106         @adapter = adapter
107         @native_database_types = dup_native_types
108         @adapter.modify_types(@native_database_types)
109         @adapter.config.replace(config)
110       end
111
112       # Duplicate all native types into new hash structure so it can be modified
113       # without destroying original structure.
114       def dup_native_types
115         types = {}
116         @native_types.each_pair do |k, v|
117           types[k] = v.inject({}) do |memo, kv|
118             memo[kv.first] = begin kv.last.dup rescue kv.last end
119             memo
120           end
121         end
122         types
123       end
124       private :dup_native_types
125
126       def jndi_connection?
127         @jndi_connection
128       end
129
130       def active?
131         @connection
132       end
133
134       private
135       include ConfigHelper
136     end
137   end
138 end