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));