Title: [609] trunk/activerecord-jdbc: JRUBY-961: get postgres working, courtesy Dudley Flanders, also:

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();
+    }
 }
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to