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/12/29 23:43:23 UTC

svn commit: r359917 - in /db/ddlutils/trunk/src/java/org/apache/ddlutils/platform: JdbcModelReader.java hsqldb/HsqlDbModelReader.java

Author: tomdz
Date: Thu Dec 29 14:43:18 2005
New Revision: 359917

URL: http://svn.apache.org/viewcvs?rev=359917&view=rev
Log:
Added workaround for determining auto-increment columns from Hsqldb databases

Modified:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/JdbcModelReader.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbModelReader.java

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/JdbcModelReader.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/JdbcModelReader.java?rev=359917&r1=359916&r2=359917&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/JdbcModelReader.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/JdbcModelReader.java Thu Dec 29 14:43:18 2005
@@ -76,6 +76,8 @@
     private String _defaultTablePattern = "%";
     /** The table types to recognize per default. */
     private String[] _defaultTableTypes = { "TABLE" };
+    /** The active connection while reading a database model. */
+    private Connection _connection;
 
     /**
      * Creates a new model reader instance.
@@ -356,6 +358,17 @@
     }
 
     /**
+     * Returns the active connection. Note that this is only set during a call to
+     * {@link #readTables(String, String, String[])}.
+     *
+     * @return The connection or <code>null</code> if there is no active connection
+     */
+    protected Connection getConnection()
+    {
+        return _connection;
+    }
+
+    /**
      * Reads the database model from the given connection.
      * 
      * @param connection The connection
@@ -402,20 +415,27 @@
         {
             db.setName(name);
         }
-        db.addTables(readTables(connection, catalog, schema, tableTypes));
+        try
+        {
+            _connection = connection;
+            db.addTables(readTables(catalog, schema, tableTypes));
+        }
+        finally
+        {
+            _connection = null;
+        }
         return db;
     }
 
     /**
      * Reads the tables from the database metadata.
      * 
-     * @param connection    The connection
      * @param catalog       The catalog to acess in the database; use <code>null</code> for the default value
      * @param schemaPattern The schema(s) to acess in the database; use <code>null</code> for the default value
      * @param tableTypes    The table types to process; use <code>null</code> or an empty list for the default ones
      * @return The tables
      */
-    protected Collection readTables(Connection connection, String catalog, String schemaPattern, String[] tableTypes) throws SQLException
+    protected Collection readTables(String catalog, String schemaPattern, String[] tableTypes) throws SQLException
     {
         ResultSet tableData = null;
 
@@ -423,7 +443,7 @@
         {
             DatabaseMetaDataWrapper metaData = new DatabaseMetaDataWrapper();
 
-            metaData.setMetaData(connection.getMetaData());
+            metaData.setMetaData(_connection.getMetaData());
             metaData.setCatalog(catalog == null ? getDefaultCatalogPattern() : catalog);
             metaData.setSchemaPattern(schemaPattern == null ? getDefaultSchemaPattern() : schemaPattern);
             metaData.setTableTypes((tableTypes == null) || (tableTypes.length == 0) ? getDefaultTableTypes() : tableTypes);

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbModelReader.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbModelReader.java?rev=359917&r1=359916&r2=359917&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbModelReader.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbModelReader.java Thu Dec 29 14:43:18 2005
@@ -16,10 +16,18 @@
  * limitations under the License.
  */
 
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Map;
+
 import org.apache.ddlutils.PlatformInfo;
+import org.apache.ddlutils.model.Column;
 import org.apache.ddlutils.model.ForeignKey;
 import org.apache.ddlutils.model.Index;
 import org.apache.ddlutils.model.Table;
+import org.apache.ddlutils.platform.DatabaseMetaDataWrapper;
 import org.apache.ddlutils.platform.JdbcModelReader;
 
 /**
@@ -40,6 +48,66 @@
         super(platformInfo);
         setDefaultCatalogPattern(null);
         setDefaultSchemaPattern(null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected Table readTable(DatabaseMetaDataWrapper metaData, Map values) throws SQLException
+    {
+        Table table = super.readTable(metaData, values);
+
+        // For at least version 1.7.2 we have to determine the auto-increment columns
+        // from a result set meta data because the database does not put this info
+        // into the database metadata
+        // Since Hsqldb only allows IDENTITY for primary key columns, we restrict
+        // our search to those columns
+        Column[]     pks   = table.getPrimaryKeyColumns();
+        StringBuffer query = new StringBuffer();
+
+        query.append("SELECT ");
+        for (int idx = 0; idx < pks.length; idx++)
+        {
+            if (idx > 0)
+            {
+                query.append(",");
+            }
+            if (getPlatformInfo().isUseDelimitedIdentifiers())
+            {
+                query.append("\"");
+            }
+            query.append(pks[idx].getName());
+            if (getPlatformInfo().isUseDelimitedIdentifiers())
+            {
+                query.append("\"");
+            }
+        }
+        query.append(" FROM ");
+        if (getPlatformInfo().isUseDelimitedIdentifiers())
+        {
+            query.append("\"");
+        }
+        query.append(table.getName());
+        if (getPlatformInfo().isUseDelimitedIdentifiers())
+        {
+            query.append("\"");
+        }
+        query.append(" WHERE 1 = 0");
+        
+        Statement         stmt       = getConnection().createStatement();
+        ResultSet         rs         = stmt.executeQuery(query.toString());
+        ResultSetMetaData rsMetaData = rs.getMetaData();
+
+        for (int idx = 0; idx < pks.length; idx++)
+        {
+            if (rsMetaData.isAutoIncrement(idx + 1))
+            {
+                pks[idx].setAutoIncrement(true);
+            }
+        }
+        stmt.close();
+        
+        return table;
     }
 
     /**