Author: tomdz Date: Wed Dec 30 07:49:27 2009 New Revision: 894556 URL: http://svn.apache.org/viewvc?rev=894556&view=rev Log: Added equivalence for on delete/on update settings
Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/PlatformInfo.java db/ddlutils/trunk/src/main/java/org/apache/ddlutils/alteration/ModelComparator.java db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/oracle/Oracle8Platform.java db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/sapdb/SapDbPlatform.java db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java db/ddlutils/trunk/src/test/resources/jdbc.properties.db2 db/ddlutils/trunk/src/test/resources/jdbc.properties.firebird db/ddlutils/trunk/src/test/resources/jdbc.properties.maxdb db/ddlutils/trunk/src/test/resources/jdbc.properties.oracle10 db/ddlutils/trunk/src/test/resources/jdbc.properties.postgresql db/ddlutils/trunk/src/test/resources/jdbc.properties.sqlserver2005 Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/PlatformInfo.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/PlatformInfo.java?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/PlatformInfo.java (original) +++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/PlatformInfo.java Wed Dec 30 07:49:27 2009 @@ -24,6 +24,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -180,6 +181,12 @@ /** Contains the supported ON DELETE actions. */ private HashSet _supportedOnDeleteActions = new HashSet(); + /** Contains for each ON UPDATE action the list of equivalent actions. */ + private HashMap _equivalentOnUpdateActions = new HashMap(); + + /** Contains for each ON DELETE action the list of equivalent actions. */ + private HashMap _equivalentOnDeleteActions = new HashMap(); + /** * Creates a new platform info object. */ @@ -1276,4 +1283,92 @@ { _defaultOnDeleteAction = defaultOnDeleteAction; } + + /** + * Registers the given pair of ON UPDATE actions to be equivalent. Equivalent actions will not + * cause a foreign key to be changed/recreated when altering a database. + * + * @param actionA The first action + * @param actionB The second action + */ + public void addEquivalentOnUpdateActions(CascadeActionEnum actionA, CascadeActionEnum actionB) + { + if (!actionA.equals(actionB)) + { + Set actionsEquivalentToActionA = (Set)_equivalentOnUpdateActions.get(actionA); + Set actionsEquivalentToActionB = (Set)_equivalentOnUpdateActions.get(actionB); + + if (actionsEquivalentToActionA == null) + { + actionsEquivalentToActionA = new HashSet(); + _equivalentOnUpdateActions.put(actionA, actionsEquivalentToActionA); + } + if (actionsEquivalentToActionB == null) + { + actionsEquivalentToActionB = new HashSet(); + _equivalentOnUpdateActions.put(actionB, actionsEquivalentToActionB); + } + actionsEquivalentToActionA.add(actionB); + actionsEquivalentToActionB.add(actionA); + } + } + + /** + * Determiones whether the two ON UPDATE actions are equivalent. Equivalent actions will not + * cause a foreign key to be changed/recreated when altering a database. + * + * @param actionA The first action + * @param actionB The second action + * @return <code>true</code> if the two actions are equivalent + */ + public boolean areEquivalentOnUpdateActions(CascadeActionEnum actionA, CascadeActionEnum actionB) + { + Set actionsEquivalentToActionA = (Set)_equivalentOnUpdateActions.get(actionA); + + return actionsEquivalentToActionA == null ? false : actionsEquivalentToActionA.contains(actionB); + } + + /** + * Registers the given pair of ON DELETE actions to be equivalent. Equivalent actions will not + * cause a foreign key to be changed/recreated when altering a database. + * + * @param actionA The first action + * @param actionB The second action + */ + public void addEquivalentOnDeleteActions(CascadeActionEnum actionA, CascadeActionEnum actionB) + { + if (!actionA.equals(actionB)) + { + Set actionsEquivalentToActionA = (Set)_equivalentOnDeleteActions.get(actionA); + Set actionsEquivalentToActionB = (Set)_equivalentOnDeleteActions.get(actionB); + + if (actionsEquivalentToActionA == null) + { + actionsEquivalentToActionA = new HashSet(); + _equivalentOnDeleteActions.put(actionA, actionsEquivalentToActionA); + } + if (actionsEquivalentToActionB == null) + { + actionsEquivalentToActionB = new HashSet(); + _equivalentOnDeleteActions.put(actionB, actionsEquivalentToActionB); + } + actionsEquivalentToActionA.add(actionB); + actionsEquivalentToActionB.add(actionA); + } + } + + /** + * Determiones whether the two ON DELETE actions are equivalent. Equivalent actions will not + * cause a foreign key to be changed/recreated when altering a database. + * + * @param actionA The first action + * @param actionB The second action + * @return <code>true</code> if the two actions are equivalent + */ + public boolean areEquivalentOnDeleteActions(CascadeActionEnum actionA, CascadeActionEnum actionB) + { + Set actionsEquivalentToActionA = (Set)_equivalentOnDeleteActions.get(actionA); + + return actionsEquivalentToActionA == null ? false : actionsEquivalentToActionA.contains(actionB); + } } Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/alteration/ModelComparator.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/alteration/ModelComparator.java?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/alteration/ModelComparator.java (original) +++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/alteration/ModelComparator.java Wed Dec 30 07:49:27 2009 @@ -373,6 +373,7 @@ tableDefinitionChanges.addAll(checkForAddedColumns(sourceModel, sourceTable, intermediateModel, intermediateTable, targetModel, targetTable)); tableDefinitionChanges.addAll(checkForPrimaryKeyChanges(sourceModel, sourceTable, intermediateModel, intermediateTable, targetModel, targetTable)); + // TOOD: check for foreign key changes (on delete/on update) if (!tableDefinitionChanges.isEmpty()) { if ((_tableDefCangePredicate == null) || _tableDefCangePredicate.areSupported(tmpTable, tableDefinitionChanges)) Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java (original) +++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java Wed Dec 30 07:49:27 2009 @@ -933,12 +933,11 @@ 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)) + if (onUpdateAction == null) { onUpdateAction = getPlatformInfo().getDefaultOnUpdateAction(); } - if ((onDeleteAction == null) || !getPlatformInfo().isActionSupportedForOnDelete(onDeleteAction)) + if (onDeleteAction == null) { onDeleteAction = getPlatformInfo().getDefaultOnDeleteAction(); } Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java (original) +++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java Wed Dec 30 07:49:27 2009 @@ -64,8 +64,11 @@ info.addNativeTypeMapping(Types.DOUBLE, "DOUBLE"); info.addNativeTypeMapping(Types.FLOAT, "DOUBLE", Types.DOUBLE); info.setSupportedOnUpdateActions(new CascadeActionEnum[] { CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT }); + info.setDefaultOnUpdateAction(CascadeActionEnum.NONE); + info.addEquivalentOnUpdateActions(CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT); info.setSupportedOnDeleteActions(new CascadeActionEnum[] { CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT, CascadeActionEnum.CASCADE, CascadeActionEnum.SET_NULL }); + info.setDefaultOnDeleteAction(CascadeActionEnum.NONE); setSqlBuilder(new DerbyBuilder(this)); setModelReader(new DerbyModelReader(this)); Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java (original) +++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java Wed Dec 30 07:49:27 2009 @@ -77,7 +77,9 @@ info.setIdentityColumnAutomaticallyRequired(true); info.setMultipleIdentityColumnsSupported(false); info.setSupportedOnUpdateActions(new CascadeActionEnum[] { CascadeActionEnum.CASCADE, CascadeActionEnum.NONE }); + info.addEquivalentOnUpdateActions(CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT); info.setSupportedOnDeleteActions(new CascadeActionEnum[] { CascadeActionEnum.CASCADE, CascadeActionEnum.NONE }); + info.addEquivalentOnDeleteActions(CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT); info.addNativeTypeMapping(Types.ARRAY, "IMAGE", Types.LONGVARBINARY); // BIGINT will be mapped back to BIGINT by the model reader Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/oracle/Oracle8Platform.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/oracle/Oracle8Platform.java?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/oracle/Oracle8Platform.java (original) +++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/oracle/Oracle8Platform.java Wed Dec 30 07:49:27 2009 @@ -74,6 +74,7 @@ info.setPrimaryKeyColumnAutomaticallyRequired(true); info.setSupportedOnUpdateActions(new CascadeActionEnum[] { CascadeActionEnum.NONE }); info.setSupportedOnDeleteActions(new CascadeActionEnum[] { CascadeActionEnum.CASCADE, CascadeActionEnum.SET_NULL, CascadeActionEnum.NONE }); + info.addEquivalentOnDeleteActions(CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT); // Note that the back-mappings are partially done by the model reader, not the driver info.addNativeTypeMapping(Types.ARRAY, "BLOB", Types.BLOB); Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/sapdb/SapDbPlatform.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/sapdb/SapDbPlatform.java?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/sapdb/SapDbPlatform.java (original) +++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/sapdb/SapDbPlatform.java Wed Dec 30 07:49:27 2009 @@ -67,9 +67,10 @@ info.setMultipleIdentityColumnsSupported(false); info.setCommentPrefix("/*"); info.setCommentSuffix("*/"); - info.setSupportedOnUpdateActions(new CascadeActionEnum[] { CascadeActionEnum.NONE }); - info.setDefaultOnDeleteAction(CascadeActionEnum.RESTRICT); info.setSupportedOnDeleteActions(new CascadeActionEnum[] { CascadeActionEnum.CASCADE, CascadeActionEnum.RESTRICT, CascadeActionEnum.SET_DEFAULT, CascadeActionEnum.SET_NULL, CascadeActionEnum.NONE }); + info.addEquivalentOnDeleteActions(CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT); + info.setSupportedOnUpdateActions(new CascadeActionEnum[] { CascadeActionEnum.NONE }); + info.addEquivalentOnUpdateActions(CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT); // BIGINT is also handled by the model reader // Unfortunately there is no way to distinguish between REAL, and FLOAT/DOUBLE when Modified: db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java (original) +++ db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java Wed Dec 30 07:49:27 2009 @@ -53,7 +53,6 @@ import org.apache.ddlutils.io.DataReader; import org.apache.ddlutils.io.DataToDatabaseSink; import org.apache.ddlutils.io.DatabaseIO; -import org.apache.ddlutils.model.CascadeActionEnum; import org.apache.ddlutils.model.CloneHelper; import org.apache.ddlutils.model.Column; import org.apache.ddlutils.model.Database; @@ -1312,35 +1311,12 @@ getPlatform().getSqlBuilder().shortenName(actual.getForeignTableName().toUpperCase(), getSqlBuilder().getMaxTableNameLength())); } - CascadeActionEnum realExpectedOnUpdateAction = expected.getOnUpdate(); - CascadeActionEnum realActualOnUpdateAction = actual.getOnUpdate(); - - if (!getPlatformInfo().isActionSupportedForOnUpdate(realExpectedOnUpdateAction) || (realExpectedOnUpdateAction == CascadeActionEnum.NONE)) - { - realExpectedOnUpdateAction = getPlatformInfo().getDefaultOnUpdateAction(); - } - if (!getPlatformInfo().isActionSupportedForOnUpdate(realActualOnUpdateAction) || (realActualOnUpdateAction == CascadeActionEnum.NONE)) - { - realActualOnUpdateAction = getPlatformInfo().getDefaultOnUpdateAction(); - } - assertEquals("Not the same onUpdate setting in foreign key "+actual.getName()+".", - realExpectedOnUpdateAction, - realActualOnUpdateAction); - - CascadeActionEnum realExpectedOnDeleteAction = expected.getOnDelete(); - CascadeActionEnum realActualOnDeleteAction = actual.getOnDelete(); - - if (!getPlatformInfo().isActionSupportedForOnDelete(realExpectedOnDeleteAction) || (realExpectedOnDeleteAction == CascadeActionEnum.NONE)) - { - realExpectedOnDeleteAction = getPlatformInfo().getDefaultOnDeleteAction(); - } - if (!getPlatformInfo().isActionSupportedForOnDelete(realActualOnDeleteAction) || (realActualOnDeleteAction == CascadeActionEnum.NONE)) - { - realActualOnDeleteAction = getPlatformInfo().getDefaultOnDeleteAction(); - } - assertEquals("Not the same onDelete setting in foreign key "+actual.getName()+".", - realExpectedOnDeleteAction, - realActualOnDeleteAction); + assertTrue("Not the same onUpdate setting in foreign key "+actual.getName()+": expected = "+expected.getOnUpdate()+", actual = "+actual.getOnUpdate(), + expected.getOnUpdate().equals(actual.getOnUpdate()) || + getPlatformInfo().areEquivalentOnUpdateActions(expected.getOnUpdate(), actual.getOnUpdate())); + assertTrue("Not the same onDelete setting in foreign key "+actual.getName()+": expected = "+expected.getOnDelete()+", actual = "+actual.getOnDelete(), + expected.getOnDelete().equals(actual.getOnDelete()) || + getPlatformInfo().areEquivalentOnDeleteActions(expected.getOnDelete(), actual.getOnDelete())); assertEquals("Not the same number of references in foreign key "+actual.getName()+".", expected.getReferenceCount(), Modified: db/ddlutils/trunk/src/test/resources/jdbc.properties.db2 URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/resources/jdbc.properties.db2?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/test/resources/jdbc.properties.db2 (original) +++ db/ddlutils/trunk/src/test/resources/jdbc.properties.db2 Wed Dec 30 07:49:27 2009 @@ -26,6 +26,6 @@ datasource.class=org.apache.commons.dbcp.BasicDataSource datasource.driverClassName=com.ibm.db2.jcc.DB2Driver -datasource.url=jdbc:db2://192.168.129.134:50000/ddlutils +datasource.url=jdbc:db2://192.168.129.133:50000/ddlutils datasource.username=ddlutils datasource.password=ddlutils Modified: db/ddlutils/trunk/src/test/resources/jdbc.properties.firebird URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/resources/jdbc.properties.firebird?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/test/resources/jdbc.properties.firebird (original) +++ db/ddlutils/trunk/src/test/resources/jdbc.properties.firebird Wed Dec 30 07:49:27 2009 @@ -29,7 +29,7 @@ datasource.class=org.apache.commons.dbcp.BasicDataSource datasource.driverClassName=org.firebirdsql.jdbc.FBDriver -datasource.url=jdbc:firebirdsql://192.168.129.129/C:/Program Files/Firebird/Firebird_2_0/data/ddlutils.fdb +datasource.url=jdbc:firebirdsql://192.168.129.133/C:/Program Files/Firebird/Firebird_2_0/data/ddlutils.fdb datasource.username=SYSDBA datasource.password=masterkey Modified: db/ddlutils/trunk/src/test/resources/jdbc.properties.maxdb URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/resources/jdbc.properties.maxdb?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/test/resources/jdbc.properties.maxdb (original) +++ db/ddlutils/trunk/src/test/resources/jdbc.properties.maxdb Wed Dec 30 07:49:27 2009 @@ -29,6 +29,6 @@ datasource.class=org.apache.commons.dbcp.BasicDataSource datasource.driverClassName=com.sap.dbtech.jdbc.DriverSapDB -datasource.url=jdbc:sapdb://192.168.129.134/MAXDB1 +datasource.url=jdbc:sapdb://192.168.129.133/MAXDB1 datasource.username=ddlutils datasource.password=ddlutils Modified: db/ddlutils/trunk/src/test/resources/jdbc.properties.oracle10 URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/resources/jdbc.properties.oracle10?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/test/resources/jdbc.properties.oracle10 (original) +++ db/ddlutils/trunk/src/test/resources/jdbc.properties.oracle10 Wed Dec 30 07:49:27 2009 @@ -29,7 +29,7 @@ datasource.class=org.apache.commons.dbcp.BasicDataSource datasource.driverClassName=oracle.jdbc.driver.OracleDriver -datasource.url=jdbc:oracle:thin:@192.168.129.134:1521:XE +datasource.url=jdbc:oracle:thin:@192.168.129.133:1521:XE datasource.username=ddlutils datasource.password=ddlutils Modified: db/ddlutils/trunk/src/test/resources/jdbc.properties.postgresql URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/resources/jdbc.properties.postgresql?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/test/resources/jdbc.properties.postgresql (original) +++ db/ddlutils/trunk/src/test/resources/jdbc.properties.postgresql Wed Dec 30 07:49:27 2009 @@ -29,7 +29,7 @@ datasource.class=org.apache.commons.dbcp.BasicDataSource datasource.driverClassName=org.postgresql.Driver -datasource.url=jdbc:postgresql://192.168.129.134/ddlutils +datasource.url=jdbc:postgresql://192.168.129.133/ddlutils datasource.username=ddlutils datasource.password=ddlutils Modified: db/ddlutils/trunk/src/test/resources/jdbc.properties.sqlserver2005 URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/resources/jdbc.properties.sqlserver2005?rev=894556&r1=894555&r2=894556&view=diff ============================================================================== --- db/ddlutils/trunk/src/test/resources/jdbc.properties.sqlserver2005 (original) +++ db/ddlutils/trunk/src/test/resources/jdbc.properties.sqlserver2005 Wed Dec 30 07:49:27 2009 @@ -26,7 +26,7 @@ datasource.class=org.apache.commons.dbcp.BasicDataSource datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver -datasource.url=jdbc:sqlserver://192.168.129.134;databaseName=ddlutils;selectMethod=cursor +datasource.url=jdbc:sqlserver://192.168.129.133;databaseName=ddlutils;selectMethod=cursor datasource.username=ddlutils datasource.password=ddlutils