Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/3.8' into 3.9
Browse files Browse the repository at this point in the history
  • Loading branch information
chenson42 committed Jul 7, 2017
2 parents 86319d9 + 981eb48 commit a188f88
Show file tree
Hide file tree
Showing 10 changed files with 93 additions and 21 deletions.
9 changes: 9 additions & 0 deletions symmetric-assemble/src/asciidoc/appendix/databases.ad
Expand Up @@ -38,6 +38,15 @@ by database.
|Y
|Y

|DB2 for IBM z/OS
|10
|N
|Y
|Y
|N
|Y
|Y

|Derby
|10.3.2.1
|Y
Expand Down
2 changes: 1 addition & 1 deletion symmetric-assemble/src/asciidoc/appendix/mssqlserver.ad
Expand Up @@ -97,6 +97,6 @@ GRANT INSERT, EXECUTE ON DATABASE::SYM_DATABASE to APP_USER;
|Datetimeoffset|No
|Char, Varchar, Text, Nchar, Nvarchar, Ntext|Yes
|Binary, Varbinary|Yes
|Image|No
|Image|Yes
|Spatial Data Types|No
|===
Expand Up @@ -142,8 +142,6 @@ public AseTriggerTemplate(ISymmetricDialect symmetricDialect) {
sqlTemplates.put("updateHandleKeyUpdatesTriggerTemplate" ,
"create trigger $(triggerName) on $(schemaName)$(tableName) for update as \n" +
" begin \n" +
" declare @NCT int \n" +
" set @NCT = @@OPTIONS & 512 \n" +
" set nocount on \n" +
" declare @TransactionId varchar(1000) \n" +
" declare @DataRow varchar(16384) \n" +
Expand Down
Expand Up @@ -27,6 +27,7 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
Expand Down Expand Up @@ -240,9 +241,16 @@ public String createPurgeSqlFor(Node node, TriggerRouter triggerRouter, TriggerH
@Override
public String createPurgeSqlFor(Node node, TriggerRouter triggerRouter, TriggerHistory triggerHistory,
List<TransformTableNodeGroupLink> transforms, String deleteSql) {
String sql = null;
List<String> sqlStatements = createPurgeSqlForMultipleTables(node, triggerRouter, triggerHistory, transforms, deleteSql);
return sqlStatements.size() == 1 ? sqlStatements.get(0) : "";
}

@Override
public List<String> createPurgeSqlForMultipleTables(Node node, TriggerRouter triggerRouter, TriggerHistory triggerHistory,
List<TransformTableNodeGroupLink> transforms, String deleteSql) {
List<String> sqlStatements = new ArrayList<String>();
if (StringUtils.isEmpty(triggerRouter.getInitialLoadDeleteStmt())) {
List<String> tableNames = new ArrayList<String>();
Set<String> tableNames = new HashSet<String>();
if (transforms != null) {
for (TransformTableNodeGroupLink transform : transforms) {
tableNames.add(transform.getFullyQualifiedTargetTableName());
Expand All @@ -251,7 +259,6 @@ public String createPurgeSqlFor(Node node, TriggerRouter triggerRouter, TriggerH
tableNames.add(triggerRouter.qualifiedTargetTableName(triggerHistory));
}

StringBuilder statements = new StringBuilder(128);

for (String tableName : tableNames) {
if (deleteSql == null) {
Expand All @@ -261,15 +268,12 @@ public String createPurgeSqlFor(Node node, TriggerRouter triggerRouter, TriggerH
deleteSql = parameterService.getString(ParameterConstants.INITIAL_LOAD_DELETE_FIRST_SQL);
}
}
statements.append(String.format(deleteSql, tableName)).append(";");
sqlStatements.add(String.format(deleteSql, tableName));
}

statements.setLength(statements.length()-1); // Lose the last ;
sql = statements.toString();
} else {
sql = triggerRouter.getInitialLoadDeleteStmt();
sqlStatements.add(triggerRouter.getInitialLoadDeleteStmt());
}
return sql;
return sqlStatements;
}

public String createCsvDataSql(Trigger trigger, TriggerHistory triggerHistory, Channel channel,
Expand Down
Expand Up @@ -104,6 +104,8 @@ public void removeTrigger(StringBuilder sqlBuffer, String catalogName, String sc

public String createPurgeSqlFor(Node node, TriggerRouter triggerRouter, TriggerHistory triggerHistory, List<TransformTableNodeGroupLink> transforms, String deleteSql);

public List<String> createPurgeSqlForMultipleTables(Node node, TriggerRouter triggerRouter, TriggerHistory triggerHistory, List<TransformTableNodeGroupLink> transforms, String deleteSql);

public String createCsvDataSql(Trigger trigger, TriggerHistory triggerHistory, Channel channel, String whereClause);

public String createCsvPrimaryKeySql(Trigger trigger, TriggerHistory triggerHistory, Channel channel, String whereClause);
Expand Down
Expand Up @@ -1050,8 +1050,32 @@ protected void insertPurgeEvent(ISqlTransaction transaction, Node targetNode,
this.engine.getTransformService().findTransformsFor(
sourceNode.getNodeGroupId(), targetNode.getNodeGroupId(), triggerRouter.getTargetTable(triggerHistory));

String sql = StringUtils.isNotBlank(overrideDeleteStatement) ? overrideDeleteStatement
: symmetricDialect.createPurgeSqlFor(targetNode, triggerRouter, triggerHistory, transforms);
if (StringUtils.isNotBlank(overrideDeleteStatement)) {
createPurgeEvent(transaction, overrideDeleteStatement, targetNode, sourceNode,
triggerRouter, triggerHistory, isLoad, loadId, createBy);

} else if (transforms != null && transforms.size() > 0) {
List<String> sqlStatements = symmetricDialect.createPurgeSqlForMultipleTables(targetNode, triggerRouter,
triggerHistory, transforms, null);
for (String sql : sqlStatements) {
createPurgeEvent(transaction,
sql,
targetNode, sourceNode,
triggerRouter, triggerHistory, isLoad, loadId, createBy);
}
} else {
createPurgeEvent(transaction,
symmetricDialect.createPurgeSqlFor(targetNode, triggerRouter, triggerHistory, transforms),
targetNode, sourceNode,
triggerRouter, triggerHistory, isLoad, loadId, createBy);
}

}

protected void createPurgeEvent(ISqlTransaction transaction, String sql, Node targetNode, Node sourceNode,
TriggerRouter triggerRouter, TriggerHistory triggerHistory, boolean isLoad,
long loadId, String createBy) {

sql = FormatUtils.replace("groupId", targetNode.getNodeGroupId(), sql);
sql = FormatUtils.replace("externalId", targetNode.getExternalId(), sql);
sql = FormatUtils.replace("nodeId", targetNode.getNodeId(), sql);
Expand All @@ -1073,7 +1097,7 @@ protected void insertPurgeEvent(ISqlTransaction transaction, Node targetNode,
insertData(transaction, data);
}
}

public void insertSqlEvent(Node targetNode, String sql, boolean isLoad, long loadId,
String createBy) {
TriggerHistory history = engine.getTriggerRouterService()
Expand Down Expand Up @@ -2215,9 +2239,12 @@ public String getFkName() {
public class DataMapper implements ISqlRowMapper<Data> {
public Data mapRow(Row row) {
Data data = new Data();
data.putCsvData(CsvData.ROW_DATA, row.getString("ROW_DATA", false));
data.putCsvData(CsvData.PK_DATA, row.getString("PK_DATA", false));
data.putCsvData(CsvData.OLD_DATA, row.getString("OLD_DATA", false));
String rowData = row.getString("ROW_DATA", false);
data.putCsvData(CsvData.ROW_DATA, isNotBlank(rowData) ? rowData : null);
String pkData = row.getString("PK_DATA", false);
data.putCsvData(CsvData.PK_DATA, isNotBlank(pkData) ? pkData : null);
String oldData = row.getString("OLD_DATA", false);
data.putCsvData(CsvData.OLD_DATA, isNotBlank(oldData) ? oldData : null);
data.putAttribute(CsvData.ATTRIBUTE_CHANNEL_ID, row.getString("CHANNEL_ID"));
data.putAttribute(CsvData.ATTRIBUTE_TX_ID, row.getString("TRANSACTION_ID", false));
String tableName = row.getString("TABLE_NAME");
Expand Down
Expand Up @@ -120,6 +120,11 @@ protected void writeColumn(Table table, Column column, StringBuilder ddl) {
ddl.append(" ");
ddl.append(getSqlType(column));
writeColumnDefaultValueStmt(table, column, ddl);

if (column.isUnique() && databaseInfo.isUniqueEmbedded()) {
writeColumnUniqueStmt(ddl);
}

// Sybase does not like NULL/NOT NULL and IDENTITY together
if (column.isAutoIncrement()) {
ddl.append(" ");
Expand Down
Expand Up @@ -1238,7 +1238,7 @@ protected void determineAutoIncrementFromResultSetMetaData(Connection conn, Tabl
query.append(",");
}
query.append("t.");
appendIdentifier(query, columnsToCheck[idx].getName());
appendColumn(query, columnsToCheck[idx].getName());
}
query.append(" FROM ");

Expand Down Expand Up @@ -1295,7 +1295,7 @@ protected void determineAutoIncrementFromResultSetMetaData(Connection conn, Tabl
}
}

public StringBuilder appendIdentifier(StringBuilder query, String identifier) {
private StringBuilder appendIdentifier(StringBuilder query, String identifier) {
if (getPlatform().getDdlBuilder().isDelimitedIdentifierModeOn()) {
query.append(getPlatformInfo().getDelimiterToken());
}
Expand All @@ -1305,6 +1305,13 @@ public StringBuilder appendIdentifier(StringBuilder query, String identifier) {
}
return query;
}

/*
* Allow subclasses to override column delimiters
*/
protected StringBuilder appendColumn(StringBuilder query, String identifier) {
return appendIdentifier(query, identifier);
}

/*
* Replaces a specific character sequence in the given text with the
Expand Down
Expand Up @@ -338,4 +338,12 @@ protected String getTableNamePattern(String tableName) {
tableName = tableName.replace("%", "\\%");
return tableName;
}

@Override
protected StringBuilder appendColumn(StringBuilder query, String identifier) {
query.append("\"");
query.append(identifier);
query.append("\"");
return query;
}
}
Expand Up @@ -23,6 +23,7 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Arrays;
Expand All @@ -44,13 +45,24 @@ public class SybaseJdbcSqlTemplate extends JdbcSqlTemplate implements ISqlTempla
static final Logger log = LoggerFactory.getLogger(SybaseJdbcSqlTemplate.class);

private NativeJdbcExtractor nativeJdbcExtractor;

int jdbcMajorVersion;

public SybaseJdbcSqlTemplate(DataSource dataSource, SqlTemplateSettings settings,
SymmetricLobHandler lobHandler, DatabaseInfo databaseInfo, NativeJdbcExtractor nativeJdbcExtractor) {
super(dataSource, settings, lobHandler, databaseInfo);
this.nativeJdbcExtractor = nativeJdbcExtractor;
primaryKeyViolationCodes = new int[] {423,511,515,530,547,2601,2615,2714};
foreignKeyViolationCodes = new int[] {546};
Connection c = null;
try {
c = dataSource.getConnection();
jdbcMajorVersion = c.getMetaData().getJDBCMajorVersion();
} catch (SQLException ex) {
jdbcMajorVersion = -1;
} finally {
close(c);
}
}

@Override
Expand Down Expand Up @@ -135,7 +147,7 @@ public void setValues(PreparedStatement ps, Object[] args)
}

public boolean supportsGetGeneratedKeys() {
return false;
return jdbcMajorVersion >= 4;
}

protected String getSelectLastInsertIdSql(String sequenceName) {
Expand Down

0 comments on commit a188f88

Please sign in to comment.