Tweaks to the cascade action reading code
Fix for Oracle platforms

git-svn-id: https://svn.apache.org/repos/asf/db/ddlutils/trunk@711917 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java b/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java
index 06a5607..ee72b14 100644
--- a/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java
+++ b/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java
@@ -929,8 +929,22 @@
         {
             fk = new ForeignKey(fkName);
             fk.setForeignTableName((String)values.get("PKTABLE_NAME"));
-            fk.setOnUpdate(convertAction((Short)values.get("UPDATE_RULE"), getPlatformInfo().getDefaultOnUpdateAction()));
-            fk.setOnDelete(convertAction((Short)values.get("DELETE_RULE"), getPlatformInfo().getDefaultOnDeleteAction()));
+
+            CascadeActionEnum onUpdateAction = convertAction((Short)values.get("UPDATE_RULE"));
+            CascadeActionEnum onDeleteAction = convertAction((Short)values.get("DELETE_RULE"));
+
+            // Some JDBC drivers lie and return actions that the DB not actually supports
+            if ((onUpdateAction == null) || !getPlatformInfo().isActionSupportedForOnUpdate(onUpdateAction))
+            {
+                onUpdateAction = getPlatformInfo().getDefaultOnUpdateAction();
+            }
+            if ((onDeleteAction == null) || !getPlatformInfo().isActionSupportedForOnDelete(onDeleteAction))
+            {
+                onDeleteAction = getPlatformInfo().getDefaultOnDeleteAction();
+            }
+
+            fk.setOnUpdate(onUpdateAction);
+            fk.setOnDelete(onDeleteAction);
             knownFks.put(fkName, fk);
         }
 
@@ -950,12 +964,11 @@
      * {@link DatabaseMetaData} class) to a {@link CascadeActionEnum}.
      * 
      * @param jdbcActionValue The jdbc action value
-     * @param defaultAction   The default action
      * @return The enum value
      */
-    protected CascadeActionEnum convertAction(Short jdbcActionValue, CascadeActionEnum defaultAction)
+    protected CascadeActionEnum convertAction(Short jdbcActionValue)
     {
-        CascadeActionEnum action = defaultAction;
+        CascadeActionEnum action = null;
 
         if (jdbcActionValue != null)
         {
diff --git a/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java b/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java
index 9dbd80c..c4aa27b 100644
--- a/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java
+++ b/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java
@@ -19,7 +19,6 @@
  * under the License.

  */

 

-import java.sql.DatabaseMetaData;

 import java.sql.Date;

 import java.sql.ResultSet;

 import java.sql.SQLException;

@@ -33,7 +32,6 @@
 

 import org.apache.ddlutils.DdlUtilsException;

 import org.apache.ddlutils.Platform;

-import org.apache.ddlutils.model.CascadeActionEnum;

 import org.apache.ddlutils.model.Column;

 import org.apache.ddlutils.model.Index;

 import org.apache.ddlutils.model.Table;

@@ -230,19 +228,4 @@
 

 		return column;

 	}

-

-    /**

-     * {@inheritDoc}

-     */

-    protected CascadeActionEnum convertAction(Short jdbcActionValue, CascadeActionEnum defaultAction)

-    {

-        CascadeActionEnum action = defaultAction;

-

-        // for whatever reason, the sql server jdbc driver returns restrict even though the DB does not support RESTRICT

-        if ((jdbcActionValue != null) && (jdbcActionValue.shortValue() == DatabaseMetaData.importedKeyCascade))

-        {

-            action = CascadeActionEnum.CASCADE;

-        }

-        return action;

-    }

 }

diff --git a/src/main/java/org/apache/ddlutils/platform/oracle/Oracle8Platform.java b/src/main/java/org/apache/ddlutils/platform/oracle/Oracle8Platform.java
index 51806f9..4795c3c 100644
--- a/src/main/java/org/apache/ddlutils/platform/oracle/Oracle8Platform.java
+++ b/src/main/java/org/apache/ddlutils/platform/oracle/Oracle8Platform.java
@@ -31,6 +31,7 @@
 import org.apache.ddlutils.alteration.RemovePrimaryKeyChange;

 import org.apache.ddlutils.alteration.TableChange;

 import org.apache.ddlutils.alteration.TableDefinitionChangesPredicate;

+import org.apache.ddlutils.model.CascadeActionEnum;

 import org.apache.ddlutils.model.Column;

 import org.apache.ddlutils.model.Database;

 import org.apache.ddlutils.model.Table;

@@ -71,6 +72,8 @@
         info.setMaxIdentifierLength(30);

         info.setIdentityStatusReadingSupported(false);

         info.setPrimaryKeyColumnAutomaticallyRequired(true);

+        info.setSupportedOnUpdateActions(new CascadeActionEnum[] { CascadeActionEnum.NONE });

+        info.setSupportedOnDeleteActions(new CascadeActionEnum[] { CascadeActionEnum.CASCADE, CascadeActionEnum.SET_NULL, CascadeActionEnum.NONE });

 

         // Note that the back-mappings are partially done by the model reader, not the driver

         info.addNativeTypeMapping(Types.ARRAY,         "BLOB",             Types.BLOB);