Diff
Modified: trunk/activerecord-jdbc/Rakefile (608 => 609)
--- trunk/activerecord-jdbc/Rakefile 2007-06-01 14:09:00 UTC (rev 608)
+++ trunk/activerecord-jdbc/Rakefile 2007-06-01 17:05:35 UTC (rev 609)
@@ -1,7 +1,7 @@
require 'rake'
require 'rake/testtask'
-task :default => :test
+task :default => [:java_compile, :test]
def java_classpath_arg # myriad of ways to discover JRuby classpath
begin
@@ -40,7 +40,7 @@
desc "Run AR-JDBC tests"
if RUBY_PLATFORM =~ /java/
# TODO: add more databases into the standard tests here.
- task :test => [:java_compile, :test_mysql, :test_derby, :test_hsqldb]
+ task :test => [:test_mysql, :test_derby, :test_hsqldb]
else
task :test => [:test_mysql]
end
Modified: trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter.rb (608 => 609)
--- trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter.rb 2007-06-01 14:09:00 UTC (rev 608)
+++ trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter.rb 2007-06-01 17:05:35 UTC (rev 609)
@@ -440,6 +440,10 @@
@connection.tables
end
+ def indexes(table_name)
+ @connection.indexes(table_name)
+ end
+
def begin_db_transaction
@connection.begin
end
Modified: trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_derby.rb (608 => 609)
--- trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_derby.rb 2007-06-01 14:09:00 UTC (rev 608)
+++ trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_derby.rb 2007-06-01 17:05:35 UTC (rev 609)
@@ -321,13 +321,6 @@
super.reject{|t| t =~ /^sys/i }
end
- # For migrations, exclude the primary key index as recommended
- # by the HSQLDB docs. This is not a great test for primary key
- # index.
- def indexes(table_name)
- @connection.indexes(table_name)
- end
-
def quote(value, column = nil) # :nodoc:
return value.to_s if column && column.type == :primary_key
Modified: trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_hsqldb.rb (608 => 609)
--- trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_hsqldb.rb 2007-06-01 14:09:00 UTC (rev 608)
+++ trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_hsqldb.rb 2007-06-01 17:05:35 UTC (rev 609)
@@ -138,19 +138,7 @@
# system tables SYSTEM.*, but H2 seems to name them without
# any kind of convention
def tables
- _results = []
- @connection.tables.each do |result_row|
- _results << result_row.to_s if result_row.to_s !~ /^system_/i
- end
- _results
+ @connection.tables.select {|row| row.to_s !~ /^system_/i }
end
-
- # For migrations, exclude the primary key index as recommended
- # by the HSQLDB docs. This is not a great test for primary key
- # index.
- def indexes(table_name, name = nil)
- @connection.indexes(table_name.to_s)
- end
-
end
end
Modified: trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_mysql.rb (608 => 609)
--- trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_mysql.rb 2007-06-01 14:09:00 UTC (rev 608)
+++ trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_mysql.rb 2007-06-01 17:05:35 UTC (rev 609)
@@ -104,10 +104,6 @@
select_one("SELECT DATABASE() as db")["db"]
end
- def indexes(table_name, name = nil)#:nodoc:
- @connection.indexes(table_name)
- end
-
def create_table(name, options = {}) #:nodoc:
super(name, {:options => "ENGINE=InnoDB"}.merge(options))
end
Modified: trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_postgre.rb (608 => 609)
--- trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_postgre.rb 2007-06-01 14:09:00 UTC (rev 608)
+++ trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_postgre.rb 2007-06-01 17:05:35 UTC (rev 609)
@@ -57,6 +57,24 @@
default_seq || "#{table_name}_#{pk || default_pk || 'id'}_seq"
end
+ # Resets sequence to the max value of the table's pk if present.
+ def reset_pk_sequence!(table, pk = nil, sequence = nil)
+ unless pk and sequence
+ default_pk, default_sequence = pk_and_sequence_for(table)
+ pk ||= default_pk
+ sequence ||= default_sequence
+ end
+ if pk
+ if sequence
+ select_value <<-end_sql, 'Reset sequence'
+ SELECT setval('#{sequence}', (SELECT COALESCE(MAX(#{pk})+(SELECT increment_by FROM #{sequence}), (SELECT min_value FROM #{sequence})) FROM #{table}), false)
+ end_sql
+ else
+ @logger.warn "#{table} has primary key #{pk} with no default sequence" if @logger
+ end
+ end
+ end
+
# Find a table's primary key and sequence.
def pk_and_sequence_for(table)
# First try looking for a sequence with a dependency on the
@@ -185,5 +203,9 @@
'bigint'
end
end
+
+ def tables
+ @connection.tables(database_name, nil, nil, ["TABLE"])
+ end
end
end
Modified: trunk/activerecord-jdbc/pom.xml (608 => 609)
--- trunk/activerecord-jdbc/pom.xml 2007-06-01 14:09:00 UTC (rev 608)
+++ trunk/activerecord-jdbc/pom.xml 2007-06-01 17:05:35 UTC (rev 609)
@@ -66,7 +66,7 @@
require 'ci/reporter/rake/test_unit'
load 'Rakefile'
</script>
- <args>ci:setup:testunit default</args>
+ <args>ci:setup:testunit java_compile ${test.task}</args>
</configuration>
</execution>
</executions>
@@ -89,10 +89,21 @@
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
- <version>8.2-504.jdbc4</version>
+ <version>8.2-504.jdbc3</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
+ <profiles>
+ <profile>
+ <id>properties</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <properties>
+ <test.task>test</test.task>
+ </properties>
+ </profile>
+ </profiles>
</project>
\ No newline at end of file
Modified: trunk/activerecord-jdbc/src/java/JdbcAdapterInternalService.java (608 => 609)
--- trunk/activerecord-jdbc/src/java/JdbcAdapterInternalService.java 2007-06-01 14:09:00 UTC (rev 608)
+++ trunk/activerecord-jdbc/src/java/JdbcAdapterInternalService.java 2007-06-01 17:05:35 UTC (rev 609)
@@ -83,7 +83,7 @@
cJdbcConn.defineFastMethod("database_name",cf.getFastSingletonMethod("database_name"));
cJdbcConn.defineFastMethod("columns",cf.getFastOptSingletonMethod("columns"));
cJdbcConn.defineFastMethod("mysql_quote_string",cf.getFastSingletonMethod("mysql_quote_string",IRubyObject.class));
- cJdbcConn.defineMethod("tables",cf.getSingletonMethod("tables"));
+ cJdbcConn.defineFastMethod("tables",cf.getFastOptSingletonMethod("tables"));
return true;
}
@@ -104,28 +104,43 @@
return recv;
}
- public static IRubyObject tables(IRubyObject recv, Block table_filter) throws SQLException, IOException {
+ public static IRubyObject tables(IRubyObject recv, IRubyObject[] args) throws SQLException, IOException {
Ruby runtime = recv.getRuntime();
- while(true) {
- Connection c = (Connection)recv.dataGetStruct();
- try {
- ResultSet rs = c.getMetaData().getTables(null,null,null,null);
- if(table_filter.isGiven()) {
- RubyString ss = runtime.newString("table_name");
- List arr = new ArrayList();
- RubyArray aa = (RubyArray)unmarshal_result(recv, JavaObject.wrap(runtime, rs), table_filter);
- for(int i=0,j=aa.size();i<j;i++) {
- arr.add(((RubyString)(((RubyHash)aa.eltInternal(i)).aref(ss))).downcase());
+ String catalog = null, schemapat = null, tablepat = null;
+ String[] types = null;
+ if (args != null) {
+ if (args.length > 0) {
+ catalog = convertToStringOrNull(args[0]);
+ }
+ if (args.length > 1) {
+ schemapat = convertToStringOrNull(args[1]);
+ }
+ if (args.length > 2) {
+ tablepat = convertToStringOrNull(args[2]);
+ }
+ if (args.length > 3) {
+ IRubyObject typearr = args[3];
+ if (typearr instanceof RubyArray) {
+ IRubyObject[] arr = ((RubyArray) typearr).toJavaArray();
+ types = new String[arr.length];
+ for (int i = 0; i < types.length; i++) {
+ types[i] = arr[i].toString();
}
- return runtime.newArray(arr);
} else {
- List arr = new ArrayList();
- while(rs.next()) {
- arr.add(runtime.newString(rs.getString(3).toLowerCase()));
- }
- return runtime.newArray(arr);
+ types = new String[] {types.toString()};
}
- } catch(SQLException e) {
+ }
+ }
+ while (true) {
+ Connection c = (Connection) recv.dataGetStruct();
+ try {
+ ResultSet rs = c.getMetaData().getTables(catalog, schemapat, tablepat, types);
+ List arr = new ArrayList();
+ while (rs.next()) {
+ arr.add(runtime.newString(rs.getString(3).toLowerCase()));
+ }
+ return runtime.newArray(arr);
+ } catch (SQLException e) {
if(c.isClosed()) {
recv.callMethod(recv.getRuntime().getCurrentContext(),"reconnect!");
continue;
@@ -609,4 +624,11 @@
}
return recv.getRuntime().newStringShared(bl);
}
+
+ private static String convertToStringOrNull(IRubyObject obj) {
+ if (obj.isNil()) {
+ return null;
+ }
+ return obj.toString();
+ }
}