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();