[jOOQ/jOOQ#11099] Cache inverse converters in MockResultSet::get

This commit is contained in:
Lukas Eder 2020-12-10 12:59:27 +01:00
parent 014a292a8a
commit 78e211fee3

View File

@ -86,12 +86,13 @@ public class MockResultSet extends JDBC41ResultSet implements ResultSet, Seriali
/**
* Generated UID
*/
private static final long serialVersionUID = -2292216936424437750L;
private static final long serialVersionUID = -2292216936424437750L;
private final int maxRows;
Result<?> result;
private transient int index;
private transient boolean wasNull;
private final int maxRows;
Result<?> result;
private transient int index;
private transient boolean wasNull;
private final Converter<?, ?>[] converters;
public MockResultSet(Result<?> result) {
this(result, 0);
@ -100,6 +101,15 @@ public class MockResultSet extends JDBC41ResultSet implements ResultSet, Seriali
public MockResultSet(Result<?> result, int maxRows) {
this.result = result;
this.maxRows = maxRows;
if (result != null) {
int size = result.fieldsRow().size();
this.converters = new Converter[size];
for (int i = 0; i < size; i++)
converters[i] = Converters.inverse(result.field(i).getConverter());
}
else
converters = new Converter[0];
}
// -------------------------------------------------------------------------
@ -152,17 +162,14 @@ public class MockResultSet extends JDBC41ResultSet implements ResultSet, Seriali
return field;
}
private Field<?> field(int columnIndex) throws SQLException {
Field<?> field = result.field(columnIndex - 1);
if (field == null)
private Converter<?, ?> converter(int columnIndex) throws SQLException {
if (columnIndex > 0 && columnIndex <= converters.length)
return converters[columnIndex - 1];
else
throw new SQLException("Unknown column index : " + columnIndex);
return field;
}
private long getMillis(Calendar cal, int year, int month, int day, int hour, int minute, int second,
int millis) {
private long getMillis(Calendar cal, int year, int month, int day, int hour, int minute, int second, int millis) {
cal = (Calendar) cal.clone();
cal.clear();
cal.setLenient(true);
@ -455,8 +462,7 @@ public class MockResultSet extends JDBC41ResultSet implements ResultSet, Seriali
private <T> T get(int columnIndex, Class<T> type) throws SQLException {
checkInRange();
Converter<?, ?> converter = Converters.inverse(field(columnIndex).getConverter());
T value = Convert.convert(result.get(index - 1).get(columnIndex - 1, converter), type);
T value = Convert.convert(result.get(index - 1).get(columnIndex - 1, converter(columnIndex)), type);
wasNull = (value == null);
return value;
}