Author: tomdz
Date: Tue Jul  4 07:36:50 2006
New Revision: 419021

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

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

Modified: 
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseBuilder.java
URL: 
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseBuilder.java?rev=419021&r1=419020&r2=419021&view=diff
==============================================================================
--- 
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseBuilder.java
 (original)
+++ 
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseBuilder.java
 Tue Jul  4 07:36:50 2006
@@ -76,41 +76,13 @@
     public void createTable(Database database, Table table, Map parameters) 
throws IOException
     {
         super.createTable(database, table, parameters);
-        print("COMMIT");
-        printEndOfStatement();
 
         // creating generator and trigger for auto-increment
         Column[] columns = table.getAutoIncrementColumns();
 
         for (int idx = 0; idx < columns.length; idx++)
         {
-            print("CREATE GENERATOR ");
-            printIdentifier(getConstraintName("gen", table, 
columns[idx].getName(), null));
-            printEndOfStatement();
-            print("COMMIT");
-            printEndOfStatement();
-            print("SET TERM !!");
-            printEndOfStatement();
-            print("CREATE TRIGGER ");
-            printIdentifier(getConstraintName("trg", table, 
columns[idx].getName(), null));
-            print(" FOR ");
-            printlnIdentifier(getTableName(table));
-            println("ACTIVE BEFORE INSERT POSITION 0 AS");
-            println("BEGIN");
-            print("IF (NEW.");
-            printIdentifier(getColumnName(columns[idx]));
-            println(" IS NULL) THEN");
-            print("NEW.");
-            printIdentifier(getColumnName(columns[idx]));
-            print(" = GEN_ID(");
-            printIdentifier(getConstraintName("gen", table, 
columns[idx].getName(), null));
-            println(", 1);");
-            println("END !!");
-            print("SET TERM ");
-            print(getPlatformInfo().getSqlCommandDelimiter());
-            println(" !!");
-            print("COMMIT");
-            printEndOfStatement();
+            writeAutoIncrementCreateStmts(database, table, columns[idx]);
         }
     }
 
@@ -140,15 +112,66 @@
 
         for (int idx = 0; idx < columns.length; idx++)
         {
-            print("DELETE FROM RDB$GENERATOR WHERE RDB$GENERATOR_NAME = ");
-            printIdentifier(getConstraintName("gen", table, 
columns[idx].getName(), null));
-            printEndOfStatement();
-            print("COMMIT");
-            printEndOfStatement();
+            writeAutoIncrementDropStmts(table, columns[idx]);
         }
         super.dropTable(table);
-        print("COMMIT");
+    }
+
+    /**
+     * Writes the creation statements to make the given column an 
auto-increment column.
+     * 
+     * @param database The database model
+     * @param table    The table
+     * @param column   The column to make auto-increment
+     */
+    private void writeAutoIncrementCreateStmts(Database database, Table table, 
Column column) throws IOException
+    {
+        print("CREATE GENERATOR ");
+        printIdentifier(getGeneratorName(table, column));
         printEndOfStatement();
+
+        print("CREATE TRIGGER ");
+        printIdentifier(getConstraintName("trg", table, column.getName(), 
null));
+        print(" FOR ");
+        printlnIdentifier(getTableName(table));
+        println("ACTIVE BEFORE INSERT POSITION 0 AS");
+        print("BEGIN IF (NEW.");
+        printIdentifier(getColumnName(column));
+        print(" IS NULL) THEN NEW.");
+        printIdentifier(getColumnName(column));
+        print(" = GEN_ID(");
+        printIdentifier(getGeneratorName(table, column));
+        print(", 1); END");
+        printEndOfStatement();
+    }
+
+    /**
+     * Writes the statements to drop the auto-increment status for the given 
column.
+     * 
+     * @param table  The table
+     * @param column The column to remove the auto-increment status for
+     */
+    private void writeAutoIncrementDropStmts(Table table, Column column) 
throws IOException
+    {
+        print("DROP TRIGGER ");
+        printIdentifier(getConstraintName("trg", table, column.getName(), 
null));
+        printEndOfStatement();
+
+        print("DROP GENERATOR ");
+        printIdentifier(getGeneratorName(table, column));
+        printEndOfStatement();
+    }
+
+    /**
+     * Determines the name of the generator for an auto-increment column.
+     * 
+     * @param table  The table
+     * @param column The auto-increment column
+     * @return The generator name
+     */
+    protected String getGeneratorName(Table table, Column column)
+    {
+        return getConstraintName("gen", table, column.getName(), null);
     }
 
     /**
@@ -178,7 +201,7 @@
             for (int idx = 0; idx < columns.length; idx++)
             {
                 result.append("GEN_ID(");
-                result.append(getConstraintName("gen", table, 
columns[idx].getName(), null));
+                result.append(getGeneratorName(table, columns[idx]));
                 result.append(", 0)");
             }
             result.append(" FROM RDB$DATABASE");

Modified: 
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseModelReader.java
URL: 
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseModelReader.java?rev=419021&r1=419020&r2=419021&view=diff
==============================================================================
--- 
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseModelReader.java
 (original)
+++ 
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbaseModelReader.java
 Tue Jul  4 07:36:50 2006
@@ -16,11 +16,14 @@
  * limitations under the License.
  */
 
+import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Statement;
 import java.sql.Types;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -28,6 +31,7 @@
 import org.apache.ddlutils.model.Column;
 import org.apache.ddlutils.model.Index;
 import org.apache.ddlutils.model.Table;
+import org.apache.ddlutils.model.TypeMap;
 import org.apache.ddlutils.platform.DatabaseMetaDataWrapper;
 import org.apache.ddlutils.platform.JdbcModelReader;
 
@@ -56,6 +60,24 @@
     /**
      * [EMAIL PROTECTED]
      */
+    protected Table readTable(DatabaseMetaDataWrapper metaData, Map values) 
throws SQLException
+    {
+        Table table = super.readTable(metaData, values);
+
+        if (table != null)
+        {
+            determineColumnSizes(table);
+            determineColumnDefaultValues(table);
+            determineAutoIncrementColumns(table);
+            adjustColumns(table);
+        }
+
+        return table;
+    }
+
+    /**
+     * [EMAIL PROTECTED]
+     */
     protected Collection readColumns(DatabaseMetaDataWrapper metaData, String 
tableName) throws SQLException
     {
         ResultSet columnData = null;
@@ -105,17 +127,163 @@
     }
 
     /**
+     * Helper method that determines the column default values using 
Interbase's system tables.
+     *
+     * @param table The table
+     */
+    protected void determineColumnDefaultValues(Table table) throws 
SQLException
+    {
+        PreparedStatement prepStmt = getConnection().prepareStatement("SELECT 
RDB$FIELD_NAME, RDB$DEFAULT_SOURCE FROM RDB$RELATION_FIELDS WHERE 
RDB$RELATION_NAME=?");
+
+        try
+        {
+            prepStmt.setString(1, getPlatform().isDelimitedIdentifierModeOn() 
? table.getName() : table.getName().toUpperCase());
+
+            ResultSet rs = prepStmt.executeQuery();
+
+            while (rs.next())
+            {
+                String columnName = rs.getString(1).trim();
+                Column column     = table.findColumn(columnName, 
getPlatform().isDelimitedIdentifierModeOn());
+
+                if (column != null)
+                {
+                    String defaultValue = rs.getString(2);
+
+                    if (!rs.wasNull() && (defaultValue != null))
+                    {
+                        defaultValue = defaultValue.trim();
+                        if (defaultValue.startsWith("DEFAULT "))
+                        {
+                            defaultValue = defaultValue.substring("DEFAULT 
".length());
+                        }
+                        column.setDefaultValue(defaultValue);
+                    }
+                }
+            }
+            rs.close();
+        }
+        finally
+        {
+            prepStmt.close();
+        }
+    }
+
+    /**
+     * Helper method that determines the column sizes (precision, scale) using 
Interbase's system tables.
+     *
+     * @param table The table
+     */
+    protected void determineColumnSizes(Table table) throws SQLException
+    {
+        PreparedStatement prepStmt = getConnection().prepareStatement("SELECT 
a.RDB$FIELD_NAME, b.RDB$FIELD_PRECISION, b.RDB$FIELD_SCALE FROM 
RDB$RELATION_FIELDS a, RDB$FIELDS b WHERE a.RDB$RELATION_NAME=? AND 
a.RDB$FIELD_SOURCE=b.RDB$FIELD_NAME");
+
+        try
+        {
+            prepStmt.setString(1, getPlatform().isDelimitedIdentifierModeOn() 
? table.getName() : table.getName().toUpperCase());
+
+            ResultSet rs = prepStmt.executeQuery();
+
+            while (rs.next())
+            {
+                String columnName = rs.getString(1).trim();
+                Column column     = table.findColumn(columnName, 
getPlatform().isDelimitedIdentifierModeOn());
+
+                if (column != null)
+                {
+                    short   precision          = rs.getShort(2);
+                    boolean precisionSpecified = !rs.wasNull();
+                    short   scale              = rs.getShort(3);
+                    boolean scaleSpecified     = !rs.wasNull();
+
+                    if (precisionSpecified)
+                    {
+                        // for some reason, Interbase stores the negative scale
+                        column.setSizeAndScale(precision, scaleSpecified ? 
-scale : 0);
+                    }
+                }
+            }
+            rs.close();
+        }
+        finally
+        {
+            prepStmt.close();
+        }
+    }
+
+    /**
+     * Helper method that determines the auto increment status using 
Interbase's system tables.
+     *
+     * @param table The table
+     */
+    protected void determineAutoIncrementColumns(Table table) throws 
SQLException
+    {
+        // Since for long table and column names, the generator name will be 
shortened
+        // we have to determine for each column whether there is a generator 
for it
+        InterbaseBuilder builder = 
(InterbaseBuilder)getPlatform().getSqlBuilder();
+        Column[]         columns = table.getColumns();
+        HashMap          names   = new HashMap();
+        String           name;
+
+        for (int idx = 0; idx < columns.length; idx++)
+        {
+            name = builder.getGeneratorName(table, columns[idx]);
+            if (!getPlatform().isDelimitedIdentifierModeOn())
+            {
+                name = name.toUpperCase();
+            }
+            names.put(name, columns[idx]);
+        }
+
+        Statement stmt = getConnection().createStatement();
+
+        try
+        {
+            ResultSet rs = stmt.executeQuery("SELECT RDB$GENERATOR_NAME FROM 
RDB$GENERATORS");
+
+            while (rs.next())
+            {
+                String generatorName = rs.getString(1).trim();
+                Column column        = (Column)names.get(generatorName);
+
+                if (column != null)
+                {
+                    column.setAutoIncrement(true);
+                }
+            }
+            rs.close();
+        }
+        finally
+        {
+            stmt.close();
+        }
+    }
+
+    /**
      * [EMAIL PROTECTED]
      */
-    protected Column readColumn(DatabaseMetaDataWrapper metaData, Map values) 
throws SQLException
+    protected void adjustColumns(Table table)
     {
-        Column column = super.readColumn(metaData, values);
+        Column[] columns = table.getColumns();
 
-        if (column.getTypeCode() == Types.FLOAT)
+        for (int idx = 0; idx < columns.length; idx++)
         {
-            column.setTypeCode(Types.REAL);
+            if (columns[idx].getTypeCode() == Types.FLOAT)
+            {
+                columns[idx].setTypeCode(Types.REAL);
+            }
+            else if ((columns[idx].getTypeCode() == Types.NUMERIC) || 
(columns[idx].getTypeCode() == Types.DECIMAL))
+            {
+                if ((columns[idx].getTypeCode() == Types.NUMERIC) && 
(columns[idx].getSizeAsInt() == 18) && (columns[idx].getScale() == 0))
+                {
+                    columns[idx].setTypeCode(Types.BIGINT);
+                }
+            }
+            else if (TypeMap.isTextType(columns[idx].getTypeCode()))
+            {
+                
columns[idx].setDefaultValue(unescape(columns[idx].getDefaultValue(), "'", 
"''"));
+            }
         }
-        return column;
     }
 
     /**

Modified: 
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbasePlatform.java
URL: 
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbasePlatform.java?rev=419021&r1=419020&r2=419021&view=diff
==============================================================================
--- 
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbasePlatform.java
 (original)
+++ 
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/interbase/InterbasePlatform.java
 Tue Jul  4 07:36:50 2006
@@ -52,26 +52,27 @@
         info.setCommentSuffix("*/");
 
         // BINARY and VARBINARY are also handled by the 
InterbaseBuilder.getSqlType method
-        info.addNativeTypeMapping(Types.ARRAY,         "BLOB");
+        info.addNativeTypeMapping(Types.ARRAY,         "BLOB",               
Types.LONGVARBINARY);
         info.addNativeTypeMapping(Types.BIGINT,        "NUMERIC(18,0)");
-        info.addNativeTypeMapping(Types.BINARY,        "CHAR {0} CHARACTER SET 
OCTETS");
-        info.addNativeTypeMapping(Types.BIT,           "SMALLINT",         
Types.SMALLINT);
-        info.addNativeTypeMapping(Types.CLOB,          "BLOB SUB_TYPE TEXT");
-        info.addNativeTypeMapping(Types.DISTINCT,      "BLOB");
+        info.addNativeTypeMapping(Types.BINARY,        "BLOB",               
Types.LONGVARBINARY);
+        info.addNativeTypeMapping(Types.BIT,           "SMALLINT",           
Types.SMALLINT);
+        info.addNativeTypeMapping(Types.BLOB,          "BLOB",               
Types.LONGVARBINARY);
+        info.addNativeTypeMapping(Types.CLOB,          "BLOB SUB_TYPE TEXT", 
Types.VARCHAR);
+        info.addNativeTypeMapping(Types.DISTINCT,      "BLOB",               
Types.LONGVARBINARY);
         info.addNativeTypeMapping(Types.DOUBLE,        "DOUBLE PRECISION");
-        info.addNativeTypeMapping(Types.FLOAT,         "DOUBLE PRECISION", 
Types.DOUBLE);
-        info.addNativeTypeMapping(Types.JAVA_OBJECT,   "BLOB");
-        info.addNativeTypeMapping(Types.LONGVARBINARY, "BLOB");
-        info.addNativeTypeMapping(Types.LONGVARCHAR,   "BLOB SUB_TYPE TEXT");
-        info.addNativeTypeMapping(Types.NULL,          "BLOB");
-        info.addNativeTypeMapping(Types.OTHER,         "BLOB");
+        info.addNativeTypeMapping(Types.FLOAT,         "DOUBLE PRECISION",   
Types.DOUBLE);
+        info.addNativeTypeMapping(Types.JAVA_OBJECT,   "BLOB",               
Types.LONGVARBINARY);
+        info.addNativeTypeMapping(Types.LONGVARBINARY, "BLOB",               
Types.LONGVARBINARY);
+        info.addNativeTypeMapping(Types.LONGVARCHAR,   "BLOB SUB_TYPE TEXT", 
Types.VARCHAR);
+        info.addNativeTypeMapping(Types.NULL,          "BLOB",               
Types.LONGVARBINARY);
+        info.addNativeTypeMapping(Types.OTHER,         "BLOB",               
Types.LONGVARBINARY);
         info.addNativeTypeMapping(Types.REAL,          "FLOAT");
-        info.addNativeTypeMapping(Types.REF,           "BLOB");
-        info.addNativeTypeMapping(Types.STRUCT,        "BLOB");
-        info.addNativeTypeMapping(Types.TINYINT,       "SMALLINT",         
Types.SMALLINT);
-        info.addNativeTypeMapping(Types.VARBINARY,     "VARCHAR {0} CHARACTER 
SET OCTETS");
+        info.addNativeTypeMapping(Types.REF,           "BLOB",               
Types.LONGVARBINARY);
+        info.addNativeTypeMapping(Types.STRUCT,        "BLOB",               
Types.LONGVARBINARY);
+        info.addNativeTypeMapping(Types.TINYINT,       "SMALLINT",           
Types.SMALLINT);
+        info.addNativeTypeMapping(Types.VARBINARY,     "BLOB",               
Types.LONGVARBINARY);
         info.addNativeTypeMapping("BOOLEAN",  "SMALLINT", "SMALLINT");
-        info.addNativeTypeMapping("DATALINK", "BLOB");
+        info.addNativeTypeMapping("DATALINK", "BLOB",     "LONGVARBINARY");
 
         setSqlBuilder(new InterbaseBuilder(this));
         setModelReader(new InterbaseModelReader(this));


Reply via email to