Added column alter checks in DB Upgrade handler and fixed some bugs

This commit is contained in:
Ziver Koc 2015-12-16 19:20:16 +01:00
parent 74e8c4aa68
commit 973dfdec35
3 changed files with 40 additions and 25 deletions

BIN
Zutil.jar

Binary file not shown.

View file

@ -139,9 +139,9 @@ public class StringUtil {
StringBuilder str = new StringBuilder(); StringBuilder str = new StringBuilder();
Iterator<?> it = list.iterator(); Iterator<?> it = list.iterator();
if(it.hasNext()) { if(it.hasNext()) {
str.append(it.next()); str.append(it.next().toString());
while (it.hasNext()) { while (it.hasNext()) {
str.append(delimiter).append(it.next()); str.append(delimiter).append(it.next().toString());
} }
} }
return str.toString(); return str.toString();

View file

@ -57,14 +57,14 @@ public class DBUpgradeHandler {
* *
* @param enable * @param enable
*/ */
public void forceDBUpgrade(boolean enable){ public void setForcedDBUpgrade(boolean enable){
this.forceUpgradeEnabled = enable; this.forceUpgradeEnabled = enable;
} }
public void upgrade() throws SQLException { public void upgrade() throws SQLException {
try { try {
logger.fine("Starting upgrade transaction..."); logger.fine("Starting upgrade transaction...");
target.exec("BEGIN IMMEDIATE TRANSACTION"); target.getConnection().setAutoCommit(false);
upgradeRenameTables(); upgradeRenameTables();
upgradeCreateTables(); upgradeCreateTables();
@ -72,14 +72,12 @@ public class DBUpgradeHandler {
upgradeAlterTables(); upgradeAlterTables();
logger.fine("Committing upgrade transaction..."); logger.fine("Committing upgrade transaction...");
target.exec("COMMIT TRANSACTION"); target.getConnection().commit();
} catch(SQLException e){ } catch(SQLException e){
try { target.getConnection().rollback();
target.exec("ROLLBACK TRANSACTION");
} catch (SQLException secondary_e) {
logger.log(Level.SEVERE, null, secondary_e);
}
throw e; throw e;
} finally {
target.getConnection().setAutoCommit(true);
} }
} }
@ -90,7 +88,7 @@ public class DBUpgradeHandler {
for (String oldTableName : tableRenameMap.keySet()) { for (String oldTableName : tableRenameMap.keySet()) {
if (targetTables.contains(oldTableName)) { if (targetTables.contains(oldTableName)) {
String newTableName = tableRenameMap.get(oldTableName); String newTableName = tableRenameMap.get(oldTableName);
logger.fine("Renaming table from: " + oldTableName + ", to: " + newTableName); logger.fine(String.format("Renaming table from: '%s' to: '%s'", oldTableName, newTableName));
target.exec(String.format( target.exec(String.format(
"ALTER TABLE %s RENAME TO %s", oldTableName, newTableName)); "ALTER TABLE %s RENAME TO %s", oldTableName, newTableName));
} }
@ -104,7 +102,7 @@ public class DBUpgradeHandler {
for(String table : refTables){ for(String table : refTables){
if(!targetTables.contains(table)){ if(!targetTables.contains(table)){
logger.fine("Creating new table: "+ table); logger.fine(String.format("Creating new table: '%s'", table));
// Get reference create sql // Get reference create sql
String sql = getTableSql(reference, table); String sql = getTableSql(reference, table);
// Execute sql on target // Execute sql on target
@ -119,7 +117,7 @@ public class DBUpgradeHandler {
for(String table : targetTables){ for(String table : targetTables){
if(!refTables.contains(table)){ if(!refTables.contains(table)){
logger.fine("Dropping table: " + table); logger.fine(String.format("Dropping table: '%s'", table));
target.exec("DROP TABLE " + table); target.exec("DROP TABLE " + table);
} }
} }
@ -137,38 +135,51 @@ public class DBUpgradeHandler {
List<DBColumn> targetStruct = getColumnList(target, table); List<DBColumn> targetStruct = getColumnList(target, table);
// Check unnecessary columns // Check unnecessary columns
boolean forcedUpgrade = false; boolean execForcedUpgrade = false;
for(DBColumn column : targetStruct) { for(DBColumn column : targetStruct) {
if(!refStruct.contains(column)) { if(refStruct.contains(column)) {
DBColumn refColumn = refStruct.get(refStruct.indexOf(column));
// Check if the columns have the same type
if(!column.type.equals(refColumn.type)){
if(forceUpgradeEnabled) if(forceUpgradeEnabled)
forcedUpgrade = true; execForcedUpgrade = true;
else else
logger.warning("Unable to drop column: '" + column.name + "' from table: "+ table logger.warning(String.format(
+" (SQLite does not support dropping columns)"); "Skipping alter(%s -> %s) column: '%s.%s' (no SQLite support, forced upgrade needed)",
column.type, refColumn.type, table, column.name));
}
}
else { // Column does not exist in reference DB, column should be removed
if (forceUpgradeEnabled)
execForcedUpgrade = true;
else
logger.warning(String.format(
"Skipping drop column: '%s.%s' (no SQLite support, forced upgrade needed)",
table, column.name));
} }
} }
// Do a forced upgrade where we create a new table and migrate the old data // Do a forced upgrade where we create a new table and migrate the old data
if(forcedUpgrade){ if(execForcedUpgrade){
// Backup table // Backup table
String backupTable = table+"_temp"; String backupTable = table+"_temp";
logger.fine("Forced Upgrade: Backing up table: "+table+", to: "+backupTable); logger.fine(String.format("Forced Upgrade: Backing up table: '%s' to: '%s'", table, backupTable));
target.exec(String.format("ALTER TABLE %s RENAME TO %s", table, backupTable)); target.exec(String.format("ALTER TABLE %s RENAME TO %s", table, backupTable));
// Creating new table // Creating new table
logger.fine("Forced Upgrade: Creating new table: "+table); logger.fine(String.format("Forced Upgrade: Creating new table: '%s'", table));
String sql = getTableSql(reference, table); String sql = getTableSql(reference, table);
target.exec(sql); target.exec(sql);
// Restoring data // Restoring data
logger.fine("Forced Upgrade: Restoring data for table: "+table); logger.fine(String.format("Forced Upgrade: Restoring data for table: '%s'", table));
String cols = StringUtil.join(refStruct, ","); String cols = StringUtil.join(refStruct, ",");
target.exec(String.format( target.exec(String.format(
"INSERT INTO %s (%s) SELECT %s FROM %s", "INSERT INTO %s (%s) SELECT %s FROM %s",
table, cols, cols, backupTable)); table, cols, cols, backupTable));
// Remove backup table // Remove backup table
logger.fine("Forced Upgrade: Removing backup table: "+backupTable); logger.fine(String.format("Forced Upgrade: Dropping backup table: '%s'", backupTable));
target.exec("DROP TABLE " + backupTable); target.exec("DROP TABLE " + backupTable);
} }
// Do a // Do a
@ -176,7 +187,7 @@ public class DBUpgradeHandler {
// Add new columns // Add new columns
for(DBColumn column : refStruct) { for(DBColumn column : refStruct) {
if(!targetStruct.contains(column)) { if(!targetStruct.contains(column)) {
logger.fine("Adding column '" + column.name + "' to table: " + table); logger.fine(String.format("Adding column '%s.%s'", table, column.name));
target.exec( target.exec(
String.format("ALTER TABLE %s ADD COLUMN %s %s %s%s%s", String.format("ALTER TABLE %s ADD COLUMN %s %s %s%s%s",
table, table,
@ -218,6 +229,10 @@ public class DBUpgradeHandler {
return obj instanceof DBColumn && return obj instanceof DBColumn &&
name.equals(((DBColumn)obj).name); name.equals(((DBColumn)obj).name);
} }
public String toString(){
return name;
}
} }
private static class TableStructureResultHandler implements SQLResultHandler<List<DBColumn>>{ private static class TableStructureResultHandler implements SQLResultHandler<List<DBColumn>>{