/** * Licensed to JumpMind Inc under one or more contributor * license agreements. See the NOTICE file distributed * with this work for additional information regarding * copyright ownership. JumpMind Inc licenses this file * to you under the GNU General Public License, version 3.0 (GPLv3) * (the "License"); you may not use this file except in compliance * with the License. * * You should have received a copy of the GNU General Public License, * version 3.0 (GPLv3) along with this library; if not, see * <http://www.gnu.org/licenses/>. * * 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. */ package org.jumpmind.db.platform.informix; import java.sql.Types; import java.util.Map; import org.jumpmind.db.alter.PrimaryKeyChange; import org.jumpmind.db.alter.RemovePrimaryKeyChange; import org.jumpmind.db.model.Column; import org.jumpmind.db.model.Database; import org.jumpmind.db.model.ForeignKey; import org.jumpmind.db.model.Table; import org.jumpmind.db.platform.AbstractDdlBuilder; import org.jumpmind.db.platform.DatabaseNamesConstants; public class InformixDdlBuilder extends AbstractDdlBuilder { public InformixDdlBuilder() { super(DatabaseNamesConstants.INFORMIX); databaseInfo.addNativeTypeMapping(Types.VARCHAR, "VARCHAR", Types.VARCHAR); databaseInfo.addNativeTypeMapping(Types.LONGVARCHAR, "LVARCHAR", Types.LONGVARCHAR); databaseInfo.addNativeTypeMapping(Types.LONGVARBINARY, "BLOB", Types.BLOB); databaseInfo.addNativeTypeMapping(Types.TIMESTAMP, "DATETIME YEAR TO FRACTION", Types.TIMESTAMP); databaseInfo.addNativeTypeMapping(Types.TIME, "DATETIME YEAR TO FRACTION", Types.TIMESTAMP); databaseInfo.addNativeTypeMapping(Types.BINARY, "BYTE", Types.BINARY); databaseInfo.addNativeTypeMapping(Types.VARBINARY, "BYTE", Types.BINARY); databaseInfo.addNativeTypeMapping(Types.BIT, "BOOLEAN", Types.BOOLEAN); databaseInfo.addNativeTypeMapping(Types.TINYINT, "SMALLINT", Types.SMALLINT); databaseInfo.addNativeTypeMapping(Types.DOUBLE, "FLOAT", Types.DOUBLE); databaseInfo.setDefaultSize(Types.VARCHAR, 255); databaseInfo.setDefaultSize(Types.CHAR, 255); databaseInfo.setAlterTableForDropUsed(true); databaseInfo.setSystemIndicesReturned(true); databaseInfo.setCatalogSeparator(":"); databaseInfo.setNonBlankCharColumnSpacePadded(true); databaseInfo.setBlankCharColumnSpacePadded(true); databaseInfo.setCharColumnSpaceTrimmed(false); databaseInfo.setEmptyStringNulled(false); databaseInfo.setAutoIncrementUpdateAllowed(false); Map<String, String> env = System.getenv(); String clientIdentifierMode = env.get("DELIMIDENT"); if (clientIdentifierMode != null && clientIdentifierMode.equalsIgnoreCase("y")) { databaseInfo.setDelimiterToken("\""); databaseInfo.setDelimitedIdentifiersSupported(true); } else { databaseInfo.setDelimiterToken(""); databaseInfo.setDelimitedIdentifiersSupported(false); } } @Override protected void writeColumn(Table table, Column column, StringBuilder ddl) { if (column.isAutoIncrement()) { printIdentifier(getColumnName(column), ddl); if (column.getMappedTypeCode() == Types.BIGINT) { ddl.append(" BIGSERIAL"); } else { ddl.append(" SERIAL"); } } else { super.writeColumn(table, column, ddl); } } @Override public String getSelectLastIdentityValues(Table table) { return "select dbinfo('sqlca.sqlerrd1') from sysmaster:sysdual"; } @Override protected void writeExternalPrimaryKeysCreateStmt(Table table, Column primaryKeyColumns[], StringBuilder ddl) { if (primaryKeyColumns.length > 0 && shouldGeneratePrimaryKeys(primaryKeyColumns)) { ddl.append("ALTER TABLE "); ddl.append(getFullyQualifiedTableNameShorten(table)); printIndent(ddl); ddl.append("ADD CONSTRAINT "); writePrimaryKeyStmt(table, primaryKeyColumns, ddl); ddl.append(" CONSTRAINT "); printIdentifier(getConstraintName(null, table, "PK", null), ddl); printEndOfStatement(ddl); } } protected void writeExternalForeignKeyCreateStmt(Database database, Table table, ForeignKey key, StringBuilder ddl) { if (key.getForeignTableName() == null) { log.warn("Foreign key table is null for key " + key); } else { writeTableAlterStmt(table, ddl); ddl.append("ADD CONSTRAINT FOREIGN KEY ("); writeLocalReferences(key, ddl); ddl.append(") REFERENCES "); printIdentifier(getTableName(key.getForeignTableName()), ddl); ddl.append(" ("); writeForeignReferences(key, ddl); ddl.append(") CONSTRAINT "); printIdentifier(getForeignKeyName(table, key), ddl); printEndOfStatement(ddl); } } protected void processChange(Database currentModel, Database desiredModel, RemovePrimaryKeyChange change, StringBuilder ddl) { ddl.append("ALTER TABLE "); ddl.append(getFullyQualifiedTableNameShorten(change.getChangedTable())); printIndent(ddl); ddl.append("DROP CONSTRAINT "); printIdentifier(getConstraintName(null, change.getChangedTable(), "PK", null), ddl); printEndOfStatement(ddl); change.apply(currentModel, delimitedIdentifierModeOn); } protected void processChange(Database currentModel, Database desiredModel, PrimaryKeyChange change, StringBuilder ddl) { ddl.append("ALTER TABLE "); ddl.append(getFullyQualifiedTableNameShorten(change.getChangedTable())); printIndent(ddl); ddl.append("DROP CONSTRAINT "); printIdentifier(getConstraintName(null, change.getChangedTable(), "PK", null), ddl); printEndOfStatement(ddl); writeExternalPrimaryKeysCreateStmt(change.getChangedTable(), change.getNewPrimaryKeyColumns(), ddl); change.apply(currentModel, delimitedIdentifierModeOn); } }