You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ddlutils-dev@db.apache.org by to...@apache.org on 2005/11/26 19:33:59 UTC

svn commit: r349134 - in /db/ddlutils/trunk/src: doc/src/documentation/content/xdocs/ java/org/apache/ddlutils/ java/org/apache/ddlutils/io/ java/org/apache/ddlutils/platform/ java/org/apache/ddlutils/task/ test/org/apache/ddlutils/platform/

Author: tomdz
Date: Sat Nov 26 10:33:39 2005
New Revision: 349134

URL: http://svn.apache.org/viewcvs?rev=349134&view=rev
Log:
Implemented DDLUTILS-32
Fixed some bugs
Updated docs

Added:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/CreationParameters.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseCommandWithCreationParameters.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/task/TableSpecificParameter.java
Modified:
    db/ddlutils/trunk/src/doc/src/documentation/content/xdocs/ant-tasks.xml
    db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/io/package.html
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/InterbaseBuilder.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/MSSqlBuilder.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/MySqlBuilder.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/OracleBuilder.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PostgreSqlBuilder.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SybaseBuilder.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java
    db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMySqlPlatform.java

Modified: db/ddlutils/trunk/src/doc/src/documentation/content/xdocs/ant-tasks.xml
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/doc/src/documentation/content/xdocs/ant-tasks.xml?rev=349134&r1=349133&r2=349134&view=diff
==============================================================================
--- db/ddlutils/trunk/src/doc/src/documentation/content/xdocs/ant-tasks.xml (original)
+++ db/ddlutils/trunk/src/doc/src/documentation/content/xdocs/ant-tasks.xml Sat Nov 26 10:33:39 2005
@@ -358,6 +358,66 @@
             <td>See above.</td>
           </tr>
         </table>
+        <section>
+          <title>Subelement: parameter</title>
+          <p>
+            Specifies a parameter for the creation of the tables. These are usually platform specific.
+            If no table name is specified, the parameter is applied to all tables.
+          </p>
+          <note>
+            Parameters are only applied when creating new tables, not when altering existing ones.
+          </note>
+          <table>
+            <tr>
+              <th>Attribute</th>
+              <th>Required ?</th>
+              <th>Possible values</th>
+              <th>Default value</th>
+              <th>Meaning</th>
+            </tr>
+            <tr>
+              <td>name</td>
+              <td>yes</td>
+              <td></td>
+              <td></td>
+              <td>Specifies the name of the parameter. See <a href="site:documentation/database-support">here</a>
+                  for the parameters supported by the individual platforms.</td>
+            </tr>
+            <tr>
+              <td>table</td>
+              <td>no</td>
+              <td></td>
+              <td></td>
+              <td>Specifies the name of the table where this parameter shall be applied.</td>
+            </tr>
+            <tr>
+              <td>tables</td>
+              <td>no</td>
+              <td></td>
+              <td></td>
+              <td>Specifies the comma-separated list of table names where this parameter shall be applied.</td>
+            </tr>
+            <tr>
+              <td>value</td>
+              <td>no</td>
+              <td></td>
+              <td></td>
+              <td>The parameter value. If none is given, <code>null</code> is used.</td>
+            </tr>
+            <tr>
+              <td>platforms</td>
+              <td>no</td>
+              <td></td>
+              <td></td>
+              <td>
+                Comma-separated list of platforms where the parameter shall be processed (see
+                <code>databaseType</code> attribute above for the possible values). For every platform
+                not in this list, the parameter is ignored. If none is given, then the parameter
+                is processed for every platform.
+              </td>
+            </tr>
+          </table>
+        </section>
       </section>
       <section>
         <title>Subtask: writeSchemaSqlToFile</title>
@@ -404,6 +464,12 @@
             <td>The name of the file to write the SQL commands to.</td>
           </tr>
         </table>
+        <section>
+          <title>Subelement: parameter</title>
+          <p>
+            Same as for <code>writeSchemaToDatabase</code>.
+          </p>
+        </section>
       </section>
       <section>
         <title>Subtask: writeDataToDatabase</title>
@@ -473,7 +539,7 @@
               <td></td>
               <td></td>
               <td>
-                Specifies the fully qualified class name of the parameter. Note that the class is
+                Specifies the fully qualified class name of the converter. Note that the class is
                 required to implement
                 <a href="ext:ddlutils/javadoc/converter">org.apache.ddlutils.io.converters.SqlTypeConverter</a>.
               </td>

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java?rev=349134&r1=349133&r2=349134&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java Sat Nov 26 10:33:39 2005
@@ -27,6 +27,7 @@
 import org.apache.commons.beanutils.DynaBean;
 import org.apache.ddlutils.model.Database;
 import org.apache.ddlutils.model.Table;
+import org.apache.ddlutils.platform.CreationParameters;
 import org.apache.ddlutils.platform.JdbcModelReader;
 import org.apache.ddlutils.platform.SqlBuilder;
 
@@ -198,6 +199,27 @@
     public void createTables(Connection connection, Database model, boolean dropTablesFirst, boolean continueOnError) throws DynaSqlException;
 
     /**
+     * Creates the tables defined in the database model.
+     * 
+     * @param model           The database model
+     * @param params          The parameters used in the creation
+     * @param dropTablesFirst Whether to drop the tables prior to creating them (anew)
+     * @param continueOnError Whether to continue executing the sql commands when an error occurred
+     */
+    public void createTables(Database model, CreationParameters params, boolean dropTablesFirst, boolean continueOnError) throws DynaSqlException;
+
+    /**
+     * Creates the tables defined in the database model.
+     * 
+     * @param connection      The connection to the database
+     * @param model           The database model
+     * @param params          The parameters used in the creation
+     * @param dropTablesFirst Whether to drop the tables prior to creating them (anew)
+     * @param continueOnError Whether to continue executing the sql commands when an error occurred
+     */
+    public void createTables(Connection connection, Database model, CreationParameters params, boolean dropTablesFirst, boolean continueOnError) throws DynaSqlException;
+
+    /**
      * Alters the database schema so that it match the given model. Drops and table modifications will
      * not be made.
      *
@@ -221,6 +243,28 @@
      * Alters the database schema so that it match the given model. Drops and table modifications will
      * not be made.
      *
+     * @param desiredDb       The desired database schema
+     * @param params          The parameters used in the creation
+     * @param continueOnError Whether to continue with the next sql statement when an error occurred
+     */
+    public void alterTables(Database desiredDb, CreationParameters params, boolean continueOnError) throws DynaSqlException;
+
+    /**
+     * Alters the database schema so that it match the given model.
+     *
+     * @param desiredDb       The desired database schema
+     * @param params          The parameters used in the creation
+     * @param doDrops         Whether columns, tables and indexes should be dropped if not in the
+     *                        new schema
+     * @param modifyColumns   Whether columns should be altered for datatype, size as required
+     * @param continueOnError Whether to continue with the next sql statement when an error occurred
+     */
+    public void alterTables(Database desiredDb, CreationParameters params, boolean doDrops, boolean modifyColumns, boolean continueOnError) throws DynaSqlException;
+
+    /**
+     * Alters the database schema so that it match the given model. Drops and table modifications will
+     * not be made.
+     *
      * @param connection      A connection to the existing database that shall be modified
      * @param desiredDb       The desired database schema
      * @param continueOnError Whether to continue with the next sql statement when an error occurred
@@ -238,6 +282,30 @@
      * @param continueOnError Whether to continue with the next sql statement when an error occurred
      */
     public void alterTables(Connection connection, Database desiredDb, boolean doDrops, boolean modifyColumns, boolean continueOnError) throws DynaSqlException;
+
+    /**
+     * Alters the database schema so that it match the given model. Drops and table modifications will
+     * not be made.
+     *
+     * @param connection      A connection to the existing database that shall be modified
+     * @param desiredDb       The desired database schema
+     * @param params          The parameters used in the creation
+     * @param continueOnError Whether to continue with the next sql statement when an error occurred
+     */
+    public void alterTables(Connection connection, Database desiredDb, CreationParameters params, boolean continueOnError) throws DynaSqlException;
+
+    /**
+     * Alters the database schema so that it match the given model.
+     *
+     * @param connection      A connection to the existing database that shall be modified
+     * @param desiredDb       The desired database schema
+     * @param params          The parameters used in the creation
+     * @param doDrops         Whether columns, tables and indexes should be dropped if not in the
+     *                        new schema
+     * @param modifyColumns   Whether columns should be altered for datatype, size as required
+     * @param continueOnError Whether to continue with the next sql statement when an error occurred
+     */
+    public void alterTables(Connection connection, Database desiredDb, CreationParameters params, boolean doDrops, boolean modifyColumns, boolean continueOnError) throws DynaSqlException;
 
     /**
      * Drops the tables defined in the given database.

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/io/package.html
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/io/package.html?rev=349134&r1=349133&r2=349134&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/io/package.html (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/io/package.html Sat Nov 26 10:33:39 2005
@@ -28,10 +28,5 @@
   	The DTD for these data XML files is generated via the
   	{@link org.apache.ddlutils.io.DataDtdWriter} class.
   </p>
-  <p>
-    Also of interest is the {@link org.apache.ddlutils.io.JdbcModelReader} class,
-    which retrieves the database model from a live database.
-<!-- TODO: Add reference to Platform facade method -->
-  </p>
 </body>
 </html>

Added: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/CreationParameters.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/CreationParameters.java?rev=349134&view=auto
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/CreationParameters.java (added)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/CreationParameters.java Sat Nov 26 10:33:39 2005
@@ -0,0 +1,80 @@
+package org.apache.ddlutils.platform;
+
+/*
+ * Copyright 1999-2005 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.commons.collections.map.ListOrderedMap;
+import org.apache.ddlutils.model.Table;
+
+/**
+ * Contains parameters used in the table creation. Note that the definition
+ * order is retained (per table), so if a parameter should be applied before
+ * some other parameter, then add it before the other one.
+ * 
+ * @author Thomas Dudziak
+ * @version $Revision: 331006 $
+ */
+public class CreationParameters
+{
+    /** The parameter maps keyed by the tables. */
+    private Map _parametersPerTable = new HashMap();
+
+    /**
+     * Returns the parameters for the given table.
+     * 
+     * @param table The table
+     * @return The parameters
+     */
+    public Map getParametersFor(Table table)
+    {
+        ListOrderedMap result       = new ListOrderedMap();
+        Map            globalParams = (Map)_parametersPerTable.get(null);
+        Map            tableParams  = (Map)_parametersPerTable.get(table);
+
+        if (globalParams != null)
+        {
+            result.putAll(globalParams);
+        }
+        if (tableParams != null)
+        {
+            result.putAll(tableParams);
+        }
+        return result;
+    }
+
+    /**
+     * Adds a parameter.
+     * 
+     * @param table      The table; if <code>null</code> then the parameter is for all tables
+     * @param paramName  The name of the parameter
+     * @param paramValue The value of the parameter
+     */
+    public void addParameter(Table table, String paramName, String paramValue)
+    {
+        Map params = (Map)_parametersPerTable.get(table);
+
+        if (params == null)
+        {
+            // we're using a list orderered map to retain the order
+            params = new ListOrderedMap();
+            _parametersPerTable.put(table, params);
+        }
+        params.put(paramName, paramValue);
+    }
+}

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/InterbaseBuilder.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/InterbaseBuilder.java?rev=349134&r1=349133&r2=349134&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/InterbaseBuilder.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/InterbaseBuilder.java Sat Nov 26 10:33:39 2005
@@ -18,6 +18,7 @@
 
 import java.io.IOException;
 import java.sql.Types;
+import java.util.Map;
 
 import org.apache.ddlutils.PlatformInfo;
 import org.apache.ddlutils.model.Column;
@@ -69,9 +70,9 @@
     /**
      * {@inheritDoc}
      */
-    public void createTable(Database database, Table table) throws IOException
+    public void createTable(Database database, Table table, Map parameters) throws IOException
     {
-        super.createTable(database, table);
+        super.createTable(database, table, parameters);
         print("COMMIT");
         printEndOfStatement();
 

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/MSSqlBuilder.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/MSSqlBuilder.java?rev=349134&r1=349133&r2=349134&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/MSSqlBuilder.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/MSSqlBuilder.java Sat Nov 26 10:33:39 2005
@@ -17,7 +17,7 @@
  */
 
 import java.io.IOException;
-import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.ddlutils.PlatformInfo;
 import org.apache.ddlutils.model.Column;
@@ -48,10 +48,10 @@
     /**
      * {@inheritDoc}
      */
-    public void createTable(Database database, Table table) throws IOException
+    public void createTable(Database database, Table table, Map parameters) throws IOException
     {
         writeQuotationOnStatement();
-        super.createTable(database, table);
+        super.createTable(database, table, parameters);
     }
 
     /**
@@ -187,7 +187,7 @@
     /**
      * {@inheritDoc}
      */
-    public String getDeleteSql(Table table, HashMap pkValues, boolean genPlaceholders)
+    public String getDeleteSql(Table table, Map pkValues, boolean genPlaceholders)
     {
         return getQuotationOnStatement() + super.getDeleteSql(table, pkValues, genPlaceholders);
     }
@@ -195,7 +195,7 @@
     /**
      * {@inheritDoc}
      */
-    public String getInsertSql(Table table, HashMap columnValues, boolean genPlaceholders)
+    public String getInsertSql(Table table, Map columnValues, boolean genPlaceholders)
     {
         return getQuotationOnStatement() + super.getInsertSql(table, columnValues, genPlaceholders);
     }
@@ -203,7 +203,7 @@
     /**
      * {@inheritDoc}
      */
-    public String getUpdateSql(Table table, HashMap columnValues, boolean genPlaceholders)
+    public String getUpdateSql(Table table, Map columnValues, boolean genPlaceholders)
     {
         return getQuotationOnStatement() + super.getUpdateSql(table, columnValues, genPlaceholders);
     }

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/MySqlBuilder.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/MySqlBuilder.java?rev=349134&r1=349133&r2=349134&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/MySqlBuilder.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/MySqlBuilder.java Sat Nov 26 10:33:39 2005
@@ -18,6 +18,8 @@
 
 import java.io.IOException;
 import java.sql.Types;
+import java.util.Iterator;
+import java.util.Map;
 
 import org.apache.ddlutils.PlatformInfo;
 import org.apache.ddlutils.model.Column;
@@ -106,4 +108,35 @@
     {
         return "SELECT LAST_INSERT_ID()";
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected void writeTableCreationStmtEnding(Table table, Map parameters) throws IOException
+    {
+        if (parameters != null)
+        {
+            print(" ");
+            // MySql supports additional table creation options which are appended
+            // at the end of the CREATE TABLE statement
+            for (Iterator it = parameters.entrySet().iterator(); it.hasNext();)
+            {
+                Map.Entry entry = (Map.Entry)it.next();
+
+                print(entry.getKey().toString());
+                if (entry.getValue() != null)
+                {
+                    print("=");
+                    print(entry.getValue().toString());
+                }
+                if (it.hasNext())
+                {
+                    print(" ");
+                }
+            }
+        }
+        super.writeTableCreationStmtEnding(table, parameters);
+    }
+
+
 }

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/OracleBuilder.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/OracleBuilder.java?rev=349134&r1=349133&r2=349134&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/OracleBuilder.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/OracleBuilder.java Sat Nov 26 10:33:39 2005
@@ -18,6 +18,7 @@
 
 import java.io.IOException;
 import java.sql.Types;
+import java.util.Map;
 
 import org.apache.ddlutils.PlatformInfo;
 import org.apache.ddlutils.model.Column;
@@ -77,7 +78,7 @@
     /**
      * {@inheritDoc}
      */
-    public void createTable(Database database, Table table) throws IOException
+    public void createTable(Database database, Table table, Map parameters) throws IOException
     {
         // lets create any sequences
         Column[] columns = table.getAutoIncrementColumns();
@@ -89,7 +90,7 @@
             printEndOfStatement();
         }
 
-        super.createTable(database, table);
+        super.createTable(database, table, parameters);
 
         for (int idx = 0; idx < columns.length; idx++)
         {

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java?rev=349134&r1=349133&r2=349134&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java Sat Nov 26 10:33:39 2005
@@ -234,6 +234,22 @@
     /**
      * {@inheritDoc}
      */
+    public void createDatabase(String jdbcDriverClassName, String connectionUrl, String username, String password, Map parameters) throws DynaSqlException, UnsupportedOperationException
+    {
+        throw new UnsupportedOperationException("Database creation is not supported for the database platform "+getName());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void dropDatabase(String jdbcDriverClassName, String connectionUrl, String username, String password) throws DynaSqlException, UnsupportedOperationException
+    {
+        throw new UnsupportedOperationException("Database deletion is not supported for the database platform "+getName());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
     public void createTables(Database model, boolean dropTablesFirst, boolean continueOnError) throws DynaSqlException
     {
         Connection connection = borrowConnection();
@@ -251,23 +267,46 @@
     /**
      * {@inheritDoc}
      */
-    public void createDatabase(String jdbcDriverClassName, String connectionUrl, String username, String password, Map parameters) throws DynaSqlException, UnsupportedOperationException
+    public void createTables(Connection connection, Database model, boolean dropTablesFirst, boolean continueOnError) throws DynaSqlException
     {
-        throw new UnsupportedOperationException("Database creation is not supported for the database platform "+getName());
+        String sql = null;
+
+        try
+        {
+            StringWriter buffer = new StringWriter();
+
+            getSqlBuilder().setWriter(buffer);
+            getSqlBuilder().createTables(model, dropTablesFirst);
+            sql = buffer.toString();
+        }
+        catch (IOException e)
+        {
+            // won't happen because we're using a string writer
+        }
+        evaluateBatch(connection, sql, continueOnError);
     }
 
     /**
      * {@inheritDoc}
      */
-    public void dropDatabase(String jdbcDriverClassName, String connectionUrl, String username, String password) throws DynaSqlException, UnsupportedOperationException
+    public void createTables(Database model, CreationParameters params, boolean dropTablesFirst, boolean continueOnError) throws DynaSqlException
     {
-        throw new UnsupportedOperationException("Database deletion is not supported for the database platform "+getName());
+        Connection connection = borrowConnection();
+
+        try
+        {
+            createTables(connection, model, params, dropTablesFirst, continueOnError);
+        }
+        finally
+        {
+            returnConnection(connection);
+        }
     }
 
     /**
      * {@inheritDoc}
      */
-    public void createTables(Connection connection, Database model, boolean dropTablesFirst, boolean continueOnError) throws DynaSqlException
+    public void createTables(Connection connection, Database model, CreationParameters params, boolean dropTablesFirst, boolean continueOnError) throws DynaSqlException
     {
         String sql = null;
 
@@ -276,7 +315,7 @@
             StringWriter buffer = new StringWriter();
 
             getSqlBuilder().setWriter(buffer);
-            getSqlBuilder().createTables(model, dropTablesFirst);
+            getSqlBuilder().createTables(model, params, dropTablesFirst);
             sql = buffer.toString();
         }
         catch (IOException e)
@@ -314,6 +353,39 @@
     /**
      * {@inheritDoc}
      */
+    public void alterTables(Database desiredDb, CreationParameters params, boolean continueOnError) throws DynaSqlException
+    {
+        alterTables(desiredDb, params, false, false, continueOnError);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void alterTables(Database desiredDb, CreationParameters params, boolean doDrops, boolean modifyColumns, boolean continueOnError) throws DynaSqlException
+    {
+        Connection connection = borrowConnection();
+
+        try
+        {
+            alterTables(connection, desiredDb, params, doDrops, modifyColumns, continueOnError);
+        }
+        finally
+        {
+            returnConnection(connection);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void alterTables(Connection connection, Database desiredDb, boolean continueOnError) throws DynaSqlException
+    {
+        alterTables(connection, desiredDb, false, false, continueOnError);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
     public void alterTables(Connection connection, Database desiredModel, boolean doDrops, boolean modifyColumns, boolean continueOnError) throws DynaSqlException
     {
         String   sql          = null;
@@ -337,9 +409,32 @@
     /**
      * {@inheritDoc}
      */
-    public void alterTables(Connection connection, Database desiredDb, boolean continueOnError) throws DynaSqlException
+    public void alterTables(Connection connection, Database desiredDb, CreationParameters params, boolean continueOnError) throws DynaSqlException
     {
-        alterTables(connection, desiredDb, false, false, continueOnError);
+        alterTables(connection, desiredDb, params, false, false, continueOnError);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void alterTables(Connection connection, Database desiredModel, CreationParameters params, boolean doDrops, boolean modifyColumns, boolean continueOnError) throws DynaSqlException
+    {
+        String   sql          = null;
+        Database currentModel = readModelFromDatabase(connection);
+
+        try
+        {
+            StringWriter buffer = new StringWriter();
+
+            getSqlBuilder().setWriter(buffer);
+            getSqlBuilder().alterDatabase(currentModel, desiredModel, params, doDrops, modifyColumns);
+            sql = buffer.toString();
+        }
+        catch (IOException ex)
+        {
+            // won't happen because we're using a string writer
+        }
+        evaluateBatch(connection, sql, continueOnError);
     }
 
     /**

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PostgreSqlBuilder.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PostgreSqlBuilder.java?rev=349134&r1=349133&r2=349134&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PostgreSqlBuilder.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PostgreSqlBuilder.java Sat Nov 26 10:33:39 2005
@@ -17,6 +17,7 @@
  */
 
 import java.io.IOException;
+import java.util.Map;
 
 import org.apache.ddlutils.PlatformInfo;
 import org.apache.ddlutils.model.Column;
@@ -65,7 +66,7 @@
     /**
      * {@inheritDoc}
      */
-    public void createTable(Database database, Table table) throws IOException
+    public void createTable(Database database, Table table, Map parameters) throws IOException
     {
         for (int idx = 0; idx < table.getColumnCount(); idx++)
         {
@@ -76,7 +77,7 @@
                 createAutoIncrementSequence(table, column);
             }
         }
-        super.createTable(database, table);
+        super.createTable(database, table, parameters);
     }
 
     /**

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=349134&r1=349133&r2=349134&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 Sat Nov 26 10:33:39 2005
@@ -232,7 +232,7 @@
      */
     public void createTables(Database database) throws IOException
     {
-        createTables(database, true);
+        createTables(database, null, true);
     }
 
     /**
@@ -243,6 +243,18 @@
      */
     public void createTables(Database database, boolean dropTables) throws IOException
     {
+        createTables(database, null, dropTables);
+    }
+
+    /**
+     * Outputs the DDL required to drop (if requested) and (re)create all tables in the database model.
+     * 
+     * @param database   The database
+     * @param params     The parameters used in the creation
+     * @param dropTables Whether to drop tables before creating them
+     */
+    public void createTables(Database database, CreationParameters params, boolean dropTables) throws IOException
+    {
         if (dropTables)
         {
             dropTables(database);
@@ -253,7 +265,7 @@
             Table table = database.getTable(idx);
 
             writeTableComment(table);
-            createTable(database, table);
+            createTable(database, table, (params == null ? null : params.getParametersFor(table)));
         }
 
         // we're writing the external foreignkeys last to ensure that all referenced tables are already defined
@@ -285,6 +297,23 @@
      */
     public void alterDatabase(Database currentModel, Database desiredModel, boolean doDrops, boolean modifyColumns) throws IOException
     {
+        alterDatabase(currentModel, desiredModel, null, doDrops, modifyColumns);
+    }        
+
+    /**
+     * Generates the DDL to modify an existing database so the schema matches
+     * the current specified database schema.
+     *
+     * @param currentModel  The current database schema
+     * @param desiredModel  The desired database schema
+     * @param params        The parameters used in the creation of new tables. Note that for existing
+     *                      tables, parameters won't be applied
+     * @param doDrops       Whether columns and indexes should be dropped if not in the
+     *                      new schema
+     * @param modifyColumns Whether columns should be altered for datatype, size as required
+     */
+    public void alterDatabase(Database currentModel, Database desiredModel, CreationParameters params, boolean doDrops, boolean modifyColumns) throws IOException
+    {
         ArrayList newTables = new ArrayList();
 
         for (int tableIdx = 0; tableIdx < desiredModel.getTableCount(); tableIdx++)
@@ -298,7 +327,7 @@
                 {
                     _log.info("Creating table " + desiredTable.getName());
                 }
-                createTable(desiredModel, desiredTable);
+                createTable(desiredModel, desiredTable, params.getParametersFor(desiredTable));
                 // we're deferring foreignkey generation
                 newTables.add(desiredTable);
             }
@@ -527,6 +556,19 @@
      */
     public void createTable(Database database, Table table) throws IOException 
     {
+        createTable(database, table, null); 
+    }
+
+    /** 
+     * Outputs the DDL to create the table along with any non-external constraints as well
+     * as with external primary keys and indices (but not foreign keys).
+     * 
+     * @param database   The database model
+     * @param table      The table
+     * @param parameters Additional platform-specific parameters for the table creation
+     */
+    public void createTable(Database database, Table table, Map parameters) throws IOException 
+    {
         print("CREATE TABLE ");
         printlnIdentifier(getTableName(table));
         println("(");
@@ -547,7 +589,7 @@
         }
         println();
         print(")");
-        printEndOfStatement();
+        writeTableCreationStmtEnding(table, parameters);
 
         if (!getPlatformInfo().isPrimaryKeyEmbedded())
         {
@@ -926,6 +968,19 @@
         print("ALTER TABLE ");
         printlnIdentifier(getTableName(table));
         printIndent();
+    }
+
+    /** 
+     * Writes the end of the table creation statement. Per default,
+     * only the end of the statement is written, but this can be changed
+     * in subclasses.
+     * 
+     * @param table      The table
+     * @param parameters Additional platform-specific parameters for the table creation
+     */
+    protected void writeTableCreationStmtEnding(Table table, Map parameters) throws IOException
+    {
+        printEndOfStatement();
     }
 
     /**

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SybaseBuilder.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SybaseBuilder.java?rev=349134&r1=349133&r2=349134&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SybaseBuilder.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SybaseBuilder.java Sat Nov 26 10:33:39 2005
@@ -17,7 +17,7 @@
  */
 
 import java.io.IOException;
-import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.ddlutils.PlatformInfo;
 import org.apache.ddlutils.model.Database;
@@ -46,10 +46,10 @@
     /**
      * {@inheritDoc}
      */
-    public void createTable(Database database, Table table) throws IOException
+    public void createTable(Database database, Table table, Map parameters) throws IOException
     {
         writeQuotationOnStatement();
-        super.createTable(database, table);
+        super.createTable(database, table, parameters);
     }
 
     /**
@@ -120,7 +120,7 @@
     /**
      * {@inheritDoc}
      */
-    public String getDeleteSql(Table table, HashMap pkValues, boolean genPlaceholders)
+    public String getDeleteSql(Table table, Map pkValues, boolean genPlaceholders)
     {
         return getQuotationOnStatement() + super.getDeleteSql(table, pkValues, genPlaceholders);
     }
@@ -128,7 +128,7 @@
     /**
      * {@inheritDoc}
      */
-    public String getInsertSql(Table table, HashMap columnValues, boolean genPlaceholders)
+    public String getInsertSql(Table table, Map columnValues, boolean genPlaceholders)
     {
         return getQuotationOnStatement() + super.getInsertSql(table, columnValues, genPlaceholders);
     }
@@ -136,7 +136,7 @@
     /**
      * {@inheritDoc}
      */
-    public String getUpdateSql(Table table, HashMap columnValues, boolean genPlaceholders)
+    public String getUpdateSql(Table table, Map columnValues, boolean genPlaceholders)
     {
         return getQuotationOnStatement() + super.getUpdateSql(table, columnValues, genPlaceholders);
     }

Added: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseCommandWithCreationParameters.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseCommandWithCreationParameters.java?rev=349134&view=auto
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseCommandWithCreationParameters.java (added)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseCommandWithCreationParameters.java Sat Nov 26 10:33:39 2005
@@ -0,0 +1,78 @@
+package org.apache.ddlutils.task;
+
+/*
+ * Copyright 1999-2005 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.ArrayList;
+import java.util.Iterator;
+
+import org.apache.ddlutils.model.Database;
+import org.apache.ddlutils.model.Table;
+import org.apache.ddlutils.platform.CreationParameters;
+
+/**
+ * Base type for database commands that use creation parameters.
+ * 
+ * @author Thomas Dudziak
+ * @version $Revision: 289996 $
+ */
+public abstract class DatabaseCommandWithCreationParameters extends DatabaseCommand
+{
+    /** The additional creation parameters. */
+    private ArrayList _parameters = new ArrayList();
+
+    /**
+     * Adds a parameter which is a name-value pair.
+     * 
+     * @param param The parameter
+     */
+    public void addConfiguredParameter(TableSpecificParameter param)
+    {
+        _parameters.add(param);
+    }
+
+    /**
+     * Filters the parameters for the given model and platform.
+     * 
+     * @param model           The database model
+     * @param platformName    The name of the platform
+     * @param isCaseSensitive Whether case is relevant when comparing names of tables
+     * @return The filtered parameters
+     */
+    protected CreationParameters getFilteredParameters(Database model, String platformName, boolean isCaseSensitive)
+    {
+        CreationParameters parameters = new CreationParameters();
+
+        for (Iterator it = _parameters.iterator(); it.hasNext();)
+        {
+            TableSpecificParameter param = (TableSpecificParameter)it.next();
+
+            if (param.isForPlatform(platformName))
+            {
+                for (int idx = 0; idx < model.getTableCount(); idx++)
+                {
+                    Table table = model.getTable(idx);
+
+                    if (param.isForTable(table, isCaseSensitive))
+                    {
+                        parameters.addParameter(table, param.getName(), param.getValue());
+                    }
+                }
+            }
+        }
+        return parameters;
+    }
+}

Added: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/TableSpecificParameter.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/TableSpecificParameter.java?rev=349134&view=auto
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/TableSpecificParameter.java (added)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/TableSpecificParameter.java Sat Nov 26 10:33:39 2005
@@ -0,0 +1,91 @@
+package org.apache.ddlutils.task;
+
+/*
+ * Copyright 1999-2005 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.ArrayList;
+import java.util.Iterator;
+import java.util.StringTokenizer;
+
+import org.apache.ddlutils.model.Table;
+
+/**
+ * A {@link org.apache.ddlutils.task.Parameter} intended for specific tables.
+ * 
+ * TODO: Some wildcard/regular expression mechanism would be useful
+ * 
+ * @author Thomas Dudziak
+ * @version $Revision: 231306 $
+ */
+public class TableSpecificParameter extends Parameter
+{
+    /** The tables for which this parameter is applicable. */
+    private ArrayList _tables = new ArrayList();
+
+    /**
+     * Sets the tables as a comma-separated list.
+     * 
+     * @param tableList The tables
+     */
+    public void setTables(String tableList)
+    {
+        StringTokenizer tokenizer = new StringTokenizer(tableList, ",");
+
+        while (tokenizer.hasMoreTokens())
+        {
+            String tableName = tokenizer.nextToken().trim();
+
+            // TODO: Quotation, escaped characters ?
+            _tables.add(tableName);
+        }
+    }
+
+    /**
+     * Sets the single table.
+     * 
+     * @param tableName The table
+     */
+    public void setTable(String tableName)
+    {
+        _tables.add(tableName);
+    }
+
+    /**
+     * Determines whether this parameter is applicable to the given table.
+     * 
+     * @param table         The table
+     * @param caseSensitive Whether the case of the table name is relevant
+     * @return <code>true</code> if this parameter is applicable to the table
+     */
+    public boolean isForTable(Table table, boolean caseSensitive)
+    {
+        if (_tables.isEmpty())
+        {
+            return true;
+        }
+        for (Iterator it = _tables.iterator(); it.hasNext();)
+        {
+            String tableName = (String)it.next();
+
+            if ((caseSensitive  && tableName.equals(table.getName())) ||
+                (!caseSensitive && tableName.equalsIgnoreCase(table.getName())))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+}

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java?rev=349134&r1=349133&r2=349134&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java Sat Nov 26 10:33:39 2005
@@ -23,6 +23,7 @@
 
 import org.apache.ddlutils.Platform;
 import org.apache.ddlutils.model.Database;
+import org.apache.ddlutils.platform.CreationParameters;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.Task;
@@ -33,7 +34,7 @@
  * @author Thomas Dudziak
  * @version $Revision: 289996 $
  */
-public class WriteSchemaSqlToFileCommand extends DatabaseCommand
+public class WriteSchemaSqlToFileCommand extends DatabaseCommandWithCreationParameters
 {
     /** The file to output the DTD to. */
     private File _outputFile;
@@ -106,8 +107,10 @@
             throw new BuildException("Cannot overwrite output file "+_outputFile.getAbsolutePath());
         }
 
-        Platform   platform   = getPlatform();
-        Connection connection = null;
+        Platform           platform        = getPlatform();
+        boolean            isCaseSensitive = platform.getPlatformInfo().isUseDelimitedIdentifiers();
+        CreationParameters params          = getFilteredParameters(model, platform.getName(), isCaseSensitive);
+        Connection         connection      = null;
 
         try
         {
@@ -123,11 +126,11 @@
 
                 Database currentModel = platform.readModelFromDatabase();
 
-                platform.getSqlBuilder().alterDatabase(currentModel, model, _doDrops, true);
+                platform.getSqlBuilder().alterDatabase(currentModel, model, params, _doDrops, true);
             }
             else
             {
-                platform.getSqlBuilder().createTables(model, _doDrops);
+                platform.getSqlBuilder().createTables(model, params, _doDrops);
             }
             writer.close();
             task.log("Written SQL to "+_outputFile.getAbsolutePath(), Project.MSG_INFO);

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java?rev=349134&r1=349133&r2=349134&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java Sat Nov 26 10:33:39 2005
@@ -18,6 +18,7 @@
 
 import org.apache.ddlutils.Platform;
 import org.apache.ddlutils.model.Database;
+import org.apache.ddlutils.platform.CreationParameters;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.Task;
@@ -28,7 +29,7 @@
  * @author Thomas Dudziak
  * @version $Revision: 289996 $
  */
-public class WriteSchemaToDatabaseCommand extends DatabaseCommand
+public class WriteSchemaToDatabaseCommand extends DatabaseCommandWithCreationParameters
 {
     /** Whether to alter or re-set the database if it already exists. */
     private boolean _alterDb = true;
@@ -85,17 +86,19 @@
             throw new BuildException("No database specified.");
         }
 
-        Platform platform = getPlatform();
+        Platform           platform        = getPlatform();
+        boolean            isCaseSensitive = platform.getPlatformInfo().isUseDelimitedIdentifiers();
+        CreationParameters params          = getFilteredParameters(model, platform.getName(), isCaseSensitive);
 
         try
         {
             if (isAlterDatabase())
             {
-                platform.alterTables(model, _doDrops, true, true);
+                platform.alterTables(model, params, _doDrops, true, true);
             }
             else
             {
-                platform.createTables(model, _doDrops, true);
+                platform.createTables(model, params, _doDrops, true);
             }
 
             task.log("Written schema to database", Project.MSG_INFO);

Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMySqlPlatform.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMySqlPlatform.java?rev=349134&r1=349133&r2=349134&view=diff
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMySqlPlatform.java (original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMySqlPlatform.java Sat Nov 26 10:33:39 2005
@@ -17,6 +17,7 @@
  */
 
 import org.apache.ddlutils.TestPlatformBase;
+import org.apache.ddlutils.model.Database;
 import org.apache.ddlutils.platform.MySqlPlatform;
 
 /**
@@ -137,5 +138,38 @@
             "ALTER TABLE `table2` ADD CONSTRAINT `table2_FK_COL_FK_1_COL_FK_2_table1` FOREIGN KEY (`COL_FK_1`, `COL_FK_2`) REFERENCES `table1` (`COL_PK_2`, `COL_PK_1`);\n"+
             "ALTER TABLE `table3` ADD CONSTRAINT `testfk` FOREIGN KEY (`COL_FK`) REFERENCES `table2` (`COL_PK`);\n",
             createTestDatabase(TABLE_CONSTRAINT_TEST_SCHEMA));
+    }
+
+    /**
+     * Tests the usage of creation parameters.
+     */
+    public void testCreationParameters1() throws Exception
+    {
+        Database           testDb = parseDatabaseFromString(COLUMN_CONSTRAINT_TEST_SCHEMA);
+        CreationParameters params = new CreationParameters();
+
+        params.addParameter(testDb.getTable(0),
+                            "ROW_FORMAT",
+                            "COMPRESSED");
+        params.addParameter(null,
+                            "ENGINE",
+                            "INNODB");
+
+        getPlatformInfo().setCommentsSupported(false);
+        getPlatform().getSqlBuilder().createTables(testDb, params, true);
+
+        assertEqualsIgnoringWhitespaces(
+            "DROP TABLE IF EXISTS `constraints`;\n" +
+            "CREATE TABLE `constraints`\n"+
+            "(\n"+
+            "    `COL_PK`               VARCHAR(32),\n"+
+            "    `COL_PK_AUTO_INCR`     INTEGER AUTO_INCREMENT,\n"+
+            "    `COL_NOT_NULL`         CHAR(100) BINARY NOT NULL,\n"+
+            "    `COL_NOT_NULL_DEFAULT` DOUBLE DEFAULT '-2.0' NOT NULL,\n"+
+            "    `COL_DEFAULT`          CHAR(4) DEFAULT 'test',\n"+
+            "    `COL_AUTO_INCR`        BIGINT AUTO_INCREMENT,\n"+
+            "    PRIMARY KEY (`COL_PK`, `COL_PK_AUTO_INCR`)\n"+
+            ") ENGINE=INNODB ROW_FORMAT=COMPRESSED;\n",
+            getBuilderOutput());
     }
 }