Handle binding of Enums correctly

This commit is contained in:
Travis Burtrum 2018-03-15 00:45:42 -04:00
parent cb36e783ed
commit 5c3a88232e
2 changed files with 23 additions and 9 deletions

View File

@ -749,7 +749,7 @@ public class JdbcMapperProcessor extends AbstractProcessor {
// we are going to put most common ones up top so it should execute faster normally // we are going to put most common ones up top so it should execute faster normally
// todo: avoid string concat here // todo: avoid string concat here
if (method == null) if (method == null)
if (o.getKind().isPrimitive() || types.isAssignable(o, stringType) || types.isAssignable(o, numberType) || types.isAssignable(o, enumType)) { if (o.getKind().isPrimitive() || types.isAssignable(o, stringType) || types.isAssignable(o, numberType)) {
method = "Object"; method = "Object";
// java.util.Date support, put it in a Timestamp // java.util.Date support, put it in a Timestamp
} else if (types.isAssignable(o, utilDateType)) { } else if (types.isAssignable(o, utilDateType)) {
@ -797,6 +797,9 @@ public class JdbcMapperProcessor extends AbstractProcessor {
variableName = variableName + " == null ? null : new java.io.ByteArrayInputStream(" + variableName + ")"; variableName = variableName + " == null ? null : new java.io.ByteArrayInputStream(" + variableName + ")";
} else if (types.isAssignable(o, sqlArrayType)) { } else if (types.isAssignable(o, sqlArrayType)) {
method = "Array"; method = "Array";
} else if (types.isAssignable(o, enumType)) {
method = "Object";
variableName = variableName + " == null ? null : " + variableName + ".name()";
} else { } else {
// shouldn't get here ever, if we do the types should be more specific // shouldn't get here ever, if we do the types should be more specific
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@JdbcMapper.SQL could not properly infer PreparedStatement bind call for param", param); processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@JdbcMapper.SQL could not properly infer PreparedStatement bind call for param", param);

View File

@ -5,11 +5,14 @@ import com.moparisthebest.jdbc.codegen.JdbcMapperFactory;
import com.moparisthebest.jdbc.util.ResultSetIterable; import com.moparisthebest.jdbc.util.ResultSetIterable;
import java.io.*; import java.io.*;
import java.nio.charset.Charset;
import java.sql.*; import java.sql.*;
import java.util.*; import java.util.*;
//IFJAVA8_START //IFJAVA8_START
import java.time.*; import java.time.*;
import java.util.stream.Stream; import java.util.stream.Stream;
import static java.nio.charset.StandardCharsets.UTF_8;
//IFJAVA8_END //IFJAVA8_END
import static com.moparisthebest.jdbc.TryClose.tryClose; import static com.moparisthebest.jdbc.TryClose.tryClose;
@ -19,6 +22,10 @@ public class QueryMapper implements JdbcMapper {
public static final Object noBind = new Object(); public static final Object noBind = new Object();
public static final ResultSetMapper defaultRsm = new ResultSetMapper(); public static final ResultSetMapper defaultRsm = new ResultSetMapper();
/*IFJAVA6_START
private static final Charset UTF_8 = Charset.forName("UTF-8");
IFJAVA6_END*/
protected final ResultSetMapper cm; protected final ResultSetMapper cm;
protected final Connection conn; protected final Connection conn;
protected final boolean closeConn; protected final boolean closeConn;
@ -114,8 +121,10 @@ public class QueryMapper implements JdbcMapper {
} }
private static class BlobString extends StringWrapper { private static class BlobString extends StringWrapper {
private BlobString(String s) { private final Charset charset;
private BlobString(final String s, final Charset charset) {
super(s); super(s);
this.charset = charset;
} }
} }
@ -124,7 +133,11 @@ public class QueryMapper implements JdbcMapper {
} }
public static Object wrapBlob(String s) { public static Object wrapBlob(String s) {
return new BlobString(s); return new BlobString(s, UTF_8);
}
public static Object wrapBlob(final String s, final Charset charset) {
return new BlobString(s, charset == null ? UTF_8 : charset);
} }
public static void setObject(final PreparedStatement ps, final int index, final Object o) throws SQLException { public static void setObject(final PreparedStatement ps, final int index, final Object o) throws SQLException {
@ -165,22 +178,20 @@ public class QueryMapper implements JdbcMapper {
ps.setBlob(index, (InputStream) o); ps.setBlob(index, (InputStream) o);
else if (o instanceof File) else if (o instanceof File)
try { try {
ps.setBlob(index, new FileInputStream((File) o)); ps.setBlob(index, new FileInputStream((File) o)); // todo: does this close this or leak a file descriptor?
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
throw new SQLException("File to Blob FileNotFoundException", e); throw new SQLException("File to Blob FileNotFoundException", e);
} }
else if (o instanceof BlobString) else if (o instanceof BlobString)
try { ps.setBlob(index, ((BlobString) o).s == null ? null : new ByteArrayInputStream(((BlobString) o).s.getBytes(((BlobString) o).charset)));
ps.setBlob(index, ((BlobString) o).s == null ? null : new ByteArrayInputStream(((BlobString) o).s.getBytes("UTF-8")));
} catch (UnsupportedEncodingException e) {
throw new SQLException("String to Blob UnsupportedEncodingException", e);
}
else if (o instanceof java.sql.Blob) else if (o instanceof java.sql.Blob)
ps.setBlob(index, (java.sql.Blob) o); ps.setBlob(index, (java.sql.Blob) o);
else if (o instanceof ArrayInList.ArrayListObject) else if (o instanceof ArrayInList.ArrayListObject)
ps.setArray(index, ((ArrayInList.ArrayListObject) o).getArray()); ps.setArray(index, ((ArrayInList.ArrayListObject) o).getArray());
else if (o instanceof java.sql.Array) else if (o instanceof java.sql.Array)
ps.setArray(index, (java.sql.Array) o); ps.setArray(index, (java.sql.Array) o);
else if (o instanceof Enum)
ps.setObject(index, ((Enum)o).name());
else else
ps.setObject(index, o); // probably won't get here ever, but just in case... ps.setObject(index, o); // probably won't get here ever, but just in case...
/* /*