Skip to content

Commit

Permalink
1825800 - MS SQL SERVER DIALECT DEVELOPMENT. Base64 encode binary dat…
Browse files Browse the repository at this point in the history
…a in SQL Server
  • Loading branch information
chenson42 committed Dec 4, 2007
1 parent 4c54080 commit e12f43e
Show file tree
Hide file tree
Showing 8 changed files with 146 additions and 144 deletions.
Expand Up @@ -138,7 +138,7 @@ protected void createRequiredFunctions() {
}

public BinaryEncoding getBinaryEncoding() {
return BinaryEncoding.BASE64;
return BinaryEncoding.NONE;
}

abstract protected boolean doesTriggerExistOnPlatform(String schema, String tableName, String triggerName);
Expand Down
@@ -1,5 +1,5 @@
package org.jumpmind.symmetric.db;

public enum BinaryEncoding {
BASE64;
NONE, BASE64;
}
Expand Up @@ -23,6 +23,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jumpmind.symmetric.db.AbstractDbDialect;
import org.jumpmind.symmetric.db.BinaryEncoding;
import org.jumpmind.symmetric.db.IDbDialect;

/**
Expand All @@ -42,6 +43,11 @@ protected boolean allowsNullForIdentityColumn() {
return false;
}

@Override
public BinaryEncoding getBinaryEncoding() {
return BinaryEncoding.BASE64;
}

@Override
protected boolean doesTriggerExistOnPlatform(String schema, String tableName, String triggerName) {
return jdbcTemplate.queryForInt(
Expand Down
Expand Up @@ -44,14 +44,15 @@ public class CsvExtractor implements IDataExtractor {
public void init(BufferedWriter writer, DataExtractorContext context)
throws IOException {
Util.write(writer, CsvConstants.NODEID, AbstractStreamDataCommand.DELIMITER, runtimeConfiguration.getExternalId());
Util.write(writer, CsvConstants.BINARY, AbstractStreamDataCommand.DELIMITER, dbDialect.getBinaryEncoding().name());
writer.newLine();
}

public void begin(OutgoingBatch batch, BufferedWriter writer)
throws IOException {
Util.write(writer, CsvConstants.BATCH, AbstractStreamDataCommand.DELIMITER, batch.getBatchId());
Util.write(writer, CsvConstants.BATCH, AbstractStreamDataCommand.DELIMITER, batch.getBatchId());
writer.newLine();
Util.write(writer, CsvConstants.BINARY, AbstractStreamDataCommand.DELIMITER, dbDialect.getBinaryEncoding().name());
writer.newLine();
}

public void commit(OutgoingBatch batch, BufferedWriter writer)
Expand Down
Expand Up @@ -32,11 +32,13 @@
import java.util.List;
import java.util.Map;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;
import org.apache.ddlutils.model.Column;
import org.apache.ddlutils.model.Table;
import org.jumpmind.symmetric.db.BinaryEncoding;
import org.jumpmind.symmetric.db.IDbDialect;
import org.jumpmind.symmetric.load.StatementBuilder.DmlType;
import org.springframework.jdbc.core.JdbcTemplate;
Expand All @@ -54,8 +56,7 @@
public class TableTemplate {
public static final String REQUIRED_FIELD_NULL_SUBSTITUTE = " ";

public static final String[] TIMESTAMP_PATTERNS = {
"yyyy-MM-dd HH:mm:ss.S", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd" };
public static final String[] TIMESTAMP_PATTERNS = { "yyyy-MM-dd HH:mm:ss.S", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd" };

private JdbcTemplate jdbcTemplate;

Expand All @@ -78,11 +79,10 @@ public class TableTemplate {
private Column[] columnMetaData;

private HashMap<DmlType, StatementBuilder> statementMap;

private IColumnFilter columnFilter;

public TableTemplate(JdbcTemplate jdbcTemplate, IDbDialect dbDialect,
String tableName, IColumnFilter columnFilter) {
public TableTemplate(JdbcTemplate jdbcTemplate, IDbDialect dbDialect, String tableName, IColumnFilter columnFilter) {
this.jdbcTemplate = jdbcTemplate;
this.dbDialect = dbDialect;
this.columnFilter = columnFilter;
Expand All @@ -107,18 +107,26 @@ public boolean isIgnoreThisTable() {
}

public int insert(String[] columnValues) {
return insert(columnValues, BinaryEncoding.NONE);
}

public int insert(String[] columnValues, BinaryEncoding encoding) {
StatementBuilder st = getStatementBuilder(DmlType.INSERT);
Object[] values = filterValues(columnMetaData, columnValues);
Object[] values = filterValues(columnMetaData, columnValues, encoding);
if (this.columnFilter != null) {
values = this.columnFilter.filterColumnsValues(DmlType.INSERT, values);
}
return jdbcTemplate.update(st.getSql(), values);
}

public int update(String[] columnValues, String[] keyValues) {
return update(columnValues, keyValues, BinaryEncoding.NONE);
}

public int update(String[] columnValues, String[] keyValues, BinaryEncoding encoding) {
StatementBuilder st = getStatementBuilder(DmlType.UPDATE);
Object[] values = ArrayUtils.addAll(filterValues(columnMetaData,
columnValues), filterValues(keyMetaData, keyValues));
Object[] values = ArrayUtils.addAll(filterValues(columnMetaData, columnValues, encoding), filterValues(
keyMetaData, keyValues, encoding));
if (this.columnFilter != null) {
values = this.columnFilter.filterColumnsValues(DmlType.UPDATE, values);
}
Expand All @@ -127,10 +135,10 @@ public int update(String[] columnValues, String[] keyValues) {

public int delete(String[] keyValues) {
StatementBuilder st = getStatementBuilder(DmlType.DELETE);
Object[] values = filterValues(keyMetaData, keyValues);
Object[] values = filterValues(keyMetaData, keyValues, BinaryEncoding.NONE);
if (this.columnFilter != null) {
values = this.columnFilter.filterColumnsValues(DmlType.DELETE, values);
}
}
return jdbcTemplate.update(st.getSql(), values);
}

Expand All @@ -141,14 +149,13 @@ private StatementBuilder getStatementBuilder(DmlType type) {
statementColumns = this.columnFilter.filterColumnsNames(type, statementColumns);
}
if (st == null) {
st = new StatementBuilder(type, table.getName(), existKeyNames,
statementColumns);
st = new StatementBuilder(type, table.getName(), existKeyNames, statementColumns);
statementMap.put(type, st);
}
return st;
}

private Object[] filterValues(Column[] metaData, String[] values) {
private Object[] filterValues(Column[] metaData, String[] values, BinaryEncoding encoding) {
List<Object> list = new ArrayList<Object>(values.length);

for (int i = 0; i < values.length; i++) {
Expand All @@ -158,9 +165,8 @@ private Object[] filterValues(Column[] metaData, String[] values) {

if (column != null) {
int type = column.getTypeCode();
if ((value == null || (dbDialect.isEmptyStringNulled() && value
.equals("")))
&& column.isRequired() && column.isOfTextType()) {
if ((value == null || (dbDialect.isEmptyStringNulled() && value.equals(""))) && column.isRequired()
&& column.isOfTextType()) {
objectValue = REQUIRED_FIELD_NULL_SUBSTITUTE;
} else if (value != null) {
if (type == Types.DATE) {
Expand All @@ -174,10 +180,14 @@ private Object[] filterValues(Column[] metaData, String[] values) {
} else if (type == Types.NUMERIC || type == Types.DECIMAL) {
objectValue = new BigDecimal(value);
} else if (type == Types.BLOB || type == Types.LONGVARBINARY) {
objectValue = value.getBytes();
if (encoding == BinaryEncoding.NONE) {
objectValue = value.getBytes();
} else if (encoding == BinaryEncoding.BASE64) {
objectValue = Base64.decodeBase64(value.getBytes());
}
} else if (type == Types.TIME) {
objectValue = new Time(getTime(value, TIMESTAMP_PATTERNS));
}
}
}
list.add(objectValue);
}
Expand Down

0 comments on commit e12f43e

Please sign in to comment.