Skip to content

Commit

Permalink
0004028: correctly pad CHAR field when using multi-byte characters
Browse files Browse the repository at this point in the history
  • Loading branch information
erilong committed Jul 2, 2019
1 parent 0c096d1 commit 95f5221
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 1 deletion.
10 changes: 10 additions & 0 deletions symmetric-db/src/main/java/org/jumpmind/db/model/Column.java
Expand Up @@ -87,6 +87,8 @@ public class Column implements Cloneable, Serializable {
/** The size of the column for JDBC types that require/support this. */
private Integer sizeAsInt;

private int charOctetLength;

/** The scale of the column for JDBC types that require/support this. */
private int scale;

Expand Down Expand Up @@ -752,4 +754,12 @@ public boolean containsJdbcTypes() {
// return enumValues != null && enumValues.length > 0;
// }

public int getCharOctetLength() {
return charOctetLength;
}

public void setCharOctetLength(int charOctetLength) {
this.charOctetLength = charOctetLength;
}

}
Expand Up @@ -403,7 +403,11 @@ protected Object getObjectValue(String value, Column column, BinaryEncoding enco
String charValue = value.toString();
if ((StringUtils.isBlank(charValue) && getDdlBuilder().getDatabaseInfo().isBlankCharColumnSpacePadded())
|| (StringUtils.isNotBlank(charValue) && getDdlBuilder().getDatabaseInfo().isNonBlankCharColumnSpacePadded())) {
objectValue = StringUtils.rightPad(charValue, column.getSizeAsInt(), ' ');
if (column.getCharOctetLength() == 0 || column.getSizeAsInt() == column.getCharOctetLength()) {
objectValue = StringUtils.rightPad(charValue, column.getSizeAsInt(), ' ');
} else {
objectValue = charValue + StringUtils.repeat(" ", column.getCharOctetLength() - value.getBytes().length);
}
}
} else if (type == Types.BIGINT) {
objectValue = parseBigInteger(value);
Expand Down
Expand Up @@ -214,6 +214,7 @@ protected List<MetaDataColumnDescriptor> initColumnsForColumn() {
result.add(new MetaDataColumnDescriptor(getName("NUM_PREC_RADIX"), Types.INTEGER, Integer.valueOf(10)));
result.add(new MetaDataColumnDescriptor(getName("DECIMAL_DIGITS"), Types.INTEGER, Integer.valueOf(0)));
result.add(new MetaDataColumnDescriptor(getName("COLUMN_SIZE"), Types.VARCHAR));
result.add(new MetaDataColumnDescriptor(getName("CHAR_OCTET_LENGTH"), Types.VARCHAR));
result.add(new MetaDataColumnDescriptor(getName("IS_NULLABLE"), Types.VARCHAR, "YES"));
result.add(new MetaDataColumnDescriptor(getName("IS_AUTOINCREMENT"), Types.VARCHAR, "YES"));
result.add(new MetaDataColumnDescriptor(getName("REMARKS"), Types.VARCHAR));
Expand Down Expand Up @@ -994,6 +995,14 @@ protected Column readColumn(DatabaseMetaDataWrapper metaData, Map<String, Object
}
column.setDescription((String) values.get(getName("REMARKS")));

Object octetLength = values.get(getName("CHAR_OCTET_LENGTH"));
if (octetLength != null) {
try {
column.setCharOctetLength(Integer.parseInt(octetLength.toString()));
} catch (NumberFormatException e) {
}
}

return column;
}

Expand Down

0 comments on commit 95f5221

Please sign in to comment.