Search in sources :

Example 6 with DatabaseFunction

use of liquibase.statement.DatabaseFunction in project liquibase by liquibase.

the class ColumnSnapshotGenerator method readDefaultValue.

protected Object readDefaultValue(CachedRow columnMetadataResultSet, Column columnInfo, Database database) throws SQLException, DatabaseException {
    if (database instanceof MSSQLDatabase) {
        Object defaultValue = columnMetadataResultSet.get("COLUMN_DEF");
        if (defaultValue != null && defaultValue instanceof String) {
            if (defaultValue.equals("(NULL)")) {
                columnMetadataResultSet.set("COLUMN_DEF", new DatabaseFunction("null"));
            }
        }
    }
    if (database instanceof OracleDatabase) {
        if (columnMetadataResultSet.get("COLUMN_DEF") == null) {
            columnMetadataResultSet.set("COLUMN_DEF", columnMetadataResultSet.get("DATA_DEFAULT"));
            if (columnMetadataResultSet.get("COLUMN_DEF") != null && ((String) columnMetadataResultSet.get("COLUMN_DEF")).equalsIgnoreCase("NULL")) {
                columnMetadataResultSet.set("COLUMN_DEF", null);
            }
            Object columnDef = columnMetadataResultSet.get("COLUMN_DEF");
            if (columnInfo.getType().getTypeName().equalsIgnoreCase("CHAR") && columnDef instanceof String && !((String) columnDef).startsWith("'") && !((String) columnDef).endsWith("'")) {
                return new DatabaseFunction((String) columnDef);
            }
            if (columnMetadataResultSet.get("VIRTUAL_COLUMN").equals("YES")) {
                Object column_def = columnMetadataResultSet.get("COLUMN_DEF");
                if (column_def != null && !column_def.equals("null")) {
                    columnMetadataResultSet.set("COLUMN_DEF", "GENERATED ALWAYS AS (" + column_def + ")");
                }
            }
            Object defaultValue = columnMetadataResultSet.get("COLUMN_DEF");
            if (defaultValue != null && defaultValue instanceof String) {
                String lowerCaseDefaultValue = ((String) defaultValue).toLowerCase();
                if (lowerCaseDefaultValue.contains("iseq$$") && lowerCaseDefaultValue.endsWith(".nextval")) {
                    columnMetadataResultSet.set("COLUMN_DEF", null);
                }
            }
        }
    }
    if (database instanceof PostgresDatabase) {
        Object defaultValue = columnMetadataResultSet.get("COLUMN_DEF");
        if (defaultValue != null && defaultValue instanceof String) {
            Matcher matcher = postgresStringValuePattern.matcher((String) defaultValue);
            if (matcher.matches()) {
                defaultValue = matcher.group(1);
            } else {
                matcher = postgresNumberValuePattern.matcher((String) defaultValue);
                if (matcher.matches()) {
                    defaultValue = matcher.group(1);
                }
            }
            columnMetadataResultSet.set("COLUMN_DEF", defaultValue);
        }
    }
    if (database instanceof DB2Database) {
        if (columnMetadataResultSet.get("COLUMN_DEF") != null && ((String) columnMetadataResultSet.get("COLUMN_DEF")).equalsIgnoreCase("NULL")) {
            columnMetadataResultSet.set("COLUMN_DEF", null);
        }
    }
    return SqlUtil.parseValue(database, columnMetadataResultSet.get("COLUMN_DEF"), columnInfo.getType());
}
Also used : DatabaseFunction(liquibase.statement.DatabaseFunction) Matcher(java.util.regex.Matcher) DatabaseObject(liquibase.structure.DatabaseObject)

Example 7 with DatabaseFunction

use of liquibase.statement.DatabaseFunction in project liquibase by liquibase.

the class AddDefaultValueGenerator method validate.

@Override
public ValidationErrors validate(AddDefaultValueStatement addDefaultValueStatement, Database database, SqlGeneratorChain sqlGeneratorChain) {
    Object defaultValue = addDefaultValueStatement.getDefaultValue();
    ValidationErrors validationErrors = new ValidationErrors();
    validationErrors.checkRequiredField("defaultValue", defaultValue);
    validationErrors.checkRequiredField("columnName", addDefaultValueStatement.getColumnName());
    validationErrors.checkRequiredField("tableName", addDefaultValueStatement.getTableName());
    if (!database.supportsSequences() && defaultValue instanceof SequenceNextValueFunction) {
        validationErrors.addError("Database " + database.getShortName() + " does not support sequences");
    }
    if (database instanceof HsqlDatabase) {
        if (defaultValue instanceof SequenceNextValueFunction) {
            validationErrors.addError("Database " + database.getShortName() + " does not support adding sequence-based default values");
        } else if (defaultValue instanceof DatabaseFunction && !HsqlDatabase.supportsDefaultValueComputed(addDefaultValueStatement.getColumnDataType(), defaultValue.toString())) {
            validationErrors.addError("Database " + database.getShortName() + " does not support adding function-based default values");
        }
    }
    String columnDataType = addDefaultValueStatement.getColumnDataType();
    if (columnDataType != null) {
        LiquibaseDataType dataType = DataTypeFactory.getInstance().fromDescription(columnDataType, database);
        boolean typeMismatch = false;
        if (dataType instanceof BooleanType) {
            if (!(defaultValue instanceof Boolean)) {
                typeMismatch = true;
            }
        } else if (dataType instanceof CharType) {
            if (!(defaultValue instanceof String) && !(defaultValue instanceof DatabaseFunction)) {
                typeMismatch = true;
            }
        }
        if (typeMismatch) {
            validationErrors.addError("Default value of " + defaultValue + " does not match defined type of " + columnDataType);
        }
    }
    return validationErrors;
}
Also used : HsqlDatabase(liquibase.database.core.HsqlDatabase) DatabaseFunction(liquibase.statement.DatabaseFunction) ValidationErrors(liquibase.exception.ValidationErrors) LiquibaseDataType(liquibase.datatype.LiquibaseDataType) BooleanType(liquibase.datatype.core.BooleanType) SequenceNextValueFunction(liquibase.statement.SequenceNextValueFunction) CharType(liquibase.datatype.core.CharType)

Example 8 with DatabaseFunction

use of liquibase.statement.DatabaseFunction in project liquibase by liquibase.

the class MarkChangeSetRanGenerator method generateSql.

@Override
public Sql[] generateSql(MarkChangeSetRanStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
    String dateValue = database.getCurrentDateTimeFunction();
    ChangeSet changeSet = statement.getChangeSet();
    SqlStatement runStatement;
    try {
        if (statement.getExecType().equals(ChangeSet.ExecType.FAILED) || statement.getExecType().equals(ChangeSet.ExecType.SKIPPED)) {
            //don't mark
            return new Sql[0];
        }
        String tag = null;
        for (Change change : changeSet.getChanges()) {
            if (change instanceof TagDatabaseChange) {
                TagDatabaseChange tagChange = (TagDatabaseChange) change;
                tag = tagChange.getTag();
            }
        }
        if (statement.getExecType().ranBefore) {
            runStatement = new UpdateStatement(database.getLiquibaseCatalogName(), database.getLiquibaseSchemaName(), database.getDatabaseChangeLogTableName()).addNewColumnValue("DATEEXECUTED", new DatabaseFunction(dateValue)).addNewColumnValue("ORDEREXECUTED", ChangeLogHistoryServiceFactory.getInstance().getChangeLogService(database).getNextSequenceValue()).addNewColumnValue("MD5SUM", changeSet.generateCheckSum().toString()).addNewColumnValue("EXECTYPE", statement.getExecType().value).addNewColumnValue("DEPLOYMENT_ID", ChangeLogHistoryServiceFactory.getInstance().getChangeLogService(database).getDeploymentId()).setWhereClause(database.escapeObjectName("ID", Column.class) + " = ? " + "AND " + database.escapeObjectName("AUTHOR", Column.class) + " = ? " + "AND " + database.escapeObjectName("FILENAME", Column.class) + " = ?").addWhereParameters(changeSet.getId(), changeSet.getAuthor(), changeSet.getFilePath());
            if (tag != null) {
                ((UpdateStatement) runStatement).addNewColumnValue("TAG", tag);
            }
        } else {
            runStatement = new InsertStatement(database.getLiquibaseCatalogName(), database.getLiquibaseSchemaName(), database.getDatabaseChangeLogTableName()).addColumnValue("ID", changeSet.getId()).addColumnValue("AUTHOR", changeSet.getAuthor()).addColumnValue("FILENAME", changeSet.getFilePath()).addColumnValue("DATEEXECUTED", new DatabaseFunction(dateValue)).addColumnValue("ORDEREXECUTED", ChangeLogHistoryServiceFactory.getInstance().getChangeLogService(database).getNextSequenceValue()).addColumnValue("MD5SUM", changeSet.generateCheckSum().toString()).addColumnValue("DESCRIPTION", limitSize(changeSet.getDescription())).addColumnValue("COMMENTS", limitSize(StringUtils.trimToEmpty(changeSet.getComments()))).addColumnValue("EXECTYPE", statement.getExecType().value).addColumnValue("CONTEXTS", changeSet.getContexts() == null || changeSet.getContexts().isEmpty() ? null : changeSet.getContexts().toString()).addColumnValue("LABELS", changeSet.getLabels() == null || changeSet.getLabels().isEmpty() ? null : changeSet.getLabels().toString()).addColumnValue("LIQUIBASE", LiquibaseUtil.getBuildVersion().replaceAll("SNAPSHOT", "SNP")).addColumnValue("DEPLOYMENT_ID", ChangeLogHistoryServiceFactory.getInstance().getChangeLogService(database).getDeploymentId());
            if (tag != null) {
                ((InsertStatement) runStatement).addColumnValue("TAG", tag);
            }
        }
    } catch (LiquibaseException e) {
        throw new UnexpectedLiquibaseException(e);
    }
    return SqlGeneratorFactory.getInstance().generateSql(runStatement, database);
}
Also used : SqlStatement(liquibase.statement.SqlStatement) UpdateStatement(liquibase.statement.core.UpdateStatement) DatabaseFunction(liquibase.statement.DatabaseFunction) Column(liquibase.structure.core.Column) TagDatabaseChange(liquibase.change.core.TagDatabaseChange) Change(liquibase.change.Change) TagDatabaseChange(liquibase.change.core.TagDatabaseChange) LiquibaseException(liquibase.exception.LiquibaseException) UnexpectedLiquibaseException(liquibase.exception.UnexpectedLiquibaseException) ChangeSet(liquibase.changelog.ChangeSet) UnexpectedLiquibaseException(liquibase.exception.UnexpectedLiquibaseException) InsertStatement(liquibase.statement.core.InsertStatement) Sql(liquibase.sql.Sql)

Example 9 with DatabaseFunction

use of liquibase.statement.DatabaseFunction in project liquibase by liquibase.

the class UpdateGenerator method convertToString.

private String convertToString(Object newValue, Database database) {
    String sqlString;
    if (newValue == null || newValue.toString().equalsIgnoreCase("NULL")) {
        sqlString = "NULL";
    } else if (newValue instanceof String && !looksLikeFunctionCall(((String) newValue), database)) {
        sqlString = DataTypeFactory.getInstance().fromObject(newValue, database).objectToSql(newValue, database);
    } else if (newValue instanceof Date) {
        // converting java.util.Date to java.sql.Date
        Date date = (Date) newValue;
        if (date.getClass().equals(java.util.Date.class)) {
            date = new java.sql.Date(date.getTime());
        }
        sqlString = database.getDateLiteral(date);
    } else if (newValue instanceof Boolean) {
        if (((Boolean) newValue)) {
            sqlString = DataTypeFactory.getInstance().getTrueBooleanValue(database);
        } else {
            sqlString = DataTypeFactory.getInstance().getFalseBooleanValue(database);
        }
    } else if (newValue instanceof DatabaseFunction) {
        sqlString = database.generateDatabaseFunctionValue((DatabaseFunction) newValue);
    } else {
        sqlString = newValue.toString();
    }
    return sqlString;
}
Also used : DatabaseFunction(liquibase.statement.DatabaseFunction) Date(java.util.Date)

Example 10 with DatabaseFunction

use of liquibase.statement.DatabaseFunction in project liquibase by liquibase.

the class ObjectUtil method setProperty.

public static void setProperty(Object object, String propertyName, String propertyValue) {
    Method method = getWriteMethod(object, propertyName);
    if (method == null) {
        throw new UnexpectedLiquibaseException("Property '" + propertyName + "' not found on object type " + object.getClass().getName());
    }
    Class<?> parameterType = method.getParameterTypes()[0];
    Object finalValue = propertyValue;
    if (parameterType.equals(Boolean.class) || parameterType.equals(boolean.class)) {
        finalValue = Boolean.valueOf(propertyValue);
    } else if (parameterType.equals(Integer.class)) {
        finalValue = Integer.valueOf(propertyValue);
    } else if (parameterType.equals(Long.class)) {
        finalValue = Long.valueOf(propertyValue);
    } else if (parameterType.equals(BigInteger.class)) {
        finalValue = new BigInteger(propertyValue);
    } else if (parameterType.equals(BigDecimal.class)) {
        finalValue = new BigDecimal(propertyValue);
    } else if (parameterType.equals(DatabaseFunction.class)) {
        finalValue = new DatabaseFunction(propertyValue);
    } else if (parameterType.equals(SequenceNextValueFunction.class)) {
        finalValue = new SequenceNextValueFunction(propertyValue);
    } else if (parameterType.equals(SequenceCurrentValueFunction.class)) {
        finalValue = new SequenceCurrentValueFunction(propertyValue);
    } else if (Enum.class.isAssignableFrom(parameterType)) {
        finalValue = Enum.valueOf((Class<Enum>) parameterType, propertyValue);
    }
    try {
        method.invoke(object, finalValue);
    } catch (IllegalAccessException e) {
        throw new UnexpectedLiquibaseException(e);
    } catch (IllegalArgumentException e) {
        throw new UnexpectedLiquibaseException("Cannot call " + method.toString() + " with value of type " + finalValue.getClass().getName());
    } catch (InvocationTargetException e) {
        throw new UnexpectedLiquibaseException(e);
    }
}
Also used : SequenceCurrentValueFunction(liquibase.statement.SequenceCurrentValueFunction) DatabaseFunction(liquibase.statement.DatabaseFunction) Method(java.lang.reflect.Method) BigDecimal(java.math.BigDecimal) InvocationTargetException(java.lang.reflect.InvocationTargetException) BigInteger(java.math.BigInteger) BigInteger(java.math.BigInteger) SequenceNextValueFunction(liquibase.statement.SequenceNextValueFunction) UnexpectedLiquibaseException(liquibase.exception.UnexpectedLiquibaseException)

Aggregations

DatabaseFunction (liquibase.statement.DatabaseFunction)21 Date (java.util.Date)7 UnexpectedLiquibaseException (liquibase.exception.UnexpectedLiquibaseException)6 SequenceNextValueFunction (liquibase.statement.SequenceNextValueFunction)5 DatabaseObject (liquibase.structure.DatabaseObject)5 BigInteger (java.math.BigInteger)4 LiquibaseDataType (liquibase.datatype.LiquibaseDataType)4 DateFormat (java.text.DateFormat)3 ParseException (java.text.ParseException)3 SimpleDateFormat (java.text.SimpleDateFormat)3 Method (java.lang.reflect.Method)2 BigDecimal (java.math.BigDecimal)2 ArrayList (java.util.ArrayList)2 Change (liquibase.change.Change)2 ChangeSet (liquibase.changelog.ChangeSet)2 InformixDatabase (liquibase.database.core.InformixDatabase)2 SequenceCurrentValueFunction (liquibase.statement.SequenceCurrentValueFunction)2 SqlStatement (liquibase.statement.SqlStatement)2 RawSqlStatement (liquibase.statement.core.RawSqlStatement)2 Column (liquibase.structure.core.Column)2