Author: tomdz
Date: Thu Sep 15 14:11:43 2005
New Revision: 289319

URL: http://svn.apache.org/viewcvs?rev=289319&view=rev
Log:
Added support for defining additional parameters when creating databases; 
currently this is implemented for PostgreSQL and Derby

Added:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/task/NamedValue.java
Modified:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/DerbyPlatform.java
    
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java
    
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PostgreSqlPlatform.java
    
db/ddlutils/trunk/src/java/org/apache/ddlutils/task/CreateDatabaseCommand.java

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=289319&r1=289318&r2=289319&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/Platform.java Thu Sep 15 
14:11:43 2005
@@ -20,6 +20,7 @@
 import java.util.Collection;

 import java.util.Iterator;

 import java.util.List;

+import java.util.Map;

 

 import javax.sql.DataSource;

 

@@ -117,16 +118,17 @@
      * use a data source set via [EMAIL PROTECTED] #setDataSource(DataSource)} 
because it is not possible to

      * retrieve the connection information from it without establishing a 
connection.<br/>

      * The given connection url is the url that you'd use to connect to the 
already-created

-     * database. 

+     * database.<br/>

+     * On some platforms, this method suppurts additional parameters. These 
are documented in the

+     * manual section for the individual platforms. 

      * 

      * @param jdbcDriverClassName The jdbc driver class name

      * @param connectionUrl       The url to connect to the database if it 
were already created

      * @param username            The username for creating the database

      * @param password            The password for creating the database

-     * 

-     * TODO: Support additional parameters which are platform specific (eg. 
encoding etc.)

+     * @param parameters          Additional parameters relevant to database 
creation (which are platform specific)

      */

-    public void createDatabase(String jdbcDriverClassName, String 
connectionUrl, String username, String password) throws DynaSqlException, 
UnsupportedOperationException;

+    public void createDatabase(String jdbcDriverClassName, String 
connectionUrl, String username, String password, Map parameters) throws 
DynaSqlException, UnsupportedOperationException;

 

     /**

      * Drops the database specified by the given parameters. Please note that 
this method does not


Modified: 
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/DerbyPlatform.java
URL: 
http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/DerbyPlatform.java?rev=289319&r1=289318&r2=289319&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/DerbyPlatform.java 
(original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/DerbyPlatform.java 
Thu Sep 15 14:11:43 2005
@@ -3,6 +3,8 @@
 import java.sql.Connection;

 import java.sql.DriverManager;

 import java.sql.SQLException;

+import java.util.Iterator;

+import java.util.Map;

 

 import org.apache.ddlutils.DynaSqlException;

 

@@ -48,21 +50,47 @@
     }

 

     /* (non-Javadoc)

-     * @see 
org.apache.ddlutils.platform.PlatformImplBase#createDatabase(java.lang.String, 
java.lang.String, java.lang.String, java.lang.String)

+     * @see org.apache.ddlutils.Platform#createDatabase(java.lang.String, 
java.lang.String, java.lang.String, java.lang.String, java.util.Map)

      */

-    public void createDatabase(String jdbcDriverClassName, String 
connectionUrl, String username, String password) throws DynaSqlException, 
UnsupportedOperationException

+    public void createDatabase(String jdbcDriverClassName, String 
connectionUrl, String username, String password, Map parameters) throws 
DynaSqlException, UnsupportedOperationException

     {

         // For Derby, you create databases by simply appending ";create=true" 
to the connection url

         if (JDBC_DRIVER.equals(jdbcDriverClassName) ||

             JDBC_DRIVER_EMBEDDED.equals(jdbcDriverClassName))

         {

-            Connection connection = null;

+            StringBuffer creationUrl = new StringBuffer();

+            Connection   connection  = null;

 

+            creationUrl.append(connectionUrl);

+            creationUrl.append(";create=true");

+            if ((parameters != null) && !parameters.isEmpty())

+            {

+                for (Iterator it = parameters.entrySet().iterator(); 
it.hasNext();)

+                {

+                    Map.Entry entry = (Map.Entry)it.next();

+

+                    // no need to specify create twice (and create=false 
wouldn't help anyway)

+                    if ("create".equalsIgnoreCase(entry.getKey().toString()))

+                    {

+                        creationUrl.append(";");

+                        creationUrl.append(entry.getKey().toString());

+                        creationUrl.append("=");

+                        if (entry.getValue() != null)

+                        {

+                            creationUrl.append(entry.getValue().toString());

+                        }

+                    }

+                }

+            }

+            if (getLog().isDebugEnabled())

+            {

+                getLog().debug("About to create database using this URL: 
"+creationUrl.toString());

+            }

             try

             {

                 Class.forName(jdbcDriverClassName);

 

-                connection = DriverManager.getConnection(connectionUrl + 
";create=true", username, password);

+                connection = 
DriverManager.getConnection(creationUrl.toString(), username, password);

                 logWarnings(connection);

             }

             catch (Exception ex)


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=289319&r1=289318&r2=289319&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 
Thu Sep 15 14:11:43 2005
@@ -30,6 +30,7 @@
 import java.util.HashMap;

 import java.util.Iterator;

 import java.util.List;

+import java.util.Map;

 import java.util.StringTokenizer;

 

 import org.apache.commons.beanutils.DynaBean;

@@ -230,9 +231,9 @@
     }

 

     /* (non-Javadoc)

-     * @see org.apache.ddlutils.Platform#createDatabase(java.lang.String, 
java.lang.String, java.lang.String, java.lang.String)

+     * @see org.apache.ddlutils.Platform#createDatabase(java.lang.String, 
java.lang.String, java.lang.String, java.lang.String, java.util.Map)

      */

-    public void createDatabase(String jdbcDriverClassName, String 
connectionUrl, String username, String password) throws DynaSqlException, 
UnsupportedOperationException

+    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 "+getDatabaseName());

     }


Modified: 
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PostgreSqlPlatform.java
URL: 
http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PostgreSqlPlatform.java?rev=289319&r1=289318&r2=289319&view=diff
==============================================================================
--- 
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PostgreSqlPlatform.java 
(original)
+++ 
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PostgreSqlPlatform.java 
Thu Sep 15 14:11:43 2005
@@ -21,6 +21,8 @@
 import java.sql.SQLException;

 import java.sql.Statement;

 import java.sql.Types;

+import java.util.Iterator;

+import java.util.Map;

 

 import org.apache.ddlutils.DynaSqlException;

 import org.apache.ddlutils.PlatformInfo;

@@ -97,9 +99,10 @@
      * @param connectionUrl       The url to connect to the database if it 
were already created

      * @param username            The username for creating the database

      * @param password            The password for creating the database

+     * @param parameters          Additional parameters for the operation

      * @param createDb            Whether to create or drop the database

      */

-    private void createOrDropDatabase(String jdbcDriverClassName, String 
connectionUrl, String username, String password, boolean createDb) throws 
DynaSqlException, UnsupportedOperationException

+    private void createOrDropDatabase(String jdbcDriverClassName, String 
connectionUrl, String username, String password, Map parameters, boolean 
createDb) throws DynaSqlException, UnsupportedOperationException

     {

         if (JDBC_DRIVER.equals(jdbcDriverClassName))

         {

@@ -110,25 +113,42 @@
                 throw new DynaSqlException("Cannot parse the given connection 
url "+connectionUrl);

             }

 

-            int        paramPos   = connectionUrl.lastIndexOf('?');

-            String     dbName     = (paramPos > slashPos ? 
connectionUrl.substring(slashPos + 1, paramPos) : 
connectionUrl.substring(slashPos + 1));

-            Connection connection = null;

-            Statement  stmt       = null;

+            int          paramPos   = connectionUrl.lastIndexOf('?');

+            String       baseDb     = connectionUrl.substring(0, slashPos + 1) 
+ "template1";

+            String       dbName     = (paramPos > slashPos ? 
connectionUrl.substring(slashPos + 1, paramPos) : 
connectionUrl.substring(slashPos + 1));

+            Connection   connection = null;

+            Statement    stmt       = null;

+            StringBuffer sql        = new StringBuffer();

+

+            sql.append(createDb ? "CREATE" : "DROP");

+            sql.append(" DATABASE ");

+            sql.append(dbName);

+            if ((parameters != null) && !parameters.isEmpty())

+            {

+                for (Iterator it = parameters.entrySet().iterator(); 
it.hasNext();)

+                {

+                    Map.Entry entry = (Map.Entry)it.next();

 

+                    sql.append(" ");

+                    sql.append(entry.getKey().toString());

+                    if (entry.getValue() != null)

+                    {

+                        sql.append(" ");

+                        sql.append(entry.getValue().toString());

+                    }

+                }

+            }

+            if (getLog().isDebugEnabled())

+            {

+                getLog().debug("About to create database via "+baseDb+" using 
this SQL: "+sql.toString());

+            }

             try

             {

                 Class.forName(jdbcDriverClassName);

 

-                connection = 
DriverManager.getConnection(connectionUrl.substring(0, slashPos + 1) + 
"template1", username, password);

+                connection = DriverManager.getConnection(baseDb, username, 
password);

                 stmt       = connection.createStatement();

-                if (createDb)

-                {

-                    stmt.execute("CREATE DATABASE "+dbName);

-                }

-                else

-                {

-                    stmt.execute("DROP DATABASE "+dbName);

-                }

+                stmt.execute(sql.toString());

                 logWarnings(connection);

             }

             catch (Exception ex)

@@ -164,13 +184,13 @@
     }

 

     /* (non-Javadoc)

-     * @see 
org.apache.ddlutils.platform.PlatformImplBase#createDatabase(java.lang.String, 
java.lang.String, java.lang.String, java.lang.String)

+     * @see org.apache.ddlutils.Platform#createDatabase(java.lang.String, 
java.lang.String, java.lang.String, java.lang.String, java.util.Map)

      */

-    public void createDatabase(String jdbcDriverClassName, String 
connectionUrl, String username, String password) throws DynaSqlException, 
UnsupportedOperationException

+    public void createDatabase(String jdbcDriverClassName, String 
connectionUrl, String username, String password, Map parameters) throws 
DynaSqlException, UnsupportedOperationException

     {

         // With PostgreSQL, you create a database by executing "CREATE 
DATABASE" in an existing database (usually 

         // the template1 database because it usually exists)

-        createOrDropDatabase(jdbcDriverClassName, connectionUrl, username, 
password, true);

+        createOrDropDatabase(jdbcDriverClassName, connectionUrl, username, 
password, parameters, true);

     }

 

     /* (non-Javadoc)

@@ -180,7 +200,7 @@
     {

         // With PostgreSQL, you create a database by executing "DROP DATABASE" 
in an existing database (usually 

         // the template1 database because it usually exists)

-        createOrDropDatabase(jdbcDriverClassName, connectionUrl, username, 
password, false);

+        createOrDropDatabase(jdbcDriverClassName, connectionUrl, username, 
password, null, false);

     }

 

     


Modified: 
db/ddlutils/trunk/src/java/org/apache/ddlutils/task/CreateDatabaseCommand.java
URL: 
http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/CreateDatabaseCommand.java?rev=289319&r1=289318&r2=289319&view=diff
==============================================================================
--- 
db/ddlutils/trunk/src/java/org/apache/ddlutils/task/CreateDatabaseCommand.java 
(original)
+++ 
db/ddlutils/trunk/src/java/org/apache/ddlutils/task/CreateDatabaseCommand.java 
Thu Sep 15 14:11:43 2005
@@ -16,6 +16,7 @@
  * limitations under the License.

  */

 

+import org.apache.commons.collections.map.ListOrderedMap;

 import org.apache.commons.dbcp.BasicDataSource;

 import org.apache.ddlutils.Platform;

 import org.apache.ddlutils.model.Database;

@@ -25,9 +26,25 @@
 

 /**

  * Command for creating a database.

+ * 

+ * @author <a href="mailto:[EMAIL PROTECTED]">Thomas Dudziak</a>

+ * @version $Revision: 231306 $

  */

 public class CreateDatabaseCommand extends DatabaseCommand

 {

+    /** The additional creation parameters */

+    private ListOrderedMap _parameters = new ListOrderedMap();

+

+    /**

+     * Adds a parameter which is a name-value pair.

+     * 

+     * @param param The parameter

+     */

+    public void addConfiguredParameter(NamedValue param)

+    {

+        _parameters.put(param.getName(), param.getValue());

+    }

+

     /* (non-Javadoc)

      * @see 
org.apache.ddlutils.task.Command#execute(org.apache.tools.ant.Task, 
org.apache.ddlutils.model.Database)

      */

@@ -47,7 +64,8 @@
             platform.createDatabase(dataSource.getDriverClassName(),

                                     dataSource.getUrl(),

                                     dataSource.getUsername(),

-                                    dataSource.getPassword());

+                                    dataSource.getPassword(),

+                                    _parameters);

 

             task.log("Created database", Project.MSG_INFO);

         }


Added: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/NamedValue.java
URL: 
http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/NamedValue.java?rev=289319&view=auto
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/NamedValue.java (added)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/NamedValue.java Thu Sep 
15 14:11:43 2005
@@ -0,0 +1,55 @@
+package org.apache.ddlutils.task;

+

+/**

+ * A name-value pair.

+ * 

+ * @author <a href="mailto:[EMAIL PROTECTED]">Thomas Dudziak</a>

+ * @version $Revision: 231306 $

+ */

+public class NamedValue

+{

+    /** The name */

+    private String _name;

+    /** The value */

+    private String _value;

+

+    /**

+     * Returns the name.

+     *

+     * @return The name

+     */

+    public String getName()

+    {

+        return _name;

+    }

+

+    /**

+     * Sets the name.

+     *

+     * @param name The name

+     */

+    public void setName(String name)

+    {

+        _name = name;

+    }

+

+    /**

+     * Returns the value.

+     *

+     * @return The value

+     */

+    public String getValue()

+    {

+        return _value;

+    }

+

+    /**

+     * Sets the value.

+     *

+     * @param value The value

+     */

+    public void setValue(String value)

+    {

+        _value = value;

+    }

+}



Reply via email to