Author: tomdz Date: Wed Jul 19 23:20:09 2006 New Revision: 423799 URL: http://svn.apache.org/viewvc?rev=423799&view=rev Log: Introduced unique identifiers to the drop constraint part so that textual SQL scripts containing multiple table drops execute in one batch
Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybaseBuilder.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?rev=423799&r1=423798&r2=423799&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 Wed Jul 19 23:20:09 2006 @@ -18,6 +18,7 @@ import java.io.IOException; import java.io.Writer; +import java.rmi.server.UID; import java.sql.Types; import java.text.DateFormat; import java.text.NumberFormat; @@ -2813,5 +2814,16 @@ protected void printIndent() throws IOException { print(getIndent()); + } + + /** + * Creates a reasonably unique identifier only consisting of hexadecimal characters and underscores. + * It looks like <code>d578271282b42fce__2955b56e_107df3fbc96__8000</code> and is 48 characters long. + * + * @return The identifier + */ + protected String createUniqueIdentifier() + { + return new UID().toString().replace(':', '_').replace('-', '_'); } } Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java?rev=423799&r1=423798&r2=423799&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java Wed Jul 19 23:20:09 2006 @@ -103,25 +103,27 @@ */ public void dropTable(Table table) throws IOException { - String tableName = getTableName(table); + String tableName = getTableName(table); + String tableNameVar = "tn" + createUniqueIdentifier(); + String constraintNameVar = "cn" + createUniqueIdentifier(); writeQuotationOnStatement(); print("IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name = "); printAlwaysSingleQuotedIdentifier(tableName); println(")"); println("BEGIN"); - println(" DECLARE @tablename nvarchar(256), @constraintname nvarchar(256)"); + println(" DECLARE @" + tableNameVar + " nvarchar(256), @" + constraintNameVar + " nvarchar(256)"); println(" DECLARE refcursor CURSOR FOR"); println(" SELECT object_name(objs.parent_obj) tablename, objs.name constraintname"); println(" FROM sysobjects objs JOIN sysconstraints cons ON objs.id = cons.constid"); print(" WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) = "); printAlwaysSingleQuotedIdentifier(tableName); println(" OPEN refcursor"); - println(" FETCH NEXT FROM refcursor INTO @tablename, @constraintname"); + println(" FETCH NEXT FROM refcursor INTO @" + tableNameVar + ", @" + constraintNameVar); println(" WHILE @@FETCH_STATUS = 0"); println(" BEGIN"); - println(" EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT '[EMAIL PROTECTED])"); - println(" FETCH NEXT FROM refcursor INTO @tablename, @constraintname"); + println(" EXEC ('ALTER TABLE '+@" + tableNameVar + "+' DROP CONSTRAINT '+@" + constraintNameVar + ")"); + println(" FETCH NEXT FROM refcursor INTO @" + tableNameVar + ", @" + constraintNameVar); println(" END"); println(" CLOSE refcursor"); println(" DEALLOCATE refcursor"); @@ -485,21 +487,23 @@ { // TODO: this would be easier when named primary keys are supported // because then we can use ALTER TABLE DROP - String tableName = getTableName(change.getChangedTable()); + String tableName = getTableName(change.getChangedTable()); + String tableNameVar = "tn" + createUniqueIdentifier(); + String constraintNameVar = "cn" + createUniqueIdentifier(); println("BEGIN"); - println(" DECLARE @tablename nvarchar(256), @constraintname nvarchar(256)"); + println(" DECLARE @" + tableNameVar + " nvarchar(256), @" + constraintNameVar + " nvarchar(256)"); println(" DECLARE refcursor CURSOR FOR"); println(" SELECT object_name(objs.parent_obj) tablename, objs.name constraintname"); println(" FROM sysobjects objs JOIN sysconstraints cons ON objs.id = cons.constid"); print(" WHERE objs.xtype = 'PK' AND object_name(objs.parent_obj) = "); printAlwaysSingleQuotedIdentifier(tableName); println(" OPEN refcursor"); - println(" FETCH NEXT FROM refcursor INTO @tablename, @constraintname"); + println(" FETCH NEXT FROM refcursor INTO @" + tableNameVar + ", @" + constraintNameVar); println(" WHILE @@FETCH_STATUS = 0"); println(" BEGIN"); - println(" EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT '[EMAIL PROTECTED])"); - println(" FETCH NEXT FROM refcursor INTO @tablename, @constraintname"); + println(" EXEC ('ALTER TABLE '+@" + tableNameVar + "+' DROP CONSTRAINT '+@" + constraintNameVar + ")"); + println(" FETCH NEXT FROM refcursor INTO @" + tableNameVar + ", @" + constraintNameVar); println(" END"); println(" CLOSE refcursor"); println(" DEALLOCATE refcursor"); @@ -533,11 +537,13 @@ if (hasDefault) { // we're dropping the old default - String tableName = getTableName(sourceTable); - String columnName = getColumnName(sourceColumn); + String tableName = getTableName(sourceTable); + String columnName = getColumnName(sourceColumn); + String tableNameVar = "tn" + createUniqueIdentifier(); + String constraintNameVar = "cn" + createUniqueIdentifier(); println("BEGIN"); - println(" DECLARE @tablename nvarchar(256), @constraintname nvarchar(256)"); + println(" DECLARE @" + tableNameVar + " nvarchar(256), @" + constraintNameVar + " nvarchar(256)"); println(" DECLARE refcursor CURSOR FOR"); println(" SELECT object_name(objs.parent_obj) tablename, objs.name constraintname"); println(" FROM sysobjects objs JOIN sysconstraints cons ON objs.id = cons.constid"); @@ -550,11 +556,11 @@ print(" object_name(objs.parent_obj) = "); printAlwaysSingleQuotedIdentifier(tableName); println(" OPEN refcursor"); - println(" FETCH NEXT FROM refcursor INTO @tablename, @constraintname"); + println(" FETCH NEXT FROM refcursor INTO @" + tableNameVar + ", @" + constraintNameVar); println(" WHILE @@FETCH_STATUS = 0"); println(" BEGIN"); - println(" EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT '[EMAIL PROTECTED])"); - println(" FETCH NEXT FROM refcursor INTO @tablename, @constraintname"); + println(" EXEC ('ALTER TABLE '+@" + tableNameVar + "+' DROP CONSTRAINT '+@" + constraintNameVar + ")"); + println(" FETCH NEXT FROM refcursor INTO @" + tableNameVar + ", @" + constraintNameVar); println(" END"); println(" CLOSE refcursor"); println(" DEALLOCATE refcursor"); Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybaseBuilder.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybaseBuilder.java?rev=423799&r1=423798&r2=423799&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybaseBuilder.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/sybase/SybaseBuilder.java Wed Jul 19 23:20:09 2006 @@ -478,22 +478,24 @@ { // TODO: this would be easier when named primary keys are supported // because then we can use ALTER TABLE DROP - String tableName = getTableName(change.getChangedTable()); + String tableName = getTableName(change.getChangedTable()); + String tableNameVar = "tn" + createUniqueIdentifier(); + String constraintNameVar = "cn" + createUniqueIdentifier(); println("BEGIN"); - println(" DECLARE @tablename nvarchar(60), @constraintname nvarchar(60)"); + println(" DECLARE @" + tableNameVar + " nvarchar(60), @" + constraintNameVar + " nvarchar(60)"); println(" WHILE EXISTS(SELECT sysindexes.name"); println(" FROM sysindexes, sysobjects"); print(" WHERE sysobjects.name = "); printAlwaysSingleQuotedIdentifier(tableName); println(" AND sysobjects.id = sysindexes.id AND (sysindexes.status & 2048) > 0)"); println(" BEGIN"); - println(" SELECT @tablename = sysobjects.name, @constraintname = sysindexes.name"); + println(" SELECT @" + tableNameVar + " = sysobjects.name, @" + constraintNameVar + " = sysindexes.name"); println(" FROM sysindexes, sysobjects"); print(" WHERE sysobjects.name = "); printAlwaysSingleQuotedIdentifier(tableName); print(" AND sysobjects.id = sysindexes.id AND (sysindexes.status & 2048) > 0"); - println(" EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT '[EMAIL PROTECTED])"); + println(" EXEC ('ALTER TABLE '+@" + tableNameVar + "+' DROP CONSTRAINT '+@" + constraintNameVar + ")"); println(" END"); print("END"); printEndOfStatement();