db-ddlutils-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From to...@apache.org
Subject svn commit: r454854 - in /db/ddlutils/trunk/src: java/org/apache/ddlutils/ java/org/apache/ddlutils/platform/ java/org/apache/ddlutils/platform/db2/ test/org/apache/ddlutils/ test/org/apache/ddlutils/io/ test/org/apache/ddlutils/platform/
Date Tue, 10 Oct 2006 17:58:30 GMT
Author: tomdz
Date: Tue Oct 10 10:58:29 2006
New Revision: 454854

URL: http://svn.apache.org/viewvc?view=rev&rev=454854
Log:
Enhanced handling of length restrictions for identifiers to give platforms more control over
them
Fixed DDLUTILS-123 by adding a new Db2v8 platform
Added tests for the length restrictions

Added:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2v8Builder.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2v8Platform.java
    db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestSqlBuilder.java
Removed:
    db/ddlutils/trunk/src/test/org/apache/ddlutils/SqlBuilderTest.java
Modified:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformFactory.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformInfo.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java
    db/ddlutils/trunk/src/test/org/apache/ddlutils/RunAllTests.java
    db/ddlutils/trunk/src/test/org/apache/ddlutils/TestPlatformBase.java
    db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java
    db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestConstraints.java
    db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestPlatformImplBase.java

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformFactory.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformFactory.java?view=diff&rev=454854&r1=454853&r2=454854
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformFactory.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformFactory.java Tue Oct 10 10:58:29
2006
@@ -22,6 +22,7 @@
 import org.apache.ddlutils.platform.axion.AxionPlatform;
 import org.apache.ddlutils.platform.cloudscape.CloudscapePlatform;
 import org.apache.ddlutils.platform.db2.Db2Platform;
+import org.apache.ddlutils.platform.db2.Db2v8Platform;
 import org.apache.ddlutils.platform.derby.DerbyPlatform;
 import org.apache.ddlutils.platform.firebird.FirebirdPlatform;
 import org.apache.ddlutils.platform.hsqldb.HsqlDbPlatform;
@@ -182,6 +183,7 @@
         addPlatform(_platforms, AxionPlatform.DATABASENAME,      AxionPlatform.class);
         addPlatform(_platforms, CloudscapePlatform.DATABASENAME, CloudscapePlatform.class);
         addPlatform(_platforms, Db2Platform.DATABASENAME,        Db2Platform.class);
+        addPlatform(_platforms, Db2v8Platform.DATABASENAME,      Db2v8Platform.class);
         addPlatform(_platforms, DerbyPlatform.DATABASENAME,      DerbyPlatform.class);
         addPlatform(_platforms, FirebirdPlatform.DATABASENAME,   FirebirdPlatform.class);
         addPlatform(_platforms, HsqlDbPlatform.DATABASENAME,     HsqlDbPlatform.class);

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?view=diff&rev=454854&r1=454853&r2=454854
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformInfo.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformInfo.java Tue Oct 10 10:58:29 2006
@@ -100,9 +100,17 @@
         shall be used. */ 
     private boolean _autoCommitModeForLastIdentityValueReading = true;
 
-    /** Specifies the maximum length that an identifier (name of a table, column, constraint
etc.)
-        can have for this database; use -1 if there is no limit. */
-    private int _maxIdentifierLength = -1;
+    /** Specifies the maximum length that a table name can have for this database (-1 if
there is no limit). */
+    private int _maxTableNameLength = -1;
+
+    /** Specifies the maximum length that a column name can have for this database (-1 if
there is no limit). */
+    private int _maxColumnNameLength = -1;
+
+    /** Specifies the maximum length that a constraint name can have for this database (-1
if there is no limit). */
+    private int _maxConstraintNameLength = -1;
+
+    /** Specifies the maximum length that a foreign key name can have for this database (-1
if there is no limit). */
+    private int _maxForeignKeyNameLength = -1;
 
     /** The string used for delimiting SQL identifiers, eg. table names, column names etc.
*/
     private String _delimiterToken = "\"";
@@ -565,23 +573,97 @@
     }
 
     /**
-     * Returns the maximum length of identifiers that this database allows.
+     * Returns the maximum number of characters that a table name can have.
+     * 
+     * @return The number of characters, or -1 if not limited
+     */
+    public int getMaxTableNameLength()
+    {
+        return _maxTableNameLength;
+    }
+
+    /**
+     * Returns the maximum number of characters that a column name can have.
      * 
-     * @return The maximum identifier length, -1 if unlimited
+     * @return The number of characters, or -1 if not limited
      */
-    public int getMaxIdentifierLength()
+    public int getMaxColumnNameLength()
     {
-        return _maxIdentifierLength;
+        return _maxColumnNameLength;
     }
 
     /**
-     * Sets the maximum length of identifiers that this database allows.
+     * Returns the maximum number of characters that a constraint name can have.
+     * 
+     * @return The number of characters, or -1 if not limited
+     */
+    public int getMaxConstraintNameLength()
+    {
+        return _maxConstraintNameLength;
+    }
+
+    /**
+     * Returns the maximum number of characters that a foreign key name can have.
+     * 
+     * @return The number of characters, or -1 if not limited
+     */
+    public int getMaxForeignKeyNameLength()
+    {
+        return _maxForeignKeyNameLength;
+    }
+
+    /**
+     * Sets the maximum length of all identifiers that this database allows.
+     * Use this method if the length limit is the same for all kinds of identifiers.
      * 
      * @param maxIdentifierLength The maximum identifier length, -1 if unlimited
      */
     public void setMaxIdentifierLength(int maxIdentifierLength)
     {
-        _maxIdentifierLength = maxIdentifierLength;
+        _maxTableNameLength      = maxIdentifierLength;
+        _maxColumnNameLength     = maxIdentifierLength;
+        _maxConstraintNameLength = maxIdentifierLength;
+        _maxForeignKeyNameLength = maxIdentifierLength;
+    }
+
+    /**
+     * Sets the maximum length of table names that this database allows.
+     * 
+     * @param maxTableNameLength The maximum length, -1 if unlimited
+     */
+    public void setMaxTableNameLength(int maxTableNameLength)
+    {
+        _maxTableNameLength = maxTableNameLength;
+    }
+
+    /**
+     * Sets the maximum length of column names that this database allows.
+     * 
+     * @param maxColumnNameLength The maximum length, -1 if unlimited
+     */
+    public void setMaxColumnNameLength(int maxColumnNameLength)
+    {
+        _maxColumnNameLength = maxColumnNameLength;
+    }
+
+    /**
+     * Sets the maximum length of constraint names that this database allows.
+     * 
+     * @param maxConstraintNameLength The maximum length, -1 if unlimited
+     */
+    public void setMaxConstraintNameLength(int maxConstraintNameLength)
+    {
+        _maxConstraintNameLength = maxConstraintNameLength;
+    }
+
+    /**
+     * Sets the maximum length of foreign key names that this database allows.
+     * 
+     * @param maxForeignKeyNameLength The maximum length, -1 if unlimited
+     */
+    public void setMaxForeignKeyNameLength(int maxForeignKeyNameLength)
+    {
+        _maxForeignKeyNameLength = maxForeignKeyNameLength;
     }
 
     /**

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?view=diff&rev=454854&r1=454853&r2=454854
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java Tue Oct 10 10:58:29
2006
@@ -287,7 +287,55 @@
     {
         _charSequencesToEscape.put(charSequence, escapedVersion);
     }
-    
+
+    /**
+     * Returns the maximum number of characters that a table name can have.
+     * This method is intended to give platform specific builder implementations
+     * more control over the maximum length.
+     * 
+     * @return The number of characters, or -1 if not limited
+     */
+    public int getMaxTableNameLength()
+    {
+        return getPlatformInfo().getMaxTableNameLength();
+    }
+
+    /**
+     * Returns the maximum number of characters that a column name can have.
+     * This method is intended to give platform specific builder implementations
+     * more control over the maximum length.
+     * 
+     * @return The number of characters, or -1 if not limited
+     */
+    public int getMaxColumnNameLength()
+    {
+        return getPlatformInfo().getMaxColumnNameLength();
+    }
+
+    /**
+     * Returns the maximum number of characters that a constraint name can have.
+     * This method is intended to give platform specific builder implementations
+     * more control over the maximum length.
+     * 
+     * @return The number of characters, or -1 if not limited
+     */
+    public int getMaxConstraintNameLength()
+    {
+        return getPlatformInfo().getMaxConstraintNameLength();
+    }
+
+    /**
+     * Returns the maximum number of characters that a foreign key name can have.
+     * This method is intended to give platform specific builder implementations
+     * more control over the maximum length.
+     * 
+     * @return The number of characters, or -1 if not limited
+     */
+    public int getMaxForeignKeyNameLength()
+    {
+        return getPlatformInfo().getMaxForeignKeyNameLength();
+    }
+
     //
     // public interface
     //
@@ -1536,7 +1584,7 @@
      * @param desiredLength The desired maximum length
      * @return The shortened version
      */
-    protected String shortenName(String name, int desiredLength)
+    public String shortenName(String name, int desiredLength)
     {
         // TODO: Find an algorithm that generates unique names
         int originalLength = name.length();
@@ -1571,7 +1619,7 @@
      */
     public String getTableName(Table table)
     {
-        return shortenName(table.getName(), getPlatformInfo().getMaxIdentifierLength());
+        return shortenName(table.getName(), getMaxTableNameLength());
     }
     
     /** 
@@ -1670,7 +1718,7 @@
      */
     protected String getColumnName(Column column) throws IOException
     {
-        return shortenName(column.getName(), getPlatformInfo().getMaxIdentifierLength());
+        return shortenName(column.getName(), getMaxColumnNameLength());
     }
 
     /**
@@ -1990,7 +2038,7 @@
             name.append(fk.getForeignTableName());
             fkName = getConstraintName(null, table, "FK", name.toString());
         }
-        fkName = shortenName(fkName, getPlatformInfo().getMaxIdentifierLength());
+        fkName = shortenName(fkName, getMaxForeignKeyNameLength());
 
         if (needsName)
         {
@@ -2027,7 +2075,7 @@
             result.append("_");
             result.append(suffix);
         }
-        return shortenName(result.toString(), getPlatformInfo().getMaxIdentifierLength());
+        return shortenName(result.toString(), getMaxConstraintNameLength());
     }
 
     /**
@@ -2107,7 +2155,7 @@
      */
     public String getIndexName(Index index)
     {
-        return index.getName();
+        return shortenName(index.getName(), getMaxConstraintNameLength());
     }
 
     /**

Added: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2v8Builder.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2v8Builder.java?view=auto&rev=454854
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2v8Builder.java (added)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2v8Builder.java Tue Oct
10 10:58:29 2006
@@ -0,0 +1,47 @@
+package org.apache.ddlutils.platform.db2;
+
+/*
+ * Copyright 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.
+ * 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.Platform;
+
+/**
+ * The SQL Builder for DB2 v8 and above.
+ * 
+ * @version $Revision: $
+ */
+public class Db2v8Builder extends Db2Builder
+{
+    /**
+     * Creates a new builder instance.
+     * 
+     * @param platform The plaftform this builder belongs to
+     */
+    public Db2v8Builder(Platform platform)
+    {
+        super(platform);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getMaxConstraintNameLength()
+    {
+        // In non-delimited identifier mode we can only use 18 characters apparently
+        return getPlatform().isDelimitedIdentifierModeOn() ? super.getMaxConstraintNameLength()
: 18;
+    }
+
+}

Added: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2v8Platform.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2v8Platform.java?view=auto&rev=454854
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2v8Platform.java (added)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2v8Platform.java Tue Oct
10 10:58:29 2006
@@ -0,0 +1,46 @@
+package org.apache.ddlutils.platform.db2;
+
+/*
+ * Copyright 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.
+ * 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.
+ */
+
+/**
+ * The DB2 platform implementation for DB2 v8 and above.
+ * 
+ * @version $Revision: $
+ */
+public class Db2v8Platform extends Db2Platform
+{
+    /** Database name of this platform. */
+    public static final String DATABASENAME = "DB2v8";
+
+    /**
+     * Creates a new platform instance.
+     */
+    public Db2v8Platform()
+    {
+        super();
+        // DB2 v8 has a maximum identifier length of 128 bytes for things like table names,
+        // stored procedure names etc., 30 bytes for column names and 18 bytes for foreign
key names
+        // Note that we optimistically assume that number of characters = number of bytes
+        // If the name contains characters that are more than one byte in the database's
+        // encoding, then the db will report an error anyway, but we cannot really calculate
+        // the number of bytes
+        getPlatformInfo().setMaxIdentifierLength(128);
+        getPlatformInfo().setMaxColumnNameLength(30);
+        getPlatformInfo().setMaxForeignKeyNameLength(18);
+        setSqlBuilder(new Db2v8Builder(this));
+    }
+}

Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/RunAllTests.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/RunAllTests.java?view=diff&rev=454854&r1=454853&r2=454854
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/RunAllTests.java (original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/RunAllTests.java Tue Oct 10 10:58:29 2006
@@ -44,6 +44,7 @@
 import org.apache.ddlutils.platform.TestPlatformUtils;
 import org.apache.ddlutils.platform.TestPostgresqlPlatform;
 import org.apache.ddlutils.platform.TestSapDbPlatform;
+import org.apache.ddlutils.platform.TestSqlBuilder;
 import org.apache.ddlutils.platform.TestSybasePlatform;
 
 import junit.framework.Test;
@@ -89,7 +90,7 @@
 
         // tests that don't need a live database
         suite.addTestSuite(TestArrayAccessAtTable.class);
-        suite.addTestSuite(SqlBuilderTest.class);
+        suite.addTestSuite(TestSqlBuilder.class);
         suite.addTestSuite(TestPlatformUtils.class);
         suite.addTestSuite(TestDatabaseIO.class);
         suite.addTestSuite(TestDataReader.class);

Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/TestPlatformBase.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/TestPlatformBase.java?view=diff&rev=454854&r1=454853&r2=454854
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/TestPlatformBase.java (original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/TestPlatformBase.java Tue Oct 10 10:58:29
2006
@@ -21,6 +21,7 @@
 import java.io.StringWriter;
 
 import org.apache.ddlutils.model.Database;
+import org.apache.ddlutils.platform.SqlBuilder;
 import org.xml.sax.SAXException;
 
 /**
@@ -166,6 +167,16 @@
     protected PlatformInfo getPlatformInfo()
     {
         return getPlatform().getPlatformInfo();
+    }
+
+    /**
+     * Returns the SQL builder of the tested platform.
+     * 
+     * @return The builder object
+     */
+    protected SqlBuilder getSqlBuilder()
+    {
+        return getPlatform().getSqlBuilder();
     }
 
     /**

Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java?view=diff&rev=454854&r1=454853&r2=454854
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java (original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java Tue Oct 10 10:58:29
2006
@@ -349,14 +349,14 @@
         if (_useDelimitedIdentifiers)
         {
             assertEquals("Table names do not match.",
-                         expected.getName(),
-                         actual.getName());
+                         getPlatform().getSqlBuilder().shortenName(expected.getName(), getSqlBuilder().getMaxTableNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getName(), getSqlBuilder().getMaxTableNameLength()));
         }
         else
         {
             assertEquals("Table names do not match (ignoring case).",
-                         expected.getName().toUpperCase(),
-                         actual.getName().toUpperCase());
+                         getPlatform().getSqlBuilder().shortenName(expected.getName().toUpperCase(),
getSqlBuilder().getMaxTableNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getName().toUpperCase(),
getSqlBuilder().getMaxTableNameLength()));
         }
         assertEquals("Not the same number of columns in table "+actual.getName()+".",
                      expected.getColumnCount(),
@@ -373,12 +373,12 @@
         for (int expectedFkIdx = 0; expectedFkIdx < expected.getForeignKeyCount(); expectedFkIdx++)
         {
             ForeignKey expectedFk   = expected.getForeignKey(expectedFkIdx);
-            String     expectedName = expectedFk.getName();
+            String     expectedName = getPlatform().getSqlBuilder().shortenName(expectedFk.getName(),
getSqlBuilder().getMaxForeignKeyNameLength());
 
             for (int actualFkIdx = 0; actualFkIdx < actual.getForeignKeyCount(); actualFkIdx++)
             {
                 ForeignKey actualFk   = actual.getForeignKey(actualFkIdx);
-                String     actualName = actualFk.getName();
+                String     actualName = getPlatform().getSqlBuilder().shortenName(actualFk.getName(),
getSqlBuilder().getMaxForeignKeyNameLength());
 
                 if ((_useDelimitedIdentifiers  && expectedName.equals(actualName))
||
                     (!_useDelimitedIdentifiers && expectedName.equalsIgnoreCase(actualName)))
@@ -408,14 +408,14 @@
         if (_useDelimitedIdentifiers)
         {
             assertEquals("Column names do not match.",
-                         expected.getName(),
-                         actual.getName());
+                         getPlatform().getSqlBuilder().shortenName(expected.getName(), getSqlBuilder().getMaxColumnNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getName(), getSqlBuilder().getMaxColumnNameLength()));
         }
         else
         {
             assertEquals("Column names do not match (ignoring case).",
-                         expected.getName().toUpperCase(),
-                         actual.getName().toUpperCase());
+                         getPlatform().getSqlBuilder().shortenName(expected.getName().toUpperCase(),
getSqlBuilder().getMaxColumnNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getName().toUpperCase(),
getSqlBuilder().getMaxColumnNameLength()));
         }
         assertEquals("Primary key status not the same for column "+actual.getName()+".",
                      expected.isPrimaryKey(),
@@ -474,20 +474,20 @@
         if (_useDelimitedIdentifiers)
         {
             assertEquals("Foreign key names do not match.",
-                         expected.getName(),
-                         actual.getName());
+                         getPlatform().getSqlBuilder().shortenName(expected.getName(), getSqlBuilder().getMaxForeignKeyNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getName(), getSqlBuilder().getMaxForeignKeyNameLength()));
             assertEquals("Referenced table names do not match.",
-                         expected.getForeignTableName(),
-                         actual.getForeignTableName());
+                         getPlatform().getSqlBuilder().shortenName(expected.getForeignTableName(),
getSqlBuilder().getMaxTableNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getForeignTableName(),
getSqlBuilder().getMaxTableNameLength()));
         }
         else
         {
             assertEquals("Foreign key names do not match (ignoring case).",
-                         expected.getName().toUpperCase(),
-                         actual.getName().toUpperCase());
+                         getPlatform().getSqlBuilder().shortenName(expected.getName().toUpperCase(),
getSqlBuilder().getMaxForeignKeyNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getName().toUpperCase(),
getSqlBuilder().getMaxForeignKeyNameLength()));
             assertEquals("Referenced table names do not match (ignoring case).",
-                         expected.getForeignTableName().toUpperCase(),
-                         actual.getForeignTableName().toUpperCase());
+                         getPlatform().getSqlBuilder().shortenName(expected.getForeignTableName().toUpperCase(),
getSqlBuilder().getMaxTableNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getForeignTableName().toUpperCase(),
getSqlBuilder().getMaxTableNameLength()));
         }
         assertEquals("Not the same number of references in foreign key "+actual.getName()+".",
                      expected.getReferenceCount(),
@@ -510,20 +510,20 @@
         if (_useDelimitedIdentifiers)
         {
             assertEquals("Local column names do not match.",
-                         expected.getLocalColumnName(),
-                         actual.getLocalColumnName());
+                         getPlatform().getSqlBuilder().shortenName(expected.getLocalColumnName(),
getSqlBuilder().getMaxColumnNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getLocalColumnName(),
getSqlBuilder().getMaxColumnNameLength()));
             assertEquals("Foreign column names do not match.",
-                         expected.getForeignColumnName(),
-                         actual.getForeignColumnName());
+                         getPlatform().getSqlBuilder().shortenName(expected.getForeignColumnName(),
getSqlBuilder().getMaxColumnNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getForeignColumnName(),
getSqlBuilder().getMaxColumnNameLength()));
         }
         else
         {
             assertEquals("Local column names do not match (ignoring case).",
-                         expected.getLocalColumnName().toUpperCase(),
-                         actual.getLocalColumnName().toUpperCase());
+                         getPlatform().getSqlBuilder().shortenName(expected.getLocalColumnName().toUpperCase(),
getSqlBuilder().getMaxColumnNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getLocalColumnName().toUpperCase(),
getSqlBuilder().getMaxColumnNameLength()));
             assertEquals("Foreign column names do not match (ignoring case).",
-                         expected.getForeignColumnName().toUpperCase(),
-                         actual.getForeignColumnName().toUpperCase());
+                         getPlatform().getSqlBuilder().shortenName(expected.getForeignColumnName().toUpperCase(),
getSqlBuilder().getMaxColumnNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getForeignColumnName().toUpperCase(),
getSqlBuilder().getMaxColumnNameLength()));
         }
     }
 
@@ -538,14 +538,14 @@
         if (_useDelimitedIdentifiers)
         {
             assertEquals("Index names do not match.",
-                         expected.getName(),
-                         actual.getName());
+                         getPlatform().getSqlBuilder().shortenName(expected.getName(), getSqlBuilder().getMaxConstraintNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getName(), getSqlBuilder().getMaxConstraintNameLength()));
         }
         else
         {
             assertEquals("Index names do not match (ignoring case).",
-                         expected.getName().toUpperCase(),
-                         actual.getName().toUpperCase());
+                         getPlatform().getSqlBuilder().shortenName(expected.getName().toUpperCase(),
getSqlBuilder().getMaxConstraintNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getName().toUpperCase(),
getSqlBuilder().getMaxConstraintNameLength()));
         }
         assertEquals("Unique status not the same for index "+actual.getName()+".",
                      expected.isUnique(),
@@ -571,14 +571,14 @@
         if (_useDelimitedIdentifiers)
         {
             assertEquals("Index column names do not match.",
-                         expected.getName(),
-                         actual.getName());
+                         getPlatform().getSqlBuilder().shortenName(expected.getName(), getSqlBuilder().getMaxColumnNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getName(), getSqlBuilder().getMaxColumnNameLength()));
         }
         else
         {
             assertEquals("Index column names do not match (ignoring case).",
-                         expected.getName().toUpperCase(),
-                         actual.getName().toUpperCase());
+                         getPlatform().getSqlBuilder().shortenName(expected.getName().toUpperCase(),
getSqlBuilder().getMaxColumnNameLength()),
+                         getPlatform().getSqlBuilder().shortenName(actual.getName().toUpperCase(),
getSqlBuilder().getMaxColumnNameLength()));
         }
         assertEquals("Size not the same for index column "+actual.getName()+".",
                      expected.getSize(),

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?view=diff&rev=454854&r1=454853&r2=454854
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestConstraints.java (original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestConstraints.java Tue Oct 10 10:58:29
2006
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.ddlutils.model.Database;
 import org.apache.ddlutils.platform.sybase.SybasePlatform;
 
@@ -64,6 +65,107 @@
 	
 	        assertTrue(alterTablesSql.length() == 0);
         }
+    }
+
+    /**
+     * Tests a table name that is longer than the maximum allowed.
+     */
+    public void testLongTableName()
+    {
+        if (getSqlBuilder().getMaxTableNameLength() == -1)
+        {
+            return;
+        }
+
+        String       tableName = StringUtils.repeat("Test", (getSqlBuilder().getMaxTableNameLength()
/ 4) + 3);
+        final String modelXml  = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database name='roundtriptest'>\n"+
+            "  <table name='" + tableName + "'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='avalue' type='INTEGER' required='false'/>\n"+
+            "  </table>\n"+
+            "</database>";
+
+        performConstraintsTest(modelXml, true);
+    }
+
+    /**
+     * Tests a column name that is longer than the maximum allowed.
+     */
+    public void testLongColumnName()
+    {
+        if (getPlatformInfo().getMaxColumnNameLength() == -1)
+        {
+            return;
+        }
+
+        String       columnName = StringUtils.repeat("Test", (getSqlBuilder().getMaxColumnNameLength()
/ 4) + 3);
+        final String modelXml   = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database name='roundtriptest'>\n"+
+            "  <table name='lengthtest'>\n"+
+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='" + columnName + "' type='INTEGER' required='false'/>\n"+
+            "  </table>\n"+
+            "</database>";
+
+        performConstraintsTest(modelXml, true);
+    }
+
+    /**
+     * Tests a constraint name that is longer than the maximum allowed.
+     */
+    public void testLongConstraintName()
+    {
+        if (getSqlBuilder().getMaxConstraintNameLength() == -1)
+        {
+            return;
+        }
+
+        String       constraintName = StringUtils.repeat("Test", (getSqlBuilder().getMaxConstraintNameLength()
/ 4) + 3);
+        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='DOUBLE'/>\n"+
+            "    <index name='" + constraintName + "'>\n"+
+            "      <index-column name='avalue'/>\n"+
+            "    </index>\n"+
+            "  </table>\n"+
+            "</database>";
+
+        performConstraintsTest(modelXml, true);
+    }
+
+    /**
+     * Tests a foreign key name that is longer than the maximum allowed.
+     */
+    public void testLongForeignKeyName()
+    {
+        if (getSqlBuilder().getMaxForeignKeyNameLength() == -1)
+        {
+            return;
+        }
+
+        String       fkName   = StringUtils.repeat("Test", (getSqlBuilder().getMaxForeignKeyNameLength()
/ 4) + 3);
+        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='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+
+            "    <column name='avalue' type='INTEGER' required='true'/>\n"+
+            "    <foreign-key name='" + fkName + "' foreignTable='roundtrip_1'>\n"+
+            "      <reference local='avalue' foreign='pk'/>\n"+
+            "    </foreign-key>\n"+
+            "  </table>\n"+
+            "</database>";
+
+        performConstraintsTest(modelXml, true);
     }
 
     /**

Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestPlatformImplBase.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestPlatformImplBase.java?view=diff&rev=454854&r1=454853&r2=454854
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestPlatformImplBase.java (original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestPlatformImplBase.java Tue
Oct 10 10:58:29 2006
@@ -51,6 +51,14 @@
     }
 
     /**
+     * {@inheritDoc}
+     */
+    protected String getDatabaseName()
+    {
+        return null;
+    }
+
+    /**
      * Test the toColumnValues method.
      */
     public void testToColumnValues()
@@ -68,13 +76,5 @@
         assertEquals("name",
                      map.get("name"));
         assertTrue(map.containsKey("id"));
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected String getDatabaseName()
-    {
-        return null;
     }
 }

Added: 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?view=auto&rev=454854
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestSqlBuilder.java (added)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestSqlBuilder.java Tue Oct 10
10:58:29 2006
@@ -0,0 +1,63 @@
+package org.apache.ddlutils.platform;
+
+/*
+ * 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.
+ * 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 java.util.HashMap;
+import java.util.Map;
+
+import org.apache.ddlutils.TestBase;
+import org.apache.ddlutils.model.Database;
+import org.apache.ddlutils.model.Table;
+
+/**
+ * Test the base SqlBuilder class.
+ * 
+ * @author Martin van den Bemt
+ * @version $Revision: $
+ */
+public class TestSqlBuilder extends TestBase
+{
+    /**
+     * Tests the {@link SqlBuilder#getUpdateSql(Table, Map, boolean)} method.
+     */
+    public void testUpdateSql()
+    {
+        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          map        = new HashMap();
+
+        map.put("name", "ddlutils");
+        map.put("id", new Integer(0));
+
+        platform.setDelimitedIdentifierModeOn(true);
+        
+        String sql = sqlBuilder.getUpdateSql(database.getTable(0), map, false);
+
+        assertEquals("UPDATE \"TestTable\" SET \"name\" = 'ddlutils' WHERE \"id\" = '0'",
+                     sql);
+    }
+}



Mime
View raw message