Skip to content

Commit

Permalink
0000948: Fix upgrade to sym_trigger_hist to not blow away sequences
Browse files Browse the repository at this point in the history
Also commented out sym_file_sync for the 3.2 release prevented drops and create sequences from causing an upgrade to fail.
  • Loading branch information
chenson42 committed Dec 13, 2012
1 parent 4fa6c05 commit d72b6aa
Show file tree
Hide file tree
Showing 14 changed files with 110 additions and 53 deletions.
Expand Up @@ -39,6 +39,7 @@
import org.jumpmind.db.model.Table;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.platform.IDdlBuilder;
import org.jumpmind.db.sql.ISqlResultsListener;
import org.jumpmind.db.sql.ISqlTemplate;
import org.jumpmind.db.sql.ISqlTransaction;
import org.jumpmind.db.sql.SqlException;
Expand Down Expand Up @@ -427,27 +428,45 @@ public boolean createOrAlterTablesIfNecessary() {
if (builder.isAlterDatabase(modelFromDatabase, modelFromXml)) {
log.info("There are SymmetricDS tables that needed altered");
String delimiter = platform.getDatabaseInfo().getSqlCommandDelimiter();
ISqlResultsListener resultsListener = new ISqlResultsListener() {

public void sqlErrored(String sql, SqlException ex, int lineNumber,
boolean dropStatement, boolean sequenceCreate) {
if (dropStatement || sequenceCreate) {
log.info("DDL failed: {}", sql);
} else {
log.warn("DDL failed: {}", sql);
}
}

public void sqlApplied(String sql, int rowsUpdated, int rowsRetrieved, int lineNumber) {
log.info("DDL applied: {}", sql);
}
};

for (IDatabaseUpgradeListener listener : databaseUpgradeListeners) {
String sql = listener
.beforeUpgrade(this, this.parameterService.getTablePrefix(),
modelFromDatabase, modelFromXml);
new SqlScript(sql, getPlatform().getSqlTemplate(), true, delimiter, null)
.execute(platform.getDatabaseInfo().isRequiresAutoCommitForDdl());
SqlScript script = new SqlScript(sql, getPlatform().getSqlTemplate(), true, false, false, delimiter, null);
script.setListener(resultsListener);
script.execute(platform.getDatabaseInfo().isRequiresAutoCommitForDdl());
}

String alterSql = builder.alterDatabase(modelFromDatabase, modelFromXml);

log.info("Alter SQL generated: {}", alterSql);
log.debug("Alter SQL generated: {}", alterSql);

new SqlScript(alterSql, getPlatform().getSqlTemplate(), true, delimiter, null)
.execute(platform.getDatabaseInfo().isRequiresAutoCommitForDdl());
SqlScript script = new SqlScript(alterSql, getPlatform().getSqlTemplate(), true, false, false, delimiter, null);
script.setListener(resultsListener);
script.execute(platform.getDatabaseInfo().isRequiresAutoCommitForDdl());

for (IDatabaseUpgradeListener listener : databaseUpgradeListeners) {
String sql = listener.afterUpgrade(this,
this.parameterService.getTablePrefix(), modelFromXml);
new SqlScript(sql, getPlatform().getSqlTemplate(), true, delimiter, null)
.execute(platform.getDatabaseInfo().isRequiresAutoCommitForDdl());
script = new SqlScript(sql, getPlatform().getSqlTemplate(), true, false, false, delimiter, null);
script.setListener(resultsListener);
script.execute(platform.getDatabaseInfo().isRequiresAutoCommitForDdl());
}

log.info("Done with auto update of SymmetricDS tables");
Expand Down
8 changes: 4 additions & 4 deletions symmetric-core/src/main/resources/symmetric-schema.xml
Expand Up @@ -565,7 +565,8 @@
<column name="load_filter_order" type="INTEGER" required="true" default="1" description="Specifies the order in which to apply load filters if more than one target operation occurs."/>
<column name="fail_on_error" type="BOOLEANINT" size="1" required="true" default="0" description="Whether we should fail the batch if the filter fails." />
</table>


<!--
<table name="file_sync" description="A table that defines file synchronization configuration">
<column name="file_sync_id" type="VARCHAR" size="50" required="true" primaryKey="true" description="The id of the synchronization." />
<column name="server_group_id" type="VARCHAR" size="50" required="true" description="The node group that will act as the client during file synchronization." />
Expand All @@ -587,7 +588,6 @@
<column name="create_time" type="TIMESTAMP" description="Timestamp when this entry was created." />
<column name="last_update_by" type="VARCHAR" size="50" description="The user who last updated this entry." />
<column name="last_update_time" type="TIMESTAMP" required="true" description="Timestamp when a user last updated this entry." />
<!--
compress_for_xfer
package_files
conflict_strategy
Expand All @@ -596,7 +596,7 @@ client_pre_sync_script
client_post_sync_script
server_pre_sync_script
server_post_sync_script
-->
</table>
</table>
-->

</database>
Expand Up @@ -104,13 +104,13 @@ public List<IModelChange> compare(Database sourceModel, Database targetModel) {
&& (sourceTable.getName().length() > 0)) {
log.debug("Table {} needs to be removed", sourceTable.getName());
changes.add(new RemoveTableChange(sourceTable));
// we assume that the target model is sound, ie. that there are
// no longer any foreign
// keys to this table in the target model; thus we already have
// removeFK changes for
// these from the compareTables method and we only need to
// create changes for the fks
// originating from this table
/*
* we assume that the target model is sound, ie. that there are
* no longer any foreign keys to this table in the target model;
* thus we already have removeFK changes for these from the
* compareTables method and we only need to create changes for
* the fks originating from this table
*/
if (platformInfo.isForeignKeysSupported()) {
for (int fkIdx = 0; fkIdx < sourceTable.getForeignKeyCount(); fkIdx++) {
changes.add(new RemoveForeignKeyChange(sourceTable, sourceTable
Expand Down Expand Up @@ -164,9 +164,10 @@ public List<IModelChange> compareTables(Database sourceModel, Table sourceTable,
log.debug("Foreign key " + targetFk + " needs to be created for table "
+ sourceTable.getName());
}
// we have to use the target table here because the foreign key
// might
// reference a new column
/*
* we have to use the target table here because the foreign
* key might reference a new column
*/
changes.add(new AddForeignKeyChange(targetTable, targetFk));
}
}
Expand Down
Expand Up @@ -156,7 +156,7 @@ public void createDatabase(Database targetDatabase, boolean dropTablesFirst,
}

String delimiter = getDdlBuilder().getDatabaseInfo().getSqlCommandDelimiter();
new SqlScript(createSql, getSqlTemplate(), !continueOnError, delimiter, null).execute();
new SqlScript(createSql, getSqlTemplate(), !continueOnError, false, false, delimiter, null).execute();
}

public void alterDatabase(Database desiredDatabase, boolean continueOnError) {
Expand Down Expand Up @@ -187,7 +187,7 @@ public void alterTables(boolean continueOnError, Table... desiredTables) {
if (StringUtils.isNotBlank(alterSql.trim())) {
log.info("Running alter sql:\n{}", alterSql);
String delimiter = getDdlBuilder().getDatabaseInfo().getSqlCommandDelimiter();
new SqlScript(alterSql, getSqlTemplate(), !continueOnError, delimiter, null).execute();
new SqlScript(alterSql, getSqlTemplate(), !continueOnError, false, false, delimiter, null).execute();
} else {
log.info("Tables up to date. No alters found for {}", tablesProcessed);
}
Expand Down
Expand Up @@ -704,6 +704,9 @@ private void addRelevantFKsFromUnchangedTables(Database currentModel, Database d
*/
protected void processTableStructureChanges(Database currentModel, Database desiredModel,
String tableName, List<TableChange> changes, StringBuilder ddl) {

StringBuilder tableDdl = new StringBuilder();

Table sourceTable = currentModel.findTable(tableName, delimitedIdentifierModeOn);
Table targetTable = desiredModel.findTable(tableName, delimitedIdentifierModeOn);

Expand All @@ -727,7 +730,7 @@ protected void processTableStructureChanges(Database currentModel, Database desi
}
if (!requiresFullRebuild) {
processTableStructureChanges(currentModel, desiredModel, sourceTable, targetTable,
changes, ddl);
changes, tableDdl);
}

if (!changes.isEmpty()) {
Expand Down Expand Up @@ -761,9 +764,11 @@ protected void processTableStructureChanges(Database currentModel, Database desi
dropTemporaryTable(tempTable, ddl);
createTemporaryTable(desiredModel, tempTable, ddl);
writeCopyDataStatement(sourceTable, tempTable, ddl);
// Note that we don't drop the indices here because the DROP
// TABLE will take care of that
// Likewise, foreign keys have already been dropped as necessary
/*
* Note that we don't drop the indices here because the DROP
* TABLE will take care of that Likewise, foreign keys have
* already been dropped as necessary
*/
dropTable(sourceTable, ddl, false, true);
createTable(realTargetTable, ddl, false, true);
writeCopyDataStatement(tempTable, targetTable, ddl);
Expand All @@ -773,6 +778,8 @@ protected void processTableStructureChanges(Database currentModel, Database desi
dropTable(sourceTable, ddl, false, false);
createTable(realTargetTable, ddl, false, false);
}
} else {
ddl.append(tableDdl);
}
}

Expand Down
Expand Up @@ -103,7 +103,7 @@ protected void dropTable(Table table, StringBuilder ddl, boolean temporary, bool
// dropping generators for auto-increment
Column[] columns = table.getAutoIncrementColumns();

if (!temporary) {
if (!temporary && !recreate) {
for (int idx = 0; idx < columns.length; idx++) {
writeAutoIncrementDropStmts(table, columns[idx], ddl);
}
Expand Down
Expand Up @@ -118,7 +118,7 @@ protected String getNativeDefaultValue(Column column) {

@Override
protected void dropTable(Table table, StringBuilder ddl, boolean temporary, boolean recreate) {
if (!temporary) {
if (!temporary && !recreate) {
// dropping generators for auto-increment
Column[] columns = table.getAutoIncrementColumns();

Expand Down
Expand Up @@ -122,7 +122,7 @@ protected void createTable(Table table, StringBuilder ddl, boolean temporary, bo

@Override
protected void dropTable(Table table, StringBuilder ddl, boolean temporary, boolean recreate) {
if (!temporary) {
if (!temporary && !recreate) {
// The only difference to the Oracle 8/9 variant is the purge which
// prevents the table from being moved to the recycle bin (which is
// new in Oracle 10)
Expand Down
Expand Up @@ -106,7 +106,7 @@ protected void dropTable(Table table, StringBuilder ddl, boolean temporary, bool
printIdentifier(getTableName(table.getName()), ddl);
ddl.append(" CASCADE");
printEndOfStatement(ddl);
if (!temporary) {
if (!temporary && !recreate) {
Column[] columns = table.getAutoIncrementColumns();

for (int idx = 0; idx < columns.length; idx++) {
Expand Down
Expand Up @@ -4,8 +4,6 @@
import java.sql.Types;

import org.jumpmind.db.model.Column;
import org.jumpmind.db.model.Database;
import org.jumpmind.db.model.ForeignKey;
import org.jumpmind.db.model.IIndex;
import org.jumpmind.db.model.Table;
import org.jumpmind.db.platform.AbstractDdlBuilder;
Expand Down
Expand Up @@ -4,6 +4,6 @@ public interface ISqlResultsListener {

public void sqlApplied(String sql, int rowsUpdated, int rowsRetrieved, int lineNumber);

public void sqlErrored(String sql, SqlException ex, int lineNumber);
public void sqlErrored(String sql, SqlException ex, int lineNumber, boolean dropStatement, boolean sequenceCreate);

}
Expand Up @@ -64,7 +64,7 @@ public <T, W> Map<T, W> query(String sql, String keyCol, String valueCol, Object

public int update(boolean autoCommit, boolean failOnError, int commitRate, ISqlResultsListener listener, String... sql);

public int update(boolean autoCommit, boolean failOnError, int commitRate, ISqlResultsListener listener, ISqlStatementSource source);
public int update(boolean autoCommit, boolean failOnError, boolean failOnDrops, boolean failOnSequenceCreate, int commitRate, ISqlResultsListener listener, ISqlStatementSource source);

public int update(boolean autoCommit, boolean failOnError, int commitRate, String... sql);

Expand Down
48 changes: 39 additions & 9 deletions symmetric-db/src/main/java/org/jumpmind/db/sql/SqlScript.java
Expand Up @@ -40,6 +40,10 @@ public class SqlScript {
private int commitRate = 10000;

private boolean failOnError = true;

private boolean failOnDrop = true;

private boolean failOnSequenceCreate = true;

private ISqlResultsListener resultsListener;

Expand All @@ -62,34 +66,36 @@ public SqlScript(URL url, ISqlTemplate sqlTemplate, boolean failOnError, String
try {
String fileName = url.getFile();
fileName = fileName.substring(fileName.lastIndexOf("/") + 1);
init(new InputStreamReader(url.openStream(), "UTF-8"), sqlTemplate, failOnError,
init(new InputStreamReader(url.openStream(), "UTF-8"), sqlTemplate, failOnError, true, true,
delimiter, replacementTokens);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}

public SqlScript(String sqlScript, ISqlTemplate sqlTemplate, boolean failOnError,Map<String, String> replacementTokens) {
this(sqlScript, sqlTemplate, failOnError, SqlScriptReader.QUERY_ENDS, replacementTokens);
public SqlScript(String sqlScript, ISqlTemplate sqlTemplate, boolean failOnError, Map<String, String> replacementTokens) {
this(sqlScript, sqlTemplate, failOnError, true, true, SqlScriptReader.QUERY_ENDS, replacementTokens);
}

public SqlScript(String sqlScript, ISqlTemplate sqlTemplate, boolean failOnError,
public SqlScript(String sqlScript, ISqlTemplate sqlTemplate, boolean failOnError, boolean failOnDrop, boolean failOnSequenceCreate,
String delimiter, Map<String, String> replacementTokens) {
init(new StringReader(sqlScript), sqlTemplate, failOnError, delimiter, replacementTokens);
init(new StringReader(sqlScript), sqlTemplate, failOnError, failOnDrop, failOnSequenceCreate, delimiter, replacementTokens);
}

public SqlScript(Reader reader, ISqlTemplate sqlTemplate, boolean failOnError,
String delimiter, Map<String, String> replacementTokens) {
init(reader, sqlTemplate, failOnError, delimiter, replacementTokens);
init(reader, sqlTemplate, failOnError, true, true, delimiter, replacementTokens);
}

private void init(Reader reader, ISqlTemplate sqlTemplate, boolean failOnError,
private void init(Reader reader, ISqlTemplate sqlTemplate, boolean failOnError, boolean failOnDrop, boolean failOnSequenceCreate,
String delimiter, Map<String, String> replacementTokens) {
this.scriptReader = new SqlScriptReader(reader);
this.scriptReader.setDelimiter(delimiter);
this.scriptReader.setReplacementTokens(replacementTokens);
this.sqlTemplate = sqlTemplate;
this.failOnError = failOnError;
this.failOnSequenceCreate = failOnSequenceCreate;
this.failOnDrop = failOnDrop;
}

public long execute() {
Expand All @@ -98,8 +104,8 @@ public long execute() {

public long execute(final boolean autoCommit) {
try {
long count = this.sqlTemplate.update(autoCommit, failOnError, commitRate,
this.resultsListener, this.scriptReader);
long count = this.sqlTemplate.update(autoCommit, failOnError, failOnDrop, failOnSequenceCreate,
commitRate, this.resultsListener, this.scriptReader);
return count;
} finally {
IOUtils.closeQuietly(this.scriptReader);
Expand All @@ -122,5 +128,29 @@ public void setLineDeliminator(String lineDeliminator) {
public void setListener(ISqlResultsListener listener) {
this.resultsListener = listener;
}

public void setFailOnDrop(boolean failOnDrop) {
this.failOnDrop = failOnDrop;
}

public void setFailOnSequenceCreate(boolean failOnSequenceCreate) {
this.failOnSequenceCreate = failOnSequenceCreate;
}

public boolean isFailOnDrop() {
return failOnDrop;
}

public void setFailOnError(boolean failOnError) {
this.failOnError = failOnError;
}

public boolean isFailOnError() {
return failOnError;
}

public boolean isFailOnSequenceCreate() {
return failOnSequenceCreate;
}

}

0 comments on commit d72b6aa

Please sign in to comment.