Added column alter checks in DB Upgrade handler and fixed some bugs
This commit is contained in:
parent
74e8c4aa68
commit
973dfdec35
3 changed files with 40 additions and 25 deletions
BIN
Zutil.jar
BIN
Zutil.jar
Binary file not shown.
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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>>{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue