Author: tomdz Date: Mon Mar 12 21:23:30 2007 New Revision: 517522 URL: http://svn.apache.org/viewvc?view=rev&rev=517522 Log: Added a check as to whether data can be migrated when a table is altered
Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java?view=diff&rev=517522&r1=517521&r2=517522 ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java Mon Mar 12 21:23:30 2007 @@ -915,17 +915,49 @@ if (!changes.isEmpty()) { - Table tempTable = getTemporaryTableFor(desiredModel, targetTable); + // we can only copy the data if no required columns without default value and + // non-autoincrement have been added + boolean canMigrateData = true; + + for (Iterator it = changes.iterator(); canMigrateData && it.hasNext();) + { + TableChange change = (TableChange)it.next(); + + if (change instanceof AddColumnChange) + { + AddColumnChange addColumnChange = (AddColumnChange)change; + + if (addColumnChange.getNewColumn().isRequired() && + !addColumnChange.getNewColumn().isAutoIncrement() && + (addColumnChange.getNewColumn().getDefaultValue() == null)) + { + _log.warn("Data cannot be retained in table " + change.getChangedTable().getName() + + " because of the addition of the required column " + addColumnChange.getNewColumn().getName()); + canMigrateData = false; + } + } + } + Table realTargetTable = getRealTargetTableFor(desiredModel, sourceTable, targetTable); - createTemporaryTable(desiredModel, tempTable, parameters); - writeCopyDataStatement(sourceTable, tempTable); - // Note that we don't drop the indices here because the DROP TABLE will take care of that - // Likewise, foreign keys have already been dropped as necessary - dropTable(sourceTable); - createTable(desiredModel, realTargetTable, parameters); - writeCopyDataStatement(tempTable, targetTable); - dropTemporaryTable(desiredModel, tempTable); + if (canMigrateData) + { + Table tempTable = getTemporaryTableFor(desiredModel, targetTable); + + createTemporaryTable(desiredModel, tempTable, parameters); + writeCopyDataStatement(sourceTable, tempTable); + // Note that we don't drop the indices here because the DROP TABLE will take care of that + // Likewise, foreign keys have already been dropped as necessary + dropTable(sourceTable); + createTable(desiredModel, realTargetTable, parameters); + writeCopyDataStatement(tempTable, targetTable); + dropTemporaryTable(desiredModel, tempTable); + } + else + { + dropTable(sourceTable); + createTable(desiredModel, realTargetTable, parameters); + } } } Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java?view=diff&rev=517522&r1=517521&r2=517522 ============================================================================== --- db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java (original) +++ db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java Mon Mar 12 21:23:30 2007 @@ -2187,13 +2187,13 @@ createDatabase(model1Xml); - // note that we cannot do this test with values in the table because - // the primary key will be re-created and thus won't have values in it - // (no renaming) + insertRow("roundtrip", new Object[] { new Integer(1), "test" }); alterDatabase(model2Xml); assertEquals(getAdjustedModel(), readModelFromDatabase("roundtriptest")); + + assertTrue(getRows("roundtrip").isEmpty()); } }