Search in sources :

Example 1 with ColumnSizeChange

use of org.jumpmind.db.alter.ColumnSizeChange in project symmetric-ds by JumpMind.

the class HsqlDb2DdlBuilder method processTableStructureChanges.

@Override
protected void processTableStructureChanges(Database currentModel, Database desiredModel, Table sourceTable, Table targetTable, List<TableChange> changes, StringBuilder ddl) {
    for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = changeIt.next();
        // HsqlDb can only drop columns that are not part of a primary key
        if ((change instanceof RemoveColumnChange) && ((RemoveColumnChange) change).getColumn().isPrimaryKey()) {
            changeIt.remove();
        }
        // LONGVARCHAR columns always report changes
        if (change instanceof ColumnSizeChange) {
            ColumnSizeChange sizeChange = (ColumnSizeChange) change;
            if (sizeChange.getChangedColumn().getMappedTypeCode() == Types.VARCHAR && sizeChange.getNewSize() == 0) {
                changeIt.remove();
            }
        }
        if (change instanceof ColumnDataTypeChange) {
            ColumnDataTypeChange dataTypeChange = (ColumnDataTypeChange) change;
            // LONGVARCHAR columns always report changes
            if (dataTypeChange.getChangedColumn().getMappedTypeCode() == Types.VARCHAR && dataTypeChange.getNewTypeCode() == Types.LONGVARCHAR) {
                changeIt.remove();
            } else if (dataTypeChange.getNewTypeCode() == Types.BIGINT) {
                if (writeAlterColumnDataTypeToBigInt(dataTypeChange, ddl)) {
                    changeIt.remove();
                }
            }
        }
    }
    // in order to utilize the ALTER TABLE ADD COLUMN BEFORE statement
    // we have to apply the add column changes in the correct order
    // thus we first gather all add column changes and then execute them
    // Since we get them in target table column order, we can simply
    // iterate backwards
    ArrayList<AddColumnChange> addColumnChanges = new ArrayList<AddColumnChange>();
    for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = changeIt.next();
        if (change instanceof AddColumnChange) {
            addColumnChanges.add((AddColumnChange) change);
            changeIt.remove();
        }
    }
    for (ListIterator<AddColumnChange> changeIt = addColumnChanges.listIterator(addColumnChanges.size()); changeIt.hasPrevious(); ) {
        AddColumnChange addColumnChange = changeIt.previous();
        processChange(currentModel, desiredModel, addColumnChange, ddl);
        changeIt.remove();
    }
    for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = changeIt.next();
        if (change instanceof RemoveColumnChange) {
            RemoveColumnChange removeColumnChange = (RemoveColumnChange) change;
            processChange(currentModel, desiredModel, removeColumnChange, ddl);
            changeIt.remove();
        } else if (change instanceof CopyColumnValueChange) {
            CopyColumnValueChange copyColumnChange = (CopyColumnValueChange) change;
            processChange(currentModel, desiredModel, copyColumnChange, ddl);
            changeIt.remove();
        }
    }
}
Also used : ColumnDataTypeChange(org.jumpmind.db.alter.ColumnDataTypeChange) CopyColumnValueChange(org.jumpmind.db.alter.CopyColumnValueChange) RemoveColumnChange(org.jumpmind.db.alter.RemoveColumnChange) ArrayList(java.util.ArrayList) ColumnSizeChange(org.jumpmind.db.alter.ColumnSizeChange) AddColumnChange(org.jumpmind.db.alter.AddColumnChange) TableChange(org.jumpmind.db.alter.TableChange)

Example 2 with ColumnSizeChange

use of org.jumpmind.db.alter.ColumnSizeChange in project symmetric-ds by JumpMind.

the class OracleDdlBuilder method processTableStructureChanges.

@Override
protected void processTableStructureChanges(Database currentModel, Database desiredModel, Table sourceTable, Table targetTable, List<TableChange> changes, StringBuilder ddl) {
    for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = changeIt.next();
        if (change instanceof AddColumnChange) {
            AddColumnChange addColumnChange = (AddColumnChange) change;
            if (addColumnChange.getNewColumn().isRequired() && (addColumnChange.getNewColumn().getDefaultValue() == null)) {
                // we need to rebuild the full table
                return;
            }
        } else if (change instanceof ColumnSizeChange) {
            processChange(currentModel, desiredModel, (ColumnSizeChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof ColumnDefaultValueChange) {
            processChange(currentModel, desiredModel, (ColumnDefaultValueChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof ColumnRequiredChange) {
            processChange(currentModel, desiredModel, (ColumnRequiredChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof ColumnAutoIncrementChange) {
            if (processChange(currentModel, desiredModel, (ColumnAutoIncrementChange) change, ddl)) {
                changeIt.remove();
            }
        }
    }
    // First we drop primary keys as necessary
    for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = changeIt.next();
        if (change instanceof RemovePrimaryKeyChange) {
            processChange(currentModel, desiredModel, (RemovePrimaryKeyChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof PrimaryKeyChange) {
            PrimaryKeyChange pkChange = (PrimaryKeyChange) change;
            RemovePrimaryKeyChange removePkChange = new RemovePrimaryKeyChange(pkChange.getChangedTable(), pkChange.getOldPrimaryKeyColumns());
            processChange(currentModel, desiredModel, removePkChange, ddl);
        }
    }
    /*
         * Next we add/remove columns While Oracle has an ALTER TABLE MODIFY
         * statement, it is somewhat limited esp. if there is data in the table,
         * so we don't use it
         */
    for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = changeIt.next();
        if (change instanceof AddColumnChange) {
            processChange(currentModel, desiredModel, (AddColumnChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof RemoveColumnChange) {
            processChange(currentModel, desiredModel, (RemoveColumnChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof CopyColumnValueChange) {
            CopyColumnValueChange copyColumnChange = (CopyColumnValueChange) change;
            processChange(currentModel, desiredModel, copyColumnChange, ddl);
            changeIt.remove();
        }
    }
    // Finally we add primary keys
    for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = changeIt.next();
        if (change instanceof AddPrimaryKeyChange) {
            processChange(currentModel, desiredModel, (AddPrimaryKeyChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof PrimaryKeyChange) {
            PrimaryKeyChange pkChange = (PrimaryKeyChange) change;
            AddPrimaryKeyChange addPkChange = new AddPrimaryKeyChange(pkChange.getChangedTable(), pkChange.getNewPrimaryKeyColumns());
            processChange(currentModel, desiredModel, addPkChange, ddl);
            changeIt.remove();
        }
    }
    super.processTableStructureChanges(currentModel, desiredModel, sourceTable, targetTable, changes, ddl);
}
Also used : ColumnDefaultValueChange(org.jumpmind.db.alter.ColumnDefaultValueChange) CopyColumnValueChange(org.jumpmind.db.alter.CopyColumnValueChange) RemovePrimaryKeyChange(org.jumpmind.db.alter.RemovePrimaryKeyChange) AddPrimaryKeyChange(org.jumpmind.db.alter.AddPrimaryKeyChange) PrimaryKeyChange(org.jumpmind.db.alter.PrimaryKeyChange) RemovePrimaryKeyChange(org.jumpmind.db.alter.RemovePrimaryKeyChange) ColumnRequiredChange(org.jumpmind.db.alter.ColumnRequiredChange) RemoveColumnChange(org.jumpmind.db.alter.RemoveColumnChange) ColumnAutoIncrementChange(org.jumpmind.db.alter.ColumnAutoIncrementChange) ColumnSizeChange(org.jumpmind.db.alter.ColumnSizeChange) AddPrimaryKeyChange(org.jumpmind.db.alter.AddPrimaryKeyChange) AddColumnChange(org.jumpmind.db.alter.AddColumnChange) TableChange(org.jumpmind.db.alter.TableChange)

Example 3 with ColumnSizeChange

use of org.jumpmind.db.alter.ColumnSizeChange in project symmetric-ds by JumpMind.

the class PostgreSqlDdlBuilder method processTableStructureChanges.

@Override
protected void processTableStructureChanges(Database currentModel, Database desiredModel, Table sourceTable, Table targetTable, List<TableChange> changes, StringBuilder ddl) {
    for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = changeIt.next();
        if (change instanceof AddColumnChange) {
            AddColumnChange addColumnChange = (AddColumnChange) change;
            processChange(currentModel, desiredModel, addColumnChange, ddl);
            changeIt.remove();
        } else if (change instanceof RemoveColumnChange) {
            processChange(currentModel, desiredModel, (RemoveColumnChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof CopyColumnValueChange) {
            CopyColumnValueChange copyColumnChange = (CopyColumnValueChange) change;
            processChange(currentModel, desiredModel, copyColumnChange, ddl);
            changeIt.remove();
        } else if (change instanceof ColumnDefaultValueChange) {
            processChange(currentModel, desiredModel, (ColumnDefaultValueChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof ColumnRequiredChange) {
            processChange(currentModel, desiredModel, (ColumnRequiredChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof ColumnSizeChange) {
            processChange(currentModel, desiredModel, (ColumnSizeChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof PrimaryKeyChange) {
            processChange(currentModel, desiredModel, (PrimaryKeyChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof ColumnAutoIncrementChange) {
            if (processChange(currentModel, desiredModel, (ColumnAutoIncrementChange) change, ddl)) {
                changeIt.remove();
            }
        }
    }
    super.processTableStructureChanges(currentModel, desiredModel, sourceTable, targetTable, changes, ddl);
}
Also used : CopyColumnValueChange(org.jumpmind.db.alter.CopyColumnValueChange) ColumnDefaultValueChange(org.jumpmind.db.alter.ColumnDefaultValueChange) PrimaryKeyChange(org.jumpmind.db.alter.PrimaryKeyChange) RemoveColumnChange(org.jumpmind.db.alter.RemoveColumnChange) ColumnRequiredChange(org.jumpmind.db.alter.ColumnRequiredChange) ColumnAutoIncrementChange(org.jumpmind.db.alter.ColumnAutoIncrementChange) ColumnSizeChange(org.jumpmind.db.alter.ColumnSizeChange) AddColumnChange(org.jumpmind.db.alter.AddColumnChange) TableChange(org.jumpmind.db.alter.TableChange)

Example 4 with ColumnSizeChange

use of org.jumpmind.db.alter.ColumnSizeChange in project symmetric-ds by JumpMind.

the class MsSql2000DdlBuilder method processTableStructureChanges.

@Override
protected void processTableStructureChanges(Database currentModel, Database desiredModel, Table sourceTable, Table targetTable, List<TableChange> changes, StringBuilder ddl) {
    for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = changeIt.next();
        if (change instanceof ColumnAutoIncrementChange) {
            /*
             * Sql Server has no way of adding or removing an IDENTITY
             * constraint thus we have to rebuild the table anyway and can
             * ignore all the other column changes
             */
            return;
        }
    }
    // First we drop primary keys as necessary
    for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = changeIt.next();
        if (change instanceof RemovePrimaryKeyChange) {
            processChange(currentModel, desiredModel, (RemovePrimaryKeyChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof PrimaryKeyChange) {
            PrimaryKeyChange pkChange = (PrimaryKeyChange) change;
            RemovePrimaryKeyChange removePkChange = new RemovePrimaryKeyChange(pkChange.getChangedTable(), pkChange.getOldPrimaryKeyColumns());
            processChange(currentModel, desiredModel, removePkChange, ddl);
        }
    }
    ArrayList<ColumnChange> columnChanges = new ArrayList<ColumnChange>();
    // Next we add/remove columns
    for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = changeIt.next();
        if (change instanceof AddColumnChange) {
            AddColumnChange addColumnChange = (AddColumnChange) change;
            processChange(currentModel, desiredModel, addColumnChange, ddl);
            changeIt.remove();
        } else if (change instanceof RemoveColumnChange) {
            processChange(currentModel, desiredModel, (RemoveColumnChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof CopyColumnValueChange) {
            CopyColumnValueChange copyColumnChange = (CopyColumnValueChange) change;
            processChange(currentModel, desiredModel, copyColumnChange, ddl);
            changeIt.remove();
        } else if ((change instanceof ColumnChange) && (columnChanges != null)) {
            /*
                 * We gather all changed columns because we can use the ALTER
                 * TABLE ALTER COLUMN statement for them
                 */
            columnChanges.add((ColumnChange) change);
        }
    }
    if (columnChanges != null) {
        HashSet<Column> processedColumns = new HashSet<Column>();
        for (Iterator<ColumnChange> changeIt = columnChanges.iterator(); changeIt.hasNext(); ) {
            ColumnChange change = changeIt.next();
            Column sourceColumn = change.getChangedColumn();
            if (!sourceColumn.isPrimaryKey()) {
                Column targetColumn = targetTable.findColumn(sourceColumn.getName(), delimitedIdentifierModeOn);
                if (!processedColumns.contains(targetColumn)) {
                    processColumnChange(sourceTable, targetTable, sourceColumn, targetColumn, (change instanceof ColumnDataTypeChange) || (change instanceof ColumnSizeChange), ddl);
                    processedColumns.add(targetColumn);
                }
                changes.remove(change);
                change.apply(currentModel, delimitedIdentifierModeOn);
            } else {
                log.debug("Cannot alter a primay key column on sql server (azure).  Just let the table rebuild.");
            }
        }
    }
    // Finally we add primary keys
    for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = changeIt.next();
        if (change instanceof AddPrimaryKeyChange) {
            processChange(currentModel, desiredModel, (AddPrimaryKeyChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof PrimaryKeyChange) {
            PrimaryKeyChange pkChange = (PrimaryKeyChange) change;
            AddPrimaryKeyChange addPkChange = new AddPrimaryKeyChange(pkChange.getChangedTable(), pkChange.getNewPrimaryKeyColumns());
            processChange(currentModel, desiredModel, addPkChange, ddl);
            changeIt.remove();
        }
    }
}
Also used : ColumnDataTypeChange(org.jumpmind.db.alter.ColumnDataTypeChange) CopyColumnValueChange(org.jumpmind.db.alter.CopyColumnValueChange) RemovePrimaryKeyChange(org.jumpmind.db.alter.RemovePrimaryKeyChange) ArrayList(java.util.ArrayList) ColumnSizeChange(org.jumpmind.db.alter.ColumnSizeChange) ColumnChange(org.jumpmind.db.alter.ColumnChange) AddColumnChange(org.jumpmind.db.alter.AddColumnChange) RemoveColumnChange(org.jumpmind.db.alter.RemoveColumnChange) Column(org.jumpmind.db.model.Column) PrimaryKeyChange(org.jumpmind.db.alter.PrimaryKeyChange) AddPrimaryKeyChange(org.jumpmind.db.alter.AddPrimaryKeyChange) RemovePrimaryKeyChange(org.jumpmind.db.alter.RemovePrimaryKeyChange) RemoveColumnChange(org.jumpmind.db.alter.RemoveColumnChange) ColumnAutoIncrementChange(org.jumpmind.db.alter.ColumnAutoIncrementChange) AddPrimaryKeyChange(org.jumpmind.db.alter.AddPrimaryKeyChange) AddColumnChange(org.jumpmind.db.alter.AddColumnChange) TableChange(org.jumpmind.db.alter.TableChange) HashSet(java.util.HashSet)

Example 5 with ColumnSizeChange

use of org.jumpmind.db.alter.ColumnSizeChange in project symmetric-ds by JumpMind.

the class MsSql2000DdlBuilder method processChanges.

@Override
protected void processChanges(Database currentModel, Database desiredModel, List<IModelChange> changes, StringBuilder ddl) {
    if (!changes.isEmpty()) {
        writeQuotationOnStatement(ddl);
    }
    /*
         * For column data type and size changes, we need to drop and then
         * re-create indexes and foreign keys using the column, as well as any
         * primary keys containg these columns However, if the index/foreign
         * key/primary key is already slated for removal or change, then we
         * don't want to generate change duplication
         */
    HashSet<IIndex> removedIndexes = new HashSet<IIndex>();
    HashSet<ForeignKey> removedForeignKeys = new HashSet<ForeignKey>();
    HashSet<Table> removedPKs = new HashSet<Table>();
    for (Iterator<IModelChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        IModelChange change = changeIt.next();
        if (change instanceof RemoveIndexChange) {
            removedIndexes.add(((RemoveIndexChange) change).getIndex());
        } else if (change instanceof RemoveForeignKeyChange) {
            removedForeignKeys.add(((RemoveForeignKeyChange) change).getForeignKey());
        } else if (change instanceof RemovePrimaryKeyChange) {
            removedPKs.add(((RemovePrimaryKeyChange) change).getChangedTable());
        }
    }
    ArrayList<TableChange> additionalChanges = new ArrayList<TableChange>();
    for (Iterator<IModelChange> changeIt = changes.iterator(); changeIt.hasNext(); ) {
        IModelChange change = changeIt.next();
        if ((change instanceof ColumnDataTypeChange) || (change instanceof ColumnSizeChange)) {
            Column column = ((ColumnChange) change).getChangedColumn();
            Table table = ((ColumnChange) change).getChangedTable();
            if (column.isPrimaryKey() && !removedPKs.contains(table)) {
                Column[] pk = table.getPrimaryKeyColumns();
                additionalChanges.add(new RemovePrimaryKeyChange(table, pk));
                additionalChanges.add(new AddPrimaryKeyChange(table, pk));
                removedPKs.add(table);
            }
            for (int idx = 0; idx < table.getIndexCount(); idx++) {
                IIndex index = table.getIndex(idx);
                if (index.hasColumn(column) && !removedIndexes.contains(index)) {
                    additionalChanges.add(new RemoveIndexChange(table, index));
                    additionalChanges.add(new AddIndexChange(table, index));
                    removedIndexes.add(index);
                }
            }
            for (int tableIdx = 0; tableIdx < currentModel.getTableCount(); tableIdx++) {
                Table curTable = currentModel.getTable(tableIdx);
                for (int fkIdx = 0; fkIdx < curTable.getForeignKeyCount(); fkIdx++) {
                    ForeignKey curFk = curTable.getForeignKey(fkIdx);
                    if ((curFk.hasLocalColumn(column) || curFk.hasForeignColumn(column)) && !removedForeignKeys.contains(curFk)) {
                        additionalChanges.add(new RemoveForeignKeyChange(curTable, curFk));
                        additionalChanges.add(new AddForeignKeyChange(curTable, curFk));
                        removedForeignKeys.add(curFk);
                    }
                }
            }
        }
    }
    changes.addAll(additionalChanges);
    super.processChanges(currentModel, desiredModel, changes, ddl);
}
Also used : IIndex(org.jumpmind.db.model.IIndex) ColumnDataTypeChange(org.jumpmind.db.alter.ColumnDataTypeChange) Table(org.jumpmind.db.model.Table) AddIndexChange(org.jumpmind.db.alter.AddIndexChange) RemovePrimaryKeyChange(org.jumpmind.db.alter.RemovePrimaryKeyChange) ArrayList(java.util.ArrayList) IModelChange(org.jumpmind.db.alter.IModelChange) AddForeignKeyChange(org.jumpmind.db.alter.AddForeignKeyChange) RemoveForeignKeyChange(org.jumpmind.db.alter.RemoveForeignKeyChange) ColumnSizeChange(org.jumpmind.db.alter.ColumnSizeChange) ForeignKey(org.jumpmind.db.model.ForeignKey) Column(org.jumpmind.db.model.Column) ColumnChange(org.jumpmind.db.alter.ColumnChange) AddColumnChange(org.jumpmind.db.alter.AddColumnChange) RemoveColumnChange(org.jumpmind.db.alter.RemoveColumnChange) RemoveIndexChange(org.jumpmind.db.alter.RemoveIndexChange) AddPrimaryKeyChange(org.jumpmind.db.alter.AddPrimaryKeyChange) HashSet(java.util.HashSet) TableChange(org.jumpmind.db.alter.TableChange)

Aggregations

AddColumnChange (org.jumpmind.db.alter.AddColumnChange)6 ColumnSizeChange (org.jumpmind.db.alter.ColumnSizeChange)6 RemoveColumnChange (org.jumpmind.db.alter.RemoveColumnChange)6 TableChange (org.jumpmind.db.alter.TableChange)6 CopyColumnValueChange (org.jumpmind.db.alter.CopyColumnValueChange)5 ColumnAutoIncrementChange (org.jumpmind.db.alter.ColumnAutoIncrementChange)4 ArrayList (java.util.ArrayList)3 AddPrimaryKeyChange (org.jumpmind.db.alter.AddPrimaryKeyChange)3 ColumnDataTypeChange (org.jumpmind.db.alter.ColumnDataTypeChange)3 ColumnDefaultValueChange (org.jumpmind.db.alter.ColumnDefaultValueChange)3 ColumnRequiredChange (org.jumpmind.db.alter.ColumnRequiredChange)3 PrimaryKeyChange (org.jumpmind.db.alter.PrimaryKeyChange)3 RemovePrimaryKeyChange (org.jumpmind.db.alter.RemovePrimaryKeyChange)3 HashSet (java.util.HashSet)2 ColumnChange (org.jumpmind.db.alter.ColumnChange)2 Column (org.jumpmind.db.model.Column)2 AddForeignKeyChange (org.jumpmind.db.alter.AddForeignKeyChange)1 AddIndexChange (org.jumpmind.db.alter.AddIndexChange)1 IModelChange (org.jumpmind.db.alter.IModelChange)1 RemoveForeignKeyChange (org.jumpmind.db.alter.RemoveForeignKeyChange)1