Modified: trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter.rb (737 => 738)
--- trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter.rb 2007-09-11 05:52:52 UTC (rev 737)
+++ trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter.rb 2007-09-11 06:02:59 UTC (rev 738)
@@ -97,7 +97,7 @@
module PrimaryKeyMetaData
COLUMN_NAME = 4
end
-
+
end
# I want to use JDBC's DatabaseMetaData#getTypeInfo to choose the best native types to
@@ -119,7 +119,7 @@
lambda {|r| r['type_name'] =~ /^varchar$/i},
lambda {|r| r['type_name'] =~ /varying/i}],
:text => [ lambda {|r| [Jdbc::Types::LONGVARCHAR, Jdbc::Types::CLOB].include?(r['data_type'].to_i)},
- lambda {|r| r['type_name'] =~ /^(text|clob)/i},
+ lambda {|r| r['type_name'] =~ /^(text|clob)$/i},
lambda {|r| r['type_name'] =~ /^character large object$/i},
lambda {|r| r['sql_data_type'] == 2005}],
:integer => [ lambda {|r| Jdbc::Types::INTEGER == r['data_type'].to_i},
@@ -174,8 +174,12 @@
AR_TO_JDBC_TYPES.each_key do |k|
typerow = choose_type(k)
type_map[k] = { :name => typerow['type_name'].downcase }
- type_map[k][:limit] = typerow['precision'] && typerow['precision'].to_i if [:integer, :string, :decimal].include?(k)
- type_map[k][:limit] = 1 if k == :boolean
+ case k
+ when :integer, :string, :decimal
+ type_map[k][:limit] = typerow['precision'] && typerow['precision'].to_i
+ when :boolean
+ type_map[k][:limit] = 1
+ end
end
type_map
end
@@ -196,7 +200,7 @@
def initialize(name)
@name = name
end
-
+
def driver_class
@driver_class ||= begin
driver_class_const = (@name[0...1].capitalize + @[EMAIL PROTECTED]).gsub(/\./, '_')
@@ -211,11 +215,11 @@
Jdbc.const_get(driver_class_const)
end
end
-
+
def load
Jdbc::DriverManager.registerDriver(create)
end
-
+
def connection(url, user, pass)
Jdbc::DriverManager.getConnection(url, user, pass)
rescue
@@ -233,13 +237,13 @@
class JdbcColumn < Column
attr_writer :limit, :precision
-
- COLUMN_TYPES = ::JdbcSpec.constants.map{|c|
- ::JdbcSpec.const_get c }.select{ |c|
- c.respond_to? :column_selector }.map{|c|
- c.column_selector }.inject({}) { |h,val|
+
+ COLUMN_TYPES = ::JdbcSpec.constants.map{|c|
+ ::JdbcSpec.const_get c }.select{ |c|
+ c.respond_to? :column_selector }.map{|c|
+ c.column_selector }.inject({}) { |h,val|
h[val[0]] = val[1]; h }
-
+
def initialize(config, name, default, *args)
ds = config[:driver].to_s
for reg, func in COLUMN_TYPES
@@ -261,7 +265,7 @@
class JdbcConnection
attr_reader :adapter, :connection
-
+
def initialize(config)
@config = config.symbolize_keys!
if @config[:jndi]
@@ -278,14 +282,14 @@
def reconnect!
self.adapter.reconnect!
end
-
+
def adapter=(adapt)
@adapter = adapt
@tps = {}
@native_types.each_pair {|k,v| @tps[k] = v.inject({}) {|memo,kv| memo.merge({kv.first => (kv.last.dup rescue kv.last)})}}
adapt.modify_types(@tps)
end
-
+
# Default JDBC introspection for index metadata on the JdbcConnection.
# This is currently used for migrations by JdbcSpec::HSQDLB and JdbcSpec::Derby
# indexes with a little filtering tacked on.
@@ -299,7 +303,7 @@
def indexes(table_name, name = nil, schema_name = nil)
metadata = @connection.getMetaData
unless String === table_name
- table_name = table_name.to_s
+ table_name = table_name.to_s
else
table_name = table_name.dup
end
@@ -314,9 +318,9 @@
next unless index_name
index_name.downcase!
column_name = resultset.get_string(Jdbc::IndexMetaData::COLUMN_NAME).downcase
-
+
next if primary_keys.include? column_name
-
+
# We are working on a new index
if current_index != index_name
current_index = index_name
@@ -326,7 +330,7 @@
# empty list for column names, we'll add to that in just a bit
indexes << IndexDefinition.new(table_name, index_name, !non_unique, [])
end
-
+
# One or more columns can be associated with an index
indexes.last.columns << column_name
end
@@ -363,7 +367,7 @@
unless driver && url
raise ArgumentError, "jdbc adapter requires driver class and url"
end
-
+
if driver =~ /mysql/i
div = url =~ /\?/ ? '&' : '?'
url = ""
@@ -381,10 +385,10 @@
class JdbcAdapter < AbstractAdapter
attr_reader :config
- ADAPTER_TYPES = ::JdbcSpec.constants.map{|c|
+ ADAPTER_TYPES = ::JdbcSpec.constants.map{|c|
::JdbcSpec.const_get c }.select{ |c|
- c.respond_to? :adapter_selector }.map{|c|
- c.adapter_selector }.inject({}) { |h,val|
+ c.respond_to? :adapter_selector }.map{|c|
+ c.adapter_selector }.inject({}) { |h,val|
h[val[0]] = val[1]; h }
def initialize(connection, logger, config)
@@ -418,7 +422,7 @@
def database_name #:nodoc:
@connection.database_name
end
-
+
def native_sql_to_type(tp)
if /^(.*?)\(([0-9]+)\)/ =~ tp
tname = $1
@@ -521,7 +525,7 @@
def rollback_db_transaction
@connection.rollback
end
-
+
def write_large_object(*args)
@connection.write_large_object(*args)
end
Modified: trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_postgre.rb (737 => 738)
--- trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_postgre.rb 2007-09-11 05:52:52 UTC (rev 737)
+++ trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_postgre.rb 2007-09-11 06:02:59 UTC (rev 738)
@@ -165,7 +165,13 @@
end
def columns(table_name, name=nil)
- @connection.columns_internal(table_name, name, "public")
+ schema_name = "public"
+ if table_name =~ /\./
+ parts = table_name.split(/\./)
+ table_name = parts.pop
+ schema_name = parts.join(".")
+ end
+ @connection.columns_internal(table_name, name, schema_name)
end
def last_insert_id(table, sequence_name)
Modified: trunk/activerecord-jdbc/src/java/JdbcAdapterInternalService.java (737 => 738)
--- trunk/activerecord-jdbc/src/java/JdbcAdapterInternalService.java 2007-09-11 05:52:52 UTC (rev 737)
+++ trunk/activerecord-jdbc/src/java/JdbcAdapterInternalService.java 2007-09-11 06:02:59 UTC (rev 738)
@@ -230,6 +230,7 @@
public static IRubyObject columns_internal(IRubyObject recv, IRubyObject[] args) throws SQLException, IOException {
String table_name = args[0].convertToString().getUnicodeValue();
+ int tries = 10;
while(true) {
Connection c = (Connection)recv.dataGetStruct();
try {
@@ -260,7 +261,7 @@
} catch(SQLException e) {
if(c.isClosed()) {
recv = recv.callMethod(recv.getRuntime().getCurrentContext(),"reconnect!");
- if(!((Connection)recv.dataGetStruct()).isClosed()) {
+ if(!((Connection)recv.dataGetStruct()).isClosed() && --tries > 0) {
continue;
}
}
@@ -378,6 +379,7 @@
}
public static IRubyObject execute_update(IRubyObject recv, IRubyObject sql) throws SQLException {
+ int tries = 10;
while(true) {
Connection c = (Connection)recv.dataGetStruct();
Statement stmt = null;
@@ -387,7 +389,7 @@
} catch(SQLException e) {
if(c.isClosed()) {
recv = recv.callMethod(recv.getRuntime().getCurrentContext(),"reconnect!");
- if(!((Connection)recv.dataGetStruct()).isClosed()) {
+ if(!((Connection)recv.dataGetStruct()).isClosed() && --tries > 0) {
continue;
}
}
@@ -408,6 +410,7 @@
if(args.length > 1) {
maxrows = RubyNumeric.fix2int(args[1]);
}
+ int tries = 10;
while(true) {
Connection c = (Connection)recv.dataGetStruct();
Statement stmt = null;
@@ -418,7 +421,7 @@
} catch(SQLException e) {
if(c.isClosed()) {
recv = recv.callMethod(recv.getRuntime().getCurrentContext(),"reconnect!");
- if(!((Connection)recv.dataGetStruct()).isClosed()) {
+ if(!((Connection)recv.dataGetStruct()).isClosed() && --tries > 0) {
continue;
}
}
@@ -434,6 +437,7 @@
}
public static IRubyObject execute_insert(IRubyObject recv, IRubyObject sql) throws SQLException {
+ int tries = 10;
while(true) {
Connection c = (Connection)recv.dataGetStruct();
Statement stmt = null;
@@ -444,7 +448,7 @@
} catch(SQLException e) {
if(c.isClosed()) {
recv = recv.callMethod(recv.getRuntime().getCurrentContext(),"reconnect!");
- if(!((Connection)recv.dataGetStruct()).isClosed()) {
+ if(!((Connection)recv.dataGetStruct()).isClosed() && --tries > 0) {
continue;
}
}