package liquibase.snapshot.jvm;
import liquibase.database.Database;
import liquibase.database.core.InformixDatabase;
import liquibase.database.structure.Column;
import liquibase.database.structure.ForeignKey;
import liquibase.database.structure.ForeignKeyInfo;
import liquibase.exception.DatabaseException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class InformixDatabaseSnapshotGenerator extends JdbcDatabaseSnapshotGenerator {
private static final Map<Integer, String> qualifiers = new HashMap<Integer, String>();
static {
qualifiers.put(0, "YEAR");
qualifiers.put(2, "MONTH");
qualifiers.put(4, "DAY");
qualifiers.put(6, "HOUR");
qualifiers.put(8, "MINUTE");
qualifiers.put(10, "SECOND");
qualifiers.put(11, "FRACTION(1)");
qualifiers.put(12, "FRACTION(2)");
qualifiers.put(13, "FRACTION(3)");
qualifiers.put(14, "FRACTION(4)");
qualifiers.put(15, "FRACTION(5)");
}
public boolean supports(Database database) {
return database instanceof InformixDatabase;
}
public int getPriority(Database database) {
return PRIORITY_DATABASE;
}
@Override
protected void getColumnTypeAndDefValue(Column columnInfo, ResultSet rs, Database database) throws SQLException, DatabaseException {
// See http://publib.boulder.ibm.com/infocenter/idshelp/v115/topic/com.ibm.sqlr.doc/sqlr07.htm
String typeName = rs.getString("TYPE_NAME").toUpperCase();
if ("DATETIME".equals(typeName) || "INTERVAL".equals(typeName)) {
int collength = columnInfo.getColumnSize();
//int positions = collength / 256;
int firstQualifierType = (collength % 256) / 16;
int lastQualifierType = (collength % 256) % 16;
String type = "DATETIME".equals(typeName) ? "DATETIME" : "INTERVAL";
String firstQualifier = qualifiers.get(firstQualifierType);
String lastQualifier = qualifiers.get(lastQualifierType);
columnInfo.setTypeName(type + " " + firstQualifier + " TO " + lastQualifier);
columnInfo.setLengthSemantics(Column.LengthSemantics.BYTE);
} else {
super.getColumnTypeAndDefValue(columnInfo, rs, database);
}
}
@Override
public List<ForeignKey> getForeignKeys(String schemaName, String foreignKeyTableName, Database database) throws DatabaseException {
List<ForeignKey> fkList = new ArrayList<ForeignKey>();
try {
String dbCatalog = database.convertRequestedSchemaToCatalog(schemaName);
// Informix handles schema differently
String dbSchema = null;
ResultSet rs = getMetaData(database).getImportedKeys(dbCatalog, dbSchema, convertTableNameToDatabaseTableName(foreignKeyTableName));
try {
while (rs.next()) {
ForeignKeyInfo fkInfo = fillForeignKeyInfo(rs);
fkList.add(generateForeignKey(fkInfo, database, fkList));
}
} finally {
rs.close();
}
return fkList;
} catch (Exception e) {
throw new DatabaseException(e);
}
}
}