activerecord-jdbc-adapter 0.6 → 0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +46 -27
- data/Manifest.txt +7 -4
- data/Rakefile +6 -5
- data/lib/active_record/connection_adapters/jdbc_adapter.rb +93 -108
- data/lib/jdbc_adapter/jdbc_adapter_internal.jar +0 -0
- data/lib/jdbc_adapter/jdbc_derby.rb +1 -0
- data/lib/jdbc_adapter/jdbc_hsqldb.rb +1 -1
- data/lib/jdbc_adapter/jdbc_mysql.rb +55 -13
- data/lib/jdbc_adapter/version.rb +1 -1
- data/src/java/jdbc_adapter/JdbcAdapterInternalService.java +1113 -0
- data/src/java/jdbc_adapter/JdbcConnectionFactory.java +36 -0
- data/src/java/{JDBCDerbySpec.java → jdbc_adapter/JdbcDerbySpec.java} +95 -91
- data/src/java/{JDBCMySQLSpec.java → jdbc_adapter/JdbcMySQLSpec.java} +24 -27
- data/src/java/jdbc_adapter/SQLBlock.java +18 -0
- data/test/has_many_through.rb +72 -0
- data/test/jdbc_common.rb +1 -0
- data/test/mysql_simple_test.rb +4 -0
- data/test/simple.rb +36 -1
- metadata +9 -6
- data/lib/jdbc_adapter_internal.jar +0 -0
- data/src/java/JdbcAdapterInternalService.java +0 -953
    
        data/History.txt
    CHANGED
    
    | @@ -1,61 +1,80 @@ | |
| 1 | 
            +
            == 0.7
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            - PLEASE NOTE: This release is not compatible with JRuby releases earlier than
         | 
| 4 | 
            +
              1.0.3 or 1.1b2. If you must use JRuby 1.0.2 or earlier, please install the
         | 
| 5 | 
            +
              0.6 release.
         | 
| 6 | 
            +
            - Release coincides with JRuby 1.0.3 and JRuby 1.1b2 releases
         | 
| 7 | 
            +
            - Simultaneous support for JRuby trunk and 1.0 branch
         | 
| 8 | 
            +
            - Get rid of log_no_bench method, so we time SQL execution again.
         | 
| 9 | 
            +
            - Implement #select_rows
         | 
| 10 | 
            +
            - MySQL migration and quoting updates
         | 
| 11 | 
            +
             | 
| 1 12 | 
             
            == 0.6
         | 
| 2 13 |  | 
| 3 | 
            -
            - Gem is renamed to "activerecord-jdbc-adapter" to follow new conventions | 
| 14 | 
            +
            - Gem is renamed to "activerecord-jdbc-adapter" to follow new conventions
         | 
| 15 | 
            +
              introduced in Rails 2.0 for third-party adapters. Rails 2.0 compatibility is
         | 
| 16 | 
            +
              introduced.
         | 
| 4 17 | 
             
            - Add dependency on ActiveRecord >= 1.14 (from the Rails 1.1.x release)
         | 
| 5 | 
            -
            - New drivers (jdbc-XXX) and adapter (activerecord-jdbcXXX-adapter) gems | 
| 6 | 
            -
             | 
| 18 | 
            +
            - New drivers (jdbc-XXX) and adapter (activerecord-jdbcXXX-adapter) gems
         | 
| 19 | 
            +
              available separately. See the README.txt file for details.
         | 
| 20 | 
            +
            - Plain "jdbc" driver is still available if you want to use the full
         | 
| 21 | 
            +
              driver/url way of specifying the driver.
         | 
| 7 22 | 
             
            - More bugfixes to Oracle and SQLServer courtesy of Ola & ThoughtWorks
         | 
| 8 23 |  | 
| 9 24 | 
             
            == 0.5
         | 
| 10 25 |  | 
| 11 26 | 
             
            - Release coincides with JRuby 1.0.1 release
         | 
| 12 | 
            -
            - It is no longer necessary to specify :driver and :url configuration | 
| 13 | 
            -
              postgresql, oracle, derby, hsqldb, and h2 | 
| 14 | 
            -
              valid and compatible, but for | 
| 15 | 
            -
               | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
              classpath.
         | 
| 27 | 
            +
            - It is no longer necessary to specify :driver and :url configuration
         | 
| 28 | 
            +
              parameters for the mysql, postgresql, oracle, derby, hsqldb, and h2
         | 
| 29 | 
            +
              adapters. The previous configuration is still valid and compatible, but for
         | 
| 30 | 
            +
              new applications, this makes it possible to use the exact same database.yml
         | 
| 31 | 
            +
              configuration as Rails applications running under native Ruby.
         | 
| 32 | 
            +
            - JDBC drivers can now be dynamically loaded by Ruby code, without being on
         | 
| 33 | 
            +
              the classpath prior to launching JRuby. Simply use "require
         | 
| 34 | 
            +
              'jdbc-driver.jar'" in JRuby code to add it to the runtime classpath.
         | 
| 19 35 | 
             
            - Updates to HSQL, MS SQLServer, Postgres, Oracle and Derby adapters
         | 
| 20 36 |  | 
| 21 37 | 
             
            == 0.4
         | 
| 22 38 |  | 
| 23 39 | 
             
            - Release coincides with JRuby 1.0 release
         | 
| 24 | 
            -
            - Shoring up PostgreSQL (courtesy Dudley Flanders) and HSQL (courtesy Matthew | 
| 40 | 
            +
            - Shoring up PostgreSQL (courtesy Dudley Flanders) and HSQL (courtesy Matthew
         | 
| 41 | 
            +
              Williams)
         | 
| 25 42 | 
             
            - Fix timestamps on Oracle to use DATE (as everything else)
         | 
| 26 | 
            -
            - Derby fixes: Fix for open result set issue, better structure dump, quoting, | 
| 43 | 
            +
            - Derby fixes: Fix for open result set issue, better structure dump, quoting,
         | 
| 44 | 
            +
              column type changing
         | 
| 27 45 | 
             
            - Sybase type recognition fix (courtesy Dean Mao)
         | 
| 28 46 |  | 
| 29 47 | 
             
            == 0.3.1
         | 
| 30 48 |  | 
| 31 | 
            -
             | 
| 49 | 
            +
            - Derby critical fixes shortly after 0.3
         | 
| 32 50 |  | 
| 33 51 | 
             
            == 0.3
         | 
| 34 52 |  | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 53 | 
            +
            - Release coincides with JRuby 1.0.0RC1 release
         | 
| 54 | 
            +
            - Improvements for Derby, Postgres, and Oracle, all of which are running 
         | 
| 37 55 | 
             
              > 95% of AR tests
         | 
| 38 56 |  | 
| 39 57 | 
             
            == 0.2.4
         | 
| 40 58 |  | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 59 | 
            +
            - Release coincides with JRuby 0.9.9 release
         | 
| 60 | 
            +
            - JRuby 0.9.9 is required
         | 
| 61 | 
            +
            - MySQL close to 100% working
         | 
| 62 | 
            +
            - Derby improvements
         | 
| 63 | 
            +
            - DECIMAL/NUMERIC/FLOAT/REAL bugs fixed with type recognition for Oracle,
         | 
| 64 | 
            +
              Postgres, etc.
         | 
| 65 | 
            +
            - HSQLDB has regressed this release and may not be functioning; we'll get it
         | 
| 66 | 
            +
              fixed for the next one
         | 
| 48 67 |  | 
| 49 68 | 
             
            == 0.2.3
         | 
| 50 69 |  | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 70 | 
            +
            - Release coincides (and compatible) with JRuby 0.9.8 release
         | 
| 71 | 
            +
            - 8 bugs fixed: see http://rubyurl.com/0Da
         | 
| 72 | 
            +
            - Improvements and compatibility fixes for Rails 1.2.x
         | 
| 54 73 |  | 
| 55 74 | 
             
            == 0.2.1, 0.2.2
         | 
| 56 75 |  | 
| 57 | 
            -
             | 
| 76 | 
            +
            - Early releases, added better support for multiple databases
         | 
| 58 77 |  | 
| 59 78 | 
             
            == 0.0.1
         | 
| 60 79 |  | 
| 61 | 
            -
             | 
| 80 | 
            +
            - Initial, very alpha release
         | 
    
        data/Manifest.txt
    CHANGED
    
    | @@ -24,7 +24,7 @@ lib/jdbc_adapter/jdbc_postgre.rb | |
| 24 24 | 
             
            lib/jdbc_adapter/missing_functionality_helper.rb
         | 
| 25 25 | 
             
            lib/jdbc_adapter/version.rb
         | 
| 26 26 | 
             
            lib/jdbc_adapter.rb
         | 
| 27 | 
            -
            lib/jdbc_adapter_internal.jar
         | 
| 27 | 
            +
            lib/jdbc_adapter/jdbc_adapter_internal.jar
         | 
| 28 28 | 
             
            test/activerecord/connection_adapters/type_conversion_test.rb
         | 
| 29 29 | 
             
            test/activerecord/connections/native_jdbc_mysql/connection.rb
         | 
| 30 30 | 
             
            test/db/derby.rb
         | 
| @@ -39,6 +39,7 @@ test/derby_multibyte_test.rb | |
| 39 39 | 
             
            test/derby_simple_test.rb
         | 
| 40 40 | 
             
            test/generic_jdbc_connection_test.rb
         | 
| 41 41 | 
             
            test/h2_simple_test.rb
         | 
| 42 | 
            +
            test/has_many_through.rb
         | 
| 42 43 | 
             
            test/hsqldb_simple_test.rb
         | 
| 43 44 | 
             
            test/jdbc_adapter/jdbc_db2_test.rb
         | 
| 44 45 | 
             
            test/jdbc_common.rb
         | 
| @@ -59,6 +60,8 @@ test/mysql_simple_test.rb | |
| 59 60 | 
             
            test/postgres_simple_test.rb
         | 
| 60 61 | 
             
            test/simple.rb
         | 
| 61 62 | 
             
            lib/tasks/jdbc_databases.rake
         | 
| 62 | 
            -
            src/java/JdbcAdapterInternalService.java
         | 
| 63 | 
            -
            src/java/ | 
| 64 | 
            -
            src/java/ | 
| 63 | 
            +
            src/java/jdbc_adapter/JdbcAdapterInternalService.java
         | 
| 64 | 
            +
            src/java/jdbc_adapter/JdbcConnectionFactory.java
         | 
| 65 | 
            +
            src/java/jdbc_adapter/JdbcDerbySpec.java
         | 
| 66 | 
            +
            src/java/jdbc_adapter/JdbcMySQLSpec.java
         | 
| 67 | 
            +
            src/java/jdbc_adapter/SQLBlock.java
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -13,22 +13,23 @@ def java_classpath_arg # myriad of ways to discover JRuby classpath | |
| 13 13 | 
             
                jruby_cpath = ENV['JRUBY_PARENT_CLASSPATH'] || ENV['JRUBY_HOME'] &&
         | 
| 14 14 | 
             
                  FileList["#{ENV['JRUBY_HOME']}/lib/*.jar"].join(File::PATH_SEPARATOR)
         | 
| 15 15 | 
             
              end
         | 
| 16 | 
            -
               | 
| 16 | 
            +
              jruby_cpath ? "-cp #{jruby_cpath}" : ""
         | 
| 17 17 | 
             
            end
         | 
| 18 18 |  | 
| 19 19 | 
             
            desc "Compile the native Java code."
         | 
| 20 20 | 
             
            task :java_compile do
         | 
| 21 21 | 
             
              mkdir_p "pkg/classes"
         | 
| 22 22 | 
             
              sh "javac -target 1.4 -source 1.4 -d pkg/classes #{java_classpath_arg} #{FileList['src/java/**/*.java'].join(' ')}"
         | 
| 23 | 
            -
              sh "jar cf lib/jdbc_adapter_internal.jar -C pkg/classes/ ."
         | 
| 23 | 
            +
              sh "jar cf lib/jdbc_adapter/jdbc_adapter_internal.jar -C pkg/classes/ ."
         | 
| 24 24 | 
             
            end
         | 
| 25 | 
            -
            file "lib/jdbc_adapter_internal.jar" => :java_compile
         | 
| 25 | 
            +
            file "lib/jdbc_adapter/jdbc_adapter_internal.jar" => :java_compile
         | 
| 26 26 |  | 
| 27 27 | 
             
            task :more_clean do
         | 
| 28 28 | 
             
              rm_rf FileList['derby*']
         | 
| 29 29 | 
             
              rm_rf FileList['test.db.*']
         | 
| 30 30 | 
             
              rm_rf "test/reports"
         | 
| 31 | 
            -
              rm_f FileList['lib | 
| 31 | 
            +
              rm_f FileList['lib/**/*.jar']
         | 
| 32 | 
            +
              rm_f "manifest.mf"
         | 
| 32 33 | 
             
            end
         | 
| 33 34 |  | 
| 34 35 | 
             
            task :clean => :more_clean
         | 
| @@ -72,7 +73,7 @@ task :test_postgresql => [:test_postgres] | |
| 72 73 | 
             
            task :test_pgsql => [:test_postgres]
         | 
| 73 74 |  | 
| 74 75 | 
             
            MANIFEST = FileList["History.txt", "Manifest.txt", "README.txt", 
         | 
| 75 | 
            -
              "Rakefile", "LICENSE", "lib/**/*.rb", "lib/jdbc_adapter_internal.jar", "test/**/*.rb",
         | 
| 76 | 
            +
              "Rakefile", "LICENSE", "lib/**/*.rb", "lib/jdbc_adapter/jdbc_adapter_internal.jar", "test/**/*.rb",
         | 
| 76 77 | 
             
               "lib/**/*.rake", "src/**/*.java"]
         | 
| 77 78 |  | 
| 78 79 | 
             
            file "Manifest.txt" => :manifest
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            require 'active_record/connection_adapters/abstract_adapter'
         | 
| 2 2 | 
             
            require 'java'
         | 
| 3 3 | 
             
            require 'active_record/connection_adapters/jdbc_adapter_spec'
         | 
| 4 | 
            -
            require 'jdbc_adapter_internal'
         | 
| 4 | 
            +
            require 'jdbc_adapter/jdbc_adapter_internal'
         | 
| 5 5 | 
             
            require 'bigdecimal'
         | 
| 6 6 |  | 
| 7 7 | 
             
            module ActiveRecord
         | 
| @@ -10,7 +10,7 @@ module ActiveRecord | |
| 10 10 | 
             
                  # The original implementation of this had a bug, which modifies native_database_types.
         | 
| 11 11 | 
             
                  # This version allows us to cache that value.
         | 
| 12 12 | 
             
                  def type_to_sql(type, limit = nil, precision = nil, scale = nil) #:nodoc:
         | 
| 13 | 
            -
                    native = native_database_types[type]
         | 
| 13 | 
            +
                    native = native_database_types[type.to_s.downcase.to_sym]
         | 
| 14 14 | 
             
                    column_type_sql = native.is_a?(Hash) ? native[:name] : native
         | 
| 15 15 | 
             
                    if type == :decimal # ignore limit, use precison and scale
         | 
| 16 16 | 
             
                      precision ||= native[:precision]
         | 
| @@ -56,10 +56,10 @@ module ActiveRecord | |
| 56 56 | 
             
                extend JdbcSpec::ActiveRecordExtensions
         | 
| 57 57 |  | 
| 58 58 | 
             
                alias :attributes_with_quotes_pre_oracle :attributes_with_quotes
         | 
| 59 | 
            -
                def attributes_with_quotes( | 
| 60 | 
            -
                  aq = attributes_with_quotes_pre_oracle( | 
| 59 | 
            +
                def attributes_with_quotes(*args) #:nodoc:
         | 
| 60 | 
            +
                  aq = attributes_with_quotes_pre_oracle(*args)
         | 
| 61 61 | 
             
                  if connection.class == ConnectionAdapters::JdbcAdapter && (connection.is_a?(JdbcSpec::Oracle) || connection.is_a?(JdbcSpec::Mimer))
         | 
| 62 | 
            -
                    aq[self.class.primary_key] = "?" if  | 
| 62 | 
            +
                    aq[self.class.primary_key] = "?" if args.first && aq[self.class.primary_key].nil?
         | 
| 63 63 | 
             
                  end
         | 
| 64 64 | 
             
                  aq
         | 
| 65 65 | 
             
                end
         | 
| @@ -171,7 +171,14 @@ module ActiveRecord | |
| 171 171 |  | 
| 172 172 | 
             
                  def choose_best_types
         | 
| 173 173 | 
             
                    type_map = {}
         | 
| 174 | 
            -
                     | 
| 174 | 
            +
                    @types.each do |row|
         | 
| 175 | 
            +
                      name = row['type_name'].downcase
         | 
| 176 | 
            +
                      k = name.to_sym
         | 
| 177 | 
            +
                      type_map[k] = { :name => name }
         | 
| 178 | 
            +
                      type_map[k][:limit] = row['precision'].to_i if row['precision']
         | 
| 179 | 
            +
                    end
         | 
| 180 | 
            +
             | 
| 181 | 
            +
                    AR_TO_JDBC_TYPES.keys.each do |k|
         | 
| 175 182 | 
             
                      typerow = choose_type(k)
         | 
| 176 183 | 
             
                      type_map[k] = { :name => typerow['type_name'].downcase }
         | 
| 177 184 | 
             
                      case k
         | 
| @@ -203,19 +210,19 @@ module ActiveRecord | |
| 203 210 |  | 
| 204 211 | 
             
                  def driver_class
         | 
| 205 212 | 
             
                    @driver_class ||= begin
         | 
| 206 | 
            -
             | 
| 207 | 
            -
             | 
| 208 | 
            -
             | 
| 209 | 
            -
             | 
| 210 | 
            -
             | 
| 211 | 
            -
             | 
| 212 | 
            -
             | 
| 213 | 
            -
             | 
| 214 | 
            -
             | 
| 215 | 
            -
             | 
| 216 | 
            -
             | 
| 217 | 
            -
             | 
| 218 | 
            -
             | 
| 213 | 
            +
                      driver_class_const = (@name[0...1].capitalize + @name[1..@name.length]).gsub(/\./, '_')
         | 
| 214 | 
            +
                      Jdbc::Mutex.synchronized do
         | 
| 215 | 
            +
                        unless Jdbc.const_defined?(driver_class_const)
         | 
| 216 | 
            +
                          driver_class_name = @name
         | 
| 217 | 
            +
                          Jdbc.module_eval do
         | 
| 218 | 
            +
                            include_class(driver_class_name) { driver_class_const }
         | 
| 219 | 
            +
                          end
         | 
| 220 | 
            +
                        end
         | 
| 221 | 
            +
                      end
         | 
| 222 | 
            +
                      driver_class = Jdbc.const_get(driver_class_const)
         | 
| 223 | 
            +
                      raise "You specify a driver for your JDBC connection" unless driver_class
         | 
| 224 | 
            +
                      driver_class
         | 
| 225 | 
            +
                    end
         | 
| 219 226 | 
             
                  end
         | 
| 220 227 |  | 
| 221 228 | 
             
                  def load
         | 
| @@ -265,11 +272,15 @@ module ActiveRecord | |
| 265 272 | 
             
                  end
         | 
| 266 273 | 
             
                end
         | 
| 267 274 |  | 
| 275 | 
            +
                include_class "jdbc_adapter.JdbcConnectionFactory"
         | 
| 276 | 
            +
             | 
| 268 277 | 
             
                class JdbcConnection
         | 
| 269 | 
            -
                  attr_reader :adapter, : | 
| 278 | 
            +
                  attr_reader :adapter, :connection_factory
         | 
| 270 279 |  | 
| 271 280 | 
             
                  def initialize(config)
         | 
| 272 281 | 
             
                    @config = config.symbolize_keys!
         | 
| 282 | 
            +
                    @config[:retry_count] ||= 5
         | 
| 283 | 
            +
                    @config[:connection_alive_sql] ||= "select 1"
         | 
| 273 284 | 
             
                    if @config[:jndi]
         | 
| 274 285 | 
             
                      begin
         | 
| 275 286 | 
             
                        configure_jndi
         | 
| @@ -280,16 +291,13 @@ module ActiveRecord | |
| 280 291 | 
             
                    else
         | 
| 281 292 | 
             
                      configure_jdbc
         | 
| 282 293 | 
             
                    end
         | 
| 294 | 
            +
                    connection # force the connection to load
         | 
| 283 295 | 
             
                    set_native_database_types
         | 
| 284 296 | 
             
                    @stmts = {}
         | 
| 285 297 | 
             
                  rescue Exception => e
         | 
| 286 298 | 
             
                    raise "The driver encountered an error: #{e}"
         | 
| 287 299 | 
             
                  end
         | 
| 288 300 |  | 
| 289 | 
            -
                  def reconnect!
         | 
| 290 | 
            -
                    self.adapter.reconnect!
         | 
| 291 | 
            -
                  end
         | 
| 292 | 
            -
             | 
| 293 301 | 
             
                  def adapter=(adapt)
         | 
| 294 302 | 
             
                    @adapter = adapt
         | 
| 295 303 | 
             
                    @tps = {}
         | 
| @@ -305,71 +313,60 @@ module ActiveRecord | |
| 305 313 | 
             
                  # one index, one row per column in the index), so a simple block-based
         | 
| 306 314 | 
             
                  # filter like that used for tables doesn't really work here.  Callers
         | 
| 307 315 | 
             
                  # should filter the return from this method instead.
         | 
| 308 | 
            -
                  #
         | 
| 309 | 
            -
                  # TODO: fix to use reconnect correctly
         | 
| 310 316 | 
             
                  def indexes(table_name, name = nil, schema_name = nil)
         | 
| 311 | 
            -
                     | 
| 312 | 
            -
             | 
| 313 | 
            -
                       | 
| 314 | 
            -
             | 
| 315 | 
            -
             | 
| 316 | 
            -
             | 
| 317 | 
            -
             | 
| 318 | 
            -
             | 
| 319 | 
            -
             | 
| 320 | 
            -
             | 
| 321 | 
            -
             | 
| 322 | 
            -
             | 
| 323 | 
            -
             | 
| 324 | 
            -
             | 
| 325 | 
            -
             | 
| 326 | 
            -
             | 
| 327 | 
            -
             | 
| 328 | 
            -
             | 
| 329 | 
            -
             | 
| 330 | 
            -
             | 
| 331 | 
            -
             | 
| 332 | 
            -
             | 
| 333 | 
            -
             | 
| 334 | 
            -
             | 
| 335 | 
            -
             | 
| 336 | 
            -
             | 
| 337 | 
            -
             | 
| 338 | 
            -
             | 
| 317 | 
            +
                    with_connection_retry_guard do |conn|
         | 
| 318 | 
            +
                      metadata = conn.getMetaData
         | 
| 319 | 
            +
                      begin
         | 
| 320 | 
            +
                        unless String === table_name
         | 
| 321 | 
            +
                          table_name = table_name.to_s
         | 
| 322 | 
            +
                        else
         | 
| 323 | 
            +
                          table_name = table_name.dup
         | 
| 324 | 
            +
                        end
         | 
| 325 | 
            +
                        table_name.upcase! if metadata.storesUpperCaseIdentifiers
         | 
| 326 | 
            +
                        table_name.downcase! if metadata.storesLowerCaseIdentifiers
         | 
| 327 | 
            +
                        resultset = metadata.getIndexInfo(nil, schema_name, table_name, false, false)
         | 
| 328 | 
            +
                        primary_keys = primary_keys(table_name)
         | 
| 329 | 
            +
                        indexes = []
         | 
| 330 | 
            +
                        current_index = nil
         | 
| 331 | 
            +
                        while resultset.next
         | 
| 332 | 
            +
                          index_name = resultset.get_string(Jdbc::IndexMetaData::INDEX_NAME)
         | 
| 333 | 
            +
                          next unless index_name
         | 
| 334 | 
            +
                          index_name.downcase!
         | 
| 335 | 
            +
                          column_name = resultset.get_string(Jdbc::IndexMetaData::COLUMN_NAME).downcase
         | 
| 336 | 
            +
                          
         | 
| 337 | 
            +
                          next if primary_keys.include? column_name
         | 
| 338 | 
            +
                          
         | 
| 339 | 
            +
                          # We are working on a new index
         | 
| 340 | 
            +
                          if current_index != index_name
         | 
| 341 | 
            +
                            current_index = index_name
         | 
| 342 | 
            +
                            table_name = resultset.get_string(Jdbc::IndexMetaData::TABLE_NAME).downcase
         | 
| 343 | 
            +
                            non_unique = resultset.get_boolean(Jdbc::IndexMetaData::NON_UNIQUE)
         | 
| 344 | 
            +
                            
         | 
| 345 | 
            +
                            # empty list for column names, we'll add to that in just a bit
         | 
| 346 | 
            +
                            indexes << IndexDefinition.new(table_name, index_name, !non_unique, [])
         | 
| 347 | 
            +
                          end
         | 
| 348 | 
            +
                          
         | 
| 349 | 
            +
                          # One or more columns can be associated with an index
         | 
| 350 | 
            +
                          indexes.last.columns << column_name
         | 
| 351 | 
            +
                        end
         | 
| 352 | 
            +
                        resultset.close
         | 
| 353 | 
            +
                        indexes
         | 
| 354 | 
            +
                      ensure
         | 
| 355 | 
            +
                        metadata.close rescue nil
         | 
| 339 356 | 
             
                      end
         | 
| 340 | 
            -
             | 
| 341 | 
            -
                      # One or more columns can be associated with an index
         | 
| 342 | 
            -
                      indexes.last.columns << column_name
         | 
| 343 357 | 
             
                    end
         | 
| 344 | 
            -
                    resultset.close
         | 
| 345 | 
            -
                    indexes
         | 
| 346 | 
            -
                  rescue
         | 
| 347 | 
            -
                    if @connection.is_closed
         | 
| 348 | 
            -
                      reconnect!
         | 
| 349 | 
            -
                      retry
         | 
| 350 | 
            -
                    else
         | 
| 351 | 
            -
                      raise
         | 
| 352 | 
            -
                    end
         | 
| 353 | 
            -
                  ensure
         | 
| 354 | 
            -
                    metadata.close rescue nil
         | 
| 355 358 | 
             
                  end
         | 
| 356 359 |  | 
| 357 | 
            -
            #      def self.insert?(sql)
         | 
| 358 | 
            -
            #        /\A\s*insert/i =~ sql
         | 
| 359 | 
            -
            #      end
         | 
| 360 | 
            -
                  
         | 
| 361 | 
            -
            #      def self.select?(sql)
         | 
| 362 | 
            -
            #        /\A\s*\(?\s*(select|show)/i =~ sql
         | 
| 363 | 
            -
            #      end
         | 
| 364 | 
            -
             | 
| 365 360 | 
             
                  private
         | 
| 366 361 | 
             
                  def configure_jndi
         | 
| 367 362 | 
             
                    jndi = @config[:jndi].to_s
         | 
| 368 363 | 
             
                    ctx = javax.naming.InitialContext.new
         | 
| 369 364 | 
             
                    ds = ctx.lookup(jndi)
         | 
| 370 | 
            -
                     | 
| 365 | 
            +
                    @connection_factory = JdbcConnectionFactory.impl do
         | 
| 366 | 
            +
                      ds.connection
         | 
| 367 | 
            +
                    end
         | 
| 371 368 | 
             
                    unless @config[:driver]
         | 
| 372 | 
            -
                      @config[:driver] =  | 
| 369 | 
            +
                      @config[:driver] = connection.meta_data.connection.java_class.name
         | 
| 373 370 | 
             
                    end
         | 
| 374 371 | 
             
                  end
         | 
| 375 372 |  | 
| @@ -380,19 +377,20 @@ module ActiveRecord | |
| 380 377 | 
             
                    url    = @config[:url].to_s
         | 
| 381 378 |  | 
| 382 379 | 
             
                    unless driver && url
         | 
| 383 | 
            -
                      raise  | 
| 380 | 
            +
                      raise ::ActiveRecord::ConnectionFailed, "jdbc adapter requires driver class and url"
         | 
| 384 381 | 
             
                    end
         | 
| 385 382 |  | 
| 386 | 
            -
                    if driver =~ /mysql/i
         | 
| 383 | 
            +
                    if driver =~ /mysql/i && url !~ /#{Regexp.quote(JdbcSpec::MySQL::URL_OPTIONS)}/
         | 
| 387 384 | 
             
                      div = url =~ /\?/ ? '&' : '?'
         | 
| 388 | 
            -
                      url = "#{url}#{div} | 
| 385 | 
            +
                      url = "#{url}#{div}#{JdbcSpec::MySQL::URL_OPTIONS}"
         | 
| 389 386 | 
             
                      @config[:url] = url
         | 
| 390 387 | 
             
                    end
         | 
| 391 388 |  | 
| 392 389 | 
             
                    jdbc_driver = JdbcDriver.new(driver)
         | 
| 393 390 | 
             
                    jdbc_driver.load
         | 
| 394 | 
            -
                     | 
| 395 | 
            -
             | 
| 391 | 
            +
                    @connection_factory = JdbcConnectionFactory.impl do
         | 
| 392 | 
            +
                      jdbc_driver.connection(url, user, pass)
         | 
| 393 | 
            +
                    end
         | 
| 396 394 | 
             
                  end
         | 
| 397 395 |  | 
| 398 396 | 
             
                end
         | 
| @@ -474,22 +472,30 @@ module ActiveRecord | |
| 474 472 | 
             
                  end
         | 
| 475 473 |  | 
| 476 474 | 
             
                  def reconnect!
         | 
| 477 | 
            -
                    @connection. | 
| 478 | 
            -
                    @connection = JdbcConnection.new(@config)
         | 
| 479 | 
            -
                    @connection.adapter = self
         | 
| 475 | 
            +
                    @connection.reconnect!
         | 
| 480 476 | 
             
                    @connection
         | 
| 481 477 | 
             
                  end
         | 
| 478 | 
            +
                  
         | 
| 479 | 
            +
                  def disconnect!
         | 
| 480 | 
            +
                    @connection.disconnect!
         | 
| 481 | 
            +
                  end
         | 
| 482 482 |  | 
| 483 483 | 
             
                  def select_all(sql, name = nil)
         | 
| 484 484 | 
             
                    select(sql, name)
         | 
| 485 485 | 
             
                  end
         | 
| 486 486 |  | 
| 487 | 
            +
                  def select_rows(sql, name = nil)
         | 
| 488 | 
            +
                    rows = []
         | 
| 489 | 
            +
                    select(sql, name).each {|row| rows << row.values }
         | 
| 490 | 
            +
                    rows
         | 
| 491 | 
            +
                  end
         | 
| 492 | 
            +
             | 
| 487 493 | 
             
                  def select_one(sql, name = nil)
         | 
| 488 494 | 
             
                    select(sql, name).first
         | 
| 489 495 | 
             
                  end
         | 
| 490 496 |  | 
| 491 497 | 
             
                  def execute(sql, name = nil)
         | 
| 492 | 
            -
                     | 
| 498 | 
            +
                    log(sql, name) do
         | 
| 493 499 | 
             
                      _execute(sql,name)
         | 
| 494 500 | 
             
                    end
         | 
| 495 501 | 
             
                  end
         | 
| @@ -549,27 +555,6 @@ module ActiveRecord | |
| 549 555 | 
             
                  def select(sql, name=nil)
         | 
| 550 556 | 
             
                    execute(sql,name)
         | 
| 551 557 | 
             
                  end
         | 
| 552 | 
            -
             | 
| 553 | 
            -
                  def log_no_bench(sql, name)
         | 
| 554 | 
            -
                    if block_given?
         | 
| 555 | 
            -
                      if @logger and @logger.level <= Logger::INFO
         | 
| 556 | 
            -
                        result = yield
         | 
| 557 | 
            -
                        log_info(sql, name, 0)
         | 
| 558 | 
            -
                        result
         | 
| 559 | 
            -
                      else
         | 
| 560 | 
            -
                        yield
         | 
| 561 | 
            -
                      end
         | 
| 562 | 
            -
                    else
         | 
| 563 | 
            -
                      log_info(sql, name, 0)
         | 
| 564 | 
            -
                      nil
         | 
| 565 | 
            -
                    end
         | 
| 566 | 
            -
                  rescue Exception => e
         | 
| 567 | 
            -
                    # Log message and raise exception.
         | 
| 568 | 
            -
                    message = "#{e.class.name}: #{e.message}: #{sql}"
         | 
| 569 | 
            -
             | 
| 570 | 
            -
                    log_info(message, name, 0)
         | 
| 571 | 
            -
                    raise ActiveRecord::StatementInvalid, message
         | 
| 572 | 
            -
                  end
         | 
| 573 558 | 
             
                end
         | 
| 574 559 | 
             
              end
         | 
| 575 560 | 
             
            end
         |