Skip to content

Commit

Permalink
0000713: Upgrade from 2.x to 3.x requires a type change of some sym_ …
Browse files Browse the repository at this point in the history
…table columns from INT to BIGINT. Tables should not be rebuilt.
  • Loading branch information
chenson42 committed Jul 16, 2012
1 parent 88cbcc4 commit 03aa6f8
Show file tree
Hide file tree
Showing 12 changed files with 184 additions and 87 deletions.
11 changes: 11 additions & 0 deletions symmetric-db/src/main/java/org/jumpmind/db/model/Table.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ public class Table implements Serializable, Cloneable {

/** The indices applied to this table. */
private ArrayList<IIndex> indices = new ArrayList<IIndex>();

private String primaryKeyConstraintName;

public Table() {
}
Expand Down Expand Up @@ -803,6 +805,7 @@ public Object clone() throws CloneNotSupportedException {
result.schema = schema;
result.name = name;
result.type = type;
result.primaryKeyConstraintName = primaryKeyConstraintName;
result.columns = (ArrayList<Column>) columns.clone();
result.foreignKeys = (ArrayList<ForeignKey>) foreignKeys.clone();
result.indices = (ArrayList<IIndex>) indices.clone();
Expand Down Expand Up @@ -1148,5 +1151,13 @@ public static String getCommaDeliminatedColumns(Column[] cols) {
return " ";
}
}

public void setPrimaryKeyConstraintName(String primaryKeyConstraintName) {
this.primaryKeyConstraintName = primaryKeyConstraintName;
}

public String getPrimaryKeyConstraintName() {
return primaryKeyConstraintName;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -802,19 +802,16 @@ protected void processTableStructureChanges(Database currentModel, Database desi
if (change instanceof ColumnDataTypeChange) {
ColumnDataTypeChange typeChange = (ColumnDataTypeChange)change;
if (typeChange.getNewTypeCode() == Types.BIGINT) {
writeAlterColumnDataType(typeChange, ddl);
it.remove();
if (writeAlterColumnDataType(typeChange, ddl)) {
it.remove();
}
}
}
}
}

protected void writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) {
writeTableAlterStmt(change.getChangedTable(), ddl);
ddl.append("ALTER COLUMN ");
change.getChangedColumn().setTypeCode(change.getNewTypeCode());
writeColumn(change.getChangedTable(), change.getChangedColumn(), ddl);
printEndOfStatement(ddl);
protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) {
return false;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

import org.jumpmind.db.alter.AddColumnChange;
import org.jumpmind.db.alter.AddPrimaryKeyChange;
import org.jumpmind.db.alter.ColumnDataTypeChange;
import org.jumpmind.db.alter.PrimaryKeyChange;
import org.jumpmind.db.alter.RemoveColumnChange;
import org.jumpmind.db.alter.RemovePrimaryKeyChange;
Expand Down Expand Up @@ -180,6 +181,22 @@ protected void processTableStructureChanges(Database currentModel, Database desi
changeIt.remove();
}
}

super.processTableStructureChanges(currentModel, desiredModel,
sourceTable, targetTable, changes, ddl);
}

@Override
protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) {
writeTableAlterStmt(change.getChangedTable(), ddl);
ddl.append(" ALTER COLUMN ");
Column column = change.getChangedColumn();
column.setTypeCode(change.getNewTypeCode());
printIdentifier(getColumnName(column), ddl);
ddl.append(" SET DATA TYPE ");
ddl.append(getSqlType(column));
printEndOfStatement(ddl);
return true;
}

/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

import org.jumpmind.db.alter.AddColumnChange;
import org.jumpmind.db.alter.AddPrimaryKeyChange;
import org.jumpmind.db.alter.ColumnDataTypeChange;
import org.jumpmind.db.alter.RemoveColumnChange;
import org.jumpmind.db.alter.TableChange;
import org.jumpmind.db.model.Column;
Expand Down Expand Up @@ -239,11 +240,9 @@ public void writeExternalIndexDropStmt(Table table, IIndex index, StringBuilder
protected void processTableStructureChanges(Database currentModel, Database desiredModel,
Table sourceTable, Table targetTable, List<TableChange> changes, StringBuilder ddl) {
// TODO: Dropping of primary keys is currently not supported because we
// cannot
// determine the pk constraint names and drop them in one go
// cannot determine the pk constraint names and drop them in one go
// (We could used a stored procedure if Firebird would allow them to use
// DDL)
// This will be easier once named primary keys are supported
// DDL) This will be easier once named primary keys are supported
boolean pkColumnAdded = false;

for (Iterator<TableChange> changeIt = changes.iterator(); changeIt.hasNext();) {
Expand Down Expand Up @@ -284,7 +283,39 @@ protected void processTableStructureChanges(Database currentModel, Database desi
changeIt.remove();
}
}

super.processTableStructureChanges(currentModel, desiredModel,
sourceTable, targetTable, changes, ddl);
}

@Override
protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) {
Table table = change.getChangedTable();
Column column = change.getChangedColumn();
if (column.isPrimaryKey()) {
writeTableAlterStmt(change.getChangedTable(), ddl);
ddl.append(" DROP CONSTRAINT ");
ddl.append(table.getPrimaryKeyConstraintName());
printEndOfStatement(ddl);
}

writeTableAlterStmt(change.getChangedTable(), ddl);
ddl.append(" ALTER COLUMN ");
column.setTypeCode(change.getNewTypeCode());
printIdentifier(getColumnName(column), ddl);
ddl.append(" TYPE ");
ddl.append(getSqlType(column));
printEndOfStatement(ddl);

if (column.isPrimaryKey()) {
writeTableAlterStmt(change.getChangedTable(), ddl);
ddl.append(" ADD ");
writePrimaryKeyStmt(table, table.getPrimaryKeyColumns(), ddl);
printEndOfStatement(ddl);
}

return true;
}

/*
* Processes the addition of a column to a table.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

import org.apache.commons.lang.StringUtils;
import org.jumpmind.db.alter.AddColumnChange;
import org.jumpmind.db.alter.ColumnDataTypeChange;
import org.jumpmind.db.alter.RemoveColumnChange;
import org.jumpmind.db.model.Column;
import org.jumpmind.db.model.Database;
Expand Down Expand Up @@ -162,4 +163,14 @@ public void writeExternalIndexDropStmt(Table table, IIndex index, StringBuilder
protected void writeColumnAutoIncrementStmt(Table table, Column column, StringBuilder ddl) {
ddl.append("AUTO_INCREMENT");
}

@Override
protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) {
writeTableAlterStmt(change.getChangedTable(), ddl);
ddl.append("ALTER COLUMN ");
change.getChangedColumn().setTypeCode(change.getNewTypeCode());
writeColumn(change.getChangedTable(), change.getChangedColumn(), ddl);
printEndOfStatement(ddl);
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,11 @@ protected boolean shouldGeneratePrimaryKeys(Column[] primaryKeyColumns) {
return true;
}
}

@Override
protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) {
return false;
}

@Override
protected void processTableStructureChanges(Database currentModel, Database desiredModel,
Expand All @@ -119,12 +124,16 @@ protected void processTableStructureChanges(Database currentModel, Database desi
}
}

// LONGVARCHAR columns always report changes
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 (writeAlterColumnDataType(dataTypeChange, ddl)) {
changeIt.remove();
}
}
}
}
Expand Down Expand Up @@ -163,6 +172,7 @@ protected void processTableStructureChanges(Database currentModel, Database desi
changeIt.remove();
}
}

}

/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public MsSqlDdlBuilder() {
databaseInfo.setAutoIncrementUpdateAllowed(false);

addEscapedCharSequence("'", "''");
}
}

@Override
public void createTable(Table table, StringBuilder ddl) {
Expand Down Expand Up @@ -657,7 +657,12 @@ protected void processColumnChange(Table sourceTable, Table targetTable, Column
printlnIdentifier(getTableName(sourceTable.getName()), ddl);
printIndent(ddl);
ddl.append("ALTER COLUMN ");
writeColumn(sourceTable, targetColumn, ddl);
if (typeChange) {
printIdentifier(getColumnName(targetColumn), ddl);
ddl.append(getSqlType(targetColumn));
} else {
writeColumn(sourceTable, targetColumn, ddl);
}
printEndOfStatement(ddl);

if (shallHaveDefault) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@ protected void processTableStructureChanges(Database currentModel, Database desi
}

@Override
protected void writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) {
protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) {
writeTableAlterStmt(change.getChangedTable(), ddl);
ddl.append("MODIFY (");
Column column = change.getChangedColumn();
Expand All @@ -405,7 +405,7 @@ protected void writeAlterColumnDataType(ColumnDataTypeChange change, StringBuild
ddl.append(getSqlType(column));
ddl.append(")");
printEndOfStatement(ddl);

return true;
}

/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public void dropTable(Table table, StringBuilder ddl) {
}

@Override
protected void writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) {
protected boolean writeAlterColumnDataType(ColumnDataTypeChange change, StringBuilder ddl) {
writeTableAlterStmt(change.getChangedTable(), ddl);
ddl.append(" ALTER COLUMN ");
Column column = change.getChangedColumn();
Expand All @@ -118,6 +118,7 @@ protected void writeAlterColumnDataType(ColumnDataTypeChange change, StringBuild
ddl.append(" TYPE ");
ddl.append(getSqlType(column));
printEndOfStatement(ddl);
return true;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import org.jumpmind.db.platform.DatabaseMetaDataWrapper;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.platform.IDdlBuilder;
import org.jumpmind.db.sql.JdbcSqlTemplate;

/*
* The Jdbc Model Reader for Firebird.
Expand All @@ -61,10 +62,27 @@ protected Table readTable(Connection connection, DatabaseMetaDataWrapper metaDat

if (table != null) {
determineAutoIncrementColumns(connection, table);
setPrimaryKeyConstraintName(connection, table);
}

return table;
}

protected void setPrimaryKeyConstraintName(Connection connection, Table table) throws SQLException {
String sql = "select RDB$CONSTRAINT_NAME from RDB$RELATION_CONSTRAINTS where RDB$RELATION_NAME=? and RDB$CONSTRAINT_TYPE='PRIMARY KEY'";
PreparedStatement pstmt = null;
try {
pstmt = connection.prepareStatement(sql);
pstmt.setString(1, table.getName());
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
table.setPrimaryKeyConstraintName(rs.getString(1).trim());
}
rs.close();
} finally {
JdbcSqlTemplate.close(pstmt);
}
}

@Override
protected Collection<Column> readColumns(DatabaseMetaDataWrapper metaData, String tableName)
Expand Down Expand Up @@ -175,21 +193,14 @@ protected Collection<String> readPrimaryKeyNames(DatabaseMetaDataWrapper metaDat
// it is not able to find the primary key info for the table
// So we have to filter manually below
pkData = metaData.getPrimaryKeys(getDefaultTablePattern());
while (pkData.next()) {
Map<String,Object> values = readMetaData(pkData, getColumnsForPK());

if (tableName.equals(values.get("TABLE_NAME"))) {
pks.add(readPrimaryKeyName(metaData, values));
}
}
} else {
pkData = metaData.getPrimaryKeys(tableName);
while (pkData.next()) {
Map<String,Object> values = readMetaData(pkData, getColumnsForPK());
}
while (pkData.next()) {
Map<String,Object> values = readMetaData(pkData, getColumnsForPK());

if (tableName.equals(values.get("TABLE_NAME"))) {
pks.add(readPrimaryKeyName(metaData, values));
}
if (tableName.equals(values.get("TABLE_NAME"))) {
pks.add(readPrimaryKeyName(metaData, values));
}
}
} finally {
Expand Down Expand Up @@ -242,8 +253,7 @@ protected Collection<ForeignKey> readForeignKeys(Connection connection, Database
protected Collection<IIndex> readIndices(Connection connection, DatabaseMetaDataWrapper metaData,
String tableName) throws SQLException {
// Jaybird is not able to read indices when delimited identifiers are
// turned on,
// so we gather the data manually using Firebird's system tables
// turned on, so we gather the data manually using Firebird's system tables
@SuppressWarnings("unchecked")
Map<String, IIndex> indices = new ListOrderedMap();
StringBuilder query = new StringBuilder();
Expand Down
Loading

0 comments on commit 03aa6f8

Please sign in to comment.