Author: tomdz Date: Sun Sep 16 17:10:56 2007 New Revision: 576220 URL: http://svn.apache.org/viewvc?rev=576220&view=rev Log: Fixed update() implementation for primary key updates Adjusted onUpdate/onDelete tests
Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformInfo.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestConstraints.java db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestSqlBuilder.java Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java?rev=576220&r1=576219&r2=576220&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java Sun Sep 16 17:10:56 2007 @@ -815,7 +815,8 @@ public void insert(Connection connection, Database model, Collection dynaBeans) throws DatabaseOperationException; /** - * Returns the sql for updating the given bean in the database. + * Returns the sql for updating the given bean in the database. Note that this method can not be used to + * generate SQL for updating primary key columns. * * @param model The database model to use * @param dynaBean The bean @@ -824,7 +825,19 @@ public String getUpdateSql(Database model, DynaBean dynaBean); /** - * Updates the given bean in the database, assuming the primary key values are specified. + * Returns the sql for updating the given bean in the database. Note that this method can not be used to + * generate SQL for updating primary key columns. + * + * @param model The database model to use + * @param oldDynaBean The bean identifying the row to update + * @param newDynaBean The bean containing the new values + * @return The update sql + */ + public String getUpdateSql(Database model, DynaBean oldDynaBean, DynaBean newDynaBan); + + /** + * Updates the given bean in the database, assuming the primary key values are specified. Note that this means + * that this method will not update the primary key columns. * * @param model The database model to use * @param dynaBean The bean @@ -832,7 +845,8 @@ public void update(Database model, DynaBean dynaBean) throws DatabaseOperationException; /** - * Updates the row which maps to the given bean. + * Updates the row which maps to the given bean. Note that this means that this method will not update the + * primary key columns. * * @param connection The database connection * @param model The database model to use @@ -842,7 +856,7 @@ /** * Updates the row identified by the given <code>oldDynaBean</code> in the database with the - * values in <code>newDynaBean</code>. + * values in <code>newDynaBean</code>. This method can be used to update primary key columns. * * @param model The database model to use * @param oldDynaBean The bean identifying the row (which means the primary key fields need to be specified) @@ -852,7 +866,7 @@ /** * Updates the row identified by the given <code>oldDynaBean</code> in the database with the - * values in <code>newDynaBean</code>. + * values in <code>newDynaBean</code>. This method can be used to update primary key columns. * * @param connection The database connection * @param model The database model to use Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformInfo.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformInfo.java?rev=576220&r1=576219&r2=576220&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformInfo.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformInfo.java Sun Sep 16 17:10:56 2007 @@ -56,9 +56,6 @@ /** Whether embedded foreign key constraints are explicitly named. */ private boolean _embeddedForeignKeysNamed = false; - /** Whether the set-default action is supportd for onDelete/onUpdate in a foreign key. */ - private boolean _setDefaultActionSupported = true; - /** Whether non-unique indices are supported. */ private boolean _indicesSupported = true; @@ -287,28 +284,6 @@ public void setEmbeddedForeignKeysNamed(boolean embeddedForeignKeysNamed) { _embeddedForeignKeysNamed = embeddedForeignKeysNamed; - } - - /** - * Determines whether the set-default action is supported for onUpdate/onDelete - * in foreign keys. - * - * @return <code>true</code> if set-default is supported - */ - public boolean isSetDefaultActionSupported() - { - return _setDefaultActionSupported; - } - - /** - * Specifies whether the set-default action is supported for onUpdate/onDelete - * in foreign keys. - * - * @param setDefaultActionSupported <code>true</code> if set-default is supported - */ - public void setSetDefaultActionSupported(boolean setDefaultActionSupported) - { - _setDefaultActionSupported = setDefaultActionSupported; } /** 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?rev=576220&r1=576219&r2=576220&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java Sun Sep 16 17:10:56 2007 @@ -1599,41 +1599,89 @@ } /** + * Creates the SQL for updating an object of the given type. If a concrete bean is given, + * then a concrete update statement is created, otherwise an update statement usable in a + * prepared statement is build. + * + * @param model The database model + * @param dynaClass The type + * @param primaryKeys The primary keys + * @param properties The properties to write + * @param bean Optionally the concrete bean to update + * @return The SQL required to update the instance + */ + protected String createUpdateSql(Database model, SqlDynaClass dynaClass, SqlDynaProperty[] primaryKeys, SqlDynaProperty[] properties, DynaBean oldBean, DynaBean newBean) + { + Table table = model.findTable(dynaClass.getTableName()); + HashMap oldColumnValues = toColumnValues(primaryKeys, oldBean); + HashMap newColumnValues = toColumnValues(properties, newBean); + + if (primaryKeys.length == 0) + { + _log.info("Cannot update instances of type " + dynaClass + " because it has no primary keys"); + return null; + } + else + { + return _builder.getUpdateSql(table, oldColumnValues, newColumnValues, newBean == null); + } + } + + /** * [EMAIL PROTECTED] */ public String getUpdateSql(Database model, DynaBean dynaBean) { - SqlDynaClass dynaClass = model.getDynaClassFor(dynaBean); - SqlDynaProperty[] primaryKeys = dynaClass.getPrimaryKeyProperties(); + SqlDynaClass dynaClass = model.getDynaClassFor(dynaBean); + SqlDynaProperty[] primaryKeys = dynaClass.getPrimaryKeyProperties(); + SqlDynaProperty[] nonPrimaryKeys = dynaClass.getNonPrimaryKeyProperties(); if (primaryKeys.length == 0) { _log.info("Cannot update instances of type " + dynaClass + " because it has no primary keys"); return null; } - - return createUpdateSql(model, dynaClass, primaryKeys, dynaClass.getNonPrimaryKeyProperties(), dynaBean); + else + { + return createUpdateSql(model, dynaClass, primaryKeys, nonPrimaryKeys, dynaBean); + } } /** * [EMAIL PROTECTED] */ - public void update(Connection connection, Database model, DynaBean oldDynaBean, DynaBean newDynaBean) throws DatabaseOperationException + public String getUpdateSql(Database model, DynaBean oldDynaBean, DynaBean newDynaBean) { - SqlDynaClass dynaClass = model.getDynaClassFor(oldDynaBean); - SqlDynaProperty[] primaryKeys = dynaClass.getPrimaryKeyProperties(); + SqlDynaClass dynaClass = model.getDynaClassFor(oldDynaBean); + SqlDynaProperty[] primaryKeys = dynaClass.getPrimaryKeyProperties(); + SqlDynaProperty[] nonPrimaryKeys = dynaClass.getNonPrimaryKeyProperties(); - if (!dynaClass.getTable().equals(model.getDynaClassFor(newDynaBean))) + if (primaryKeys.length == 0) { - throw new DatabaseOperationException("The old and new dyna beans need to be for the same table"); + _log.info("Cannot update instances of type " + dynaClass + " because it has no primary keys"); + return null; + } + else + { + return createUpdateSql(model, dynaClass, primaryKeys, nonPrimaryKeys, oldDynaBean, newDynaBean); } + } + + /** + * [EMAIL PROTECTED] + */ + public void update(Connection connection, Database model, DynaBean dynaBean) throws DatabaseOperationException + { + SqlDynaClass dynaClass = model.getDynaClassFor(dynaBean); + SqlDynaProperty[] primaryKeys = dynaClass.getPrimaryKeyProperties(); + if (primaryKeys.length == 0) { _log.info("Cannot update instances of type " + dynaClass + " because it has no primary keys"); return; } - SqlDynaProperty[] properties = dynaClass.getSqlDynaProperties(); + SqlDynaProperty[] properties = dynaClass.getNonPrimaryKeyProperties(); String sql = createUpdateSql(model, dynaClass, primaryKeys, properties, null); PreparedStatement statement = null; @@ -1651,11 +1699,11 @@ for (int idx = 0; idx < properties.length; idx++) { - setObject(statement, sqlIndex++, newDynaBean, properties[idx]); + setObject(statement, sqlIndex++, dynaBean, properties[idx]); } for (int idx = 0; idx < primaryKeys.length; idx++) { - setObject(statement, sqlIndex++, oldDynaBean, primaryKeys[idx]); + setObject(statement, sqlIndex++, dynaBean, primaryKeys[idx]); } int count = statement.executeUpdate(); @@ -1664,7 +1712,7 @@ if (count != 1) { - _log.warn("Attempted to insert a single row " + newDynaBean + + _log.warn("Attempted to insert a single row " + dynaBean + " into table " + dynaClass.getTableName() + " but changed " + count + " row(s)"); } @@ -1682,13 +1730,13 @@ /** * [EMAIL PROTECTED] */ - public void update(Database model, DynaBean oldDynaBean, DynaBean newDynaBean) throws DatabaseOperationException + public void update(Database model, DynaBean dynaBean) throws DatabaseOperationException { Connection connection = borrowConnection(); try { - update(connection, model, oldDynaBean, newDynaBean); + update(connection, model, dynaBean); } finally { @@ -1699,19 +1747,23 @@ /** * [EMAIL PROTECTED] */ - public void update(Connection connection, Database model, DynaBean dynaBean) throws DatabaseOperationException + public void update(Connection connection, Database model, DynaBean oldDynaBean, DynaBean newDynaBean) throws DatabaseOperationException { - SqlDynaClass dynaClass = model.getDynaClassFor(dynaBean); + SqlDynaClass dynaClass = model.getDynaClassFor(oldDynaBean); SqlDynaProperty[] primaryKeys = dynaClass.getPrimaryKeyProperties(); + if (!dynaClass.getTable().equals(model.getDynaClassFor(newDynaBean).getTable())) + { + throw new DatabaseOperationException("The old and new dyna beans need to be for the same table"); + } if (primaryKeys.length == 0) { _log.info("Cannot update instances of type " + dynaClass + " because it has no primary keys"); return; } - SqlDynaProperty[] properties = dynaClass.getNonPrimaryKeyProperties(); - String sql = createUpdateSql(model, dynaClass, primaryKeys, properties, null); + SqlDynaProperty[] properties = dynaClass.getSqlDynaProperties(); + String sql = createUpdateSql(model, dynaClass, primaryKeys, properties, null, null); PreparedStatement statement = null; if (_log.isDebugEnabled()) @@ -1728,11 +1780,11 @@ for (int idx = 0; idx < properties.length; idx++) { - setObject(statement, sqlIndex++, dynaBean, properties[idx]); + setObject(statement, sqlIndex++, newDynaBean, properties[idx]); } for (int idx = 0; idx < primaryKeys.length; idx++) { - setObject(statement, sqlIndex++, dynaBean, primaryKeys[idx]); + setObject(statement, sqlIndex++, oldDynaBean, primaryKeys[idx]); } int count = statement.executeUpdate(); @@ -1741,7 +1793,7 @@ if (count != 1) { - _log.warn("Attempted to insert a single row " + dynaBean + + _log.warn("Attempted to insert a single row " + newDynaBean + " into table " + dynaClass.getTableName() + " but changed " + count + " row(s)"); } @@ -1759,13 +1811,13 @@ /** * [EMAIL PROTECTED] */ - public void update(Database model, DynaBean dynaBean) throws DatabaseOperationException + public void update(Database model, DynaBean oldDynaBean, DynaBean newDynaBean) throws DatabaseOperationException { Connection connection = borrowConnection(); try { - update(connection, model, dynaBean); + update(connection, model, oldDynaBean, newDynaBean); } finally { 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?rev=576220&r1=576219&r2=576220&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java Sun Sep 16 17:10:56 2007 @@ -1526,7 +1526,61 @@ */ public String getUpdateSql(Table table, Map columnValues, boolean genPlaceholders) { - return getUpdateSql(table, columnValues, columnValues, genPlaceholders); + StringBuffer buffer = new StringBuffer("UPDATE "); + boolean addSep = false; + + buffer.append(getDelimitedIdentifier(getTableName(table))); + buffer.append(" SET "); + + for (int idx = 0; idx < table.getColumnCount(); idx++) + { + Column column = table.getColumn(idx); + + if (!column.isPrimaryKey() && columnValues.containsKey(column.getName())) + { + if (addSep) + { + buffer.append(", "); + } + buffer.append(getDelimitedIdentifier(column.getName())); + buffer.append(" = "); + if (genPlaceholders) + { + buffer.append("?"); + } + else + { + buffer.append(getValueAsString(column, columnValues.get(column.getName()))); + } + addSep = true; + } + } + buffer.append(" WHERE "); + addSep = false; + for (int idx = 0; idx < table.getColumnCount(); idx++) + { + Column column = table.getColumn(idx); + + if (column.isPrimaryKey() && columnValues.containsKey(column.getName())) + { + if (addSep) + { + buffer.append(" AND "); + } + buffer.append(getDelimitedIdentifier(column.getName())); + buffer.append(" = "); + if (genPlaceholders) + { + buffer.append("?"); + } + else + { + buffer.append(getValueAsString(column, columnValues.get(column.getName()))); + } + addSep = true; + } + } + return buffer.toString(); } /** @@ -1536,9 +1590,7 @@ * * @param table The table * @param oldColumnValues Contains the column values to identify the row to update - * @param columnValues Contains the values for the columns to update, and should also - * contain the primary key values to identify the object to update - * in case <code>genPlaceholders</code> is <code>false</code> + * @param newColumnValues Contains the values for the columns to update * @param genPlaceholders Whether to generate value placeholders for a * prepared statement (both for the pk values and the object values) * @return The update sql @@ -1555,7 +1607,7 @@ { Column column = table.getColumn(idx); - if (!column.isPrimaryKey() && newColumnValues.containsKey(column.getName())) + if (newColumnValues.containsKey(column.getName())) { if (addSep) { @@ -1580,7 +1632,7 @@ { Column column = table.getColumn(idx); - if (column.isPrimaryKey() && oldColumnValues.containsKey(column.getName())) + if (oldColumnValues.containsKey(column.getName())) { if (addSep) { @@ -2599,6 +2651,9 @@ case CascadeActionEnum.VALUE_SET_NULL: print("SET NULL"); break; + case CascadeActionEnum.VALUE_SET_DEFAULT: + print("SET DEFAULT"); + break; case CascadeActionEnum.VALUE_RESTRICT: print("RESTRICT"); break; @@ -2630,6 +2685,9 @@ break; case CascadeActionEnum.VALUE_SET_NULL: print("SET NULL"); + break; + case CascadeActionEnum.VALUE_SET_DEFAULT: + print("SET DEFAULT"); break; case CascadeActionEnum.VALUE_RESTRICT: print("RESTRICT"); Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java?rev=576220&r1=576219&r2=576220&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java Sun Sep 16 17:10:56 2007 @@ -51,7 +51,6 @@ public DerbyPlatform() { super(); - getPlatformInfo().setSetDefaultActionSupported(false); getPlatformInfo().addNativeTypeMapping(Types.DOUBLE, "DOUBLE"); getPlatformInfo().addNativeTypeMapping(Types.FLOAT, "DOUBLE", Types.DOUBLE); setSqlBuilder(new DerbyBuilder(this)); Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestConstraints.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestConstraints.java?rev=576220&r1=576219&r2=576220&view=diff ============================================================================== --- db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestConstraints.java (original) +++ db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestConstraints.java Sun Sep 16 17:10:56 2007 @@ -25,6 +25,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.ddlutils.DdlUtilsException; import org.apache.ddlutils.model.Database; +import org.apache.ddlutils.platform.derby.DerbyPlatform; import org.apache.ddlutils.platform.sybase.SybasePlatform; import junit.framework.Test; @@ -580,7 +581,7 @@ */ public void testForeignKeyWithOnDeleteSetDefault() { - if (getPlatformInfo().isSetDefaultActionSupported()) + if (!DerbyPlatform.DATABASENAME.equals(getPlatform().getName())) { final String modelXml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ @@ -590,7 +591,7 @@ " </table>\n"+ " <table name='roundtrip_2'>\n"+ " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ - " <column name='avalue' type='INTEGER' required='false' default='0'/>\n"+ + " <column name='avalue' type='INTEGER' required='false' default='2'/>\n"+ " <foreign-key foreignTable='roundtrip_1' onDelete='setdefault'>\n"+ " <reference local='avalue' foreign='pk'/>\n"+ " </foreign-key>\n"+ @@ -600,14 +601,16 @@ performConstraintsTest(modelXml, true); insertRow("roundtrip_1", new Object[] { new Integer(1) }); + insertRow("roundtrip_1", new Object[] { new Integer(2) }); insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) }); List beansTable1 = getRows("roundtrip_1"); List beansTable2 = getRows("roundtrip_2"); - assertEquals(1, beansTable1.size()); + assertEquals(2, beansTable1.size()); assertEquals(1, beansTable2.size()); assertEquals(new Integer(1), beansTable1.get(0), "pk"); + assertEquals(new Integer(2), beansTable1.get(1), "pk"); assertEquals(new Integer(5), beansTable2.get(0), "pk"); assertEquals(new Integer(1), beansTable2.get(0), "avalue"); @@ -616,10 +619,11 @@ beansTable1 = getRows("roundtrip_1"); beansTable2 = getRows("roundtrip_2"); - assertEquals(0, beansTable1.size()); + assertEquals(1, beansTable1.size()); assertEquals(1, beansTable2.size()); + assertEquals(new Integer(2), beansTable1.get(0), "pk"); assertEquals(new Integer(5), beansTable2.get(0), "pk"); - assertEquals(new Integer(0), beansTable2.get(0), "avalue"); + assertEquals(new Integer(2), beansTable2.get(0), "avalue"); } } @@ -671,45 +675,48 @@ */ public void testForeignKeyWithOnUpdateCascade() { - final String modelXml = - "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ - "<database name='roundtriptest'>\n"+ - " <table name='roundtrip_1'>\n"+ - " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ - " </table>\n"+ - " <table name='roundtrip_2'>\n"+ - " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ - " <column name='avalue' type='INTEGER' required='true'/>\n"+ - " <foreign-key foreignTable='roundtrip_1' onUpdate='cascade'>\n"+ - " <reference local='avalue' foreign='pk'/>\n"+ - " </foreign-key>\n"+ - " </table>\n"+ - "</database>"; - - performConstraintsTest(modelXml, true); - - insertRow("roundtrip_1", new Object[] { new Integer(1) }); - insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) }); - - List beansTable1 = getRows("roundtrip_1"); - List beansTable2 = getRows("roundtrip_2"); - - assertEquals(1, beansTable1.size()); - assertEquals(1, beansTable2.size()); - assertEquals(new Integer(1), beansTable1.get(0), "pk"); - assertEquals(new Integer(5), beansTable2.get(0), "pk"); - assertEquals(new Integer(1), beansTable2.get(0), "avalue"); - - updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(2) }); - - beansTable1 = getRows("roundtrip_1"); - beansTable2 = getRows("roundtrip_2"); - - assertEquals(1, beansTable1.size()); - assertEquals(1, beansTable2.size()); - assertEquals(new Integer(2), beansTable1.get(0), "pk"); - assertEquals(new Integer(5), beansTable2.get(0), "pk"); - assertEquals(new Integer(2), beansTable2.get(0), "avalue"); + if (!DerbyPlatform.DATABASENAME.equals(getPlatform().getName())) + { + final String modelXml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip_1'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + " <table name='roundtrip_2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER' required='true'/>\n"+ + " <foreign-key foreignTable='roundtrip_1' onUpdate='cascade'>\n"+ + " <reference local='avalue' foreign='pk'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + + performConstraintsTest(modelXml, true); + + insertRow("roundtrip_1", new Object[] { new Integer(1) }); + insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) }); + + List beansTable1 = getRows("roundtrip_1"); + List beansTable2 = getRows("roundtrip_2"); + + assertEquals(1, beansTable1.size()); + assertEquals(1, beansTable2.size()); + assertEquals(new Integer(1), beansTable1.get(0), "pk"); + assertEquals(new Integer(5), beansTable2.get(0), "pk"); + assertEquals(new Integer(1), beansTable2.get(0), "avalue"); + + updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(2) }); + + beansTable1 = getRows("roundtrip_1"); + beansTable2 = getRows("roundtrip_2"); + + assertEquals(1, beansTable1.size()); + assertEquals(1, beansTable2.size()); + assertEquals(new Integer(2), beansTable1.get(0), "pk"); + assertEquals(new Integer(5), beansTable2.get(0), "pk"); + assertEquals(new Integer(2), beansTable2.get(0), "avalue"); + } } /** @@ -717,45 +724,48 @@ */ public void testForeignKeyWithOnUpdateSetNull() { - final String modelXml = - "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ - "<database name='roundtriptest'>\n"+ - " <table name='roundtrip_1'>\n"+ - " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ - " </table>\n"+ - " <table name='roundtrip_2'>\n"+ - " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ - " <column name='avalue' type='INTEGER' required='false'/>\n"+ - " <foreign-key foreignTable='roundtrip_1' onUpdate='setnull'>\n"+ - " <reference local='avalue' foreign='pk'/>\n"+ - " </foreign-key>\n"+ - " </table>\n"+ - "</database>"; - - performConstraintsTest(modelXml, true); - - insertRow("roundtrip_1", new Object[] { new Integer(1) }); - insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) }); - - List beansTable1 = getRows("roundtrip_1"); - List beansTable2 = getRows("roundtrip_2"); - - assertEquals(1, beansTable1.size()); - assertEquals(1, beansTable2.size()); - assertEquals(new Integer(1), beansTable1.get(0), "pk"); - assertEquals(new Integer(5), beansTable2.get(0), "pk"); - assertEquals(new Integer(1), beansTable2.get(0), "avalue"); - - updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(2) }); - - beansTable1 = getRows("roundtrip_1"); - beansTable2 = getRows("roundtrip_2"); - - assertEquals(1, beansTable1.size()); - assertEquals(1, beansTable2.size()); - assertEquals(new Integer(2), beansTable1.get(0), "pk"); - assertEquals(new Integer(5), beansTable2.get(0), "pk"); - assertEquals((Object)null, beansTable2.get(0), "avalue"); + if (!DerbyPlatform.DATABASENAME.equals(getPlatform().getName())) + { + final String modelXml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip_1'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + " <table name='roundtrip_2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER' required='false'/>\n"+ + " <foreign-key foreignTable='roundtrip_1' onUpdate='setnull'>\n"+ + " <reference local='avalue' foreign='pk'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + + performConstraintsTest(modelXml, true); + + insertRow("roundtrip_1", new Object[] { new Integer(1) }); + insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) }); + + List beansTable1 = getRows("roundtrip_1"); + List beansTable2 = getRows("roundtrip_2"); + + assertEquals(1, beansTable1.size()); + assertEquals(1, beansTable2.size()); + assertEquals(new Integer(1), beansTable1.get(0), "pk"); + assertEquals(new Integer(5), beansTable2.get(0), "pk"); + assertEquals(new Integer(1), beansTable2.get(0), "avalue"); + + updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(2) }); + + beansTable1 = getRows("roundtrip_1"); + beansTable2 = getRows("roundtrip_2"); + + assertEquals(1, beansTable1.size()); + assertEquals(1, beansTable2.size()); + assertEquals(new Integer(2), beansTable1.get(0), "pk"); + assertEquals(new Integer(5), beansTable2.get(0), "pk"); + assertEquals((Object)null, beansTable2.get(0), "avalue"); + } } /** @@ -763,9 +773,9 @@ */ public void testForeignKeyWithOnUpdateSetDefault() { - if (getPlatformInfo().isSetDefaultActionSupported()) + if (!DerbyPlatform.DATABASENAME.equals(getPlatform().getName())) { - final String modelXml = + final String modelXml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ "<database name='roundtriptest'>\n"+ " <table name='roundtrip_1'>\n"+ @@ -773,7 +783,7 @@ " </table>\n"+ " <table name='roundtrip_2'>\n"+ " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ - " <column name='avalue' type='INTEGER' required='false' default='2'/>\n"+ + " <column name='avalue' type='INTEGER' required='false' default='1'/>\n"+ " <foreign-key foreignTable='roundtrip_1' onUpdate='setdefault'>\n"+ " <reference local='avalue' foreign='pk'/>\n"+ " </foreign-key>\n"+ @@ -784,7 +794,7 @@ insertRow("roundtrip_1", new Object[] { new Integer(1) }); insertRow("roundtrip_1", new Object[] { new Integer(2) }); - insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) }); + insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(2) }); List beansTable1 = getRows("roundtrip_1"); List beansTable2 = getRows("roundtrip_2"); @@ -794,19 +804,19 @@ assertEquals(new Integer(1), beansTable1.get(0), "pk"); assertEquals(new Integer(2), beansTable1.get(1), "pk"); assertEquals(new Integer(5), beansTable2.get(0), "pk"); - assertEquals(new Integer(1), beansTable2.get(0), "avalue"); + assertEquals(new Integer(2), beansTable2.get(0), "avalue"); - updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(0) }); + updateRow("roundtrip_1", (DynaBean)beansTable1.get(1), new Object[] { new Integer(0) }); beansTable1 = getRows("roundtrip_1"); beansTable2 = getRows("roundtrip_2"); assertEquals(2, beansTable1.size()); assertEquals(1, beansTable2.size()); - assertEquals(new Integer(0), beansTable1.get(0), "pk"); - assertEquals(new Integer(2), beansTable1.get(1), "pk"); + assertEquals(new Integer(1), beansTable1.get(0), "pk"); + assertEquals(new Integer(0), beansTable1.get(1), "pk"); assertEquals(new Integer(5), beansTable2.get(0), "pk"); - assertEquals(new Integer(2), beansTable2.get(0), "avalue"); + assertEquals(new Integer(1), beansTable2.get(0), "avalue"); } } } Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestSqlBuilder.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestSqlBuilder.java?rev=576220&r1=576219&r2=576220&view=diff ============================================================================== --- db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestSqlBuilder.java (original) +++ db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestSqlBuilder.java Sun Sep 16 17:10:56 2007 @@ -36,7 +36,7 @@ /** * Tests the [EMAIL PROTECTED] SqlBuilder#getUpdateSql(Table, Map, boolean)} method. */ - public void testUpdateSql() + public void testUpdateSql1() { final String modelXml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ @@ -60,6 +60,39 @@ String sql = sqlBuilder.getUpdateSql(database.getTable(0), map, false); assertEquals("UPDATE \"TestTable\" SET \"name\" = 'ddlutils' WHERE \"id\" = '0'", + sql); + } + + /** + * Tests the [EMAIL PROTECTED] SqlBuilder#getUpdateSql(Table, Map, Map, boolean)} method. + */ + public void testUpdateSql2() + { + final String modelXml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='ddlutils'>\n"+ + " <table name='TestTable'>\n"+ + " <column name='id' autoIncrement='true' type='INTEGER' primaryKey='true'/>\n"+ + " <column name='name' type='VARCHAR' size='15'/>\n"+ + " </table>\n"+ + "</database>"; + + TestPlatform platform = new TestPlatform(); + SqlBuilder sqlBuilder = platform.getSqlBuilder(); + Database database = parseDatabaseFromString(modelXml); + Map oldMap = new HashMap(); + Map newMap = new HashMap(); + + oldMap.put("id", new Integer(0)); + + newMap.put("name", "ddlutils"); + newMap.put("id", new Integer(1)); + + platform.setDelimitedIdentifierModeOn(true); + + String sql = sqlBuilder.getUpdateSql(database.getTable(0), oldMap, newMap, false); + + assertEquals("UPDATE \"TestTable\" SET \"id\" = '1', \"name\" = 'ddlutils' WHERE \"id\" = '0'", sql); } }