Search in sources :

Example 21 with Column

use of liquibase.structure.core.Column in project liquibase by liquibase.

the class RenameColumnChange method generateStatementsForSQLiteDatabase.

private SqlStatement[] generateStatementsForSQLiteDatabase(Database database) {
    // SQLite does not support this ALTER TABLE operation until now.
    // For more information see: http://www.sqlite.org/omitted.html.
    // This is a small work around...
    List<SqlStatement> statements = new ArrayList<SqlStatement>();
    // define alter table logic
    AlterTableVisitor rename_alter_visitor = new AlterTableVisitor() {

        @Override
        public ColumnConfig[] getColumnsToAdd() {
            return new ColumnConfig[0];
        }

        @Override
        public boolean copyThisColumn(ColumnConfig column) {
            return true;
        }

        @Override
        public boolean createThisColumn(ColumnConfig column) {
            if (column.getName().equals(getOldColumnName())) {
                column.setName(getNewColumnName());
            }
            return true;
        }

        @Override
        public boolean createThisIndex(Index index) {
            if (index.getColumnNames().contains(getOldColumnName())) {
                Iterator<Column> columnIterator = index.getColumns().iterator();
                while (columnIterator.hasNext()) {
                    Column column = columnIterator.next();
                    if (column.getName().equals(getOldColumnName())) {
                        columnIterator.remove();
                        break;
                    }
                }
                index.addColumn(new Column(getNewColumnName()).setRelation(index.getTable()));
            }
            return true;
        }
    };
    try {
        // alter table
        statements.addAll(SQLiteDatabase.getAlterTableStatements(rename_alter_visitor, database, getCatalogName(), getSchemaName(), getTableName()));
    } catch (Exception e) {
        System.err.println(e);
        e.printStackTrace();
    }
    return statements.toArray(new SqlStatement[statements.size()]);
}
Also used : SqlStatement(liquibase.statement.SqlStatement) Column(liquibase.structure.core.Column) AlterTableVisitor(liquibase.database.core.SQLiteDatabase.AlterTableVisitor) ArrayList(java.util.ArrayList) Index(liquibase.structure.core.Index)

Example 22 with Column

use of liquibase.structure.core.Column in project liquibase by liquibase.

the class CreateIndexChange method checkStatus.

@Override
public ChangeStatus checkStatus(Database database) {
    ChangeStatus result = new ChangeStatus();
    try {
        Index example = new Index(getIndexName(), getCatalogName(), getSchemaName(), getTableName());
        if (getColumns() != null) {
            for (ColumnConfig column : getColumns()) {
                example.addColumn(new Column(column));
            }
        }
        Index snapshot = SnapshotGeneratorFactory.getInstance().createSnapshot(example, database);
        result.assertComplete(snapshot != null, "Index does not exist");
        if (snapshot != null) {
            if (isUnique() != null) {
                result.assertCorrect(isUnique().equals(snapshot.isUnique()), "Unique does not match");
            }
        }
        return result;
    } catch (Exception e) {
        return result.unknown(e);
    }
}
Also used : Column(liquibase.structure.core.Column) Index(liquibase.structure.core.Index)

Example 23 with Column

use of liquibase.structure.core.Column in project liquibase by liquibase.

the class AddDefaultValueChange method checkStatus.

@Override
public ChangeStatus checkStatus(Database database) {
    ChangeStatus result = new ChangeStatus();
    try {
        Column column = SnapshotGeneratorFactory.getInstance().createSnapshot(new Column(Table.class, getCatalogName(), getSchemaName(), getTableName(), getColumnName()), database);
        if (column == null) {
            return result.unknown("Column " + getColumnName() + " does not exist");
        }
        result.assertComplete(column.getDefaultValue() != null, "Column " + getColumnName() + " has no default value");
        if (column.getDefaultValue() == null) {
            return result;
        }
        if (getDefaultValue() != null) {
            return result.assertCorrect(getDefaultValue().equals(column.getDefaultValue()), "Default value was " + column.getDefaultValue());
        } else if (getDefaultValueDate() != null) {
            return result.assertCorrect(getDefaultValueDate().equals(new ISODateFormat().format((Date) column.getDefaultValue())), "Default value was " + column.getDefaultValue());
        } else if (getDefaultValueNumeric() != null) {
            return result.assertCorrect(getDefaultValueNumeric().equals(column.getDefaultValue().toString()), "Default value was " + column.getDefaultValue());
        } else if (getDefaultValueBoolean() != null) {
            return result.assertCorrect(getDefaultValueBoolean().equals(column.getDefaultValue()), "Default value was " + column.getDefaultValue());
        } else if (getDefaultValueComputed() != null) {
            return result.assertCorrect(getDefaultValueComputed().equals(column.getDefaultValue()), "Default value was " + column.getDefaultValue());
        } else if (getDefaultValueSequenceNext() != null) {
            return result.assertCorrect(getDefaultValueSequenceNext().equals(column.getDefaultValue()), "Default value was " + column.getDefaultValue());
        } else {
            return result.unknown("Unknown default value type");
        }
    } catch (Exception e) {
        return result.unknown(e);
    }
}
Also used : ISODateFormat(liquibase.util.ISODateFormat) Table(liquibase.structure.core.Table) Column(liquibase.structure.core.Column) Date(java.util.Date) ParseException(java.text.ParseException)

Example 24 with Column

use of liquibase.structure.core.Column in project liquibase by liquibase.

the class AddLookupTableChange method checkStatus.

@Override
public ChangeStatus checkStatus(Database database) {
    ChangeStatus result = new ChangeStatus();
    try {
        Table newTableExample = new Table(getNewTableCatalogName(), getNewTableSchemaName(), getNewTableName());
        Column newColumnExample = new Column(Table.class, getNewTableCatalogName(), getNewTableSchemaName(), getNewTableName(), getNewColumnName());
        ForeignKey foreignKeyExample = new ForeignKey(getConstraintName(), getExistingTableCatalogName(), getExistingTableSchemaName(), getExistingTableName());
        foreignKeyExample.setPrimaryKeyTable(newTableExample);
        foreignKeyExample.setForeignKeyColumns(Column.listFromNames(getExistingColumnName()));
        foreignKeyExample.setPrimaryKeyColumns(Column.listFromNames(getNewColumnName()));
        result.assertComplete(SnapshotGeneratorFactory.getInstance().has(newTableExample, database), "New table does not exist");
        result.assertComplete(SnapshotGeneratorFactory.getInstance().has(newColumnExample, database), "New column does not exist");
        result.assertComplete(SnapshotGeneratorFactory.getInstance().has(foreignKeyExample, database), "Foreign key does not exist");
        return result;
    } catch (Exception e) {
        return result.unknown(e);
    }
}
Also used : Table(liquibase.structure.core.Table) Column(liquibase.structure.core.Column) ForeignKey(liquibase.structure.core.ForeignKey)

Example 25 with Column

use of liquibase.structure.core.Column in project liquibase by liquibase.

the class DropColumnChange method generateStatementsForSQLiteDatabase.

private SqlStatement[] generateStatementsForSQLiteDatabase(Database database) throws DatabaseException {
    SqlStatement[] sqlStatements = null;
    // Since SQLite does not support a drop column statement, use alter table visitor to copy the table
    // except for the column (and index containing that column) to delete.
    Set<String> removedColumnNames = columns.stream().map(ColumnConfig::getName).collect(Collectors.toSet());
    SQLiteDatabase.AlterTableVisitor alterTableVisitor = new SQLiteDatabase.AlterTableVisitor() {

        @Override
        public ColumnConfig[] getColumnsToAdd() {
            return new ColumnConfig[0];
        }

        @Override
        public boolean copyThisColumn(ColumnConfig column) {
            return !removedColumnNames.contains(column.getName());
        }

        @Override
        public boolean createThisColumn(ColumnConfig column) {
            return !removedColumnNames.contains(column.getName());
        }

        @Override
        public boolean createThisIndex(Index index) {
            // don't create the index if it has the column we are dropping
            boolean indexContainsColumn = false;
            for (Column column : index.getColumns()) {
                if (removedColumnNames.contains(column.getName())) {
                    indexContainsColumn = true;
                }
            }
            return !indexContainsColumn;
        }
    };
    List<SqlStatement> statements = SQLiteDatabase.getAlterTableStatements(alterTableVisitor, database, getCatalogName(), getSchemaName(), getTableName());
    if (statements.size() > 0) {
        sqlStatements = new SqlStatement[statements.size()];
        return statements.toArray(sqlStatements);
    }
    return sqlStatements;
}
Also used : SqlStatement(liquibase.statement.SqlStatement) SQLiteDatabase(liquibase.database.core.SQLiteDatabase) Column(liquibase.structure.core.Column) Index(liquibase.structure.core.Index)

Aggregations

Column (liquibase.structure.core.Column)43 Table (liquibase.structure.core.Table)22 Change (liquibase.change.Change)8 SnapshotControl (liquibase.snapshot.SnapshotControl)8 Index (liquibase.structure.core.Index)8 DatabaseSnapshot (liquibase.snapshot.DatabaseSnapshot)7 DatabaseObject (liquibase.structure.DatabaseObject)6 Test (org.junit.Test)6 DatabaseException (liquibase.exception.DatabaseException)5 SqlStatement (liquibase.statement.SqlStatement)5 Schema (liquibase.structure.core.Schema)5 UniqueConstraint (liquibase.structure.core.UniqueConstraint)5 ArrayList (java.util.ArrayList)4 MSSQLDatabase (liquibase.database.core.MSSQLDatabase)4 UnexpectedLiquibaseException (liquibase.exception.UnexpectedLiquibaseException)4 CatalogAndSchema (liquibase.CatalogAndSchema)3 Liquibase (liquibase.Liquibase)3 AbstractIntegrationTest (liquibase.dbtest.AbstractIntegrationTest)3 RawSqlStatement (liquibase.statement.core.RawSqlStatement)3 PrimaryKey (liquibase.structure.core.PrimaryKey)3