Skip to content

Commit

Permalink
better version
Browse files Browse the repository at this point in the history
  • Loading branch information
ptiurin committed Oct 18, 2024
1 parent 1d8e07a commit fb94f40
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.firebolt.jdbc.statement.StatementInfoWrapper;
import com.firebolt.jdbc.statement.StatementUtil;
import com.firebolt.jdbc.statement.rawstatement.RawStatementWrapper;
import com.firebolt.jdbc.type.FireboltVersion;
import com.firebolt.jdbc.type.JavaTypeToFireboltSQLString;
import com.firebolt.jdbc.util.InputStreamUtil;
import lombok.CustomLog;
Expand Down Expand Up @@ -158,7 +159,8 @@ public void setString(int parameterIndex, String x) throws SQLException {
validateParamIndex(parameterIndex);
if (this.getConnection().getClass() == FireboltConnectionUserPassword.class){
// Old Firebolt required escaping additional characters in the string
providedParameters.put(parameterIndex, JavaTypeToFireboltSQLString.STRING.transform(x, "legacy"));
providedParameters.put(parameterIndex,
JavaTypeToFireboltSQLString.STRING.transform(x, FireboltVersion.LEGACY));
} else {
providedParameters.put(parameterIndex, JavaTypeToFireboltSQLString.STRING.transform(x));
}
Expand Down Expand Up @@ -204,6 +206,14 @@ public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQ
validateStatementIsNotClosed();
validateParamIndex(parameterIndex);
try {
if (this.getConnection().getClass() == FireboltConnectionUserPassword.class) {
// We don't know the targetSqlType, so we let JavaTypeToFireboltSQLString deal
// with legacy conversion
providedParameters.put(parameterIndex,
JavaTypeToFireboltSQLString.transformAny(x, targetSqlType, FireboltVersion.LEGACY));
} else {
providedParameters.put(parameterIndex, JavaTypeToFireboltSQLString.transformAny(x, targetSqlType));
}
providedParameters.put(parameterIndex, JavaTypeToFireboltSQLString.transformAny(x, targetSqlType));
} catch (FireboltException fbe) {
if (ExceptionType.TYPE_NOT_SUPPORTED.equals(fbe.getType())) {
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/firebolt/jdbc/type/FireboltVersion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.firebolt.jdbc.type;

public enum FireboltVersion {
LEGACY, CURRENT
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public enum JavaTypeToFireboltSQLString {
UUID(java.util.UUID.class, Object::toString),
BYTE(Byte.class, value -> Byte.toString(((Number) value).byteValue())),
SHORT(Short.class, value -> Short.toString(((Number) value).shortValue())),
STRING(String.class, getSQLStringValueOfString(), getSQLStringValueOfStringWithEscape()),
STRING(String.class, getSQLStringValueOfString(FireboltVersion.CURRENT), getSQLStringValueOfStringVersioned()),
LONG(Long.class, value -> Long.toString(((Number)value).longValue())),
INTEGER(Integer.class, value -> Integer.toString(((Number)value).intValue())),
BIG_INTEGER(BigInteger.class, value -> value instanceof BigInteger ? value.toString() : Long.toString(((Number)value).longValue())),
Expand Down Expand Up @@ -103,22 +103,33 @@ public enum JavaTypeToFireboltSQLString {
}

public static String transformAny(Object object) throws SQLException {
return transformAny(object, () -> getType(object));
return transformAny(object, FireboltVersion.CURRENT);
}

public static String transformAny(Object object, FireboltVersion version) throws SQLException {
return transformAny(object, () -> getType(object), version);
}

public static String transformAny(Object object, int sqlType) throws SQLException {
return transformAny(object, () -> getType(sqlType));
return transformAny(object, sqlType, FireboltVersion.CURRENT);
}

public static String transformAny(Object object, int sqlType, FireboltVersion version) throws SQLException {
return transformAny(object, () -> getType(sqlType), version);
}

private static String transformAny(Object object, CheckedSupplier<Class<?>> classSupplier) throws SQLException {
return object == null ? NULL_VALUE : transformAny(object, classSupplier.get());
private static String transformAny(Object object, CheckedSupplier<Class<?>> classSupplier, FireboltVersion version) throws SQLException {
return object == null ? NULL_VALUE : transformAny(object, classSupplier.get(), version);
}

private static String transformAny(Object object, Class<?> objectType) throws SQLException {
private static String transformAny(Object object, Class<?> objectType, FireboltVersion version) throws SQLException {
JavaTypeToFireboltSQLString converter = Optional.ofNullable(classToType.get(objectType))
.orElseThrow(() -> new FireboltException(
format("Cannot convert type %s. The type is not supported.", objectType),
TYPE_NOT_SUPPORTED));
if (version == FireboltVersion.LEGACY && object instanceof String) {
return converter.transform(object, version);
}
return converter.transform(object);
}

Expand All @@ -136,23 +147,15 @@ private static Class<?> getType(int sqlType) throws SQLException {
}
}

private static CheckedBiFunction<Object, Object, String> getSQLStringValueOfStringWithEscape() {
return (value, escape) -> {
boolean legacyStringEscape = escape == "legacy";
return getSQLStringValueOfString(legacyStringEscape).apply(value);
};
}
private static CheckedFunction<Object, String> getSQLStringValueOfString() {
return getSQLStringValueOfString(false);
private static CheckedBiFunction<Object, Object, String> getSQLStringValueOfStringVersioned() {
return (value, version) -> getSQLStringValueOfString((FireboltVersion) version).apply(value);
}

private static CheckedFunction<Object, String> getSQLStringValueOfString(boolean legacyStringEscape) {
private static CheckedFunction<Object, String> getSQLStringValueOfString(FireboltVersion version) {
return value -> {
String escaped = (String) value;
List<Entry<String, String>> characterToEscapedCharacterPairs = legacyStringEscape
? JavaTypeToFireboltSQLString.legacyCharacterToEscapedCharacterPairs
: JavaTypeToFireboltSQLString.characterToEscapedCharacterPairs;
for (Entry<String, String> specialCharacter : characterToEscapedCharacterPairs) {
List<Entry<String, String>> charactersToEscape = version == FireboltVersion.LEGACY ? legacyCharacterToEscapedCharacterPairs : characterToEscapedCharacterPairs;
for (Entry<String, String> specialCharacter : charactersToEscape) {
escaped = escaped.replace(specialCharacter.getKey(), specialCharacter.getValue());
}
return format("'%s'", escaped);
Expand Down

0 comments on commit fb94f40

Please sign in to comment.