Author: tomdz Date: Sat Mar 8 11:08:09 2008 New Revision: 635049 URL: http://svn.apache.org/viewvc?rev=635049&view=rev Log: Implementation of DDLUTILS-180: DropAllTables command
Added: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DropTablesCommand.java db/ddlutils/trunk/src/test/org/apache/ddlutils/task/ db/ddlutils/trunk/src/test/org/apache/ddlutils/task/TestDropTablesCommand.java db/ddlutils/trunk/src/test/org/apache/ddlutils/task/TestTaskBase.java Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/model/Database.java db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseToDdlTask.java Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/model/Database.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/model/Database.java?rev=635049&r1=635048&r2=635049&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/model/Database.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/model/Database.java Sat Mar 8 11:08:09 2008 @@ -57,6 +57,22 @@ private transient DynaClassCache _dynaClassCache = null; /** + * Creates an empty model without a name. + */ + public Database() + {} + + /** + * Creates an empty model with the given name. + * + * @param name The name + */ + public Database(String name) + { + _name = name; + } + + /** * Adds all tables from the other database to this database. * Note that the other database is not changed. * Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseToDdlTask.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseToDdlTask.java?rev=635049&r1=635048&r2=635049&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseToDdlTask.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseToDdlTask.java Sat Mar 8 11:08:09 2008 @@ -140,6 +140,16 @@ } /** + * Adds the "drop tables"-command. + * + * @param command The command + */ + public void addDropTables(DropTablesCommand command) + { + addCommand(command); + } + + /** * Returns the table types to recognize. * * @return The table types Added: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DropTablesCommand.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DropTablesCommand.java?rev=635049&view=auto ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DropTablesCommand.java (added) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DropTablesCommand.java Sat Mar 8 11:08:09 2008 @@ -0,0 +1,69 @@ +package org.apache.ddlutils.task; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.commons.dbcp.BasicDataSource; +import org.apache.ddlutils.Platform; +import org.apache.ddlutils.model.Database; +import org.apache.tools.ant.BuildException; + +/** + * Sub task for dropping tables. + * + * @version $Revision: $ + * @ant.task name="dropTables" + */ +public class DropTablesCommand extends DatabaseCommand +{ + /** + * [EMAIL PROTECTED] + */ + public boolean isRequiringModel() + { + return true; + } + + /** + * [EMAIL PROTECTED] + */ + public void execute(DatabaseTaskBase task, Database model) throws BuildException + { + BasicDataSource dataSource = getDataSource(); + + if (dataSource == null) + { + throw new BuildException("No database specified."); + } + + Platform platform = getPlatform(); + Database targetModel = new Database(); + + try + { + platform.alterModel(model, targetModel, isFailOnError()); + + _log.info("Dropped tables"); + } + catch (Exception ex) + { + handleException(ex, ex.getMessage()); + } + } +} Added: db/ddlutils/trunk/src/test/org/apache/ddlutils/task/TestDropTablesCommand.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/task/TestDropTablesCommand.java?rev=635049&view=auto ============================================================================== --- db/ddlutils/trunk/src/test/org/apache/ddlutils/task/TestDropTablesCommand.java (added) +++ db/ddlutils/trunk/src/test/org/apache/ddlutils/task/TestDropTablesCommand.java Sat Mar 8 11:08:09 2008 @@ -0,0 +1,257 @@ +package org.apache.ddlutils.task; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.ddlutils.model.Database; + +/** + * Tests the dropTables sub task. + * + * @version $Revision: $ + */ +public class TestDropTablesCommand extends TestTaskBase +{ + /** + * Tests the task against an empty database. + */ + public void testEmptyDatabase() + { + DatabaseToDdlTask task = getDatabaseToDdlTaskInstance(); + + task.addDropTables(new DropTablesCommand()); + task.execute(); + + assertEquals(new Database("roundtriptest"), + readModelFromDatabase("roundtriptest")); + } + + /** + * Tests the removal of a single table. + */ + public void testSingleTable() + { + final String modelXml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(modelXml); + + DatabaseToDdlTask task = getDatabaseToDdlTaskInstance(); + + task.addDropTables(new DropTablesCommand()); + task.execute(); + + assertEquals(new Database("roundtriptest"), + readModelFromDatabase("roundtriptest")); + } + + /** + * Tests the removal of a single table with an auto increment column. + */ + public void testSingleTableWithAutoIncrementColumn() + { + final String modelXml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true' autoIncrement='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(modelXml); + + DatabaseToDdlTask task = getDatabaseToDdlTaskInstance(); + + task.addDropTables(new DropTablesCommand()); + task.execute(); + + assertEquals(new Database("roundtriptest"), + readModelFromDatabase("roundtriptest")); + } + + /** + * Tests the removal of a single table with an index. + */ + public void testSingleTableWithIndex() + { + if (!getPlatformInfo().isIndicesSupported()) + { + return; + } + + final String modelXml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true' autoIncrement='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " <index name='test'>\n"+ + " <index-column name='avalue'/>\n"+ + " </index>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(modelXml); + + DatabaseToDdlTask task = getDatabaseToDdlTaskInstance(); + + task.addDropTables(new DropTablesCommand()); + task.execute(); + + assertEquals(new Database("roundtriptest"), + readModelFromDatabase("roundtriptest")); + } + + /** + * Tests the removal of a single table with a unique index. + */ + public void testSingleTableWithUniqeIndex() + { + if (!getPlatformInfo().isIndicesSupported()) + { + return; + } + + final String modelXml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true' autoIncrement='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " <unique name='test'>\n"+ + " <unique-column name='avalue'/>\n"+ + " </unique>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(modelXml); + + DatabaseToDdlTask task = getDatabaseToDdlTaskInstance(); + + task.addDropTables(new DropTablesCommand()); + task.execute(); + + assertEquals(new Database("roundtriptest"), + readModelFromDatabase("roundtriptest")); + } + + /** + * Tests the removal of a table with a self-referencing foreign key. + */ + public void testSingleTablesWithSelfReferencingFK() + { + final String modelXml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " <foreign-key foreignTable='roundtrip'>\n"+ + " <reference local='avalue' foreign='pk'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(modelXml); + + DatabaseToDdlTask task = getDatabaseToDdlTaskInstance(); + + task.addDropTables(new DropTablesCommand()); + task.execute(); + + assertEquals(new Database("roundtriptest"), + readModelFromDatabase("roundtriptest")); + } + + /** + * Tests the removal of two tables with a foreign key between them. + */ + public void testTwoTablesWithFK() + { + final String modelXml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='pk' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='VARCHAR' size='32'/>\n"+ + " <foreign-key foreignTable='roundtrip1'>\n"+ + " <reference local='avalue' foreign='pk'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(modelXml); + + DatabaseToDdlTask task = getDatabaseToDdlTaskInstance(); + + task.addDropTables(new DropTablesCommand()); + task.execute(); + + assertEquals(new Database("roundtriptest"), + readModelFromDatabase("roundtriptest")); + } + + /** + * Tests the removal of two tables with circular foreign keys between them. + */ + public void testTwoTablesWithCircularFK() + { + final String modelXml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='pk' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " <foreign-key foreignTable='roundtrip2'>\n"+ + " <reference local='avalue' foreign='pk'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='VARCHAR' size='32'/>\n"+ + " <foreign-key foreignTable='roundtrip1'>\n"+ + " <reference local='avalue' foreign='pk'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(modelXml); + + DatabaseToDdlTask task = getDatabaseToDdlTaskInstance(); + + task.addDropTables(new DropTablesCommand()); + task.execute(); + + assertEquals(new Database("roundtriptest"), + readModelFromDatabase("roundtriptest")); + } + + // circular fks +} Added: db/ddlutils/trunk/src/test/org/apache/ddlutils/task/TestTaskBase.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/task/TestTaskBase.java?rev=635049&view=auto ============================================================================== --- db/ddlutils/trunk/src/test/org/apache/ddlutils/task/TestTaskBase.java (added) +++ db/ddlutils/trunk/src/test/org/apache/ddlutils/task/TestTaskBase.java Sat Mar 8 11:08:09 2008 @@ -0,0 +1,47 @@ +package org.apache.ddlutils.task; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.commons.dbcp.BasicDataSource; +import org.apache.ddlutils.TestDatabaseWriterBase; +import org.apache.tools.ant.Project; + +/** + * Base class for ant task tests. + * + * @version $Revision: $ + */ +public abstract class TestTaskBase extends TestDatabaseWriterBase +{ + /** + * Returns an instance of the [EMAIL PROTECTED] DatabaseToDdlTask}, already configured with + * a project and the tested database. + * + * @return The task object + */ + protected DatabaseToDdlTask getDatabaseToDdlTaskInstance() + { + DatabaseToDdlTask task = new DatabaseToDdlTask(); + + task.setProject(new Project()); + task.addConfiguredDatabase((BasicDataSource)getDataSource()); + return task; + } +}