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);