You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ddlutils-dev@db.apache.org by to...@apache.org on 2007/03/08 08:00:06 UTC

svn commit: r515946 - in /db/ddlutils/trunk/src/java/org/apache/ddlutils: platform/PlatformImplBase.java util/Jdbc3Utils.java

Author: tomdz
Date: Wed Mar  7 23:00:05 2007
New Revision: 515946

URL: http://svn.apache.org/viewvc?view=rev&rev=515946
Log:
Fix for DDLUTILS-158

Modified:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/util/Jdbc3Utils.java

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java?view=diff&rev=515946&r1=515945&r2=515946
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java Wed Mar  7 23:00:05 2007
@@ -1494,13 +1494,30 @@
                 closeStatement(statement);
                 afterInsert(connection, table);
 
-                int sum = 0;
+                boolean hasSum = true;
+                int     sum    = 0;
 
                 for (int idx = 0; (results != null) && (idx < results.length); idx++)
                 {
-                    sum += results[idx];
+                    if (results[idx] < 0)
+                    {
+                        hasSum = false;
+                        if (Jdbc3Utils.supportsJava14BatchResultCodes())
+                        {
+                            String msg = Jdbc3Utils.getBatchResultMessage(table.getName(), idx, results[idx]);
+
+                            if (msg != null)
+                            {
+                                _log.warn(msg);
+                            }
+                        }
+                    }
+                    else
+                    {
+                        sum += results[idx];
+                    }
                 }
-                if (sum != numRows)
+                if (hasSum && (sum != numRows))
                 {
                     _log.warn("Attempted to insert " + numRows + " rows into table " + table.getName() + " but changed " + sum + " rows");
                 }

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/util/Jdbc3Utils.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/util/Jdbc3Utils.java?view=diff&rev=515946&r1=515945&r2=515946
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/util/Jdbc3Utils.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/util/Jdbc3Utils.java Wed Mar  7 23:00:05 2007
@@ -19,12 +19,14 @@
  * under the License.
  */
 
+import java.sql.Statement;
 import java.sql.Types;
 
 import org.apache.ddlutils.model.TypeMap;
 
 /**
- * Little helper class providing functions for dealing with the newer JDBC functionality.
+ * Little helper class providing functions for dealing with the newer JDBC functionality
+ * in a way that is safe to compile with Java 1.3.
  * 
  * @version $Revision: 289996 $
  */
@@ -82,6 +84,65 @@
         catch (Exception ex)
         {
             throw new UnsupportedOperationException("The jdbc type DATALINK is not supported");
+        }
+    }
+
+    /**
+     * Determines whether the system supports the Java 1.4 batch result codes.
+     *   
+     * @return <code>true</code> if SUCCESS_NO_INFO and EXECUTE_FAILED are available
+     *         in the {@link java.sql.Statement} class
+     */
+    public static boolean supportsJava14BatchResultCodes()
+    {
+        try
+        {
+            return (Statement.class.getField("SUCCESS_NO_INFO") != null) &&
+                   (Statement.class.getField("EXECUTE_FAILED") != null);
+        }
+        catch (Exception ex)
+        {
+            return false;
+        }
+    }
+
+    /**
+     * Returns the logging message corresponding to the given result code of a batch message.
+     * Note that these code values are only available in JDBC 3 and newer (see
+     * {@link java.sql.Statement} for details).
+     * 
+     * @param tableName  The name of the table that the batch update/insert was performed on
+     * @param rowIdx     The index of the row within the batch for which this code is
+     * @param resultCode The code
+     * @return The string message or <code>null</code> if the code does not indicate an error
+     */
+    public static String getBatchResultMessage(String tableName, int rowIdx, int resultCode)
+    {
+        if (resultCode < 0)
+        {
+            try
+            {
+                if (resultCode == Statement.class.getField("SUCCESS_NO_INFO").getInt(null))
+                {
+                    return null;
+                }
+                else if (resultCode == Statement.class.getField("EXECUTE_FAILED").getInt(null))
+                {
+                    return "The batch insertion of row " + rowIdx + " into table " + tableName + " failed but the driver is able to continue processing";
+                }
+                else
+                {
+                    return "The batch insertion of row " + rowIdx + " into table " + tableName + " returned an undefined status value " + resultCode;
+                }
+            }
+            catch (Exception ex)
+            {
+                throw new UnsupportedOperationException("The batch result codes are not supported");
+            }
+        }
+        else
+        {
+            return null;
         }
     }
 }