diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDatabasePlatform.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDatabasePlatform.java index a1e3ecc957..c2c6dff99a 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDatabasePlatform.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/AbstractDatabasePlatform.java @@ -122,6 +122,8 @@ public abstract class AbstractDatabasePlatform implements IDatabasePlatform { protected Boolean supportsMultiThreadedTransactions; + protected boolean supportsTruncate = true; + public AbstractDatabasePlatform(SqlTemplateSettings settings) { this.settings = settings; } @@ -1178,5 +1180,19 @@ public long getEstimatedRowCount(Table table) { return getSqlTemplateDirty().queryForLong(sql); } - + + + public String getTruncateSql(Table table) { + String sql = null; + if (supportsTruncate) { + sql = "truncate table "; + } else { + log.info("Truncate is not supported on " + getName() + ". Changing to equivalent delete statement"); + sql = "delete from "; + } + String quote = getDdlBuilder().isDelimitedIdentifierModeOn() ? getDatabaseInfo().getDelimiterToken() : ""; + sql += table.getQualifiedTableName(quote, getDatabaseInfo().getCatalogSeparator(), getDatabaseInfo().getSchemaSeparator()); + + return sql; + } } diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/IDatabasePlatform.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/IDatabasePlatform.java index 22152af51c..ab2e8380c4 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/IDatabasePlatform.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/IDatabasePlatform.java @@ -197,4 +197,5 @@ public Object[] getObjectValues(BinaryEncoding encoding, String[] values, public long getEstimatedRowCount(Table table); + public String getTruncateSql(Table table); } diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/kafka/KafkaPlatform.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/kafka/KafkaPlatform.java index 6c26179c17..df698ba2c5 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/kafka/KafkaPlatform.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/kafka/KafkaPlatform.java @@ -10,6 +10,7 @@ public KafkaPlatform(SqlTemplateSettings settings) { super(settings); super.ddlBuilder = new KafkaDdlBuilder(); super.ddlReader = new KafkaDdlReader(this); + supportsTruncate = false; } @Override @@ -46,6 +47,4 @@ public ISqlTemplate getSqlTemplate() { public ISqlTemplate getSqlTemplateDirty() { return new KafkaSqlTemplate(); } - - } diff --git a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultDatabaseWriter.java b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultDatabaseWriter.java index af8b4db168..43c2957097 100644 --- a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultDatabaseWriter.java +++ b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultDatabaseWriter.java @@ -68,7 +68,11 @@ public class DefaultDatabaseWriter extends AbstractDatabaseWriter { protected final static Logger log = LoggerFactory.getLogger(DefaultDatabaseWriter.class); public static final String CUR_DATA = "DatabaseWriter.CurData"; - + + private final String ATTRIBUTE_CHANNEL_ID_RELOAD = "reload"; + + private final String TRUNCATE_PATTERN = "truncate table [^ ]+"; + protected IDatabasePlatform platform; protected ISqlTransaction transaction; @@ -825,11 +829,15 @@ protected List getSqlStatements(String script) { protected String preprocessSqlStatement(String sql) { sql = FormatUtils.replace("nodeId", batch.getTargetNodeId(), sql); if (targetTable != null) { - sql = FormatUtils.replace("catalogName", quoteString(targetTable.getCatalog()),sql); + sql = FormatUtils.replace("catalogName", quoteString(targetTable.getCatalog()), sql); sql = FormatUtils.replace("schemaName", quoteString(targetTable.getSchema()), sql); sql = FormatUtils.replace("tableName", quoteString(targetTable.getName()), sql); - } else if (sourceTable != null){ - sql = FormatUtils.replace("catalogName", quoteString(sourceTable.getCatalog()),sql); + + if (ATTRIBUTE_CHANNEL_ID_RELOAD.equals(batch.getChannelId()) && sql.matches(TRUNCATE_PATTERN)) { + sql = getPlatform().getTruncateSql(targetTable); + } + } else if (sourceTable != null) { + sql = FormatUtils.replace("catalogName", quoteString(sourceTable.getCatalog()), sql); sql = FormatUtils.replace("schemaName", quoteString(sourceTable.getSchema()), sql); sql = FormatUtils.replace("tableName", quoteString(sourceTable.getName()), sql); } diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2As400DatabasePlatform.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2As400DatabasePlatform.java index a5c797aeb0..c56b0bf295 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2As400DatabasePlatform.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2As400DatabasePlatform.java @@ -16,6 +16,7 @@ public class Db2As400DatabasePlatform extends Db2DatabasePlatform { public Db2As400DatabasePlatform(DataSource dataSource, SqlTemplateSettings settings) { super(dataSource, settings); + supportsTruncate = false; } @Override diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2DatabasePlatform.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2DatabasePlatform.java index 314bccdfe6..d02d6314be 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2DatabasePlatform.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2DatabasePlatform.java @@ -23,6 +23,7 @@ import org.apache.commons.lang.StringUtils; import org.jumpmind.db.model.Column; +import org.jumpmind.db.model.Table; import org.jumpmind.db.platform.AbstractJdbcDatabasePlatform; import org.jumpmind.db.platform.DatabaseNamesConstants; import org.jumpmind.db.platform.PermissionResult; @@ -41,12 +42,20 @@ public class Db2DatabasePlatform extends AbstractJdbcDatabasePlatform { /* The subprotocol used by the standard DB2 driver. */ public static final String JDBC_SUBPROTOCOL = "db2"; - + + protected int majorVersion; + protected int minorVersion; + /* * Creates a new platform instance. */ public Db2DatabasePlatform(DataSource dataSource, SqlTemplateSettings settings) { super(dataSource, settings); + majorVersion = sqlTemplate.getDatabaseMajorVersion(); + minorVersion = sqlTemplate.getDatabaseMinorVersion(); + if (majorVersion < 9 || (majorVersion == 9 && minorVersion < 7)) { + supportsTruncate = false; + } } @Override @@ -103,4 +112,11 @@ public PermissionResult getCreateSymTriggerPermission() { return result; } + + @Override + public String getTruncateSql(Table table) { + String sql = super.getTruncateSql(table); + sql += " reuse storage immediate"; + return sql; + } } diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2zOsDatabasePlatform.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2zOsDatabasePlatform.java index d89aaf66c1..65c79305a5 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2zOsDatabasePlatform.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/db2/Db2zOsDatabasePlatform.java @@ -29,6 +29,9 @@ public class Db2zOsDatabasePlatform extends Db2DatabasePlatform { public Db2zOsDatabasePlatform(DataSource dataSource, SqlTemplateSettings settings) { super(dataSource, settings); + if (majorVersion < 10) { + supportsTruncate = false; + } } @Override diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/firebird/FirebirdDatabasePlatform.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/firebird/FirebirdDatabasePlatform.java index 77d8766579..2cf1031ac8 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/firebird/FirebirdDatabasePlatform.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/firebird/FirebirdDatabasePlatform.java @@ -46,6 +46,7 @@ public class FirebirdDatabasePlatform extends AbstractJdbcDatabasePlatform { */ public FirebirdDatabasePlatform(DataSource dataSource, SqlTemplateSettings settings) { super(dataSource, settings); + supportsTruncate = false; } @Override diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/interbase/InterbaseDatabasePlatform.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/interbase/InterbaseDatabasePlatform.java index b77e43e666..5571d65fbb 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/interbase/InterbaseDatabasePlatform.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/interbase/InterbaseDatabasePlatform.java @@ -21,6 +21,7 @@ import javax.sql.DataSource; +import org.jumpmind.db.model.Table; import org.jumpmind.db.platform.AbstractJdbcDatabasePlatform; import org.jumpmind.db.platform.DatabaseNamesConstants; import org.jumpmind.db.platform.PermissionResult; @@ -86,4 +87,10 @@ public PermissionResult getDropSymTriggerPermission() { return result; } + @Override + public String getTruncateSql(Table table) { + String sql = super.getTruncateSql(table); + sql += " cascade"; + return sql; + } } diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mssql/MsSql2000DatabasePlatform.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mssql/MsSql2000DatabasePlatform.java index 61f1abf163..2a43f386e4 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mssql/MsSql2000DatabasePlatform.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mssql/MsSql2000DatabasePlatform.java @@ -51,6 +51,7 @@ public class MsSql2000DatabasePlatform extends AbstractJdbcDatabasePlatform { */ public MsSql2000DatabasePlatform(DataSource dataSource, SqlTemplateSettings settings) { super(dataSource, settings); + supportsTruncate = false; } @Override diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mssql/MsSql2005DatabasePlatform.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mssql/MsSql2005DatabasePlatform.java index eac3493128..afd6e24839 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mssql/MsSql2005DatabasePlatform.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mssql/MsSql2005DatabasePlatform.java @@ -37,6 +37,7 @@ public class MsSql2005DatabasePlatform extends MsSql2000DatabasePlatform { */ public MsSql2005DatabasePlatform(DataSource dataSource, SqlTemplateSettings settings) { super(dataSource, settings); + supportsTruncate = false; } @Override diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mssql/MsSql2008DatabasePlatform.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mssql/MsSql2008DatabasePlatform.java index 37db275179..1336d0666d 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mssql/MsSql2008DatabasePlatform.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mssql/MsSql2008DatabasePlatform.java @@ -38,6 +38,7 @@ public class MsSql2008DatabasePlatform extends MsSql2005DatabasePlatform { */ public MsSql2008DatabasePlatform(DataSource dataSource, SqlTemplateSettings settings) { super(dataSource, settings); + supportsTruncate = true; } @Override @@ -58,5 +59,5 @@ public long getEstimatedRowCount(Table table) { "where t.name = ? and schema_name(t.schema_id) = ?", table.getName(), table.getSchema()); } - + } diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDatabasePlatform.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDatabasePlatform.java index c075197aa6..5710f36ebc 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDatabasePlatform.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/postgresql/PostgreSqlDatabasePlatform.java @@ -242,5 +242,11 @@ public long getEstimatedRowCount(Table table) { "on n.oid = c.relnamespace where c.relname = ? and n.nspname = ?", table.getName(), table.getSchema()); } - + + @Override + public String getTruncateSql(Table table) { + String sql = super.getTruncateSql(table); + sql += " cascade"; + return sql; + } } diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/raima/RaimaDatabasePlatform.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/raima/RaimaDatabasePlatform.java index b1136616c2..d9b19cb508 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/raima/RaimaDatabasePlatform.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/raima/RaimaDatabasePlatform.java @@ -36,6 +36,7 @@ public class RaimaDatabasePlatform extends AbstractJdbcDatabasePlatform { public RaimaDatabasePlatform(DataSource dataSource, SqlTemplateSettings settings) { super(dataSource, settings); + supportsTruncate = false; } @Override diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/sqlite/SqliteDatabasePlatform.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/sqlite/SqliteDatabasePlatform.java index a02503ad6e..bf1bd63694 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/sqlite/SqliteDatabasePlatform.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/sqlite/SqliteDatabasePlatform.java @@ -55,6 +55,7 @@ public SqliteDatabasePlatform(DataSource dataSource, SqlTemplateSettings setting "strftime('%Y-%m-%d %H:%M:%f','now','localtime')"); sqlScriptReplacementTokens.put("\\{ts([^<]*?)\\}", "$1"); sqlScriptReplacementTokens.put("\\{d([^<]*?)\\}", "$1"); + supportsTruncate = false; } @Override