Title: [794] trunk/activerecord-jdbc: Moving reconnection logic around, introduce connection factory
Revision
794
Author
nicksieger
Date
2007-11-08 16:07:55 -0500 (Thu, 08 Nov 2007)

Log Message

Moving reconnection logic around, introduce connection factory

Modified Paths


Diff

Modified: trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter.rb (793 => 794)


--- trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter.rb	2007-11-08 17:33:22 UTC (rev 793)
+++ trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter.rb	2007-11-08 21:07:55 UTC (rev 794)
@@ -265,8 +265,10 @@
       end
     end
 
+    include_class "jdbc_adapter.JdbcConnectionFactory"
+
     class JdbcConnection
-      attr_reader :adapter, :connection
+      attr_reader :adapter, :connection_factory
 
       def initialize(config)
         @config = config.symbolize_keys!
@@ -280,14 +282,24 @@
         else
           configure_jdbc
         end
+        connection # force the connection to load
         set_native_database_types
         @stmts = {}
       rescue Exception => e
         raise "The driver encountered an error: #{e}"
       end
 
+      def connection
+        unless @connection
+          self.connection = connection_factory.newConnection
+        end
+        @connection
+      end
+      
       def reconnect!
-        self.adapter.reconnect!
+        @connection.close rescue nil
+        @connection = nil
+        connection
       end
 
       def adapter=(adapt)
@@ -308,7 +320,7 @@
       #
       # TODO: fix to use reconnect correctly
       def indexes(table_name, name = nil, schema_name = nil)
-        metadata = @connection.getMetaData
+        metadata = connection.getMetaData
         unless String === table_name
           table_name = table_name.to_s
         else
@@ -344,7 +356,7 @@
         resultset.close
         indexes
       rescue
-        if @connection.is_closed
+        if connection.is_closed
           reconnect!
           retry
         else
@@ -359,9 +371,11 @@
         jndi = @config[:jndi].to_s
         ctx = javax.naming.InitialContext.new
         ds = ctx.lookup(jndi)
-        set_connection ds.connection
+        @connection_factory = JdbcConnectionFactory.impl do
+          ds.connection
+        end
         unless @config[:driver]
-          @config[:driver] = @connection.meta_data.connection.java_class.name
+          @config[:driver] = connection.meta_data.connection.java_class.name
         end
       end
 
@@ -375,16 +389,17 @@
           raise ArgumentError, "jdbc adapter requires driver class and url"
         end
 
-        if driver =~ /mysql/i
+        if driver =~ /mysql/i && url !~ /#{Regexp.quote(JdbcSpec::MySQL::URL_OPTIONS)}/
           div = url =~ /\?/ ? '&' : '?'
-          url = ""
+          url = ""
           @config[:url] = url
         end
 
         jdbc_driver = JdbcDriver.new(driver)
         jdbc_driver.load
-        connection = jdbc_driver.connection(url, user, pass)
-        set_connection connection
+        @connection_factory = JdbcConnectionFactory.impl do
+          jdbc_driver.connection(url, user, pass)
+        end
       end
 
     end
@@ -466,9 +481,7 @@
       end
 
       def reconnect!
-        @connection.close rescue nil
-        @connection = JdbcConnection.new(@config)
-        @connection.adapter = self
+        @connection.reconnect!
         @connection
       end
 

Modified: trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_mysql.rb (793 => 794)


--- trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_mysql.rb	2007-11-08 17:33:22 UTC (rev 793)
+++ trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_mysql.rb	2007-11-08 21:07:55 UTC (rev 794)
@@ -7,13 +7,14 @@
         warn "AR-JDBC MySQL on JRuby does not support sockets"
       end
       config[:port] ||= 3306
-      config[:url] ||= "jdbc:mysql://#{config[:host]}:#{config[:port]}/#{config[:database]}?zeroDateTimeBehavior=convertToNull&jdbcCompliantTruncation=false&useUnicode=true&characterEncoding=utf8"
+      config[:url] ||= "jdbc:mysql://#{config[:host]}:#{config[:port]}/#{config[:database]}?#{MySQL::URL_OPTIONS}"
       config[:driver] = "com.mysql.jdbc.Driver"
       jdbc_connection(config)
     end
   end
 
   module MySQL
+    URL_OPTIONS = "zeroDateTimeBehavior=convertToNull&jdbcCompliantTruncation=false&useUnicode=true&characterEncoding=utf8"
     def self.column_selector
       [/mysql/i, lambda {|cfg,col| col.extend(::JdbcSpec::MySQL::Column)}]
     end

Modified: trunk/activerecord-jdbc/src/java/jdbc_adapter/JdbcAdapterInternalService.java (793 => 794)


--- trunk/activerecord-jdbc/src/java/jdbc_adapter/JdbcAdapterInternalService.java	2007-11-08 17:33:22 UTC (rev 793)
+++ trunk/activerecord-jdbc/src/java/jdbc_adapter/JdbcAdapterInternalService.java	2007-11-08 21:07:55 UTC (rev 794)
@@ -74,7 +74,7 @@
 
         CallbackFactory cf = runtime.callbackFactory(JdbcAdapterInternalService.class);
         cJdbcConn.defineMethod("unmarshal_result",cf.getSingletonMethod("unmarshal_result", IRubyObject.class));
-        cJdbcConn.defineFastMethod("set_connection",cf.getFastSingletonMethod("set_connection", IRubyObject.class));
+        cJdbcConn.defineFastMethod("connection=",cf.getFastSingletonMethod("set_connection", IRubyObject.class));
         cJdbcConn.defineFastMethod("execute_update",cf.getFastSingletonMethod("execute_update", IRubyObject.class));
         cJdbcConn.defineFastMethod("execute_query",cf.getFastOptSingletonMethod("execute_query")); 
         cJdbcConn.defineFastMethod("execute_insert",cf.getFastSingletonMethod("execute_insert", IRubyObject.class));
@@ -398,7 +398,6 @@
     }
 
     private static final java.util.regex.Pattern HAS_SMALL = java.util.regex.Pattern.compile("[a-z]");
-    private static final java.util.regex.Pattern HAS_LARGE = java.util.regex.Pattern.compile("[A-Z]");
     private static IRubyObject unmarshal_columns(IRubyObject recv, DatabaseMetaData metadata, ResultSet rs) throws SQLException, IOException {
         try {
             List columns = new ArrayList();
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to