db-ddlutils-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From to...@apache.org
Subject svn commit: r421156 - /db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseBuilder.java
Date Wed, 12 Jul 2006 06:10:49 GMT
Author: tomdz
Date: Tue Jul 11 23:10:48 2006
New Revision: 421156

URL: http://svn.apache.org/viewvc?rev=421156&view=rev
Log:
Finished Interbase platform

Modified:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseBuilder.java

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseBuilder.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseBuilder.java?rev=421156&r1=421155&r2=421156&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseBuilder.java
(original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseBuilder.java
Tue Jul 11 23:10:48 2006
@@ -1,7 +1,7 @@
 package org.apache.ddlutils.platform.interbase;
 
 /*
- * Copyright 1999-2006 The Apache Software Foundation.
+ * Copyright 2005-2006 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,12 +18,17 @@
 
 import java.io.IOException;
 import java.sql.Types;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.ddlutils.Platform;
+import org.apache.ddlutils.alteration.AddColumnChange;
+import org.apache.ddlutils.alteration.AddPrimaryKeyChange;
+import org.apache.ddlutils.alteration.RemoveColumnChange;
+import org.apache.ddlutils.alteration.TableChange;
 import org.apache.ddlutils.model.Column;
 import org.apache.ddlutils.model.Database;
-import org.apache.ddlutils.model.ForeignKey;
 import org.apache.ddlutils.model.Index;
 import org.apache.ddlutils.model.Table;
 import org.apache.ddlutils.platform.SqlBuilder;
@@ -197,5 +202,137 @@
             result.append(" FROM RDB$DATABASE");
             return result.toString();
         }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected void processTableStructureChanges(Database currentModel, Database desiredModel,
Table sourceTable, Table targetTable, Map parameters, List changes) throws IOException
+    {
+        // TODO: Dropping of primary keys is currently not supported because we cannot
+        //       determine the pk constraint names and drop them in one go
+        //       (We could used a stored procedure if Interbase would allow them to use DDL)
+        //       This will be easier once named primary keys are supported
+        boolean pkColumnAdded = false;
+
+        for (Iterator changeIt = changes.iterator(); changeIt.hasNext();)
+        {
+            TableChange change = (TableChange)changeIt.next();
+
+            if (change instanceof AddColumnChange)
+            {
+                AddColumnChange addColumnChange = (AddColumnChange)change;
+
+                // TODO: we cannot add columns to the primary key this way
+                //       because we would have to drop the pk first and then
+                //       add a new one afterwards which is not supported yet
+                if (addColumnChange.getNewColumn().isPrimaryKey())
+                {
+                    pkColumnAdded = true;   
+                }
+                else
+                {
+                    processChange(currentModel, desiredModel, addColumnChange);
+                    change.apply(currentModel, getPlatform().isDelimitedIdentifierModeOn());
+                    changeIt.remove();
+                }
+            }
+            else if (change instanceof RemoveColumnChange)
+            {
+                RemoveColumnChange removeColumnChange = (RemoveColumnChange)change;
+
+                // TODO: we cannot drop primary key columns this way
+                //       because we would have to drop the pk first and then
+                //       add a new one afterwards which is not supported yet
+                if (!removeColumnChange.getColumn().isPrimaryKey())
+                {
+                    processChange(currentModel, desiredModel, removeColumnChange);
+                    change.apply(currentModel, getPlatform().isDelimitedIdentifierModeOn());
+                    changeIt.remove();
+                }
+            }
+        }
+        for (Iterator changeIt = changes.iterator(); changeIt.hasNext();)
+        {
+            TableChange change = (TableChange)changeIt.next();
+
+            // we can only add a primary key if all columns are present in the table
+            // i.e. none was added during this alteration
+            if ((change instanceof AddPrimaryKeyChange) && !pkColumnAdded)
+            {
+                processChange(currentModel, desiredModel, (AddPrimaryKeyChange)change);
+                change.apply(currentModel, getPlatform().isDelimitedIdentifierModeOn());
+                changeIt.remove();
+            }
+        }
+    }
+
+    /**
+     * Processes the addition of a column to a table.
+     * 
+     * @param currentModel The current database schema
+     * @param desiredModel The desired database schema
+     * @param change       The change object
+     */
+    protected void processChange(Database        currentModel,
+                                 Database        desiredModel,
+                                 AddColumnChange change) throws IOException
+    {
+        print("ALTER TABLE ");
+        printlnIdentifier(getTableName(change.getChangedTable()));
+        printIndent();
+        print("ADD ");
+        writeColumn(change.getChangedTable(), change.getNewColumn());
+        printEndOfStatement();
+
+        Table curTable = currentModel.findTable(change.getChangedTable().getName(), getPlatform().isDelimitedIdentifierModeOn());
+
+        if (!change.isAtEnd())
+        {
+            Column prevColumn = change.getPreviousColumn();
+
+            if (prevColumn != null)
+            {
+                // we need the corresponding column object from the current table
+                prevColumn = curTable.findColumn(prevColumn.getName(), getPlatform().isDelimitedIdentifierModeOn());
+            }
+            // Even though Interbase can only add columns, we can move them later on
+            print("ALTER TABLE ");
+            printlnIdentifier(getTableName(change.getChangedTable()));
+            printIndent();
+            print("ALTER ");
+            printIdentifier(getColumnName(change.getNewColumn()));
+            print(" POSITION ");
+            // column positions start at 1 in Interbase
+            print(prevColumn == null ? "1" : String.valueOf(curTable.getColumnIndex(prevColumn)
+ 2));
+            printEndOfStatement();
+        }
+        if (change.getNewColumn().isAutoIncrement())
+        {
+            writeAutoIncrementCreateStmts(currentModel, curTable, change.getNewColumn());
+        }
+    }
+
+    /**
+     * Processes the removal of a column from a table.
+     * 
+     * @param currentModel The current database schema
+     * @param desiredModel The desired database schema
+     * @param change       The change object
+     */
+    protected void processChange(Database           currentModel,
+                                 Database           desiredModel,
+                                 RemoveColumnChange change) throws IOException
+    {
+        if (change.getColumn().isAutoIncrement())
+        {
+            writeAutoIncrementDropStmts(change.getChangedTable(), change.getColumn());
+        }
+        print("ALTER TABLE ");
+        printlnIdentifier(getTableName(change.getChangedTable()));
+        printIndent();
+        print("DROP ");
+        printIdentifier(getColumnName(change.getColumn()));
+        printEndOfStatement();
     }
 }



Mime
View raw message