Skip to content

Commit

Permalink
1825800 - MS SQL SERVER DIALECT DEVELOPMENT. Works for the most part.
Browse files Browse the repository at this point in the history
  • Loading branch information
chenson42 committed Nov 21, 2007
1 parent 770d7c7 commit 3251901
Show file tree
Hide file tree
Showing 8 changed files with 177 additions and 227 deletions.
Expand Up @@ -339,14 +339,12 @@ public void initTrigger(final DataEventType dml, final Trigger trigger, final Tr
final String tablePrefix, final Table table) {
jdbcTemplate.execute(new ConnectionCallback() {
public Object doInConnection(Connection con) throws SQLException, DataAccessException {
String catalog = trigger.getSourceSchemaName();
String previousSourceSchema = trigger.getSourceSchemaName();
logger.info("Creating " + dml.toString() + " trigger for "
+ (catalog != null ? (catalog + ".") : "") + trigger.getSourceTableName());
String previousCatalog = con.getCatalog();
+ (previousSourceSchema != null ? (previousSourceSchema + ".") : "") + trigger.getSourceTableName());
String previousCatalog = null;
try {
if (catalog != null) {
con.setCatalog(catalog);
}
previousCatalog = switchSchemasForTriggerInstall(previousSourceSchema, con);
Statement stmt = con.createStatement();
stmt.executeUpdate(createTriggerDDL(dml, trigger, audit, tablePrefix, table));
String postTriggerDml = createPostTriggerDDL(dml, trigger, audit, tablePrefix, table);
Expand All @@ -355,14 +353,21 @@ public Object doInConnection(Connection con) throws SQLException, DataAccessExce
}
stmt.close();
} finally {
if (catalog != null && !catalog.equalsIgnoreCase(previousCatalog)) {
con.setCatalog(previousCatalog);
if (previousSourceSchema != null && !previousSourceSchema.equalsIgnoreCase(previousCatalog)) {
switchSchemasForTriggerInstall(previousCatalog, con);
}
}
return null;
}
});
}

/**
* Provide the option switch a connection's schema for trigger installation.
*/
protected String switchSchemasForTriggerInstall(String schema, Connection c) throws SQLException {
return null;
}

public String createTriggerDDL(DataEventType dml, Trigger config, TriggerHistory audit, String tablePrefix,
Table table) {
Expand Down
Expand Up @@ -70,6 +70,10 @@ public void initTrigger(DataEventType dml, Trigger config,

public boolean supportsMixedCaseNamesInCatalog();

/**
* Implement this if the database has some type of cleanup functionality that needs to be
* run when dropping database objects. An example is Oracle's 'purge recyclebin'
*/
public void purge();

public SQLErrorCodeSQLExceptionTranslator getSqlErrorTranslator();
Expand Down
123 changes: 56 additions & 67 deletions symmetric/src/main/java/org/jumpmind/symmetric/db/SqlTemplate.java
Expand Up @@ -44,7 +44,7 @@ public class SqlTemplate {
static final String INITIAL_LOAD_SQL_TEMPLATE = "initialLoadSqlTemplate";

Map<String, String> sqlTemplates;

String triggerPrefix;

String stringColumnTemplate;
Expand All @@ -54,7 +54,7 @@ public class SqlTemplate {
String datetimeColumnTemplate;

String clobColumnTemplate;

String blobColumnTemplate;

String triggerConcatCharacter;
Expand All @@ -63,17 +63,11 @@ public class SqlTemplate {

String oldTriggerValue;

public String createInitalLoadSql(Node node, IDbDialect dialect,
Trigger trig, Table metaData) {
public String createInitalLoadSql(Node node, IDbDialect dialect, Trigger trig, Table metaData) {
String sql = sqlTemplates.get(INITIAL_LOAD_SQL_TEMPLATE);
sql = replace("tableName", trig.getSourceTableName(), sql);
sql = replace("schemaName",
trig.getSourceSchemaName() != null ? trig
.getSourceSchemaName()
+ "." : "", sql);
sql = replace("whereClause",
trig.getInitialLoadSelect() == null ? "1=1" : trig
.getInitialLoadSelect(), sql);
sql = replace("schemaName", trig.getSourceSchemaName() != null ? trig.getSourceSchemaName() + "." : "", sql);
sql = replace("whereClause", trig.getInitialLoadSelect() == null ? "1=1" : trig.getInitialLoadSelect(), sql);

// Replace these parameters to give the initiaLoadContition a chance to reference domainNames and domainIds
sql = replace("groupId", node.getNodeGroupId(), sql);
Expand All @@ -97,74 +91,54 @@ public String createPurgeSql(Node node, IDbDialect dialect, Trigger trig) {
public String createCsvDataSql(Trigger trig, Table metaData, String whereClause) {
String sql = sqlTemplates.get(INITIAL_LOAD_SQL_TEMPLATE);
sql = replace("tableName", trig.getSourceTableName(), sql);
sql = replace("schemaName",
trig.getSourceSchemaName() != null ? trig
.getSourceSchemaName()
+ "." : "", sql);
sql = replace("schemaName", trig.getSourceSchemaName() != null ? trig.getSourceSchemaName() + "." : "", sql);
sql = replace("whereClause", whereClause, sql);

Column[] columns = trig.orderColumnsForTable(metaData);
String columnsText = buildColumnString("t", columns);
sql = replace("columns", columnsText, sql);
return sql;
}

public String createCsvPrimaryKeySql(Trigger trig, Table metaData, String whereClause) {
String sql = sqlTemplates.get(INITIAL_LOAD_SQL_TEMPLATE);
sql = replace("tableName", trig.getSourceTableName(), sql);
sql = replace("schemaName",
trig.getSourceSchemaName() != null ? trig
.getSourceSchemaName()
+ "." : "", sql);
sql = replace("schemaName", trig.getSourceSchemaName() != null ? trig.getSourceSchemaName() + "." : "", sql);
sql = replace("whereClause", whereClause, sql);

Column[] columns = metaData.getPrimaryKeyColumns();
String columnsText = buildColumnString("t", columns);
sql = replace("columns", columnsText, sql);
return sql;
}
}

public String createTriggerDDL(IDbDialect dialect, DataEventType dml,
Trigger trigger, TriggerHistory history, String tablePrefix,
Table metaData, String defaultSchema) {
public String createTriggerDDL(IDbDialect dialect, DataEventType dml, Trigger trigger, TriggerHistory history,
String tablePrefix, Table metaData, String defaultSchema) {

String ddl = sqlTemplates.get(dml.name().toLowerCase()
+ "TriggerTemplate");
String ddl = sqlTemplates.get(dml.name().toLowerCase() + "TriggerTemplate");
if (ddl == null) {
throw new NotImplementedException(dml.name()
+ " trigger is not implemented for "
throw new NotImplementedException(dml.name() + " trigger is not implemented for "
+ dialect.getPlatform().getName());
}
ddl = replace("tableName", trigger.getSourceTableName().toUpperCase(),
ddl);
ddl = replace("targetTableName", trigger.getDefaultTargetTableName().toUpperCase(),
ddl);
ddl = replace("schemaName",
trigger.getSourceSchemaName() != null ? trigger
.getSourceSchemaName().toUpperCase()
+ "." : "", ddl);
ddl = replace("defaultSchema", defaultSchema != null
&& defaultSchema.length() > 0 ? defaultSchema + "." : "", ddl);
ddl = replace("triggerName", trigger.getTriggerName(dml, triggerPrefix).toUpperCase(),
ddl = replace("tableName", trigger.getSourceTableName().toUpperCase(), ddl);
ddl = replace("targetTableName", trigger.getDefaultTargetTableName().toUpperCase(), ddl);
ddl = replace("schemaName", trigger.getSourceSchemaName() != null ? trigger.getSourceSchemaName().toUpperCase()
+ "." : "", ddl);
ddl = replace("defaultSchema", defaultSchema != null && defaultSchema.length() > 0 ? defaultSchema + "." : "",
ddl);
ddl = replace("triggerName", trigger.getTriggerName(dml, triggerPrefix).toUpperCase(), ddl);
ddl = replace("prefixName", tablePrefix, ddl);
ddl = replace("targetGroupId", trigger.getTargetGroupId(), ddl);
ddl = replace("channelName", trigger.getChannelId(), ddl);
ddl = replace("triggerHistoryId", Integer.toString(history
.getTriggerHistoryId()), ddl);
ddl = replace("txIdExpression",
trigger.getTxIdExpression() == null ? dialect
.getTransactionTriggerExpression() : trigger
.getTxIdExpression(), ddl);
ddl = replace("triggerHistoryId", Integer.toString(history.getTriggerHistoryId()), ddl);
ddl = replace("txIdExpression", trigger.getTxIdExpression() == null ? dialect.getTransactionTriggerExpression()
: trigger.getTxIdExpression(), ddl);
ddl = replace("nodeSelectWhere", trigger.getNodeSelect(), ddl);
ddl = replace("syncOnInsertCondition", trigger
.getSyncOnInsertCondition(), ddl);
ddl = replace("syncOnUpdateCondition", trigger
.getSyncOnUpdateCondition(), ddl);
ddl = replace("syncOnDeleteCondition", trigger
.getSyncOnDeleteCondition(), ddl);
ddl = replace("syncOnIncomingBatchCondition", trigger.isSyncOnIncomingBatch() ? "1=1" :
dialect.getSyncTriggersExpression(), ddl);
ddl = replace("syncOnInsertCondition", trigger.getSyncOnInsertCondition(), ddl);
ddl = replace("syncOnUpdateCondition", trigger.getSyncOnUpdateCondition(), ddl);
ddl = replace("syncOnDeleteCondition", trigger.getSyncOnDeleteCondition(), ddl);
ddl = replace("syncOnIncomingBatchCondition", trigger.isSyncOnIncomingBatch() ? "1=1" : dialect
.getSyncTriggersExpression(), ddl);

Column[] columns = trigger.orderColumnsForTable(metaData);
String columnsText = buildColumnString(newTriggerValue, columns);
Expand All @@ -174,20 +148,39 @@ public String createTriggerDDL(IDbDialect dialect, DataEventType dml,
columnsText = buildColumnString(oldTriggerValue, columns);
ddl = replace("oldKeys", columnsText, ddl);

ddl = replace("oldNewPrimaryKeyJoin", oldNewPrimaryKeyJoin(columns), ddl);

return ddl;
}

public String createPostTriggerDDL(IDbDialect dialect, DataEventType dml, Trigger trigger,
TriggerHistory history, String tablePrefix, Table metaData, String defaultSchema) {
private String oldNewPrimaryKeyJoin(Column[] columns) {
StringBuilder b = new StringBuilder();
for (Column column : columns) {
b.append(oldTriggerValue);
b.append(".");
b.append(column.getName());
b.append("=");
b.append(newTriggerValue);
b.append(".");
b.append(column.getName());
if (!column.equals(columns[columns.length - 1])) {
b.append(" and ");
}
}

return b.toString();
}

public String createPostTriggerDDL(IDbDialect dialect, DataEventType dml, Trigger trigger, TriggerHistory history,
String tablePrefix, Table metaData, String defaultSchema) {

String ddl = sqlTemplates.get(dml.name().toLowerCase() + "PostTriggerTemplate");
if (ddl != null) {
ddl = replace("tableName", trigger.getSourceTableName().toUpperCase(), ddl);
ddl = replace("schemaName", trigger.getSourceSchemaName() != null ? trigger
.getSourceSchemaName().toUpperCase()
ddl = replace("schemaName", trigger.getSourceSchemaName() != null ? trigger.getSourceSchemaName()
.toUpperCase()
+ "." : "", ddl);
ddl = replace("triggerName", trigger.getTriggerName(dml, triggerPrefix).toUpperCase(),
ddl);
ddl = replace("triggerName", trigger.getTriggerName(dml, triggerPrefix).toUpperCase(), ddl);
}
return ddl;
}
Expand Down Expand Up @@ -238,8 +231,7 @@ private String buildColumnString(String tableAlias, Column[] columns) {
case Types.STRUCT:
case Types.REF:
case Types.DATALINK:
throw new NotImplementedException(column.getName()
+ " is of type " + column.getType());
throw new NotImplementedException(column.getName() + " is of type " + column.getType());
}

if (templateToUse != null) {
Expand All @@ -248,17 +240,14 @@ private String buildColumnString(String tableAlias, Column[] columns) {
throw new NotImplementedException();
}

columnsText = columnsText + "\n "
+ replace("columnName", column.getName(), templateToUse);
columnsText = columnsText + "\n " + replace("columnName", column.getName(), templateToUse);

}

String LAST_COMMAN_TOKEN = triggerConcatCharacter + "','"
+ triggerConcatCharacter;
String LAST_COMMAN_TOKEN = triggerConcatCharacter + "','" + triggerConcatCharacter;

if (columnsText.endsWith(LAST_COMMAN_TOKEN)) {
columnsText = columnsText.substring(0, columnsText.length()
- LAST_COMMAN_TOKEN.length());
columnsText = columnsText.substring(0, columnsText.length() - LAST_COMMAN_TOKEN.length());
}

return replace("tableAlias", tableAlias, columnsText);
Expand Down

0 comments on commit 3251901

Please sign in to comment.