Return-Path: Delivered-To: apmail-db-ddlutils-dev-archive@www.apache.org Received: (qmail 87820 invoked from network); 2 May 2006 20:19:30 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 2 May 2006 20:19:30 -0000 Received: (qmail 82849 invoked by uid 500); 2 May 2006 20:19:29 -0000 Delivered-To: apmail-db-ddlutils-dev-archive@db.apache.org Received: (qmail 82824 invoked by uid 500); 2 May 2006 20:19:28 -0000 Mailing-List: contact ddlutils-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: ddlutils-dev@db.apache.org Delivered-To: mailing list ddlutils-dev@db.apache.org Received: (qmail 82813 invoked by uid 500); 2 May 2006 20:19:28 -0000 Delivered-To: apmail-db-ddlutils-commits@db.apache.org Received: (qmail 82810 invoked by uid 99); 2 May 2006 20:19:28 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 02 May 2006 13:19:28 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Tue, 02 May 2006 13:19:27 -0700 Received: (qmail 87635 invoked by uid 65534); 2 May 2006 20:19:07 -0000 Message-ID: <20060502201907.87629.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r399036 - in /db/ddlutils/trunk/src: java/org/apache/ddlutils/platform/SqlBuilder.java test/org/apache/ddlutils/alteration/TestAlterationAlgorithm.java Date: Tue, 02 May 2006 20:19:05 -0000 To: ddlutils-commits@db.apache.org From: tomdz@apache.org X-Mailer: svnmailer-1.0.8 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: tomdz Date: Tue May 2 13:19:04 2006 New Revision: 399036 URL: http://svn.apache.org/viewcvs?rev=399036&view=rev Log: Finished initial implementation of the new alteration algorithm Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestAlterationAlgorithm.java Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java?rev=399036&r1=399035&r2=399036&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 Tue May 2 13:19:04 2006 @@ -27,6 +27,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; import org.apache.commons.collections.Closure; import org.apache.commons.collections.CollectionUtils; @@ -616,6 +617,9 @@ } changesForTable.add(change); } + // we also need to drop the foreign keys of the unchanged tables referencing the changed tables + addRelevantFKsFromUnchangedTables(currentModel, desiredModel, changesPerTable.keySet(), unchangedFKs); + // we're dropping the unchanged foreign keys for (Iterator tableFKIt = unchangedFKs.entrySet().iterator(); tableFKIt.hasNext();) { @@ -677,6 +681,60 @@ } } return unchangedFKs; + } + + /** + * Adds the foreign keys of the unchanged tables that reference changed tables + * to the given map. + * + * @param currentModel The current model + * @param desiredModel The desired model + * @param namesOfKnownChangedTables The known names of changed tables + * @param fksPerTable The map table name -> foreign keys to which + * found foreign keys will be added to + */ + private void addRelevantFKsFromUnchangedTables(Database currentModel, + Database desiredModel, + Set namesOfKnownChangedTables, + Map fksPerTable) + { + boolean caseSensitive = getPlatform().isDelimitedIdentifierModeOn(); + + for (int tableIdx = 0; tableIdx < desiredModel.getTableCount(); tableIdx++) + { + Table targetTable = desiredModel.getTable(tableIdx); + String name = targetTable.getName(); + Table sourceTable = currentModel.findTable(name, caseSensitive); + List relevantFks = null; + + if (!caseSensitive) + { + name = name.toUpperCase(); + } + if ((sourceTable != null) && !namesOfKnownChangedTables.contains(name)) + { + for (int fkIdx = 0; fkIdx < targetTable.getForeignKeyCount(); fkIdx++) + { + ForeignKey targetFk = targetTable.getForeignKey(fkIdx); + ForeignKey sourceFk = sourceTable.findForeignKey(targetFk, caseSensitive); + String refName = targetFk.getForeignTable().getName(); + + if (!caseSensitive) + { + refName = refName.toUpperCase(); + } + if ((sourceFk != null) && namesOfKnownChangedTables.contains(refName)) + { + if (relevantFks == null) + { + relevantFks = new ArrayList(); + fksPerTable.put(name, relevantFks); + } + relevantFks.add(targetFk); + } + } + } + } } /** Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestAlterationAlgorithm.java URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestAlterationAlgorithm.java?rev=399036&r1=399035&r2=399036&view=diff ============================================================================== --- db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestAlterationAlgorithm.java (original) +++ db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestAlterationAlgorithm.java Tue May 2 13:19:04 2006 @@ -1320,6 +1320,7 @@ "CREATE TABLE \"TableA_\"\n"+ "(\n"+ " \"ColPK\" INTEGER NOT NULL,\n"+ + " \"Col\" DOUBLE,\n"+ " PRIMARY KEY (\"ColPK\")\n"+ ");\n"+ "INSERT INTO \"TableA_\" (\"ColPK\") SELECT \"ColPK\" FROM \"TableA\";\n"+ @@ -2464,22 +2465,6 @@ ");\n"+ "INSERT INTO \"TableA\" (\"ColPK\") SELECT \"ColPK\" FROM \"TableA_\";\n"+ "DROP TABLE \"TableA_\";\n"+ - "CREATE TABLE \"TABLEB_\"\n"+ - "(\n"+ - " \"COLPK\" INTEGER NOT NULL,\n"+ - " \"COLFK\" INTEGER,\n"+ - " PRIMARY KEY (\"COLPK\")\n"+ - ");\n"+ - "INSERT INTO \"TABLEB_\" (\"COLPK\",\"COLFK\") SELECT \"COLPK\",\"COLFK\" FROM \"TABLEB\";\n"+ - "DROP TABLE \"TABLEB\";\n"+ - "CREATE TABLE \"TABLEB\"\n"+ - "(\n"+ - " \"COLPK\" INTEGER NOT NULL,\n"+ - " \"COLFK\" INTEGER,\n"+ - " PRIMARY KEY (\"COLPK\")\n"+ - ");\n"+ - "INSERT INTO \"TABLEB\" (\"COLPK\",\"COLFK\") SELECT \"COLPK\",\"COLFK\" FROM \"TABLEB_\";\n"+ - "DROP TABLE \"TABLEB_\";\n"+ "ALTER TABLE \"TABLEB\" ADD CONSTRAINT \"TESTFK\" FOREIGN KEY (\"COLFK\") REFERENCES \"TableA\" (\"ColPK\");\n", getAlterDatabaseSQL(MODEL1, MODEL2)); }