[#2457] Add Result.resultSet() and Result.close() to handle the

referenced ResultSet's lifecycle
This commit is contained in:
Lukas Eder 2013-05-10 16:51:40 +02:00
parent af415ba0a0
commit a580bebbfe
8 changed files with 76 additions and 21 deletions

View File

@ -41,6 +41,7 @@ import java.sql.Statement;
import java.util.List;
import java.util.Map;
import org.jooq.exception.DataAccessException;
import org.jooq.exception.DataTypeException;
import org.jooq.exception.InvalidResultException;
import org.jooq.exception.MappingException;
@ -1081,4 +1082,29 @@ public interface Result<R extends Record> extends List<R>, Attachable {
* @see String#intern()
*/
Result<R> intern(String... fieldNames);
/**
* Close the underlying JDBC {@link ResultSet}, if applicable.
* <p>
* If this <code>Result</code> was created using
* {@link ResultQuery#keepResultSet(KeepResultSetMode)}, then it closes the
* underlying JDBC {@link ResultSet}. Otherwise, this method has no effect.
*
* @throws DataAccessException If something went wrong closing the
* underlying {@link ResultSet}
* @see #resultSet()
*/
void close() throws DataAccessException;
/**
* Get the underlying JDBC {@link ResultSet}, if applicable.
* <p>
* This method returns the underlying JDBC {@link ResultSet}, if this
* <code>Result</code> was created using
* {@link ResultQuery#keepResultSet(KeepResultSetMode)}. Otherwise, this
* method returns <code>null</code>.
*
* @return The underlying JDBC <code>ResultSet</code>, or <code>null</code>
*/
ResultSet resultSet();
}

View File

@ -511,7 +511,7 @@ abstract class AbstractRecord extends AbstractStore implements Record {
@Override
public final ResultSet intoResultSet() {
ResultImpl<Record> result = new ResultImpl<Record>(configuration(), fields.fields.fields);
ResultImpl<Record> result = new ResultImpl<Record>(configuration(), rs, fields.fields.fields);
result.add(this);
return result.intoResultSet();
}
@ -654,7 +654,7 @@ abstract class AbstractRecord extends AbstractStore implements Record {
@Override
public String toString() {
Result<AbstractRecord> result = new ResultImpl<AbstractRecord>(configuration(), fields.fields.fields);
Result<AbstractRecord> result = new ResultImpl<AbstractRecord>(configuration(), null, fields.fields.fields);
result.add(this);
return result.toString();
}

View File

@ -284,7 +284,7 @@ abstract class AbstractResultQuery<R extends Record> extends AbstractQuery imple
}
}
else {
result = new ResultImpl<R>(ctx.configuration());
result = new ResultImpl<R>(ctx.configuration(), null);
}
}

View File

@ -142,7 +142,7 @@ abstract class AbstractStoreQuery<R extends Record> extends AbstractQuery implem
@Override
public final Result<R> getReturnedRecords() {
if (returned == null) {
returned = new ResultImpl<R>(configuration(), returning);
returned = new ResultImpl<R>(configuration(), null, returning);
}
return returned;

View File

@ -177,7 +177,7 @@ class CursorImpl<R extends Record> implements Cursor<R> {
// Before listener.resultStart(ctx)
iterator();
ResultImpl<R> result = new ResultImpl<R>(ctx.configuration(), fields);
ResultImpl<R> result = new ResultImpl<R>(ctx.configuration(), closeAfterFetch() ? null : rs, fields);
R record = null;
ctx.result(result);

View File

@ -637,7 +637,7 @@ class DSLContextImpl implements DSLContext, Serializable {
@Override
public final Result<Record> fetchFromStringData(List<String[]> data) {
if (data.size() == 0) {
return new ResultImpl<Record>(configuration);
return new ResultImpl<Record>(configuration, null);
}
else {
List<Field<?>> fields = new ArrayList<Field<?>>();
@ -646,7 +646,7 @@ class DSLContextImpl implements DSLContext, Serializable {
fields.add(fieldByName(String.class, name));
}
Result<Record> result = new ResultImpl<Record>(configuration, fields);
Result<Record> result = new ResultImpl<Record>(configuration, null, fields);
if (data.size() > 1) {
for (String[] values : data.subList(1, data.size())) {
@ -1548,7 +1548,7 @@ class DSLContextImpl implements DSLContext, Serializable {
@Override
public final <R extends Record> Result<R> newResult(Table<R> table) {
return new ResultImpl<R>(configuration, table.fields());
return new ResultImpl<R>(configuration, null, table.fields());
}
// -------------------------------------------------------------------------

View File

@ -104,7 +104,7 @@ class ReferenceImpl<R extends Record, O extends Record> extends AbstractKey<R> i
@Override
public final Result<O> fetchParents(Collection<? extends R> records) {
if (records == null || records.size() == 0) {
return new ResultImpl<O>(new DefaultConfiguration(), key.getFields());
return new ResultImpl<O>(new DefaultConfiguration(), null, key.getFields());
}
else {
return fetch(records, key.getTable(), key.getFieldsArray(), getFieldsArray());
@ -114,7 +114,7 @@ class ReferenceImpl<R extends Record, O extends Record> extends AbstractKey<R> i
@Override
public final Result<R> fetchChildren(Collection<? extends O> records) {
if (records == null || records.size() == 0) {
return new ResultImpl<R>(new DefaultConfiguration(), getFields());
return new ResultImpl<R>(new DefaultConfiguration(), null, getFields());
}
else {
return fetch(records, getTable(), getFieldsArray(), key.getFieldsArray());

View File

@ -38,12 +38,14 @@ package org.jooq.impl;
import static java.lang.Math.max;
import static java.lang.Math.min;
import static org.jooq.impl.Utils.translate;
import static org.jooq.tools.StringUtils.abbreviate;
import static org.jooq.tools.StringUtils.leftPad;
import static org.jooq.tools.StringUtils.rightPad;
import java.lang.reflect.Array;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@ -94,22 +96,24 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
*/
private static final long serialVersionUID = 6416154375799578362L;
private Configuration configuration;
private ResultSet rs;
private final Fields fields;
private final List<R> records;
private Configuration configuration;
ResultImpl(Configuration configuration, Collection<? extends Field<?>> fields) {
this(configuration, new Fields(fields));
ResultImpl(Configuration configuration, ResultSet rs, Collection<? extends Field<?>> fields) {
this(configuration, rs, new Fields(fields));
}
ResultImpl(Configuration configuration, Field<?>... fields) {
this(configuration, new Fields(fields));
ResultImpl(Configuration configuration, ResultSet rs, Field<?>... fields) {
this(configuration, rs, new Fields(fields));
}
ResultImpl(Configuration configuration, Fields fields) {
this.fields = fields;
this.records = new ArrayList<R>();
ResultImpl(Configuration configuration, ResultSet rs, Fields fields) {
this.configuration = configuration;
this.fields = fields;
this.rs = rs;
this.records = new ArrayList<R>();
}
// -------------------------------------------------------------------------
@ -859,7 +863,7 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
Result<R> result = map.get(val);
if (result == null) {
result = new ResultImpl<R>(configuration, fields);
result = new ResultImpl<R>(configuration, rs, fields);
map.put(val, result);
}
@ -911,7 +915,7 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
Result<R> result = map.get(key);
if (result == null) {
result = new ResultImpl<R>(configuration(), this.fields);
result = new ResultImpl<R>(configuration(), rs, this.fields);
map.put(key, result);
}
@ -1055,7 +1059,7 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
@Override
public final <Z extends Record> Result<Z> into(Table<Z> table) {
Result<Z> list = new ResultImpl<Z>(configuration(), table.fields());
Result<Z> list = new ResultImpl<Z>(configuration(), rs, table.fields());
for (R record : this) {
list.add(record.into(table));
@ -1188,6 +1192,31 @@ class ResultImpl<R extends Record> implements Result<R>, AttachableInternal {
return intern(fields.indexesOf(fieldNames));
}
@Override
public final void close() {
try {
if (rs != null) {
rs.close();
rs = null;
for (Record record : this) {
if (record instanceof AbstractRecord) {
((AbstractRecord) record).rs = null;
((AbstractRecord) record).rsIndex = 0;
}
}
}
}
catch (SQLException e) {
throw translate("Cannot close ResultSet", e);
}
}
@Override
public final ResultSet resultSet() {
return rs;
}
/**
* A comparator for records, wrapping another comparator for &lt;T&gt;
*/